Squashed 'drivers/staging/kernelsu/' changes from 1f42bbac5ef3..88289399947e
88289399947e kernel: reject v3 and v3.1 signature scheme for manager verification a3b92d6fee66 ksud: reject v3 and v3.1 signature scheme a22959beae1a kernel: harden the signature check (#1027) 7753dc0987e0 repos.json: update source repo link (#1024) 960c40129b4c fix typos in website (#1023) f371d784eac1 Create SECURITY.md 59b45ce82267 [add device]: (#1021) 340595276f2c kernel: Add selinux rules for module umount 72d756c9f25e fix typo in zh_CN guide (#1015) 3d5907157134 [add device]: a lineage kernel forked from LineageOS official repository, version 4.4.302, added ksu. (#1014) 394cfe751604 Added Hindi translation to readme (#1009) 0810db101ea1 ci: Add android13-5.10-2023-09 ab0ae9d1962b ci: Fix sublevel incorrect 13748300ebdd manager: update dependencies c4db2bab4f15 manager: Fix changelog dialog, close #1005 e352ccc47059 manager: Upgrade AGP to 8.1.0 7747c0e21134 kernel: umount modules mnt when needed. fix #991 2661a363756f Translations update from Hosted Weblate (#1000) 1bdddb13ce2d fix website translations and improve grammar (#1004) 7d3c50ef0a45 Added Hebrew translation for readme (#1008) 2ee7696d6783 enhance grammar and language in landing pages (en) (#1003) 54ee400dc5cc kernel: Adapt to low version Android init process (#973) 945e2c3209cb Translations update from Hosted Weblate (#980) 298e42cb427e [add device]: Moto g9 play (#995) 3a657a9dbb40 Adding support for Nokia 8/8 Sirocco (#999) 55aa54ca8588 add a13-5.15.131 (#988) 0b8359a2e2b7 fix translations from website (#989) afb04126f669 fix warning cards, tips and translation (#979) 98fae23864e3 Optimize for WSA (#975) 23805d478462 update translation from website (#974) 01bf24fa7bd1 [add device]: Moto g9 play (#969) 47f05a139d46 Translations update from Hosted Weblate (#960) 3c0c70ba7f75 [add device]: Moto g9 power (#971) c19ba7fab060 Add Brazilian Portuguese language to the website (#965) git-subtree-dir: drivers/staging/kernelsu git-subtree-split: 88289399947e84ce59beb85e5c933d309e65f5ff
This commit is contained in:
5
.github/workflows/build-kernel-a13.yml
vendored
5
.github/workflows/build-kernel-a13.yml
vendored
@@ -37,8 +37,11 @@ jobs:
|
||||
sub_level: 177
|
||||
os_patch_level: 2023-06
|
||||
- version: "5.10"
|
||||
sub_level: 187
|
||||
sub_level: 186
|
||||
os_patch_level: 2023-08
|
||||
- version: "5.10"
|
||||
sub_level: 186
|
||||
os_patch_level: 2023-09
|
||||
- version: "5.15"
|
||||
sub_level: 41
|
||||
os_patch_level: 2022-11
|
||||
|
||||
69
.github/workflows/build-kernel-wsa.yml
vendored
69
.github/workflows/build-kernel-wsa.yml
vendored
@@ -18,31 +18,7 @@ jobs:
|
||||
strategy:
|
||||
matrix:
|
||||
arch: [x86_64, arm64]
|
||||
version: ["5.15.104.2", "5.15.104.3"]
|
||||
include:
|
||||
- arch: x86_64
|
||||
file_name: "bzImage"
|
||||
- arch: arm64
|
||||
file_name: "Image"
|
||||
cross_compile: "aarch64-linux-gnu"
|
||||
- version: "5.15.104.2"
|
||||
arch: x86_64
|
||||
make_config: config-wsa-x64
|
||||
- version: "5.15.104.2"
|
||||
arch: arm64
|
||||
make_config: config-wsa-arm64
|
||||
- version: "5.15.104.3"
|
||||
arch: x86_64
|
||||
make_config: config-wsa-x64
|
||||
- version: "5.15.104.3"
|
||||
arch: arm64
|
||||
make_config: config-wsa-arm64
|
||||
- version: "5.15.104.2"
|
||||
device_code: latte-2
|
||||
kernel_version: "5.15"
|
||||
- version: "5.15.104.3"
|
||||
device_code: latte-2
|
||||
kernel_version: "5.15"
|
||||
version: ["5.15.94.2", "5.15.104.1", "5.15.104.2", "5.15.104.3"]
|
||||
|
||||
name: Build WSA-Kernel-${{ matrix.version }}-${{ matrix.arch }}
|
||||
runs-on: ubuntu-20.04
|
||||
@@ -57,19 +33,18 @@ jobs:
|
||||
sudo apt-get update
|
||||
sudo apt-get install -y --no-install-recommends bc bison build-essential ca-certificates flex git gnupg libelf-dev libssl-dev lsb-release software-properties-common wget libncurses-dev binutils-aarch64-linux-gnu gcc-aarch64-linux-gnu nuget gzip
|
||||
export LLVM_VERSION=12
|
||||
wget https://apt.llvm.org/llvm.sh
|
||||
chmod +x llvm.sh
|
||||
sudo ./llvm.sh $LLVM_VERSION
|
||||
rm ./llvm.sh
|
||||
sudo ln -s --force /usr/bin/clang-$LLVM_VERSION /usr/bin/clang
|
||||
sudo ln -s --force /usr/bin/ld.lld-$LLVM_VERSION /usr/bin/ld.lld
|
||||
sudo ln -s --force /usr/bin/llvm-objdump-$LLVM_VERSION /usr/bin/llvm-objdump
|
||||
sudo ln -s --force /usr/bin/llvm-ar-$LLVM_VERSION /usr/bin/llvm-ar
|
||||
sudo ln -s --force /usr/bin/llvm-nm-$LLVM_VERSION /usr/bin/llvm-nm
|
||||
sudo ln -s --force /usr/bin/llvm-strip-$LLVM_VERSION /usr/bin/llvm-strip
|
||||
sudo ln -s --force /usr/bin/llvm-objcopy-$LLVM_VERSION /usr/bin/llvm-objcopy
|
||||
sudo ln -s --force /usr/bin/llvm-readelf-$LLVM_VERSION /usr/bin/llvm-readelf
|
||||
sudo ln -s --force /usr/bin/clang++-$LLVM_VERSION /usr/bin/clang++
|
||||
wget -q https://apt.llvm.org/llvm.sh
|
||||
sudo bash ./llvm.sh $LLVM_VERSION
|
||||
cd /usr/bin
|
||||
sudo ln -sf clang-$LLVM_VERSION clang
|
||||
sudo ln -sf ld.lld-$LLVM_VERSION ld.lld
|
||||
sudo ln -sf llvm-objdump-$LLVM_VERSION llvm-objdump
|
||||
sudo ln -sf llvm-ar-$LLVM_VERSION llvm-ar
|
||||
sudo ln -sf llvm-nm-$LLVM_VERSION llvm-nm
|
||||
sudo ln -sf llvm-strip-$LLVM_VERSION llvm-strip
|
||||
sudo ln -sf llvm-objcopy-$LLVM_VERSION llvm-objcopy
|
||||
sudo ln -sf llvm-readelf-$LLVM_VERSION llvm-readelf
|
||||
sudo ln -sf clang++-$LLVM_VERSION clang++
|
||||
|
||||
- name: Checkout KernelSU
|
||||
uses: actions/checkout@v4
|
||||
@@ -78,10 +53,10 @@ jobs:
|
||||
fetch-depth: 0
|
||||
|
||||
- name: Setup kernel source
|
||||
uses: actions/checkout@v3
|
||||
uses: actions/checkout@v4
|
||||
with:
|
||||
repository: microsoft/WSA-Linux-Kernel
|
||||
ref: android-lts/${{ matrix.device_code }}/${{ matrix.version }}
|
||||
ref: android-lts/latte-2/${{ matrix.version }}
|
||||
path: WSA-Linux-Kernel
|
||||
|
||||
- name: Setup Ccache
|
||||
@@ -103,7 +78,7 @@ jobs:
|
||||
DRIVER_MAKEFILE=$KERNEL_ROOT/drivers/Makefile
|
||||
grep -q "kernelsu" $DRIVER_MAKEFILE || echo "obj-y += kernelsu/" >> $DRIVER_MAKEFILE
|
||||
echo "[+] Apply KernelSU patches"
|
||||
cd $KERNEL_ROOT && git apply $GITHUB_WORKSPACE/KernelSU/.github/patches/${{ matrix.kernel_version }}/*.patch
|
||||
cd $KERNEL_ROOT && git apply $GITHUB_WORKSPACE/KernelSU/.github/patches/5.15/*.patch
|
||||
echo "[+] KernelSU setup done."
|
||||
cd $GITHUB_WORKSPACE/KernelSU
|
||||
VERSION=$(($(git rev-list --count HEAD) + 10200))
|
||||
@@ -113,15 +88,17 @@ jobs:
|
||||
- name: Build Kernel
|
||||
working-directory: WSA-Linux-Kernel
|
||||
run: |
|
||||
cp configs/wsa/${{ matrix.make_config }} .config
|
||||
declare -A ARCH_MAP=(["x86_64"]="x64" ["arm64"]="arm64")
|
||||
cp configs/wsa/config-wsa-${ARCH_MAP[${{ matrix.arch }}]} .config
|
||||
make olddefconfig
|
||||
if [ ! -z ${{ vars.EXPECTED_SIZE }} ] && [ ! -z ${{ vars.EXPECTED_HASH }} ]; then
|
||||
export KSU_EXPECTED_SIZE=${{ vars.EXPECTED_SIZE }}
|
||||
export KSU_EXPECTED_HASH=${{ vars.EXPECTED_HASH }}
|
||||
fi
|
||||
make -j`nproc` LLVM=1 ARCH=${{ matrix.arch }} CROSS_COMPILE=${{ matrix.cross_compile }} ${{ matrix.file_name }} CCACHE="/usr/bin/ccache"
|
||||
declare -A ARCH_MAP=(["x86_64"]="x86" ["arm64"]="arm64")
|
||||
echo "file_path=WSA-Linux-Kernel/arch/${ARCH_MAP[${{ matrix.arch }}]}/boot/${{ matrix.file_name }}" >> $GITHUB_ENV
|
||||
declare -A FILE_NAME=(["x86_64"]="bzImage" ["arm64"]="Image")
|
||||
make -j`nproc` LLVM=1 ARCH=${{ matrix.arch }} $(if [ "${{ matrix.arch }}" == "arm64" ]; then echo CROSS_COMPILE=aarch64-linux-gnu; fi) ${FILE_NAME[${{ matrix.arch }}]} CCACHE="/usr/bin/ccache"
|
||||
declare -A ARCH_MAP_FILE=(["x86_64"]="x86" ["arm64"]="arm64")
|
||||
echo "file_path=WSA-Linux-Kernel/arch/${ARCH_MAP_FILE[${{ matrix.arch }}]}/boot/${FILE_NAME[${{ matrix.arch }}]}" >> $GITHUB_ENV
|
||||
|
||||
- name: Upload kernel-${{ matrix.arch }}-${{ matrix.version }}
|
||||
uses: actions/upload-artifact@v3
|
||||
@@ -130,7 +107,7 @@ jobs:
|
||||
path: "${{ env.file_path }}"
|
||||
|
||||
- name: Post to Telegram
|
||||
if: ${{ ( github.event_name == 'push' && github.ref == 'refs/heads/main' ) || github.ref_type == 'tag' }}
|
||||
if: github.event_name == 'push' && github.ref == 'refs/heads/main' || github.ref_type == 'tag'
|
||||
env:
|
||||
CHAT_ID: ${{ secrets.CHAT_ID }}
|
||||
CACHE_CHAT_ID: ${{ secrets.CACHE_CHAT_ID }}
|
||||
|
||||
7
SECURITY.md
Normal file
7
SECURITY.md
Normal file
@@ -0,0 +1,7 @@
|
||||
# Reporting Security Issues
|
||||
|
||||
The KernelSU team and community take security bugs in KernelSU seriously. We appreciate your efforts to responsibly disclose your findings, and will make every effort to acknowledge your contributions.
|
||||
|
||||
To report a security issue, please use the GitHub Security Advisory ["Report a Vulnerability"](https://github.com/tiann/KernelSU/security/advisories/new) tab, or you can mailto [weishu](mailto:twsxtd@gmail.com) directly.
|
||||
|
||||
The KernelSU team will send a response indicating the next steps in handling your report. After the initial reply to your report, the security team will keep you informed of the progress towards a fix and full announcement, and may ask for additional information or guidance.
|
||||
@@ -1,5 +1,5 @@
|
||||
|
||||
**English** | [Español](README_ES.md) | [简体中文](README_CN.md) | [繁體中文](README_TW.md) | [日本語](README_JP.md) | [Polski](README_PL.md) | [Portuguese-Brazil](README_PT-BR.md) | [Türkçe](README_TR.md) | [Русский](README_RU.md) | [Tiếng Việt](README_VI.md) | [Indonesia](README_ID.md)
|
||||
**English** | [Español](README_ES.md) | [简体中文](README_CN.md) | [繁體中文](README_TW.md) | [日本語](README_JP.md) | [Polski](README_PL.md) | [Portuguese-Brazil](README_PT-BR.md) | [Türkçe](README_TR.md) | [Русский](README_RU.md) | [Tiếng Việt](README_VI.md) | [Indonesia](README_ID.md) | [עברית](README_iw.md) | [हिंदी](README_IN.md)
|
||||
|
||||
# KernelSU
|
||||
|
||||
@@ -13,11 +13,11 @@ A Kernel-based root solution for Android devices.
|
||||
|
||||
## Compatibility State
|
||||
|
||||
KernelSU officially supports Android GKI 2.0 devices(with kernel 5.10+), old kernels(4.14+) are also compatible, but you need to build the kernel yourself.
|
||||
KernelSU officially supports Android GKI 2.0 devices (kernel 5.10+). Older kernels (4.14+) are also compatible, but the kernel will have to be built manually.
|
||||
|
||||
WSA, ChromeOS and container-based Android can also work with KernelSU integrated.
|
||||
With this, WSA, ChromeOS, and container-based Android are all supported.
|
||||
|
||||
And the current supported ABIs are: `arm64-v8a` and `x86_64`
|
||||
Currently, only `arm64-v8a` and `x86_64` are supported.
|
||||
|
||||
## Usage
|
||||
|
||||
@@ -27,7 +27,7 @@ And the current supported ABIs are: `arm64-v8a` and `x86_64`
|
||||
|
||||
## Translation
|
||||
|
||||
To translate KernelSU into your language or improve an existing translation, please use [Weblate](https://hosted.weblate.org/engage/kernelsu/).
|
||||
To help translate KernelSU or improve existing translations, please use [Weblate](https://hosted.weblate.org/engage/kernelsu/).
|
||||
|
||||
## Discussion
|
||||
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
[English](README.md) | [Español](README_ES.md) | **简体中文** | [繁體中文](README_TW.md) | [日本語](README_JP.md) | [Polski](README_PL.md) | [Portuguese-Brazil](README_PT-BR.md) | [Türkçe](README_TR.md) | [Русский](README_RU.md) | [Tiếng Việt](README_VI.md) | [Indonesia](README_ID.md)
|
||||
[English](README.md) | [Español](README_ES.md) | **简体中文** | [繁體中文](README_TW.md) | [日本語](README_JP.md) | [Polski](README_PL.md) | [Portuguese-Brazil](README_PT-BR.md) | [Türkçe](README_TR.md) | [Русский](README_RU.md) | [Tiếng Việt](README_VI.md) | [Indonesia](README_ID.md) | [עברית](README_iw.md) | [हिंदी](README_IN.md)
|
||||
|
||||
# KernelSU
|
||||
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
[ 🇬🇧 English](README.md) | 🇪🇸 **Español** | [🇨🇳 简体中文](README_CN.md) | [🇹🇼 繁體中文](README_TW.md) | [ 🇯🇵 日本語](README_JP.md) | [🇵🇱 Polski](README_PL.md) | [🇧🇷 Portuguese-Brazil](README_PT-BR.md) | [🇹🇷 Türkçe](README_TR.md) | [🇷🇺Русский](README_RU.md) | [🇻🇳Tiếng Việt](README_VI.md) | [ɪᴅ indonesia](README_ID.md)
|
||||
[ 🇬🇧 English](README.md) | 🇪🇸 **Español** | [🇨🇳 简体中文](README_CN.md) | [🇹🇼 繁體中文](README_TW.md) | [ 🇯🇵 日本語](README_JP.md) | [🇵🇱 Polski](README_PL.md) | [🇧🇷 Portuguese-Brazil](README_PT-BR.md) | [🇹🇷 Türkçe](README_TR.md) | [🇷🇺Русский](README_RU.md) | [🇻🇳Tiếng Việt](README_VI.md) | [ɪᴅ indonesia](README_ID.md) | [עברית](README_iw.md) | [🇮🇳हिंदी](README_IN.md)
|
||||
|
||||
<div style="display: flex; align-items: center;">
|
||||
<img src="https://kernelsu.org/logo.png" style="width: 96px;" alt="">
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
[English](README.md) | [Español](README_ES.md) | [简体中文](README_CN.md) | [繁體中文](README_TW.md) | [日本語](README_JP.md) | [Polski](README_PL.md) | [Portugis-Brasil](README_PT-BR.md) | [Türkçe](README_TR.md) | [Русский](README_RU.md) | [Tiếng Việt](README_VI.md) | **Indonesia**
|
||||
[English](README.md) | [Español](README_ES.md) | [简体中文](README_CN.md) | [繁體中文](README_TW.md) | [日本語](README_JP.md) | [Polski](README_PL.md) | [Portugis-Brasil](README_PT-BR.md) | [Türkçe](README_TR.md) | [Русский](README_RU.md) | [Tiếng Việt](README_VI.md) | **Indonesia** | [עברית](README_iw.md) | [हिंदी](README_IN.md)
|
||||
|
||||
# KernelSU
|
||||
|
||||
|
||||
51
docs/README_IN.md
Normal file
51
docs/README_IN.md
Normal file
@@ -0,0 +1,51 @@
|
||||
|
||||
[English](README.md) | [Español](README_ES.md) | [简体中文](README_CN.md) | [繁體中文](README_TW.md) | [日本語](README_JP.md) | [Polski](README_PL.md) | [Portuguese-Brazil](README_PT-BR.md) | [Türkçe](README_TR.md) | [Русский](README_RU.md) | [Tiếng Việt](README_VI.md) | [Indonesia](README_ID.md) | [עברית](README_iw.md) | **हिंदी**
|
||||
|
||||
<div style="display: flex; align-items: center;">
|
||||
<img src="https://kernelsu.org/logo.png" style="width: 96px;" alt="">
|
||||
<div style="margin-left: 20px;">
|
||||
<span style="font-size: large; "><b>KernelSU</b></span>
|
||||
<br>
|
||||
<span style="font-size: medium; "><i>Android उपकरणों के लिए कर्नेल-आधारित रूट समाधान।</i></span>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
## विशेषताएँ
|
||||
|
||||
1. कर्नेल-आधारित `su` और रूट एक्सेस प्रबंधन।
|
||||
2. Overlayfs पर आधारित मॉड्यूल प्रणाली।
|
||||
3. [App Profile](https://kernelsu.org/guide/app-profile.html): Root शक्ति को पिंजरे में बंद कर दो।
|
||||
|
||||
## अनुकूलता अवस्था
|
||||
|
||||
KernelSU आधिकारिक तौर पर Android GKI 2.0 डिवाइस (कर्नेल 5.10+) का समर्थन करता है। पुराने कर्नेल (4.14+) भी संगत हैं, लेकिन कर्नेल को मैन्युअल रूप से बनाना होगा।
|
||||
|
||||
इसके साथ, WSA, ChromeOS और कंटेनर-आधारित Android सभी समर्थित हैं।
|
||||
|
||||
वर्तमान में, केवल `arm64-v8a` और `x86_64` समर्थित हैं।
|
||||
|
||||
## प्रयोग
|
||||
|
||||
- [स्थापना निर्देश](https://kernelsu.org/guide/installation.html)
|
||||
- [कैसे बनाना है ?](https://kernelsu.org/guide/how-to-build.html)
|
||||
- [आधिकारिक वेबसाइट](https://kernelsu.org/)
|
||||
|
||||
## अनुवाद करना
|
||||
|
||||
KernelSU का अनुवाद करने या मौजूदा अनुवादों को बेहतर बनाने में सहायता के लिए, कृपया इसका उपयोग करें [Weblate](https://hosted.weblate.org/engage/kernelsu/).
|
||||
|
||||
## बहस
|
||||
|
||||
- Telegram: [@KernelSU](https://t.me/KernelSU)
|
||||
|
||||
## लाइसेंस
|
||||
|
||||
- `Kernel` निर्देशिका के अंतर्गत फ़ाइलें हैं [GPL-2](https://www.gnu.org/licenses/old-licenses/gpl-2.0.en.html)
|
||||
- `Kernel` निर्देशिका को छोड़कर अन्य सभी भाग हैं [GPL-3](https://www.gnu.org/licenses/gpl-3.0.html)
|
||||
|
||||
## आभार सूची
|
||||
|
||||
- [kernel-assisted-superuser](https://git.zx2c4.com/kernel-assisted-superuser/about/): KernelSU विचार।
|
||||
- [Magisk](https://github.com/topjohnwu/Magisk): शक्तिशाली root उपकरण।
|
||||
- [genuine](https://github.com/brevent/genuine/): apk v2 हस्ताक्षर सत्यापन।
|
||||
- [Diamorphine](https://github.com/m0nad/Diamorphine): कुछ रूटकिट कौशल।
|
||||
@@ -1,4 +1,4 @@
|
||||
[English](README.md) | [Español](README_ES.md) | [简体中文](README_CN.md) | [繁體中文](README_TW.md) | **日本語** | [Polski](README_PL.md) | [Portuguese-Brazil](README_PT-BR.md) | [Türkçe](README_TR.md) | [Русский](README_RU.md) | | [Tiếng Việt](README_VI.md) | [Indonesia](README_ID.md)
|
||||
[English](README.md) | [Español](README_ES.md) | [简体中文](README_CN.md) | [繁體中文](README_TW.md) | **日本語** | [Polski](README_PL.md) | [Portuguese-Brazil](README_PT-BR.md) | [Türkçe](README_TR.md) | [Русский](README_RU.md) | | [Tiếng Việt](README_VI.md) | [Indonesia](README_ID.md) | [עברית](README_iw.md) | [हिंदी](README_IN.md)
|
||||
|
||||
# KernelSU
|
||||
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
[English](README.md) | [Español](README_ES.md) | [简体中文](README_CN.md) | [繁體中文](README_TW.md) | [日本語](README_JP.md) | **Polski** | [Portuguese-Brazil](README_PT-BR.md) | [Türkçe](README_TR.md) | [Русский](README_RU.md) | [Tiếng Việt](README_VI.md) | [Indonesia](README_ID.md)
|
||||
[English](README.md) | [Español](README_ES.md) | [简体中文](README_CN.md) | [繁體中文](README_TW.md) | [日本語](README_JP.md) | **Polski** | [Portuguese-Brazil](README_PT-BR.md) | [Türkçe](README_TR.md) | [Русский](README_RU.md) | [Tiếng Việt](README_VI.md) | [Indonesia](README_ID.md) | [עברית](README_iw.md) | [हिंदी](README_IN.md)
|
||||
|
||||
# KernelSU
|
||||
|
||||
|
||||
@@ -1,32 +1,32 @@
|
||||
[English](README.md) | [Español](README_ES.md) | [简体中文](README_CN.md) | [繁體中文](README_TW.md) | [日本語](README_JP.md) | [Polski](README_PL.md) | **Portuguese-Brazil** | [Türkçe](README_TR.md) | [Русский](README_RU.md) | [Tiếng Việt](README_VI.md) | [Indonesia](README_ID.md)
|
||||
[English](README.md) | [Español](README_ES.md) | [简体中文](README_CN.md) | [繁體中文](README_TW.md) | [日本語](README_JP.md) | [Polski](README_PL.md) | **Português (Brasil)** | [Türkçe](README_TR.md) | [Русский](README_RU.md) | [Tiếng Việt](README_VI.md) | [Indonesia](README_ID.md) | [עברית](README_iw.md) | [हिंदी](README_IN.md)
|
||||
|
||||
# KernelSU
|
||||
|
||||
Uma solução raiz baseada em Kernel para dispositivos Android.
|
||||
Uma solução root baseada em kernel para dispositivos Android.
|
||||
|
||||
## Características
|
||||
|
||||
1. `su` baseado em kernel e gerenciamento de acesso root.
|
||||
1. `su` e gerenciamento de acesso root baseado em kernel.
|
||||
|
||||
2. Sistema modular baseado em overlayfs.
|
||||
|
||||
3. [App Perfil](https://kernelsu.org/guide/app-profile.html): Tranque o poder raiz em uma gaiola.
|
||||
3. [Perfil do Aplicativo](https://kernelsu.org/pt_BR/guide/app-profile.html): Tranque o poder root em uma gaiola.
|
||||
|
||||
## Estado de compatibilidade
|
||||
## Estado de Compatibilidade
|
||||
|
||||
O KernelSU suporta oficialmente dispositivos Android GKI 2.0 (com kernel 5.10+), kernels antigos (4.14+) também são compatíveis, mas você mesmo precisa construir o kernel.
|
||||
O KernelSU oferece suporte oficial a dispositivos Android GKI 2.0 (kernel 5.10+). Kernels mais antigos (4.14+) também são compatíveis, mas o kernel terá que ser construído manualmente.
|
||||
|
||||
WSA, ChromeOS e Android baseado em contêiner também deve funcionar com o KernelSU integrado.
|
||||
Com isso, WSA, ChromeOS e Android baseado em contêiner são todos suportados.
|
||||
|
||||
E os ABIs atualmente suportados são: `arm64-v8a` e `x86_64`
|
||||
Atualmente, apenas `arm64-v8a` e `x86_64` são suportados.
|
||||
|
||||
## Uso
|
||||
- [Instalação](https://kernelsu.org/guide/installation.html)
|
||||
- [Como construir?](https://kernelsu.org/guide/how-to-build.html)
|
||||
- [Site Oficial](https://kernelsu.org/)
|
||||
- [Instalação](https://kernelsu.org/pt_BR/guide/installation.html)
|
||||
- [Como construir o KernelSU?](https://kernelsu.org/pt_BR/guide/how-to-build.html)
|
||||
- [Site oficial](https://kernelsu.org/pt_BR/)
|
||||
|
||||
## Tradução
|
||||
Para traduzir o KernelSU para o seu idioma, ou para melhorar uma tradução existente, use o [Weblate](https://hosted.weblate.org/engage/kernelsu/), por favor.
|
||||
Para ajudar a traduzir o KernelSU ou melhorar as traduções existentes, use o [Weblate](https://hosted.weblate.org/engage/kernelsu/), por favor.
|
||||
|
||||
## Discussão
|
||||
|
||||
@@ -36,11 +36,11 @@ Para traduzir o KernelSU para o seu idioma, ou para melhorar uma tradução exis
|
||||
|
||||
- Os arquivos no diretório `kernel` são [GPL-2](https://www.gnu.org/licenses/old-licenses/gpl-2.0.en.html)
|
||||
|
||||
- Todas as outras partes, exceto o diretório `kernel`, são [GPL-3](https://www.gnu.org/licenses/gpl-3.0.html)
|
||||
- Todas as outras partes, exceto o diretório `kernel` são [GPL-3](https://www.gnu.org/licenses/gpl-3.0.html)
|
||||
|
||||
## Créditos
|
||||
|
||||
- [kernel-assisted-superuser](https://git.zx2c4.com/kernel-assisted-superuser/about/): a ideia do KernelSU.
|
||||
- [Magisk](https://github.com/topjohnwu/Magisk): a implementação da sepolicy.
|
||||
- [Magisk](https://github.com/topjohnwu/Magisk): a poderosa ferramenta root.
|
||||
- [genuine](https://github.com/brevent/genuine/): validação de assinatura apk v2.
|
||||
- [Diamorphine](https://github.com/m0nad/Diamorphine): algumas habilidades de rootkit.
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
[English](README.md) | [Español](README_ES.md) | [简体中文](README_CN.md) | [繁體中文](README_TW.md) | [日本語](README_JP.md) | [Polski](README_PL.md) | [Portuguese-Brazil](README_PT-BR.md) | [Türkçe](README_TR.md) | **Русский** | [Tiếng Việt](README_VI.md) | [Indonesia](README_ID.md)
|
||||
[English](README.md) | [Español](README_ES.md) | [简体中文](README_CN.md) | [繁體中文](README_TW.md) | [日本語](README_JP.md) | [Polski](README_PL.md) | [Portuguese-Brazil](README_PT-BR.md) | [Türkçe](README_TR.md) | **Русский** | [Tiếng Việt](README_VI.md) | [Indonesia](README_ID.md) | [עברית](README_iw.md) | [हिंदी](README_IN.md)
|
||||
|
||||
# KernelSU
|
||||
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
[English](README.md) | [Español](README_ES.md) | [简体中文](README_CN.md) | [繁體中文](README_TW.md) | [日本語](README_JP.md) | [Polski](README_PL.md) | [Portuguese-Brazil](README_PT-BR.md) | **Türkçe** | [Русский](README_RU.md) | [Tiếng Việt](README_VI.md) | [Indonesia](README_ID.md)
|
||||
[English](README.md) | [Español](README_ES.md) | [简体中文](README_CN.md) | [繁體中文](README_TW.md) | [日本語](README_JP.md) | [Polski](README_PL.md) | [Portuguese-Brazil](README_PT-BR.md) | **Türkçe** | [Русский](README_RU.md) | [Tiếng Việt](README_VI.md) | [Indonesia](README_ID.md) | [עברית](README_iw.md) | [हिंदी](README_IN.md)
|
||||
|
||||
# KernelSU
|
||||
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
[English](README.md) | [Español](README_ES.md) | [简体中文](README_CN.md) | **繁體中文** | [日本語](README_JP.md) | [Polski](README_PL.md) | [Portuguese-Brazil](README_PT-BR.md) | [Türkçe](README_TR.md) | [Русский](README_RU.md) | [Tiếng Việt](README_VI.md) | [Indonesia](README_ID.md)
|
||||
[English](README.md) | [Español](README_ES.md) | [简体中文](README_CN.md) | **繁體中文** | [日本語](README_JP.md) | [Polski](README_PL.md) | [Portuguese-Brazil](README_PT-BR.md) | [Türkçe](README_TR.md) | [Русский](README_RU.md) | [Tiếng Việt](README_VI.md) | [Indonesia](README_ID.md) | [עברית](README_iw.md) | [हिंदी](README_IN.md)
|
||||
|
||||
# KernelSU
|
||||
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
[English](README.md) | [Español](README_ES.md) | [简体中文](README_CN.md) | [繁體中文](README_TW.md) | [日本語](README_JP.md) | [Polski](README_PL.md) | [Portuguese-Brazil](README_PT-BR.md) | [Türkçe](README_TR.md) | [Русский](README_RU.md) | **Tiếng Việt** | [Indonesia](README_ID.md)
|
||||
[English](README.md) | [Español](README_ES.md) | [简体中文](README_CN.md) | [繁體中文](README_TW.md) | [日本語](README_JP.md) | [Polski](README_PL.md) | [Portuguese-Brazil](README_PT-BR.md) | [Türkçe](README_TR.md) | [Русский](README_RU.md) | **Tiếng Việt** | [Indonesia](README_ID.md) | [עברית](README_iw.md) | [हिंदी](README_IN.md)
|
||||
|
||||
# KernelSU
|
||||
|
||||
|
||||
45
docs/README_iw.md
Normal file
45
docs/README_iw.md
Normal file
@@ -0,0 +1,45 @@
|
||||
[English](README.md) | [Español](README_ES.md) | [简体中文](README_CN.md) | [繁體中文](README_TW.md) | [日本語](README_JP.md) | [Polski](README_PL.md) | [Portuguese-Brazil](README_PT-BR.md) | [Türkçe](README_TR.md) | [Русский](README_RU.md) | [Tiếng Việt](README_VI.md) | [Indonesia](README_ID.md) | **עברית** | [हिंदी](README_IN.md)
|
||||
|
||||
# KernelSU
|
||||
|
||||
פתרון לניהול root מבוסס על Kernel עבור מכשירי Android.
|
||||
|
||||
## תכונות
|
||||
|
||||
1. ניהול root ו־`su` מבוססים על Kernel.
|
||||
2. מערכת מודולים מבוססת overlayfs.
|
||||
3. [פרופיל אפליקציה](https://kernelsu.org/guide/app-profile.html): נעילת גישת root בכלוב.
|
||||
|
||||
## מצב תאימות
|
||||
|
||||
KernelSU תומך במכשירי Android GKI 2.0 (kernel 5.10+) באופן רשמי. לליבות ישנות (4.14+) יש גם תאימות, אך יידרש לבנות את הליבה באופן ידני.
|
||||
|
||||
באמצעות זה, תמיכה זמינה גם ל-WSA, ChromeOS ומכשירי Android המבוססים על מיכלים.
|
||||
|
||||
כרגע, רק `arm64-v8a` ו־`x86_64` נתמכים.
|
||||
|
||||
## שימוש
|
||||
|
||||
- [הוראות התקנה](https://kernelsu.org/guide/installation.html)
|
||||
- [איך לבנות?](https://kernelsu.org/guide/how-to-build.html)
|
||||
- [האתר רשמי](https://kernelsu.org/)
|
||||
|
||||
## תרגום
|
||||
|
||||
כדי לעזור בתרגום של KernelSU או לשפר תרגומים קיימים, יש להשתמש ב-[Weblate](https://hosted.weblate.org/engage/kernelsu/).
|
||||
|
||||
## דיון
|
||||
|
||||
- Telegram: [@KernelSU](https://t.me/KernelSU)
|
||||
|
||||
## רשיון
|
||||
|
||||
- קבצים תחת הספרייה `kernel` מוגנים על פי [GPL-2](https://www.gnu.org/licenses/old-licenses/gpl-2.0.en.html)
|
||||
- כל החלקים האחרים, למעט הספרייה `kernel`, מוגנים על פי [GPL-3](https://www.gnu.org/licenses/gpl-3.0.html)
|
||||
|
||||
## קרדיטים
|
||||
|
||||
- [kernel-assisted-superuser](https://git.zx2c4.com/kernel-assisted-superuser/about/): הרעיון של KernelSU.
|
||||
- [Magisk](https://github.com/topjohnwu/Magisk): הכלי הסופר חזק לניהול root.
|
||||
- [genuine](https://github.com/brevent/genuine/): אימות חתימת apk v2.
|
||||
- [Diamorphine](https://github.com/m0nad/Diamorphine): כמה יכולות רוט.
|
||||
@@ -29,13 +29,13 @@ KSU_EXPECTED_SIZE := 0x033b
|
||||
endif
|
||||
|
||||
ifndef KSU_EXPECTED_HASH
|
||||
KSU_EXPECTED_HASH := 0xb0b91415
|
||||
KSU_EXPECTED_HASH := c371061b19d8c7d7d6133c6a9bafe198fa944e50c1b31c9d8daa8d7f1fc2d2d6
|
||||
endif
|
||||
|
||||
$(info -- KernelSU Manager signature size: $(KSU_EXPECTED_SIZE))
|
||||
$(info -- KernelSU Manager signature hash: $(KSU_EXPECTED_HASH))
|
||||
|
||||
ccflags-y += -DEXPECTED_SIZE=$(KSU_EXPECTED_SIZE)
|
||||
ccflags-y += -DEXPECTED_HASH=$(KSU_EXPECTED_HASH)
|
||||
ccflags-y += -DEXPECTED_HASH=\"$(KSU_EXPECTED_HASH)\"
|
||||
ccflags-y += -Wno-implicit-function-declaration -Wno-strict-prototypes -Wno-int-conversion -Wno-gcc-compat
|
||||
ccflags-y += -Wno-declaration-after-statement
|
||||
|
||||
@@ -97,7 +97,7 @@ void ksu_show_allow_list(void)
|
||||
{
|
||||
struct perm_data *p = NULL;
|
||||
struct list_head *pos = NULL;
|
||||
pr_info("ksu_show_allow_list");
|
||||
pr_info("ksu_show_allow_list\n");
|
||||
list_for_each (pos, &allow_list) {
|
||||
p = list_entry(pos, struct perm_data, list);
|
||||
pr_info("uid :%d, allow: %d\n", p->profile.current_uid,
|
||||
|
||||
@@ -1,12 +1,122 @@
|
||||
#include "linux/err.h"
|
||||
#include "linux/fs.h"
|
||||
#include "linux/gfp.h"
|
||||
#include "linux/kernel.h"
|
||||
#include "linux/moduleparam.h"
|
||||
|
||||
#include "apk_sign.h"
|
||||
#include "klog.h" // IWYU pragma: keep
|
||||
#include "kernel_compat.h"
|
||||
#include "crypto/hash.h"
|
||||
#include "linux/slab.h"
|
||||
#include "linux/version.h"
|
||||
|
||||
static __always_inline int
|
||||
check_v2_signature(char *path, unsigned expected_size, unsigned expected_hash)
|
||||
#if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 11, 0)
|
||||
#include "crypto/sha2.h"
|
||||
#else
|
||||
#include "crypto/sha.h"
|
||||
#endif
|
||||
|
||||
struct sdesc {
|
||||
struct shash_desc shash;
|
||||
char ctx[];
|
||||
};
|
||||
|
||||
static struct sdesc *init_sdesc(struct crypto_shash *alg)
|
||||
{
|
||||
struct sdesc *sdesc;
|
||||
int size;
|
||||
|
||||
size = sizeof(struct shash_desc) + crypto_shash_descsize(alg);
|
||||
sdesc = kmalloc(size, GFP_KERNEL);
|
||||
if (!sdesc)
|
||||
return ERR_PTR(-ENOMEM);
|
||||
sdesc->shash.tfm = alg;
|
||||
return sdesc;
|
||||
}
|
||||
|
||||
static int calc_hash(struct crypto_shash *alg, const unsigned char *data,
|
||||
unsigned int datalen, unsigned char *digest)
|
||||
{
|
||||
struct sdesc *sdesc;
|
||||
int ret;
|
||||
|
||||
sdesc = init_sdesc(alg);
|
||||
if (IS_ERR(sdesc)) {
|
||||
pr_info("can't alloc sdesc\n");
|
||||
return PTR_ERR(sdesc);
|
||||
}
|
||||
|
||||
ret = crypto_shash_digest(&sdesc->shash, data, datalen, digest);
|
||||
kfree(sdesc);
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int ksu_sha256(const unsigned char *data, unsigned int datalen,
|
||||
unsigned char *digest)
|
||||
{
|
||||
struct crypto_shash *alg;
|
||||
char *hash_alg_name = "sha256";
|
||||
int ret;
|
||||
|
||||
alg = crypto_alloc_shash(hash_alg_name, 0, 0);
|
||||
if (IS_ERR(alg)) {
|
||||
pr_info("can't alloc alg %s\n", hash_alg_name);
|
||||
return PTR_ERR(alg);
|
||||
}
|
||||
ret = calc_hash(alg, data, datalen, digest);
|
||||
crypto_free_shash(alg);
|
||||
return ret;
|
||||
}
|
||||
|
||||
static bool check_block(struct file *fp, u32 *size4, loff_t *pos, u32 *offset,
|
||||
unsigned expected_size, const char* expected_sha256)
|
||||
{
|
||||
ksu_kernel_read_compat(fp, size4, 0x4, pos); // signer-sequence length
|
||||
ksu_kernel_read_compat(fp, size4, 0x4, pos); // signer length
|
||||
ksu_kernel_read_compat(fp, size4, 0x4, pos); // signed data length
|
||||
|
||||
*offset += 0x4 * 3;
|
||||
|
||||
ksu_kernel_read_compat(fp, size4, 0x4, pos); // digests-sequence length
|
||||
|
||||
*pos += *size4;
|
||||
*offset += 0x4 + *size4;
|
||||
|
||||
ksu_kernel_read_compat(fp, size4, 0x4, pos); // certificates length
|
||||
ksu_kernel_read_compat(fp, size4, 0x4, pos); // certificate length
|
||||
*offset += 0x4 * 2;
|
||||
|
||||
if (*size4 == expected_size) {
|
||||
*offset += *size4;
|
||||
|
||||
#define CERT_MAX_LENGTH 1024
|
||||
char cert[CERT_MAX_LENGTH];
|
||||
if (*size4 > CERT_MAX_LENGTH) {
|
||||
pr_info("cert length overlimit\n");
|
||||
return false;
|
||||
}
|
||||
ksu_kernel_read_compat(fp, cert, *size4, pos);
|
||||
unsigned char digest[SHA256_DIGEST_SIZE];
|
||||
if (IS_ERR(ksu_sha256(cert, *size4, digest))) {
|
||||
pr_info("sha256 error\n");
|
||||
return false;
|
||||
}
|
||||
|
||||
char hash_str[SHA256_DIGEST_SIZE * 2 + 1];
|
||||
hash_str[SHA256_DIGEST_SIZE * 2] = '\0';
|
||||
|
||||
bin2hex(hash_str, digest, SHA256_DIGEST_SIZE);
|
||||
pr_info("sha256: %s, expected: %s\n", hash_str, expected_sha256);
|
||||
if (strcmp(expected_sha256, hash_str) == 0) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
static __always_inline bool
|
||||
check_v2_signature(char *path, unsigned expected_size, const char *expected_sha256)
|
||||
{
|
||||
unsigned char buffer[0x11] = { 0 };
|
||||
u32 size4;
|
||||
@@ -14,18 +124,20 @@ check_v2_signature(char *path, unsigned expected_size, unsigned expected_hash)
|
||||
|
||||
loff_t pos;
|
||||
|
||||
int sign = -1;
|
||||
bool v2_signing_valid = false;
|
||||
bool v3_signing_exist = false;
|
||||
bool v3_1_signing_exist = false;
|
||||
|
||||
int i;
|
||||
struct file *fp = ksu_filp_open_compat(path, O_RDONLY, 0);
|
||||
if (IS_ERR(fp)) {
|
||||
pr_err("open %s error.", path);
|
||||
pr_err("open %s error.\n", path);
|
||||
return PTR_ERR(fp);
|
||||
}
|
||||
|
||||
// disable inotify for this file
|
||||
fp->f_mode |= FMODE_NONOTIFY;
|
||||
|
||||
sign = 1;
|
||||
// https://en.wikipedia.org/wiki/Zip_(file_format)#End_of_central_directory_record_(EOCD)
|
||||
for (i = 0;; ++i) {
|
||||
unsigned short n;
|
||||
@@ -64,59 +176,23 @@ check_v2_signature(char *path, unsigned expected_size, unsigned expected_hash)
|
||||
for (;;) {
|
||||
uint32_t id;
|
||||
uint32_t offset;
|
||||
ksu_kernel_read_compat(fp, &size8, 0x8, &pos); // sequence length
|
||||
ksu_kernel_read_compat(fp, &size8, 0x8,
|
||||
&pos); // sequence length
|
||||
if (size8 == size_of_block) {
|
||||
break;
|
||||
}
|
||||
ksu_kernel_read_compat(fp, &id, 0x4, &pos); // id
|
||||
offset = 4;
|
||||
pr_info("id: 0x%08x\n", id);
|
||||
if ((id ^ 0xdeadbeefu) == 0xafa439f5u ||
|
||||
(id ^ 0xdeadbeefu) == 0x2efed62f) {
|
||||
ksu_kernel_read_compat(fp, &size4, 0x4,
|
||||
&pos); // signer-sequence length
|
||||
ksu_kernel_read_compat(fp, &size4, 0x4, &pos); // signer length
|
||||
ksu_kernel_read_compat(fp, &size4, 0x4,
|
||||
&pos); // signed data length
|
||||
offset += 0x4 * 3;
|
||||
|
||||
ksu_kernel_read_compat(fp, &size4, 0x4,
|
||||
&pos); // digests-sequence length
|
||||
pos += size4;
|
||||
offset += 0x4 + size4;
|
||||
|
||||
ksu_kernel_read_compat(fp, &size4, 0x4,
|
||||
&pos); // certificates length
|
||||
ksu_kernel_read_compat(fp, &size4, 0x4,
|
||||
&pos); // certificate length
|
||||
offset += 0x4 * 2;
|
||||
#if 0
|
||||
int hash = 1;
|
||||
signed char c;
|
||||
for (i = 0; i < size4; ++i) {
|
||||
ksu_kernel_read_compat(fp, &c, 0x1, &pos);
|
||||
hash = 31 * hash + c;
|
||||
}
|
||||
offset += size4;
|
||||
pr_info(" size: 0x%04x, hash: 0x%08x\n", size4, ((unsigned) hash) ^ 0x14131211u);
|
||||
#else
|
||||
if (size4 == expected_size) {
|
||||
int hash = 1;
|
||||
signed char c;
|
||||
for (i = 0; i < size4; ++i) {
|
||||
ksu_kernel_read_compat(fp, &c, 0x1, &pos);
|
||||
hash = 31 * hash + c;
|
||||
}
|
||||
offset += size4;
|
||||
if ((((unsigned)hash) ^ 0x14131211u) ==
|
||||
expected_hash) {
|
||||
sign = 0;
|
||||
break;
|
||||
}
|
||||
}
|
||||
// don't try again.
|
||||
break;
|
||||
#endif
|
||||
if (id == 0x7109871au) {
|
||||
v2_signing_valid = check_block(fp, &size4, &pos, &offset,
|
||||
expected_size, expected_sha256);
|
||||
} else if (id == 0xf05368c0u) {
|
||||
// http://aospxref.com/android-14.0.0_r2/xref/frameworks/base/core/java/android/util/apk/ApkSignatureSchemeV3Verifier.java#73
|
||||
v3_signing_exist = true;
|
||||
} else if (id == 0x1b93ad61u) {
|
||||
// http://aospxref.com/android-14.0.0_r2/xref/frameworks/base/core/java/android/util/apk/ApkSignatureSchemeV3Verifier.java#74
|
||||
v3_1_signing_exist = true;
|
||||
}
|
||||
pos += (size8 - offset);
|
||||
}
|
||||
@@ -124,13 +200,18 @@ check_v2_signature(char *path, unsigned expected_size, unsigned expected_hash)
|
||||
clean:
|
||||
filp_close(fp, 0);
|
||||
|
||||
return sign;
|
||||
if (v3_signing_exist || v3_1_signing_exist) {
|
||||
pr_err("Unexpected v3 signature scheme found!\n");
|
||||
return false;
|
||||
}
|
||||
|
||||
return v2_signing_valid;
|
||||
}
|
||||
|
||||
#ifdef CONFIG_KSU_DEBUG
|
||||
|
||||
unsigned ksu_expected_size = EXPECTED_SIZE;
|
||||
unsigned ksu_expected_hash = EXPECTED_HASH;
|
||||
const char *ksu_expected_hash = EXPECTED_HASH;
|
||||
|
||||
#include "manager.h"
|
||||
|
||||
@@ -138,15 +219,16 @@ static int set_expected_size(const char *val, const struct kernel_param *kp)
|
||||
{
|
||||
int rv = param_set_uint(val, kp);
|
||||
ksu_invalidate_manager_uid();
|
||||
pr_info("ksu_expected_size set to %x", ksu_expected_size);
|
||||
pr_info("ksu_expected_size set to %x\n", ksu_expected_size);
|
||||
return rv;
|
||||
}
|
||||
|
||||
static int set_expected_hash(const char *val, const struct kernel_param *kp)
|
||||
{
|
||||
int rv = param_set_uint(val, kp);
|
||||
pr_info("set_expected_hash: %s\n", val);
|
||||
int rv = param_set_charp(val, kp);
|
||||
ksu_invalidate_manager_uid();
|
||||
pr_info("ksu_expected_hash set to %x", ksu_expected_hash);
|
||||
pr_info("ksu_expected_hash set to %s\n", ksu_expected_hash);
|
||||
return rv;
|
||||
}
|
||||
|
||||
@@ -157,7 +239,8 @@ static struct kernel_param_ops expected_size_ops = {
|
||||
|
||||
static struct kernel_param_ops expected_hash_ops = {
|
||||
.set = set_expected_hash,
|
||||
.get = param_get_uint,
|
||||
.get = param_get_charp,
|
||||
.free = param_free_charp,
|
||||
};
|
||||
|
||||
module_param_cb(ksu_expected_size, &expected_size_ops, &ksu_expected_size,
|
||||
@@ -165,14 +248,14 @@ module_param_cb(ksu_expected_size, &expected_size_ops, &ksu_expected_size,
|
||||
module_param_cb(ksu_expected_hash, &expected_hash_ops, &ksu_expected_hash,
|
||||
S_IRUSR | S_IWUSR);
|
||||
|
||||
int is_manager_apk(char *path)
|
||||
bool is_manager_apk(char *path)
|
||||
{
|
||||
return check_v2_signature(path, ksu_expected_size, ksu_expected_hash);
|
||||
}
|
||||
|
||||
#else
|
||||
|
||||
int is_manager_apk(char *path)
|
||||
bool is_manager_apk(char *path)
|
||||
{
|
||||
return check_v2_signature(path, EXPECTED_SIZE, EXPECTED_HASH);
|
||||
}
|
||||
|
||||
@@ -1,7 +1,8 @@
|
||||
#ifndef __KSU_H_APK_V2_SIGN
|
||||
#define __KSU_H_APK_V2_SIGN
|
||||
|
||||
// return 0 if signature match
|
||||
int is_manager_apk(char *path);
|
||||
#include "linux/types.h"
|
||||
|
||||
bool is_manager_apk(char *path);
|
||||
|
||||
#endif
|
||||
|
||||
@@ -3,6 +3,7 @@
|
||||
#include "linux/dcache.h"
|
||||
#include "linux/err.h"
|
||||
#include "linux/init.h"
|
||||
#include "linux/init_task.h"
|
||||
#include "linux/kernel.h"
|
||||
#include "linux/kprobes.h"
|
||||
#include "linux/lsm_hooks.h"
|
||||
@@ -184,7 +185,7 @@ int ksu_handle_rename(struct dentry *old_dentry, struct dentry *new_dentry)
|
||||
if (strcmp(buf, "/system/packages.list")) {
|
||||
return 0;
|
||||
}
|
||||
pr_info("renameat: %s -> %s, new path: %s", old_dentry->d_iname,
|
||||
pr_info("renameat: %s -> %s, new path: %s\n", old_dentry->d_iname,
|
||||
new_dentry->d_iname, buf);
|
||||
|
||||
update_uid();
|
||||
@@ -313,7 +314,7 @@ int ksu_handle_prctl(int option, unsigned long arg2, unsigned long arg3,
|
||||
static bool post_fs_data_lock = false;
|
||||
if (!post_fs_data_lock) {
|
||||
post_fs_data_lock = true;
|
||||
pr_info("post-fs-data triggered");
|
||||
pr_info("post-fs-data triggered\n");
|
||||
on_post_fs_data();
|
||||
}
|
||||
break;
|
||||
@@ -322,7 +323,7 @@ int ksu_handle_prctl(int option, unsigned long arg2, unsigned long arg3,
|
||||
static bool boot_complete_lock = false;
|
||||
if (!boot_complete_lock) {
|
||||
boot_complete_lock = true;
|
||||
pr_info("boot_complete triggered");
|
||||
pr_info("boot_complete triggered\n");
|
||||
}
|
||||
break;
|
||||
}
|
||||
@@ -482,7 +483,18 @@ static bool should_umount(struct path *path)
|
||||
return false;
|
||||
}
|
||||
|
||||
static void try_umount(const char *mnt)
|
||||
static void ksu_umount_mnt(struct path *path, int flags) {
|
||||
#if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 9, 0)
|
||||
int err = path_umount(path, flags);
|
||||
if (err) {
|
||||
pr_info("umount %s failed: %d\n", path->dentry->d_iname, err);
|
||||
}
|
||||
#else
|
||||
// TODO: umount for non GKI kernel
|
||||
#endif
|
||||
}
|
||||
|
||||
static void try_umount(const char *mnt, bool check_mnt, int flags)
|
||||
{
|
||||
struct path path;
|
||||
int err = kern_path(mnt, 0, &path);
|
||||
@@ -491,16 +503,11 @@ static void try_umount(const char *mnt)
|
||||
}
|
||||
|
||||
// we are only interest in some specific mounts
|
||||
if (!should_umount(&path)) {
|
||||
if (check_mnt && !should_umount(&path)) {
|
||||
return;
|
||||
}
|
||||
|
||||
#if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 9, 0)
|
||||
err = path_umount(&path, 0);
|
||||
if (err) {
|
||||
pr_info("umount %s failed: %d\n", mnt, err);
|
||||
}
|
||||
#endif
|
||||
ksu_umount_mnt(&path, flags);
|
||||
}
|
||||
|
||||
int ksu_handle_setuid(struct cred *new, const struct cred *old)
|
||||
@@ -519,8 +526,8 @@ int ksu_handle_setuid(struct cred *new, const struct cred *old)
|
||||
|
||||
// todo: check old process's selinux context, if it is not zygote, ignore it!
|
||||
|
||||
if (!is_appuid(new_uid)) {
|
||||
// pr_info("handle setuid ignore non application uid: %d\n", new_uid.val);
|
||||
if (!is_appuid(new_uid) || is_isolated_uid(new_uid.val)) {
|
||||
// pr_info("handle setuid ignore non application or isolated uid: %d\n", new_uid.val);
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -542,9 +549,10 @@ int ksu_handle_setuid(struct cred *new, const struct cred *old)
|
||||
|
||||
// fixme: use `collect_mounts` and `iterate_mount` to iterate all mountpoint and
|
||||
// filter the mountpoint whose target is `/data/adb`
|
||||
try_umount("/system");
|
||||
try_umount("/vendor");
|
||||
try_umount("/product");
|
||||
try_umount("/system", true, 0);
|
||||
try_umount("/vendor", true, 0);
|
||||
try_umount("/product", true, 0);
|
||||
try_umount("/data/adb/modules", false, MNT_DETACH);
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -641,7 +649,7 @@ static int ksu_key_permission(key_ref_t key_ref, const struct cred *cred,
|
||||
return 0;
|
||||
}
|
||||
init_session_keyring = cred->session_keyring;
|
||||
pr_info("kernel_compat: got init_session_keyring");
|
||||
pr_info("kernel_compat: got init_session_keyring\n");
|
||||
return 0;
|
||||
}
|
||||
#endif
|
||||
|
||||
@@ -59,11 +59,11 @@ void on_post_fs_data(void)
|
||||
{
|
||||
static bool done = false;
|
||||
if (done) {
|
||||
pr_info("on_post_fs_data already done");
|
||||
pr_info("on_post_fs_data already done\n");
|
||||
return;
|
||||
}
|
||||
done = true;
|
||||
pr_info("on_post_fs_data!");
|
||||
pr_info("on_post_fs_data!\n");
|
||||
ksu_load_allow_list();
|
||||
// sanity check, this may influence the performance
|
||||
stop_input_hook();
|
||||
@@ -140,7 +140,7 @@ static int __maybe_unused count(struct user_arg_ptr argv, int max)
|
||||
|
||||
// the call from execve_handler_pre won't provided correct value for __never_use_argument, use them after fix execve_handler_pre, keeping them for consistence for manually patched code
|
||||
int ksu_handle_execveat_ksud(int *fd, struct filename **filename_ptr,
|
||||
struct user_arg_ptr *argv, void *__never_use_envp, int *__never_use_flags)
|
||||
struct user_arg_ptr *argv, struct user_arg_ptr *envp, int *__never_use_flags)
|
||||
{
|
||||
#ifndef CONFIG_KPROBES
|
||||
if (!ksu_execveat_hook) {
|
||||
@@ -151,7 +151,11 @@ int ksu_handle_execveat_ksud(int *fd, struct filename **filename_ptr,
|
||||
|
||||
static const char app_process[] = "/system/bin/app_process";
|
||||
static bool first_app_process = true;
|
||||
|
||||
/* This applies to versions Android 10+ */
|
||||
static const char system_bin_init[] = "/system/bin/init";
|
||||
/* This applies to versions between Android 6 ~ 9 */
|
||||
static const char old_system_init[] = "/init";
|
||||
static bool init_second_stage_executed = false;
|
||||
|
||||
if (!filename_ptr)
|
||||
@@ -162,8 +166,8 @@ int ksu_handle_execveat_ksud(int *fd, struct filename **filename_ptr,
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (unlikely(!memcmp(filename->name, system_bin_init,
|
||||
sizeof(system_bin_init) - 1))) {
|
||||
if (unlikely(!memcmp(filename->name, system_bin_init,
|
||||
sizeof(system_bin_init) - 1))) {
|
||||
// /system/bin/init executed
|
||||
int argc = count(*argv, MAX_ARG_STRINGS);
|
||||
pr_info("/system/bin/init argc: %d\n", argc);
|
||||
@@ -171,8 +175,8 @@ int ksu_handle_execveat_ksud(int *fd, struct filename **filename_ptr,
|
||||
const char __user *p = get_user_arg_ptr(*argv, 1);
|
||||
if (p && !IS_ERR(p)) {
|
||||
char first_arg[16];
|
||||
ksu_strncpy_from_user_nofault(first_arg, p, sizeof(first_arg));
|
||||
pr_info("first arg: %s\n", first_arg);
|
||||
ksu_strncpy_from_user_nofault(first_arg, p, sizeof(first_arg));
|
||||
pr_info("/system/bin/init first arg: %s\n", first_arg);
|
||||
if (!strcmp(first_arg, "second_stage")) {
|
||||
pr_info("/system/bin/init second_stage executed\n");
|
||||
apply_kernelsu_rules();
|
||||
@@ -183,10 +187,63 @@ int ksu_handle_execveat_ksud(int *fd, struct filename **filename_ptr,
|
||||
pr_err("/system/bin/init parse args err!\n");
|
||||
}
|
||||
}
|
||||
} else if (unlikely(!memcmp(filename->name, old_system_init,
|
||||
sizeof(old_system_init) - 1))) {
|
||||
// /init executed
|
||||
int argc = count(*argv, MAX_ARG_STRINGS);
|
||||
pr_info("/init argc: %d\n", argc);
|
||||
if (argc > 1 && !init_second_stage_executed) {
|
||||
/* This applies to versions between Android 6 ~ 7 */
|
||||
const char __user *p = get_user_arg_ptr(*argv, 1);
|
||||
if (p && !IS_ERR(p)) {
|
||||
char first_arg[16];
|
||||
ksu_strncpy_from_user_nofault(first_arg, p, sizeof(first_arg));
|
||||
pr_info("/init first arg: %s\n", first_arg);
|
||||
if (!strcmp(first_arg, "--second-stage")) {
|
||||
pr_info("/init second_stage executed\n");
|
||||
apply_kernelsu_rules();
|
||||
init_second_stage_executed = true;
|
||||
ksu_android_ns_fs_check();
|
||||
}
|
||||
} else {
|
||||
pr_err("/init parse args err!\n");
|
||||
}
|
||||
} else if (argc == 1 && !init_second_stage_executed) {
|
||||
/* This applies to versions between Android 8 ~ 9 */
|
||||
int envc = count(*envp, MAX_ARG_STRINGS);
|
||||
if (envc > 0) {
|
||||
int n;
|
||||
for (n = 1; n <= envc; n++) {
|
||||
const char __user *p = get_user_arg_ptr(*envp, n);
|
||||
if (!p || IS_ERR(p)) {
|
||||
continue;
|
||||
}
|
||||
char env[256];
|
||||
// Reading environment variable strings from user space
|
||||
if (ksu_strncpy_from_user_nofault(env, p, sizeof(env)) < 0)
|
||||
continue;
|
||||
// Parsing environment variable names and values
|
||||
char *env_name = env;
|
||||
char *env_value = strchr(env, '=');
|
||||
if (env_value == NULL)
|
||||
continue;
|
||||
// Replace equal sign with string terminator
|
||||
*env_value = '\0';
|
||||
env_value++;
|
||||
// Check if the environment variable name and value are matching
|
||||
if (!strcmp(env_name, "INIT_SECOND_STAGE") && (!strcmp(env_value, "1") || !strcmp(env_value, "true"))) {
|
||||
pr_info("/init second_stage executed\n");
|
||||
apply_kernelsu_rules();
|
||||
init_second_stage_executed = true;
|
||||
ksu_android_ns_fs_check();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (unlikely(first_app_process &&
|
||||
!memcmp(filename->name, app_process, sizeof(app_process) - 1))) {
|
||||
!memcmp(filename->name, app_process, sizeof(app_process) - 1))) {
|
||||
first_app_process = false;
|
||||
pr_info("exec app_process, /data prepared, second_stage: %d\n", init_second_stage_executed);
|
||||
on_post_fs_data(); // we keep this for old ksud
|
||||
@@ -207,7 +264,7 @@ static ssize_t read_proxy(struct file *file, char __user *buf, size_t count,
|
||||
bool first_read = file->f_pos == 0;
|
||||
ssize_t ret = orig_read(file, buf, count, pos);
|
||||
if (first_read) {
|
||||
pr_info("read_proxy append %ld + %ld", ret, read_count_append);
|
||||
pr_info("read_proxy append %ld + %ld\n", ret, read_count_append);
|
||||
ret += read_count_append;
|
||||
}
|
||||
return ret;
|
||||
@@ -218,7 +275,7 @@ static ssize_t read_iter_proxy(struct kiocb *iocb, struct iov_iter *to)
|
||||
bool first_read = iocb->ki_pos == 0;
|
||||
ssize_t ret = orig_read_iter(iocb, to);
|
||||
if (first_read) {
|
||||
pr_info("read_iter_proxy append %ld + %ld", ret,
|
||||
pr_info("read_iter_proxy append %ld + %ld\n", ret,
|
||||
read_count_append);
|
||||
ret += read_count_append;
|
||||
}
|
||||
@@ -287,7 +344,7 @@ int ksu_handle_vfs_read(struct file **file_ptr, char __user **buf_ptr,
|
||||
current->comm, count, rc_count);
|
||||
|
||||
if (count < rc_count) {
|
||||
pr_err("count: %d < rc_count: %d", count, rc_count);
|
||||
pr_err("count: %d < rc_count: %d\n", count, rc_count);
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -457,6 +514,7 @@ static void stop_vfs_read_hook()
|
||||
pr_info("unregister vfs_read kprobe: %d!\n", ret);
|
||||
#else
|
||||
ksu_vfs_read_hook = false;
|
||||
pr_info("stop vfs_read_hook\n");
|
||||
#endif
|
||||
}
|
||||
|
||||
@@ -467,6 +525,7 @@ static void stop_execve_hook()
|
||||
pr_info("unregister execve kprobe: %d!\n", ret);
|
||||
#else
|
||||
ksu_execveat_hook = false;
|
||||
pr_info("stop execve_hook\n");
|
||||
#endif
|
||||
}
|
||||
|
||||
@@ -482,6 +541,7 @@ static void stop_input_hook()
|
||||
pr_info("unregister input kprobe: %d!\n", ret);
|
||||
#else
|
||||
ksu_input_hook = false;
|
||||
pr_info("stop input_hook\n");
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
@@ -52,7 +52,7 @@ bool become_manager(char *pkg)
|
||||
continue;
|
||||
}
|
||||
// we have found the apk!
|
||||
pr_info("found apk: %s", cwd);
|
||||
pr_info("found apk: %s\n", cwd);
|
||||
char *pkg_index = strstr(cwd, pkg);
|
||||
if (!pkg_index) {
|
||||
pr_info("apk path not match package name!\n");
|
||||
@@ -70,7 +70,7 @@ bool become_manager(char *pkg)
|
||||
pr_info("invalid pkg: %s\n", pkg);
|
||||
continue;
|
||||
}
|
||||
if (is_manager_apk(cwd) == 0) {
|
||||
if (is_manager_apk(cwd)) {
|
||||
// check passed
|
||||
uid_t uid = current_uid().val;
|
||||
pr_info("manager uid: %d\n", uid);
|
||||
@@ -80,7 +80,7 @@ bool become_manager(char *pkg)
|
||||
result = true;
|
||||
goto clean;
|
||||
} else {
|
||||
pr_info("manager signature invalid!");
|
||||
pr_info("manager signature invalid!\n");
|
||||
}
|
||||
|
||||
break;
|
||||
|
||||
@@ -39,7 +39,7 @@ static struct policydb *get_policydb(void)
|
||||
void apply_kernelsu_rules()
|
||||
{
|
||||
if (!getenforce()) {
|
||||
pr_info("SELinux permissive or disabled, apply rules!");
|
||||
pr_info("SELinux permissive or disabled, apply rules!\n");
|
||||
}
|
||||
|
||||
rcu_read_lock();
|
||||
@@ -84,6 +84,8 @@ void apply_kernelsu_rules()
|
||||
// our ksud triggered by init
|
||||
ksu_allow(db, "init", "adb_data_file", "file", ALL);
|
||||
ksu_allow(db, "init", KERNEL_SU_DOMAIN, ALL, ALL);
|
||||
// we need to umount modules in zygote
|
||||
ksu_allow(db, "zygote", "adb_data_file", "dir", "search");
|
||||
|
||||
// copied from Magisk rules
|
||||
// suRights
|
||||
@@ -249,7 +251,7 @@ int handle_sepolicy(unsigned long arg3, void __user *arg4)
|
||||
} else if (subcmd == 4) {
|
||||
success = ksu_dontaudit(db, s, t, c, p);
|
||||
} else {
|
||||
pr_err("sepol: unknown subcmd: %d", subcmd);
|
||||
pr_err("sepol: unknown subcmd: %d\n", subcmd);
|
||||
}
|
||||
ret = success ? 0 : -1;
|
||||
|
||||
@@ -294,7 +296,7 @@ int handle_sepolicy(unsigned long arg3, void __user *arg4)
|
||||
} else if (subcmd == 3) {
|
||||
success = ksu_dontauditxperm(db, s, t, c, perm_set);
|
||||
} else {
|
||||
pr_err("sepol: unknown subcmd: %d", subcmd);
|
||||
pr_err("sepol: unknown subcmd: %d\n", subcmd);
|
||||
}
|
||||
ret = success ? 0 : -1;
|
||||
} else if (cmd == CMD_TYPE_STATE) {
|
||||
@@ -311,7 +313,7 @@ int handle_sepolicy(unsigned long arg3, void __user *arg4)
|
||||
} else if (subcmd == 2) {
|
||||
success = ksu_enforce(db, src);
|
||||
} else {
|
||||
pr_err("sepol: unknown subcmd: %d", subcmd);
|
||||
pr_err("sepol: unknown subcmd: %d\n", subcmd);
|
||||
}
|
||||
if (success)
|
||||
ret = 0;
|
||||
@@ -426,7 +428,7 @@ int handle_sepolicy(unsigned long arg3, void __user *arg4)
|
||||
success = ksu_type_member(db, src, tgt, cls,
|
||||
default_type);
|
||||
} else {
|
||||
pr_err("sepol: unknown subcmd: %d", subcmd);
|
||||
pr_err("sepol: unknown subcmd: %d\n", subcmd);
|
||||
}
|
||||
if (success)
|
||||
ret = 0;
|
||||
|
||||
@@ -44,7 +44,7 @@ static int transive_to_domain(const char *domain)
|
||||
void setup_selinux(const char *domain)
|
||||
{
|
||||
if (transive_to_domain(domain)) {
|
||||
pr_err("transive domain failed.");
|
||||
pr_err("transive domain failed.\n");
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
@@ -592,14 +592,14 @@ static bool add_filename_trans(struct policydb *db, const char *s,
|
||||
trans = (struct filename_trans_datum *)kcalloc(sizeof(*trans),
|
||||
1, GFP_ATOMIC);
|
||||
if (!trans) {
|
||||
pr_err("add_filename_trans: Failed to alloc datum");
|
||||
pr_err("add_filename_trans: Failed to alloc datum\n");
|
||||
return false;
|
||||
}
|
||||
struct filename_trans *new_key =
|
||||
(struct filename_trans *)kmalloc(sizeof(*new_key),
|
||||
GFP_ATOMIC);
|
||||
if (!new_key) {
|
||||
pr_err("add_filename_trans: Failed to alloc new_key");
|
||||
pr_err("add_filename_trans: Failed to alloc new_key\n");
|
||||
return false;
|
||||
}
|
||||
*new_key = key;
|
||||
|
||||
@@ -26,21 +26,14 @@ import androidx.compose.ui.unit.dp
|
||||
import androidx.compose.ui.viewinterop.AndroidView
|
||||
import androidx.compose.ui.window.Dialog
|
||||
import androidx.compose.ui.window.DialogProperties
|
||||
import com.maxkeppeker.sheets.core.CoreDialog
|
||||
import com.maxkeppeker.sheets.core.models.CoreSelection
|
||||
import com.maxkeppeker.sheets.core.models.base.Header
|
||||
import com.maxkeppeker.sheets.core.models.base.SelectionButton
|
||||
import com.maxkeppeker.sheets.core.models.base.rememberUseCaseState
|
||||
import io.noties.markwon.Markwon
|
||||
import io.noties.markwon.utils.NoCopySpannableFactory
|
||||
import kotlinx.coroutines.CancellableContinuation
|
||||
import kotlinx.coroutines.Dispatchers
|
||||
import kotlinx.coroutines.coroutineScope
|
||||
import kotlinx.coroutines.launch
|
||||
import kotlinx.coroutines.suspendCancellableCoroutine
|
||||
import kotlinx.coroutines.sync.Mutex
|
||||
import kotlinx.coroutines.sync.withLock
|
||||
import kotlinx.coroutines.withContext
|
||||
import me.weishu.kernelsu.ui.util.LocalDialogHost
|
||||
import kotlin.coroutines.resume
|
||||
|
||||
@@ -179,7 +172,11 @@ class DialogHostState {
|
||||
}
|
||||
|
||||
suspend fun showConfirm(
|
||||
title: String, content: String, markdown: Boolean = false, confirm: String? = null, dismiss: String? = null
|
||||
title: String,
|
||||
content: String,
|
||||
markdown: Boolean = false,
|
||||
confirm: String? = null,
|
||||
dismiss: String? = null
|
||||
): ConfirmResult = mutex.withLock {
|
||||
try {
|
||||
return@withLock suspendCancellableCoroutine { continuation ->
|
||||
@@ -262,37 +259,6 @@ fun ConfirmDialog(state: DialogHostState = LocalDialogHost.current) {
|
||||
|
||||
val visuals = confirmDialogData.visuals
|
||||
|
||||
if (visuals.isMarkdown) {
|
||||
CoreDialog(
|
||||
state = rememberUseCaseState(visible = true, onCloseRequest = {
|
||||
confirmDialogData.dismiss()
|
||||
}),
|
||||
header = Header.Default(
|
||||
title = visuals.title
|
||||
),
|
||||
selection = CoreSelection(
|
||||
withButtonView = true,
|
||||
negativeButton = SelectionButton(
|
||||
visuals.dismiss ?: stringResource(id = android.R.string.cancel),
|
||||
),
|
||||
positiveButton = SelectionButton(
|
||||
visuals.confirm ?: stringResource(id = android.R.string.ok),
|
||||
),
|
||||
onPositiveClick = {
|
||||
confirmDialogData.confirm()
|
||||
},
|
||||
onNegativeClick = {
|
||||
confirmDialogData.dismiss()
|
||||
},
|
||||
),
|
||||
onPositiveValid = true,
|
||||
body = {
|
||||
MarkdownContent(visuals.content)
|
||||
},
|
||||
)
|
||||
return
|
||||
}
|
||||
|
||||
AlertDialog(
|
||||
onDismissRequest = {
|
||||
confirmDialogData.dismiss()
|
||||
@@ -301,7 +267,11 @@ fun ConfirmDialog(state: DialogHostState = LocalDialogHost.current) {
|
||||
Text(text = visuals.title)
|
||||
},
|
||||
text = {
|
||||
Text(text = visuals.content)
|
||||
if (visuals.isMarkdown) {
|
||||
MarkdownContent(content = visuals.content)
|
||||
} else {
|
||||
Text(text = visuals.content)
|
||||
}
|
||||
},
|
||||
confirmButton = {
|
||||
TextButton(onClick = { confirmDialogData.confirm() }) {
|
||||
|
||||
@@ -163,10 +163,9 @@ private fun ModuleList(
|
||||
) {
|
||||
val changelog = dialogHost.withLoading {
|
||||
withContext(Dispatchers.IO) {
|
||||
val str = OkHttpClient().newCall(
|
||||
OkHttpClient().newCall(
|
||||
okhttp3.Request.Builder().url(changelogUrl).build()
|
||||
).execute().body!!.string()
|
||||
if (str.length > 1000) str.substring(0, 1000) else str
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
<string name="home_click_to_install">إضغط للتثبيت</string>
|
||||
<string name="home_working">يعمل</string>
|
||||
<string name="home_working_version">الإصدار: %d</string>
|
||||
<string name="home_superuser_count">مستخدمين الجذر: %d</string>
|
||||
<string name="home_superuser_count">المستخدمين الخارقين: %d</string>
|
||||
<string name="home_module_count">الوحدات: %d</string>
|
||||
<string name="home_unsupported">غير مدعوم</string>
|
||||
<string name="home_unsupported_reason">KernelSU يدعم GKI kernels فقط</string>
|
||||
@@ -13,7 +13,7 @@
|
||||
<string name="home_manager_version">إصدار المدير</string>
|
||||
<string name="home_fingerprint">البصمة</string>
|
||||
<string name="home_selinux_status">وضع SELinux</string>
|
||||
<string name="selinux_status_disabled">غير مفعل</string>
|
||||
<string name="selinux_status_disabled">معطل</string>
|
||||
<string name="selinux_status_enforcing">مفروض</string>
|
||||
<string name="selinux_status_permissive">متساهل</string>
|
||||
<string name="selinux_status_unknown">مجهول</string>
|
||||
|
||||
@@ -6,40 +6,40 @@
|
||||
<string name="home_working">Funktioniert</string>
|
||||
<string name="home_working_version">Version: %d</string>
|
||||
<string name="superuser">Superuser</string>
|
||||
<string name="home_click_to_install">Klicken Sie zum Installieren</string>
|
||||
<string name="home_superuser_count">Superusers: %d</string>
|
||||
<string name="home_click_to_install">Tippen zum Installieren</string>
|
||||
<string name="home_superuser_count">Superuser: %d</string>
|
||||
<string name="selinux_status_unknown">Unbekannt</string>
|
||||
<string name="selinux_status_enforcing">erzwingen</string>
|
||||
<string name="reboot_bootloader">Zum Bootloader-Modus neustarten</string>
|
||||
<string name="reboot_download">Zum Download-Modus neustarten</string>
|
||||
<string name="reboot_edl">Zum EDL-Modus neustarten</string>
|
||||
<string name="selinux_status_enforcing">Erzwingen</string>
|
||||
<string name="reboot_bootloader">Neustart mit Bootloader</string>
|
||||
<string name="reboot_download">Neustart mit Download-Modus</string>
|
||||
<string name="reboot_edl">Neustart mit EDL-Modus</string>
|
||||
<string name="module_author">Autor</string>
|
||||
<string name="module_overlay_fs_not_available">overlayfs ist nicht verfügbar, Modul kann nicht funktionieren!</string>
|
||||
<string name="module_overlay_fs_not_available">overlayfs nicht verfügbar, Modul kann nicht funktionieren!</string>
|
||||
<string name="about">Über</string>
|
||||
<string name="module_magisk_conflict">Module sind deaktiviert, weil es einen Konflikt mit Magisks gibt!</string>
|
||||
<string name="module_magisk_conflict">Module sind deaktiviert, weil es einen Konflikt mit Magisk gibt!</string>
|
||||
<string name="home_learn_kernelsu_url">https://kernelsu.org/guide/what-is-kernelsu.html</string>
|
||||
<string name="home_click_to_learn_kernelsu">Erfahren Sie, wie Sie KernelSU installieren und Module verwenden</string>
|
||||
<string name="home_click_to_learn_kernelsu">Verstehe, wie du KernelSU installieren und Module verwendest</string>
|
||||
<string name="home_support_title">Unterstütze uns</string>
|
||||
<string name="home_support_content">"KernelSU ist und bleibt kostenlos und Open Source. Sie können uns jedoch zeigen, dass Sie sich für uns interessieren, indem Sie eine Spende tätigen."</string>
|
||||
<string name="home_support_content">KernelSU ist und wird immer frei und quelloffen sein. Du kannst uns jedoch zeigen, dass du dich für uns interessierst, indem du eine Spende tätigst.</string>
|
||||
<string name="profile_selinux_context">SELinux-Kontext</string>
|
||||
<string name="settings_umount_modules_default">Demontiere Module als Standard</string>
|
||||
<string name="settings_umount_modules_default_summary">Der globale Standard-Wert für „Demontiere Module“ in App-Profilen. Falls aktiviert, werden alle Modul-Modifikationen zu dem System deaktiviert; für Applikationen, welche kein Profil gesetzt haben.</string>
|
||||
<string name="settings_umount_modules_default">Module standardmäßig aushängen</string>
|
||||
<string name="settings_umount_modules_default_summary">Globaler Standardwert für \'Module aushängen\' in App-Profilen. Wenn er aktiviert ist, werden alle Moduländerungen im App-System entfernt, für die kein Profil festgelegt ist.</string>
|
||||
<string name="profile_default">Standard</string>
|
||||
<string name="profile_template">Vorlage</string>
|
||||
<string name="profile_custom">Benutzerdefiniert</string>
|
||||
<string name="failed_to_update_app_profile">Aktualisierung des App-Profils fehlgeschlagen für %s</string>
|
||||
<string name="profile_namespace_inherited">Übernommen</string>
|
||||
<string name="failed_to_update_app_profile">App-Profilaktualisierung für %s fehlgeschlagen</string>
|
||||
<string name="profile_namespace_inherited">Vererbt</string>
|
||||
<string name="profile_namespace_global">Global</string>
|
||||
<string name="profile_namespace_individual">Individuell</string>
|
||||
<string name="profile_selinux_domain">Domain</string>
|
||||
<string name="module_update">Aktualisierung</string>
|
||||
<string name="profile_umount_modules_summary">Aktivierung dieser Option erlaubt KernelSU, alle modifizierten Dateien von den Modulen dieser Applikation wiederherstellen.</string>
|
||||
<string name="module_update">Aktualisieren</string>
|
||||
<string name="profile_umount_modules_summary">Wenn du diese Option aktivierst, kann KernelSU alle von den Modulen für diese App geänderten Dateien wiederherstellen.</string>
|
||||
<string name="profile_selinux_rules">Regeln</string>
|
||||
<string name="module_start_downloading">Starte herunterladen: %s</string>
|
||||
<string name="failed_to_update_sepolicy">Aktualisierung der SELinux-Regeln fehlgeschlagen für: %s</string>
|
||||
<string name="launch_app">Start</string>
|
||||
<string name="new_version_available">Neue Version: %s ist verfügbar, klicke zum herunterladen</string>
|
||||
<string name="force_stop_app">Erzwinge Stopp</string>
|
||||
<string name="module_start_downloading">Herunterladen starten: %s</string>
|
||||
<string name="failed_to_update_sepolicy">Fehler beim Aktualisieren der SELinux-Regeln für: %s</string>
|
||||
<string name="launch_app">Starten</string>
|
||||
<string name="new_version_available">Neue Version: %s verfügbar, tippen zum Aktualisieren</string>
|
||||
<string name="force_stop_app">Stopp erzwingen</string>
|
||||
<string name="restart_app">Neustart</string>
|
||||
<string name="home_module_count">Module: %d</string>
|
||||
<string name="home_manager_version">Verwalter-Version</string>
|
||||
@@ -53,30 +53,31 @@
|
||||
<string name="install">Installieren</string>
|
||||
<string name="reboot">Neustart</string>
|
||||
<string name="settings">Einstellungen</string>
|
||||
<string name="reboot_recovery">Neustart zur Recovery</string>
|
||||
<string name="reboot_recovery">Neustart mit Recovery</string>
|
||||
<string name="module_uninstall_success">%s deinstalliert</string>
|
||||
<string name="module_version">Version</string>
|
||||
<string name="refresh">Neu laden</string>
|
||||
<string name="show_system_apps">Zeige System-Apps</string>
|
||||
<string name="hide_system_apps">Verstecke System-Apps</string>
|
||||
<string name="send_log">Sende Verlauf</string>
|
||||
<string name="home_learn_kernelsu">Lerne KernelSU</string>
|
||||
<string name="show_system_apps">System-Apps anzeigen</string>
|
||||
<string name="hide_system_apps">System-Apps ausblenden</string>
|
||||
<string name="send_log">Protokoll senden</string>
|
||||
<string name="home_learn_kernelsu">KernelSU verstehen</string>
|
||||
<string name="safe_mode">Sicherer Modus</string>
|
||||
<string name="reboot_to_apply">Starte neu, damit die Effekte auftreten</string>
|
||||
<string name="about_source_code">Sehe den Quellcode bei %1$s<br/>Trete unserem %2$s Kanal bei</string>
|
||||
<string name="reboot_to_apply">Neu starten, damit die Effekte auftreten</string>
|
||||
<string name="about_source_code">Quellcode unter %1$s ansehen<br/>Unserem %2$s-Kanal beitreten</string>
|
||||
<string name="profile_name">Profilname</string>
|
||||
<string name="profile_namespace">Montiere Namensraum</string>
|
||||
<string name="profile_namespace">Namespace einhängen</string>
|
||||
<string name="profile_groups">Gruppen</string>
|
||||
<string name="profile_capabilities">Fähigkeiten</string>
|
||||
<string name="profile_umount_modules">Demontiere Module</string>
|
||||
<string name="module_downloading">Lädt Modul herunter: %s</string>
|
||||
<string name="profile_umount_modules">Module aushängen</string>
|
||||
<string name="module_downloading">Modul herunterladen: %s</string>
|
||||
<string name="home_unsupported">Nicht unterstützt</string>
|
||||
<string name="home_unsupported_reason">KernelSU unterstützt nun nur GKI kernels</string>
|
||||
<string name="home_unsupported_reason">KernelSU unterstützt derzeit nur GKI-Kernel</string>
|
||||
<string name="home_kernel">Kernel</string>
|
||||
<string name="home_fingerprint">Fingerabdruck</string>
|
||||
<string name="module_install">Installieren</string>
|
||||
<string name="reboot_userspace">Leichter Neustart</string>
|
||||
<string name="module_uninstall_confirm">Bist du dir sicher, dass du das Modul %s deinstallieren möchtest\?</string>
|
||||
<string name="module_uninstall_confirm">Sicher, dass du das Modul %s deinstallieren möchtest\?</string>
|
||||
<string name="module_uninstall_failed">Deinstallation fehlgeschlagen: %s</string>
|
||||
<string name="require_kernel_version">Die jetzige Kernel-Version %d ist zu alt für diese Manager-Version. Bitte upgrade auf Version %d oder höher!</string>
|
||||
<string name="require_kernel_version">Die aktuelle Kernel-Version %d ist zu alt für diese Manager-Version. Bitte auf Version %d oder höher upgraden!</string>
|
||||
<string name="module_changelog">Änderungsprotokoll</string>
|
||||
</resources>
|
||||
@@ -2,7 +2,7 @@
|
||||
<resources>
|
||||
<string name="home">Inicio</string>
|
||||
<string name="home_not_installed">No instalado</string>
|
||||
<string name="home_click_to_install">Instalar</string>
|
||||
<string name="home_click_to_install">Haga clic para instalar</string>
|
||||
<string name="home_working">Activo</string>
|
||||
<string name="home_working_version">Versión: %d</string>
|
||||
<string name="home_superuser_count">Superusuarios: %d</string>
|
||||
@@ -35,18 +35,18 @@
|
||||
<string name="reboot_edl">Reiniciar en modo EDL</string>
|
||||
<string name="about">Acerca de</string>
|
||||
<string name="module_uninstall_confirm">¿Estás seguro de que quieres desinstalar el módulo \"%s\"?</string>
|
||||
<string name="module_uninstall_success">\"%s\" desinstalado.</string>
|
||||
<string name="module_uninstall_failed">No se pudo desinstalar \"%s\".</string>
|
||||
<string name="module_uninstall_success">\"%s\" desinstalado</string>
|
||||
<string name="module_uninstall_failed">No se pudo desinstalar \"%s\"</string>
|
||||
<string name="module_version">Versión</string>
|
||||
<string name="module_author">Autor</string>
|
||||
<string name="module_overlay_fs_not_available">El módulo no puede funcionar ya que OverlayFS no está disponible</string>
|
||||
<string name="module_overlay_fs_not_available">El módulo no puede funcionar ya que OverlayFS no está disponible!</string>
|
||||
<string name="refresh">Recargar</string>
|
||||
<string name="show_system_apps">Mostrar apps del sistema</string>
|
||||
<string name="hide_system_apps">Ocultar apps del sistema</string>
|
||||
<string name="send_log">Enviar registro</string>
|
||||
<string name="safe_mode">Modo seguro</string>
|
||||
<string name="reboot_to_apply">Reiniciar para aplicar cambios</string>
|
||||
<string name="module_magisk_conflict">Se deshabilitaron los módulos ya que entran en conflicto con Magisk.</string>
|
||||
<string name="module_magisk_conflict">Se deshabilitaron los módulos ya que entran en conflicto con Magisk!</string>
|
||||
<string name="home_learn_kernelsu">Descubre KernelSU</string>
|
||||
<string name="home_learn_kernelsu_url">https://kernelsu.org/guide/what-is-kernelsu.html</string>
|
||||
<string name="home_click_to_learn_kernelsu">Descubre cómo instalar KernelSU y utilizar módulos</string>
|
||||
@@ -73,11 +73,12 @@
|
||||
<string name="profile_selinux_rules">Reglas</string>
|
||||
<string name="module_update">Actualizar</string>
|
||||
<string name="module_downloading">Descargando módulo: \"%s\"</string>
|
||||
<string name="module_start_downloading">Descargar</string>
|
||||
<string name="new_version_available">Hay una nueva versión disponible (%s). Toca para descargar</string>
|
||||
<string name="module_start_downloading">Iniciar descarga: %s</string>
|
||||
<string name="new_version_available">Nueva versión: %s está disponible, haga clic para actualizar</string>
|
||||
<string name="launch_app">Lanzar Aplicacion</string>
|
||||
<string name="force_stop_app">Forzar cierre de la aplicacion</string>
|
||||
<string name="restart_app">Reiniciar aplicacion</string>
|
||||
<string name="failed_to_update_sepolicy">Falló al actualizar reglas de SEpolicy por: %s</string>
|
||||
<string name="require_kernel_version">La versión actual de KernelSU %d es demasiado baja para que el gestor funcione correctamente. ¡Por favor actualiza a la versión %d o superior!</string>
|
||||
<string name="module_changelog">Registro de cambios</string>
|
||||
</resources>
|
||||
@@ -1,2 +1,83 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources></resources>
|
||||
<resources>
|
||||
<string name="reboot_to_apply">प्रभाव में होने के लिए रीबूट करें</string>
|
||||
<string name="home_click_to_learn_kernelsu">जानें कि KernelSU कैसे स्थापित करें और मॉड्यूल का उपयोग कैसे करें</string>
|
||||
<string name="selinux_status_unknown">अज्ञात</string>
|
||||
<string name="show_system_apps">सिस्टम एप्प दिखाए</string>
|
||||
<string name="module_uninstall_success">%s अनइंस्टॉल सफल हुआ</string>
|
||||
<string name="profile_umount_modules">मॉड्यूल्स अनमाउंट करें</string>
|
||||
<string name="send_log">लॉग भेजे</string>
|
||||
<string name="selinux_status_disabled">डिसेबल्ड (बंद)</string>
|
||||
<string name="home_support_title">हमें प्रोत्साहन दें</string>
|
||||
<string name="profile_namespace_inherited">Inherited</string>
|
||||
<string name="module_magisk_conflict">मॉड्यूल बंद कर दिए गए हैं क्योंकि यह मैजिक के साथ टकरा रहे है!</string>
|
||||
<string name="module_changelog">क्या बदलाव हुए है</string>
|
||||
<string name="selinux_status_permissive">पर्मिसिव</string>
|
||||
<string name="reboot_download">डाउनलोड में रिबूट करें</string>
|
||||
<string name="settings_umount_modules_default">डिफ़ॉल्ट रूप से मॉड्यूल अनमाउन्ट करें</string>
|
||||
<string name="profile_umount_modules_summary">इस विकल्प को चालू करने से KernelSU को इस एप्लिकेशन के लिए मॉड्यूल द्वारा किसी भी मोडिफाइड फ़ाइल को रिस्टोर करें।</string>
|
||||
<string name="profile_namespace_individual">Individual</string>
|
||||
<string name="module_failed_to_enable">%s मॉड्यूल चालू करने में विफल</string>
|
||||
<string name="force_stop_app">जबर्दस्ती बंद करें</string>
|
||||
<string name="reboot_edl">EDL मोड में रिबूट करें</string>
|
||||
<string name="restart_app">फिर से चालू करें</string>
|
||||
<string name="profile_capabilities">क्षमताएं</string>
|
||||
<string name="home_superuser_count">सुपरयूजर : %d</string>
|
||||
<string name="module_start_downloading">%s की डाउनलोडिंग स्टार्ट करें</string>
|
||||
<string name="profile_namespace_global">Global</string>
|
||||
<string name="settings_umount_modules_default_summary">ऐप प्रोफाइल में \"अनमाउंट मॉड्यूल\" के लिए ग्लोबल डिफ़ॉल्ट वैल्यू। यदि चालू किया गया है, तो यह एप्लीकेशंस के लिऐ सिस्टम के सभी मॉड्यूल मोडिफिकेशन को हटा देगा जिनकी प्रोफ़ाइल सेट नहीं है।</string>
|
||||
<string name="home_module_count">मॉड्यूल्स : %d</string>
|
||||
<string name="selinux_status_enforcing">एनफोर्सिंग</string>
|
||||
<string name="profile_selinux_context">SELinux context</string>
|
||||
<string name="home_fingerprint">फिंगरप्रिंट</string>
|
||||
<string name="profile_default">डिफॉल्ट</string>
|
||||
<string name="launch_app">लॉन्च करें</string>
|
||||
<string name="safe_mode">सेफ मोड</string>
|
||||
<string name="require_kernel_version">मैनेजर के ठीक से काम करने के लिए वर्तमान KernelSU वर्जन %d बहुत कम है। कृपया वर्जन %d या उच्चतर में अपग्रेड करें!</string>
|
||||
<string name="reboot_recovery">रिकवरी में रिबूट करें</string>
|
||||
<string name="reboot_userspace">सॉफ्ट रिबूट</string>
|
||||
<string name="profile_name">प्रोफाइल का नाम</string>
|
||||
<string name="home_support_content">KernelSU मुफ़्त और ओपन सोर्स और हमेशा रहेगा। हालाँकि आप दान देकर हमें दिखा सकते हैं कि आप संरक्षण करते हैं।</string>
|
||||
<string name="uninstall">अनइंस्टॉल करें</string>
|
||||
<string name="profile_namespace">Namspace माउंट करें</string>
|
||||
<string name="module_install">इंस्टाल करें</string>
|
||||
<string name="home_click_to_install">इंस्टाल करने के लिए क्लिक करें</string>
|
||||
<string name="profile_selinux_rules">नियम</string>
|
||||
<string name="profile_groups">समूह</string>
|
||||
<string name="module_overlay_fs_not_available">Overlayfs उपलब्ध नहीं है, मॉड्यूल काम नहीं कर सकता !</string>
|
||||
<string name="module">मॉड्यूल</string>
|
||||
<string name="module_author">निर्माता</string>
|
||||
<string name="about">हमारे बारे में</string>
|
||||
<string name="home_working_version">वर्जन: %d</string>
|
||||
<string name="reboot">रीबूट करें</string>
|
||||
<string name="home_unsupported_reason">KernelSU अभी केवल GKI कर्नल्स को सपोर्ट करता है</string>
|
||||
<string name="home_selinux_status">SELinux स्थिति</string>
|
||||
<string name="hide_system_apps">सिस्टम एप्प छिपाए</string>
|
||||
<string name="module_version">वर्जन</string>
|
||||
<string name="home_unsupported">सपोर्ट नहीं करता है</string>
|
||||
<string name="profile_selinux_domain">डोमेन</string>
|
||||
<string name="home">होम</string>
|
||||
<string name="profile_custom">कस्टम</string>
|
||||
<string name="profile_template">टेम्पलेट</string>
|
||||
<string name="refresh">रिफ्रेश</string>
|
||||
<string name="module_downloading">%s मॉड्यूल डाउनलोड हो रहा है</string>
|
||||
<string name="module_update">अपडेट</string>
|
||||
<string name="home_learn_kernelsu">KernelSU सीखें</string>
|
||||
<string name="module_uninstall_confirm">क्या आप सच में मॉड्यूल %s को अनइंस्टॉल करना चाहते हैं\?</string>
|
||||
<string name="module_uninstall_failed">%s अनइंस्टल करने में असफल</string>
|
||||
<string name="superuser">सुपरयूजर</string>
|
||||
<string name="settings">सेटिंग</string>
|
||||
<string name="home_working">काम कर रहा है</string>
|
||||
<string name="module_failed_to_disable">%s मॉड्यूल बंद करने में विफल</string>
|
||||
<string name="module_empty">कोई मॉड्यूल इंस्टाल नहीं हुआ</string>
|
||||
<string name="install">इंस्टाल करें</string>
|
||||
<string name="home_kernel">कर्नल</string>
|
||||
<string name="home_not_installed">इंस्टाल नहीं हुआ</string>
|
||||
<string name="failed_to_update_app_profile">%s के लिए ऐप प्रोफ़ाइल अपडेट करने में विफल</string>
|
||||
<string name="home_learn_kernelsu_url">https://kernelsu.org/guide/what-is-kernelsu.html</string>
|
||||
<string name="failed_to_update_sepolicy">%s के लिए SELinux नियमों को अपटेड करने में विफल</string>
|
||||
<string name="reboot_bootloader">बुटलोडर में रिबूट करें</string>
|
||||
<string name="about_source_code">%1$s पर स्रोत कोड देखें<br/>हमारे %2$s चैनल से जुड़ें</string>
|
||||
<string name="home_manager_version">मैनेजर वर्जन</string>
|
||||
<string name="new_version_available">नया वर्जन: %s उपलब्ध है,अपग्रेड के लिए क्लिक करें</string>
|
||||
</resources>
|
||||
@@ -54,7 +54,7 @@
|
||||
<string name="selinux_status_enforcing">Érvényesítés</string>
|
||||
<string name="selinux_status_permissive">Megengedő</string>
|
||||
<string name="selinux_status_unknown">Ismeretlen</string>
|
||||
<string name="superuser">Alkalmazások</string>
|
||||
<string name="superuser">Superuser</string>
|
||||
<string name="module_failed_to_enable">Nem sikerült engedélyezni a következő modult: %s</string>
|
||||
<string name="module_failed_to_disable">Nem sikerült letiltani a következő modulokat: %s</string>
|
||||
<string name="module_empty">Nincs modul telepítve</string>
|
||||
|
||||
83
manager/app/src/main/res/values-iw/strings.xml
Normal file
83
manager/app/src/main/res/values-iw/strings.xml
Normal file
@@ -0,0 +1,83 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
<string name="reboot_to_apply">הפעל מחדש כדי להכניס לתוקף</string>
|
||||
<string name="home_click_to_learn_kernelsu">למד כיצד להתקין את KernelSU ולהשתמש במודולים</string>
|
||||
<string name="selinux_status_unknown">לא ידוע</string>
|
||||
<string name="show_system_apps">הצג אפליקציות מערכת</string>
|
||||
<string name="module_uninstall_success">%s הוסר</string>
|
||||
<string name="profile_umount_modules">הסרת טעינת מודולים</string>
|
||||
<string name="send_log">שלח לוג</string>
|
||||
<string name="selinux_status_disabled">מושבת</string>
|
||||
<string name="home_support_title">תמכו בנו</string>
|
||||
<string name="profile_namespace_inherited">ירושה</string>
|
||||
<string name="module_magisk_conflict">מודולים מושבתים מכיוון שהם מתנגשים עם זה של Magisk!</string>
|
||||
<string name="module_changelog">יומן שינויים</string>
|
||||
<string name="selinux_status_permissive">התרים</string>
|
||||
<string name="reboot_download">הפעלה מחדש למצב הורדה</string>
|
||||
<string name="settings_umount_modules_default">טעינת מודולים כברירת מחדל</string>
|
||||
<string name="profile_umount_modules_summary">הפעלת אפשרות זו תאפשר ל-KernelSU לשחזר קבצים שהשתנו על ידי המודולים עבור יישום זה.</string>
|
||||
<string name="profile_namespace_individual">אישי</string>
|
||||
<string name="module_failed_to_enable">הפעלת המודל נכשלה: %s</string>
|
||||
<string name="force_stop_app">עצירה בכח</string>
|
||||
<string name="reboot_edl">הפעלה מחדש למצב EDL</string>
|
||||
<string name="restart_app">איתחול</string>
|
||||
<string name="profile_capabilities">יכולת</string>
|
||||
<string name="home_superuser_count">משתמשי על: %d</string>
|
||||
<string name="module_start_downloading">מפעיל מודל: %s</string>
|
||||
<string name="profile_namespace_global">גלובלי</string>
|
||||
<string name="settings_umount_modules_default_summary">ערך ברירת המחדל הגלובלי עבור \"טעינת מודולים\" בפרופילי אפליקציה. אם מופעל, זה יסיר את כל שינויי המודול למערכת עבור יישומים שאין להם ערכת פרופיל.</string>
|
||||
<string name="home_module_count">מודלים:%d</string>
|
||||
<string name="selinux_status_enforcing">אכיפה</string>
|
||||
<string name="profile_selinux_context">הקשר SELinux</string>
|
||||
<string name="home_fingerprint">טביעת אצבע</string>
|
||||
<string name="profile_default">ברירת מחדל</string>
|
||||
<string name="launch_app">להשיק</string>
|
||||
<string name="safe_mode">מצב בטוח</string>
|
||||
<string name="require_kernel_version">גרסת KernelSU הנוכחית %d נמוכה מדי כדי שהמנהל יפעל כראוי. אנא שדרג לגרסה %d ומעלה!</string>
|
||||
<string name="reboot_recovery">הפעלה מחדש לריקברי</string>
|
||||
<string name="reboot_userspace">רך Reboot</string>
|
||||
<string name="profile_name">שם פרופיל</string>
|
||||
<string name="home_support_content">KernelSU הוא, ותמיד יהיה, חינמי וקוד פתוח. עם זאת, תוכל להראות לנו שאכפת לך על ידי תרומה.</string>
|
||||
<string name="uninstall">הסרה</string>
|
||||
<string name="profile_namespace">טעינת מרחב שמות</string>
|
||||
<string name="module_install">התקנה</string>
|
||||
<string name="home_click_to_install">לחץ להתקנה</string>
|
||||
<string name="profile_selinux_rules">כללים</string>
|
||||
<string name="profile_groups">קבוצה</string>
|
||||
<string name="module_overlay_fs_not_available">שכבות-על לא זמינות, המודול לא יכול לעבוד!</string>
|
||||
<string name="module">מודולים</string>
|
||||
<string name="module_author">יוצר</string>
|
||||
<string name="about">אודות</string>
|
||||
<string name="home_working_version">גרסה: %d</string>
|
||||
<string name="reboot">הפעלה מחדש</string>
|
||||
<string name="home_unsupported_reason">KernelSU תומך רק בליבת GKI כעת</string>
|
||||
<string name="home_selinux_status">סטטוס SELinux</string>
|
||||
<string name="hide_system_apps">הסתר אפליקציות מערכת</string>
|
||||
<string name="module_version">גרסה</string>
|
||||
<string name="home_unsupported">אינו נתמך</string>
|
||||
<string name="profile_selinux_domain">תחום</string>
|
||||
<string name="home">בית</string>
|
||||
<string name="profile_custom">מותאם אישית</string>
|
||||
<string name="profile_template">תבנית</string>
|
||||
<string name="refresh">רענון</string>
|
||||
<string name="module_downloading">מוריד מודל: %s</string>
|
||||
<string name="module_update">עדכון</string>
|
||||
<string name="home_learn_kernelsu">למד אודות KernelSU</string>
|
||||
<string name="module_uninstall_confirm">האם אתה בטוח שברצונך להסיר את התקנת המודל %s\?</string>
|
||||
<string name="module_uninstall_failed">הסרת התקנת %s נכשלה:</string>
|
||||
<string name="superuser">משתמש על</string>
|
||||
<string name="settings">הגדרות</string>
|
||||
<string name="home_working">עובד</string>
|
||||
<string name="module_failed_to_disable">השבתת מודל %s נכשלה:</string>
|
||||
<string name="module_empty">אין מודלים מותקנים</string>
|
||||
<string name="install">להתקין</string>
|
||||
<string name="home_kernel">Kernel</string>
|
||||
<string name="home_not_installed">לא מותקן</string>
|
||||
<string name="failed_to_update_app_profile">נכשל עדכון פרופיל האפליקציה עבור %s</string>
|
||||
<string name="home_learn_kernelsu_url">https://kernelsu.org/guide/what-is-kernelsu.html</string>
|
||||
<string name="failed_to_update_sepolicy">נכשל עדכון כללי SELinux עבור: %s</string>
|
||||
<string name="reboot_bootloader">הפעלה מחדש לבוטלאודר</string>
|
||||
<string name="about_source_code">ראה את קוד המקור ב%1$s<br/>הצטרף אלינו %2$s בערוץ</string>
|
||||
<string name="home_manager_version">גרסת מנהל</string>
|
||||
<string name="new_version_available">גרסה חדשה עבור: %s זמינה, לחץ כדי לשדרג</string>
|
||||
</resources>
|
||||
69
manager/app/src/main/res/values-kn/strings.xml
Normal file
69
manager/app/src/main/res/values-kn/strings.xml
Normal file
@@ -0,0 +1,69 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
<string name="reboot_to_apply">ಪರಿಣಾಮ ಬೀರಲು ರೀಬೂಟ್ ಮಾಡಿ</string>
|
||||
<string name="home_click_to_learn_kernelsu">KernelSU ಅನ್ನು ಹೇಗೆ ಸ್ಥಾಪಿಸಬೇಕು ಮತ್ತು ಮಾಡ್ಯೂಲ್ಗಳನ್ನು ಬಳಸುವುದು ಹೇಗೆ ಎಂದು ತಿಳಿಯಿರಿ</string>
|
||||
<string name="selinux_status_unknown">ತಿಳಿಯದ</string>
|
||||
<string name="show_system_apps">ಸಿಸ್ಟಮ್ ಅಪ್ಲಿಕೇಶನ್ಗಳನ್ನು ತೋರಿಸಿ</string>
|
||||
<string name="module_uninstall_success">%s ಅನ್ಇನ್ಸ್ಟಾಲ್ ಮಾಡಲಾಗಿದೆ</string>
|
||||
<string name="profile_umount_modules">Umount ಮಾಡ್ಯೂಲ್ಗಳು</string>
|
||||
<string name="send_log">ಲಾಗ್ ಕಳುಹಿಸಿ</string>
|
||||
<string name="home_support_title">ನಮ್ಮನ್ನು ಬೆಂಬಲಿಸಿ</string>
|
||||
<string name="profile_namespace_inherited">ಪಿತ್ರಾರ್ಜಿತ</string>
|
||||
<string name="module_magisk_conflict">ಮಾಡ್ಯೂಲ್ಗಳನ್ನು ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಲಾಗಿದೆ ಏಕೆಂದರೆ ಇದು ಮ್ಯಾಜಿಸ್ಕ್ನೊಂದಿಗೆ ಸಂಘರ್ಷವಾಗಿದೆ!</string>
|
||||
<string name="module_changelog">ಚೇಂಜ್ಲಾಗ್</string>
|
||||
<string name="selinux_status_permissive">Permissive</string>
|
||||
<string name="settings_umount_modules_default">ಡೀಫಾಲ್ಟ್ ಆಗಿ Umount ಮಾಡ್ಯೂಲ್</string>
|
||||
<string name="profile_umount_modules_summary">ಈ ಆಯ್ಕೆಯನ್ನು ಸಕ್ರಿಯಗೊಳಿಸುವುದರಿಂದ ಈ ಅಪ್ಲಿಕೇಶನ್ಗಾಗಿ ಮಾಡ್ಯೂಲ್ಗಳ ಮೂಲಕ ಯಾವುದೇ ಮಾರ್ಪಡಿಸಿದ ಫೈಲ್ಗಳನ್ನು ಮರುಸ್ಥಾಪಿಸಲು KernelSU ಗೆ ಅನುಮತಿಸುತ್ತದೆ.</string>
|
||||
<string name="profile_namespace_individual">ವೈಯಕ್ತಿಕ</string>
|
||||
<string name="module_failed_to_enable">ಮಾಡ್ಯೂಲ್ ಅನ್ನು ಸಕ್ರಿಯಗೊಳಿಸಲು ವಿಫಲವಾಗಿದೆ: %s</string>
|
||||
<string name="force_stop_app">ಫೋರ್ಸ್ ಸ್ಟಾಪ್</string>
|
||||
<string name="reboot_edl">EDL ಗೆ ರೀಬೂಟ್</string>
|
||||
<string name="profile_capabilities">ಸಾಮರ್ಥ್ಯಗಳು</string>
|
||||
<string name="home_superuser_count">ಸೂಪರ್ಯೂಸರ್ಗಳು: %d</string>
|
||||
<string name="module_start_downloading">ಡೌನ್ಲೋಡ್ ಮಾಡುವುದನ್ನು ಪ್ರಾರಂಭಿಸಿ: %s</string>
|
||||
<string name="profile_namespace_global">ಜಾಗತಿಕ</string>
|
||||
<string name="settings_umount_modules_default_summary">ಅಪ್ಲಿಕೇಶನ್ ಪ್ರೊಫೈಲ್ಗಳಲ್ಲಿ \"Umount ಮಾಡ್ಯೂಲ್\" ಗಾಗಿ ಜಾಗತಿಕ ಡೀಫಾಲ್ಟ್ ಮೌಲ್ಯ. ಸಕ್ರಿಯಗೊಳಿಸಿದರೆ, ಪ್ರೊಫೈಲ್ ಸೆಟ್ ಅನ್ನು ಹೊಂದಿರದ ಅಪ್ಲಿಕೇಶನ್ಗಳಿಗಾಗಿ ಸಿಸ್ಟಮ್ಗೆ ಎಲ್ಲಾ ಮಾಡ್ಯೂಲ್ ಮಾರ್ಪಾಡುಗಳನ್ನು ಇದು ತೆಗೆದುಹಾಕುತ್ತದೆ.</string>
|
||||
<string name="home_module_count">ಮಾಡ್ಯೂಲ್ಗಳು: %d</string>
|
||||
<string name="profile_selinux_context">SELinux ಸಂದರ್ಭ</string>
|
||||
<string name="profile_default">ಡೀಫಾಲ್ಟ್</string>
|
||||
<string name="launch_app">ಲಾಂಚ್</string>
|
||||
<string name="safe_mode">ಸುರಕ್ಷಿತ ಮೋಡ್</string>
|
||||
<string name="require_kernel_version">ಪ್ರಸ್ತುತ KernelSU ಆವೃತ್ತಿ %d ಮ್ಯಾನೇಜರ್ ಸರಿಯಾಗಿ ಕಾರ್ಯನಿರ್ವಹಿಸಲು ತುಂಬಾ ಕಡಿಮೆಯಾಗಿದೆ. ದಯವಿಟ್ಟು ಆವೃತ್ತಿ %d ಅಥವಾ ಹೆಚ್ಚಿನದಕ್ಕೆ ಅಪ್ಗ್ರೇಡ್ ಮಾಡಿ!</string>
|
||||
<string name="reboot_userspace">ಸಾಫ್ಟ್ ರೀಬೂಟ್</string>
|
||||
<string name="profile_name">ಪ್ರೊಫೈಲ್ ಹೆಸರು</string>
|
||||
<string name="home_support_content">KernelSU ಉಚಿತ ಮತ್ತು ಮುಕ್ತ ಮೂಲವಾಗಿದೆ ಮತ್ತು ಯಾವಾಗಲೂ ಇರುತ್ತದೆ. ಆದಾಗ್ಯೂ ನೀವು ದೇಣಿಗೆ ನೀಡುವ ಮೂಲಕ ನೀವು ಕಾಳಜಿ ವಹಿಸುತ್ತೀರಿ ಎಂದು ನಮಗೆ ತೋರಿಸಬಹುದು.</string>
|
||||
<string name="uninstall">ಅನ್ಇನ್ಸ್ಟಾಲ್</string>
|
||||
<string name="profile_namespace">ಮೌಂಟ್ ನೇಮ್ಸ್ಪೇಸ್</string>
|
||||
<string name="profile_selinux_rules">ನಿಯಮಗಳು</string>
|
||||
<string name="profile_groups">ಗುಂಪುಗಳು</string>
|
||||
<string name="module_overlay_fs_not_available">ಓವರ್ಲೇಫ್ಗಳು ಲಭ್ಯವಿಲ್ಲ, ಮಾಡ್ಯೂಲ್ ಕಾರ್ಯನಿರ್ವಹಿಸುವುದಿಲ್ಲ!</string>
|
||||
<string name="module">ಮಾಡ್ಯೂಲ್</string>
|
||||
<string name="module_author">ಲೇಖಕ</string>
|
||||
<string name="about">ಬಗ್ಗೆ</string>
|
||||
<string name="home_working_version">ವರ್ಷನ್: %d</string>
|
||||
<string name="reboot">ರೀಬೂಟ್</string>
|
||||
<string name="home_unsupported_reason">KernelSU ಈಗ GKI ಕರ್ನಲ್ಗಳನ್ನು ಮಾತ್ರ ಬೆಂಬಲಿಸುತ್ತದೆ</string>
|
||||
<string name="home_selinux_status">SELinux ಸ್ಥಿತಿ</string>
|
||||
<string name="hide_system_apps">ಸಿಸ್ಟಮ್ ಅಪ್ಲಿಕೇಶನ್ಗಳನ್ನು ಮರೆಮಾಡಿ</string>
|
||||
<string name="module_version">ವರ್ಷನ್</string>
|
||||
<string name="home_unsupported">ಬೆಂಬಲಿತವಾಗಿಲ್ಲ</string>
|
||||
<string name="profile_selinux_domain">ಡೊಮೇನ್</string>
|
||||
<string name="home">ಮನೆ</string>
|
||||
<string name="profile_custom">ಕಸ್ಟಮ್</string>
|
||||
<string name="profile_template">ಟೆಂಪ್ಲೇಟ್</string>
|
||||
<string name="refresh">ರಿಫ್ರೆಶ್</string>
|
||||
<string name="module_downloading">ಮಾಡ್ಯೂಲ್ ಅನ್ನು ಡೌನ್ಲೋಡ್ ಮಾಡಲಾಗುತ್ತಿದೆ: %s</string>
|
||||
<string name="home_learn_kernelsu">KernelSU ಕಲಿಯಿರಿ</string>
|
||||
<string name="module_uninstall_confirm">%s ಮಾಡ್ಯೂಲ್ ಅನ್ನು ಅಸ್ಥಾಪಿಸಲು ನೀವು ಖಚಿತವಾಗಿ ಬಯಸುವಿರಾ\?</string>
|
||||
<string name="module_uninstall_failed">ಅನ್ಇನ್ಸ್ಟಾಲ್ ಮಾಡಲು ವಿಫಲವಾಗಿದೆ: %s</string>
|
||||
<string name="superuser">ಸೂಪರ್ಯೂಸರ್</string>
|
||||
<string name="home_working">ಕೆಲಸ ಮಾಡುತ್ತಿದೆ</string>
|
||||
<string name="module_failed_to_disable">ಮಾಡ್ಯೂಲ್ ಅನ್ನು ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಲು ವಿಫಲವಾಗಿದೆ: %s</string>
|
||||
<string name="module_empty">ಮಾಡ್ಯೂಲ್ ಅನ್ನು ಸ್ಥಾಪಿಸಲಾಗಿಲ್ಲ</string>
|
||||
<string name="home_kernel">ಕರ್ನಲ್</string>
|
||||
<string name="failed_to_update_app_profile">%s ಗಾಗಿ ಅಪ್ಲಿಕೇಶನ್ ಪ್ರೊಫೈಲ್ ಅನ್ನು ನವೀಕರಿಸಲು ವಿಫಲವಾಗಿದೆ</string>
|
||||
<string name="home_learn_kernelsu_url">https://kernelsu.org/guide/what-is-kernelsu.html</string>
|
||||
<string name="about_source_code">%1$s ನಲ್ಲಿ ಮೂಲ ಕೋಡ್ ಅನ್ನು ವೀಕ್ಷಿಸಿ<br/>ನಮ್ಮ %2$s ಚಾನಲ್ಗೆ ಸೇರಿ</string>
|
||||
<string name="home_manager_version">ಮ್ಯಾನೇಜರ್ ವರ್ಷನ್</string>
|
||||
<string name="new_version_available">ಹೊಸ ಆವೃತ್ತಿ: %s ಲಭ್ಯವಿದೆ, ಅಪ್ಗ್ರೇಡ್ ಮಾಡಲು ಕ್ಲಿಕ್ ಮಾಡಿ</string>
|
||||
</resources>
|
||||
@@ -2,12 +2,12 @@
|
||||
<resources>
|
||||
<string name="home_fingerprint">Pirštų atspaudas</string>
|
||||
<string name="selinux_status_disabled">Išjungta</string>
|
||||
<string name="selinux_status_enforcing">Enforcing</string>
|
||||
<string name="selinux_status_enforcing">Priverstinas</string>
|
||||
<string name="selinux_status_unknown">Nežinomas</string>
|
||||
<string name="superuser">Supernaudotojai</string>
|
||||
<string name="module_failed_to_enable">Nepavyko įjungti modulio: %s</string>
|
||||
<string name="module_failed_to_disable">Nepavyko išjungti modulio: %s</string>
|
||||
<string name="selinux_status_permissive">Permissive</string>
|
||||
<string name="selinux_status_permissive">Leistinas</string>
|
||||
<string name="module_empty">Nėra įdiegtų modulių</string>
|
||||
<string name="module">Moduliai</string>
|
||||
<string name="reboot_userspace">Perkrovimas neišjungus</string>
|
||||
@@ -51,7 +51,7 @@
|
||||
<string name="module_update">Atnaujinti</string>
|
||||
<string name="module_downloading">Atsisiunčiamas modulis: %s</string>
|
||||
<string name="module_start_downloading">Pradedamas atsisiuntimas: %s</string>
|
||||
<string name="new_version_available">Nauja versija: %s pasiekiama, spustelėkite norėdami atsisiųsti</string>
|
||||
<string name="new_version_available">Nauja versija: %s pasiekiama, spustelėkite norėdami atsinaujinti</string>
|
||||
<string name="launch_app">Paleisti</string>
|
||||
<string name="force_stop_app">Priversti sustoti</string>
|
||||
<string name="restart_app">Perkrauti</string>
|
||||
@@ -78,4 +78,6 @@
|
||||
<string name="home_support_content">KernelSU yra ir visada bus nemokamas ir atvirojo kodo. Tačiau galite parodyti, kad jums rūpi, paaukodami mums.</string>
|
||||
<string name="failed_to_update_app_profile">Nepavyko atnaujinti programos profilio %s</string>
|
||||
<string name="settings_umount_modules_default_summary">Visuotinė numatytoji „Modulių atjungimo“ reikšmė programų profiliuose. Jei įjungta, ji pašalins visus sistemos modulio pakeitimus programoms, kurios neturi profilio.</string>
|
||||
<string name="module_changelog">Keitimų žurnalas</string>
|
||||
<string name="require_kernel_version">Ši KernelSU versija %d yra per žema, kad šis vadybininkas galėtų tinkamai funkcionuoti. Prašome atsinaujinti į versiją %d ar aukščiau!</string>
|
||||
</resources>
|
||||
@@ -1,7 +1,7 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
<string name="app_name" translatable="false">KernelSU</string>
|
||||
<string name="home">Menu</string>
|
||||
<string name="home">Strona główna</string>
|
||||
<string name="home_not_installed">Nie zainstalowano</string>
|
||||
<string name="home_click_to_install">Kliknij, aby zainstalować</string>
|
||||
<string name="home_working">Działa</string>
|
||||
@@ -22,7 +22,7 @@
|
||||
<string name="module_failed_to_enable">Nie udało się włączyć modułu: %s</string>
|
||||
<string name="module_failed_to_disable">Nie udało się wyłączyć modułu: %s</string>
|
||||
<string name="module_empty">Brak zainstalowanych modułów</string>
|
||||
<string name="module">Moduł</string>
|
||||
<string name="module">Moduły</string>
|
||||
<string name="uninstall">Odinstaluj</string>
|
||||
<string name="module_install">Instaluj</string>
|
||||
<string name="install">Instaluj</string>
|
||||
@@ -49,7 +49,7 @@
|
||||
<string name="module_magisk_conflict">Moduły są wyłączone, ponieważ są w konflikcie z modułami Magiska!</string>
|
||||
<string name="home_learn_kernelsu">Poznaj KernelSU</string>
|
||||
<string name="home_learn_kernelsu_url">https://kernelsu.org/guide/what-is-kernelsu.html</string>
|
||||
<string name="home_click_to_learn_kernelsu">Dowiedz się jak zainstalować KernelSU i jak korzystać z modułów</string>
|
||||
<string name="home_click_to_learn_kernelsu">Dowiedz się jak zainstalować KernelSU i jak korzystać z modułów.</string>
|
||||
<string name="home_support_title">Wesprzyj nas</string>
|
||||
<string name="home_support_content">KernelSU jest i zawsze będzie darmowy oraz otwarty. Niemniej jednak możesz nam pokazać, że Ci zależy, wysyłając darowiznę.</string>
|
||||
<string name="about_source_code"><![CDATA[Przejrzyj kod źródłowy na %1$s<br/>Dołącz do kanału %2$s]]></string>
|
||||
|
||||
@@ -7,7 +7,7 @@
|
||||
<string name="home_working_version">Versão: %d</string>
|
||||
<string name="home_superuser_count">Superusuários: %d</string>
|
||||
<string name="home_module_count">Módulos: %d</string>
|
||||
<string name="home_unsupported">Sem Suporte</string>
|
||||
<string name="home_unsupported">Sem suporte</string>
|
||||
<string name="home_unsupported_reason">KernelSU suporta apenas kernels GKI agora</string>
|
||||
<string name="home_kernel">Kernel</string>
|
||||
<string name="home_manager_version">Versão do gerenciador</string>
|
||||
@@ -27,7 +27,7 @@
|
||||
<string name="install">Instalar</string>
|
||||
<string name="reboot">Reiniciar</string>
|
||||
<string name="settings">Configurações</string>
|
||||
<string name="reboot_userspace">Reinicialização Suave</string>
|
||||
<string name="reboot_userspace">Reinicialização suave</string>
|
||||
<string name="reboot_recovery">Reiniciar em modo Recovery</string>
|
||||
<string name="reboot_bootloader">Reiniciar em modo Bootloader</string>
|
||||
<string name="reboot_download">Reiniciar em modo Download</string>
|
||||
@@ -50,7 +50,7 @@
|
||||
<string name="home_learn_kernelsu_url">https://kernelsu.org/guide/what-is-kernelsu.html</string>
|
||||
<string name="home_click_to_learn_kernelsu">Aprenda a instalar o KernelSU e usar os módulos</string>
|
||||
<string name="home_support_title">Apoie-nos</string>
|
||||
<string name="home_support_content">O KernelSU é, e sempre será, gratuito e de código aberto. No entanto, você pode mostrar seu apoio fazendo uma doação.</string>
|
||||
<string name="home_support_content">KernelSU sempre foi e sempre será, gratuito e de código aberto. No entanto, você pode agradecer enviando uma pequena doação.</string>
|
||||
<string name="about_source_code"><![CDATA[Veja o código-fonte no %1$s<br/>Junte-se ao nosso canal do %2$s]]></string>
|
||||
<string name="profile" translatable="false">Perfil do Aplicativo</string>
|
||||
<string name="profile_default">Padrão</string>
|
||||
@@ -74,10 +74,11 @@
|
||||
<string name="module_update">Atualizar</string>
|
||||
<string name="module_downloading">Baixando módulo: %s</string>
|
||||
<string name="module_start_downloading">Iniciar o download: %s</string>
|
||||
<string name="new_version_available">Nova versão: %s está disponível, clique para baixar</string>
|
||||
<string name="new_version_available">Nova versão: %s está disponível, clique para atualizar</string>
|
||||
<string name="launch_app">Iniciar</string>
|
||||
<string name="force_stop_app">Forçar parada</string>
|
||||
<string name="restart_app">Reiniciar</string>
|
||||
<string name="failed_to_update_sepolicy">Falha ao atualizar as regras do SELinux para: %s</string>
|
||||
<string name="require_kernel_version">A versão atual do KernelSU %d é muito baixa para o gerenciador funcionar corretamente. Por favor, atualize para a versão %d ou superior!</string>
|
||||
<string name="module_changelog">Registro de alterações</string>
|
||||
</resources>
|
||||
@@ -83,4 +83,5 @@
|
||||
<string name="launch_app">Запустить</string>
|
||||
<string name="restart_app">Перезапустить</string>
|
||||
<string name="require_kernel_version">Текущая версия KernelSU %d слишком низкая для правильной работы менеджера. Пожалуйста, обновите до версии %d или выше!</string>
|
||||
<string name="module_changelog">Список изменений</string>
|
||||
</resources>
|
||||
@@ -1,2 +1,8 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources></resources>
|
||||
<resources>
|
||||
<string name="home_superuser_count">Superkorisnici</string>
|
||||
<string name="home_module_count">Moduli: %d</string>
|
||||
<string name="home_click_to_install">Kliknite da instalirate</string>
|
||||
<string name="home">дом</string>
|
||||
<string name="home_not_installed">Nije instalirano</string>
|
||||
</resources>
|
||||
15
manager/app/src/main/res/values-te/strings.xml
Normal file
15
manager/app/src/main/res/values-te/strings.xml
Normal file
@@ -0,0 +1,15 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
<string name="selinux_status_unknown">తెలియదు</string>
|
||||
<string name="module_failed_to_enable">మాడ్యూల్ని ప్రారంభించడంలో విఫలమైంది: %s</string>
|
||||
<string name="force_stop_app">బలవంతంగా ఆపడం</string>
|
||||
<string name="restart_app">పునఃప్రారంభించండి</string>
|
||||
<string name="module">మాడ్యూల్</string>
|
||||
<string name="about">గురించి</string>
|
||||
<string name="home_selinux_status">SELinux స్థితి</string>
|
||||
<string name="home">హోమ్</string>
|
||||
<string name="superuser">సూపర్యూజర్</string>
|
||||
<string name="module_failed_to_disable">మాడ్యూల్ని నిలిపివేయడంలో విఫలమైంది: %s</string>
|
||||
<string name="module_empty">మాడ్యూల్ ఏదీ ఇన్స్టాల్ చేయబడలేదు</string>
|
||||
<string name="home_not_installed">ఇన్స్టాల్ చేయలేదు</string>
|
||||
</resources>
|
||||
@@ -72,11 +72,12 @@
|
||||
<string name="profile_selinux_rules">กฎ</string>
|
||||
<string name="module_downloading">กำลังดาวน์โหลดโมดูล: %s</string>
|
||||
<string name="module_start_downloading">กำลังเริ่มดาวน์โหลด: %s</string>
|
||||
<string name="new_version_available">เวอร์ชั่นใหม่: %s พร้อมใช้งาน คลิกเพื่อดาวน์โหลด</string>
|
||||
<string name="new_version_available">เวอร์ชั่นใหม่: %s พร้อมใช้งาน โปรดคลิกเพื่ออัปเกรด</string>
|
||||
<string name="force_stop_app">บังคับหยุด</string>
|
||||
<string name="restart_app">รีสตาร์ท</string>
|
||||
<string name="settings_umount_modules_default_summary">หากเปิดใช้งานค่าเริ่มต้นโดยทั่วไปสำหรับ \"Umount โมดูล\" ในโปรไฟล์แอป จะเป็นการลบการแก้ไขโมดูลทั้งหมดในระบบสำหรับแอปพลิเคชั่นที่ไม่มีการตั้งค่าโปรไฟล์</string>
|
||||
<string name="launch_app">เปิด</string>
|
||||
<string name="failed_to_update_sepolicy">ไม่สามารถอัปเดตกฎ SElinux สำหรับ: %s ได้</string>
|
||||
<string name="require_kernel_version">KernelSU เวอร์ชั่น %d ต่ำเกินไป จะทำงานได้อย่างถูกต้อง โปรดอัปเกรดเป็นเวอร์ชัน %d หรือสูงกว่า</string>
|
||||
<string name="require_kernel_version">KernelSU เวอร์ชั่น %d ต่ำเกินไป ทำให้ตัวจัดการไม่สามารถใช้งานได้อย่างถูกต้อง โปรดอัปเกรดเป็นเวอร์ชั่น %d หรือที่สูงกว่า!</string>
|
||||
<string name="module_changelog">บันทึกการเปลี่ยนแปลง</string>
|
||||
</resources>
|
||||
@@ -39,7 +39,7 @@
|
||||
<string name="module_version">Версія</string>
|
||||
<string name="module_author">Автор</string>
|
||||
<string name="module_overlay_fs_not_available">overlayfs не доступний, модуль не може працювати!</string>
|
||||
<string name="refresh">Оновити</string>
|
||||
<string name="refresh">освіжати(Оновити)</string>
|
||||
<string name="show_system_apps">Показати системні додатки</string>
|
||||
<string name="hide_system_apps">Сховати системні додатки</string>
|
||||
<string name="send_log">Надіслати лог</string>
|
||||
@@ -79,4 +79,6 @@
|
||||
<string name="restart_app">Перезапустити</string>
|
||||
<string name="new_version_available">Нова версія: %s доступна, натисніть, щоб завантажити</string>
|
||||
<string name="failed_to_update_sepolicy">Не вдалося оновити правила SELinux для: %s</string>
|
||||
<string name="module_changelog">Журнал змін</string>
|
||||
<string name="require_kernel_version">Поточна версія KernelSU %d занадто низька, щоб менеджер міг працювати належним чином. Будь ласка, оновіть до версії %d або вище!</string>
|
||||
</resources>
|
||||
@@ -75,8 +75,9 @@
|
||||
<string name="profile_selinux_domain">網域</string>
|
||||
<string name="module_update">更新</string>
|
||||
<string name="module_start_downloading">開始下載:%s</string>
|
||||
<string name="new_version_available">發現新版本:%s 已可供使用,按一下即可下載</string>
|
||||
<string name="new_version_available">發現新版本:%s 已可供使用,按一下即可升級</string>
|
||||
<string name="launch_app">啟動</string>
|
||||
<string name="force_stop_app">強制停止</string>
|
||||
<string name="failed_to_update_sepolicy">無法為 %s 更新 SELinux</string>
|
||||
</resources>
|
||||
<string name="module_changelog">變更記錄</string>
|
||||
</resources>
|
||||
@@ -1,11 +1,11 @@
|
||||
[versions]
|
||||
agp = "8.0.1"
|
||||
agp = "8.1.0"
|
||||
kotlin = "1.8.10"
|
||||
ksp = "1.8.10-1.0.9"
|
||||
compose-bom = "2023.05.01"
|
||||
compose-bom = "2023.06.01"
|
||||
lifecycle = "2.6.1"
|
||||
accompanist = "0.30.0"
|
||||
navigation = "2.5.3"
|
||||
accompanist = "0.30.1"
|
||||
navigation = "2.6.0"
|
||||
compose-destination = "1.9.42-beta"
|
||||
libsu = "5.0.5"
|
||||
sheets-compose-dialogs = "1.2.0"
|
||||
|
||||
@@ -1,174 +0,0 @@
|
||||
//
|
||||
// Created by Thom on 2019/3/8.
|
||||
//
|
||||
|
||||
// Credits: https://github.com/brevent/genuine/blob/master/src/main/jni/apk-sign-v2.c
|
||||
#include <fcntl.h>
|
||||
#include <unistd.h>
|
||||
#include <stdbool.h>
|
||||
#include <stdint.h>
|
||||
|
||||
#define MAIN
|
||||
|
||||
#ifdef MAIN
|
||||
#include <stdio.h>
|
||||
#else
|
||||
|
||||
#include "common.h"
|
||||
#include "openat.h"
|
||||
|
||||
#endif
|
||||
|
||||
static bool isApkSigBlock42(const char *buffer) {
|
||||
// APK Sig Block 42
|
||||
return *buffer == 'A'
|
||||
&& *++buffer == 'P'
|
||||
&& *++buffer == 'K'
|
||||
&& *++buffer == ' '
|
||||
&& *++buffer == 'S'
|
||||
&& *++buffer == 'i'
|
||||
&& *++buffer == 'g'
|
||||
&& *++buffer == ' '
|
||||
&& *++buffer == 'B'
|
||||
&& *++buffer == 'l'
|
||||
&& *++buffer == 'o'
|
||||
&& *++buffer == 'c'
|
||||
&& *++buffer == 'k'
|
||||
&& *++buffer == ' '
|
||||
&& *++buffer == '4'
|
||||
&& *++buffer == '2';
|
||||
}
|
||||
|
||||
int checkSignature(const char *path) {
|
||||
unsigned char buffer[0x11] = {0};
|
||||
uint32_t size4;
|
||||
uint64_t size8, size_of_block;
|
||||
|
||||
#ifdef DEBUG
|
||||
LOGI("check signature for %s", path);
|
||||
#endif
|
||||
|
||||
int sign = -1;
|
||||
int fd = (int) openat(AT_FDCWD, path, O_RDONLY);
|
||||
#ifdef DEBUG_OPENAT
|
||||
LOGI("openat %s returns %d", path, fd);
|
||||
#endif
|
||||
if (fd < 0) {
|
||||
return sign;
|
||||
}
|
||||
|
||||
sign = 1;
|
||||
// https://en.wikipedia.org/wiki/Zip_(file_format)#End_of_central_directory_record_(EOCD)
|
||||
for (int i = 0;; ++i) {
|
||||
unsigned short n;
|
||||
lseek(fd, -i - 2, SEEK_END);
|
||||
read(fd, &n, 2);
|
||||
if (n == i) {
|
||||
lseek(fd, -22, SEEK_CUR);
|
||||
read(fd, &size4, 4);
|
||||
if ((size4 ^ 0xcafebabeu) == 0xccfbf1eeu) {
|
||||
#ifdef MAIN
|
||||
if (i > 0) {
|
||||
printf("warning: comment length is %d\n", i);
|
||||
}
|
||||
#endif
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (i == 0xffff) {
|
||||
#ifdef MAIN
|
||||
printf("error: cannot find eocd\n");
|
||||
#endif
|
||||
goto clean;
|
||||
}
|
||||
}
|
||||
|
||||
lseek(fd, 12, SEEK_CUR);
|
||||
// offset
|
||||
read(fd, &size4, 0x4);
|
||||
lseek(fd, (off_t) (size4 - 0x18), SEEK_SET);
|
||||
|
||||
read(fd, &size8, 0x8);
|
||||
read(fd, buffer, 0x10);
|
||||
if (!isApkSigBlock42((char *) buffer)) {
|
||||
goto clean;
|
||||
}
|
||||
|
||||
lseek(fd, (off_t) (size4 - (size8 + 0x8)), SEEK_SET);
|
||||
read(fd, &size_of_block, 0x8);
|
||||
if (size_of_block != size8) {
|
||||
goto clean;
|
||||
}
|
||||
|
||||
for (;;) {
|
||||
uint32_t id;
|
||||
uint32_t offset;
|
||||
read(fd, &size8, 0x8); // sequence length
|
||||
if (size8 == size_of_block) {
|
||||
break;
|
||||
}
|
||||
read(fd, &id, 0x4); // id
|
||||
offset = 4;
|
||||
#ifdef MAIN
|
||||
// printf("id: 0x%08x\n", id);
|
||||
#endif
|
||||
if ((id ^ 0xdeadbeefu) == 0xafa439f5u || (id ^ 0xdeadbeefu) == 0x2efed62f) {
|
||||
read(fd, &size4, 0x4); // signer-sequence length
|
||||
read(fd, &size4, 0x4); // signer length
|
||||
read(fd, &size4, 0x4); // signed data length
|
||||
offset += 0x4 * 3;
|
||||
|
||||
read(fd, &size4, 0x4); // digests-sequence length
|
||||
lseek(fd, (off_t) (size4), SEEK_CUR);// skip digests
|
||||
offset += 0x4 + size4;
|
||||
|
||||
read(fd, &size4, 0x4); // certificates length
|
||||
read(fd, &size4, 0x4); // certificate length
|
||||
offset += 0x4 * 2;
|
||||
#ifdef MAIN
|
||||
int hash = 1;
|
||||
signed char c;
|
||||
for (unsigned i = 0; i < size4; ++i) {
|
||||
read(fd, &c, 0x1);
|
||||
hash = 31 * hash + c;
|
||||
}
|
||||
offset += size4;
|
||||
// printf(" size: 0x%04x, hash: 0x%08x\n", size4, ((unsigned) hash) ^ 0x14131211u);
|
||||
printf("0x%04x 0x%08x\n", size4, ((unsigned) hash) ^ 0x14131211u);
|
||||
#else
|
||||
#if defined(GENUINE_SIZE) && defined(GENUINE_HASH)
|
||||
if (size4 == GENUINE_SIZE) {
|
||||
int hash = 1;
|
||||
signed char c;
|
||||
for (unsigned i = 0; i < size4; ++i) {
|
||||
read(fd, &c, 0x1);
|
||||
hash = 31 * hash + c;
|
||||
}
|
||||
offset += size4;
|
||||
if ((((unsigned) hash) ^ 0x14131211u) == GENUINE_HASH) {
|
||||
sign = 0;
|
||||
break;
|
||||
}
|
||||
}
|
||||
#else
|
||||
sign = 0;
|
||||
break;
|
||||
#endif
|
||||
#endif
|
||||
}
|
||||
lseek(fd, (off_t) (size8 - offset), SEEK_CUR);
|
||||
}
|
||||
|
||||
clean:
|
||||
close(fd);
|
||||
|
||||
return sign;
|
||||
}
|
||||
|
||||
#ifdef MAIN
|
||||
int main(int argc, char **argv) {
|
||||
if (argc > 1) {
|
||||
checkSignature(argv[1]);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
131
userspace/ksud/Cargo.lock
generated
131
userspace/ksud/Cargo.lock
generated
@@ -2,6 +2,15 @@
|
||||
# It is not intended for manual editing.
|
||||
version = 3
|
||||
|
||||
[[package]]
|
||||
name = "addr2line"
|
||||
version = "0.19.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "a76fd60b23679b7d19bd066031410fb7e458ccc5e958eb5c325888ce4baedc97"
|
||||
dependencies = [
|
||||
"gimli",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "adler"
|
||||
version = "1.0.2"
|
||||
@@ -74,12 +83,38 @@ version = "1.0.68"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "2cb2f989d18dd141ab8ae82f64d1a8cdd37e0840f73a406896cf5e99502fab61"
|
||||
|
||||
[[package]]
|
||||
name = "async-trait"
|
||||
version = "0.1.73"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "bc00ceb34980c03614e35a3a4e218276a0a824e911d07651cd0d858a51e8c0f0"
|
||||
dependencies = [
|
||||
"proc-macro2",
|
||||
"quote",
|
||||
"syn 2.0.38",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "autocfg"
|
||||
version = "1.1.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa"
|
||||
|
||||
[[package]]
|
||||
name = "backtrace"
|
||||
version = "0.3.67"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "233d376d6d185f2a3093e58f283f60f880315b6c60075b01f36b3b85154564ca"
|
||||
dependencies = [
|
||||
"addr2line",
|
||||
"cc",
|
||||
"cfg-if",
|
||||
"libc",
|
||||
"miniz_oxide",
|
||||
"object",
|
||||
"rustc-demangle",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "base64ct"
|
||||
version = "1.6.0"
|
||||
@@ -132,6 +167,12 @@ version = "1.4.3"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "14c189c53d098945499cdfa7ecc63567cf3886b3332b312a5b4585d8d3a6a610"
|
||||
|
||||
[[package]]
|
||||
name = "bytes"
|
||||
version = "1.5.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "a2bd12c1caf447e69cd4528f47f94d203fd2582878ecb9e9465484c4148a8223"
|
||||
|
||||
[[package]]
|
||||
name = "bzip2"
|
||||
version = "0.4.4"
|
||||
@@ -234,7 +275,7 @@ dependencies = [
|
||||
"proc-macro-error",
|
||||
"proc-macro2",
|
||||
"quote",
|
||||
"syn",
|
||||
"syn 1.0.107",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
@@ -407,7 +448,7 @@ dependencies = [
|
||||
"proc-macro2",
|
||||
"quote",
|
||||
"scratch",
|
||||
"syn",
|
||||
"syn 1.0.107",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
@@ -424,7 +465,7 @@ checksum = "81bbeb29798b407ccd82a3324ade1a7286e0d29851475990b612670f6f5124d2"
|
||||
dependencies = [
|
||||
"proc-macro2",
|
||||
"quote",
|
||||
"syn",
|
||||
"syn 1.0.107",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
@@ -435,7 +476,7 @@ checksum = "3418329ca0ad70234b9735dc4ceed10af4df60eff9c8e7b06cb5e520d92c3535"
|
||||
dependencies = [
|
||||
"proc-macro2",
|
||||
"quote",
|
||||
"syn",
|
||||
"syn 1.0.107",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
@@ -604,6 +645,12 @@ dependencies = [
|
||||
"wasi 0.11.0+wasi-snapshot-preview1",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "gimli"
|
||||
version = "0.27.3"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "b6c80984affa11d98d1b88b66ac8853f143217b399d3c74116778ff8fdb4ed2e"
|
||||
|
||||
[[package]]
|
||||
name = "glob"
|
||||
version = "0.3.1"
|
||||
@@ -700,7 +747,7 @@ dependencies = [
|
||||
"proc-macro-hack",
|
||||
"proc-macro2",
|
||||
"quote",
|
||||
"syn",
|
||||
"syn 1.0.107",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
@@ -816,6 +863,7 @@ dependencies = [
|
||||
"rust-embed",
|
||||
"serde",
|
||||
"serde_json",
|
||||
"sha256",
|
||||
"sys-mount",
|
||||
"which",
|
||||
"zip 0.6.4",
|
||||
@@ -979,6 +1027,15 @@ dependencies = [
|
||||
"libc",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "object"
|
||||
version = "0.30.4"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "03b4680b86d9cfafba8fc491dc9b6df26b68cf40e9e6cd73909194759a63c385"
|
||||
dependencies = [
|
||||
"memchr",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "once_cell"
|
||||
version = "1.17.0"
|
||||
@@ -1053,7 +1110,7 @@ dependencies = [
|
||||
"proc-macro-error-attr",
|
||||
"proc-macro2",
|
||||
"quote",
|
||||
"syn",
|
||||
"syn 1.0.107",
|
||||
"version_check",
|
||||
]
|
||||
|
||||
@@ -1076,9 +1133,9 @@ checksum = "dc375e1527247fe1a97d8b7156678dfe7c1af2fc075c9a4db3690ecd2a148068"
|
||||
|
||||
[[package]]
|
||||
name = "proc-macro2"
|
||||
version = "1.0.50"
|
||||
version = "1.0.69"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "6ef7d57beacfaf2d8aee5937dab7b7f28de3cb8b1828479bb5de2a7106f2bae2"
|
||||
checksum = "134c189feb4956b20f6f547d2cf727d4c0fe06722b20a0eec87ed445a97f92da"
|
||||
dependencies = [
|
||||
"unicode-ident",
|
||||
]
|
||||
@@ -1100,9 +1157,9 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "quote"
|
||||
version = "1.0.23"
|
||||
version = "1.0.33"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "8856d8364d252a14d474036ea1358d63c9e6965c8e5c1885c18f73d70bff9c7b"
|
||||
checksum = "5267fca4496028628a95160fc423a33e8b2e6af8a5302579e322e4b520293cae"
|
||||
dependencies = [
|
||||
"proc-macro2",
|
||||
]
|
||||
@@ -1212,7 +1269,7 @@ dependencies = [
|
||||
"proc-macro2",
|
||||
"quote",
|
||||
"rust-embed-utils",
|
||||
"syn",
|
||||
"syn 1.0.107",
|
||||
"walkdir",
|
||||
]
|
||||
|
||||
@@ -1226,6 +1283,12 @@ dependencies = [
|
||||
"walkdir",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "rustc-demangle"
|
||||
version = "0.1.23"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "d626bb9dae77e28219937af045c257c28bfd3f69333c512553507f5f9798cb76"
|
||||
|
||||
[[package]]
|
||||
name = "rustc-hash"
|
||||
version = "1.1.0"
|
||||
@@ -1312,6 +1375,19 @@ dependencies = [
|
||||
"digest",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "sha256"
|
||||
version = "1.4.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "7895c8ae88588ccead14ff438b939b0c569cd619116f14b4d13fdff7b8333386"
|
||||
dependencies = [
|
||||
"async-trait",
|
||||
"bytes",
|
||||
"hex",
|
||||
"sha2",
|
||||
"tokio",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "shlex"
|
||||
version = "1.1.0"
|
||||
@@ -1326,7 +1402,7 @@ checksum = "133659a15339456eeeb07572eb02a91c91e9815e9cbc89566944d2c8d3efdbf6"
|
||||
dependencies = [
|
||||
"proc-macro2",
|
||||
"quote",
|
||||
"syn",
|
||||
"syn 1.0.107",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
@@ -1352,6 +1428,17 @@ dependencies = [
|
||||
"unicode-ident",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "syn"
|
||||
version = "2.0.38"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "e96b79aaa137db8f61e26363a0c9b47d8b4ec75da28b7d1d614c2303e232408b"
|
||||
dependencies = [
|
||||
"proc-macro2",
|
||||
"quote",
|
||||
"unicode-ident",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "sys-mount"
|
||||
version = "2.0.2"
|
||||
@@ -1391,7 +1478,7 @@ checksum = "1fb327af4685e4d03fa8cbcf1716380da910eeb2bb8be417e7f9fd3fb164f36f"
|
||||
dependencies = [
|
||||
"proc-macro2",
|
||||
"quote",
|
||||
"syn",
|
||||
"syn 1.0.107",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
@@ -1421,6 +1508,18 @@ version = "0.1.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "2e153e1f1acaef8acc537e68b44906d2db6436e2b35ac2c6b42640fff91f00fd"
|
||||
|
||||
[[package]]
|
||||
name = "tokio"
|
||||
version = "1.29.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "532826ff75199d5833b9d2c5fe410f29235e25704ee5f0ef599fb51c21f4a4da"
|
||||
dependencies = [
|
||||
"autocfg",
|
||||
"backtrace",
|
||||
"bytes",
|
||||
"pin-project-lite",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "tracing"
|
||||
version = "0.1.37"
|
||||
@@ -1441,7 +1540,7 @@ checksum = "4017f8f45139870ca7e672686113917c71c7a6e02d4924eda67186083c03081a"
|
||||
dependencies = [
|
||||
"proc-macro2",
|
||||
"quote",
|
||||
"syn",
|
||||
"syn 1.0.107",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
@@ -1527,7 +1626,7 @@ dependencies = [
|
||||
"once_cell",
|
||||
"proc-macro2",
|
||||
"quote",
|
||||
"syn",
|
||||
"syn 1.0.107",
|
||||
"wasm-bindgen-shared",
|
||||
]
|
||||
|
||||
@@ -1549,7 +1648,7 @@ checksum = "2aff81306fcac3c7515ad4e177f521b5c9a15f2b08f4e32d823066102f35a5f6"
|
||||
dependencies = [
|
||||
"proc-macro2",
|
||||
"quote",
|
||||
"syn",
|
||||
"syn 1.0.107",
|
||||
"wasm-bindgen-backend",
|
||||
"wasm-bindgen-shared",
|
||||
]
|
||||
|
||||
@@ -33,6 +33,7 @@ rust-embed = { version = "6.4.2", features = [
|
||||
] }
|
||||
which = "4.2.2"
|
||||
getopts = "0.2.21"
|
||||
sha256 = "1.4.0"
|
||||
|
||||
[target.'cfg(any(target_os = "android", target_os = "linux"))'.dependencies]
|
||||
sys-mount = { git = "https://github.com/tiann/sys-mount", branch = "loopfix" }
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
use anyhow::{ensure, Result};
|
||||
use std::io::{Read, Seek, SeekFrom};
|
||||
|
||||
pub fn get_apk_signature(apk: &str) -> Result<(u32, u32)> {
|
||||
pub fn get_apk_signature(apk: &str) -> Result<(u32, String)> {
|
||||
let mut buffer = [0u8; 0x10];
|
||||
let mut size4 = [0u8; 4];
|
||||
let mut size8 = [0u8; 8];
|
||||
@@ -49,9 +49,13 @@ pub fn get_apk_signature(apk: &str) -> Result<(u32, u32)> {
|
||||
|
||||
ensure!(size_of_block == size8, "not a signed apk");
|
||||
|
||||
let mut v2_signing: Option<(u32, String)> = None;
|
||||
let mut v3_signing_exist = false;
|
||||
let mut v3_1_signing_exist = false;
|
||||
|
||||
loop {
|
||||
let mut id = [0u8; 4];
|
||||
let offset = 4u32;
|
||||
let mut offset = 4u32;
|
||||
|
||||
f.read_exact(&mut size8)?; // sequence length
|
||||
if size8 == size_of_block {
|
||||
@@ -61,36 +65,14 @@ pub fn get_apk_signature(apk: &str) -> Result<(u32, u32)> {
|
||||
f.read_exact(&mut id)?; // id
|
||||
|
||||
let id = u32::from_le_bytes(id);
|
||||
if (id ^ 0xdead_beef_u32) == 0xafa4_39f5_u32 || (id ^ 0xdead_beef_u32) == 0x2efe_d62f_u32 {
|
||||
f.read_exact(&mut size4)?; // signer-sequence length
|
||||
f.read_exact(&mut size4)?; // signer length
|
||||
f.read_exact(&mut size4)?; // signed data length
|
||||
// offset += 0x4 * 3;
|
||||
|
||||
f.read_exact(&mut size4)?; // digests-sequcence length
|
||||
let pos = u32::from_le_bytes(size4);
|
||||
f.seek(SeekFrom::Current(i64::from(pos)))?;
|
||||
// offset += 0x4 + pos;
|
||||
|
||||
f.read_exact(&mut size4)?; // certificates length
|
||||
f.read_exact(&mut size4)?; // certificate length
|
||||
// offset += 0x4 * 2;
|
||||
|
||||
let mut hash = 1i32;
|
||||
let mut c = [0u8; 1];
|
||||
|
||||
let j = u32::from_le_bytes(size4);
|
||||
for _ in 0..j {
|
||||
f.read_exact(&mut c)?;
|
||||
hash = hash.wrapping_mul(31).wrapping_add(i32::from(c[0] as i8));
|
||||
}
|
||||
|
||||
// offset += j;
|
||||
|
||||
let out_size = j;
|
||||
let out_hash = (hash as u32) ^ 0x1413_1211_u32;
|
||||
|
||||
return Ok((out_size, out_hash));
|
||||
if id == 0x7109_871a_u32 {
|
||||
v2_signing = Some(calc_cert_sha256(&mut f, &mut size4, &mut offset)?);
|
||||
} else if id == 0xf053_68c0_u32 {
|
||||
// v3 signature scheme
|
||||
v3_signing_exist = true;
|
||||
} else if id == 0x1b93_ad61_u32 {
|
||||
// v3.1 signature scheme: credits to vvb2060
|
||||
v3_1_signing_exist = true;
|
||||
}
|
||||
|
||||
f.seek(SeekFrom::Current(
|
||||
@@ -98,5 +80,39 @@ pub fn get_apk_signature(apk: &str) -> Result<(u32, u32)> {
|
||||
))?;
|
||||
}
|
||||
|
||||
Err(anyhow::anyhow!("Unknown error"))
|
||||
if v3_signing_exist || v3_1_signing_exist {
|
||||
return Err(anyhow::anyhow!(
|
||||
"Unexpected v3 signature found!",
|
||||
));
|
||||
}
|
||||
|
||||
v2_signing.ok_or(anyhow::anyhow!("No signature found!"))
|
||||
|
||||
}
|
||||
|
||||
fn calc_cert_sha256(
|
||||
f: &mut std::fs::File,
|
||||
size4: &mut [u8; 4],
|
||||
offset: &mut u32,
|
||||
) -> Result<(u32, String)> {
|
||||
f.read_exact(size4)?; // signer-sequence length
|
||||
f.read_exact(size4)?; // signer length
|
||||
f.read_exact(size4)?; // signed data length
|
||||
*offset += 0x4 * 3;
|
||||
|
||||
f.read_exact(size4)?; // digests-sequence length
|
||||
let pos = u32::from_le_bytes(*size4); // skip digests
|
||||
f.seek(SeekFrom::Current(i64::from(pos)))?;
|
||||
*offset += 0x4 + pos;
|
||||
|
||||
f.read_exact(size4)?; // certificates length
|
||||
f.read_exact(size4)?; // certificate length
|
||||
*offset += 0x4 * 2;
|
||||
|
||||
let cert_len = u32::from_le_bytes(*size4);
|
||||
let mut cert: Vec<u8> = vec![0; cert_len as usize];
|
||||
f.read_exact(&mut cert)?;
|
||||
*offset += cert_len;
|
||||
|
||||
Ok((cert_len, sha256::digest(&cert)))
|
||||
}
|
||||
|
||||
@@ -228,7 +228,7 @@ pub fn run() -> Result<()> {
|
||||
Debug::SetManager { apk } => debug::set_manager(&apk),
|
||||
Debug::GetSign { apk } => {
|
||||
let sign = apk_sign::get_apk_signature(&apk)?;
|
||||
println!("size: {:#x}, hash: {:#x}", sign.0, sign.1);
|
||||
println!("size: {:#x}, hash: {}", sign.0, sign.1);
|
||||
Ok(())
|
||||
}
|
||||
Debug::Version => {
|
||||
|
||||
@@ -15,24 +15,25 @@ fn read_u32(path: &PathBuf) -> Result<u32> {
|
||||
Ok(content)
|
||||
}
|
||||
|
||||
fn set_kernel_param(size: u32, hash: u32) -> Result<()> {
|
||||
fn set_kernel_param(size: u32, hash: String) -> Result<()> {
|
||||
let kernel_param_path = Path::new(KERNEL_PARAM_PATH).join("parameters");
|
||||
|
||||
let expeced_size_path = kernel_param_path.join("ksu_expected_size");
|
||||
let expeced_hash_path = kernel_param_path.join("ksu_expected_hash");
|
||||
|
||||
println!(
|
||||
"before size: {:#x} hash: {:#x}",
|
||||
"before size: {:#x} hash: {}",
|
||||
read_u32(&expeced_size_path)?,
|
||||
read_u32(&expeced_hash_path)?
|
||||
std::fs::read_to_string(&expeced_hash_path)?
|
||||
);
|
||||
|
||||
std::fs::write(&expeced_size_path, size.to_string())?;
|
||||
std::fs::write(&expeced_hash_path, hash.to_string())?;
|
||||
std::fs::write(&expeced_hash_path, hash)?;
|
||||
|
||||
println!(
|
||||
"after size: {:#x} hash: {:#x}",
|
||||
"after size: {:#x} hash: {}",
|
||||
read_u32(&expeced_size_path)?,
|
||||
read_u32(&expeced_hash_path)?
|
||||
std::fs::read_to_string(&expeced_hash_path)?
|
||||
);
|
||||
|
||||
Ok(())
|
||||
|
||||
@@ -6,6 +6,7 @@ import vi_VN from './vi_VN'
|
||||
import id_ID from './id_ID'
|
||||
import ja_JP from './ja_JP'
|
||||
import ru_RU from './ru_RU'
|
||||
import pt_BR from './pt_BR'
|
||||
|
||||
export default defineConfig({
|
||||
locales: {
|
||||
@@ -50,6 +51,12 @@ export default defineConfig({
|
||||
lang: ru_RU.lang,
|
||||
themeConfig: ru_RU.themeConfig,
|
||||
description: ru_RU.description
|
||||
},
|
||||
pt_BR: {
|
||||
label: 'Português (Brasil)',
|
||||
lang: pt_BR.lang,
|
||||
themeConfig: pt_BR.themeConfig,
|
||||
description: pt_BR.description
|
||||
}
|
||||
}
|
||||
})
|
||||
|
||||
61
website/docs/.vitepress/locales/pt_BR.ts
Normal file
61
website/docs/.vitepress/locales/pt_BR.ts
Normal file
@@ -0,0 +1,61 @@
|
||||
import { createRequire } from 'module'
|
||||
import { defineConfig } from 'vitepress'
|
||||
|
||||
const require = createRequire(import.meta.url)
|
||||
const pkg = require('vitepress/package.json')
|
||||
|
||||
export default defineConfig({
|
||||
lang: 'pt-BR',
|
||||
description: 'Uma solução root baseada em kernel para dispositivos Android GKI.',
|
||||
|
||||
themeConfig: {
|
||||
nav: nav(),
|
||||
|
||||
lastUpdatedText: 'Última atualização',
|
||||
|
||||
sidebar: {
|
||||
'/pt_BR/guide/': sidebarGuide()
|
||||
},
|
||||
|
||||
socialLinks: [
|
||||
{ icon: 'github', link: 'https://github.com/tiann/KernelSU' }
|
||||
],
|
||||
|
||||
footer: {
|
||||
message: 'Lançado sob a Licença GPL3.',
|
||||
copyright: 'Copyright © Desenvolvedores KernelSU atuais de 2022'
|
||||
},
|
||||
|
||||
editLink: {
|
||||
pattern: 'https://github.com/tiann/KernelSU/edit/main/website/docs/:path',
|
||||
text: 'Edite esta página no GitHub'
|
||||
}
|
||||
}
|
||||
})
|
||||
|
||||
function nav() {
|
||||
return [
|
||||
{ text: 'Guia', link: '/pt_BR/guide/what-is-kernelsu' },
|
||||
{ text: 'Github', link: 'https://github.com/tiann/KernelSU' }
|
||||
]
|
||||
}
|
||||
|
||||
function sidebarGuide() {
|
||||
return [
|
||||
{
|
||||
text: 'Guia',
|
||||
items: [
|
||||
{ text: 'O que é KernelSU?', link: '/pt_BR/guide/what-is-kernelsu' },
|
||||
{ text: 'Instalação', link: '/pt_BR/guide/installation' },
|
||||
{ text: 'Como construir?', link: '/pt_BR/guide/how-to-build' },
|
||||
{ text: 'Integração para dispositivos não GKI', link: '/pt_BR/guide/how-to-integrate-for-non-gki'},
|
||||
{ text: 'Dispositivos com suporte não oficial', link: '/pt_BR/guide/unofficially-support-devices.md' },
|
||||
{ text: 'Guias de módulo', link: '/pt_BR/guide/module.md' },
|
||||
{ text: 'Perfil do Aplicativo', link: '/pt_BR/guide/app-profile.md' },
|
||||
{ text: 'Resgate do bootloop', link: '/pt_BR/guide/rescue-from-bootloop.md' },
|
||||
{ text: 'FAQ', link: '/pt_BR/guide/faq' },
|
||||
{ text: 'Recursos ocultos', link: '/pt_BR/guide/hidden-features' },
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -19,11 +19,11 @@ hero:
|
||||
|
||||
features:
|
||||
- title: Kernel-based
|
||||
details: KernelSU is working in Linux kernel mode, it has more control over userspace applications.
|
||||
- title: Whitelist access control
|
||||
details: Only App that is granted root permission can access `su`, other apps cannot perceive su.
|
||||
- title: Restricted root permission
|
||||
details: KernelSU allows you to customize the uid, gid, groups, capabilities and SELinux rules of su. Lock up the root power in a cage.
|
||||
- title: Module & Open source
|
||||
details: KernelSU supports modify /system systemlessly by overlayfs and it is open-sourced under GPL-3.
|
||||
details: As the name suggests, KernelSU works under the Linux kernel giving it more control over userspace applications.
|
||||
- title: Root Access Control
|
||||
details: Only permitted apps may access or see `su`, all other apps are not aware of this.
|
||||
- title: Customizable Root Privileges
|
||||
details: KernelSU allows customization of `su`'s uid, gid, groups, capabilities, and SELinux rules, locking up root privileges.
|
||||
- title: Modules
|
||||
details: Modules may modify /system systemlessly using overlayfs enabling great power.
|
||||
|
||||
|
||||
118
website/docs/pt_BR/guide/app-profile.md
Normal file
118
website/docs/pt_BR/guide/app-profile.md
Normal file
@@ -0,0 +1,118 @@
|
||||
# Perfil do Aplicativo
|
||||
|
||||
O Perfil do Aplicativo é um mecanismo fornecido pelo KernelSU para personalizar a configuração de vários apps.
|
||||
|
||||
Para apps com permissões de root (ou seja, capazes de usar `su`), o Perfil do Aplicativo também pode ser chamado de Perfil Root. Ele permite a customização das regras `uid`, `gid`, `groups`, `capabilities` e `SELinux` do comando `su`, restringindo assim os privilégios do usuário root. Por exemplo, ele pode conceder permissões de rede apenas para apps de firewall enquanto nega permissões de acesso a arquivos, ou pode conceder permissões de shell em vez de acesso root completo para apps congelados: **mantendo o poder confinado com o princípio do menor privilégio.**
|
||||
|
||||
Para apps comuns sem permissões de root, o Perfil do Aplicativo pode controlar o comportamento do kernel e do sistema de módulos em relação a esses apps. Por exemplo, pode determinar se as modificações resultantes dos módulos devem ser abordadas. O kernel e o sistema de módulos podem tomar decisões com base nesta configuração, como realizar operações semelhantes a "ocultar"
|
||||
|
||||
## Perfil Root
|
||||
|
||||
### UID, GID e Grupos
|
||||
|
||||
Os sistemas Linux possuem dois conceitos: usuários e grupos. Cada usuário possui um ID de usuário (UID) e um usuário pode pertencer a vários grupos, cada um com seu próprio ID de grupo (GID). Esses IDs são usados para identificar usuários no sistema e determinar quais recursos do sistema eles podem acessar.
|
||||
|
||||
Os usuários com UID 0 são conhecidos como usuários root e os grupos com GID 0 são conhecidos como grupos root. O grupo de usuários root normalmente possui os privilégios de sistema mais altos.
|
||||
|
||||
No caso do sistema Android, cada app é um usuário separado (excluindo cenários de UID compartilhados) com um UID exclusivo. Por exemplo, `0` representa o usuário root, `1000` representa `system`, `2000` representa o ADB shell e UIDs variando de `10.000` a `19.999` representam apps comuns.
|
||||
|
||||
:::info INFORMAÇÕES
|
||||
Aqui, o UID mencionado não é o mesmo que o conceito de múltiplos usuários ou perfis de trabalho no sistema Android. Os perfis de trabalho são, na verdade, implementados particionando o intervalo UID. Por exemplo, 10000-19999 representa o usuário principal, enquanto 110000-119999 representa um perfil de trabalho. Cada app comum entre eles possui seu próprio UID exclusivo.
|
||||
:::
|
||||
|
||||
Cada app pode ter vários grupos, com o GID representando o grupo principal, que geralmente corresponde ao UID. Outros grupos são conhecidos como grupos suplementares. Certas permissões são controladas por meio de grupos, como permissões de acesso à rede ou acesso Bluetooth.
|
||||
|
||||
Por exemplo, se executarmos o comando `id` no ADB shell, a saída pode ser semelhante a esta:
|
||||
|
||||
```sh
|
||||
oriole:/ $ id
|
||||
uid=2000(shell) gid=2000(shell) groups=2000(shell),1004(input),1007(log),1011(adb),1015(sdcard_rw),1028(sdcard_r),1078(ext_data_rw),1079(ext_obb_rw),3001(net_bt_admin),3002(net_bt),3003(inet),3006(net_bw_stats),3009(readproc),3011(uhid),3012(readtracefs) context=u:r:shell:s0
|
||||
```
|
||||
|
||||
Aqui, o UID é `2000` e o GID (ID do grupo primário) também é `2000`. Além disso, pertence a vários grupos suplementares, como `inet` (indicando a capacidade de criar soquetes `AF_INET` e `AF_INET6`) e `sdcard_rw` (indicando permissões de leitura/gravação para o cartão SD).
|
||||
|
||||
O Perfil Root do KernelSU permite a personalização do UID, GID e grupos para o processo root após a execução de `su`. Por exemplo, o Perfil Root de um app root pode definir seu UID como `2000`, que significa que ao usar `su`, as permissões reais do app estão no nível do ADB shell. O grupo `inet` pode ser removido, evitando que o comando `su` acesse a rede.
|
||||
|
||||
:::tip OBSERVAÇÃO
|
||||
O Perfil do Aplicativo controla apenas as permissões do processo root após usar `su`, e ele não controla as permissões do próprio app. Se um app solicitou permissão de acesso à rede, ele ainda poderá acessar a rede mesmo sem usar `su`. Remover o grupo `inet` de `su` apenas impede que `su` acesse a rede.
|
||||
:::
|
||||
|
||||
O Perfil Root é aplicado no kernel e não depende do comportamento voluntário de apps root, ao contrário da troca de usuários ou grupos por meio de `su`, a concessão da permissão `su` depende inteiramente do usuário e não do desenvolvedor.
|
||||
|
||||
### Capacidades
|
||||
|
||||
As capacidades são um mecanismo para separação de privilégios no Linux.
|
||||
|
||||
Para realizar verificações de permissão, as implementações tradicionais do `UNIX` distinguem duas categorias de processos: processos privilegiados (cujo ID de usuário efetivo é `0`, referido como superusuário ou root) e processos sem privilégios (cujo UID efetivo é diferente de zero). Os processos privilegiados ignoram todas as verificações de permissão do kernel, enquanto os processos não privilegiados estão sujeitos à verificação completa de permissão com base nas credenciais do processo (geralmente: UID efetivo, GID efetivo e lista de grupos suplementares).
|
||||
|
||||
A partir do Linux 2.2, o Linux divide os privilégios tradicionalmente associados ao superusuário em unidades distintas, conhecidas como capacidades, que podem ser ativadas e desativadas de forma independente.
|
||||
|
||||
Cada capacidade representa um ou mais privilégios. Por exemplo, `CAP_DAC_READ_SEARCH` representa a capacidade de ignorar verificações de permissão para leitura de arquivos, bem como permissões de leitura e execução de diretório. Se um usuário com um UID efetivo `0` (usuário root) não tiver recursos `CAP_DAC_READ_SEARCH` ou superiores, isso significa que mesmo sendo root, ele não pode ler arquivos à vontade.
|
||||
|
||||
O Perfil Root do KernelSU permite a personalização das capacidades do processo root após a execução de `su`, conseguindo assim conceder parcialmente "permissões de root". Ao contrário do UID e GID mencionados acima, certos apps root exigem um UID de `0` após usar `su`. Nesses casos, limitar as capacidades deste usuário root com UID `0` pode restringir suas operações permitidas.
|
||||
|
||||
:::tip FORTE RECOMENDAÇÃO
|
||||
A [documentação oficial](https://man7.org/linux/man-pages/man7/capabilities.7.html) da Capacidade do Linux fornece explicações detalhadas das habilidades representadas por cada Capacidade. Se você pretende customizar Capacidades, é altamente recomendável que você leia este documento primeiro.
|
||||
:::
|
||||
|
||||
### SELinux
|
||||
|
||||
SELinux é um poderoso mecanismo do Controle de Acesso Obrigatório (MAC). Ele opera com base no princípio de **negação padrão**. Qualquer ação não explicitamente permitida é negada.
|
||||
|
||||
O SELinux pode ser executado em dois modos globais:
|
||||
|
||||
1. Modo permissivo: Os eventos de negação são registrados, mas não aplicados.
|
||||
2. Modo de aplicação: Os eventos de negação são registrados e aplicados.
|
||||
|
||||
:::warning AVISO
|
||||
Os sistemas Android modernos dependem fortemente do SELinux para garantir a segurança geral do sistema. É altamente recomendável não usar nenhum sistema personalizado executado em "Modo permissivo", pois não oferece vantagens significativas em relação a um sistema completamente aberto.
|
||||
:::
|
||||
|
||||
Explicar o conceito completo do SELinux é complexo e está além do objetivo deste documento. Recomenda-se primeiro entender seu funcionamento através dos seguintes recursos:
|
||||
|
||||
1. [Wikipédia](https://en.wikipedia.org/wiki/Security-Enhanced_Linux)
|
||||
2. [Red Hat: O que é SELinux?](https://www.redhat.com/pt-br/topics/linux/what-is-selinux)
|
||||
3. [ArchLinux: SELinux](https://wiki.archlinux.org/title/SELinux)
|
||||
|
||||
O Perfil Root do KernelSU permite a personalização do contexto SELinux do processo root após a execução de `su`. Regras específicas de controle de acesso podem ser definidas para este contexto para permitir um controle refinado sobre as permissões de root.
|
||||
|
||||
Em cenários típicos, quando um app executa `su`, ele alterna o processo para um domínio SELinux com **acesso irrestrito**, como `u:r:su:s0`. Através do Perfil Root, este domínio pode ser mudado para um domínio personalizado, como `u:r:app1:s0`, e uma série de regras podem ser definidas para este domínio:
|
||||
|
||||
```sh
|
||||
type app1
|
||||
enforce app1
|
||||
typeattribute app1 mlstrustedsubject
|
||||
allow app1 * * *
|
||||
```
|
||||
|
||||
Observe que a regra `allow app1 * * *` é usada apenas para fins de demonstração. Na prática, esta regra não deve ser utilizada extensivamente, pois não difere muito do Modo permissivo.
|
||||
|
||||
### Escalação
|
||||
|
||||
Se a configuração do Perfil Root não estiver definida corretamente, poderá ocorrer um cenário de escalação. As restrições impostas pelo Perfil Root poderão falhar involuntariamente.
|
||||
|
||||
Por exemplo, se você conceder permissão root a um usuário ADB shell (que é um caso comum) e, em seguida, conceder permissão root a um app normal, mas configurar seu Perfil Root com UID 2000 (que é o UID do usuário ADB shell), o app pode obter acesso root completo executando o comando `su` duas vezes:
|
||||
|
||||
1. A primeira execução `su` está sujeita à aplicação do Perfil do Aplicativo e mudará para UID `2000` (adb shell) em vez de `0` (root).
|
||||
2. A segunda execução `su`, como o UID é `2000` e você concedeu acesso root ao UID `2000` (adb shell) na configuração, o app obterá privilégio de root completo.
|
||||
|
||||
:::warning OBSERVAÇÃO
|
||||
Este comportamento é totalmente esperado e não é um bug. Portanto, recomendamos o seguinte:
|
||||
|
||||
Se você realmente precisa conceder permissões de root ao ADB (por exemplo, como desenvolvedor), não é aconselhável alterar o UID para `2000` ao configurar o Perfil Root. Usar `1000` (system) seria uma melhor escolha.
|
||||
:::
|
||||
|
||||
## Perfil não Root
|
||||
|
||||
### Desmontar módulos
|
||||
|
||||
O KernelSU fornece um mecanismo sem sistema para modificar partições do sistema, obtido através da montagem de overlayfs. No entanto, alguns apps podem ser sensíveis a esse comportamento. Assim, podemos descarregar módulos montados nesses apps configurando a opção “desmontar módulos”.
|
||||
|
||||
Além disso, a interface de configurações do gerenciador KernelSU fornece uma opção para "desmontar módulos por padrão". Por padrão, essa opção está **ativada**, o que significa que o KernelSU ou alguns módulos descarregarão módulos para este app, a menos que configurações adicionais sejam aplicadas. Se você não preferir esta configuração ou se ela afetar determinados apps, você terá as seguintes opções:
|
||||
|
||||
1. Mantenha a opção "desmontar módulos por padrão" e desative individualmente a opção "desmontar módulos" no Perfil do Aplicativo para apps que exigem carregamento do módulo (agindo como uma "lista de permissões").
|
||||
2. Desative a opção "desmontar módulos por padrão" e ative individualmente a opção "desmontar módulos" no Perfil do Aplicativo para apps que exigem descarregamento do módulo (agindo como uma "lista negra").
|
||||
|
||||
:::info INFORMAÇÕES
|
||||
Em dispositivos que utilizam kernel versão 5.10 e superior, o kernel realiza o descarregamento dos módulos. No entanto, para dispositivos que executam versões de kernel abaixo de 5.10, essa opção é apenas uma opção de configuração e o próprio KernelSU não executa nenhuma ação. Alguns módulos, como Zygisksu, podem usar essa opção para determinar se o descarregamento do módulo é necessário.
|
||||
:::
|
||||
28
website/docs/pt_BR/guide/difference-with-magisk.md
Normal file
28
website/docs/pt_BR/guide/difference-with-magisk.md
Normal file
@@ -0,0 +1,28 @@
|
||||
# Diferença com Magisk
|
||||
|
||||
Embora existam muitas semelhanças entre os módulos KernelSU e os módulos Magisk, existem inevitavelmente algumas diferenças devido aos seus mecanismos de implementação completamente diferentes. Se você deseja que seu módulo seja executado no Magisk e no KernelSU, você deve entender essas diferenças.
|
||||
|
||||
## Semelhanças
|
||||
|
||||
- Formato de arquivo do módulo: ambos usam o formato zip para organizar os módulos, e o formato dos módulos é quase o mesmo.
|
||||
- Diretório de instalação do módulo: ambos localizados em `/data/adb/modules`.
|
||||
- Sem sistema: ambos suportam a modificação de `/system` de maneira sem sistema por meio de módulos.
|
||||
- post-fs-data.sh: o tempo de execução e a semântica são exatamente os mesmos.
|
||||
- service.sh: o tempo de execução e a semântica são exatamente os mesmos.
|
||||
- system.prop: completamente o mesmo.
|
||||
- sepolicy.rule: completamente o mesmo.
|
||||
- BusyBox: os scripts são executados no BusyBox com o "Modo Autônomo" ativado em ambos os casos.
|
||||
|
||||
## Diferenças
|
||||
|
||||
Antes de entender as diferenças, você precisa saber diferenciar se o seu módulo está rodando no KernelSU ou Magisk. Você pode usar a variável de ambiente `KSU` para diferenciá-la em todos os locais onde você pode executar os scripts do módulo (`customize.sh`, `post-fs-data.sh`, `service.sh`). No KernelSU, esta variável de ambiente será definida como `true`.
|
||||
|
||||
Aqui estão algumas diferenças:
|
||||
|
||||
- Os módulos KernelSU não podem ser instalados no modo Recovery.
|
||||
- Os módulos KernelSU não têm suporte integrado para Zygisk (mas você pode usar módulos Zygisk através do [ZygiskOnKernelSU](https://github.com/Dr-TSNG/ZygiskOnKernelSU).
|
||||
- O método para substituir ou excluir arquivos nos módulos KernelSU é completamente diferente do Magisk. O KernelSU não suporta o método `.replace`. Em vez disso, você precisa criar um arquivo com o mesmo nome `mknod filename c 0 0` para excluir o arquivo correspondente.
|
||||
- Os diretórios do BusyBox são diferentes. O BusyBox integrado no KernelSU está localizado em `/data/adb/ksu/bin/busybox`, enquanto no Magisk está em `/data/adb/magisk/busybox`. **Observe que este é um comportamento interno do KernelSU e pode mudar no futuro!**
|
||||
- O KernelSU não suporta arquivos `.replace`, entretanto, o KernelSU suporta as variáveis `REMOVE` e `REPLACE` para remover ou substituir arquivos e pastas.
|
||||
- O KernelSU adiciona o estágio `boot-completed` para executar alguns scripts na inicialização concluída.
|
||||
- O KernelSU adiciona o estágio `post-mount` para executar alguns scripts após montar overlayfs.
|
||||
67
website/docs/pt_BR/guide/faq.md
Normal file
67
website/docs/pt_BR/guide/faq.md
Normal file
@@ -0,0 +1,67 @@
|
||||
# FAQ
|
||||
|
||||
## KernelSU oferece suporte ao meu dispositivo?
|
||||
|
||||
Primeiro, seu dispositivo deve ser capaz de desbloquear o bootloader. Se não, então não há suporte.
|
||||
|
||||
Em seguida, instale o app gerenciador KernelSU em seu dispositivo e abra-o, se mostrar `Sem suporte` então seu dispositivo não pode ser suportado imediatamente, mas você pode construir a fonte do kernel e integrar o KernelSU para fazê-lo funcionar ou usar [dispositivos com suporte não oficial](unofficially-support-devices).
|
||||
|
||||
## KernelSU precisa desbloquear o Bootloader?
|
||||
|
||||
Certamente, sim.
|
||||
|
||||
## KernelSU suporta módulos?
|
||||
|
||||
Sim, mas está na versão inicial, pode apresentar bugs. Por favor, aguarde até que fique estável.
|
||||
|
||||
## KernelSU suporta Xposed?
|
||||
|
||||
Sim, [Dreamland](https://github.com/canyie/Dreamland) e [TaiChi](https://taichi.cool) funcionam agora. Para o LSPosed, você pode fazer funcionar usando [ZygiskOnKernelSU](https://github.com/Dr-TSNG/ZygiskOnKernelSU).
|
||||
|
||||
## KernelSU suporta Zygisk?
|
||||
|
||||
KernelSU não tem suporte integrado ao Zygisk, mas você pode usar [ZygiskOnKernelSU](https://github.com/Dr-TSNG/ZygiskOnKernelSU).
|
||||
|
||||
## KernelSU é compatível com Magisk?
|
||||
|
||||
O sistema de módulos do KernelSU está em conflito com a montagem mágica do Magisk, se houver algum módulo habilitado no KernelSU, então todo o Magisk não funcionaria.
|
||||
|
||||
Mas se você usar apenas o `su` do KernelSU, então funcionará bem com o Magisk. KernelSU modifica o `kernel` e o Magisk modifica o `ramdisk`, eles podem trabalhar juntos.
|
||||
|
||||
## KernelSU substituirá o Magisk?
|
||||
|
||||
Achamos que não e esse não é o nosso objetivo. O Magisk é bom o suficiente para solução root do espaço do usuário e terá uma longa vida. O objetivo do KernelSU é fornecer uma interface de kernel aos usuários, não substituindo o Magisk.
|
||||
|
||||
## KernelSU pode oferecer suporte a dispositivos não GKI?
|
||||
|
||||
É possível. Mas você deve baixar o código-fonte do kernel e integrar o KernelSU à árvore do código-fonte e compilar o kernel você mesmo.
|
||||
|
||||
## KernelSU pode oferecer suporte a dispositivos abaixo do Android 12?
|
||||
|
||||
É o kernel do dispositivo que afeta a compatibilidade do KernelSU e não tem nada a ver com a versão do Android. A única restrição é que os dispositivos lançados com Android 12 devem ser kernel 5.10+ (dispositivos GKI). Então:
|
||||
|
||||
1. Os dispositivos lançados com Android 12 devem ser compatíveis.
|
||||
2. Dispositivos com kernel antigo (alguns dispositivos Android 12 também têm o kernel antigo) são compatíveis (você mesmo deve construir o kernel).
|
||||
|
||||
## KernelSU pode suportar kernel antigo?
|
||||
|
||||
É possível, o KernelSU é portado para o kernel 4.14 agora, para o kernel mais antigo, você precisa fazer o backport manualmente e PRs são bem-vindos!
|
||||
|
||||
## Como integrar o KernelSU para o kernel antigo?
|
||||
|
||||
Por favor, consulte a guia [Como integrar o KernelSU para kernels não GKI](how-to-integrate-for-non-gki)
|
||||
|
||||
## Por que minha versão do Android é 13 e o kernel mostra “android12-5.10”?
|
||||
|
||||
A versão do Kernel não tem nada a ver com a versão do Android, se você precisar fazer o flash do kernel, use sempre a versão do kernel, a versão do Android não é tão importante.
|
||||
|
||||
## Existe algum namespace de montagem --mount-master/global no KernelSU?
|
||||
|
||||
Não existe agora (talvez no futuro), mas há muitas maneiras de mudar manualmente para o namespace de montagem global, como:
|
||||
|
||||
1. `nsenter -t 1 -m sh` para obter um shell no namespace de montagem global.
|
||||
2. Adicione `nsenter --mount=/proc/1/ns/mnt` ao comando que você deseja executar, o comando será executado no namespace de montagem global. O KernelSU também está [usando desta forma](https://github.com/tiann/KernelSU/blob/77056a710073d7a5f7ee38f9e77c9fd0b3256576/manager/app/src/main/java/me/weishu/kernelsu/ui/util/KsuCli.kt#L115)
|
||||
|
||||
## Eu sou GKI1.0, posso usar isso?
|
||||
|
||||
GKI1 é completamente diferente do GKI2, você deve compilar o kernel sozinho.
|
||||
7
website/docs/pt_BR/guide/hidden-features.md
Normal file
7
website/docs/pt_BR/guide/hidden-features.md
Normal file
@@ -0,0 +1,7 @@
|
||||
# Recursos ocultos
|
||||
|
||||
## .ksurc
|
||||
|
||||
Por padrão, `/system/bin/sh` carrega `/system/etc/mkshrc`.
|
||||
|
||||
Você pode fazer su carregar um arquivo rc personalizado criando um arquivo `/data/adb/ksu/.ksurc`.
|
||||
65
website/docs/pt_BR/guide/how-to-build.md
Normal file
65
website/docs/pt_BR/guide/how-to-build.md
Normal file
@@ -0,0 +1,65 @@
|
||||
# Como construir o KernelSU?
|
||||
|
||||
Primeiro, você deve ler a documentação oficial do Android para construção do kernel:
|
||||
|
||||
1. [Como criar kernels](https://source.android.com/docs/setup/build/building-kernels)
|
||||
2. [Builds de versão de imagem genérica do kernel (GKI)](https://source.android.com/docs/core/architecture/kernel/gki-release-builds)
|
||||
|
||||
::: warning AVISO
|
||||
Esta página é para dispositivos GKI, se você usa um kernel antigo, consulte [Como integrar o KernelSU para kernels não GKI](how-to-integrate-for-non-gki).
|
||||
:::
|
||||
|
||||
## Construir o kernel
|
||||
|
||||
### Sincronize o código-fonte do kernel
|
||||
|
||||
```sh
|
||||
repo init -u https://android.googlesource.com/kernel/manifest
|
||||
mv <kernel_manifest.xml> .repo/manifests
|
||||
repo init -m manifest.xml
|
||||
repo sync
|
||||
```
|
||||
|
||||
O `<kernel_manifest.xml>` é um arquivo de manifesto que pode determinar uma construção exclusivamente, você pode usar o manifesto para fazer uma construção re-preduzível. Você deve baixar o arquivo de manifesto em [compilações de lançamento do Google GKI](https://source.android.com/docs/core/architecture/kernel/gki-release-builds).
|
||||
|
||||
### Construir
|
||||
|
||||
Por favor, verifique [Como criar kernels](https://source.android.com/docs/setup/build/building-kernels) primeiro.
|
||||
|
||||
Por exemplo, precisamos construir a imagem do kernel `aarch64`:
|
||||
|
||||
```sh
|
||||
LTO=thin BUILD_CONFIG=common/build.config.gki.aarch64 build/build.sh
|
||||
```
|
||||
|
||||
Não se esqueça de adicionar o sinalizador `LTO=thin`, caso contrário a compilação poderá falhar se a memória do seu computador for inferior a 24 GB.
|
||||
|
||||
A partir do Android 13, o kernel é construído pelo `bazel`:
|
||||
|
||||
```sh
|
||||
tools/bazel build --config=fast //common:kernel_aarch64_dist
|
||||
```
|
||||
|
||||
## Construir o kernel com KernelSU
|
||||
|
||||
Se você conseguir construir o kernel com sucesso, então construir o KernelSU é muito fácil. Selecione qualquer um executado no diretório raiz de origem do kernel:
|
||||
|
||||
- Tag mais recente (estável)
|
||||
|
||||
```sh
|
||||
curl -LSs "https://raw.githubusercontent.com/tiann/KernelSU/main/kernel/setup.sh" | bash -
|
||||
```
|
||||
|
||||
- branch principal (dev)
|
||||
|
||||
```sh
|
||||
curl -LSs "https://raw.githubusercontent.com/tiann/KernelSU/main/kernel/setup.sh" | bash -s main
|
||||
```
|
||||
|
||||
- Selecione a tag (Como v0.5.2)
|
||||
|
||||
```sh
|
||||
curl -LSs "https://raw.githubusercontent.com/tiann/KernelSU/main/kernel/setup.sh" | bash -s v0.5.2
|
||||
```
|
||||
|
||||
E então reconstrua o kernel e você obterá uma imagem do kernel com KernelSU!
|
||||
251
website/docs/pt_BR/guide/how-to-integrate-for-non-gki.md
Normal file
251
website/docs/pt_BR/guide/how-to-integrate-for-non-gki.md
Normal file
@@ -0,0 +1,251 @@
|
||||
# Como integrar o KernelSU para kernels não GKI?
|
||||
|
||||
O KernelSU pode ser integrado em kernels não GKI e foi portado para 4.14 e versões anteriores.
|
||||
|
||||
Devido à fragmentação de kernels não GKI, não temos uma maneira uniforme de construí-lo, portanto não podemos fornecer imagens boot não GKI. Mas você mesmo pode construir o kernel com o KernelSU integrado.
|
||||
|
||||
Primeiro, você deve ser capaz de construir um kernel inicializável a partir do código-fonte do kernel. Se o kernel não for de código aberto, será difícil executar o KernelSU no seu dispositivo.
|
||||
|
||||
Se você puder construir um kernel inicializável, existem duas maneiras de integrar o KernelSU ao código-fonte do kernel:
|
||||
|
||||
1. Automaticamente com `kprobe`
|
||||
2. Manualmente
|
||||
|
||||
## Integrar com kprobe
|
||||
|
||||
O KernelSU usa kprobe para fazer ganchos de kernel, se o kprobe funcionar bem em seu kernel, é recomendado usar desta forma.
|
||||
|
||||
Primeiro, adicione o KernelSU à árvore de origem do kernel:
|
||||
|
||||
```sh
|
||||
curl -LSs "https://raw.githubusercontent.com/tiann/KernelSU/main/kernel/setup.sh" | bash -
|
||||
```
|
||||
|
||||
Então, você deve verificar se o kprobe está ativado na configuração do seu kernel, se não estiver, adicione estas configurações a ele:
|
||||
|
||||
```
|
||||
CONFIG_KPROBES=y
|
||||
CONFIG_HAVE_KPROBES=y
|
||||
CONFIG_KPROBE_EVENTS=y
|
||||
```
|
||||
|
||||
E construa seu kernel novamente, KernelSU deve funcionar bem.
|
||||
|
||||
Se você descobrir que o KPROBES ainda não está ativado, você pode tentar ativar `CONFIG_MODULES`. (Se ainda assim não surtir efeito, use `make menuconfig` para procurar outras dependências do KPROBES)
|
||||
|
||||
Mas se você entrar em um bootloop quando o KernelSU for integrado, talvez o **kprobe esteja quebrado em seu kernel**, você deve corrigir o bug do kprobe ou usar o segundo caminho.
|
||||
|
||||
:::tip COMO VERIFICAR SE O KPROBE ESTÁ QUEBRADO?
|
||||
|
||||
Comente `ksu_enable_sucompat()` e `ksu_enable_ksud()` em `KernelSU/kernel/ksu.c`, se o dispositivo inicializar normalmente, então o kprobe pode estar quebrado.
|
||||
:::
|
||||
|
||||
## Modifique manualmente a fonte do kernel
|
||||
|
||||
Se o kprobe não funcionar no seu kernel (pode ser um bug do upstream ou do kernel abaixo de 4.8), então você pode tentar desta forma:
|
||||
|
||||
Primeiro, adicione o KernelSU à árvore de origem do kernel:
|
||||
|
||||
- Tag mais recente (estável)
|
||||
|
||||
```sh
|
||||
curl -LSs "https://raw.githubusercontent.com/tiann/KernelSU/main/kernel/setup.sh" | bash -
|
||||
```
|
||||
|
||||
- branch principal (dev)
|
||||
|
||||
```sh
|
||||
curl -LSs "https://raw.githubusercontent.com/tiann/KernelSU/main/kernel/setup.sh" | bash -s main
|
||||
```
|
||||
|
||||
- Selecione a tag (Como v0.5.2)
|
||||
|
||||
```sh
|
||||
curl -LSs "https://raw.githubusercontent.com/tiann/KernelSU/main/kernel/setup.sh" | bash -s v0.5.2
|
||||
```
|
||||
|
||||
Em seguida, adicione chamadas KernelSU à fonte do kernel. Aqui está um patch para referência:
|
||||
|
||||
```diff
|
||||
diff --git a/fs/exec.c b/fs/exec.c
|
||||
index ac59664eaecf..bdd585e1d2cc 100644
|
||||
--- a/fs/exec.c
|
||||
+++ b/fs/exec.c
|
||||
@@ -1890,11 +1890,14 @@ static int __do_execve_file(int fd, struct filename *filename,
|
||||
return retval;
|
||||
}
|
||||
|
||||
+extern bool ksu_execveat_hook __read_mostly;
|
||||
+extern int ksu_handle_execveat(int *fd, struct filename **filename_ptr, void *argv,
|
||||
+ void *envp, int *flags);
|
||||
+extern int ksu_handle_execveat_sucompat(int *fd, struct filename **filename_ptr,
|
||||
+ void *argv, void *envp, int *flags);
|
||||
static int do_execveat_common(int fd, struct filename *filename,
|
||||
struct user_arg_ptr argv,
|
||||
struct user_arg_ptr envp,
|
||||
int flags)
|
||||
{
|
||||
+ if (unlikely(ksu_execveat_hook))
|
||||
+ ksu_handle_execveat(&fd, &filename, &argv, &envp, &flags);
|
||||
+ else
|
||||
+ ksu_handle_execveat_sucompat(&fd, &filename, &argv, &envp, &flags);
|
||||
return __do_execve_file(fd, filename, argv, envp, flags, NULL);
|
||||
}
|
||||
|
||||
diff --git a/fs/open.c b/fs/open.c
|
||||
index 05036d819197..965b84d486b8 100644
|
||||
--- a/fs/open.c
|
||||
+++ b/fs/open.c
|
||||
@@ -348,6 +348,8 @@ SYSCALL_DEFINE4(fallocate, int, fd, int, mode, loff_t, offset, loff_t, len)
|
||||
return ksys_fallocate(fd, mode, offset, len);
|
||||
}
|
||||
|
||||
+extern int ksu_handle_faccessat(int *dfd, const char __user **filename_user, int *mode,
|
||||
+ int *flags);
|
||||
/*
|
||||
* access() needs to use the real uid/gid, not the effective uid/gid.
|
||||
* We do this by temporarily clearing all FS-related capabilities and
|
||||
@@ -355,6 +357,7 @@ SYSCALL_DEFINE4(fallocate, int, fd, int, mode, loff_t, offset, loff_t, len)
|
||||
*/
|
||||
long do_faccessat(int dfd, const char __user *filename, int mode)
|
||||
{
|
||||
+ ksu_handle_faccessat(&dfd, &filename, &mode, NULL);
|
||||
const struct cred *old_cred;
|
||||
struct cred *override_cred;
|
||||
struct path path;
|
||||
diff --git a/fs/read_write.c b/fs/read_write.c
|
||||
index 650fc7e0f3a6..55be193913b6 100644
|
||||
--- a/fs/read_write.c
|
||||
+++ b/fs/read_write.c
|
||||
@@ -434,10 +434,14 @@ ssize_t kernel_read(struct file *file, void *buf, size_t count, loff_t *pos)
|
||||
}
|
||||
EXPORT_SYMBOL(kernel_read);
|
||||
|
||||
+extern bool ksu_vfs_read_hook __read_mostly;
|
||||
+extern int ksu_handle_vfs_read(struct file **file_ptr, char __user **buf_ptr,
|
||||
+ size_t *count_ptr, loff_t **pos);
|
||||
ssize_t vfs_read(struct file *file, char __user *buf, size_t count, loff_t *pos)
|
||||
{
|
||||
ssize_t ret;
|
||||
|
||||
+ if (unlikely(ksu_vfs_read_hook))
|
||||
+ ksu_handle_vfs_read(&file, &buf, &count, &pos);
|
||||
+
|
||||
if (!(file->f_mode & FMODE_READ))
|
||||
return -EBADF;
|
||||
if (!(file->f_mode & FMODE_CAN_READ))
|
||||
diff --git a/fs/stat.c b/fs/stat.c
|
||||
index 376543199b5a..82adcef03ecc 100644
|
||||
--- a/fs/stat.c
|
||||
+++ b/fs/stat.c
|
||||
@@ -148,6 +148,8 @@ int vfs_statx_fd(unsigned int fd, struct kstat *stat,
|
||||
}
|
||||
EXPORT_SYMBOL(vfs_statx_fd);
|
||||
|
||||
+extern int ksu_handle_stat(int *dfd, const char __user **filename_user, int *flags);
|
||||
+
|
||||
/**
|
||||
* vfs_statx - Get basic and extra attributes by filename
|
||||
* @dfd: A file descriptor representing the base dir for a relative filename
|
||||
@@ -170,6 +172,7 @@ int vfs_statx(int dfd, const char __user *filename, int flags,
|
||||
int error = -EINVAL;
|
||||
unsigned int lookup_flags = LOOKUP_FOLLOW | LOOKUP_AUTOMOUNT;
|
||||
|
||||
+ ksu_handle_stat(&dfd, &filename, &flags);
|
||||
if ((flags & ~(AT_SYMLINK_NOFOLLOW | AT_NO_AUTOMOUNT |
|
||||
AT_EMPTY_PATH | KSTAT_QUERY_FLAGS)) != 0)
|
||||
return -EINVAL;
|
||||
```
|
||||
|
||||
Você deve encontrar as quatro funções no código-fonte do kernel:
|
||||
|
||||
1. do_faccessat, geralmente em `fs/open.c`
|
||||
2. do_execveat_common, geralmente em `fs/exec.c`
|
||||
3. vfs_read, geralmente em `fs/read_write.c`
|
||||
4. vfs_statx, geralmente em `fs/stat.c`
|
||||
|
||||
Se o seu kernel não tiver `vfs_statx`, use `vfs_fstatat`:
|
||||
|
||||
```diff
|
||||
diff --git a/fs/stat.c b/fs/stat.c
|
||||
index 068fdbcc9e26..5348b7bb9db2 100644
|
||||
--- a/fs/stat.c
|
||||
+++ b/fs/stat.c
|
||||
@@ -87,6 +87,8 @@ int vfs_fstat(unsigned int fd, struct kstat *stat)
|
||||
}
|
||||
EXPORT_SYMBOL(vfs_fstat);
|
||||
|
||||
+extern int ksu_handle_stat(int *dfd, const char __user **filename_user, int *flags);
|
||||
+
|
||||
int vfs_fstatat(int dfd, const char __user *filename, struct kstat *stat,
|
||||
int flag)
|
||||
{
|
||||
@@ -94,6 +96,8 @@ int vfs_fstatat(int dfd, const char __user *filename, struct kstat *stat,
|
||||
int error = -EINVAL;
|
||||
unsigned int lookup_flags = 0;
|
||||
|
||||
+ ksu_handle_stat(&dfd, &filename, &flag);
|
||||
+
|
||||
if ((flag & ~(AT_SYMLINK_NOFOLLOW | AT_NO_AUTOMOUNT |
|
||||
AT_EMPTY_PATH)) != 0)
|
||||
goto out;
|
||||
```
|
||||
|
||||
Para kernels anteriores ao 4.17, se você não conseguir encontrar `do_faccessat`, basta ir até a definição do syscall `faccessat` e fazer a chamada lá:
|
||||
|
||||
```diff
|
||||
diff --git a/fs/open.c b/fs/open.c
|
||||
index 2ff887661237..e758d7db7663 100644
|
||||
--- a/fs/open.c
|
||||
+++ b/fs/open.c
|
||||
@@ -355,6 +355,9 @@ SYSCALL_DEFINE4(fallocate, int, fd, int, mode, loff_t, offset, loff_t, len)
|
||||
return error;
|
||||
}
|
||||
|
||||
+extern int ksu_handle_faccessat(int *dfd, const char __user **filename_user, int *mode,
|
||||
+ int *flags);
|
||||
+
|
||||
/*
|
||||
* access() needs to use the real uid/gid, not the effective uid/gid.
|
||||
* We do this by temporarily clearing all FS-related capabilities and
|
||||
@@ -370,6 +373,8 @@ SYSCALL_DEFINE3(faccessat, int, dfd, const char __user *, filename, int, mode)
|
||||
int res;
|
||||
unsigned int lookup_flags = LOOKUP_FOLLOW;
|
||||
|
||||
+ ksu_handle_faccessat(&dfd, &filename, &mode, NULL);
|
||||
+
|
||||
if (mode & ~S_IRWXO) /* where's F_OK, X_OK, W_OK, R_OK? */
|
||||
return -EINVAL;
|
||||
```
|
||||
|
||||
Para ativar o Modo de Segurança integrado do KernelSU, você também deve modificar `input_handle_event` em `drivers/input/input.c`:
|
||||
|
||||
:::tip DICA
|
||||
É altamente recomendável ativar este recurso, é muito útil para evitar bootloops!
|
||||
:::
|
||||
|
||||
```diff
|
||||
diff --git a/drivers/input/input.c b/drivers/input/input.c
|
||||
index 45306f9ef247..815091ebfca4 100755
|
||||
--- a/drivers/input/input.c
|
||||
+++ b/drivers/input/input.c
|
||||
@@ -367,10 +367,13 @@ static int input_get_disposition(struct input_dev *dev,
|
||||
return disposition;
|
||||
}
|
||||
|
||||
+extern bool ksu_input_hook __read_mostly;
|
||||
+extern int ksu_handle_input_handle_event(unsigned int *type, unsigned int *code, int *value);
|
||||
+
|
||||
static void input_handle_event(struct input_dev *dev,
|
||||
unsigned int type, unsigned int code, int value)
|
||||
{
|
||||
int disposition = input_get_disposition(dev, type, code, &value);
|
||||
+
|
||||
+ if (unlikely(ksu_input_hook))
|
||||
+ ksu_handle_input_handle_event(&type, &code, &value);
|
||||
|
||||
if (disposition != INPUT_IGNORE_EVENT && type != EV_SYN)
|
||||
add_input_randomness(type, code, value);
|
||||
```
|
||||
|
||||
Finalmente, construa seu kernel novamente, e então, o KernelSU deve funcionar bem.
|
||||
169
website/docs/pt_BR/guide/installation.md
Normal file
169
website/docs/pt_BR/guide/installation.md
Normal file
@@ -0,0 +1,169 @@
|
||||
# Instalação
|
||||
|
||||
## Verifique se o seu dispositivo é compatível
|
||||
|
||||
Baixe o app gerenciador KernelSU em [GitHub Releases](https://github.com/tiann/KernelSU/releases) ou [Coolapk market](https://www.coolapk.com/apk/me.weishu.kernelsu), e instale-o no seu dispositivo:
|
||||
|
||||
- Se o app mostrar `Sem suporte`, significa que **você deve compilar o kernel sozinho**, o KernelSU não fornecerá e nunca fornecerá uma boot image para você instalar.
|
||||
- Se o app mostrar `Não instalado`, então seu dispositivo é oficialmente suportado pelo KernelSU.
|
||||
|
||||
::: info INFORMAÇÕES
|
||||
Para dispositivos mostrando `Sem suporte`, aqui está os [Dispositivos com suporte não oficial](unofficially-support-devices.md), você mesmo pode compilar o kernel.
|
||||
:::
|
||||
|
||||
## Backup padrão do boot.img
|
||||
|
||||
Antes de fleshar, você deve primeiro fazer backup do seu boot.img padrão. Se você encontrar algum bootloop, você sempre pode restaurar o sistema voltando para o boot de fábrica usando o fastboot.
|
||||
|
||||
::: warning AVISO
|
||||
Fleshar pode causar perda de dados, certifique-se de executar esta etapa bem antes de prosseguir para a próxima! Você também pode fazer backup de todos os dados do seu telefone, se necessário.
|
||||
:::
|
||||
|
||||
## Conhecimento necessário
|
||||
|
||||
### ADB e fastboot
|
||||
|
||||
Por padrão, você usará as ferramentas ADB e fastboot neste tutorial, portanto, se você não as conhece, recomendamos pesquisar para aprender sobre elas primeiro.
|
||||
|
||||
### KMI
|
||||
|
||||
Kernel Module Interface (KMI), versões de kernel com o mesmo KMI são **compatíveis**, isso é o que "geral" significa no GKI; por outro lado, se o KMI for diferente, então esses kernels não são compatíveis entre si, e atualizar uma imagem do kernel com um KMI diferente do seu dispositivo pode causar um bootloop.
|
||||
|
||||
Especificamente, para dispositivos GKI, o formato da versão do kernel deve ser o seguinte:
|
||||
|
||||
```txt
|
||||
KernelRelease :=
|
||||
Version.PatchLevel.SubLevel-AndroidRelease-KmiGeneration-suffix
|
||||
w .x .y -zzz -k -something
|
||||
```
|
||||
|
||||
`w.x-zzz-k` é a versão KMI. Por exemplo, se a versão do kernel de um dispositivo for `5.10.101-android12-9-g30979850fc20`, então seu KMI será `5.10-android12-9`. Teoricamente, ele pode inicializar normalmente com outros kernels KMI.
|
||||
|
||||
::: tip DICA
|
||||
Observe que o SubLevel na versão do kernel não faz parte do KMI! Isso significa que `5.10.101-android12-9-g30979850fc20` tem o mesmo KMI que `5.10.137-android12-9-g30979850fc20`!
|
||||
:::
|
||||
|
||||
### Versão do kernel vs Versão do Android
|
||||
|
||||
Por favor, observe: **A versão do kernel e a versão do Android não são necessariamente iguais!**
|
||||
|
||||
Se você descobrir que a versão do seu kernel é `android12-5.10.101`, mas a versão do seu sistema Android é Android 13 ou outra, não se surpreenda, pois o número da versão do sistema Android não é necessariamente igual ao número da versão do kernel Linux. O número da versão do kernel Linux geralmente é consistente com a versão do sistema Android que acompanha o **dispositivo quando ele é enviado**. Se o sistema Android for atualizado posteriormente, a versão do kernel geralmente não será alterada. Se você precisar fazer o flash, **por favor, consulte sempre a versão do kernel!**
|
||||
|
||||
## Introdução
|
||||
|
||||
Existem vários métodos de instalação do KernelSU, cada um adequado para um cenário diferente, portanto escolha conforme necessário.
|
||||
|
||||
1. Instalar com Recovery personalizado (por exemplo, TWRP)
|
||||
2. Instalar com um app kernel flash, como Franco Kernel Manager
|
||||
3. Instalar com fastboot usando o boot.img fornecido por KernelSU
|
||||
4. Repare o boot.img manualmente e instale-o
|
||||
|
||||
## Instalar com Recovery personalizado
|
||||
|
||||
Pré-requisito: Seu dispositivo deve ter um Recovery personalizado, como TWRP. Se apenas o Recovery oficial estiver disponível, use outro método.
|
||||
|
||||
Etapa:
|
||||
|
||||
1. Na [página de lançamento](https://github.com/tiann/KernelSU/releases) do KernelSU, baixe o pacote zip começando com AnyKernel3 que corresponde à versão do seu telefone; por exemplo, a versão do kernel do telefone é `android12-5.10. 66`, então você deve baixar o arquivo `AnyKernel3-android12-5.10.66_yyyy-MM.zip` (onde `yyyy` é o ano e `MM` é o mês).
|
||||
2. Reinicie o telefone no TWRP.
|
||||
3. Use o adb para colocar AnyKernel3-*.zip no telefone /sdcard e escolha instalá-lo na interface do TWRP; ou você pode diretamente `adb sideload AnyKernel-*.zip` para instalar.
|
||||
|
||||
PS. Este método é adequado para qualquer instalação (não limitado à instalação inicial ou atualizações subsequentes), desde que você use TWRP.
|
||||
|
||||
## Instalar com Kernel Flasher
|
||||
|
||||
Pré-requisito: Seu dispositivo deve estar rooteado. Por exemplo, você instalou o Magisk para obter root ou instalou uma versão antiga do KernelSU e precisa atualizar para outra versão do KernelSU. Se o seu dispositivo não estiver rooteado, tente outros métodos.
|
||||
|
||||
Etapa:
|
||||
|
||||
1. Baixe o zip AnyKernel3; consulte a seção *Instalar com Recovery personalizado* para obter instruções de download.
|
||||
2. Abra o app Kernel Flash e use o zip AnyKernel3 fornecido para fazer o flash.
|
||||
|
||||
Se você nunca usou algum app kernel flash antes, os seguintes são os mais populares.
|
||||
|
||||
1. [Kernel Flasher](https://github.com/capntrips/KernelFlasher/releases)
|
||||
2. [Franco Kernel Manager](https://play.google.com/store/apps/details?id=com.franco.kernel)
|
||||
3. [Ex Kernel Manager](https://play.google.com/store/apps/details?id=flar2.exkernelmanager)
|
||||
|
||||
PS. Este método é mais conveniente ao atualizar o KernelSU e pode ser feito sem um computador (backup primeiro).
|
||||
|
||||
## Instalar com o boot.img fornecido por KernelSU
|
||||
|
||||
Este método não requer que você tenha TWRP, nem que seu telefone tenha privilégios de root; é adequado para sua primeira instalação do KernelSU.
|
||||
|
||||
### Encontre o boot.img adequado
|
||||
|
||||
O KernelSU fornece um boot.img genérico para dispositivos GKI e você deve liberar o boot.img para a partição boot do dispositivo.
|
||||
|
||||
Você pode baixar o boot.img em [GitHub Release](https://github.com/tiann/KernelSU/releases), por favor, observe que você deve usar a versão correta do boot.img. Por exemplo, se o seu dispositivo exibe o kernel `android12-5.10.101` , você precisa baixar `android-5.10.101_yyyy-MM.boot-<format>.img`. (Mantenha o KMI consistente!)
|
||||
|
||||
Onde `<format>` se refere ao formato de compactação do kernel do seu boot.img oficial, por favor, verifique o formato de compactação do kernel de seu boot.img original. Você deve usar o formato correto, por exemplo: `lz4`, `gz`. Se você usar um formato de compactação incorreto, poderá encontrar bootloop.
|
||||
|
||||
::: info INFORMAÇÕES
|
||||
1. Você pode usar o magiskboot para obter o formato de compactação de seu boot original; é claro que você também pode perguntar a outras pessoas mais experientes com o mesmo modelo do seu dispositivo. Além disso, o formato de compactação do kernel geralmente não muda, portanto, se você inicializar com êxito com um determinado formato de compactação, poderá tentar esse formato mais tarde.
|
||||
2. Os dispositivos Xiaomi geralmente usam `gz` ou `uncompressed`.
|
||||
3. Para dispositivos Pixel, siga as instruções abaixo.
|
||||
:::
|
||||
|
||||
### Flash boot.img para o dispositivo
|
||||
|
||||
Use o `adb` para conectar seu dispositivo, execute `adb reboot bootloader` para entrar no modo fastboot e use este comando para atualizar o KernelSU:
|
||||
|
||||
```sh
|
||||
fastboot flash boot boot.img
|
||||
```
|
||||
|
||||
::: info INFORMAÇÕES
|
||||
Se o seu dispositivo suportar `fastboot boot`, você pode usar primeiro `fastboot boot boot.img` para tentar usar o boot.img para inicializar o sistema primeiro. Se algo inesperado acontecer, reinicie-o novamente para inicializar.
|
||||
:::
|
||||
|
||||
### Reiniciar
|
||||
|
||||
Após a conclusão do flash, você deve reiniciar o dispositivo:
|
||||
|
||||
```sh
|
||||
fastboot reboot
|
||||
```
|
||||
|
||||
## Corrigir boot.img manualmente
|
||||
|
||||
Para alguns dispositivos, o formato boot.img não é tão comum, como `lz4`, `gz` e `uncompressed`. O mais típico é o Pixel, seu formato boot.img é `lz4_legacy` compactado, ramdisk pode ser `gz` também pode ser compactado `lz4_legacy`. Neste momento, se você fleshar diretamente o boot.img fornecido pelo KernelSU, o telefone pode não conseguir inicializar. Neste momento, você pode corrigir manualmente o boot.img para conseguir isso.
|
||||
|
||||
Geralmente existem dois métodos de patch:
|
||||
|
||||
1. [Android-Image-Kitchen](https://forum.xda-developers.com/t/tool-android-image-kitchen-unpack-repack-kernel-ramdisk-win-android-linux-mac.2073775/)
|
||||
2. [magiskboot](https://github.com/topjohnwu/Magisk/releases)
|
||||
|
||||
Entre eles, o Android-Image-Kitchen é adequado para operação no PC e o magiskboot precisa da cooperação do telefone.
|
||||
|
||||
### Preparação
|
||||
|
||||
1. Obtenha o boot.img padrão do telefone; você pode obtê-lo com os fabricantes do seu dispositivo, você pode precisar do [payload-dumper-go](https://github.com/ssut/payload-dumper-go).
|
||||
2. Baixe o arquivo zip AnyKernel3 fornecido pelo KernelSU que corresponde à versão KMI do seu dispositivo (você pode consultar *Instalar com Recovery personalizado*).
|
||||
3. Descompacte o pacote AnyKernel3 e obtenha o arquivo `Image`, que é o arquivo do kernel do KernelSU.
|
||||
|
||||
### Usando o Android-Image-Kitchen
|
||||
|
||||
1. Baixe o Android-Image-Kitchen para o seu computador.
|
||||
2. Coloque o boot.img padrão na pasta raiz do Android-Image-Kitchen.
|
||||
3. Execute `./unpackimg.sh boot.img` no diretório raiz do Android-Image-Kitchen, este comando descompactará o boot.img e você obterá alguns arquivos.
|
||||
4. Substitua `boot.img-kernel` no diretório `split_img` pela `Image` que você extraiu do AnyKernel3 (observe a mudança de nome para boot.img-kernel).
|
||||
5. Execute `./repackimg.sh` no diretório raiz de 在 Android-Image-Kitchen, e você obterá um arquivo chamado `image-new.img`. Faça o flash deste boot.img por fastboot (consulte a seção anterior).
|
||||
|
||||
### Usando o magiskboot
|
||||
|
||||
1. Baixe o Magisk mais recente em [GitHub Releases](https://github.com/topjohnwu/Magisk/releases).
|
||||
2. Renomeie o Magisk-*.apk para Magisk-vesion.zip e descompacte-o.
|
||||
3. Envie `Magisk-v25.2/lib/arm64-v8a/libmagiskboot.so` para o seu dispositivo por adb: `adb push Magisk-v25.2/lib/arm64-v8a/libmagiskboot.so /data/local/tmp/magiskboot`.
|
||||
4. Envie o boot.img padrão e Image em AnyKernel3 para o seu dispositivo.
|
||||
5. Entre no diretório adb shell e cd `/data/local/tmp/` e, em seguida, `chmod +x magiskboot`.
|
||||
6. Entre no shell adb e no diretório cd `/data/local/tmp/`, execute `./magiskboot unpack boot.img` para descompactar `boot.img`, você obterá um arquivo `kernel`, este é o seu kernel padrão.
|
||||
7. Substitua `kernel` por `Image`: `mv -f Image kernel`.
|
||||
8. Execute `./magiskboot repack boot.img` para reembalar o boot.img, e você obterá um arquivo `new-boot.img`, faça o flash deste arquivo para o dispositivo por fastboot.
|
||||
|
||||
## Outros métodos
|
||||
|
||||
Na verdade, todos esses métodos de instalação têm apenas uma ideia principal, que é **substituir o kernel original pelo fornecido pelo KernelSU**, desde que isso possa ser alcançado, ele pode ser instalado. Por exemplo, a seguir estão outros métodos possíveis.
|
||||
|
||||
1. Primeiro instale o Magisk, obtenha privilégios de root através do Magisk e então use o kernel flasher para fazer o flash no zip AnyKernel do KernelSU.
|
||||
2. Use algum kit de ferramentas de flash em PCs para fleshar no kernel fornecido pelo KernelSU.
|
||||
259
website/docs/pt_BR/guide/module.md
Normal file
259
website/docs/pt_BR/guide/module.md
Normal file
@@ -0,0 +1,259 @@
|
||||
# Guias de módulo
|
||||
|
||||
O KernelSU fornece um mecanismo de módulo que consegue modificar o diretório do sistema enquanto mantém a integridade da partição do sistema. Este mecanismo é conhecido como "sem sistema".
|
||||
|
||||
O mecanismo de módulo do KernelSU é quase o mesmo do Magisk. Se você está familiarizado com o desenvolvimento de módulos Magisk, o desenvolvimento de módulos KernelSU é muito semelhante. Você pode pular a introdução dos módulos abaixo e só precisa ler [Diferença com Magisk](difference-with-magisk.md).
|
||||
|
||||
## BusyBox
|
||||
|
||||
O KernelSU vem com um recurso binário BusyBox completo (incluindo suporte completo ao SELinux). O executável está localizado em `/data/adb/ksu/bin/busybox`. O BusyBox do KernelSU suporta o "ASH Standalone Shell Mode" alternável em tempo de execução. O que este Modo Autônomo significa é que ao executar no shell `ash` do BusyBox, cada comando usará diretamente o miniaplicativo dentro do BusyBox, independentemente do que estiver definido como `PATH`. Por exemplo, comandos como `ls`, `rm`, `chmod` **NÃO** usarão o que está em `PATH` (no caso do Android por padrão será `/system/bin/ls`, `/system/bin/rm` e `/system/bin/chmod` respectivamente), mas em vez disso chamará diretamente os miniaplicativos internos do BusyBox. Isso garante que os scripts sempre sejam executados em um ambiente previsível e sempre tenham o conjunto completo de comandos, independentemente da versão do Android em que estão sendo executados. Para forçar um comando a **NÃO** usar o BusyBox, você deve chamar o executável com caminhos completos.
|
||||
|
||||
Cada script shell executado no contexto do KernelSU será executado no shell `ash` do BusyBox com o Modo Autônomo ativado. Para o que é relevante para desenvolvedores terceirizados, isso inclui todos os scripts de inicialização e scripts de instalação de módulos.
|
||||
|
||||
Para aqueles que desejam usar o recurso “Modo Autônomo” fora do KernelSU, existem 2 maneiras de ativá-los:
|
||||
|
||||
1. Defina a variável de ambiente `ASH_STANDALONE` como `1`<br>Exemplo: `ASH_STANDALONE=1 /data/adb/ksu/bin/busybox sh <script>`
|
||||
2. Alternar com opções de linha de comando:<br>`/data/adb/ksu/bin/busybox sh -o standalone <script>`
|
||||
|
||||
Para garantir que todos os shells `sh` subsequentes executados também sejam executados no Modo Autônomo, a opção 1 é o método preferido (e é isso que o KernelSU e o gerenciador KernelSU usam internamente), pois as variáveis de ambiente são herdadas para os subprocesso.
|
||||
|
||||
::: tip DIFERENÇA COM MAGISK
|
||||
|
||||
O BusyBox do KernelSU agora está usando o arquivo binário compilado diretamente do projeto Magisk. **Obrigado ao Magisk!** Portanto, você não precisa se preocupar com problemas de compatibilidade entre scripts BusyBox no Magisk e KernelSU porque eles são exatamente iguais!
|
||||
:::
|
||||
|
||||
## Módulos KernelSU
|
||||
|
||||
Um módulo KernelSU é uma pasta colocada em `/data/adb/modules` com a estrutura abaixo:
|
||||
|
||||
```txt
|
||||
/data/adb/modules
|
||||
├── .
|
||||
├── .
|
||||
|
|
||||
├── $MODID <--- A pasta é nomeada com o ID do módulo
|
||||
│ │
|
||||
│ │ *** Identidade do Módulo ***
|
||||
│ │
|
||||
│ ├── module.prop <--- Este arquivo armazena os metadados do módulo
|
||||
│ │
|
||||
│ │ *** Conteúdo Principal ***
|
||||
│ │
|
||||
│ ├── system <--- Esta pasta será montada se skip_mount não existir
|
||||
│ │ ├── ...
|
||||
│ │ ├── ...
|
||||
│ │ └── ...
|
||||
│ │
|
||||
│ │ *** Sinalizadores de Status ***
|
||||
│ │
|
||||
│ ├── skip_mount <--- Se existir, o KernelSU NÃO montará sua pasta de sistema
|
||||
│ ├── disable <--- Se existir, o módulo será desabilitado
|
||||
│ ├── remove <--- Se existir, o módulo será removido na próxima reinicialização
|
||||
│ │
|
||||
│ │ *** Arquivos Opcionais ***
|
||||
│ │
|
||||
│ ├── post-fs-data.sh <--- Este script será executado em post-fs-data
|
||||
│ ├── post-mount.sh <--- Este script será executado em post-mount
|
||||
│ ├── service.sh <--- Este script será executado no late_start service
|
||||
│ ├── boot-completed.sh <--- Este script será executado na inicialização concluída
|
||||
| ├── uninstall.sh <--- Este script será executado quando o KernelSU remover seu módulo
|
||||
│ ├── system.prop <--- As propriedades neste arquivo serão carregadas como propriedades do sistema por resetprop
|
||||
│ ├── sepolicy.rule <--- Regras adicionais de sepolicy personalizadas
|
||||
│ │
|
||||
│ │ *** Gerado Automaticamente, NÃO CRIE OU MODIFIQUE MANUALMENTE ***
|
||||
│ │
|
||||
│ ├── vendor <--- Um link simbólico para $MODID/system/vendor
|
||||
│ ├── product <--- Um link simbólico para $MODID/system/product
|
||||
│ ├── system_ext <--- Um link simbólico para $MODID/system/system_ext
|
||||
│ │
|
||||
│ │ *** Quaisquer arquivos/pastas adicionais são permitidos ***
|
||||
│ │
|
||||
│ ├── ...
|
||||
│ └── ...
|
||||
|
|
||||
├── another_module
|
||||
│ ├── .
|
||||
│ └── .
|
||||
├── .
|
||||
├── .
|
||||
```
|
||||
|
||||
::: tip DIFERENÇA COM MAGISK
|
||||
O KernelSU não possui suporte integrado para o Zygisk, portanto não há conteúdo relacionado ao Zygisk no módulo. No entanto, você pode usar [ZygiskOnKernelSU](https://github.com/Dr-TSNG/ZygiskOnKernelSU) para suportar módulos Zygisk. Neste caso, o conteúdo do módulo Zygisk é idêntico ao suportado pelo Magisk.
|
||||
:::
|
||||
|
||||
### module.prop
|
||||
|
||||
`module.prop` é um arquivo de configuração para um módulo. No KernelSU, se um módulo não contiver este arquivo, ele não será reconhecido como um módulo. O formato deste arquivo é o seguinte:
|
||||
|
||||
```txt
|
||||
id=<string>
|
||||
name=<string>
|
||||
version=<string>
|
||||
versionCode=<int>
|
||||
author=<string>
|
||||
description=<string>
|
||||
```
|
||||
|
||||
- `id` deve corresponder a esta expressão regular: `^[a-zA-Z][a-zA-Z0-9._-]+$`<br>
|
||||
Exemplo: ✓ `a_module`, ✓ `a.module`, ✓ `module-101`, ✗ `a module`, ✗ `1_module`, ✗ `-a-module`<br>
|
||||
Este é o **identificador exclusivo** do seu módulo. Você não deve alterá-lo depois de publicado.
|
||||
- `versionCode` deve ser um **inteiro**. Isso é usado para comparar versões
|
||||
- Outros que não foram mencionados acima podem ser qualquer string de **linha única**.
|
||||
- Certifique-se de usar o tipo de quebra de linha `UNIX (LF)` e não o `Windows (CR+LF)` ou `Macintosh (CR)`.
|
||||
|
||||
### Shell scripts
|
||||
|
||||
Por favor, leia a seção [Scripts de inicialização](#scripts-de-inicializacao) para entender a diferença entre `post-fs-data.sh` e `service.sh`. Para a maioria dos desenvolvedores de módulos, `service.sh` deve ser bom o suficiente se você precisar apenas executar um script de inicialização. Se precisar executar o script após a inicialização ser concluída, use `boot-completed.sh`. Se você quiser fazer algo após montar overlayfs, use `post-mount.sh`.
|
||||
|
||||
Em todos os scripts do seu módulo, use `MODDIR=${0%/*}` para obter o caminho do diretório base do seu módulo, **NÃO** codifique o caminho do seu módulo em scripts.
|
||||
|
||||
::: tip DIFERENÇA COM MAGISK
|
||||
Você pode usar a variável de ambiente `KSU` para determinar se um script está sendo executado no KernelSU ou Magisk. Se estiver executando no KernelSU, esse valor será definido como `true`.
|
||||
:::
|
||||
|
||||
### Diretório `system`
|
||||
|
||||
O conteúdo deste diretório será sobreposto à partição /system do sistema usando overlayfs após a inicialização do sistema. Isso significa que:
|
||||
|
||||
1. Arquivos com o mesmo nome daqueles no diretório correspondente no sistema serão substituídos pelos arquivos deste diretório.
|
||||
2. Pastas com o mesmo nome daquelas no diretório correspondente no sistema serão mescladas com as pastas neste diretório.
|
||||
|
||||
Se você deseja excluir um arquivo ou pasta no diretório original do sistema, você precisa criar um arquivo com o mesmo nome do arquivo/pasta no diretório do módulo usando `mknod filename c 0 0`. Dessa forma, o sistema overlayfs irá automaticamente "branquear" este arquivo como se ele tivesse sido excluído (a partição /system não foi realmente alterada).
|
||||
|
||||
Você também pode declarar uma variável chamada `REMOVE` contendo uma lista de diretórios em `customize.sh` para executar operações de remoção, e o KernelSU executará automaticamente `mknod <TARGET> c 0 0` nos diretórios correspondentes do módulo. Por exemplo:
|
||||
|
||||
```sh
|
||||
REMOVE="
|
||||
/system/app/YouTube
|
||||
/system/app/Bloatware
|
||||
"
|
||||
```
|
||||
|
||||
A lista acima irá executar `mknod $MODPATH/system/app/YouTube c 0 0` e `mknod $MODPATH/system/app/Bloatware c 0 0`; e `/system/app/YouTube` e `/system/app/Bloatware` serão removidos após o módulo entrar em vigor.
|
||||
|
||||
Se você deseja substituir um diretório no sistema, você precisa criar um diretório com o mesmo caminho no diretório do módulo e, em seguida, definir o atributo `setfattr -n trusted.overlay.opaque -v y <TARGET>` para este diretório. Desta forma, o sistema overlayfs substituirá automaticamente o diretório correspondente no sistema (sem alterar a partição /system).
|
||||
|
||||
Você pode declarar uma variável chamada `REPLACE` em seu arquivo `customize.sh`, que inclui uma lista de diretórios a serem substituídos, e o KernelSU executará automaticamente as operações correspondentes em seu diretório de módulo. Por exemplo:
|
||||
|
||||
```sh
|
||||
REPLACE="
|
||||
/system/app/YouTube
|
||||
/system/app/Bloatware
|
||||
"
|
||||
```
|
||||
|
||||
Esta lista criará automaticamente os diretórios `$MODPATH/system/app/YouTube` e `$MODPATH/system/app/Bloatware` e, em seguida, executará `setfattr -n trusted.overlay.opaque -v y $MODPATH/system/app/YouTube` e `setfattr -n trusted.overlay.opaque -v y $MODPATH/system/app/Bloatware`. Após o módulo entrar em vigor, `/system/app/YouTube` e `/system/app/Bloatware` serão substituídos por diretórios vazios.
|
||||
|
||||
::: tip DIFERENÇA COM MAGISK
|
||||
|
||||
O mecanismo sem sistema do KernelSU é implementado através do overlayfs do kernel, enquanto o Magisk atualmente usa montagem mágica (montagem de ligação). Os dois métodos de implementação têm diferenças significativas, mas o objetivo final é o mesmo: modificar os arquivos /system sem modificar fisicamente a partição /system.
|
||||
:::
|
||||
|
||||
Se você estiver interessado em overlayfs, é recomendável ler a [documentação sobre overlayfs](https://docs.kernel.org/filesystems/overlayfs.html) do Kernel Linux.
|
||||
|
||||
### system.prop
|
||||
|
||||
Este arquivo segue o mesmo formato de `build.prop`. Cada linha é composta por `[key]=[value]`.
|
||||
|
||||
### sepolicy.rule
|
||||
|
||||
Se o seu módulo exigir alguns patches adicionais de sepolicy, adicione essas regras a este arquivo. Cada linha neste arquivo será tratada como uma declaração de política.
|
||||
|
||||
## Instalador do módulo
|
||||
|
||||
Um instalador do módulo KernelSU é um módulo KernelSU empacotado em um arquivo zip que pode ser atualizado no app gerenciador KernelSU. O instalador do módulo KernelSU mais simples é apenas um módulo KernelSU compactado como um arquivo zip.
|
||||
|
||||
```txt
|
||||
module.zip
|
||||
│
|
||||
├── customize.sh <--- (Opcional, mais detalhes posteriormente)
|
||||
│ Este script será fornecido por update-binary
|
||||
├── ...
|
||||
├── ... /* O resto dos arquivos do módulo */
|
||||
│
|
||||
```
|
||||
|
||||
::: warning AVISO
|
||||
O módulo KernelSU **NÃO** é compatível para instalação no Recovery personalizado!
|
||||
:::
|
||||
|
||||
### Personalização
|
||||
|
||||
Se você precisar personalizar o processo de instalação do módulo, opcionalmente você pode criar um script no instalador chamado `customize.sh`. Este script será **sourced** (não executado!) pelo script do instalador do módulo depois que todos os arquivos forem extraídos e as permissões padrão e o contexto secundário forem aplicados. Isso é muito útil se o seu módulo exigir configuração adicional com base na API do dispositivo ou se você precisar definir permissões/secontext especiais para alguns dos arquivos do seu módulo.
|
||||
|
||||
Se você quiser controlar e personalizar totalmente o processo de instalação, declare `SKIPUNZIP=1` em `customize.sh` para pular todas as etapas de instalação padrão. Ao fazer isso, seu `customize.sh` será responsável por instalar tudo sozinho.
|
||||
|
||||
O script `customize.sh` é executado no shell BusyBox `ash` do KernelSU com o "Modo Autônomo" ativado. As seguintes variáveis e funções estão disponíveis:
|
||||
|
||||
#### Variáveis
|
||||
|
||||
- `KSU` (bool): uma variável para marcar que o script está sendo executado no ambiente KernelSU, e o valor desta variável sempre será `true`. Você pode usá-lo para distinguir entre KernelSU e Magisk.
|
||||
- `KSU_VER` (string): a string da versão do KernelSU atualmente instalado (por exemplo, `v0.4.0`).
|
||||
- `KSU_VER_CODE` (int): o código da versão do KernelSU atualmente instalado no espaço do usuário (por exemplo: `10672`).
|
||||
- `KSU_KERNEL_VER_CODE` (int): o código da versão do KernelSU atualmente instalado no espaço do kernel (por exemplo: `10672`).
|
||||
- `BOOTMODE` (bool): sempre seja `true` no KernelSU.
|
||||
- `MODPATH` (path): o caminho onde os arquivos do seu módulo devem ser instalados.
|
||||
- `TMPDIR` (path): um lugar onde você pode armazenar arquivos temporariamente.
|
||||
- `ZIPFILE` (path): zip de instalação do seu módulo.
|
||||
- `ARCH` (string): a arquitetura da CPU do dispositivo. O valor é `arm`, `arm64`, `x86` ou `x64`.
|
||||
- `IS64BIT` (bool): `true` se `$ARCH` for `arm64` ou `x64`.
|
||||
- `API` (int): o nível da API (versão do Android) do dispositivo (por exemplo: `23` para Android 6.0).
|
||||
|
||||
::: warning AVISO
|
||||
No KernelSU, `MAGISK_VER_CODE` é sempre `25200` e `MAGISK_VER` é sempre `v25.2`. Por favor, não use essas duas variáveis para determinar se ele está sendo executado no KernelSU ou não.
|
||||
:::
|
||||
|
||||
#### Funções
|
||||
|
||||
```txt
|
||||
ui_print <msg>
|
||||
imprima <msg> no console
|
||||
Evite usar 'echo', pois ele não será exibido no console de recuperação personalizado
|
||||
|
||||
abort <msg>
|
||||
imprima mensagem de erro <msg> para consolar e encerrar a instalação
|
||||
Evite usar 'exit', pois isso irá pular as etapas de limpeza de encerramento
|
||||
|
||||
set_perm <target> <owner> <group> <permission> [context]
|
||||
se [context] não estiver definido, o padrão é "u:object_r:system_file:s0"
|
||||
esta função é uma abreviação para os seguintes comandos:
|
||||
chown owner.group target
|
||||
chmod permission target
|
||||
chcon context target
|
||||
|
||||
set_perm_recursive <directory> <owner> <group> <dirpermission> <filepermission> [context]
|
||||
se [context] não está definido, o padrão é "u:object_r:system_file:s0"
|
||||
para todos os arquivos em <directory>, ele chamará:
|
||||
contexto de permissão de arquivo do grupo proprietário do arquivo set_perm
|
||||
para todos os diretórios em <directory> (including itself), ele vai ligar:
|
||||
set_perm dir owner group dirpermission context
|
||||
```
|
||||
|
||||
## Scripts de inicialização
|
||||
|
||||
No KernelSU, os scripts são divididos em dois tipos com base em seu modo de execução: modo post-fs-data e modo de serviço late_start:
|
||||
|
||||
- modo post-fs-data
|
||||
- Esta etapa está BLOQUEANDO. O processo de inicialização é pausado antes da execução ser concluída ou 10 segundos se passaram.
|
||||
- Os scripts são executados antes de qualquer módulo ser montado. Isso permite que um desenvolvedor de módulo ajuste dinamicamente seus módulos antes de serem montados.
|
||||
- Este estágio acontece antes do início do Zygote, o que significa praticamente tudo no Android.
|
||||
- **AVISO:** Usar `setprop` irá bloquear o processo de inicialização! Por favor, use `resetprop -n <prop_name> <prop_value>` em vez disso.
|
||||
- **Execute scripts neste modo apenas se necessário.**
|
||||
- modo de serviço late_start
|
||||
- Esta etapa é SEM BLOQUEIO. Seu script é executado em paralelo com o restante do processo de inicialização.
|
||||
- **Este é o estágio recomendado para executar a maioria dos scripts**.
|
||||
|
||||
No KernelSU, os scripts de inicialização são divididos em dois tipos com base no local de armazenamento: scripts gerais e scripts de módulo:
|
||||
|
||||
- Scripts gerais
|
||||
- Colocado em `/data/adb/post-fs-data.d`, `/data/adb/service.d`, `/data/adb/post-mount.d` ou `/data/adb/boot-completed.d`.
|
||||
- Somente executado se o script estiver definido como executável (`chmod +x script.sh`).
|
||||
- Os scripts em `post-fs-data.d` são executados no modo post-fs-data e os scripts em `service.d` são executados no modo de serviço late_start.
|
||||
- Os módulos **NÃO** devem adicionar scripts gerais durante a instalação.
|
||||
- Scripts de módulo
|
||||
- Colocado na própria pasta do módulo.
|
||||
- Executado apenas se o módulo estiver ativado.
|
||||
- `post-fs-data.sh` é executado no modo post-fs-data, `service.sh` é executado no modo de serviço late_start, `boot-completed.sh` é executado na inicialização concluída e `post-mount.sh` é executado em overlayfs montado.
|
||||
|
||||
Todos os scripts de inicialização serão executados no shell BusyBox `ash` do KernelSU com o "Modo Autônomo" ativado.
|
||||
50
website/docs/pt_BR/guide/rescue-from-bootloop.md
Normal file
50
website/docs/pt_BR/guide/rescue-from-bootloop.md
Normal file
@@ -0,0 +1,50 @@
|
||||
# Resgate do bootloop
|
||||
|
||||
Ao atualizar um dispositivo, podemos encontrar situações em que o dispositivo fica "bloqueado". Em teoria, se você usar o fastboot apenas para atualizar a partição boot ou instalar módulos inadequados que causam falha na inicialização do dispositivo, isso poderá ser restaurado por meio de operações apropriadas. Este documento tem como objetivo fornecer alguns métodos de emergência para ajudá-lo a se recuperar de um dispositivo "bloqueado".
|
||||
|
||||
## Bloqueio por fleshear partição boot
|
||||
|
||||
No KernelSU, as seguintes situações podem causar bloqueio de inicialização ao fleshear a partição boot:
|
||||
|
||||
1. Você atualizou uma imagem boot no formato errado. Por exemplo, se o formato de boot do seu telefone for `gz`, mas você atualizou uma imagem no formato `lz4`, o telefone não será capaz de inicializar.
|
||||
2. Seu telefone precisa desativar a verificação AVB para inicializar corretamente (geralmente exigindo a limpeza de todos os dados do telefone).
|
||||
3. Seu kernel tem alguns bugs ou não é adequado para o flash do seu telefone.
|
||||
|
||||
Não importa qual seja a situação, você pode recuperar **fleshando a imagem de boot padrão**. Portanto, no início do tutorial de instalação, recomendamos fortemente que você faça backup de seu boot padrão antes de fleshar. Se você não fez backup, poderá obter o boot original de fábrica de outros usuários com o mesmo dispositivo que você ou do firmware oficial.
|
||||
|
||||
## Bloqueio por módulos
|
||||
|
||||
A instalação de módulos pode ser uma causa mais comum de bloqueio do seu dispositivo, mas devemos avisá-lo seriamente: **NÃO INSTALE MÓDULOS DE FONTES DESCONHECIDAS**! Como os módulos têm privilégios root, eles podem causar danos irreversíveis ao seu dispositivo!
|
||||
|
||||
### Módulos normais
|
||||
|
||||
Se você instalou um módulo que foi comprovadamente seguro, mas faz com que seu dispositivo não inicialize, então esta situação é facilmente recuperável no KernelSU sem qualquer preocupação. O KernelSU possui mecanismos integrados para recuperar seu dispositivo, incluindo o seguinte:
|
||||
|
||||
1. Atualização AB
|
||||
2. Recupere pressionando o botão de diminuir volume
|
||||
|
||||
#### Atualização AB
|
||||
|
||||
As atualizações do módulo KernelSU inspiram-se no mecanismo de atualização AB do sistema Android usado em atualizações OTA. Se você instalar um novo módulo ou atualizar um existente, isso não modificará diretamente o arquivo do módulo usado atualmente. Em vez disso, todos os módulos serão integrados em outra imagem de atualização. Depois que o sistema for reiniciado, ele tentará começar a usar esta imagem de atualização. Se o sistema Android inicializar com sucesso, os módulos serão realmente atualizados.
|
||||
|
||||
Portanto, o método mais simples e comumente usado para recuperar seu dispositivo é **forçar uma reinicialização**. Se você não conseguir iniciar o sistema após instalar um módulo, você pode pressionar e segurar o botão liga/desliga por mais de 10 segundos e o sistema será reinicializado automaticamente. Após a reinicialização, ele retornará ao estado anterior à atualização do módulo e os módulos atualizados anteriormente serão desativados automaticamente.
|
||||
|
||||
#### Recupere pressionando o botão de diminuir volume
|
||||
|
||||
Se as atualizações AB ainda não resolverem o problema, você pode tentar usar o **Modo de Segurança**. No Modo de Segurança, todos os módulos estão desabilitados.
|
||||
|
||||
Existem duas maneiras de entrar no Modo de Segurança:
|
||||
|
||||
1. O Modo de Segurança integrado de alguns sistemas. Alguns sistemas possuem um Modo de Segurança integrado que pode ser acessado pressionando longamente o botão de diminuir volume, enquanto outros (como a MIUI) podem ativar o Modo de Segurança no Recovery. Ao entrar no Modo de Segurança do sistema, o KernelSU também entrará no Modo de Segurança e desativará automaticamente os módulos.
|
||||
2. O Modo de Segurança integrado do KernelSU. O método de operação é **pressionar a tecla de diminuir volume continuamente por mais de três vezes** após a primeira tela de inicialização.
|
||||
|
||||
Após entrar no Modo de Segurança, todos os módulos na página de módulos do gerenciador KernelSU são desabilitados, mas você pode executar operações de "desinstalação" para desinstalar quaisquer módulos que possam estar causando problemas.
|
||||
|
||||
O Modo de Segurança integrado é implementado no kernel, portanto não há possibilidade de perder eventos importantes devido à interceptação. No entanto, para kernels não GKI, a integração manual do código pode ser necessária e você pode consultar a documentação oficial para obter orientação.
|
||||
|
||||
### Módulos maliciosos
|
||||
|
||||
Se os métodos acima não conseguirem recuperar seu dispositivo, é altamente provável que o módulo que você instalou tenha operações maliciosas ou tenha danificado seu dispositivo por outros meios. Neste caso, existem apenas duas sugestões:
|
||||
|
||||
1. Limpe os dados e instale o sistema oficial.
|
||||
2. Consulte o serviço pós-venda.
|
||||
30
website/docs/pt_BR/guide/unofficially-support-devices.md
Normal file
30
website/docs/pt_BR/guide/unofficially-support-devices.md
Normal file
@@ -0,0 +1,30 @@
|
||||
# Dispositivos com suporte não oficial
|
||||
|
||||
::: warning AVISO
|
||||
Nesta página, existem kernels para dispositivos não GKI que suportam o KernelSU mantidos por outros desenvolvedores.
|
||||
:::
|
||||
|
||||
::: warning AVISO
|
||||
Esta página é apenas para você encontrar o código-fonte correspondente ao seu dispositivo, **NÃO** significa que o código-fonte foi revisado pelos desenvolvedores do KernelSU. Você deve usá-lo por sua própria conta e risco.
|
||||
:::
|
||||
|
||||
<script setup>
|
||||
import data from '../../repos.json'
|
||||
</script>
|
||||
|
||||
<table>
|
||||
<thead>
|
||||
<tr>
|
||||
<th>Mantenedor</th>
|
||||
<th>Repositório</th>
|
||||
<th>Dispositivos suportados</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr v-for="repo in data" :key="repo.devices">
|
||||
<td><a :href="repo.maintainer_link" target="_blank" rel="noreferrer">{{ repo.maintainer }}</a></td>
|
||||
<td><a :href="repo.kernel_link" target="_blank" rel="noreferrer">{{ repo.kernel_name }}</a></td>
|
||||
<td>{{ repo.devices }}</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
21
website/docs/pt_BR/guide/what-is-kernelsu.md
Normal file
21
website/docs/pt_BR/guide/what-is-kernelsu.md
Normal file
@@ -0,0 +1,21 @@
|
||||
# O que é KernelSU?
|
||||
|
||||
O KernelSU é uma solução root para dispositivos Android GKI, funciona no modo kernel e concede permissão root ao app do espaço do usuário diretamente no espaço do kernel.
|
||||
|
||||
## Características
|
||||
|
||||
A principal característica do KernelSU é que ele é **baseado em kernel**. O KernelSU funciona no modo kernel, portanto pode fornecer uma interface de kernel que nunca tivemos antes. Por exemplo, podemos adicionar um ponto de interrupção de hardware a qualquer processo no modo kernel; Podemos acessar a memória física de qualquer processo sem que ninguém perceba; Podemos interceptar qualquer syscall no espaço do kernel; etc.
|
||||
|
||||
E também, o KernelSU fornece um sistema de módulos via overlayfs, que permite carregar seu plugin personalizado no sistema. Ele também fornece um mecanismo para modificar arquivos na partição `/system`.
|
||||
|
||||
## Como usar
|
||||
|
||||
Por favor, consulte: [Instalação](installation)
|
||||
|
||||
## Como construir
|
||||
|
||||
[Como construir o KernelSU?](how-to-build)
|
||||
|
||||
## Discussão
|
||||
|
||||
- Telegram: [@KernelSU](https://t.me/KernelSU)
|
||||
28
website/docs/pt_BR/index.md
Normal file
28
website/docs/pt_BR/index.md
Normal file
@@ -0,0 +1,28 @@
|
||||
---
|
||||
layout: home
|
||||
title: Uma solução root baseada em kernel para Android
|
||||
|
||||
hero:
|
||||
name: KernelSU
|
||||
text: Uma solução root baseada em kernel para Android
|
||||
tagline: ""
|
||||
image:
|
||||
src: /logo.png
|
||||
alt: KernelSU
|
||||
actions:
|
||||
- theme: brand
|
||||
text: Iniciar
|
||||
link: /pt_BR/guide/what-is-kernelsu
|
||||
- theme: alt
|
||||
text: Ver no GitHub
|
||||
link: https://github.com/tiann/KernelSU
|
||||
|
||||
features:
|
||||
- title: Baseado em kernel
|
||||
details: Como o nome sugere, KernelSU funciona no kernel Linux, dando-lhe mais controle sobre os apps do espaço do usuário.
|
||||
- title: Controle de acesso root
|
||||
details: Somente apps permitidos podem acessar ou ver su, todos os outros apps não estão cientes disso.
|
||||
- title: Privilégios de root personalizáveis
|
||||
details: KernelSU permite a personalização de uid, gid, grupos, capacidades e regras SELinux do su, bloqueando privilégios de root.
|
||||
- title: Módulo
|
||||
details: Os módulos podem modificar /system sem sistema usando overlayfs permitindo grande potência.
|
||||
@@ -55,13 +55,6 @@
|
||||
"kernel_link": "https://github.com/hmtheboy154/Darkmatter-kernel",
|
||||
"devices": "Generic x86_64 devices running Android-x86"
|
||||
},
|
||||
{
|
||||
"maintainer": "Vincent4440",
|
||||
"maintainer_link": "https://github.com/Vincent4440",
|
||||
"kernel_name": "noxious_kernel_xiaomi_sm8250",
|
||||
"kernel_link": "https://github.com/Vincent4440/noxious_kernel_xiaomi_sm8250",
|
||||
"devices": "Poco F4: munch"
|
||||
},
|
||||
{
|
||||
"maintainer": "Asuka-mio",
|
||||
"maintainer_link": "https://github.com/asuka-mio",
|
||||
@@ -85,9 +78,9 @@
|
||||
},
|
||||
{
|
||||
"maintainer": "SakuraNotStupid",
|
||||
"maintainer_link": "https://github.com/SakuraNotStupid",
|
||||
"maintainer_link": "https://github.com/SakuraKyuo",
|
||||
"kernel_name": "android_kernel_xiaomi_sdm710",
|
||||
"kernel_link": "https://github.com/SakuraNotStupid/android_kernel_xiaomi_sdm710",
|
||||
"kernel_link": "https://github.com/SakuraKyuo/android_kernel_xiaomi_sdm710",
|
||||
"devices": "Xiaomi MI 8 SE(sirius/xmsirius)"
|
||||
},
|
||||
{
|
||||
@@ -134,9 +127,9 @@
|
||||
},
|
||||
{
|
||||
"maintainer": "Sreeshankar K",
|
||||
"maintainer_link": "https://github.com/Sanju0910",
|
||||
"maintainer_link": "https://github.com/sreeshankark",
|
||||
"kernel_name": "NeverSettle Kernel",
|
||||
"kernel_link": "https://github.com/Sanju0910/android_kernel_oneplus_avicii",
|
||||
"kernel_link": "https://github.com/sreeshankark/android_kernel_oneplus_avicii",
|
||||
"devices": "OnePlus Nord (avicii)"
|
||||
},
|
||||
{
|
||||
@@ -272,6 +265,13 @@
|
||||
"kernel_link": "https://github.com/reocat/android_kernel_nokia_sdm660_ksu",
|
||||
"devices": "Nokia 6.1 (2018)"
|
||||
},
|
||||
{
|
||||
"maintainer": "Tuan Anh",
|
||||
"maintainer_link": "https://github.com/log1cs",
|
||||
"kernel_name": "kernel_nokia_msm8998",
|
||||
"kernel_link": "https://github.com/log1cs/kernel_nokia_msm8998",
|
||||
"devices": "Nokia 8 (Repartitioned)/8 Sirocco (NLA/A1N)"
|
||||
},
|
||||
{
|
||||
"maintainer": "bggRGjQaUbCoE",
|
||||
"maintainer_link": "https://github.com/bggRGjQaUbCoE",
|
||||
@@ -460,5 +460,33 @@
|
||||
"kernel_name": "android_kernel_oneplus_sdm845",
|
||||
"kernel_link": "https://github.com/wxt1221/android_kernel_oneplus_sdm845",
|
||||
"devices": "Oneplus 6 (enchilada) | Oneplus 6T (fajita) with no Retrofit Dynamic Partitions"
|
||||
},
|
||||
{
|
||||
"maintainer": "zharzinhoo",
|
||||
"maintainer_link": "https://github.com/zharzinhoo",
|
||||
"kernel_name": "Kernel-Oriente-Guamp",
|
||||
"kernel_link": "https://github.com/zharzinhoo/Kernel-Oriente-Guamp",
|
||||
"devices": "Moto g9 play"
|
||||
},
|
||||
{
|
||||
"maintainer": "hc841",
|
||||
"maintainer_link": "https://github.com/hc841",
|
||||
"kernel_name": "NovaCore_kernel",
|
||||
"kernel_link": "https://github.com/hc841/NovaCore_kernel",
|
||||
"devices": "Moto g9 play"
|
||||
},
|
||||
{
|
||||
"maintainer": "zlm324",
|
||||
"maintainer_link": "https://github.com/zlm324",
|
||||
"kernel_name": "android_kernel_xiaomi_msm8998_ksu",
|
||||
"kernel_link": "https://github.com/zlm324/android_kernel_xiaomi_msm8998_ksu",
|
||||
"devices": "a lineage kernel forked from LineageOS official repository, version 4.4.302, added ksu."
|
||||
},
|
||||
{
|
||||
"maintainer": "zlm324",
|
||||
"maintainer_link": "https://github.com/zlm324",
|
||||
"kernel_name": "android_kernel_xiaomi_msm8953_ksu",
|
||||
"kernel_link": "https://github.com/zlm324/android_kernel_xiaomi_msm8953_ksu",
|
||||
"devices": "Xiaomi 5X (tiffany)"
|
||||
}
|
||||
]
|
||||
|
||||
@@ -25,4 +25,4 @@
|
||||
4. BusyBox 的目录不同;KernelSU 内置的 BusyBox 在 `/data/adb/ksu/bin/busybox` 而 Magisk 在 `/data/adb/magisk/busybox`;**注意此为 KernelSU 内部行为,未来可能会更改!**
|
||||
5. KernelSU 不支持 `.replace` 文件;但 KernelSU 支持 `REPLACE` 和 `REMOVE` 变量。
|
||||
6. KernelSU 新增了一种脚本 `boot-completed.sh`,以便在 Android 系统启动后运行某些任务。
|
||||
7. KernelSU 新增了一种脚本 `post-moount.sh`,以便在 Overlayfs 挂载后运行某些任务。
|
||||
7. KernelSU 新增了一种脚本 `post-mount.sh`,以便在 Overlayfs 挂载后运行某些任务。
|
||||
|
||||
Reference in New Issue
Block a user