You've already forked KernelSU-Next
mirror of
https://github.com/KernelSU-Next/KernelSU-Next.git
synced 2025-08-27 23:46:34 +00:00
Compare commits
166 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
7a08683c74 | ||
|
|
2f3f444905 | ||
|
|
7746569fe9 | ||
|
|
3a601f86a5 | ||
|
|
e7dab63837 | ||
|
|
487e7d0012 | ||
|
|
ee71a992a3 | ||
|
|
195e1ba494 | ||
|
|
a0e4d01269 | ||
|
|
b8b0dc724a | ||
|
|
39777f301d | ||
|
|
f20662c6b6 | ||
|
|
3532f20b2f | ||
|
|
14218e81be | ||
|
|
d104250770 | ||
|
|
6100df6f8c | ||
|
|
e597bd1c66 | ||
|
|
0038ba6566 | ||
|
|
7bebb2a461 | ||
|
|
f3fee49f8c | ||
|
|
e8c080ba09 | ||
|
|
785d8143fb | ||
|
|
cd0031e8a5 | ||
|
|
c1273d35f4 | ||
|
|
15371bb1d6 | ||
|
|
097451d578 | ||
|
|
85866848ea | ||
|
|
d05d16c15d | ||
|
|
bb6c20339c | ||
|
|
af012ce349 | ||
|
|
43d30c8f2b | ||
|
|
a89985f33e | ||
|
|
42896dfab1 | ||
|
|
36111f4b89 | ||
|
|
74171a2930 | ||
|
|
c40bfd694c | ||
|
|
aa22fd880d | ||
|
|
fe9578433c | ||
|
|
a0278b1e45 | ||
|
|
0c7ba4dc6e | ||
|
|
b98c531ff8 | ||
|
|
373025248d | ||
|
|
60d2ad39d6 | ||
|
|
b807b38892 | ||
|
|
5ca5e2b027 | ||
|
|
608e949e23 | ||
|
|
c9dd12d50b | ||
|
|
7319dd25a3 | ||
|
|
fdd307fe8b | ||
|
|
b6c8203a97 | ||
|
|
b2a8fb66d3 | ||
|
|
74f55dd807 | ||
|
|
8560f35c8b | ||
|
|
b0f01cf7ff | ||
|
|
8ae0192b47 | ||
|
|
f247a6d5d8 | ||
|
|
d85bff2943 | ||
|
|
f5ac0f3589 | ||
|
|
a2fcd157a2 | ||
|
|
70ce97660e | ||
|
|
67967a8251 | ||
|
|
b25a21770d | ||
|
|
bbb05b292a | ||
|
|
8696ed8f36 | ||
|
|
682f93667b | ||
|
|
00cab2209e | ||
|
|
b6fcea9277 | ||
|
|
623f5e3f64 | ||
|
|
b18f89b434 | ||
|
|
2a152fdb22 | ||
|
|
dbadad1027 | ||
|
|
fcc4f0d206 | ||
|
|
c20fe6c886 | ||
|
|
19a15a71eb | ||
|
|
c446ee76f5 | ||
|
|
5435992911 | ||
|
|
c2ae844f65 | ||
|
|
8832532f09 | ||
|
|
cba275cde2 | ||
|
|
4401e28f57 | ||
|
|
ece6e3f694 | ||
|
|
d4db74f0fb | ||
|
|
e931792a4f | ||
|
|
3876b6b474 | ||
|
|
ae36e2085c | ||
|
|
3a8f4a2596 | ||
|
|
87fc6b2784 | ||
|
|
25b57204ef | ||
|
|
4ed362bea4 | ||
|
|
a2976fd926 | ||
|
|
b2bcc93f9a | ||
|
|
57b8dd54c5 | ||
|
|
ef32f3f9d2 | ||
|
|
4ac264135d | ||
|
|
a05b790da6 | ||
|
|
7ac03d638c | ||
|
|
b6d670f9a7 | ||
|
|
a6a2f65ead | ||
|
|
de38fe84d7 | ||
|
|
28319943e9 | ||
|
|
25bd8a2783 | ||
|
|
8c02c89a95 | ||
|
|
890f2e1d8e | ||
|
|
81daaa2055 | ||
|
|
5a620372c9 | ||
|
|
090f4c0f02 | ||
|
|
cbe3ffe32a | ||
|
|
cf84dc8a32 | ||
|
|
5eb10460b7 | ||
|
|
dd1a999567 | ||
|
|
e24240facf | ||
|
|
a0c262be8d | ||
|
|
f60eed24e8 | ||
|
|
2c17a5f4f3 | ||
|
|
cae7693ceb | ||
|
|
b1174448ac | ||
|
|
82f38fe817 | ||
|
|
8d3048f5d9 | ||
|
|
8f21a0cb86 | ||
|
|
bb2aafb9fa | ||
|
|
adc8e71628 | ||
|
|
194fd7db72 | ||
|
|
60e40f9397 | ||
|
|
14624ea966 | ||
|
|
3ee1cbe4c2 | ||
|
|
bc307eecdb | ||
|
|
41fc6800db | ||
|
|
631354407c | ||
|
|
ed2c429685 | ||
|
|
6f6dd29306 | ||
|
|
7314c8e1c0 | ||
|
|
0ada4ee5d4 | ||
|
|
3b045f6c16 | ||
|
|
95584df023 | ||
|
|
b18c39e911 | ||
|
|
d68dceaf87 | ||
|
|
724f22e92e | ||
|
|
1ef8419466 | ||
|
|
034ad8d21a | ||
|
|
b89fd07911 | ||
|
|
eecd0844f4 | ||
|
|
efe4f03aa2 | ||
|
|
1c8b088d9f | ||
|
|
4fac2aae81 | ||
|
|
84f230d35b | ||
|
|
2f42ebd620 | ||
|
|
af05e5dc0e | ||
|
|
5488970c61 | ||
|
|
48fc63540a | ||
|
|
91f5ba8c0c | ||
|
|
b12b0008d0 | ||
|
|
ddd2fc9227 | ||
|
|
bb3bc42ff9 | ||
|
|
132d523f32 | ||
|
|
72b5ac716b | ||
|
|
6e62552a9c | ||
|
|
4a5c3ec1b6 | ||
|
|
b4012d94fb | ||
|
|
41058ec69d | ||
|
|
73fb1977ac | ||
|
|
0626bf0980 | ||
|
|
f12b5238b1 | ||
|
|
400332161e | ||
|
|
ce60963358 | ||
|
|
2e5e55a92a | ||
|
|
cc6d271603 |
2
.github/ISSUE_TEMPLATE/config.yml
vendored
2
.github/ISSUE_TEMPLATE/config.yml
vendored
@@ -1,5 +1,5 @@
|
||||
blank_issues_enabled: false
|
||||
contact_links:
|
||||
- name: Feature Request
|
||||
url: https://t.me/ksunext_discussions
|
||||
url: https://t.me/ksunext_group
|
||||
about: "We accept external Feature Requests, see this link for more details."
|
||||
|
||||
2
.github/scripts/build_a12.sh
vendored
2
.github/scripts/build_a12.sh
vendored
@@ -51,7 +51,7 @@ build_from_image() {
|
||||
echo "[+] Images to upload"
|
||||
find . -type f -name "*.gz"
|
||||
|
||||
# find . -type f -name "*.gz" -exec python3 "$GITHUB_WORKSPACE"/KernelSU-Next/scripts/ksubot.py {} +
|
||||
# find . -type f -name "*.gz" -exec python3 "$GITHUB_WORKSPACE"/KernelSU-Next/scripts/ksunextbot.py {} +
|
||||
}
|
||||
|
||||
for dir in Image*; do
|
||||
|
||||
2
.github/scripts/build_a13.sh
vendored
2
.github/scripts/build_a13.sh
vendored
@@ -30,7 +30,7 @@ build_from_image() {
|
||||
echo '[+] Images to upload'
|
||||
find . -type f -name "*.gz"
|
||||
|
||||
# find . -type f -name "*.gz" -exec python3 "$GITHUB_WORKSPACE"/KernelSU-Next/scripts/ksubot.py {} +
|
||||
# find . -type f -name "*.gz" -exec python3 "$GITHUB_WORKSPACE"/KernelSU-Next/scripts/ksunextbot.py {} +
|
||||
}
|
||||
|
||||
for dir in Image*; do
|
||||
|
||||
20
.github/workflows/build-debug-kernel.yml
vendored
20
.github/workflows/build-debug-kernel.yml
vendored
@@ -17,11 +17,11 @@ jobs:
|
||||
matrix:
|
||||
include:
|
||||
- version: "5.10"
|
||||
sub_level: 223
|
||||
os_patch_level: 2024-11
|
||||
sub_level: 228
|
||||
os_patch_level: 2025-01
|
||||
- version: "5.15"
|
||||
sub_level: 167
|
||||
os_patch_level: 2024-11
|
||||
sub_level: 170
|
||||
os_patch_level: 2025-01
|
||||
uses: ./.github/workflows/gki-kernel.yml
|
||||
with:
|
||||
version: android13-${{ matrix.version }}
|
||||
@@ -34,11 +34,11 @@ jobs:
|
||||
matrix:
|
||||
include:
|
||||
- version: "5.15"
|
||||
sub_level: 167
|
||||
os_patch_level: 2024-11
|
||||
sub_level: 170
|
||||
os_patch_level: 2025-01
|
||||
- version: "6.1"
|
||||
sub_level: 115
|
||||
os_patch_level: 2024-12
|
||||
sub_level: 118
|
||||
os_patch_level: 2025-01
|
||||
uses: ./.github/workflows/gki-kernel.yml
|
||||
with:
|
||||
version: android14-${{ matrix.version }}
|
||||
@@ -51,8 +51,8 @@ jobs:
|
||||
matrix:
|
||||
include:
|
||||
- version: "6.6"
|
||||
sub_level: 57
|
||||
os_patch_level: 2024-12
|
||||
sub_level: 58
|
||||
os_patch_level: 2025-01
|
||||
uses: ./.github/workflows/gki-kernel.yml
|
||||
with:
|
||||
version: android15-${{ matrix.version }}
|
||||
|
||||
4
.github/workflows/build-kernel-a12.yml
vendored
4
.github/workflows/build-kernel-a12.yml
vendored
@@ -27,6 +27,8 @@ jobs:
|
||||
os_patch_level: 2024-08
|
||||
- sub_level: 226
|
||||
os_patch_level: 2024-11
|
||||
- sub_level: 233
|
||||
os_patch_level: 2025-02
|
||||
uses: ./.github/workflows/gki-kernel.yml
|
||||
secrets: inherit
|
||||
with:
|
||||
@@ -82,7 +84,7 @@ jobs:
|
||||
uses: actions/cache@v4
|
||||
if: false
|
||||
with:
|
||||
path: scripts/ksubot.session
|
||||
path: scripts/ksunextbot.session
|
||||
key: ${{ runner.os }}-bot-session
|
||||
|
||||
- name: Build boot images
|
||||
|
||||
16
.github/workflows/build-kernel-a13.yml
vendored
16
.github/workflows/build-kernel-a13.yml
vendored
@@ -36,6 +36,9 @@ jobs:
|
||||
- version: "5.10"
|
||||
sub_level: 223
|
||||
os_patch_level: 2024-11
|
||||
- version: "5.10"
|
||||
sub_level: 228
|
||||
os_patch_level: 2025-01
|
||||
- version: "5.15"
|
||||
sub_level: 148
|
||||
os_patch_level: 2024-05
|
||||
@@ -51,6 +54,9 @@ jobs:
|
||||
- version: "5.15"
|
||||
sub_level: 167
|
||||
os_patch_level: 2024-11
|
||||
- version: "5.15"
|
||||
sub_level: 170
|
||||
os_patch_level: 2025-01
|
||||
uses: ./.github/workflows/gki-kernel.yml
|
||||
secrets: inherit
|
||||
with:
|
||||
@@ -106,7 +112,7 @@ jobs:
|
||||
uses: actions/cache@v4
|
||||
if: false
|
||||
with:
|
||||
path: scripts/ksubot.session
|
||||
path: scripts/ksunextbot.session
|
||||
key: ${{ runner.os }}-bot-session
|
||||
|
||||
- name: Build boot images
|
||||
@@ -137,11 +143,11 @@ jobs:
|
||||
matrix:
|
||||
include:
|
||||
- version: "5.10"
|
||||
sub_level: 223
|
||||
os_patch_level: 2024-11
|
||||
sub_level: 228
|
||||
os_patch_level: 2025-01
|
||||
- version: "5.15"
|
||||
sub_level: 167
|
||||
os_patch_level: 2024-11
|
||||
sub_level: 170
|
||||
os_patch_level: 2025-01
|
||||
uses: ./.github/workflows/gki-kernel.yml
|
||||
with:
|
||||
version: android13-${{ matrix.version }}
|
||||
|
||||
19
.github/workflows/build-kernel-a14.yml
vendored
19
.github/workflows/build-kernel-a14.yml
vendored
@@ -39,6 +39,9 @@ jobs:
|
||||
- version: "5.15"
|
||||
sub_level: 167
|
||||
os_patch_level: 2024-11
|
||||
- version: "5.15"
|
||||
sub_level: 170
|
||||
os_patch_level: 2025-01
|
||||
- version: "6.1"
|
||||
sub_level: 75
|
||||
os_patch_level: 2024-05
|
||||
@@ -63,6 +66,12 @@ jobs:
|
||||
- version: "6.1"
|
||||
sub_level: 115
|
||||
os_patch_level: 2024-12
|
||||
- version: "6.1"
|
||||
sub_level: 118
|
||||
os_patch_level: 2025-01
|
||||
- version: "6.1"
|
||||
sub_level: 124
|
||||
os_patch_level: 2025-02
|
||||
uses: ./.github/workflows/gki-kernel.yml
|
||||
secrets: inherit
|
||||
with:
|
||||
@@ -118,7 +127,7 @@ jobs:
|
||||
uses: actions/cache@v4
|
||||
if: false
|
||||
with:
|
||||
path: scripts/ksubot.session
|
||||
path: scripts/ksunextbot.session
|
||||
key: ${{ runner.os }}-bot-session
|
||||
|
||||
- name: Build boot images
|
||||
@@ -149,11 +158,11 @@ jobs:
|
||||
matrix:
|
||||
include:
|
||||
- version: "5.15"
|
||||
sub_level: 167
|
||||
os_patch_level: 2024-11
|
||||
sub_level: 170
|
||||
os_patch_level: 2025-01
|
||||
- version: "6.1"
|
||||
sub_level: 115
|
||||
os_patch_level: 2024-12
|
||||
sub_level: 118
|
||||
os_patch_level: 2025-01
|
||||
uses: ./.github/workflows/gki-kernel.yml
|
||||
with:
|
||||
version: android14-${{ matrix.version }}
|
||||
|
||||
12
.github/workflows/build-kernel-a15.yml
vendored
12
.github/workflows/build-kernel-a15.yml
vendored
@@ -36,6 +36,12 @@ jobs:
|
||||
- version: "6.6"
|
||||
sub_level: 57
|
||||
os_patch_level: 2024-12
|
||||
- version: "6.6"
|
||||
sub_level: 58
|
||||
os_patch_level: 2025-01
|
||||
- version: "6.6"
|
||||
sub_level: 66
|
||||
os_patch_level: 2025-02
|
||||
uses: ./.github/workflows/gki-kernel.yml
|
||||
secrets: inherit
|
||||
with:
|
||||
@@ -91,7 +97,7 @@ jobs:
|
||||
uses: actions/cache@v4
|
||||
if: false
|
||||
with:
|
||||
path: scripts/ksubot.session
|
||||
path: scripts/ksunextbot.session
|
||||
key: ${{ runner.os }}-bot-session
|
||||
|
||||
- name: Build boot images
|
||||
@@ -122,8 +128,8 @@ jobs:
|
||||
matrix:
|
||||
include:
|
||||
- version: "6.6"
|
||||
sub_level: 57
|
||||
os_patch_level: 2024-12
|
||||
sub_level: 58
|
||||
os_patch_level: 2025-01
|
||||
uses: ./.github/workflows/gki-kernel.yml
|
||||
with:
|
||||
version: android15-${{ matrix.version }}
|
||||
|
||||
24
.github/workflows/build-lkm.yml
vendored
24
.github/workflows/build-lkm.yml
vendored
@@ -15,23 +15,23 @@ jobs:
|
||||
matrix:
|
||||
include:
|
||||
- version: "android12-5.10"
|
||||
sub_level: 226
|
||||
os_patch_level: 2024-11
|
||||
sub_level: 233
|
||||
os_patch_level: 2025-02
|
||||
- version: "android13-5.10"
|
||||
sub_level: 223
|
||||
os_patch_level: 2024-11
|
||||
sub_level: 228
|
||||
os_patch_level: 2025-01
|
||||
- version: "android13-5.15"
|
||||
sub_level: 167
|
||||
os_patch_level: 2024-11
|
||||
sub_level: 170
|
||||
os_patch_level: 2025-01
|
||||
- version: "android14-5.15"
|
||||
sub_level: 167
|
||||
os_patch_level: 2024-11
|
||||
sub_level: 170
|
||||
os_patch_level: 2025-01
|
||||
- version: "android14-6.1"
|
||||
sub_level: 115
|
||||
os_patch_level: 2024-12
|
||||
sub_level: 124
|
||||
os_patch_level: 2025-02
|
||||
- version: "android15-6.6"
|
||||
sub_level: 57
|
||||
os_patch_level: 2024-12
|
||||
sub_level: 66
|
||||
os_patch_level: 2025-02
|
||||
uses: ./.github/workflows/gki-kernel.yml
|
||||
with:
|
||||
version: ${{ matrix.version }}
|
||||
|
||||
174
.github/workflows/build-manager-ci.yml
vendored
Normal file
174
.github/workflows/build-manager-ci.yml
vendored
Normal file
@@ -0,0 +1,174 @@
|
||||
name: Build Manager
|
||||
|
||||
on:
|
||||
push:
|
||||
branches: [ "next" ]
|
||||
paths:
|
||||
- '.github/workflows/build-manager-ci.yml'
|
||||
- 'manager/**'
|
||||
- 'kernel/**'
|
||||
- 'userspace/ksud_overlayfs**'
|
||||
- 'userspace/ksud_magic/**'
|
||||
- 'userspace/susfsd/**'
|
||||
pull_request:
|
||||
branches: [ "next" ]
|
||||
paths:
|
||||
- '.github/workflows/build-manager-ci.yml'
|
||||
- 'manager/**'
|
||||
workflow_call:
|
||||
workflow_dispatch:
|
||||
|
||||
jobs:
|
||||
build-lkm:
|
||||
uses: ./.github/workflows/build-lkm.yml
|
||||
secrets: inherit
|
||||
|
||||
build-susfsd:
|
||||
needs: build-lkm
|
||||
strategy:
|
||||
matrix:
|
||||
include:
|
||||
- target: aarch64-linux-android
|
||||
os: ubuntu-latest
|
||||
uses: ./.github/workflows/susfsd.yml
|
||||
with:
|
||||
target: ${{ matrix.target }}
|
||||
os: ${{ matrix.os }}
|
||||
|
||||
build-ksud:
|
||||
needs: build-susfsd
|
||||
strategy:
|
||||
matrix:
|
||||
include:
|
||||
- target: aarch64-linux-android
|
||||
os: ubuntu-latest
|
||||
uses: ./.github/workflows/ksud.yml
|
||||
with:
|
||||
target: ${{ matrix.target }}
|
||||
os: ${{ matrix.os }}
|
||||
|
||||
build-manager:
|
||||
needs: build-ksud
|
||||
runs-on: ubuntu-latest
|
||||
defaults:
|
||||
run:
|
||||
working-directory: ./manager
|
||||
|
||||
steps:
|
||||
- name: Checkout Repository
|
||||
uses: actions/checkout@v4
|
||||
with:
|
||||
fetch-depth: 0
|
||||
|
||||
- name: Setup need_upload
|
||||
id: need_upload
|
||||
run: |
|
||||
if [ ! -z "${{ secrets.BOT_TOKEN }}" ]; then
|
||||
echo "UPLOAD=true" >> $GITHUB_OUTPUT
|
||||
else
|
||||
echo "UPLOAD=false" >> $GITHUB_OUTPUT
|
||||
fi
|
||||
|
||||
- name: Write Key
|
||||
run: |
|
||||
if [ ! -z "${{ secrets.KEYSTORE }}" ]; then
|
||||
{
|
||||
echo KEYSTORE_PASSWORD='${{ secrets.KEYSTORE_PASSWORD }}'
|
||||
echo KEY_ALIAS='${{ secrets.KEY_ALIAS }}'
|
||||
echo KEY_PASSWORD='${{ secrets.KEY_PASSWORD }}'
|
||||
echo KEYSTORE_FILE='key.jks'
|
||||
} >> gradle.properties
|
||||
echo ${{ secrets.KEYSTORE }} | base64 -d > key.jks
|
||||
fi
|
||||
|
||||
- name: Setup Java
|
||||
uses: actions/setup-java@v4
|
||||
with:
|
||||
distribution: temurin
|
||||
java-version: 21
|
||||
|
||||
- name: Setup Gradle
|
||||
uses: gradle/actions/setup-gradle@v4
|
||||
|
||||
- name: Download arm64 susfsd
|
||||
uses: actions/download-artifact@v4
|
||||
with:
|
||||
name: susfsd-aarch64-linux-android
|
||||
path: .
|
||||
|
||||
- name: Copy susfsd to app jniLibs
|
||||
run: |
|
||||
mkdir -p app/src/main/jniLibs/arm64-v8a
|
||||
cp -f ../arm64-v8a/susfsd ../manager/app/src/main/jniLibs/arm64-v8a/libsusfsd.so
|
||||
|
||||
- name: Download arm64 ksud_overlayfs
|
||||
uses: actions/download-artifact@v4
|
||||
with:
|
||||
name: ksud_overlayfs-aarch64-linux-android
|
||||
path: ksud_overlayfs
|
||||
|
||||
- name: Copy ksud_overlayfs to app jniLibs
|
||||
run: |
|
||||
cp -f ../ksud_overlayfs/aarch64-linux-android/release/ksud ../manager/app/src/main/jniLibs/arm64-v8a/libksud_overlayfs.so
|
||||
|
||||
- name: Download arm64 ksud_magic
|
||||
uses: actions/download-artifact@v4
|
||||
with:
|
||||
name: ksud_magic-aarch64-linux-android
|
||||
path: ksud_magic
|
||||
|
||||
- name: Copy ksud_magic to app jniLibs
|
||||
run: |
|
||||
cp -f ../ksud_magic/aarch64-linux-android/release/ksud ../manager/app/src/main/jniLibs/arm64-v8a/libksud_magic.so
|
||||
|
||||
- name: Build with Gradle
|
||||
run: |
|
||||
{
|
||||
echo 'org.gradle.parallel=true'
|
||||
echo 'org.gradle.vfs.watch=true'
|
||||
echo 'org.gradle.jvmargs=-Xmx2048m'
|
||||
echo 'android.native.buildOutput=verbose'
|
||||
} >> gradle.properties
|
||||
sed -i 's/org.gradle.configuration-cache=true//g' gradle.properties
|
||||
chmod +x gradlew
|
||||
./gradlew clean assembleRelease
|
||||
|
||||
- name: Upload Build Artifact
|
||||
uses: actions/upload-artifact@v4
|
||||
with:
|
||||
name: Manager
|
||||
path: manager/app/build/outputs/apk/release/*.apk
|
||||
|
||||
- name: Upload Mappings
|
||||
uses: actions/upload-artifact@v4
|
||||
with:
|
||||
name: Mappings
|
||||
path: manager/app/build/outputs/mapping/release/
|
||||
|
||||
- name: Bot Session Cache
|
||||
if: steps.need_upload.outputs.UPLOAD == 'true'
|
||||
id: bot_session_cache
|
||||
uses: actions/cache@v4
|
||||
with:
|
||||
path: scripts/ksunextbot.session
|
||||
key: ${{ runner.os }}-bot-session
|
||||
|
||||
- name: Upload to Telegram
|
||||
if: steps.need_upload.outputs.UPLOAD == 'true'
|
||||
env:
|
||||
API_ID: ${{ secrets.API_ID }}
|
||||
API_HASH: ${{ secrets.API_HASH }}
|
||||
CHAT_ID: ${{ secrets.CHAT_ID }}
|
||||
BOT_TOKEN: ${{ secrets.BOT_TOKEN }}
|
||||
MESSAGE_THREAD_ID: ${{ secrets.MESSAGE_THREAD_ID }}
|
||||
COMMIT_MESSAGE: ${{ github.event.head_commit.message }}
|
||||
COMMIT_URL: ${{ github.event.head_commit.url }}
|
||||
RUN_URL: ${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}
|
||||
TITLE: CI Manager (TEST BUILD)
|
||||
run: |
|
||||
if [ ! -z "${{ secrets.BOT_TOKEN }}" ]; then
|
||||
export VERSION=$(git rev-list --count HEAD)
|
||||
APK=$(find ./app/build/outputs/apk/release -name "*.apk")
|
||||
pip3 install telethon
|
||||
python3 $GITHUB_WORKSPACE/scripts/ksunextbot.py $APK
|
||||
fi
|
||||
110
.github/workflows/build-manager.yml
vendored
110
.github/workflows/build-manager.yml
vendored
@@ -1,18 +1,20 @@
|
||||
name: Build Manager
|
||||
|
||||
on:
|
||||
push:
|
||||
branches: [ "next" ]
|
||||
paths:
|
||||
- '.github/workflows/build-manager.yml'
|
||||
- 'manager/**'
|
||||
- 'kernel/**'
|
||||
- 'userspace/ksud_overlayfs**'
|
||||
- 'userspace/ksud_magic/**'
|
||||
pull_request:
|
||||
branches: [ "next" ]
|
||||
paths:
|
||||
- 'manager/**'
|
||||
# push:
|
||||
# branches: [ "next" ]
|
||||
# paths:
|
||||
# - '.github/workflows/build-manager.yml'
|
||||
# - 'manager/**'
|
||||
# - 'kernel/**'
|
||||
# - 'userspace/ksud_overlayfs**'
|
||||
# - 'userspace/ksud_magic/**'
|
||||
# - 'userspace/susfsd/**'
|
||||
# pull_request:
|
||||
# branches: [ "next" ]
|
||||
# paths:
|
||||
# - '.github/workflows/build-manager-ci.yml'
|
||||
# - 'manager/**'
|
||||
workflow_call:
|
||||
workflow_dispatch:
|
||||
|
||||
@@ -21,44 +23,53 @@ jobs:
|
||||
uses: ./.github/workflows/build-lkm.yml
|
||||
secrets: inherit
|
||||
|
||||
build-ksud_overlayfs:
|
||||
build-susfsd:
|
||||
needs: build-lkm
|
||||
strategy:
|
||||
matrix:
|
||||
include:
|
||||
- target: aarch64-linux-android
|
||||
os: ubuntu-latest
|
||||
uses: ./.github/workflows/ksud_overlayfs.yml
|
||||
uses: ./.github/workflows/susfsd.yml
|
||||
with:
|
||||
target: ${{ matrix.target }}
|
||||
os: ${{ matrix.os }}
|
||||
|
||||
build-ksud_magic:
|
||||
needs: build-ksud_overlayfs
|
||||
|
||||
build-ksud:
|
||||
needs: build-susfsd
|
||||
strategy:
|
||||
matrix:
|
||||
include:
|
||||
- target: aarch64-linux-android
|
||||
os: ubuntu-latest
|
||||
uses: ./.github/workflows/ksud_magic.yml
|
||||
uses: ./.github/workflows/ksud.yml
|
||||
with:
|
||||
target: ${{ matrix.target }}
|
||||
os: ${{ matrix.os }}
|
||||
|
||||
build-manager:
|
||||
needs: build-ksud_magic
|
||||
needs: build-ksud
|
||||
runs-on: ubuntu-latest
|
||||
defaults:
|
||||
run:
|
||||
working-directory: ./manager
|
||||
|
||||
steps:
|
||||
- name: Checkout
|
||||
- name: Checkout Repository
|
||||
uses: actions/checkout@v4
|
||||
with:
|
||||
fetch-depth: 0
|
||||
|
||||
- name: Write key
|
||||
- name: Setup need_upload
|
||||
id: need_upload
|
||||
run: |
|
||||
if [ ! -z "${{ secrets.BOT_TOKEN }}" ]; then
|
||||
echo "UPLOAD=true" >> $GITHUB_OUTPUT
|
||||
else
|
||||
echo "UPLOAD=false" >> $GITHUB_OUTPUT
|
||||
fi
|
||||
|
||||
- name: Write Key
|
||||
run: |
|
||||
if [ ! -z "${{ secrets.KEYSTORE }}" ]; then
|
||||
{
|
||||
@@ -79,29 +90,36 @@ jobs:
|
||||
- name: Setup Gradle
|
||||
uses: gradle/actions/setup-gradle@v4
|
||||
|
||||
- name: Setup Android SDK
|
||||
uses: android-actions/setup-android@v3
|
||||
- name: Download arm64 susfsd
|
||||
uses: actions/download-artifact@v4
|
||||
with:
|
||||
name: susfsd-aarch64-linux-android
|
||||
path: .
|
||||
|
||||
- name: Copy susfsd to app jniLibs
|
||||
run: |
|
||||
mkdir -p app/src/main/jniLibs/arm64-v8a
|
||||
cp -f ../arm64-v8a/susfsd ../manager/app/src/main/jniLibs/arm64-v8a/libsusfsd.so
|
||||
|
||||
- name: Download arm64 ksud_overlayfs
|
||||
uses: actions/download-artifact@v4
|
||||
with:
|
||||
name: ksud_overlayfs-aarch64-linux-android
|
||||
path: ksud_overlayfs
|
||||
|
||||
|
||||
- name: Copy ksud_overlayfs to app jniLibs
|
||||
run: |
|
||||
cp -f ../ksud_overlayfs/aarch64-linux-android/release/ksud ../manager/app/src/main/jniLibs/arm64-v8a/libksud_overlayfs.so
|
||||
|
||||
|
||||
- name: Download arm64 ksud_magic
|
||||
uses: actions/download-artifact@v4
|
||||
with:
|
||||
name: ksud_magic-aarch64-linux-android
|
||||
path: ksud_magic
|
||||
|
||||
|
||||
- name: Copy ksud_magic to app jniLibs
|
||||
run: |
|
||||
cp -f ../ksud_magic/aarch64-linux-android/release/ksud ../manager/app/src/main/jniLibs/arm64-v8a/libksud_magic.so
|
||||
|
||||
|
||||
- name: Build with Gradle
|
||||
run: |
|
||||
@@ -115,14 +133,42 @@ jobs:
|
||||
chmod +x gradlew
|
||||
./gradlew clean assembleRelease
|
||||
|
||||
- name: Upload build artifact
|
||||
- name: Upload Build Artifact
|
||||
uses: actions/upload-artifact@v4
|
||||
with:
|
||||
name: manager
|
||||
name: Manager
|
||||
path: manager/app/build/outputs/apk/release/*.apk
|
||||
|
||||
- name: Upload mappings
|
||||
- name: Upload Mappings
|
||||
uses: actions/upload-artifact@v4
|
||||
with:
|
||||
name: "mappings"
|
||||
path: "manager/app/build/outputs/mapping/release/"
|
||||
name: Mappings
|
||||
path: manager/app/build/outputs/mapping/release/
|
||||
|
||||
- name: Bot Session Cache
|
||||
if: steps.need_upload.outputs.UPLOAD == 'true'
|
||||
id: bot_session_cache
|
||||
uses: actions/cache@v4
|
||||
with:
|
||||
path: scripts/ksunextbot.session
|
||||
key: ${{ runner.os }}-bot-session
|
||||
|
||||
- name: Upload to Telegram
|
||||
if: steps.need_upload.outputs.UPLOAD == 'true'
|
||||
env:
|
||||
API_ID: ${{ secrets.API_ID }}
|
||||
API_HASH: ${{ secrets.API_HASH }}
|
||||
CHAT_ID: ${{ secrets.CHAT_ID }}
|
||||
BOT_TOKEN: ${{ secrets.BOT_TOKEN }}
|
||||
MESSAGE_THREAD_ID: ${{ secrets.MESSAGE_THREAD_ID }}
|
||||
COMMIT_MESSAGE: ${{ github.event.head_commit.message }}
|
||||
COMMIT_URL: ${{ github.event.head_commit.url }}
|
||||
RUN_URL: ${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}
|
||||
TITLE: Release Manager (STABLE BUILD)
|
||||
run: |
|
||||
if [ ! -z "${{ secrets.BOT_TOKEN }}" ]; then
|
||||
export VERSION=$(git rev-list --count HEAD)
|
||||
APK=$(find ./app/build/outputs/apk/release -name "*.apk")
|
||||
pip3 install telethon
|
||||
python3 $GITHUB_WORKSPACE/scripts/ksunextbot.py $APK
|
||||
fi
|
||||
2
.github/workflows/build-su.yml
vendored
2
.github/workflows/build-su.yml
vendored
@@ -5,7 +5,7 @@ on:
|
||||
paths:
|
||||
- '.github/workflows/build-su.yml'
|
||||
- 'userspace/su/**'
|
||||
- 'scripts/ksubot.py'
|
||||
- 'scripts/ksunextbot.py'
|
||||
pull_request:
|
||||
branches: [ "next" ]
|
||||
paths:
|
||||
|
||||
37
.github/workflows/clippy.yml
vendored
37
.github/workflows/clippy.yml
vendored
@@ -6,13 +6,15 @@ on:
|
||||
- next
|
||||
paths:
|
||||
- '.github/workflows/clippy.yml'
|
||||
- 'userspace/ksud/**'
|
||||
- 'userspace/ksud_magic/**'
|
||||
- 'userspace/ksud_overlayfs/**'
|
||||
pull_request:
|
||||
branches:
|
||||
- main
|
||||
- next
|
||||
paths:
|
||||
- '.github/workflows/clippy.yml'
|
||||
- 'userspace/ksud/**'
|
||||
- 'userspace/ksud_magic/**'
|
||||
- 'userspace/ksud_overlayfs/**'
|
||||
|
||||
env:
|
||||
RUSTFLAGS: '-Dwarnings'
|
||||
@@ -21,17 +23,26 @@ jobs:
|
||||
clippy:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
- run: rustup update --force-non-host stable-x86_64-unknown-linux-gnu
|
||||
- uses: Swatinem/rust-cache@v2
|
||||
- name: Checkout Repository
|
||||
uses: actions/checkout@v4
|
||||
|
||||
- name: Setup Rust
|
||||
run: rustup update stable
|
||||
|
||||
- name: Setup Cross
|
||||
run: RUSTFLAGS="" cargo install cross
|
||||
|
||||
- name: Cache ksud_overlayfs
|
||||
uses: Swatinem/rust-cache@v2
|
||||
with:
|
||||
workspaces: userspace/ksud
|
||||
workspaces: userspace/ksud_overlayfs
|
||||
|
||||
- name: Install cross
|
||||
run: |
|
||||
cargo install cross --git https://github.com/cross-rs/cross --rev 66845c1
|
||||
- name: Cache ksud_magic
|
||||
uses: Swatinem/rust-cache@v2
|
||||
with:
|
||||
workspaces: userspace/ksud_magic
|
||||
|
||||
- name: Run clippy
|
||||
- name: Run Clippy
|
||||
run: |
|
||||
cross clippy --manifest-path userspace/ksud/Cargo.toml --target aarch64-linux-android --release
|
||||
cross clippy --manifest-path userspace/ksud/Cargo.toml --target x86_64-linux-android --release
|
||||
cross clippy --manifest-path userspace/ksud_magic/Cargo.toml --target aarch64-linux-android --release
|
||||
cross clippy --manifest-path userspace/ksud_overlayfs/Cargo.toml --target aarch64-linux-android --release
|
||||
11
.github/workflows/gki-kernel.yml
vendored
11
.github/workflows/gki-kernel.yml
vendored
@@ -131,8 +131,15 @@ jobs:
|
||||
DRIVER_KCONFIG=$GKI_ROOT/common/drivers/Kconfig
|
||||
grep -q "kernelsu" "$DRIVER_MAKEFILE" || printf "\nobj-\$(CONFIG_KSU) += kernelsu/\n" >> "$DRIVER_MAKEFILE"
|
||||
grep -q "kernelsu" "$DRIVER_KCONFIG" || sed -i "/endmenu/i\\source \"drivers/kernelsu/Kconfig\"" "$DRIVER_KCONFIG"
|
||||
echo "[+] Apply KernelSU-Next patches"
|
||||
cd $GKI_ROOT/common/ && git apply $GITHUB_WORKSPACE/KernelSU-Next/.github/patches/$PATCH_PATH/*.patch || echo "[-] No patch found"
|
||||
echo "[+] Apply Compilation Patches"
|
||||
if [ ! -e build/build.sh ]; then
|
||||
GLIBC_VERSION=$(ldd --version 2>/dev/null | head -n 1 | awk '{print $NF}')
|
||||
echo "GLIBC_VERSION: $GLIBC_VERSION"
|
||||
if [ "$(printf '%s\n' "2.38" "$GLIBC_VERSION" | sort -V | head -n1)" = "2.38" ]; then
|
||||
echo "Patching resolve_btfids/Makefile"
|
||||
cd $GKI_ROOT/common/ && sed -i '/\$(Q)\$(MAKE) -C \$(SUBCMD_SRC) OUTPUT=\$(abspath \$(dir \$@))\/ \$(abspath \$@)/s//$(Q)$(MAKE) -C $(SUBCMD_SRC) EXTRA_CFLAGS="$(CFLAGS)" OUTPUT=$(abspath $(dir $@))\/ $(abspath $@)/' tools/bpf/resolve_btfids/Makefile || echo "No patch needed."
|
||||
fi
|
||||
fi
|
||||
|
||||
if [ "$IS_DEBUG_KERNEL" = "true" ]; then
|
||||
echo "[+] Enable debug features for kernel"
|
||||
|
||||
79
.github/workflows/ksud.yml
vendored
Normal file
79
.github/workflows/ksud.yml
vendored
Normal file
@@ -0,0 +1,79 @@
|
||||
name: Build ksud
|
||||
on:
|
||||
workflow_call:
|
||||
inputs:
|
||||
target:
|
||||
required: true
|
||||
type: string
|
||||
os:
|
||||
required: false
|
||||
type: string
|
||||
default: ubuntu-latest
|
||||
pack_lkm:
|
||||
required: false
|
||||
type: boolean
|
||||
default: true
|
||||
use_cache:
|
||||
required: false
|
||||
type: boolean
|
||||
default: true
|
||||
jobs:
|
||||
build:
|
||||
runs-on: ${{ inputs.os }}
|
||||
steps:
|
||||
- name: Checkout Repository
|
||||
uses: actions/checkout@v4
|
||||
with:
|
||||
fetch-depth: 0
|
||||
|
||||
- name: Download Artifacts
|
||||
uses: actions/download-artifact@v4
|
||||
|
||||
- name: Prepare LKM Files
|
||||
if: ${{ inputs.pack_lkm }}
|
||||
run: |
|
||||
cp android*-lkm/*_kernelsu.ko ./userspace/ksud_overlayfs/bin/aarch64/
|
||||
cp android*-lkm/*_kernelsu.ko ./userspace/ksud_magic/bin/aarch64/
|
||||
|
||||
- name: Import susfsd Libraries
|
||||
run: |
|
||||
cp susfsd-aarch64-linux-android/arm64-v8a/susfsd ./userspace/ksud_overlayfs/bin/aarch64/
|
||||
cp susfsd-aarch64-linux-android/arm64-v8a/susfsd ./userspace/ksud_magic/bin/aarch64/
|
||||
|
||||
- name: Setup Rust
|
||||
run: |
|
||||
rustup update stable
|
||||
rustup target add aarch64-apple-darwin
|
||||
|
||||
- name: Cache ksud_overlayfs
|
||||
uses: Swatinem/rust-cache@v2
|
||||
with:
|
||||
workspaces: userspace/ksud_overlayfs
|
||||
cache-targets: false
|
||||
|
||||
- name: Cache ksud_magic
|
||||
uses: Swatinem/rust-cache@v2
|
||||
with:
|
||||
workspaces: userspace/ksud_magic
|
||||
cache-targets: false
|
||||
|
||||
- name: Setup Cross
|
||||
run: |
|
||||
RUSTFLAGS="" cargo install cross --git https://github.com/cross-rs/cross --rev 66845c1 --force
|
||||
|
||||
- name: Build ksud
|
||||
run: |
|
||||
CROSS_NO_WARNINGS=0 cross build --target ${{ inputs.target }} --release --manifest-path ./userspace/ksud_overlayfs/Cargo.toml
|
||||
CROSS_NO_WARNINGS=0 cross build --target ${{ inputs.target }} --release --manifest-path ./userspace/ksud_magic/Cargo.toml
|
||||
|
||||
- name: Upload ksud_overlayfs artifact
|
||||
uses: actions/upload-artifact@v4
|
||||
with:
|
||||
name: ksud_overlayfs-${{ inputs.target }}
|
||||
path: userspace/ksud_overlayfs/target/**/release/ksud*
|
||||
|
||||
- name: Upload ksud_magic artifact
|
||||
uses: actions/upload-artifact@v4
|
||||
with:
|
||||
name: ksud_magic-${{ inputs.target }}
|
||||
path: userspace/ksud_magic/target/**/release/ksud*
|
||||
57
.github/workflows/ksud_magic.yml
vendored
57
.github/workflows/ksud_magic.yml
vendored
@@ -1,57 +0,0 @@
|
||||
name: Build ksud_magic
|
||||
on:
|
||||
workflow_call:
|
||||
inputs:
|
||||
target:
|
||||
required: true
|
||||
type: string
|
||||
os:
|
||||
required: false
|
||||
type: string
|
||||
default: ubuntu-latest
|
||||
pack_lkm:
|
||||
required: false
|
||||
type: boolean
|
||||
default: true
|
||||
use_cache:
|
||||
required: false
|
||||
type: boolean
|
||||
default: true
|
||||
jobs:
|
||||
build:
|
||||
runs-on: ${{ inputs.os }}
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
with:
|
||||
fetch-depth: 0
|
||||
|
||||
- name: Download artifacts
|
||||
uses: actions/download-artifact@v4
|
||||
|
||||
- name: Prepare LKM fies
|
||||
if: ${{ inputs.pack_lkm }}
|
||||
run: |
|
||||
cp android*-lkm/*_kernelsu.ko ./userspace/ksud_magic/bin/aarch64/
|
||||
|
||||
- name: Setup rustup
|
||||
run: |
|
||||
rustup update stable
|
||||
rustup target add x86_64-apple-darwin
|
||||
rustup target add aarch64-apple-darwin
|
||||
- uses: Swatinem/rust-cache@v2
|
||||
with:
|
||||
workspaces: userspace/ksud_magic
|
||||
cache-targets: false
|
||||
|
||||
- name: Install cross
|
||||
run: |
|
||||
cargo install cross --git https://github.com/cross-rs/cross --rev 66845c1 --force
|
||||
|
||||
- name: Build ksud_magic
|
||||
run: CROSS_NO_WARNINGS=0 cross build --target ${{ inputs.target }} --release --manifest-path ./userspace/ksud_magic/Cargo.toml
|
||||
|
||||
- name: Upload ksud_magic artifact
|
||||
uses: actions/upload-artifact@v4
|
||||
with:
|
||||
name: ksud_magic-${{ inputs.target }}
|
||||
path: userspace/ksud_magic/target/**/release/ksud*
|
||||
57
.github/workflows/ksud_overlayfs.yml
vendored
57
.github/workflows/ksud_overlayfs.yml
vendored
@@ -1,57 +0,0 @@
|
||||
name: Build ksud_overlayfs
|
||||
on:
|
||||
workflow_call:
|
||||
inputs:
|
||||
target:
|
||||
required: true
|
||||
type: string
|
||||
os:
|
||||
required: false
|
||||
type: string
|
||||
default: ubuntu-latest
|
||||
pack_lkm:
|
||||
required: false
|
||||
type: boolean
|
||||
default: true
|
||||
use_cache:
|
||||
required: false
|
||||
type: boolean
|
||||
default: true
|
||||
jobs:
|
||||
build:
|
||||
runs-on: ${{ inputs.os }}
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
with:
|
||||
fetch-depth: 0
|
||||
|
||||
- name: Download artifacts
|
||||
uses: actions/download-artifact@v4
|
||||
|
||||
- name: Prepare LKM fies
|
||||
if: ${{ inputs.pack_lkm }}
|
||||
run: |
|
||||
cp android*-lkm/*_kernelsu.ko ./userspace/ksud_overlayfs/bin/aarch64/
|
||||
|
||||
- name: Setup rustup
|
||||
run: |
|
||||
rustup update stable
|
||||
rustup target add x86_64-apple-darwin
|
||||
rustup target add aarch64-apple-darwin
|
||||
- uses: Swatinem/rust-cache@v2
|
||||
with:
|
||||
workspaces: userspace/ksud_overlayfs
|
||||
cache-targets: false
|
||||
|
||||
- name: Install cross
|
||||
run: |
|
||||
cargo install cross --git https://github.com/cross-rs/cross --rev 66845c1 --force
|
||||
|
||||
- name: Build ksud_overlayfs
|
||||
run: CROSS_NO_WARNINGS=0 cross build --target ${{ inputs.target }} --release --manifest-path ./userspace/ksud_overlayfs/Cargo.toml
|
||||
|
||||
- name: Upload ksud_overlayfs artifact
|
||||
uses: actions/upload-artifact@v4
|
||||
with:
|
||||
name: ksud_overlayfs-${{ inputs.target }}
|
||||
path: userspace/ksud_overlayfs/target/**/release/ksud*
|
||||
5
.github/workflows/release.yml
vendored
5
.github/workflows/release.yml
vendored
@@ -27,6 +27,7 @@ jobs:
|
||||
- build-a12-kernel
|
||||
- build-a13-kernel
|
||||
- build-a14-kernel
|
||||
- build-a15-kernel
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Download artifacts
|
||||
@@ -51,4 +52,6 @@ jobs:
|
||||
android*-lkm/*_kernelsu.ko
|
||||
AnyKernel3-*.zip
|
||||
boot-images-*/Image-*/*.img.gz
|
||||
ksud-*
|
||||
ksud_magic-*
|
||||
ksud_overlayfs-*
|
||||
susfsd-*
|
||||
13
.github/workflows/rustfmt.yml
vendored
13
.github/workflows/rustfmt.yml
vendored
@@ -6,13 +6,15 @@ on:
|
||||
- 'next'
|
||||
paths:
|
||||
- '.github/workflows/rustfmt.yml'
|
||||
- 'userspace/ksud/**'
|
||||
- 'userspace/ksud_magic/**'
|
||||
- 'userspace/ksud_overlayfs/**'
|
||||
pull_request:
|
||||
branches:
|
||||
- 'next'
|
||||
paths:
|
||||
- '.github/workflows/rustfmt.yml'
|
||||
- 'userspace/ksud/**'
|
||||
- 'userspace/ksud_magic/**'
|
||||
- 'userspace/ksud_overlayfs/**'
|
||||
|
||||
permissions:
|
||||
checks: write
|
||||
@@ -30,4 +32,9 @@ jobs:
|
||||
- uses: LoliGothick/rustfmt-check@master
|
||||
with:
|
||||
token: ${{ github.token }}
|
||||
working-directory: userspace/ksud
|
||||
working-directory: userspace/ksud_magic
|
||||
|
||||
- uses: LoliGothick/rustfmt-check@master
|
||||
with:
|
||||
token: ${{ github.token }}
|
||||
working-directory: userspace/ksud_overlayfs
|
||||
2
.github/workflows/shellcheck.yml
vendored
2
.github/workflows/shellcheck.yml
vendored
@@ -24,4 +24,4 @@ jobs:
|
||||
uses: ludeeus/action-shellcheck@2.0.0
|
||||
with:
|
||||
ignore_names: gradlew
|
||||
ignore_paths: ./userspace/ksud/src/installer.sh
|
||||
ignore_paths: ./userspace/ksud_magic/src/installer.sh ./userspace/ksud_overlayfs/src/installer.sh
|
||||
34
.github/workflows/susfsd.yml
vendored
Normal file
34
.github/workflows/susfsd.yml
vendored
Normal file
@@ -0,0 +1,34 @@
|
||||
name: Build susfsd
|
||||
on:
|
||||
push:
|
||||
branches: [ "next" ]
|
||||
paths:
|
||||
- '.github/workflows/susfsd.yml'
|
||||
- 'userspace/susfsd/**'
|
||||
workflow_dispatch:
|
||||
workflow_call:
|
||||
inputs:
|
||||
target:
|
||||
required: true
|
||||
type: string
|
||||
os:
|
||||
required: false
|
||||
type: string
|
||||
default: ubuntu-latest
|
||||
jobs:
|
||||
build-susfs:
|
||||
name: Build userspace susfsd
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
with:
|
||||
fetch-depth: 0
|
||||
- name: Build susfsd
|
||||
working-directory: ./userspace/susfsd
|
||||
run: $ANDROID_NDK/ndk-build
|
||||
- name: Upload a Build Artifact
|
||||
uses: actions/upload-artifact@v4
|
||||
with:
|
||||
name: susfsd-aarch64-linux-android
|
||||
path: ./userspace/susfsd/libs
|
||||
|
||||
@@ -1,34 +1,34 @@
|
||||
**English** | [简体中文](README_CN.md) | [Türkçe](README_TR.md) | [Português (Brasil)](README_PT-BR.md) | [한국어](README_KO.md)
|
||||
**English** | [简体中文](README_CN.md) | [繁體中文](README_TW.md) | [Türkçe](README_TR.md) | [Português (Brasil)](README_PT-BR.md) | [한국어](README_KO.md) | [Français](README_FR.md) | [Bahasa Indonesia](README_ID.md) | [Русский](README_RU.md) | [ภาษาไทย](README_TH.md) | [Tiếng Việt](README_VI.md)
|
||||
|
||||
# KernelSU Next
|
||||
|
||||
<img src="/assets/kernelsu_next.png" style="width: 96px;" alt="logo">
|
||||
|
||||
A Kernel-based root solution for Android devices.
|
||||
A kernel-based root solution for Android devices.
|
||||
|
||||
[](https://github.com/rifsxd/KernelSU-Next/releases/latest)
|
||||
[](https://nightly.link/rifsxd/KernelSU-Next/workflows/build-manager/next/manager)
|
||||
[](https://github.com/KernelSU-Next/KernelSU-Next/releases/latest)
|
||||
[](https://nightly.link/KernelSU-Next/KernelSU-Next/workflows/build-manager-ci/next/Manager)
|
||||
[](https://www.gnu.org/licenses/old-licenses/gpl-2.0.en.html)
|
||||
[](/LICENSE)
|
||||
[](/LICENSE)
|
||||
|
||||
## Features
|
||||
|
||||
1. Kernel-based `su` and root access management.
|
||||
2. Module system based on dynamic mount system [Magic Mount](https://github.com/topjohnwu/Magisk/blob/c512496847d182526f2043295ecfd275398eccac/docs/releases/26100.md#new-magic-mount-implementation) / [OverlayFS](https://en.wikipedia.org/wiki/OverlayFS).
|
||||
2. Module system based on dynamic mount system [Magic Mount](https://topjohnwu.github.io/Magisk/details.html#magic-mount) / [OverlayFS](https://en.wikipedia.org/wiki/OverlayFS).
|
||||
3. [App Profile](https://kernelsu.org/guide/app-profile.html): Lock up the root power in a cage.
|
||||
|
||||
## Compatibility State
|
||||
## Compatibility state
|
||||
|
||||
KernelSU Next officially supports most Android kernels starting from 4.4 up to 6.6.
|
||||
- GKI 2.0 (5.10+) kernels can run pre-built images and LKM/KMI.
|
||||
- GKI 1.0 (4.19 - 5.4) kernels need to rebuilt with KernelSU driver.
|
||||
- EOL (<4.14) kernels also need to be rebuilt with KernelSU driver (3.18+ is experimental and may need some function backports).
|
||||
|
||||
Currently, only `arm64-v8a` is supported.
|
||||
Currently, only the `arm64-v8a` architecture is supported.
|
||||
|
||||
## Usage
|
||||
|
||||
- [Installation instruction](https://rifsxd.github.io/KernelSU-Next/)
|
||||
- [Installation instruction](https://KernelSU-Next.github.io/KernelSU-Next/)
|
||||
|
||||
## Security
|
||||
|
||||
@@ -39,11 +39,25 @@ For information on reporting security vulnerabilities in KernelSU, see [SECURITY
|
||||
- Files under the `kernel` directory are [GPL-2.0-only](https://www.gnu.org/licenses/old-licenses/gpl-2.0.en.html).
|
||||
- All other parts except the `kernel` directory are [GPL-3.0-or-later](https://www.gnu.org/licenses/gpl-3.0.html).
|
||||
|
||||
## Donations
|
||||
|
||||
- 0x12b5224b7aca0121c2f003240a901e1d064371c1 [ USDT BEP20 ]
|
||||
|
||||
- TYUVMWGTcnR5svnDoX85DWHyqUAeyQcdjh [ USDT TRC20 ]
|
||||
|
||||
- 0x12b5224b7aca0121c2f003240a901e1d064371c1 [ USDT ERC20 ]
|
||||
|
||||
- 0x12b5224b7aca0121c2f003240a901e1d064371c1 [ ETH ERC20 ]
|
||||
|
||||
- Ld238uYBuRQdZB5YwdbkuU6ektBAAUByoL [ LTC ]
|
||||
|
||||
- 19QgifcjMjSr1wB2DJcea5cxitvWVcXMT6 [ BTC ]
|
||||
|
||||
## Credits
|
||||
|
||||
- [kernel-assisted-superuser](https://git.zx2c4.com/kernel-assisted-superuser/about/): the KernelSU idea.
|
||||
- [Magisk](https://github.com/topjohnwu/Magisk): the powerful root tool.
|
||||
- [genuine](https://github.com/brevent/genuine/): apk v2 signature validation.
|
||||
- [Diamorphine](https://github.com/m0nad/Diamorphine): some rootkit skills.
|
||||
- [KernelSU](https://github.com/tiann/KernelSU): thanks to tiann, or else KernelSU Next wouldn't even exist.
|
||||
- [Kernel-Assisted Superuser](https://git.zx2c4.com/kernel-assisted-superuser/about/): The KernelSU idea.
|
||||
- [Magisk](https://github.com/topjohnwu/Magisk): The powerful root tool.
|
||||
- [genuine](https://github.com/brevent/genuine/): APK v2 signature validation.
|
||||
- [Diamorphine](https://github.com/m0nad/Diamorphine): Some rootkit skills.
|
||||
- [KernelSU](https://github.com/tiann/KernelSU): Thanks to tiann, or else KernelSU Next wouldn't even exist.
|
||||
- [Magic Mount Port](https://github.com/5ec1cff/KernelSU/blob/main/userspace/ksud/src/magic_mount.rs): 💜 5ec1cff for saving KernelSU!
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
[English](README.md) | **简体中文** | [Türkçe](README_TR.md) | [Português (Brasil)](README_PT-BR.md) | [한국어](README_KO.md)
|
||||
[English](README.md) | **简体中文** | [繁體中文](README_TW.md) | [Türkçe](README_TR.md) | [Português (Brasil)](README_PT-BR.md) | [한국어](README_KO.md) | [Français](README_FR.md) | [Bahasa Indonesia](README_ID.md) | [Русский](README_RU.md) | [ภาษาไทย](README_TH.md) | [Tiếng Việt](README_VI.md)
|
||||
|
||||
# KernelSU Next
|
||||
|
||||
@@ -6,15 +6,15 @@
|
||||
|
||||
安卓基于内核的 Root 方案
|
||||
|
||||
[](https://github.com/rifsxd/KernelSU-Next/releases/latest)
|
||||
[](https://nightly.link/rifsxd/KernelSU-Next/workflows/build-manager/next/manager)
|
||||
[](https://github.com/KernelSU-Next/KernelSU-Next/releases/latest)
|
||||
[](https://nightly.link/KernelSU-Next/KernelSU-Next/workflows/build-manager-ci/next/Manager)
|
||||
[](https://www.gnu.org/licenses/old-licenses/gpl-2.0.en.html)
|
||||
[](/LICENSE)
|
||||
[](/LICENSE)
|
||||
|
||||
## 特性
|
||||
|
||||
1. 基于内核的 SU 和权限管理
|
||||
2. 基于动态挂载系统 [Magic Mount](https://github.com/topjohnwu/Magisk/blob/c512496847d182526f2043295ecfd275398eccac/docs/releases/26100.md#new-magic-mount-implementation) / [OverlayFS](https://en.wikipedia.org/wiki/OverlayFS) 的模块系统。
|
||||
1. 基于内核的 `SU` 和权限管理
|
||||
2. 基于动态挂载系统 [Magic Mount](https://topjohnwu.github.io/Magisk/details.html#magic-mount) / [OverlayFS](https://en.wikipedia.org/wiki/OverlayFS) 的模块系统。
|
||||
3. [App Profile](https://kernelsu.org/zh_CN/guide/app-profile.html):把 Root 权限关进笼子里
|
||||
|
||||
## 兼容状态
|
||||
@@ -22,13 +22,13 @@
|
||||
KernelSU Next 支持从 4.4 到 6.6 的大多数安卓内核
|
||||
- GKI 2.0(5.10+)内核可运行预置镜像和 LKM/KMI
|
||||
- GKI 1.0(4.19 - 5.4)内核需要使用 KernelSU 内核驱动重新编译
|
||||
- EOL (<4.14) 内核也需要使用 KernelSU 内核驱动重新编译 (3.18+ 這是一個實驗版本,可能需要一些功能回溯。)
|
||||
- EOL (<4.14) 内核也需要使用 KernelSU 内核驱动重新编译 (3.18+ 的版本处于试验阶段,可能需要移植一些功能)
|
||||
|
||||
目前只支持 `arm64-v8a` 架构
|
||||
|
||||
## 用法
|
||||
|
||||
- [安装说明](https://rifsxd.github.io/KernelSU-Next/)
|
||||
- [安装说明](https://KernelSU-Next.github.io/KernelSU-Next/)
|
||||
|
||||
## 安全性
|
||||
|
||||
@@ -41,9 +41,9 @@ KernelSU Next 支持从 4.4 到 6.6 的大多数安卓内核
|
||||
|
||||
## 鸣谢
|
||||
|
||||
- [kernel-assisted-superuser](https://git.zx2c4.com/kernel-assisted-superuser/about/): KernelSU 的灵感.
|
||||
- [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 签名验证。
|
||||
- [genuine](https://github.com/brevent/genuine/): APK v2 签名验证。
|
||||
- [Diamorphine](https://github.com/m0nad/Diamorphine): 一些 Rootkit 技巧。
|
||||
- [KernelSU](https://github.com/tiann/KernelSU): 感谢 tiann,否则 KernelSU Next 根本不会存在。
|
||||
- [Magic Mount Port](https://github.com/5ec1cff/KernelSU/blob/main/userspace/ksud/src/magic_mount.rs): 💜 5ec1cff 為了拯救 KernelSU!
|
||||
|
||||
49
docs/README_FR.md
Normal file
49
docs/README_FR.md
Normal file
@@ -0,0 +1,49 @@
|
||||
[English](README.md) | [简体中文](README_CN.md) | [繁體中文](README_TW.md) | [Türkçe](README_TR.md) | [Português (Brasil)](README_PT-BR.md) | [한국어](README_KO.md) | **Français** | [Bahasa Indonesia](README_ID.md) | [Русский](README_RU.md) | [ภาษาไทย](README_TH.md) | [Tiếng Việt](README_VI.md)
|
||||
|
||||
# KernelSU Next
|
||||
|
||||
<img src="/assets/kernelsu_next.png" style="width: 96px;" alt="logo">
|
||||
|
||||
Une solution root basée sur le noyau pour les appareils Android.
|
||||
|
||||
[](https://github.com/KernelSU-Next/KernelSU-Next/releases/latest)
|
||||
[](https://nightly.link/KernelSU-Next/KernelSU-Next/workflows/build-manager-ci/next/Manager)
|
||||
[](https://www.gnu.org/licenses/old-licenses/gpl-2.0.en.html)
|
||||
[](/LICENSE)
|
||||
|
||||
## Fonctionnalités
|
||||
|
||||
1. Gestion des accès root et de la commande `su` basée sur le noyau.
|
||||
2. Système de modules basé sur le système de montage dynamique [Magic Mount](https://topjohnwu.github.io/Magisk/details.html#magic-mount) / [OverlayFS](https://en.wikipedia.org/wiki/OverlayFS).
|
||||
3. [Profil d'application](https://kernelsu.org/guide/app-profile.html) : Enfermez la puissance du root dans une cage.
|
||||
|
||||
## État de compatibilité
|
||||
|
||||
KernelSU Next prend officiellement en charge la plupart des noyaux Android de la version 4.4 à la version 6.6.
|
||||
- Les noyaux GKI 2.0 (5.10+) peuvent exécuter des images pré-construites et des modules LKM/KMI.
|
||||
- Les noyaux GKI 1.0 (4.19 - 5.4) doivent être reconstruits avec le pilote KernelSU.
|
||||
- Les noyaux EOL (<4.14) doivent également être reconstruits avec le pilote KernelSU (3.18+ est expérimental et peut nécessiter des rétroportages fonctionnels).
|
||||
|
||||
Actuellement, seul `arm64-v8a` est pris en charge.
|
||||
|
||||
## Utilisation
|
||||
|
||||
- [Instructions d'installation](https://KernelSU-Next.github.io/KernelSU-Next/)
|
||||
|
||||
## Sécurité
|
||||
|
||||
Pour signaler des vulnérabilités de sécurité dans KernelSU, consultez [SECURITY.md](/SECURITY.md).
|
||||
|
||||
## Licence
|
||||
|
||||
- Les fichiers du répertoire `kernel` sont sous licence [GPL-2.0-only](https://www.gnu.org/licenses/old-licenses/gpl-2.0.en.html).
|
||||
- Toutes les autres parties, sauf le répertoire `kernel`, sont sous licence [GPL-3.0-or-later](https://www.gnu.org/licenses/gpl-3.0.html).
|
||||
|
||||
## Crédits
|
||||
|
||||
- [Kernel-Assisted Superuser](https://git.zx2c4.com/kernel-assisted-superuser/about/) : L'idée de KernelSU.
|
||||
- [Magisk](https://github.com/topjohnwu/Magisk) : L'outil root puissant.
|
||||
- [genuine](https://github.com/brevent/genuine/) : Validation de signature APK v2.
|
||||
- [Diamorphine](https://github.com/m0nad/Diamorphine) : Quelques techniques de rootkit.
|
||||
- [KernelSU](https://github.com/tiann/KernelSU) : Merci à tiann, sans qui KernelSU Next n'existerait même pas.
|
||||
- [Magic Mount Port](https://github.com/5ec1cff/KernelSU/blob/main/userspace/ksud/src/magic_mount.rs) : 💜 5ec1cff pour avoir sauvé KernelSU !
|
||||
49
docs/README_ID.md
Normal file
49
docs/README_ID.md
Normal file
@@ -0,0 +1,49 @@
|
||||
[English](README.md) | [简体中文](README_CN.md) | [繁體中文](README_TW.md) | [Türkçe](README_TR.md) | [Português (Brasil)](README_PT-BR.md) | [한국어](README_KO.md) | [Français](README_FR.md) | **Bahasa Indonesia** | [Русский](README_RU.md) | [ภาษาไทย](README_TH.md) | [Tiếng Việt](README_VI.md)
|
||||
|
||||
# KernelSU Next
|
||||
|
||||
<img src="/assets/kernelsu_next.png" style="width: 96px;" alt="logo">
|
||||
|
||||
Sebuah solusi root berbasis Kernel untuk perangkat Android.
|
||||
|
||||
[](https://github.com/KernelSU-Next/KernelSU-Next/releases/latest)
|
||||
[](https://nightly.link/KernelSU-Next/KernelSU-Next/workflows/build-manager-ci/next/Manager)
|
||||
[](https://www.gnu.org/licenses/old-licenses/gpl-2.0.en.html)
|
||||
[](/LICENSE)
|
||||
|
||||
## Fitur
|
||||
|
||||
1. Akses root dan manajemen `su` berbasis Kernel.
|
||||
2. Sistem modul berbasis sistem mount dinamis [Magic Mount](https://topjohnwu.github.io/Magisk/details.html#magic-mount) / [OverlayFS](https://en.wikipedia.org/wiki/OverlayFS).
|
||||
3. [Profil Aplikasi](https://kernelsu.org/guide/app-profile.html): Mengunci kekuatan root dalam sebuah kandang.
|
||||
|
||||
## Status Kompatibilitas
|
||||
|
||||
KernelSU Next secara resmi mendukung sebagian besar kernel Android mulai dari 4.4 hingga 6.6.
|
||||
- Kernel GKI 2.0 (5.10+) dapat menjalankan gambar yang telah dibangun sebelumnya dan LKM/KMI.
|
||||
- Kernel GKI 1.0 (4.19 - 5.4) perlu dibangun ulang dengan driver KernelSU.
|
||||
- Kernel EOL (<4.14) juga perlu dibangun ulang dengan driver KernelSU (3.18+ bersifat eksperimental dan mungkin memerlukan beberapa backport fungsi).
|
||||
|
||||
Saat ini, hanya `arm64-v8a` yang didukung.
|
||||
|
||||
## Penggunaan
|
||||
|
||||
- [Petunjuk instalasi](https://KernelSU-Next.github.io/KernelSU-Next/)
|
||||
|
||||
## Keamanan
|
||||
|
||||
Untuk informasi tentang melaporkan kerentanannya di KernelSU, lihat [SECURITY.md](/SECURITY.md).
|
||||
|
||||
## Lisensi
|
||||
|
||||
- File di bawah direktori `kernel` menggunakan lisensi [GPL-2.0-only](https://www.gnu.org/licenses/old-licenses/gpl-2.0.en.html).
|
||||
- Semua bagian lain kecuali direktori `kernel` menggunakan lisensi [GPL-3.0-or-later](https://www.gnu.org/licenses/gpl-3.0.html).
|
||||
|
||||
## Kredit
|
||||
|
||||
- [Kernel-Assisted Superuser](https://git.zx2c4.com/kernel-assisted-superuser/about/): Ide KernelSU.
|
||||
- [Magisk](https://github.com/topjohnwu/Magisk): Alat root yang kuat.
|
||||
- [genuine](https://github.com/brevent/genuine/): Validasi tanda tangan APK v2.
|
||||
- [Diamorphine](https://github.com/m0nad/Diamorphine): Beberapa keterampilan rootkit.
|
||||
- [KernelSU](https://github.com/tiann/KernelSU): Terima kasih kepada tiann, jika tidak, KernelSU Next bahkan tidak akan ada.
|
||||
- [Magic Mount Port](https://github.com/5ec1cff/KernelSU/blob/main/userspace/ksud/src/magic_mount.rs): 💜 5ec1cff karena menyelamatkan KernelSU!
|
||||
@@ -1,4 +1,4 @@
|
||||
[English](README.md) | [简体中文](README_CN.md) | [Türkçe](README_TR.md) | [Português (Brasil)](README_PT-BR.md) | **한국어**
|
||||
[English](README.md) | [简体中文](README_CN.md) | [繁體中文](README_TW.md) | [Türkçe](README_TR.md) | [Português (Brasil)](README_PT-BR.md) | **한국어** | [Français](README_FR.md) | [Bahasa Indonesia](README_ID.md) | [Русский](README_RU.md) | [ภาษาไทย](README_TH.md) | [Tiếng Việt](README_VI.md)
|
||||
|
||||
# KernelSU Next
|
||||
|
||||
@@ -6,15 +6,15 @@
|
||||
|
||||
안드로이드 기기들을 위한 커널 기반 루팅 솔루션입니다.
|
||||
|
||||
[](https://github.com/rifsxd/KernelSU-Next/releases/latest)
|
||||
[](https://nightly.link/rifsxd/KernelSU-Next/workflows/build-manager/next/manager)
|
||||
[](https://github.com/KernelSU-Next/KernelSU-Next/releases/latest)
|
||||
[](https://nightly.link/KernelSU-Next/KernelSU-Next/workflows/build-manager-ci/next/Manager)
|
||||
[](https://www.gnu.org/licenses/old-licenses/gpl-2.0.en.html)
|
||||
[](/LICENSE)
|
||||
[](/LICENSE)
|
||||
|
||||
## 기능
|
||||
|
||||
1. 커널 기반 `su` 및 루트 권한 관리
|
||||
2. 동적 마운트 시스템 기반 모듈 시스템 [Magic Mount](https://github.com/topjohnwu/Magisk/blob/c512496847d182526f2043295ecfd275398eccac/docs/releases/26100.md#new-magic-mount-implementation) / [OverlayFS](https://en.wikipedia.org/wiki/OverlayFS).
|
||||
2. 동적 마운트 시스템 기반 모듈 시스템 [Magic Mount](https://topjohnwu.github.io/Magisk/details.html#magic-mount) / [OverlayFS](https://en.wikipedia.org/wiki/OverlayFS).
|
||||
3. [App Profile](https://kernelsu.org/guide/app-profile.html): 루트 권한 제한
|
||||
|
||||
## 호환 상태
|
||||
@@ -28,7 +28,7 @@ KernelSU Next는 공식적으로 대부분의 4.4부터 6.6의 안드로이드
|
||||
|
||||
## 사용 방법
|
||||
|
||||
- [설치 방법](https://rifsxd.github.io/KernelSU-Next/)
|
||||
- [설치 방법](https://KernelSU-Next.github.io/KernelSU-Next/)
|
||||
|
||||
## 보안
|
||||
|
||||
@@ -41,9 +41,9 @@ KernelSU의 보안 취약점 보고에 대한 자세한 내용은 [SECURITY.md](
|
||||
|
||||
## 크레딧
|
||||
|
||||
- [kernel-assisted-superuser](https://git.zx2c4.com/kernel-assisted-superuser/about/): KernelSU의 아이디어
|
||||
- [Kernel-Assisted Superuser](https://git.zx2c4.com/kernel-assisted-superuser/about/): KernelSU의 아이디어
|
||||
- [Magisk](https://github.com/topjohnwu/Magisk): 강력한 루팅 도구
|
||||
- [genuine](https://github.com/brevent/genuine/): apk v2 서명 검사
|
||||
- [genuine](https://github.com/brevent/genuine/): APK v2 서명 검사
|
||||
- [Diamorphine](https://github.com/m0nad/Diamorphine): 일부 rootkit 기술
|
||||
- [KernelSU](https://github.com/tiann/KernelSU): KernelSU Next가 존재할 수 있게 해 준 tiann에게 감사드립니다.
|
||||
- [Magic Mount Port](https://github.com/5ec1cff/KernelSU/blob/main/userspace/ksud/src/magic_mount.rs): KernelSU를 구해준 5ec1cff에게 감사드립니다!
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
[English](README.md) | [简体中文](README_CN.md) | [Türkçe](README_TR.md) | **Português (Brasil)** | [한국어](README_KO.md)
|
||||
[English](README.md) | [简体中文](README_CN.md) | [繁體中文](README_TW.md) | [Türkçe](README_TR.md) | **Português (Brasil)** | [한국어](README_KO.md) | [Français](README_FR.md) | [Bahasa Indonesia](README_ID.md) | [Русский](README_RU.md) | [ภาษาไทย](README_TH.md) | [Tiếng Việt](README_VI.md)
|
||||
|
||||
# KernelSU Next
|
||||
|
||||
@@ -6,15 +6,15 @@
|
||||
|
||||
Uma solução root baseada em kernel para dispositivos Android.
|
||||
|
||||
[](https://github.com/rifsxd/KernelSU-Next/releases/latest)
|
||||
[](https://nightly.link/rifsxd/KernelSU-Next/workflows/build-manager/next/manager)
|
||||
[](https://github.com/KernelSU-Next/KernelSU-Next/releases/latest)
|
||||
[](https://nightly.link/KernelSU-Next/KernelSU-Next/workflows/build-manager-ci/next/Manager)
|
||||
[](https://www.gnu.org/licenses/old-licenses/gpl-2.0.en.html)
|
||||
[](/LICENSE)
|
||||
[](/LICENSE)
|
||||
|
||||
## Características
|
||||
|
||||
1. `su` e gerenciamento de acesso root baseado em kernel.
|
||||
2. Sistema de módulos baseado em sistema de montagem dinâmica [Magic Mount](https://github.com/topjohnwu/Magisk/blob/c512496847d182526f2043295ecfd275398eccac/docs/releases/26100.md#new-magic-mount-implementation) / [OverlayFS](https://en.wikipedia.org/wiki/OverlayFS).
|
||||
2. Sistema de módulos baseado em sistema de montagem dinâmica [Magic Mount](https://topjohnwu.github.io/Magisk/details.html#magic-mount) / [OverlayFS](https://en.wikipedia.org/wiki/OverlayFS).
|
||||
3. [Perfil do Aplicativo](https://kernelsu.org/pt_BR/guide/app-profile.html): Tranque o poder root em uma gaiola.
|
||||
|
||||
## Estado de compatibilidade
|
||||
@@ -24,11 +24,11 @@ KernelSU Next suporta oficialmente a maioria dos kernels Android a partir de 4.4
|
||||
- Os kernels GKI 1.0 (4.19 - 5.4) precisam ser reconstruídos com o driver KernelSU.
|
||||
- Os kernels EOL (<4.14) também precisam ser reconstruídos com o driver KernelSU (3.18+ é experimental e pode precisar portar algumas funções).
|
||||
|
||||
Atualmente, apenas `arm64-v8a` é suportado.
|
||||
Atualmente, apenas a arquitetura `arm64-v8a` é compatível.
|
||||
|
||||
## Uso
|
||||
|
||||
- [Instruções de instalação](https://rifsxd.github.io/KernelSU-Next/)
|
||||
- [Instruções de instalação](https://KernelSU-Next.github.io/KernelSU-Next/)
|
||||
|
||||
## Segurança
|
||||
|
||||
@@ -39,11 +39,25 @@ Para obter informações sobre como relatar vulnerabilidades de segurança do Ke
|
||||
- Os arquivos no diretório `kernel` são [GPL-2.0-only](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.0-or-later](https://www.gnu.org/licenses/gpl-3.0.html).
|
||||
|
||||
## Doações
|
||||
|
||||
- 0x12b5224b7aca0121c2f003240a901e1d064371c1 [ USDT BEP20 ]
|
||||
|
||||
- TYUVMWGTcnR5svnDoX85DWHyqUAeyQcdjh [ USDT TRC20 ]
|
||||
|
||||
- 0x12b5224b7aca0121c2f003240a901e1d064371c1 [ USDT ERC20 ]
|
||||
|
||||
- 0x12b5224b7aca0121c2f003240a901e1d064371c1 [ ETH ERC20 ]
|
||||
|
||||
- Ld238uYBuRQdZB5YwdbkuU6ektBAAUByoL [ LTC ]
|
||||
|
||||
- 19QgifcjMjSr1wB2DJcea5cxitvWVcXMT6 [ BTC ]
|
||||
|
||||
## Créditos
|
||||
|
||||
- [kernel-assisted-superuser](https://git.zx2c4.com/kernel-assisted-superuser/about/): a ideia do KernelSU.
|
||||
- [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.
|
||||
- [KernelSU](https://github.com/tiann/KernelSU): obrigado a tiann, ou então o KernelSU Next nem existiria.
|
||||
- [Kernel-Assisted Superuser](https://git.zx2c4.com/kernel-assisted-superuser/about/): A ideia do KernelSU.
|
||||
- [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.
|
||||
- [KernelSU](https://github.com/tiann/KernelSU): Obrigado ao tiann, ou então o KernelSU Next nem existiria.
|
||||
- [Magic Mount Port](https://github.com/5ec1cff/KernelSU/blob/main/userspace/ksud/src/magic_mount.rs): 💜 5ec1cff por salvar o KernelSU!
|
||||
|
||||
49
docs/README_RU.md
Normal file
49
docs/README_RU.md
Normal file
@@ -0,0 +1,49 @@
|
||||
[English](README.md) | [简体中文](README_CN.md) | [繁體中文](README_TW.md) | [Türkçe](README_TR.md) | [Português (Brasil)](README_PT-BR.md) | [한국어](README_KO.md) | [Français](README_FR.md) | [Bahasa Indonesia](README_ID.md) | **Русский** | [ภาษาไทย](README_TH.md) | [Tiếng Việt](README_VI.md)
|
||||
|
||||
# KernelSU Next
|
||||
|
||||
<img src="/assets/kernelsu_next.png" style="width: 96px;" alt="logo">
|
||||
|
||||
Root-решение для Android на базе ядра.
|
||||
|
||||
[](https://github.com/KernelSU-Next/KernelSU-Next/releases/latest)
|
||||
[](https://nightly.link/KernelSU-Next/KernelSU-Next/workflows/build-manager-ci/next/Manager)
|
||||
[](https://www.gnu.org/licenses/old-licenses/gpl-2.0.en.html)
|
||||
[](/LICENSE)
|
||||
|
||||
## Функции
|
||||
|
||||
1. Реализация `su` и управление root-доступом прямо на уровне ядра.
|
||||
2. Динамическая система модулей, построенная на [Magic Mount](https://topjohnwu.github.io/Magisk/details.html#magic-mount) / [OverlayFS](https://en.wikipedia.org/wiki/OverlayFS).
|
||||
3. [Профиль для приложений](https://kernelsu.org/guide/app-profile.html): позволяет ограничить root-доступ в песочницу для отдельных приложений.
|
||||
|
||||
## Совместимость
|
||||
|
||||
KernelSU Next работает с большинством ядер Android (4.4 - 6.6):
|
||||
- GKI 2.0 (5.10+) могут использовать предсобранные образы и LKM/KMI.
|
||||
- GKI 1.0 (4.19 - 5.4) требуют пересборки с драйвером KernelSU.
|
||||
- EOL (<4.14) также требуют пересборки с драйвером KernelSU (версии 3.18+ экспериментальные и могут потребовать некоторые функции бэкпортов).
|
||||
|
||||
Сейчас поддерживается только `arm64-v8a`.
|
||||
|
||||
## Использование
|
||||
|
||||
- [Инструкция по установке](https://KernelSU-Next.github.io/KernelSU-Next/)
|
||||
|
||||
## Безопасность
|
||||
|
||||
Если нашли баг, посмотри [SECURITY.md](/SECURITY.md) — там гайд, как сообщить о проблеме.
|
||||
|
||||
## Лицензия
|
||||
|
||||
- Всё, что в директории `kernel`, — [GPL-2.0-only](https://www.gnu.org/licenses/old-licenses/gpl-2.0.en.html).
|
||||
- Остальной код, кроме директории `kernel`, под [GPL-3.0-or-later](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): Некоторые навыки rootkit.
|
||||
- [KernelSU](https://github.com/tiann/KernelSU): Спасибо tiann, без него KernelSU Next не релизнулся бы.
|
||||
- [Magic Mount Port](https://github.com/5ec1cff/KernelSU/blob/main/userspace/ksud/src/magic_mount.rs): 💜 5ec1cff за сохранение KernelSU!
|
||||
49
docs/README_TH.md
Normal file
49
docs/README_TH.md
Normal file
@@ -0,0 +1,49 @@
|
||||
[English](README.md) | [简体中文](README_CN.md) | [繁體中文](README_TW.md) | [Türkçe](README_TR.md) | [Português (Brasil)](README_PT-BR.md) | [한국어](README_KO.md) | [Français](README_FR.md) | [Bahasa Indonesia](README_ID.md) | [Русский](README_RU.md) | **ภาษาไทย** | [Tiếng Việt](README_VI.md)
|
||||
|
||||
# KernelSU Next
|
||||
|
||||
<img src="/assets/kernelsu_next.png" style="width: 96px;" alt="logo">
|
||||
|
||||
โซลูชันรูทบนพื้นฐานเคอร์เนลสำหรับอุปกรณ์ Android
|
||||
|
||||
[](https://github.com/KernelSU-Next/KernelSU-Next/releases/latest)
|
||||
[](https://nightly.link/KernelSU-Next/KernelSU-Next/workflows/build-manager-ci/next/Manager)
|
||||
[](https://www.gnu.org/licenses/old-licenses/gpl-2.0.en.html)
|
||||
[](/LICENSE)
|
||||
|
||||
## คุณสมบัติ
|
||||
|
||||
1. การจัดการการเข้าถึงรูทและ `su` บนเคอร์เนล
|
||||
2. ระบบโมดูลที่ใช้ระบบการติดตั้งแบบไดนามิก [Magic Mount](https://topjohnwu.github.io/Magisk/details.html#magic-mount) / [OverlayFS](https://en.wikipedia.org/wiki/OverlayFS)
|
||||
3. [App Profile](https://kernelsu.org/guide/app-profile.html): จำกัดพลังรูทไว้สำหรับแอปต่างๆ
|
||||
|
||||
## การเข้ากันในอุปกรณ์ต่างๆ
|
||||
|
||||
KernelSU Next รองรับแบบเป็นทางการตั้งแต่เคอร์เนลแอนดรอยด์ 4.4 ถึง 6.6
|
||||
- GKI 2.0 (5.10+) เคอร์เนลสามารถรันแบบไฟล์สำเร็จรูปและ LKM/KMI ได้
|
||||
- GKI 1.0 (4.19 - 5.4) เคอร์เนลต้องการ build ร่วมกับไดร์เวอร์ของทาง KernelSU
|
||||
- EOL (<4.14) เคอร์เนลก็ต้องการ build ร่วมกับไดร์เวอร์ของทาง KernelSU เช่นกัน (3.18+ ยังเป็นการทดลองอยู่และยังต้องการเขียนในหลังบ้านเพิ่มเติม)
|
||||
|
||||
ในขณะนี้, มีแค่สถาปัตยกรรม `arm64-v8a` ที่รองรับเท่านั้น
|
||||
|
||||
## การใช้งาน
|
||||
|
||||
- [คำแนะนำในการติดตั้ง](https://KernelSU-Next.github.io/KernelSU-Next/)
|
||||
|
||||
## ความปลอดภัย
|
||||
|
||||
สำหรับข้อมูลเกี่ยวกับการรายงานช่องโหว่ด้านความปลอดภัยใน KernelSU โปรดดูที่ [SECURITY.md](/SECURITY.md).
|
||||
|
||||
## ใบอนุญาต
|
||||
|
||||
- ไฟล์ที่ภายใต้โฟลเดอร์ `kernel` ถือว่าเป็น [GPL-2.0-only](https://www.gnu.org/licenses/old-licenses/gpl-2.0.en.html).
|
||||
- ไฟล์ที่นอกเหนือจากโฟลเดอร์ `kernel` ถือว่าเป็น [GPL-3.0-or-later](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): อุปกรณ์มือเกี่ยวกับรูทที่ทรงพลัง
|
||||
- [genuine](https://github.com/brevent/genuine/): การออกลายเซ็นให้กับไฟล์ APK v2
|
||||
- [Diamorphine](https://github.com/m0nad/Diamorphine): ความรู้ความสามารถเกี่ยวกับ rootkit
|
||||
- [KernelSU](https://github.com/tiann/KernelSU): ต้องขอบคุณ tiann ถ้าไม่มีคนนั้นก็ไม่มีสิ่งที่เรียกว่า KernelSU เกิดขึ้น
|
||||
- [Magic Mount Port](https://github.com/5ec1cff/KernelSU/blob/main/userspace/ksud/src/magic_mount.rs): 💜 5ec1cff ที่ช่วย KernelSU ไว้
|
||||
@@ -1,4 +1,4 @@
|
||||
[English](README.md) | [简体中文](README_CN.md) | **Türkçe** | [Português (Brasil)](README_PT-BR.md) | [한국어](README_KO.md)
|
||||
[English](README.md) | [简体中文](README_CN.md) | [繁體中文](README_TW.md) | **Türkçe** | [Português (Brasil)](README_PT-BR.md) | [한국어](README_KO.md) | [Français](README_FR.md) | [Bahasa Indonesia](README_ID.md) | [Русский](README_RU.md) | [ภาษาไทย](README_TH.md) | [Tiếng Việt](README_VI.md)
|
||||
|
||||
# KernelSU Next
|
||||
|
||||
@@ -6,15 +6,15 @@
|
||||
|
||||
Android cihazlar için Kernel tabanlı bir root çözümü.
|
||||
|
||||
[](https://github.com/rifsxd/KernelSU-Next/releases/latest)
|
||||
[](https://nightly.link/rifsxd/KernelSU-Next/workflows/build-manager/next/manager)
|
||||
[](https://github.com/KernelSU-Next/KernelSU-Next/releases/latest)
|
||||
[](https://nightly.link/KernelSU-Next/KernelSU-Next/workflows/build-manager-ci/next/Manager)
|
||||
[](https://www.gnu.org/licenses/old-licenses/gpl-2.0.en.html)
|
||||
[](/LICENSE)
|
||||
[](/LICENSE)
|
||||
|
||||
## Özellikler
|
||||
|
||||
1. Çekirdek tabanlı `su` ve kök erişim yönetimi.
|
||||
2. Dinamik montaj sistemine dayalı modül sistemi [Magic Mount](https://github.com/topjohnwu/Magisk/blob/c512496847d182526f2043295ecfd275398eccac/docs/releases/26100.md#new-magic-mount-implementation) / [OverlayFS](https://en.wikipedia.org/wiki/OverlayFS).
|
||||
2. Dinamik montaj sistemine dayalı modül sistemi [Magic Mount](https://topjohnwu.github.io/Magisk/details.html#magic-mount) / [OverlayFS](https://en.wikipedia.org/wiki/OverlayFS).
|
||||
3. [App Profile](https://kernelsu.org/guide/app-profile.html): Kök gücünü bir kafese kilitleyin.
|
||||
|
||||
## Uyumluluk Durumu
|
||||
@@ -28,7 +28,7 @@ KernelSU Next, 4.4'dan başlayarak 6.6'ya kadar çoğu Android çekirdeğini res
|
||||
|
||||
## Kullanım
|
||||
|
||||
- [Kurulum Talimatı](https://rifsxd.github.io/KernelSU-Next/)
|
||||
- [Kurulum Talimatı](https://KernelSU-Next.github.io/KernelSU-Next/)
|
||||
|
||||
## Güvenlik
|
||||
|
||||
@@ -41,9 +41,9 @@ KernelSU'daki güvenlik açıklarını bildirme hakkında bilgi için [SECURITY.
|
||||
|
||||
## Krediler
|
||||
|
||||
- [kernel-assisted-superuser](https://git.zx2c4.com/kernel-assisted-superuser/about/): KernelSU fikri.
|
||||
- [Magisk](https://github.com/topjohnwu/Magisk): güçlü kök aracı.
|
||||
- [genuine](https://github.com/brevent/genuine/): apk v2 imza doğrulama.
|
||||
- [Diamorphine](https://github.com/m0nad/Diamorphine): bazı rootkit becerileri.
|
||||
- [Kernel-Assisted Superuser](https://git.zx2c4.com/kernel-assisted-superuser/about/): KernelSU fikri.
|
||||
- [Magisk](https://github.com/topjohnwu/Magisk): Güçlü kök aracı.
|
||||
- [genuine](https://github.com/brevent/genuine/): APK v2 imza doğrulama.
|
||||
- [Diamorphine](https://github.com/m0nad/Diamorphine): Bazı rootkit becerileri.
|
||||
- [KernelSU](https://github.com/tiann/KernelSU): tiann'a teşekkürler, yoksa KernelSU Next var olamazdı bile.
|
||||
- [Magic Mount Port](https://github.com/5ec1cff/KernelSU/blob/main/userspace/ksud/src/magic_mount.rs): 💜 5ec1cff KernelSU'yu kurtardığınız için!
|
||||
|
||||
50
docs/README_TW.md
Normal file
50
docs/README_TW.md
Normal file
@@ -0,0 +1,50 @@
|
||||
[English](README.md) | [简体中文](README_CN.md) | **繁體中文** | [Türkçe](README_TR.md) | [Português (Brasil)](README_PT-BR.md) | [한국어](README_KO.md) | [Français](README_FR.md) | [Bahasa Indonesia](README_ID.md) | [Русский](README_RU.md) | [ภาษาไทย](README_TH.md) | [Tiếng Việt](README_VI.md)
|
||||
|
||||
# KernelSU Next
|
||||
|
||||
<img src="/assets/kernelsu_next.png" style="width: 96px;" alt="logo">
|
||||
|
||||
基於內核的 Android 設備 Root 解決方案
|
||||
|
||||
[](https://github.com/KernelSU-Next/KernelSU-Next/releases/latest)
|
||||
[](https://nightly.link/KernelSU-Next/KernelSU-Next/workflows/build-manager-ci/next/Manager)
|
||||
[](https://www.gnu.org/licenses/old-licenses/gpl-2.0.en.html)
|
||||
[](/LICENSE)
|
||||
|
||||
## 特性
|
||||
|
||||
1. 基於內核的 `su` 和 Root 權限管理
|
||||
2. 基於動態掛載系統 [Magic Mount](https://topjohnwu.github.io/Magisk/details.html#magic-mount) / [OverlayFS](https://en.wikipedia.org/wiki/OverlayFS) 的模塊系統。
|
||||
3. [App Profile](https://kernelsu.org/zh_CN/guide/app-profile.html):把 Root 權限關進籠子裡
|
||||
|
||||
## 兼容狀態
|
||||
|
||||
KernelSU Next 正式支持大多數從 4.4 到 6.6 的 Android 內核
|
||||
- GKI 2.0 (5.10+) 內核可以運行預構建的映像和 LKM/KMI
|
||||
- GKI 1.0 (4.19 - 5.4) 內核需要重新編譯 KernelSU 驅動程序
|
||||
- EOL (<4.14) 內核也需要重新編譯 KernelSU 驅動程序(3.18+ 是實驗性的,可能需要移植一些功能)
|
||||
|
||||
目前僅支持 `arm64-v8a`
|
||||
|
||||
## 用法
|
||||
|
||||
- [安裝說明](https://KernelSU-Next.github.io/KernelSU-Next/)
|
||||
|
||||
## 安全性
|
||||
|
||||
有關報告 KernelSU Next 漏洞的信息,請參閱 [SECURITY.md](/SECURITY.md).
|
||||
|
||||
## 許可證
|
||||
|
||||
- 目錄 `kernel` 下所有文件為 [GPL-2.0-only](https://www.gnu.org/licenses/old-licenses/gpl-2.0.en.html)
|
||||
- `kernel` 目錄以外的其他部分均為 [GPL-3.0-or-later](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): 一些 Rootkit 技巧。
|
||||
- [KernelSU](https://github.com/tiann/KernelSU): 感謝 tiann,否則 KernelSU Next 根本不會存在。
|
||||
- [Magic Mount Port](https://github.com/5ec1cff/KernelSU/blob/main/userspace/ksud/src/magic_mount.rs): 💜 5ec1cff 為了拯救 KernelSU!
|
||||
|
||||
63
docs/README_VI.md
Normal file
63
docs/README_VI.md
Normal file
@@ -0,0 +1,63 @@
|
||||
[English](README.md) | [简体中文](README_CN.md) | [繁體中文](README_TW.md) | [Türkçe](README_TR.md) | [Português (Brasil)](README_PT-BR.md) | [한국어](README_KO.md) | [Français](README_FR.md) | [Bahasa Indonesia](README_ID.md) | [Русский](README_RU.md) | [ภาษาไทย](README_TH.md) | **Tiếng Việt**
|
||||
|
||||
# KernelSU Next
|
||||
|
||||
<img src="/assets/kernelsu_next.png" style="width: 96px;" alt="logo">
|
||||
|
||||
Một giải pháp root từ nhân linux dành cho các thiết bị chạy Android
|
||||
|
||||
[](https://github.com/KernelSU-Next/KernelSU-Next/releases/latest)
|
||||
[](https://nightly.link/KernelSU-Next/KernelSU-Next/workflows/build-manager-ci/next/Manager)
|
||||
[](https://www.gnu.org/licenses/old-licenses/gpl-2.0.en.html)
|
||||
[](/LICENSE)
|
||||
|
||||
## Tính năng
|
||||
|
||||
1. Quản lý quyền truy cập SU dựa trên kernel android.
|
||||
2. Hệ thống mount module dựa trên 1 trong 2 cơ chế mount [Magic Mount](https://topjohnwu.github.io/Magisk/details.html#magic-mount) / [OverlayFS](https://en.wikipedia.org/wiki/OverlayFS).
|
||||
3. [App Profile](https://kernelsu.org/guide/app-profile.html): Quản lý quyền truy cập root 1 cách chặt chẽ
|
||||
|
||||
## Danh sách tương thích
|
||||
|
||||
KernelSU Next hỗ trợ chính thức các kernel Android từ phiên bản 4.4 đến 6.6
|
||||
- GKI 2.0 (5.10+) kernels có thể cài đặt qua những .img/.zip đã được build sẵn và LKM/KMI hoặc tự vá qua manager (nếu được)
|
||||
- GKI 1.0 (4.19 - 5.4) kernels cần dược build lại với các nhân KernelSU Next
|
||||
- EOL (<4.14) kernels cần dược build lại với các nhân KernelSU Next (các kernels 3.18+ đang dược thử nghiệm và có thể cần backports 1 vài thứ ).
|
||||
|
||||
Hiện tại kernelSU Next chỉ hỗ trợ những cpu có `arm64-v8a`
|
||||
|
||||
## Sử dụng
|
||||
|
||||
- [Hướng dẫn vá KernelSU Next vào Kernel của bạn (yêu cầu kernel source)](https://KernelSU-Next.github.io/KernelSU-Next/)
|
||||
|
||||
## Bảo mật
|
||||
|
||||
Để biết thêm thông tin về việc báo cáo lỗ hổng bảo mật trong KernelSU Next vui lòng đọc (Thông tin sẽ dược gửi về KernelSU)[SECURITY.md](/SECURITY.md).
|
||||
|
||||
## Gíây phép
|
||||
|
||||
- Những thư mục/tập tin trong `kernel` là giấy phép [GPL-2.0-only](https://www.gnu.org/licenses/old-licenses/gpl-2.0.en.html).
|
||||
- Những thư mục/tập tin ngoài `kernel` là giấy phép [GPL-3.0-or-later](https://www.gnu.org/licenses/gpl-3.0.html).
|
||||
|
||||
## Quyên góp/Hỗ trợ
|
||||
|
||||
- 0x12b5224b7aca0121c2f003240a901e1d064371c1 [ USDT BEP20 ]
|
||||
|
||||
- TYUVMWGTcnR5svnDoX85DWHyqUAeyQcdjh [ USDT TRC20 ]
|
||||
|
||||
- 0x12b5224b7aca0121c2f003240a901e1d064371c1 [ USDT ERC20 ]
|
||||
|
||||
- 0x12b5224b7aca0121c2f003240a901e1d064371c1 [ ETH ERC20 ]
|
||||
|
||||
- Ld238uYBuRQdZB5YwdbkuU6ektBAAUByoL [ LTC ]
|
||||
|
||||
- 19QgifcjMjSr1wB2DJcea5cxitvWVcXMT6 [ BTC ]
|
||||
|
||||
## Lời cảm ơn tới...
|
||||
|
||||
- [Kernel-Assisted Superuser](https://git.zx2c4.com/kernel-assisted-superuser/about/): Ý tưởng cho sự ra đời của KernelSU.
|
||||
- [Magisk](https://github.com/topjohnwu/Magisk): Công cụ root mạnh mẽ, quen thuộc và tương thích cao cho các thiết bị chạy Android.
|
||||
- [genuine](https://github.com/brevent/genuine/): Chữ kí apk v2.
|
||||
- [Diamorphine](https://github.com/m0nad/Diamorphine): Một vài kỹ năng rootkit.
|
||||
- [KernelSU](https://github.com/tiann/KernelSU): Nguồn gốc của KernelSU Next, thanks to tiann.
|
||||
- [Magic Mount Port](https://github.com/5ec1cff/KernelSU/blob/main/userspace/ksud/src/magic_mount.rs): 5ec1cff - người đã cứu lấy KernelSU💜 !
|
||||
7
docs/assets/bootstrap/css/bootstrap.min.css
vendored
7
docs/assets/bootstrap/css/bootstrap.min.css
vendored
File diff suppressed because one or more lines are too long
6
docs/assets/bootstrap/js/bootstrap.min.js
vendored
6
docs/assets/bootstrap/js/bootstrap.min.js
vendored
File diff suppressed because one or more lines are too long
@@ -1,115 +0,0 @@
|
||||
html, body {
|
||||
height: 100%;
|
||||
margin: 0;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
font-family: 'Inter', sans-serif;
|
||||
background-color: #ffffff;
|
||||
color: #000000;
|
||||
}
|
||||
|
||||
footer {
|
||||
margin-top: auto;
|
||||
background-color: #000000;
|
||||
color: #ffffff;
|
||||
padding: 1.5rem 0;
|
||||
}
|
||||
|
||||
footer a {
|
||||
color: #ffffff;
|
||||
}
|
||||
|
||||
.navbar {
|
||||
background-color: #000000;
|
||||
}
|
||||
|
||||
.navbar-brand span {
|
||||
font-weight: bold;
|
||||
font-size: 1.5rem;
|
||||
color: #ffffff;
|
||||
}
|
||||
|
||||
.navbar-toggler {
|
||||
background-color: #ffffff;
|
||||
}
|
||||
|
||||
.navbar-nav .nav-link {
|
||||
color: #ffffff;
|
||||
}
|
||||
|
||||
.navbar-nav .nav-link:hover {
|
||||
color: #cccccc;
|
||||
}
|
||||
|
||||
header {
|
||||
background-color: #000000;
|
||||
color: #ffffff;
|
||||
padding: 5rem 0;
|
||||
}
|
||||
|
||||
header h1 {
|
||||
font-size: 2.5rem;
|
||||
}
|
||||
|
||||
header p {
|
||||
font-size: 1.2rem;
|
||||
}
|
||||
|
||||
ol {
|
||||
padding-left: 1.5rem;
|
||||
}
|
||||
|
||||
.highlight {
|
||||
background: #f8f9fa;
|
||||
border-left: 5px solid #000000;
|
||||
font-size: 0.95rem;
|
||||
overflow-x: auto;
|
||||
white-space: pre-wrap;
|
||||
}
|
||||
|
||||
.highlight code {
|
||||
color: #000000;
|
||||
font-family: monospace;
|
||||
}
|
||||
|
||||
.header-icon {
|
||||
font-size: 4rem;
|
||||
margin-bottom: 1rem;
|
||||
}
|
||||
|
||||
.contact-icons {
|
||||
font-size: 2rem;
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
gap: 20px;
|
||||
}
|
||||
|
||||
.contact-icons a {
|
||||
color: #000000;
|
||||
text-decoration: none;
|
||||
}
|
||||
|
||||
.contact-icons a:hover {
|
||||
color: #333333;
|
||||
}
|
||||
|
||||
.btn-copy {
|
||||
background-color: #000000;
|
||||
color: #ffffff;
|
||||
border: none;
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
.btn-copy:hover {
|
||||
background-color: rgb(238, 238, 238);
|
||||
color: #000000;
|
||||
}
|
||||
|
||||
.table th, .table td {
|
||||
vertical-align: middle;
|
||||
}
|
||||
|
||||
#devices a {
|
||||
color: #000000;
|
||||
}
|
||||
|
||||
Binary file not shown.
|
Before Width: | Height: | Size: 16 KiB |
Binary file not shown.
|
Before Width: | Height: | Size: 15 KiB |
@@ -1,61 +0,0 @@
|
||||
(function() {
|
||||
"use strict"; // Start of use strict
|
||||
|
||||
function initParallax() {
|
||||
|
||||
if (!('requestAnimationFrame' in window)) return;
|
||||
if (/Mobile|Android/.test(navigator.userAgent)) return;
|
||||
|
||||
var parallaxItems = document.querySelectorAll('[data-bss-parallax]');
|
||||
|
||||
if (!parallaxItems.length) return;
|
||||
|
||||
var defaultSpeed = 0.5;
|
||||
var visible = [];
|
||||
var scheduled;
|
||||
|
||||
window.addEventListener('scroll', scroll);
|
||||
window.addEventListener('resize', scroll);
|
||||
|
||||
scroll();
|
||||
|
||||
function scroll() {
|
||||
|
||||
visible.length = 0;
|
||||
|
||||
for (var i = 0; i < parallaxItems.length; i++) {
|
||||
var rect = parallaxItems[i].getBoundingClientRect();
|
||||
var speed = parseFloat(parallaxItems[i].getAttribute('data-bss-parallax-speed'), 10) || defaultSpeed;
|
||||
|
||||
if (rect.bottom > 0 && rect.top < window.innerHeight) {
|
||||
visible.push({
|
||||
speed: speed,
|
||||
node: parallaxItems[i]
|
||||
});
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
cancelAnimationFrame(scheduled);
|
||||
|
||||
if (visible.length) {
|
||||
scheduled = requestAnimationFrame(update);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
function update() {
|
||||
|
||||
for (var i = 0; i < visible.length; i++) {
|
||||
var node = visible[i].node;
|
||||
var speed = visible[i].speed;
|
||||
|
||||
node.style.transform = 'translate3d(0, ' + (-window.scrollY * speed) + 'px, 0)';
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
initParallax();
|
||||
})(); // End of use strict
|
||||
|
||||
@@ -1,7 +0,0 @@
|
||||
function copyToClipboard(button) {
|
||||
var code = button.previousElementSibling.textContent;
|
||||
navigator.clipboard.writeText(code).then(() => {
|
||||
button.textContent = "Copied!";
|
||||
setTimeout(() => button.textContent = "Copy", 2000);
|
||||
});
|
||||
}
|
||||
1
docs/assets/js/copy.min.js
vendored
1
docs/assets/js/copy.min.js
vendored
@@ -1 +0,0 @@
|
||||
function copyToClipboard(button){var code=button.previousElementSibling.textContent;navigator.clipboard.writeText(code).then(()=>{button.textContent="Copied!";setTimeout(()=>button.textContent="Copy",2000)})}
|
||||
111
docs/index.html
111
docs/index.html
@@ -1,111 +0,0 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0, shrink-to-fit=no">
|
||||
<title>Home | KernelSU Next</title>
|
||||
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css">
|
||||
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@300;400;600;700;800&display=swap" rel="stylesheet">
|
||||
<link rel="icon" href="assets/icons/ksu-next-tab.png" type="image/x-icon">
|
||||
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.0.0-beta3/css/all.min.css">
|
||||
<link rel="stylesheet" href="assets/css/main.css">
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<!-- Navbar -->
|
||||
<nav class="navbar navbar-expand-md sticky-top py-3">
|
||||
<div class="container">
|
||||
<a class="navbar-brand d-flex align-items-center" href="#">
|
||||
<span>KernelSU Next</span>
|
||||
</a>
|
||||
<button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#navbarResponsive" aria-controls="navbarResponsive" aria-expanded="false" aria-label="Toggle navigation">
|
||||
<span class="navbar-toggler-icon"></span>
|
||||
</button>
|
||||
<div class="collapse navbar-collapse" id="navbarResponsive">
|
||||
<ul class="navbar-nav ms-auto">
|
||||
<li class="nav-item">
|
||||
<a class="nav-link text-light" href="#">Home</a>
|
||||
</li>
|
||||
<li class="nav-item">
|
||||
<a class="nav-link text-light" href="#installation">Installation</a>
|
||||
</li>
|
||||
<li class="nav-item">
|
||||
<a class="nav-link text-light" href="pages/features.html">Features</a>
|
||||
</li>
|
||||
<li class="nav-item"></li>
|
||||
<a class="nav-link text-light" href="pages/devices.html">Devices</a>
|
||||
</li>
|
||||
<li class="nav-item">
|
||||
<a class="nav-link" href="https://github.com/rifsxd/KernelSU-Next" target="_blank">
|
||||
<i class="fab fa-github fa-lg"></i>
|
||||
</a>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
</nav>
|
||||
|
||||
<!-- Header -->
|
||||
<header>
|
||||
<div class="container text-center">
|
||||
<div class="header-icon">
|
||||
<img src="assets/icons/ksu-next.png" width="80" height="80">
|
||||
</div>
|
||||
<h1 class="fw-bold">KernelSU Next</h1>
|
||||
<p class="lead">A kernel-based root solution for Android</p>
|
||||
<p>Supports kernel 4.4 - 6.6 (Non-GKI & GKI)</p>
|
||||
</div>
|
||||
</header>
|
||||
|
||||
<!-- Installation Section -->
|
||||
<section id="installation" class="py-5">
|
||||
<div class="container">
|
||||
<h2 class="text-center mb-4">Installation</h2>
|
||||
<p class="text-center">Run the following commands below for different installation options, should be ran inside the root of your kernel's directory.</p>
|
||||
<h3 class="mt-4">Latest Release</h3>
|
||||
<div class="highlight mt-3">
|
||||
<code>curl -LSs "https://raw.githubusercontent.com/rifsxd/KernelSU-Next/next/kernel/setup.sh" | bash -</code>
|
||||
<button class="btn btn-copy mt-2" onclick="copyToClipboard(this)">Copy</button>
|
||||
</div>
|
||||
<h3 class="mt-4">Next branch (dev)</h3>
|
||||
<div class="highlight mt-3">
|
||||
<code>curl -LSs "https://raw.githubusercontent.com/rifsxd/KernelSU-Next/next/kernel/setup.sh" | bash -s next</code>
|
||||
<button class="btn btn-copy mt-2" onclick="copyToClipboard(this)">Copy</button>
|
||||
</div>
|
||||
<h3 class="mt-4">Specific Tag</h3>
|
||||
<div class="highlight mt-3">
|
||||
<code>curl -LSs "https://raw.githubusercontent.com/rifsxd/KernelSU-Next/next/kernel/setup.sh" | bash -s v1.0.2-R14</code>
|
||||
<button class="btn btn-copy mt-2" onclick="copyToClipboard(this)">Copy</button>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<!-- Contact Information Section -->
|
||||
<section id="contact" class="py-5">
|
||||
<div class="container text-center">
|
||||
<h2 class="mb-4">Contact Us</h2>
|
||||
<p>If you have any questions or need support, feel free to reach out:</p>
|
||||
<div class="contact-icons">
|
||||
<a href="https://github.com/rifsxd/KernelSU-Next/issues" target="_blank">
|
||||
<i class="fab fa-github"></i>
|
||||
</a>
|
||||
<a href="https://t.me/ksunext_discussions" target="_blank">
|
||||
<i class="fab fa-telegram-plane"></i>
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<!-- Footer -->
|
||||
<footer class="text-center">
|
||||
<div class="container">
|
||||
<p>© 2025 KernelSU Next. All rights reserved. <a href="https://github.com/rifsxd/KernelSU-Next" target="_blank">GitHub</a></p>
|
||||
</div>
|
||||
</footer>
|
||||
|
||||
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/js/bootstrap.bundle.min.js"></script>
|
||||
<script src="assets/js/copy.min.js"></script>
|
||||
</body>
|
||||
|
||||
</html>
|
||||
@@ -1,309 +0,0 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0, shrink-to-fit=no">
|
||||
<title>Devices | KernelSU Next</title>
|
||||
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css">
|
||||
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@300;400;600;700;800&display=swap" rel="stylesheet">
|
||||
<link rel="icon" href="../assets/icons/ksu-next-tab.png" type="image/x-icon">
|
||||
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.0.0-beta3/css/all.min.css">
|
||||
<link rel="stylesheet" href="../assets/css/main.css">
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<!-- Navbar -->
|
||||
<nav class="navbar navbar-expand-md sticky-top py-3">
|
||||
<div class="container">
|
||||
<a class="navbar-brand d-flex align-items-center" href="https://rifsxd.github.io/KernelSU-Next/">
|
||||
<span>KernelSU Next</span>
|
||||
</a>
|
||||
<button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#navbarResponsive" aria-controls="navbarResponsive" aria-expanded="false" aria-label="Toggle navigation">
|
||||
<span class="navbar-toggler-icon"></span>
|
||||
</button>
|
||||
<div class="collapse navbar-collapse" id="navbarResponsive">
|
||||
<ul class="navbar-nav ms-auto">
|
||||
<li class="nav-item">
|
||||
<a class="nav-link text-light" href="https://rifsxd.github.io/KernelSU-Next/">Home</a>
|
||||
</li>
|
||||
<li class="nav-item">
|
||||
<a class="nav-link text-light" href="https://rifsxd.github.io/KernelSU-Next/#installation">Installation</a>
|
||||
</li>
|
||||
<li class="nav-item">
|
||||
<a class="nav-link text-light" href="features.html">Features</a>
|
||||
</li>
|
||||
<li class="nav-item"></li>
|
||||
<a class="nav-link text-light" href="#">Devices</a>
|
||||
</li>
|
||||
<li class="nav-item">
|
||||
<a class="nav-link" href="https://github.com/rifsxd/KernelSU-Next" target="_blank">
|
||||
<i class="fab fa-github fa-lg"></i>
|
||||
</a>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
</nav>
|
||||
|
||||
<!-- Header -->
|
||||
<header>
|
||||
<div class="container text-center">
|
||||
<h1 class="fw-bold">Unofficially Supported Devices</h1>
|
||||
<p class="lead">Here is the list of devices unofficially supported by KernelSU Next.</p>
|
||||
</div>
|
||||
</header>
|
||||
|
||||
<!-- Devices Table Section -->
|
||||
<section id="devices" class="py-5">
|
||||
<div class="container">
|
||||
<!-- Warning Box -->
|
||||
<div class="alert alert-warning" role="alert">
|
||||
<strong>Warning!</strong> In this page, there are kernels for devices unofficially supporting KernelSU Next maintained by other developers. So be cautious of what you are flashing!
|
||||
</div>
|
||||
<!-- Wrap the table inside a div with overflow-x: auto -->
|
||||
<div style="overflow-x: auto;">
|
||||
<table class="table table-bordered table-hover">
|
||||
<thead>
|
||||
<tr>
|
||||
<th scope="col">Maintainer</th>
|
||||
<th scope="col">Repository</th>
|
||||
<th scope="col">Supported Devices</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
|
||||
<tr>
|
||||
<td>
|
||||
<a href="https://github.com/rifsxd" target="_blank">
|
||||
<img src="https://avatars.githubusercontent.com/rifsxd?v=4" alt="rifsxd" class="rounded-circle" width="30" height="30" style="margin-right: 10px;">
|
||||
rifsxd
|
||||
</a>
|
||||
</td>
|
||||
<td><a href="https://github.com/rifsxd/nyx_android_kernel_realme_c35/releases" target="_blank">nyx_android_kernel_realme_c35</a></td>
|
||||
<td>Realme C35 (RMX3511, RMX3513)</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td>
|
||||
<a href="https://github.com/devnoname120" target="_blank">
|
||||
<img src="https://avatars.githubusercontent.com/devnoname120?v=4" alt="devnoname120" class="rounded-circle" width="30" height="30" style="margin-right: 10px;">
|
||||
devnoname120
|
||||
</a>
|
||||
</td>
|
||||
<td><a href="https://github.com/devnoname120/Android-Kernel-Builder_mi-note-10-lite/releases" target="_blank">kernel_xiaomi_sm6150</a></td>
|
||||
<td>Mi Note 10 Lite (toco)</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td>
|
||||
<a href="https://github.com/utkustnr" target="_blank">
|
||||
<img src="https://avatars.githubusercontent.com/utkustnr?v=4" alt="utkustnr" class="rounded-circle" width="30" height="30" style="margin-right: 10px;">
|
||||
utkustnr
|
||||
</a>
|
||||
</td>
|
||||
<td><a href="https://github.com/utkustnr/android_kernel_huawei_hi6250" target="_blank">android_kernel_huawei_hi6250</a></td>
|
||||
<td>Huawei P20 lite (ANE) & P Smart (FIG)</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td>
|
||||
<a href="https://github.com/DrRoot85" target="_blank">
|
||||
<img src="https://avatars.githubusercontent.com/DrRoot85?v=4" alt="DrRoot85" class="rounded-circle" width="30" height="30" style="margin-right: 10px;">
|
||||
DrRoot85
|
||||
</a>
|
||||
</td>
|
||||
<td><a href="https://github.com/DrRoot85/kernel_samsung_sm8550-commom" target="_blank">kernel_samsung_sm8550-commom</a></td>
|
||||
<td>Samsung Galaxy S23 Ultra</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td>
|
||||
<a href="https://github.com/whyakari" target="_blank">
|
||||
<img src="https://avatars.githubusercontent.com/whyakari?v=4" alt="whyakari" class="rounded-circle" width="30" height="30" style="margin-right: 10px;">
|
||||
whyakari
|
||||
</a>
|
||||
</td>
|
||||
<td><a href="https://github.com/MoeKernel/android_kernel_motorola_bangkk" target="_blank">android_kernel_motorola_bangkk</a></td>
|
||||
<td>Motorola Moto G84 5G</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td>
|
||||
<a href="https://github.com/whyakari" target="_blank">
|
||||
<img src="https://avatars.githubusercontent.com/whyakari?v=4" alt="whyakari" class="rounded-circle" width="30" height="30" style="margin-right: 10px;">
|
||||
whyakari
|
||||
</a>
|
||||
</td>
|
||||
<td><a href="https://github.com/MoeKernel/android_kernel_xiaomi_ginkgo" target="_blank">android_kernel_xiaomi_ginkgo</a></td>
|
||||
<td>Xiaomi Redmi Note 8/8T</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td>
|
||||
<a href="https://github.com/eun0115" target="_blank">
|
||||
<img src="https://avatars.githubusercontent.com/eun0115?v=4" alt="eun0115" class="rounded-circle" width="30" height="30" style="margin-right: 10px;">
|
||||
eun0115
|
||||
</a>
|
||||
</td>
|
||||
<td><a href="https://github.com/eun0115/android_kernel_samsung_a71" target="_blank">android_kernel_samsung_a71</a></td>
|
||||
<td>Samsung Galaxy A71</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td>
|
||||
<a href="https://github.com/Flopster101" target="_blank">
|
||||
<img src="https://avatars.githubusercontent.com/Flopster101?v=4" alt="Flopster101" class="rounded-circle" width="30" height="30" style="margin-right: 10px;">
|
||||
Flopster101
|
||||
</a>
|
||||
</td>
|
||||
<td><a href="https://github.com/FlopKernel-Series/flop_ginkgo_kernel" target="_blank">flop_ginkgo_kernel</a></td>
|
||||
<td>FloppyKernel for Redmi Note 8/8T (ginkgo)</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td>
|
||||
<a href="https://github.com/Flopster101" target="_blank">
|
||||
<img src="https://avatars.githubusercontent.com/Flopster101?v=4" alt="Flopster101" class="rounded-circle" width="30" height="30" style="margin-right: 10px;">
|
||||
Flopster101
|
||||
</a>
|
||||
</td>
|
||||
<td><a href="https://github.com/FlopKernel-Series/flop_s5e8825_kernel" target="_blank">flop_s5e8825_kernel</a></td>
|
||||
<td>FloppyKernel for Exynos 1280 Family (Galaxy A25, A33, A53, M33, M34)</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td>
|
||||
<a href="https://github.com/ij-israfil" target="_blank">
|
||||
<img src="https://avatars.githubusercontent.com/ij-israfil?v=4" alt="ij-israfil" class="rounded-circle" width="30" height="30" style="margin-right: 10px;">
|
||||
ij-israfil
|
||||
</a>
|
||||
</td>
|
||||
<td><a href="https://github.com/ij-israfil/android_kernel_realme_sdm710/releases" target="_blank">android_kernel_realme_sdm710</a></td>
|
||||
<td>Realme X (RMX1901)</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td>
|
||||
<a href="https://github.com/skye-pa1n" target="_blank">
|
||||
<img src="https://avatars.githubusercontent.com/skye-pa1n?v=4" alt="skye-pa1n" class="rounded-circle" width="30" height="30" style="margin-right: 10px;">
|
||||
skye-pa1n
|
||||
</a>
|
||||
</td>
|
||||
<td><a href="https://github.com/skye-pa1n/not_r8q_ui" target="_blank">not_r8q_ui</a></td>
|
||||
<td>Not_Kernel S20 FE 4G/5G (Snapdragon 865)</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td>
|
||||
<a href="https://github.com/Ksawlii" target="_blank">
|
||||
<img src="https://avatars.githubusercontent.com/Ksawlii?v=4" alt="Ksawlii" class="rounded-circle" width="30" height="30" style="margin-right: 10px;">
|
||||
Ksawlii
|
||||
</a>
|
||||
</td>
|
||||
<td><a href="https://github.com/Ksawlii/android_kernel_samsung_a53x-FireAsf" target="_blank">android_kernel_samsung_a53x-FireAsf</a></td>
|
||||
<td>Samsung Galaxy A53 5G</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td>
|
||||
<a href="https://github.com/AlirezaParsi" target="_blank">
|
||||
<img src="https://avatars.githubusercontent.com/AlirezaParsi?v=4" alt="AlirezaParsi" class="rounded-circle" width="30" height="30" style="margin-right: 10px;">
|
||||
AlirezaParsi
|
||||
</a>
|
||||
</td>
|
||||
<td><a href="https://github.com/AlirezaParsi/pocof3/releases" target="_blank">pocof3</a></td>
|
||||
<td>Poco F3 (alioth)</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td>
|
||||
<a href="https://github.com/sidex15" target="_blank">
|
||||
<img src="https://avatars.githubusercontent.com/sidex15?v=4" alt="sidex15" class="rounded-circle" width="30" height="30" style="margin-right: 10px;">
|
||||
sidex15
|
||||
</a>
|
||||
</td>
|
||||
<td><a href="https://github.com/sidex15/android_kernel_lge_sm8150" target="_blank">android_kernel_lge_sm8150</a></td>
|
||||
<td>LG V50, V50s, G8, G8s, G8x</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td>
|
||||
<a href="https://github.com/itejo443" target="_blank">
|
||||
<img src="https://avatars.githubusercontent.com/itejo443?v=4" alt="itejo443" class="rounded-circle" width="30" height="30" style="margin-right: 10px;">
|
||||
itejo443
|
||||
</a>
|
||||
</td>
|
||||
<td><a href="https://github.com/itejo443/android_kernel_samsung_sm7225" target="_blank">android_kernel_samsung_sm7225</a></td>
|
||||
<td>Samsung Galaxy F23 and M23 (m23xq)</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td>
|
||||
<a href="https://github.com/pys36" target="_blank">
|
||||
<img src="https://avatars.githubusercontent.com/pys36?v=4" alt="pys36" class="rounded-circle" width="30" height="30" style="margin-right: 10px;">
|
||||
pys36
|
||||
</a>
|
||||
</td>
|
||||
<td><a href="https://github.com/pys36/android_kernel_xiaomi_earth" target="_blank">android_kernel_xiaomi_earth</a></td>
|
||||
<td>Redmi 12C (earth), Poco C55 (aether)</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td>
|
||||
<a href="https://github.com/riarumoda" target="_blank">
|
||||
<img src="https://avatars.githubusercontent.com/pys36?v=4" alt="riarumoda" class="rounded-circle" width="30" height="30" style="margin-right: 10px;">
|
||||
riarumoda
|
||||
</a>
|
||||
</td>
|
||||
<td><a href="https://github.com/riarumoda/kernel_samsung_a9y18qlte" target="_blank">kernel_samsung_a9y18qlte</a></td>
|
||||
<td>Samsung Galaxy A9 (2018) [a9y18qlte]</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td>
|
||||
<a href="https://github.com/sajadasadollahi83" target="_blank">
|
||||
<img src="https://avatars.githubusercontent.com/sajadasadollahi83?v=4" alt="riarumoda" class="rounded-circle" width="30" height="30" style="margin-right: 10px;">
|
||||
sajadasadollahi83
|
||||
</a>
|
||||
</td>
|
||||
<td><a href="https://github.com/sajadasadollahi83/android_kernel_xiaomi_sm6150" target="_blank">android_kernel_xiaomi_sm6150</a></td>
|
||||
<td>Xiaomi Redmi Note 10 Pro</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td>
|
||||
<a href="https://github.com/hxsyzl" target="_blank">
|
||||
<img src="https://avatars.githubusercontent.com/hxsyzl?v=4" alt="riarumoda" class="rounded-circle" width="30" height="30" style="margin-right: 10px;">
|
||||
hxsyzl
|
||||
</a>
|
||||
</td>
|
||||
<td><a href="https://github.com/hxsyzl/kernel_lge_sm8150" target="_blank">kernel_lge_sm8150</a></td>
|
||||
<td>LG V50, V50s, G8, G8s, G8x</td>
|
||||
</tr>
|
||||
|
||||
<!-- <tr>
|
||||
<td>Example Maintainer</td>
|
||||
<td><a href="https://github.com/example/example" target="_blank">example repo name</a></td>
|
||||
<td>Example Devices</td>
|
||||
</tr> -->
|
||||
<!-- Add more rows as needed -->
|
||||
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
|
||||
<!-- Footer -->
|
||||
<footer class="text-center">
|
||||
<div class="container">
|
||||
<p>© 2025 KernelSU Next. All rights reserved. <a href="https://github.com/rifsxd/KernelSU-Next" target="_blank">GitHub</a></p>
|
||||
</div>
|
||||
</footer>
|
||||
|
||||
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/js/bootstrap.bundle.min.js"></script>
|
||||
</body>
|
||||
|
||||
</html>
|
||||
@@ -1,124 +0,0 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0, shrink-to-fit=no">
|
||||
<title>Features | KernelSU Next</title>
|
||||
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css">
|
||||
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@300;400;600;700;800&display=swap" rel="stylesheet">
|
||||
<link rel="icon" href="../assets/icons/ksu-next-tab.png" type="image/x-icon">
|
||||
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.0.0-beta3/css/all.min.css">
|
||||
<link rel="stylesheet" href="../assets/css/main.css">
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<!-- Navbar -->
|
||||
<nav class="navbar navbar-expand-md sticky-top py-3">
|
||||
<div class="container">
|
||||
<a class="navbar-brand d-flex align-items-center" href="https://rifsxd.github.io/KernelSU-Next/">
|
||||
<span>KernelSU Next</span>
|
||||
</a>
|
||||
<button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#navbarResponsive" aria-controls="navbarResponsive" aria-expanded="false" aria-label="Toggle navigation">
|
||||
<span class="navbar-toggler-icon"></span>
|
||||
</button>
|
||||
<div class="collapse navbar-collapse" id="navbarResponsive">
|
||||
<ul class="navbar-nav ms-auto">
|
||||
<li class="nav-item">
|
||||
<a class="nav-link text-light" href="https://rifsxd.github.io/KernelSU-Next/">Home</a>
|
||||
</li>
|
||||
<li class="nav-item">
|
||||
<a class="nav-link text-light" href="https://rifsxd.github.io/KernelSU-Next/#installation">Installation</a>
|
||||
</li>
|
||||
<li class="nav-item">
|
||||
<a class="nav-link text-light" href="#">Features</a>
|
||||
</li>
|
||||
<li class="nav-item"></li>
|
||||
<a class="nav-link text-light" href="devices.html">Devices</a>
|
||||
</li>
|
||||
<li class="nav-item">
|
||||
<a class="nav-link" href="https://github.com/rifsxd/KernelSU-Next" target="_blank">
|
||||
<i class="fab fa-github fa-lg"></i>
|
||||
</a>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
</nav>
|
||||
|
||||
<!-- Header -->
|
||||
<header>
|
||||
<div class="container text-center">
|
||||
<h1 class="fw-bold">KernelSU Next Features</h1>
|
||||
<p class="lead">Explore the amazing features of KernelSU Next!</p>
|
||||
</div>
|
||||
</header>
|
||||
|
||||
<!-- Features Section -->
|
||||
<section class="py-5">
|
||||
<div class="container">
|
||||
<h2 class="text-center mb-4">Features</h2>
|
||||
<div class="row">
|
||||
<div class="col-md-6 col-lg-4 mb-4 d-flex">
|
||||
<div class="feature-box text-center p-3 border border-dark rounded flex-fill">
|
||||
<h3><i class="fas fa-microchip"></i> Non-GKI Kernel Support</h3>
|
||||
<p>Non-GKI kernel support from 4.x - 5.4 LTS (3.x is experimental).</p>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-md-6 col-lg-4 mb-4 d-flex">
|
||||
<div class="feature-box text-center p-3 border border-dark rounded flex-fill">
|
||||
<h3><i class="fas fa-cogs"></i> GKI Kernel Support</h3>
|
||||
<p>GKI kernels support LKM/KMI methods for easy installation.</p>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-md-6 col-lg-4 mb-4 d-flex">
|
||||
<div class="feature-box text-center p-3 border border-dark rounded flex-fill">
|
||||
<h3><i class="fas fa-magic"></i> Dynamic Module Mount</h3>
|
||||
<p>KernelSU Next includes both Magic Mount and OverlayFS which can switched from settings with a single toggle.</p>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-md-6 col-lg-4 mb-4 d-flex">
|
||||
<div class="feature-box text-center p-3 border border-dark rounded flex-fill">
|
||||
<h3><i class="fas fa-tools"></i> New Manager Features</h3>
|
||||
<p>KernelSU Next has a new, redesigned manager with several feature improvements and a UI overhaul.</p>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-md-6 col-lg-4 mb-4 d-flex">
|
||||
<div class="feature-box text-center p-3 border border-dark rounded flex-fill">
|
||||
<h3><i class="fas fa-undo"></i> Module Backup & Restoration</h3>
|
||||
<p>KernelSU Next allows for backup and restoration of modules when uninstalled accidentally or if you changed your mind or you simple want to restore a specific backup.</p>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-md-6 col-lg-4 mb-4 d-flex">
|
||||
<div class="feature-box text-center p-3 border border-dark rounded flex-fill">
|
||||
<h3><i class="fas fa-sync-alt"></i> Auto-Updates</h3>
|
||||
<p>The KernelSU Next Manager app updates automatically with new releases.</p>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-md-6 col-lg-4 mb-4 d-flex">
|
||||
<div class="feature-box text-center p-3 border border-dark rounded flex-fill">
|
||||
<h3><i class="fas fa-calendar-alt"></i> Frequent Updates</h3>
|
||||
<p>KernelSU Next is frequently updated with lots of upcoming features.</p>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-md-6 col-lg-4 mb-4 d-flex">
|
||||
<div class="feature-box text-center p-3 border border-dark rounded flex-fill">
|
||||
<h3><i class="fas fa-eye-slash"></i> Hide Hosts</h3>
|
||||
<p>KernelSU Next hides hosts file modifications from detectors with app profile umount to allow you to use adblocks without any hassle.</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<!-- Footer -->
|
||||
<footer class="text-center">
|
||||
<div class="container">
|
||||
<p>© 2025 KernelSU Next. All rights reserved. <a href="https://github.com/rifsxd/KernelSU-Next" target="_blank">GitHub</a></p>
|
||||
</div>
|
||||
</footer>
|
||||
|
||||
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/js/bootstrap.bundle.min.js"></script>
|
||||
</body>
|
||||
|
||||
</html>
|
||||
@@ -9,6 +9,14 @@ config KSU
|
||||
To compile as a module, choose M here: the
|
||||
module will be called kernelsu.
|
||||
|
||||
config KSU_WITH_KPROBES
|
||||
bool "Use kprobes for kernelsu"
|
||||
depends on KSU
|
||||
depends on KPROBES
|
||||
default y
|
||||
help
|
||||
Disable if you use manual hooks.
|
||||
|
||||
config KSU_DEBUG
|
||||
bool "KernelSU debug mode"
|
||||
depends on KSU
|
||||
|
||||
@@ -26,7 +26,7 @@ $(info -- KernelSU-Next version: $(KSU_VERSION))
|
||||
ccflags-y += -DKSU_VERSION=$(KSU_VERSION)
|
||||
else # If there is no .git file, the default version will be passed.
|
||||
$(warning "KSU_GIT_VERSION not defined! It is better to make KernelSU-Next a git submodule!")
|
||||
ccflags-y += -DKSU_VERSION=16
|
||||
ccflags-y += -DKSU_VERSION=11998
|
||||
endif
|
||||
|
||||
ifeq ($(shell grep -q " current_sid(void)" $(srctree)/security/selinux/include/objsec.h; echo $$?),0)
|
||||
@@ -37,6 +37,18 @@ ifeq ($(shell grep -q "struct selinux_state " $(srctree)/security/selinux/includ
|
||||
ccflags-y += -DKSU_COMPAT_HAS_SELINUX_STATE
|
||||
endif
|
||||
|
||||
ifeq ($(shell grep -q "strncpy_from_user_nofault" $(srctree)/include/linux/uaccess.h; echo $$?),0)
|
||||
ccflags-y += -DKSU_STRNCPY_FROM_USER_NOFAULT
|
||||
endif
|
||||
|
||||
ifeq ($(shell grep -q "ssize_t kernel_read" $(srctree)/fs/read_write.c; echo $$?),0)
|
||||
ccflags-y += -DKSU_KERNEL_READ
|
||||
endif
|
||||
|
||||
ifeq ($(shell grep "ssize_t kernel_write" $(srctree)/fs/read_write.c | grep -q "const void" ; echo $$?),0)
|
||||
ccflags-y += -DKSU_KERNEL_WRITE
|
||||
endif
|
||||
|
||||
ifndef KSU_NEXT_EXPECTED_SIZE
|
||||
KSU_NEXT_EXPECTED_SIZE := 0x3e6
|
||||
endif
|
||||
@@ -56,8 +68,42 @@ $(info -- KernelSU-Next Manager signature hash: $(KSU_NEXT_EXPECTED_HASH))
|
||||
ccflags-y += -DEXPECTED_NEXT_SIZE=$(KSU_NEXT_EXPECTED_SIZE)
|
||||
ccflags-y += -DEXPECTED_NEXT_HASH=\"$(KSU_NEXT_EXPECTED_HASH)\"
|
||||
|
||||
ccflags-y += -DKSU_COMPAT_GET_CRED_RCU
|
||||
|
||||
ccflags-y += -DKSU_UMOUNT
|
||||
|
||||
# Determine the appropriate atomic function and apply patch accordingly
|
||||
ifeq ($(shell grep -q "atomic_inc_not_zero" $(srctree)/kernel/cred.c; echo $$?),0)
|
||||
ATOMIC_INC_FUNC = atomic_inc_not_zero
|
||||
else ifeq ($(shell grep -q "atomic_long_inc_not_zero" $(srctree)/kernel/cred.c; echo $$?),0)
|
||||
ATOMIC_INC_FUNC = atomic_long_inc_not_zero
|
||||
else
|
||||
$(info -- KSU_NEXT: Neither atomic_inc_not_zero nor atomic_long_inc_not_zero found in kernel/cred.c)
|
||||
endif
|
||||
|
||||
# Inform which function is being patched
|
||||
$(info -- KSU_NEXT: Using $(ATOMIC_INC_FUNC) in get_cred_rcu patch.)
|
||||
|
||||
# Add the get_cred_rcu function to cred.h if not already present
|
||||
ifneq ($(shell grep -Eq "^static inline const struct cred \*get_cred_rcu" $(srctree)/include/linux/cred.h; echo $$?),0)
|
||||
$(info -- KSU_NEXT: adding function 'static inline const struct cred *get_cred_rcu(const struct cred *cred);' to $(srctree)/include/linux/cred.h)
|
||||
GET_CRED_RCU = static inline const struct cred *get_cred_rcu(const struct cred *cred)\n\
|
||||
{\n\t\
|
||||
struct cred *nonconst_cred = (struct cred *) cred;\n\t\
|
||||
if (!cred)\n\t\t\
|
||||
return NULL;\n\t\
|
||||
if (!$(ATOMIC_INC_FUNC)(&nonconst_cred->usage))\n\t\t\
|
||||
return NULL;\n\t\
|
||||
validate_creds(cred);\n\t\
|
||||
return cred;\n\
|
||||
}\n
|
||||
$(shell grep -qF "$(GET_CRED_RCU)" $(srctree)/include/linux/cred.h || sed -i '/^static inline void put_cred/i $(GET_CRED_RCU)' $(srctree)/include/linux/cred.h)
|
||||
|
||||
# Modify get_task_cred in cred.c
|
||||
$(info -- KSU_NEXT: modifying 'get_task_cred' function in $(srctree)/kernel/cred.c)
|
||||
$(shell sed -i "s/!$(ATOMIC_INC_FUNC)(&((struct cred \*)cred)->usage)/!get_cred_rcu(cred)/g" $(srctree)/kernel/cred.c)
|
||||
endif
|
||||
|
||||
ifneq ($(shell grep -Eq "^static int can_umount" $(srctree)/fs/namespace.c; echo $$?),0)
|
||||
$(info -- KSU_NEXT: adding function 'static int can_umount(const struct path *path, int flags);' to $(srctree)/fs/namespace.c)
|
||||
CAN_UMOUNT = static int can_umount(const struct path *path, int flags)\n\
|
||||
|
||||
@@ -1,3 +1,4 @@
|
||||
#include <linux/capability.h>
|
||||
#include <linux/compiler.h>
|
||||
#include <linux/fs.h>
|
||||
#include <linux/gfp.h>
|
||||
@@ -64,12 +65,14 @@ static void remove_uid_from_arr(uid_t uid)
|
||||
|
||||
static void init_default_profiles()
|
||||
{
|
||||
kernel_cap_t full_cap = CAP_FULL_SET;
|
||||
|
||||
default_root_profile.uid = 0;
|
||||
default_root_profile.gid = 0;
|
||||
default_root_profile.groups_count = 1;
|
||||
default_root_profile.groups[0] = 0;
|
||||
memset(&default_root_profile.capabilities, 0xff,
|
||||
sizeof(default_root_profile.capabilities));
|
||||
memcpy(&default_root_profile.capabilities.effective, &full_cap,
|
||||
sizeof(default_root_profile.capabilities.effective));
|
||||
default_root_profile.namespaces = 0;
|
||||
strcpy(default_root_profile.selinux_domain, KSU_DEFAULT_SELINUX_DOMAIN);
|
||||
|
||||
@@ -152,11 +155,6 @@ static bool profile_valid(struct app_profile *profile)
|
||||
return false;
|
||||
}
|
||||
|
||||
if (forbid_system_uid(profile->current_uid)) {
|
||||
pr_err("uid lower than 2000 is unsupported: %d\n", profile->current_uid);
|
||||
return false;
|
||||
}
|
||||
|
||||
if (profile->version < KSU_APP_PROFILE_VER) {
|
||||
pr_info("Unsupported profile version: %d\n", profile->version);
|
||||
return false;
|
||||
|
||||
@@ -45,10 +45,18 @@
|
||||
#include "throne_tracker.h"
|
||||
#include "kernel_compat.h"
|
||||
|
||||
#if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 0, 0) || defined(KSU_COMPAT_GET_CRED_RCU)
|
||||
#define KSU_GET_CRED_RCU
|
||||
#endif
|
||||
|
||||
static bool ksu_module_mounted = false;
|
||||
|
||||
extern int handle_sepolicy(unsigned long arg3, void __user *arg4);
|
||||
|
||||
static bool ksu_su_compat_enabled = true;
|
||||
extern void ksu_sucompat_init();
|
||||
extern void ksu_sucompat_exit();
|
||||
|
||||
static inline bool is_allow_su()
|
||||
{
|
||||
if (is_manager()) {
|
||||
@@ -110,51 +118,9 @@ static void setup_groups(struct root_profile *profile, struct cred *cred)
|
||||
set_groups(cred, group_info);
|
||||
}
|
||||
|
||||
void escape_to_root(void)
|
||||
static void disable_seccomp(void)
|
||||
{
|
||||
struct cred *cred;
|
||||
|
||||
cred = (struct cred *)__task_cred(current);
|
||||
|
||||
if (cred->euid.val == 0) {
|
||||
pr_warn("Already root, don't escape!\n");
|
||||
return;
|
||||
}
|
||||
struct root_profile *profile = ksu_get_root_profile(cred->uid.val);
|
||||
|
||||
cred->uid.val = profile->uid;
|
||||
cred->suid.val = profile->uid;
|
||||
cred->euid.val = profile->uid;
|
||||
cred->fsuid.val = profile->uid;
|
||||
|
||||
cred->gid.val = profile->gid;
|
||||
cred->fsgid.val = profile->gid;
|
||||
cred->sgid.val = profile->gid;
|
||||
cred->egid.val = profile->gid;
|
||||
|
||||
BUILD_BUG_ON(sizeof(profile->capabilities.effective) !=
|
||||
sizeof(kernel_cap_t));
|
||||
|
||||
// setup capabilities
|
||||
// we need CAP_DAC_READ_SEARCH becuase `/data/adb/ksud` is not accessible for non root process
|
||||
// we add it here but don't add it to cap_inhertiable, it would be dropped automaticly after exec!
|
||||
u64 cap_for_ksud =
|
||||
profile->capabilities.effective | CAP_DAC_READ_SEARCH;
|
||||
memcpy(&cred->cap_effective, &cap_for_ksud,
|
||||
sizeof(cred->cap_effective));
|
||||
memcpy(&cred->cap_inheritable, &profile->capabilities.effective,
|
||||
sizeof(cred->cap_inheritable));
|
||||
memcpy(&cred->cap_permitted, &profile->capabilities.effective,
|
||||
sizeof(cred->cap_permitted));
|
||||
memcpy(&cred->cap_bset, &profile->capabilities.effective,
|
||||
sizeof(cred->cap_bset));
|
||||
memcpy(&cred->cap_ambient, &profile->capabilities.effective,
|
||||
sizeof(cred->cap_ambient));
|
||||
// set ambient caps to all-zero
|
||||
// fixes "operation not permitted" on dbus cap dropping
|
||||
memset(&cred->cap_ambient, 0,
|
||||
sizeof(cred->cap_ambient));
|
||||
|
||||
assert_spin_locked(¤t->sighand->siglock);
|
||||
// disable seccomp
|
||||
#if defined(CONFIG_GENERIC_ENTRY) && \
|
||||
LINUX_VERSION_CODE >= KERNEL_VERSION(5, 11, 0)
|
||||
@@ -168,8 +134,77 @@ void escape_to_root(void)
|
||||
current->seccomp.filter = NULL;
|
||||
#else
|
||||
#endif
|
||||
}
|
||||
|
||||
void escape_to_root(void)
|
||||
{
|
||||
struct cred *cred;
|
||||
|
||||
#ifdef KSU_GET_CRED_RCU
|
||||
rcu_read_lock();
|
||||
|
||||
do {
|
||||
cred = (struct cred *)__task_cred((current));
|
||||
BUG_ON(!cred);
|
||||
} while (!get_cred_rcu(cred));
|
||||
|
||||
if (cred->euid.val == 0) {
|
||||
pr_warn("Already root, don't escape!\n");
|
||||
rcu_read_unlock();
|
||||
return;
|
||||
}
|
||||
#else
|
||||
cred = (struct cred *)__task_cred(current);
|
||||
|
||||
if (cred->euid.val == 0) {
|
||||
pr_warn("Already root, don't escape!\n");
|
||||
return;
|
||||
}
|
||||
#endif
|
||||
|
||||
struct root_profile *profile = ksu_get_root_profile(cred->uid.val);
|
||||
|
||||
cred->uid.val = profile->uid;
|
||||
cred->suid.val = profile->uid;
|
||||
cred->euid.val = profile->uid;
|
||||
cred->fsuid.val = profile->uid;
|
||||
|
||||
cred->gid.val = profile->gid;
|
||||
cred->fsgid.val = profile->gid;
|
||||
cred->sgid.val = profile->gid;
|
||||
cred->egid.val = profile->gid;
|
||||
cred->securebits = 0;
|
||||
|
||||
BUILD_BUG_ON(sizeof(profile->capabilities.effective) !=
|
||||
sizeof(kernel_cap_t));
|
||||
|
||||
// setup capabilities
|
||||
// we need CAP_DAC_READ_SEARCH becuase `/data/adb/ksud` is not accessible for non root process
|
||||
// we add it here but don't add it to cap_inhertiable, it would be dropped automaticly after exec!
|
||||
u64 cap_for_ksud =
|
||||
profile->capabilities.effective | CAP_DAC_READ_SEARCH;
|
||||
memcpy(&cred->cap_effective, &cap_for_ksud,
|
||||
sizeof(cred->cap_effective));
|
||||
memcpy(&cred->cap_permitted, &profile->capabilities.effective,
|
||||
sizeof(cred->cap_permitted));
|
||||
memcpy(&cred->cap_bset, &profile->capabilities.effective,
|
||||
sizeof(cred->cap_bset));
|
||||
// set ambient caps to all-zero
|
||||
// fixes "operation not permitted" on dbus cap dropping
|
||||
memset(&cred->cap_ambient, 0,
|
||||
sizeof(cred->cap_ambient));
|
||||
|
||||
setup_groups(profile, cred);
|
||||
|
||||
#ifdef KSU_GET_CRED_RCU
|
||||
rcu_read_unlock();
|
||||
#endif
|
||||
|
||||
// Refer to kernel/seccomp.c: seccomp_set_mode_strict
|
||||
// When disabling Seccomp, ensure that current->sighand->siglock is held during the operation.
|
||||
spin_lock_irq(¤t->sighand->siglock);
|
||||
disable_seccomp();
|
||||
spin_unlock_irq(¤t->sighand->siglock);
|
||||
|
||||
setup_selinux(profile->selinux_domain);
|
||||
}
|
||||
@@ -213,6 +248,26 @@ int ksu_handle_rename(struct dentry *old_dentry, struct dentry *new_dentry)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void nuke_ext4_sysfs() {
|
||||
struct path path;
|
||||
int err = kern_path("/data/adb/modules", 0, &path);
|
||||
if (err) {
|
||||
pr_err("nuke path err: %d\n", err);
|
||||
return;
|
||||
}
|
||||
|
||||
struct super_block* sb = path.dentry->d_inode->i_sb;
|
||||
const char* name = sb->s_type->name;
|
||||
if (strcmp(name, "ext4") != 0) {
|
||||
pr_info("nuke but module aren't mounted\n");
|
||||
path_put(&path);
|
||||
return;
|
||||
}
|
||||
|
||||
ext4_unregister_sysfs(sb);
|
||||
path_put(&path);
|
||||
}
|
||||
|
||||
int ksu_handle_prctl(int option, unsigned long arg2, unsigned long arg3,
|
||||
unsigned long arg4, unsigned long arg5)
|
||||
{
|
||||
@@ -271,12 +326,12 @@ int ksu_handle_prctl(int option, unsigned long arg2, unsigned long arg3,
|
||||
if (copy_to_user(arg3, &version, sizeof(version))) {
|
||||
pr_err("prctl reply error, cmd: %lu\n", arg2);
|
||||
}
|
||||
u32 version_flags = 0;
|
||||
#ifdef MODULE
|
||||
u32 is_lkm = 0x1;
|
||||
#else
|
||||
u32 is_lkm = 0x0;
|
||||
version_flags |= 0x1;
|
||||
#endif
|
||||
if (arg4 && copy_to_user(arg4, &is_lkm, sizeof(is_lkm))) {
|
||||
if (arg4 &&
|
||||
copy_to_user(arg4, &version_flags, sizeof(version_flags))) {
|
||||
pr_err("prctl reply error, cmd: %lu\n", arg2);
|
||||
}
|
||||
return 0;
|
||||
@@ -307,6 +362,7 @@ int ksu_handle_prctl(int option, unsigned long arg2, unsigned long arg3,
|
||||
case EVENT_MODULE_MOUNTED: {
|
||||
ksu_module_mounted = true;
|
||||
pr_info("module mounted!\n");
|
||||
nuke_ext4_sysfs();
|
||||
break;
|
||||
}
|
||||
default:
|
||||
@@ -422,6 +478,39 @@ int ksu_handle_prctl(int option, unsigned long arg2, unsigned long arg3,
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (arg2 == CMD_IS_SU_ENABLED) {
|
||||
if (copy_to_user(arg3, &ksu_su_compat_enabled,
|
||||
sizeof(ksu_su_compat_enabled))) {
|
||||
pr_err("copy su compat failed\n");
|
||||
return 0;
|
||||
}
|
||||
if (copy_to_user(result, &reply_ok, sizeof(reply_ok))) {
|
||||
pr_err("prctl reply error, cmd: %lu\n", arg2);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (arg2 == CMD_ENABLE_SU) {
|
||||
bool enabled = (arg3 != 0);
|
||||
if (enabled == ksu_su_compat_enabled) {
|
||||
pr_info("cmd enable su but no need to change.\n");
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (enabled) {
|
||||
ksu_sucompat_init();
|
||||
} else {
|
||||
ksu_sucompat_exit();
|
||||
}
|
||||
ksu_su_compat_enabled = enabled;
|
||||
|
||||
if (copy_to_user(result, &reply_ok, sizeof(reply_ok))) {
|
||||
pr_err("prctl reply error, cmd: %lu\n", arg2);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -555,6 +644,10 @@ int ksu_handle_setuid(struct cred *new, const struct cred *old)
|
||||
// try umount hosts file
|
||||
try_umount("/system/etc/hosts", false, MNT_DETACH);
|
||||
|
||||
// try umount lsposed dex2oat bins
|
||||
try_umount("/apex/com.android.art/bin/dex2oat64", false, MNT_DETACH);
|
||||
try_umount("/apex/com.android.art/bin/dex2oat32", false, MNT_DETACH);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -857,7 +950,7 @@ void __init ksu_core_init(void)
|
||||
|
||||
void ksu_core_exit(void)
|
||||
{
|
||||
#ifdef CONFIG_KPROBES
|
||||
#ifdef CONFIG_KSU_WITH_KPROBES
|
||||
pr_info("ksu_core_kprobe_exit\n");
|
||||
// we dont use this now
|
||||
// ksu_kprobe_exit();
|
||||
|
||||
@@ -107,7 +107,7 @@ struct file *ksu_filp_open_compat(const char *filename, int flags, umode_t mode)
|
||||
ssize_t ksu_kernel_read_compat(struct file *p, void *buf, size_t count,
|
||||
loff_t *pos)
|
||||
{
|
||||
#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 14, 0)
|
||||
#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 14, 0) || defined(KSU_KERNEL_READ)
|
||||
return kernel_read(p, buf, count, pos);
|
||||
#else
|
||||
loff_t offset = pos ? *pos : 0;
|
||||
@@ -122,7 +122,7 @@ ssize_t ksu_kernel_read_compat(struct file *p, void *buf, size_t count,
|
||||
ssize_t ksu_kernel_write_compat(struct file *p, const void *buf, size_t count,
|
||||
loff_t *pos)
|
||||
{
|
||||
#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 14, 0)
|
||||
#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 14, 0) || defined(KSU_KERNEL_WRITE)
|
||||
return kernel_write(p, buf, count, pos);
|
||||
#else
|
||||
loff_t offset = pos ? *pos : 0;
|
||||
@@ -134,7 +134,7 @@ ssize_t ksu_kernel_write_compat(struct file *p, const void *buf, size_t count,
|
||||
#endif
|
||||
}
|
||||
|
||||
#if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 8, 0)
|
||||
#if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 8, 0) || defined(KSU_STRNCPY_FROM_USER_NOFAULT)
|
||||
long ksu_strncpy_from_user_nofault(char *dst, const void __user *unsafe_addr,
|
||||
long count)
|
||||
{
|
||||
|
||||
@@ -57,7 +57,7 @@ int __init kernelsu_init(void)
|
||||
|
||||
ksu_throne_tracker_init();
|
||||
|
||||
#ifdef CONFIG_KPROBES
|
||||
#ifdef CONFIG_KSU_WITH_KPROBES
|
||||
ksu_sucompat_init();
|
||||
ksu_ksud_init();
|
||||
#else
|
||||
@@ -80,7 +80,7 @@ void kernelsu_exit(void)
|
||||
|
||||
destroy_workqueue(ksu_workqueue);
|
||||
|
||||
#ifdef CONFIG_KPROBES
|
||||
#ifdef CONFIG_KSU_WITH_KPROBES
|
||||
ksu_ksud_exit();
|
||||
ksu_sucompat_exit();
|
||||
#endif
|
||||
|
||||
@@ -21,6 +21,8 @@
|
||||
#define CMD_SET_APP_PROFILE 11
|
||||
#define CMD_UID_GRANTED_ROOT 12
|
||||
#define CMD_UID_SHOULD_UMOUNT 13
|
||||
#define CMD_IS_SU_ENABLED 14
|
||||
#define CMD_ENABLE_SU 15
|
||||
|
||||
#define EVENT_POST_FS_DATA 1
|
||||
#define EVENT_BOOT_COMPLETED 2
|
||||
|
||||
@@ -54,15 +54,16 @@ static void stop_vfs_read_hook();
|
||||
static void stop_execve_hook();
|
||||
static void stop_input_hook();
|
||||
|
||||
#ifdef CONFIG_KPROBES
|
||||
#ifdef CONFIG_KSU_WITH_KPROBES
|
||||
static struct work_struct stop_vfs_read_work;
|
||||
static struct work_struct stop_execve_hook_work;
|
||||
static struct work_struct stop_input_hook_work;
|
||||
#else
|
||||
#endif
|
||||
|
||||
bool ksu_vfs_read_hook __read_mostly = true;
|
||||
bool ksu_execveat_hook __read_mostly = true;
|
||||
bool ksu_input_hook __read_mostly = true;
|
||||
#endif
|
||||
|
||||
|
||||
u32 ksu_devpts_sid;
|
||||
|
||||
@@ -157,7 +158,7 @@ int ksu_handle_execveat_ksud(int *fd, struct filename **filename_ptr,
|
||||
struct user_arg_ptr *argv,
|
||||
struct user_arg_ptr *envp, int *flags)
|
||||
{
|
||||
#ifndef CONFIG_KPROBES
|
||||
#ifndef CONFIG_KSU_WITH_KPROBES
|
||||
if (!ksu_execveat_hook) {
|
||||
return 0;
|
||||
}
|
||||
@@ -313,7 +314,7 @@ static ssize_t read_iter_proxy(struct kiocb *iocb, struct iov_iter *to)
|
||||
int ksu_handle_vfs_read(struct file **file_ptr, char __user **buf_ptr,
|
||||
size_t *count_ptr, loff_t **pos)
|
||||
{
|
||||
#ifndef CONFIG_KPROBES
|
||||
#ifndef CONFIG_KSU_WITH_KPROBES
|
||||
if (!ksu_vfs_read_hook) {
|
||||
return 0;
|
||||
}
|
||||
@@ -426,7 +427,7 @@ static bool is_volumedown_enough(unsigned int count)
|
||||
int ksu_handle_input_handle_event(unsigned int *type, unsigned int *code,
|
||||
int *value)
|
||||
{
|
||||
#ifndef CONFIG_KPROBES
|
||||
#ifndef CONFIG_KSU_WITH_KPROBES
|
||||
if (!ksu_input_hook) {
|
||||
return 0;
|
||||
}
|
||||
@@ -468,7 +469,7 @@ bool ksu_is_safe_mode()
|
||||
return false;
|
||||
}
|
||||
|
||||
#ifdef CONFIG_KPROBES
|
||||
#ifdef CONFIG_KSU_WITH_KPROBES
|
||||
|
||||
// https://elixir.bootlin.com/linux/v5.10.158/source/fs/exec.c#L1864
|
||||
static int execve_handler_pre(struct kprobe *p, struct pt_regs *regs)
|
||||
@@ -598,7 +599,7 @@ static void do_stop_input_hook(struct work_struct *work)
|
||||
|
||||
static void stop_vfs_read_hook()
|
||||
{
|
||||
#ifdef CONFIG_KPROBES
|
||||
#ifdef CONFIG_KSU_WITH_KPROBES
|
||||
bool ret = schedule_work(&stop_vfs_read_work);
|
||||
pr_info("unregister vfs_read kprobe: %d!\n", ret);
|
||||
#else
|
||||
@@ -609,7 +610,7 @@ static void stop_vfs_read_hook()
|
||||
|
||||
static void stop_execve_hook()
|
||||
{
|
||||
#ifdef CONFIG_KPROBES
|
||||
#ifdef CONFIG_KSU_WITH_KPROBES
|
||||
bool ret = schedule_work(&stop_execve_hook_work);
|
||||
pr_info("unregister execve kprobe: %d!\n", ret);
|
||||
#else
|
||||
@@ -620,15 +621,16 @@ static void stop_execve_hook()
|
||||
|
||||
static void stop_input_hook()
|
||||
{
|
||||
#ifdef CONFIG_KSU_WITH_KPROBES
|
||||
static bool input_hook_stopped = false;
|
||||
if (input_hook_stopped) {
|
||||
return;
|
||||
}
|
||||
input_hook_stopped = true;
|
||||
#ifdef CONFIG_KPROBES
|
||||
bool ret = schedule_work(&stop_input_hook_work);
|
||||
pr_info("unregister input kprobe: %d!\n", ret);
|
||||
#else
|
||||
if (!ksu_input_hook) { return; }
|
||||
ksu_input_hook = false;
|
||||
pr_info("stop input_hook\n");
|
||||
#endif
|
||||
@@ -637,7 +639,7 @@ static void stop_input_hook()
|
||||
// ksud: module support
|
||||
void ksu_ksud_init()
|
||||
{
|
||||
#ifdef CONFIG_KPROBES
|
||||
#ifdef CONFIG_KSU_WITH_KPROBES
|
||||
int ret;
|
||||
|
||||
ret = register_kprobe(&execve_kp);
|
||||
@@ -657,10 +659,10 @@ void ksu_ksud_init()
|
||||
|
||||
void ksu_ksud_exit()
|
||||
{
|
||||
#ifdef CONFIG_KPROBES
|
||||
#ifdef CONFIG_KSU_WITH_KPROBES
|
||||
unregister_kprobe(&execve_kp);
|
||||
// this should be done before unregister vfs_read_kp
|
||||
// unregister_kprobe(&vfs_read_kp);
|
||||
unregister_kprobe(&input_event_kp);
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
||||
@@ -39,7 +39,7 @@ perform_cleanup() {
|
||||
# Sets up or update KernelSU-Next environment
|
||||
setup_kernelsu() {
|
||||
echo "[+] Setting up KernelSU-Next..."
|
||||
test -d "$GKI_ROOT/KernelSU-Next" || git clone https://github.com/rifsxd/KernelSU-Next && echo "[+] Repository cloned."
|
||||
test -d "$GKI_ROOT/KernelSU-Next" || git clone https://github.com/KernelSU-Next/KernelSU-Next && echo "[+] Repository cloned."
|
||||
cd "$GKI_ROOT/KernelSU-Next"
|
||||
git stash && echo "[-] Stashed current changes."
|
||||
if [ "$(git status | grep -Po 'v\d+(\.\d+)*' | head -n1)" ]; then
|
||||
|
||||
@@ -24,6 +24,12 @@
|
||||
#define SU_PATH "/system/bin/su"
|
||||
#define SH_PATH "/system/bin/sh"
|
||||
|
||||
bool ksu_faccessat_hook __read_mostly = true;
|
||||
bool ksu_stat_hook __read_mostly = true;
|
||||
bool ksu_execve_sucompat_hook __read_mostly = true;
|
||||
bool ksu_execveat_sucompat_hook __read_mostly = true;
|
||||
bool ksu_devpts_hook __read_mostly = true;
|
||||
|
||||
extern void escape_to_root();
|
||||
|
||||
static void __user *userspace_stack_buffer(const void *d, size_t len)
|
||||
@@ -54,6 +60,12 @@ int ksu_handle_faccessat(int *dfd, const char __user **filename_user, int *mode,
|
||||
{
|
||||
const char su[] = SU_PATH;
|
||||
|
||||
#ifndef CONFIG_KSU_WITH_KPROBES
|
||||
if (!ksu_faccessat_hook) {
|
||||
return 0;
|
||||
}
|
||||
#endif
|
||||
|
||||
if (!ksu_is_allow_uid(current_uid().val)) {
|
||||
return 0;
|
||||
}
|
||||
@@ -75,6 +87,12 @@ int ksu_handle_stat(int *dfd, const char __user **filename_user, int *flags)
|
||||
// const char sh[] = SH_PATH;
|
||||
const char su[] = SU_PATH;
|
||||
|
||||
#ifndef CONFIG_KSU_WITH_KPROBES
|
||||
if (!ksu_stat_hook){
|
||||
return 0;
|
||||
}
|
||||
#endif
|
||||
|
||||
if (!ksu_is_allow_uid(current_uid().val)) {
|
||||
return 0;
|
||||
}
|
||||
@@ -119,6 +137,12 @@ int ksu_handle_execveat_sucompat(int *fd, struct filename **filename_ptr,
|
||||
const char sh[] = KSUD_PATH;
|
||||
const char su[] = SU_PATH;
|
||||
|
||||
#ifndef CONFIG_KSU_WITH_KPROBES
|
||||
if (!ksu_execveat_sucompat_hook) {
|
||||
return 0;
|
||||
}
|
||||
#endif
|
||||
|
||||
if (unlikely(!filename_ptr))
|
||||
return 0;
|
||||
|
||||
@@ -148,6 +172,12 @@ int ksu_handle_execve_sucompat(int *fd, const char __user **filename_user,
|
||||
const char su[] = SU_PATH;
|
||||
char path[sizeof(su) + 1];
|
||||
|
||||
#ifndef CONFIG_KSU_WITH_KPROBES
|
||||
if (!ksu_execve_sucompat_hook) {
|
||||
return 0;
|
||||
}
|
||||
#endif
|
||||
|
||||
if (unlikely(!filename_user))
|
||||
return 0;
|
||||
|
||||
@@ -170,6 +200,12 @@ int ksu_handle_execve_sucompat(int *fd, const char __user **filename_user,
|
||||
|
||||
int ksu_handle_devpts(struct inode *inode)
|
||||
{
|
||||
#ifndef CONFIG_KSU_WITH_KPROBES
|
||||
if (!ksu_devpts_hook) {
|
||||
return 0;
|
||||
}
|
||||
#endif
|
||||
|
||||
if (!current->mm) {
|
||||
return 0;
|
||||
}
|
||||
@@ -198,21 +234,9 @@ int ksu_handle_devpts(struct inode *inode)
|
||||
return 0;
|
||||
}
|
||||
|
||||
#ifdef CONFIG_KPROBES
|
||||
#ifdef CONFIG_KSU_WITH_KPROBES
|
||||
|
||||
__maybe_unused static int faccessat_handler_pre(struct kprobe *p,
|
||||
struct pt_regs *regs)
|
||||
{
|
||||
int *dfd = (int *)&PT_REGS_PARM1(regs);
|
||||
const char __user **filename_user = (const char **)&PT_REGS_PARM2(regs);
|
||||
int *mode = (int *)&PT_REGS_PARM3(regs);
|
||||
// Both sys_ and do_ is C function
|
||||
int *flags = (int *)&PT_REGS_CCALL_PARM4(regs);
|
||||
|
||||
return ksu_handle_faccessat(dfd, filename_user, mode, flags);
|
||||
}
|
||||
|
||||
static int sys_faccessat_handler_pre(struct kprobe *p, struct pt_regs *regs)
|
||||
static int faccessat_handler_pre(struct kprobe *p, struct pt_regs *regs)
|
||||
{
|
||||
struct pt_regs *real_regs = PT_REAL_REGS(regs);
|
||||
int *dfd = (int *)&PT_REGS_PARM1(real_regs);
|
||||
@@ -223,23 +247,7 @@ static int sys_faccessat_handler_pre(struct kprobe *p, struct pt_regs *regs)
|
||||
return ksu_handle_faccessat(dfd, filename_user, mode, NULL);
|
||||
}
|
||||
|
||||
__maybe_unused static int newfstatat_handler_pre(struct kprobe *p,
|
||||
struct pt_regs *regs)
|
||||
{
|
||||
int *dfd = (int *)&PT_REGS_PARM1(regs);
|
||||
const char __user **filename_user = (const char **)&PT_REGS_PARM2(regs);
|
||||
#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 11, 0)
|
||||
// static int vfs_statx(int dfd, const char __user *filename, int flags, struct kstat *stat, u32 request_mask)
|
||||
int *flags = (int *)&PT_REGS_PARM3(regs);
|
||||
#else
|
||||
// int vfs_fstatat(int dfd, const char __user *filename, struct kstat *stat,int flag)
|
||||
int *flags = (int *)&PT_REGS_CCALL_PARM4(regs);
|
||||
#endif
|
||||
|
||||
return ksu_handle_stat(dfd, filename_user, flags);
|
||||
}
|
||||
|
||||
static int sys_newfstatat_handler_pre(struct kprobe *p, struct pt_regs *regs)
|
||||
static int newfstatat_handler_pre(struct kprobe *p, struct pt_regs *regs)
|
||||
{
|
||||
struct pt_regs *real_regs = PT_REAL_REGS(regs);
|
||||
int *dfd = (int *)&PT_REGS_PARM1(real_regs);
|
||||
@@ -250,17 +258,7 @@ static int sys_newfstatat_handler_pre(struct kprobe *p, struct pt_regs *regs)
|
||||
return ksu_handle_stat(dfd, filename_user, flags);
|
||||
}
|
||||
|
||||
// https://elixir.bootlin.com/linux/v5.10.158/source/fs/exec.c#L1864
|
||||
static int execve_handler_pre(struct kprobe *p, struct pt_regs *regs)
|
||||
{
|
||||
int *fd = (int *)&PT_REGS_PARM1(regs);
|
||||
struct filename **filename_ptr =
|
||||
(struct filename **)&PT_REGS_PARM2(regs);
|
||||
|
||||
return ksu_handle_execveat_sucompat(fd, filename_ptr, NULL, NULL, NULL);
|
||||
}
|
||||
|
||||
static int sys_execve_handler_pre(struct kprobe *p, struct pt_regs *regs)
|
||||
{
|
||||
struct pt_regs *real_regs = PT_REAL_REGS(regs);
|
||||
const char __user **filename_user =
|
||||
@@ -270,56 +268,6 @@ static int sys_execve_handler_pre(struct kprobe *p, struct pt_regs *regs)
|
||||
NULL);
|
||||
}
|
||||
|
||||
#if 1
|
||||
static struct kprobe faccessat_kp = {
|
||||
.symbol_name = SYS_FACCESSAT_SYMBOL,
|
||||
.pre_handler = sys_faccessat_handler_pre,
|
||||
};
|
||||
#else
|
||||
static struct kprobe faccessat_kp = {
|
||||
#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 17, 0)
|
||||
.symbol_name = "do_faccessat",
|
||||
#else
|
||||
.symbol_name = "sys_faccessat",
|
||||
#endif
|
||||
.pre_handler = faccessat_handler_pre,
|
||||
};
|
||||
#endif
|
||||
|
||||
#if 1
|
||||
static struct kprobe newfstatat_kp = {
|
||||
.symbol_name = SYS_NEWFSTATAT_SYMBOL,
|
||||
.pre_handler = sys_newfstatat_handler_pre,
|
||||
};
|
||||
#else
|
||||
static struct kprobe newfstatat_kp = {
|
||||
#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 11, 0)
|
||||
.symbol_name = "vfs_statx",
|
||||
#else
|
||||
.symbol_name = "vfs_fstatat",
|
||||
#endif
|
||||
.pre_handler = newfstatat_handler_pre,
|
||||
};
|
||||
#endif
|
||||
|
||||
#if 1
|
||||
static struct kprobe execve_kp = {
|
||||
.symbol_name = SYS_EXECVE_SYMBOL,
|
||||
.pre_handler = sys_execve_handler_pre,
|
||||
};
|
||||
#else
|
||||
static struct kprobe execve_kp = {
|
||||
#if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 9, 0)
|
||||
.symbol_name = "do_execveat_common",
|
||||
#elif LINUX_VERSION_CODE >= KERNEL_VERSION(4, 19, 0)
|
||||
.symbol_name = "__do_execve_file",
|
||||
#elif LINUX_VERSION_CODE >= KERNEL_VERSION(3, 19, 0)
|
||||
.symbol_name = "do_execveat_common",
|
||||
#endif
|
||||
.pre_handler = execve_handler_pre,
|
||||
};
|
||||
#endif
|
||||
|
||||
static int pts_unix98_lookup_pre(struct kprobe *p, struct pt_regs *regs)
|
||||
{
|
||||
struct inode *inode;
|
||||
@@ -333,35 +281,69 @@ static int pts_unix98_lookup_pre(struct kprobe *p, struct pt_regs *regs)
|
||||
return ksu_handle_devpts(inode);
|
||||
}
|
||||
|
||||
static struct kprobe pts_unix98_lookup_kp = { .symbol_name =
|
||||
"pts_unix98_lookup",
|
||||
.pre_handler =
|
||||
pts_unix98_lookup_pre };
|
||||
static struct kprobe *init_kprobe(const char *name,
|
||||
kprobe_pre_handler_t handler)
|
||||
{
|
||||
struct kprobe *kp = kzalloc(sizeof(struct kprobe), GFP_KERNEL);
|
||||
if (!kp)
|
||||
return NULL;
|
||||
kp->symbol_name = name;
|
||||
kp->pre_handler = handler;
|
||||
|
||||
int ret = register_kprobe(kp);
|
||||
pr_info("sucompat: register_%s kprobe: %d\n", name, ret);
|
||||
if (ret) {
|
||||
kfree(kp);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
return kp;
|
||||
}
|
||||
|
||||
static void destroy_kprobe(struct kprobe **kp_ptr)
|
||||
{
|
||||
struct kprobe *kp = *kp_ptr;
|
||||
if (!kp)
|
||||
return;
|
||||
unregister_kprobe(kp);
|
||||
synchronize_rcu();
|
||||
kfree(kp);
|
||||
*kp_ptr = NULL;
|
||||
}
|
||||
|
||||
static struct kprobe *su_kps[4];
|
||||
#endif
|
||||
|
||||
// sucompat: permited process can execute 'su' to gain root access.
|
||||
void ksu_sucompat_init()
|
||||
{
|
||||
#ifdef CONFIG_KPROBES
|
||||
int ret;
|
||||
ret = register_kprobe(&execve_kp);
|
||||
pr_info("sucompat: execve_kp: %d\n", ret);
|
||||
ret = register_kprobe(&newfstatat_kp);
|
||||
pr_info("sucompat: newfstatat_kp: %d\n", ret);
|
||||
ret = register_kprobe(&faccessat_kp);
|
||||
pr_info("sucompat: faccessat_kp: %d\n", ret);
|
||||
ret = register_kprobe(&pts_unix98_lookup_kp);
|
||||
pr_info("sucompat: devpts_kp: %d\n", ret);
|
||||
#ifdef CONFIG_KSU_WITH_KPROBES
|
||||
su_kps[0] = init_kprobe(SYS_EXECVE_SYMBOL, execve_handler_pre);
|
||||
su_kps[1] = init_kprobe(SYS_FACCESSAT_SYMBOL, faccessat_handler_pre);
|
||||
su_kps[2] = init_kprobe(SYS_NEWFSTATAT_SYMBOL, newfstatat_handler_pre);
|
||||
su_kps[3] = init_kprobe("pts_unix98_lookup", pts_unix98_lookup_pre);
|
||||
#else
|
||||
ksu_faccessat_hook = true;
|
||||
ksu_stat_hook = true;
|
||||
ksu_execve_sucompat_hook = true;
|
||||
ksu_execveat_sucompat_hook = true;
|
||||
ksu_devpts_hook = true;
|
||||
pr_info("ksu_sucompat_init: hooks enabled: execve/execveat_su, faccessat, stat, devpts\n");
|
||||
#endif
|
||||
}
|
||||
|
||||
void ksu_sucompat_exit()
|
||||
{
|
||||
#ifdef CONFIG_KPROBES
|
||||
unregister_kprobe(&execve_kp);
|
||||
unregister_kprobe(&newfstatat_kp);
|
||||
unregister_kprobe(&faccessat_kp);
|
||||
unregister_kprobe(&pts_unix98_lookup_kp);
|
||||
#ifdef CONFIG_KSU_WITH_KPROBES
|
||||
for (int i = 0; i < ARRAY_SIZE(su_kps); i++) {
|
||||
destroy_kprobe(&su_kps[i]);
|
||||
}
|
||||
#else
|
||||
ksu_faccessat_hook = false;
|
||||
ksu_stat_hook = false;
|
||||
ksu_execve_sucompat_hook = false;
|
||||
ksu_execveat_sucompat_hook = false;
|
||||
ksu_devpts_hook = false;
|
||||
pr_info("ksu_sucompat_exit: hooks disabled: execve/execveat_su, faccessat, stat, devpts\n");
|
||||
#endif
|
||||
}
|
||||
|
||||
@@ -296,3 +296,13 @@ JNIEXPORT jboolean JNICALL
|
||||
Java_com_rifsxd_ksunext_Natives_uidShouldUmount(JNIEnv *env, jobject thiz, jint uid) {
|
||||
return uid_should_umount(uid);
|
||||
}
|
||||
extern "C"
|
||||
JNIEXPORT jboolean JNICALL
|
||||
Java_com_rifsxd_ksunext_Natives_isSuEnabled(JNIEnv *env, jobject thiz) {
|
||||
return is_su_enabled();
|
||||
}
|
||||
extern "C"
|
||||
JNIEXPORT jboolean JNICALL
|
||||
Java_com_rifsxd_ksunext_Natives_setSuEnabled(JNIEnv *env, jobject thiz, jboolean enabled) {
|
||||
return set_su_enabled(enabled);
|
||||
}
|
||||
|
||||
@@ -27,6 +27,8 @@
|
||||
|
||||
#define CMD_IS_UID_GRANTED_ROOT 12
|
||||
#define CMD_IS_UID_SHOULD_UMOUNT 13
|
||||
#define CMD_IS_SU_ENABLED 14
|
||||
#define CMD_ENABLE_SU 15
|
||||
|
||||
static bool ksuctl(int cmd, void* arg1, void* arg2) {
|
||||
int32_t result = 0;
|
||||
@@ -84,3 +86,14 @@ bool set_app_profile(const app_profile *profile) {
|
||||
bool get_app_profile(p_key_t key, app_profile *profile) {
|
||||
return ksuctl(CMD_GET_APP_PROFILE, (void*) profile, nullptr);
|
||||
}
|
||||
|
||||
bool set_su_enabled(bool enabled) {
|
||||
return ksuctl(CMD_ENABLE_SU, (void*) enabled, nullptr);
|
||||
}
|
||||
|
||||
bool is_su_enabled() {
|
||||
bool enabled = true;
|
||||
// if ksuctl failed, we assume su is enabled, and it cannot be disabled.
|
||||
ksuctl(CMD_IS_SU_ENABLED, &enabled, nullptr);
|
||||
return enabled;
|
||||
}
|
||||
@@ -79,4 +79,8 @@ bool set_app_profile(const app_profile *profile);
|
||||
|
||||
bool get_app_profile(p_key_t key, app_profile *profile);
|
||||
|
||||
bool set_su_enabled(bool enabled);
|
||||
|
||||
bool is_su_enabled();
|
||||
|
||||
#endif //KERNELSU_KSU_H
|
||||
|
||||
@@ -1,16 +1,22 @@
|
||||
package com.rifsxd.ksunext
|
||||
|
||||
import android.app.Application
|
||||
import android.system.Os
|
||||
import coil.Coil
|
||||
import coil.ImageLoader
|
||||
import me.zhanghai.android.appiconloader.coil.AppIconFetcher
|
||||
import me.zhanghai.android.appiconloader.coil.AppIconKeyer
|
||||
import okhttp3.Cache
|
||||
import okhttp3.OkHttpClient
|
||||
import java.io.File
|
||||
import java.util.Locale
|
||||
|
||||
lateinit var ksuApp: KernelSUApplication
|
||||
|
||||
class KernelSUApplication : Application() {
|
||||
|
||||
lateinit var okhttpClient: OkHttpClient
|
||||
|
||||
override fun onCreate() {
|
||||
super.onCreate()
|
||||
ksuApp = this
|
||||
@@ -30,7 +36,20 @@ class KernelSUApplication : Application() {
|
||||
if (!webroot.exists()) {
|
||||
webroot.mkdir()
|
||||
}
|
||||
|
||||
// Provide working env for rust's temp_dir()
|
||||
Os.setenv("TMPDIR", cacheDir.absolutePath, true)
|
||||
|
||||
okhttpClient =
|
||||
OkHttpClient.Builder().cache(Cache(File(cacheDir, "okhttp"), 10 * 1024 * 1024))
|
||||
.addInterceptor { block ->
|
||||
block.proceed(
|
||||
block.request().newBuilder()
|
||||
.header("User-Agent", "KernelSU/${BuildConfig.VERSION_CODE}")
|
||||
.header("Accept-Language", Locale.getDefault().toLanguageTag()).build()
|
||||
)
|
||||
}.build()
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@@ -21,6 +21,9 @@ object Natives {
|
||||
// 11640: Support query working mode, LKM or GKI
|
||||
// when MINIMAL_SUPPORTED_KERNEL > 11640, we can remove this constant.
|
||||
const val MINIMAL_SUPPORTED_KERNEL_LKM = 11648
|
||||
|
||||
// 12402: Support disable sucompat mode
|
||||
const val MINIMAL_SUPPORTED_SU_COMPAT = 12402
|
||||
const val KERNEL_SU_DOMAIN = "u:r:su:s0"
|
||||
|
||||
const val ROOT_UID = 0
|
||||
@@ -55,6 +58,15 @@ object Natives {
|
||||
external fun getAppProfile(key: String?, uid: Int): Profile
|
||||
external fun setAppProfile(profile: Profile?): Boolean
|
||||
|
||||
/**
|
||||
* `su` compat mode can be disabled temporarily.
|
||||
* 0: disabled
|
||||
* 1: enabled
|
||||
* negative : error
|
||||
*/
|
||||
external fun isSuEnabled(): Boolean
|
||||
external fun setSuEnabled(enabled: Boolean): Boolean
|
||||
|
||||
private const val NON_ROOT_DEFAULT_PROFILE_KEY = "$"
|
||||
private const val NOBODY_UID = 9999
|
||||
|
||||
|
||||
@@ -98,7 +98,7 @@ private fun AboutCardContent() {
|
||||
val annotatedString = AnnotatedString.Companion.fromHtml(
|
||||
htmlString = stringResource(
|
||||
id = R.string.about_source_code,
|
||||
"<b><a href=\"https://github.com/rifsxd/KernelSU-Next\">GitHub</a></b>"
|
||||
"<b><a href=\"https://github.com/KernelSU-Next/KernelSU-Next\">GitHub</a></b>"
|
||||
),
|
||||
linkStyles = TextLinkStyles(
|
||||
style = SpanStyle(
|
||||
|
||||
@@ -73,6 +73,7 @@ fun RootProfileConfig(
|
||||
)
|
||||
}
|
||||
|
||||
/*
|
||||
var expanded by remember { mutableStateOf(false) }
|
||||
val currentNamespace = when (profile.namespace) {
|
||||
Natives.Profile.Namespace.INHERITED.ordinal -> stringResource(R.string.profile_namespace_inherited)
|
||||
@@ -126,6 +127,7 @@ fun RootProfileConfig(
|
||||
}
|
||||
}
|
||||
})
|
||||
*/
|
||||
|
||||
UidPanel(uid = profile.uid, label = "uid", onUidChange = {
|
||||
onProfileChange(
|
||||
|
||||
@@ -95,6 +95,7 @@ fun AppProfileScreen(
|
||||
val scope = rememberCoroutineScope()
|
||||
val failToUpdateAppProfile = stringResource(R.string.failed_to_update_app_profile).format(appInfo.label)
|
||||
val failToUpdateSepolicy = stringResource(R.string.failed_to_update_sepolicy).format(appInfo.label)
|
||||
val suNotAllowed = stringResource(R.string.su_not_allowed).format(appInfo.label)
|
||||
|
||||
val packageName = appInfo.packageName
|
||||
val initialProfile = Natives.getAppProfile(packageName, appInfo.uid)
|
||||
@@ -143,8 +144,13 @@ fun AppProfileScreen(
|
||||
},
|
||||
onProfileChange = {
|
||||
scope.launch {
|
||||
if (it.allowSu && !it.rootUseDefault && it.rules.isNotEmpty()) {
|
||||
if (!setSepolicy(profile.name, it.rules)) {
|
||||
if (it.allowSu) {
|
||||
// sync with allowlist.c - forbid_system_uid
|
||||
if (appInfo.uid < 2000 && appInfo.uid != 1000) {
|
||||
snackBarHost.showSnackbar(suNotAllowed)
|
||||
return@launch
|
||||
}
|
||||
if (!it.rootUseDefault && it.rules.isNotEmpty() && !setSepolicy(profile.name, it.rules)) {
|
||||
snackBarHost.showSnackbar(failToUpdateSepolicy)
|
||||
return@launch
|
||||
}
|
||||
|
||||
@@ -0,0 +1,297 @@
|
||||
package com.rifsxd.ksunext.ui.screen
|
||||
|
||||
import android.content.Context
|
||||
import android.content.Intent
|
||||
import android.net.Uri
|
||||
import android.widget.Toast
|
||||
import androidx.activity.compose.rememberLauncherForActivityResult
|
||||
import androidx.activity.result.contract.ActivityResultContracts
|
||||
import androidx.compose.foundation.clickable
|
||||
import androidx.compose.foundation.layout.Box
|
||||
import androidx.compose.foundation.layout.Column
|
||||
import androidx.compose.foundation.layout.Row
|
||||
import androidx.compose.foundation.layout.WindowInsets
|
||||
import androidx.compose.foundation.layout.WindowInsetsSides
|
||||
import androidx.compose.foundation.layout.only
|
||||
import androidx.compose.foundation.layout.padding
|
||||
import androidx.compose.foundation.layout.safeDrawing
|
||||
import androidx.compose.foundation.rememberScrollState
|
||||
import androidx.compose.foundation.verticalScroll
|
||||
import androidx.compose.material.icons.Icons
|
||||
import androidx.compose.material.icons.automirrored.filled.Undo
|
||||
import androidx.compose.material.icons.filled.*
|
||||
import androidx.compose.material3.ExperimentalMaterial3Api
|
||||
import androidx.compose.material3.HorizontalDivider
|
||||
import androidx.compose.material3.Icon
|
||||
import androidx.compose.material3.IconButton
|
||||
import androidx.compose.material3.ListItem
|
||||
import androidx.compose.material3.ModalBottomSheet
|
||||
import androidx.compose.material3.Scaffold
|
||||
import androidx.compose.material3.SnackbarHost
|
||||
import androidx.compose.material3.Text
|
||||
import androidx.compose.material3.AlertDialog
|
||||
import androidx.compose.material3.TextButton
|
||||
import androidx.compose.material3.TopAppBar
|
||||
import androidx.compose.material3.TopAppBarDefaults
|
||||
import androidx.compose.material3.TopAppBarScrollBehavior
|
||||
import androidx.compose.material3.rememberTopAppBarState
|
||||
import androidx.compose.runtime.Composable
|
||||
import androidx.compose.runtime.getValue
|
||||
import androidx.compose.runtime.LaunchedEffect
|
||||
import androidx.compose.runtime.mutableStateOf
|
||||
import androidx.compose.runtime.remember
|
||||
import androidx.compose.runtime.rememberCoroutineScope
|
||||
import androidx.compose.runtime.saveable.rememberSaveable
|
||||
import androidx.compose.runtime.setValue
|
||||
import androidx.compose.ui.Alignment
|
||||
import androidx.compose.ui.Modifier
|
||||
import androidx.compose.ui.graphics.vector.ImageVector
|
||||
import androidx.compose.ui.input.nestedscroll.nestedScroll
|
||||
import androidx.compose.ui.platform.LocalContext
|
||||
import androidx.compose.ui.res.stringResource
|
||||
import androidx.compose.ui.text.style.LineHeightStyle
|
||||
import androidx.compose.ui.text.style.TextAlign
|
||||
import androidx.compose.ui.tooling.preview.Preview
|
||||
import androidx.compose.ui.unit.Dp
|
||||
import androidx.compose.ui.unit.dp
|
||||
import androidx.core.content.FileProvider
|
||||
import com.maxkeppeker.sheets.core.models.base.Header
|
||||
import com.maxkeppeker.sheets.core.models.base.IconSource
|
||||
import com.maxkeppeker.sheets.core.models.base.rememberUseCaseState
|
||||
import com.maxkeppeler.sheets.list.ListDialog
|
||||
import com.maxkeppeler.sheets.list.models.ListOption
|
||||
import com.maxkeppeler.sheets.list.models.ListSelection
|
||||
import com.ramcosta.composedestinations.annotation.Destination
|
||||
import com.ramcosta.composedestinations.annotation.RootGraph
|
||||
import com.ramcosta.composedestinations.navigation.DestinationsNavigator
|
||||
import com.ramcosta.composedestinations.navigation.EmptyDestinationsNavigator
|
||||
import kotlinx.coroutines.Dispatchers
|
||||
import kotlinx.coroutines.launch
|
||||
import kotlinx.coroutines.withContext
|
||||
import com.rifsxd.ksunext.BuildConfig
|
||||
import com.rifsxd.ksunext.Natives
|
||||
import com.rifsxd.ksunext.ksuApp
|
||||
import com.rifsxd.ksunext.R
|
||||
import com.rifsxd.ksunext.ui.component.AboutDialog
|
||||
import com.rifsxd.ksunext.ui.component.ConfirmResult
|
||||
import com.rifsxd.ksunext.ui.component.DialogHandle
|
||||
import com.rifsxd.ksunext.ui.component.SwitchItem
|
||||
import com.rifsxd.ksunext.ui.component.rememberConfirmDialog
|
||||
import com.rifsxd.ksunext.ui.component.rememberCustomDialog
|
||||
import com.rifsxd.ksunext.ui.component.rememberLoadingDialog
|
||||
import com.rifsxd.ksunext.ui.util.LocalSnackbarHost
|
||||
import com.rifsxd.ksunext.ui.util.getBugreportFile
|
||||
import com.rifsxd.ksunext.ui.util.*
|
||||
import java.time.LocalDateTime
|
||||
import java.time.format.DateTimeFormatter
|
||||
|
||||
/**
|
||||
* @author rifsxd
|
||||
* @date 2025/1/14.
|
||||
*/
|
||||
@OptIn(ExperimentalMaterial3Api::class)
|
||||
@Destination<RootGraph>
|
||||
@Composable
|
||||
fun BackupRestoreScreen(navigator: DestinationsNavigator) {
|
||||
val scrollBehavior = TopAppBarDefaults.pinnedScrollBehavior(rememberTopAppBarState())
|
||||
val snackBarHost = LocalSnackbarHost.current
|
||||
|
||||
val isManager = Natives.becomeManager(ksuApp.packageName)
|
||||
val ksuVersion = if (isManager) Natives.version else null
|
||||
|
||||
Scaffold(
|
||||
topBar = {
|
||||
TopBar(
|
||||
scrollBehavior = scrollBehavior
|
||||
)
|
||||
},
|
||||
snackbarHost = { SnackbarHost(snackBarHost) },
|
||||
contentWindowInsets = WindowInsets.safeDrawing.only(WindowInsetsSides.Top + WindowInsetsSides.Horizontal)
|
||||
) { paddingValues ->
|
||||
val loadingDialog = rememberLoadingDialog()
|
||||
val restoreDialog = rememberConfirmDialog()
|
||||
val backupDialog = rememberConfirmDialog()
|
||||
|
||||
Column(
|
||||
modifier = Modifier
|
||||
.padding(paddingValues)
|
||||
.nestedScroll(scrollBehavior.nestedScrollConnection)
|
||||
.verticalScroll(rememberScrollState())
|
||||
) {
|
||||
|
||||
val context = LocalContext.current
|
||||
val scope = rememberCoroutineScope()
|
||||
|
||||
var showRebootDialog by remember { mutableStateOf(false) }
|
||||
|
||||
if (showRebootDialog) {
|
||||
AlertDialog(
|
||||
onDismissRequest = { showRebootDialog = false },
|
||||
title = { Text(stringResource(R.string.reboot_required)) },
|
||||
text = { Text(stringResource(R.string.reboot_message)) },
|
||||
confirmButton = {
|
||||
TextButton(onClick = {
|
||||
showRebootDialog = false
|
||||
reboot()
|
||||
}) {
|
||||
Text(stringResource(R.string.reboot))
|
||||
}
|
||||
},
|
||||
dismissButton = {
|
||||
TextButton(onClick = { showRebootDialog = false }) {
|
||||
Text(stringResource(R.string.later))
|
||||
}
|
||||
}
|
||||
)
|
||||
}
|
||||
|
||||
val moduleBackup = stringResource(id = R.string.module_backup)
|
||||
val backupMessage = stringResource(id = R.string.module_backup_message)
|
||||
ListItem(
|
||||
leadingContent = {
|
||||
Icon(
|
||||
Icons.Filled.Backup,
|
||||
moduleBackup
|
||||
)
|
||||
},
|
||||
headlineContent = { Text(moduleBackup) },
|
||||
modifier = Modifier.clickable {
|
||||
scope.launch {
|
||||
val result = backupDialog.awaitConfirm(title = moduleBackup, content = backupMessage)
|
||||
if (result == ConfirmResult.Confirmed) {
|
||||
loadingDialog.withLoading {
|
||||
moduleBackup()
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
)
|
||||
|
||||
if (showRebootDialog) {
|
||||
AlertDialog(
|
||||
onDismissRequest = { showRebootDialog = false },
|
||||
title = { Text(stringResource(R.string.reboot_required)) },
|
||||
text = { Text(stringResource(R.string.reboot_message)) },
|
||||
confirmButton = {
|
||||
TextButton(onClick = {
|
||||
showRebootDialog = false
|
||||
reboot()
|
||||
}) {
|
||||
Text(stringResource(R.string.reboot))
|
||||
}
|
||||
},
|
||||
dismissButton = {
|
||||
TextButton(onClick = { showRebootDialog = false }) {
|
||||
Text(stringResource(R.string.later))
|
||||
}
|
||||
}
|
||||
)
|
||||
}
|
||||
|
||||
val prefs = context.getSharedPreferences("settings", Context.MODE_PRIVATE)
|
||||
|
||||
var useOverlayFs by rememberSaveable {
|
||||
mutableStateOf(
|
||||
prefs.getBoolean("use_overlay_fs", false)
|
||||
)
|
||||
}
|
||||
|
||||
val moduleRestore = stringResource(id = R.string.module_restore)
|
||||
val restoreMessage = stringResource(id = R.string.module_restore_message)
|
||||
|
||||
ListItem(
|
||||
leadingContent = {
|
||||
Icon(
|
||||
Icons.Filled.Restore,
|
||||
moduleRestore,
|
||||
tint = if (useOverlayFs) androidx.compose.material3.MaterialTheme.colorScheme.onSurface.copy(alpha = 0.38f) else androidx.compose.material3.MaterialTheme.colorScheme.onSurface
|
||||
)
|
||||
},
|
||||
headlineContent = {
|
||||
Text(
|
||||
moduleRestore,
|
||||
color = if (useOverlayFs) androidx.compose.material3.MaterialTheme.colorScheme.onSurface.copy(alpha = 0.38f) else androidx.compose.material3.MaterialTheme.colorScheme.onSurface
|
||||
)
|
||||
},
|
||||
modifier = Modifier.clickable(
|
||||
enabled = !useOverlayFs,
|
||||
onClick = {
|
||||
scope.launch {
|
||||
val result = restoreDialog.awaitConfirm(title = moduleRestore, content = restoreMessage)
|
||||
if (result == ConfirmResult.Confirmed) {
|
||||
loadingDialog.withLoading {
|
||||
moduleRestore()
|
||||
showRebootDialog = true
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
)
|
||||
)
|
||||
|
||||
HorizontalDivider(thickness = Dp.Hairline)
|
||||
|
||||
val allowlistBackup = stringResource(id = R.string.allowlist_backup)
|
||||
val allowlistbackupMessage = stringResource(id = R.string.allowlist_backup_message)
|
||||
ListItem(
|
||||
leadingContent = {
|
||||
Icon(
|
||||
Icons.Filled.Backup,
|
||||
allowlistBackup
|
||||
)
|
||||
},
|
||||
headlineContent = { Text(allowlistBackup) },
|
||||
modifier = Modifier.clickable {
|
||||
scope.launch {
|
||||
val result = backupDialog.awaitConfirm(title = allowlistBackup, content = allowlistbackupMessage)
|
||||
if (result == ConfirmResult.Confirmed) {
|
||||
loadingDialog.withLoading {
|
||||
allowlistBackup()
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
)
|
||||
|
||||
val allowlistRestore = stringResource(id = R.string.allowlist_restore)
|
||||
val allowlistrestoreMessage = stringResource(id = R.string.allowlist_restore_message)
|
||||
ListItem(
|
||||
leadingContent = {
|
||||
Icon(
|
||||
Icons.Filled.Restore,
|
||||
allowlistRestore
|
||||
)
|
||||
},
|
||||
headlineContent = { Text(allowlistRestore) },
|
||||
modifier = Modifier.clickable {
|
||||
scope.launch {
|
||||
val result = restoreDialog.awaitConfirm(title = allowlistRestore, content = allowlistrestoreMessage)
|
||||
if (result == ConfirmResult.Confirmed) {
|
||||
loadingDialog.withLoading {
|
||||
allowlistRestore()
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@OptIn(ExperimentalMaterial3Api::class)
|
||||
@Composable
|
||||
private fun TopBar(
|
||||
scrollBehavior: TopAppBarScrollBehavior? = null
|
||||
) {
|
||||
TopAppBar(
|
||||
title = { Text(stringResource(R.string.backup_restore)) },
|
||||
windowInsets = WindowInsets.safeDrawing.only(WindowInsetsSides.Top + WindowInsetsSides.Horizontal),
|
||||
scrollBehavior = scrollBehavior
|
||||
)
|
||||
}
|
||||
|
||||
@Preview
|
||||
@Composable
|
||||
private fun BackupPreview() {
|
||||
BackupRestoreScreen(EmptyDestinationsNavigator)
|
||||
}
|
||||
@@ -110,7 +110,7 @@ fun ExecuteModuleActionScreen(navigator: DestinationsNavigator, moduleId: String
|
||||
val date = format.format(Date())
|
||||
val file = File(
|
||||
Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS),
|
||||
"KernelSU_module_action_log_${date}.log"
|
||||
"KernelSU_Next_module_action_log_${date}.log"
|
||||
)
|
||||
file.writeText(logContent.toString())
|
||||
snackBarHost.showSnackbar("Log saved to ${file.absolutePath}")
|
||||
|
||||
@@ -53,11 +53,13 @@ import com.ramcosta.composedestinations.annotation.RootGraph
|
||||
import com.ramcosta.composedestinations.navigation.DestinationsNavigator
|
||||
import com.ramcosta.composedestinations.navigation.EmptyDestinationsNavigator
|
||||
import kotlinx.coroutines.Dispatchers
|
||||
import kotlinx.coroutines.CoroutineScope
|
||||
import kotlinx.coroutines.launch
|
||||
import kotlinx.coroutines.withContext
|
||||
import kotlinx.parcelize.Parcelize
|
||||
import com.rifsxd.ksunext.R
|
||||
import com.rifsxd.ksunext.ui.component.KeyEventBlocker
|
||||
import com.rifsxd.ksunext.ui.util.FlashResult
|
||||
import com.rifsxd.ksunext.ui.util.LkmSelection
|
||||
import com.rifsxd.ksunext.ui.util.LocalSnackbarHost
|
||||
import com.rifsxd.ksunext.ui.util.flashModule
|
||||
@@ -76,6 +78,22 @@ enum class FlashingStatus {
|
||||
FAILED
|
||||
}
|
||||
|
||||
// Lets you flash modules sequentially when mutiple zipUris are selected
|
||||
fun flashModulesSequentially(
|
||||
uris: List<Uri>,
|
||||
onStdout: (String) -> Unit,
|
||||
onStderr: (String) -> Unit
|
||||
): FlashResult {
|
||||
for (uri in uris) {
|
||||
flashModule(uri, onStdout, onStderr).apply {
|
||||
if (code != 0) {
|
||||
return FlashResult(code, err, showReboot)
|
||||
}
|
||||
}
|
||||
}
|
||||
return FlashResult(0, "", true)
|
||||
}
|
||||
|
||||
/**
|
||||
* @author weishu
|
||||
* @date 2023/1/1.
|
||||
@@ -86,7 +104,7 @@ enum class FlashingStatus {
|
||||
fun FlashScreen(navigator: DestinationsNavigator, flashIt: FlashIt) {
|
||||
|
||||
var text by rememberSaveable { mutableStateOf("") }
|
||||
var tempText : String
|
||||
var tempText: String
|
||||
val logContent = rememberSaveable { StringBuilder() }
|
||||
var showFloatAction by rememberSaveable { mutableStateOf(false) }
|
||||
|
||||
@@ -107,16 +125,7 @@ fun FlashScreen(navigator: DestinationsNavigator, flashIt: FlashIt) {
|
||||
return@LaunchedEffect
|
||||
}
|
||||
withContext(Dispatchers.IO) {
|
||||
flashIt(flashIt, onFinish = { showReboot, code ->
|
||||
if (code != 0) {
|
||||
text += "Error: exit code = $code.\nPlease save and check the log.\n"
|
||||
}
|
||||
if (showReboot) {
|
||||
text += "\n\n\n"
|
||||
showFloatAction = true
|
||||
}
|
||||
flashing = if (code == 0) FlashingStatus.SUCCESS else FlashingStatus.FAILED
|
||||
}, onStdout = {
|
||||
flashIt(flashIt, onStdout = {
|
||||
tempText = "$it\n"
|
||||
if (tempText.startsWith("[H[J")) { // clear command
|
||||
text = tempText.substring(6)
|
||||
@@ -126,7 +135,16 @@ fun FlashScreen(navigator: DestinationsNavigator, flashIt: FlashIt) {
|
||||
logContent.append(it).append("\n")
|
||||
}, onStderr = {
|
||||
logContent.append(it).append("\n")
|
||||
})
|
||||
}).apply {
|
||||
if (code != 0) {
|
||||
text += "Error code: $code.\n $err Please save and check the log.\n"
|
||||
}
|
||||
if (showReboot) {
|
||||
text += "\n\n\n"
|
||||
showFloatAction = true
|
||||
}
|
||||
flashing = if (code == 0) FlashingStatus.SUCCESS else FlashingStatus.FAILED
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -143,7 +161,7 @@ fun FlashScreen(navigator: DestinationsNavigator, flashIt: FlashIt) {
|
||||
val date = format.format(Date())
|
||||
val file = File(
|
||||
Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS),
|
||||
"KernelSU_install_log_${date}.log"
|
||||
"KernelSU_Next_install_log_${date}.log"
|
||||
)
|
||||
file.writeText(logContent.toString())
|
||||
snackBarHost.showSnackbar("Log saved to ${file.absolutePath}")
|
||||
@@ -200,7 +218,7 @@ sealed class FlashIt : Parcelable {
|
||||
data class FlashBoot(val boot: Uri? = null, val lkm: LkmSelection, val ota: Boolean) :
|
||||
FlashIt()
|
||||
|
||||
data class FlashModule(val uri: Uri) : FlashIt()
|
||||
data class FlashModules(val uris: List<Uri>) : FlashIt()
|
||||
|
||||
data object FlashRestore : FlashIt()
|
||||
|
||||
@@ -208,25 +226,26 @@ sealed class FlashIt : Parcelable {
|
||||
}
|
||||
|
||||
fun flashIt(
|
||||
flashIt: FlashIt, onFinish: (Boolean, Int) -> Unit,
|
||||
flashIt: FlashIt,
|
||||
onStdout: (String) -> Unit,
|
||||
onStderr: (String) -> Unit
|
||||
) {
|
||||
when (flashIt) {
|
||||
): FlashResult {
|
||||
return when (flashIt) {
|
||||
is FlashIt.FlashBoot -> installBoot(
|
||||
flashIt.boot,
|
||||
flashIt.lkm,
|
||||
flashIt.ota,
|
||||
onFinish,
|
||||
onStdout,
|
||||
onStderr
|
||||
)
|
||||
|
||||
is FlashIt.FlashModule -> flashModule(flashIt.uri, onFinish, onStdout, onStderr)
|
||||
is FlashIt.FlashModules -> {
|
||||
flashModulesSequentially(flashIt.uris, onStdout, onStderr)
|
||||
}
|
||||
|
||||
FlashIt.FlashRestore -> restoreBoot(onFinish, onStdout, onStderr)
|
||||
FlashIt.FlashRestore -> restoreBoot(onStdout, onStderr)
|
||||
|
||||
FlashIt.FlashUninstall -> uninstallPermanently(onFinish, onStdout, onStderr)
|
||||
FlashIt.FlashUninstall -> uninstallPermanently(onStdout, onStderr)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -289,6 +289,14 @@ private fun StatusCard(
|
||||
text = stringResource(R.string.home_module_count, getModuleCount()),
|
||||
style = MaterialTheme.typography.bodyMedium
|
||||
)
|
||||
Spacer(Modifier.height(4.dp))
|
||||
val suSFS = getSuSFS()
|
||||
if (suSFS == "Supported") {
|
||||
Text(
|
||||
text = stringResource(R.string.home_susfs, getSuSFS()),
|
||||
style = MaterialTheme.typography.bodyMedium
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -446,6 +454,17 @@ private fun InfoCard() {
|
||||
},
|
||||
icon = Icons.Filled.SettingsSuggest,
|
||||
)
|
||||
Spacer(Modifier.height(16.dp))
|
||||
val isSUS_SU = getSuSFSFeatures() == "CONFIG_KSU_SUSFS_SUS_SU"
|
||||
val suSFS = getSuSFS()
|
||||
if (suSFS == "Supported") {
|
||||
val susSUMode = if (isSUS_SU) "| SuS SU mode: ${susfsSUS_SU_Mode()}" else ""
|
||||
InfoCardItem(
|
||||
label = stringResource(R.string.home_susfs_version),
|
||||
content = "${getSuSFSVersion()} (${getSuSFSVariant()}) $susSUMode",
|
||||
icon = painterResource(R.drawable.ic_sus),
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -55,7 +55,6 @@ import androidx.compose.material3.SnackbarResult
|
||||
import androidx.compose.material3.Switch
|
||||
import androidx.compose.material3.Text
|
||||
import androidx.compose.material3.TextButton
|
||||
import androidx.compose.material3.TopAppBar
|
||||
import androidx.compose.material3.TopAppBarDefaults
|
||||
import androidx.compose.material3.pulltorefresh.PullToRefreshBox
|
||||
import androidx.compose.material3.rememberTopAppBarState
|
||||
@@ -93,9 +92,11 @@ import kotlinx.coroutines.launch
|
||||
import kotlinx.coroutines.withContext
|
||||
import com.rifsxd.ksunext.Natives
|
||||
import com.rifsxd.ksunext.R
|
||||
import com.rifsxd.ksunext.ksuApp
|
||||
import com.rifsxd.ksunext.ui.component.ConfirmResult
|
||||
import com.rifsxd.ksunext.ui.component.rememberConfirmDialog
|
||||
import com.rifsxd.ksunext.ui.component.rememberLoadingDialog
|
||||
import com.rifsxd.ksunext.ui.component.SearchAppBar
|
||||
import com.rifsxd.ksunext.ui.util.*
|
||||
import com.rifsxd.ksunext.ui.util.DownloadListener
|
||||
import com.rifsxd.ksunext.ui.util.LocalSnackbarHost
|
||||
@@ -107,7 +108,6 @@ import com.rifsxd.ksunext.ui.util.uninstallModule
|
||||
import com.rifsxd.ksunext.ui.util.restoreModule
|
||||
import com.rifsxd.ksunext.ui.viewmodel.ModuleViewModel
|
||||
import com.rifsxd.ksunext.ui.webui.WebUIActivity
|
||||
import okhttp3.OkHttpClient
|
||||
|
||||
@OptIn(ExperimentalMaterial3Api::class)
|
||||
@Destination<RootGraph>
|
||||
@@ -135,6 +135,8 @@ fun ModuleScreen(navigator: DestinationsNavigator) {
|
||||
val scrollBehavior = TopAppBarDefaults.pinnedScrollBehavior(rememberTopAppBarState())
|
||||
|
||||
var zipUri by remember { mutableStateOf<Uri?>(null) }
|
||||
var zipUris by remember { mutableStateOf<List<Uri>>(emptyList()) }
|
||||
|
||||
var showConfirmDialog by remember { mutableStateOf(false) }
|
||||
|
||||
val webUILauncher = rememberLauncherForActivityResult(
|
||||
@@ -143,8 +145,12 @@ fun ModuleScreen(navigator: DestinationsNavigator) {
|
||||
|
||||
Scaffold(
|
||||
topBar = {
|
||||
TopAppBar(
|
||||
actions = {
|
||||
SearchAppBar(
|
||||
title = { Text(stringResource(R.string.module)) },
|
||||
searchText = viewModel.search,
|
||||
onSearchTextChange = { viewModel.search = it },
|
||||
onClearClick = { viewModel.search = "" },
|
||||
dropdownContent = {
|
||||
var showDropdown by remember { mutableStateOf(false) }
|
||||
IconButton(
|
||||
onClick = { showDropdown = true },
|
||||
@@ -201,14 +207,18 @@ fun ModuleScreen(navigator: DestinationsNavigator) {
|
||||
}
|
||||
}
|
||||
},
|
||||
scrollBehavior = scrollBehavior,
|
||||
title = { Text(stringResource(R.string.module)) },
|
||||
windowInsets = WindowInsets.safeDrawing.only(WindowInsetsSides.Top + WindowInsetsSides.Horizontal)
|
||||
scrollBehavior = scrollBehavior
|
||||
)
|
||||
},
|
||||
floatingActionButton = {
|
||||
if (!hideInstallButton) {
|
||||
val moduleInstall = stringResource(id = R.string.module_install)
|
||||
val confirmTitle = stringResource(R.string.module)
|
||||
var zipUris by remember { mutableStateOf<List<Uri>>(emptyList()) }
|
||||
val confirmDialog = rememberConfirmDialog(onConfirm = {
|
||||
navigator.navigate(FlashScreenDestination(FlashIt.FlashModules(zipUris)))
|
||||
viewModel.markNeedRefresh()
|
||||
})
|
||||
val selectZipLauncher = rememberLauncherForActivityResult(
|
||||
contract = ActivityResultContracts.StartActivityForResult()
|
||||
) { result ->
|
||||
@@ -216,18 +226,35 @@ fun ModuleScreen(navigator: DestinationsNavigator) {
|
||||
return@rememberLauncherForActivityResult
|
||||
}
|
||||
val data = result.data ?: return@rememberLauncherForActivityResult
|
||||
val uri = data.data ?: return@rememberLauncherForActivityResult
|
||||
val clipData = data.clipData
|
||||
|
||||
// save the selected Uri and trigger confirmation dialog
|
||||
zipUri = uri
|
||||
showConfirmDialog = true
|
||||
val uris = mutableListOf<Uri>()
|
||||
if (clipData != null) {
|
||||
for (i in 0 until clipData.itemCount) {
|
||||
clipData.getItemAt(i)?.uri?.let { uris.add(it) }
|
||||
}
|
||||
} else {
|
||||
data.data?.let { uris.add(it) }
|
||||
}
|
||||
|
||||
// Show confirm dialog with selected zip file(s) name(s)
|
||||
val moduleNames = uris.mapIndexed { index, uri -> "\n${index + 1}. ${uri.getFileName(context)}" }.joinToString("")
|
||||
val confirmContent = context.getString(R.string.module_install_prompt_with_name, moduleNames)
|
||||
zipUris = uris
|
||||
confirmDialog.showConfirm(
|
||||
title = confirmTitle,
|
||||
content = confirmContent,
|
||||
markdown = true
|
||||
)
|
||||
|
||||
}
|
||||
|
||||
ExtendedFloatingActionButton(
|
||||
onClick = {
|
||||
// select the zip file to install
|
||||
// Select the zip files to install
|
||||
val intent = Intent(Intent.ACTION_GET_CONTENT).apply {
|
||||
type = "application/zip"
|
||||
putExtra(Intent.EXTRA_ALLOW_MULTIPLE, true)
|
||||
}
|
||||
selectZipLauncher.launch(intent)
|
||||
},
|
||||
@@ -239,36 +266,6 @@ fun ModuleScreen(navigator: DestinationsNavigator) {
|
||||
contentWindowInsets = WindowInsets.safeDrawing.only(WindowInsetsSides.Top + WindowInsetsSides.Horizontal),
|
||||
snackbarHost = { SnackbarHost(hostState = snackBarHost) }
|
||||
) { innerPadding ->
|
||||
// confirmation dialog
|
||||
if (showConfirmDialog && zipUri != null) {
|
||||
val moduleName = getFileName(context, zipUri!!)
|
||||
|
||||
AlertDialog(
|
||||
onDismissRequest = { showConfirmDialog = false },
|
||||
confirmButton = {
|
||||
TextButton(onClick = {
|
||||
showConfirmDialog = false
|
||||
navigator.navigate(FlashScreenDestination(FlashIt.FlashModule(zipUri!!)))
|
||||
|
||||
viewModel.markNeedRefresh()
|
||||
}) {
|
||||
Text(stringResource(R.string.confirm))
|
||||
}
|
||||
},
|
||||
dismissButton = {
|
||||
TextButton(onClick = { showConfirmDialog = false }) {
|
||||
Text(stringResource(android.R.string.cancel))
|
||||
}
|
||||
},
|
||||
title = { Text(stringResource(R.string.module)) },
|
||||
text = {
|
||||
Text(
|
||||
stringResource(R.string.module_install_prompt_with_name, moduleName)
|
||||
)
|
||||
}
|
||||
)
|
||||
}
|
||||
|
||||
|
||||
when {
|
||||
hasMagisk -> {
|
||||
@@ -291,7 +288,7 @@ fun ModuleScreen(navigator: DestinationsNavigator) {
|
||||
modifier = Modifier.nestedScroll(scrollBehavior.nestedScrollConnection),
|
||||
boxModifier = Modifier.padding(innerPadding),
|
||||
onInstallModule = {
|
||||
navigator.navigate(FlashScreenDestination(FlashIt.FlashModule(it)))
|
||||
navigator.navigate(FlashScreenDestination(FlashIt.FlashModules(listOf(it))))
|
||||
},
|
||||
onClickModule = { id, name, hasWebUi ->
|
||||
if (hasWebUi) {
|
||||
@@ -343,6 +340,16 @@ private fun ModuleList(
|
||||
val startDownloadingText = stringResource(R.string.module_start_downloading)
|
||||
val fetchChangeLogFailed = stringResource(R.string.module_changelog_failed)
|
||||
|
||||
val prefs = context.getSharedPreferences("settings", Context.MODE_PRIVATE)
|
||||
|
||||
val hasShownWarning = rememberSaveable { mutableStateOf(prefs.getBoolean("has_shown_warning", false)) }
|
||||
|
||||
var useOverlayFs by rememberSaveable {
|
||||
mutableStateOf(
|
||||
prefs.getBoolean("use_overlay_fs", false)
|
||||
)
|
||||
}
|
||||
|
||||
val loadingDialog = rememberLoadingDialog()
|
||||
val confirmDialog = rememberConfirmDialog()
|
||||
|
||||
@@ -355,7 +362,7 @@ private fun ModuleList(
|
||||
val changelogResult = loadingDialog.withLoading {
|
||||
withContext(Dispatchers.IO) {
|
||||
runCatching {
|
||||
OkHttpClient().newCall(
|
||||
ksuApp.okhttpClient.newCall(
|
||||
okhttp3.Request.Builder().url(changelogUrl).build()
|
||||
).execute().body!!.string()
|
||||
}
|
||||
@@ -497,14 +504,14 @@ private fun ModuleList(
|
||||
},
|
||||
) {
|
||||
when {
|
||||
!viewModel.isOverlayAvailable -> {
|
||||
useOverlayFs && !viewModel.isOverlayAvailable -> {
|
||||
item {
|
||||
Box(
|
||||
modifier = Modifier.fillParentMaxSize(),
|
||||
contentAlignment = Alignment.Center
|
||||
) {
|
||||
Text(
|
||||
stringResource(R.string.module_overlay_fs_not_available),
|
||||
text = stringResource(R.string.module_overlay_fs_not_available),
|
||||
textAlign = TextAlign.Center
|
||||
)
|
||||
}
|
||||
@@ -527,7 +534,6 @@ private fun ModuleList(
|
||||
|
||||
else -> {
|
||||
items(viewModel.moduleList) { module ->
|
||||
var isChecked by rememberSaveable(module) { mutableStateOf(module.enabled) }
|
||||
val scope = rememberCoroutineScope()
|
||||
val updatedModule by produceState(initialValue = Triple("", "", "")) {
|
||||
scope.launch(Dispatchers.IO) {
|
||||
@@ -538,7 +544,6 @@ private fun ModuleList(
|
||||
ModuleItem(
|
||||
navigator = navigator,
|
||||
module = module,
|
||||
isChecked = isChecked,
|
||||
updateUrl = updatedModule.first,
|
||||
onUninstall = {
|
||||
scope.launch { onModuleUninstall(module) }
|
||||
@@ -550,11 +555,10 @@ private fun ModuleList(
|
||||
scope.launch {
|
||||
val success = loadingDialog.withLoading {
|
||||
withContext(Dispatchers.IO) {
|
||||
toggleModule(module.dirId, !isChecked)
|
||||
toggleModule(module.dirId, !module.enabled)
|
||||
}
|
||||
}
|
||||
if (success) {
|
||||
isChecked = it
|
||||
viewModel.fetchModuleList()
|
||||
|
||||
val result = snackBarHost.showSnackbar(
|
||||
@@ -566,7 +570,7 @@ private fun ModuleList(
|
||||
reboot()
|
||||
}
|
||||
} else {
|
||||
val message = if (isChecked) failedDisable else failedEnable
|
||||
val message = if (module.enabled) failedDisable else failedEnable
|
||||
snackBarHost.showSnackbar(message.format(module.name))
|
||||
}
|
||||
}
|
||||
@@ -602,7 +606,6 @@ private fun ModuleList(
|
||||
fun ModuleItem(
|
||||
navigator: DestinationsNavigator,
|
||||
module: ModuleViewModel.ModuleInfo,
|
||||
isChecked: Boolean,
|
||||
updateUrl: String,
|
||||
onUninstall: (ModuleViewModel.ModuleInfo) -> Unit,
|
||||
onRestore: (ModuleViewModel.ModuleInfo) -> Unit,
|
||||
@@ -617,22 +620,22 @@ fun ModuleItem(
|
||||
val interactionSource = remember { MutableInteractionSource() }
|
||||
val indication = LocalIndication.current
|
||||
val viewModel = viewModel<ModuleViewModel>()
|
||||
|
||||
val context = LocalContext.current
|
||||
val prefs = context.getSharedPreferences("settings", Context.MODE_PRIVATE)
|
||||
|
||||
var developerOptionsEnabled by rememberSaveable {
|
||||
mutableStateOf(
|
||||
prefs.getBoolean("enable_developer_options", false)
|
||||
)
|
||||
}
|
||||
|
||||
LaunchedEffect(Unit) {
|
||||
developerOptionsEnabled = prefs.getBoolean("enable_developer_options", false)
|
||||
}
|
||||
|
||||
Column(
|
||||
modifier = Modifier
|
||||
.run {
|
||||
if (module.hasWebUi) {
|
||||
toggleable(
|
||||
value = isChecked,
|
||||
interactionSource = interactionSource,
|
||||
role = Role.Button,
|
||||
indication = indication,
|
||||
onValueChange = { onClick(module) }
|
||||
)
|
||||
} else {
|
||||
this
|
||||
}
|
||||
}
|
||||
.padding(22.dp, 18.dp, 22.dp, 12.dp)
|
||||
) {
|
||||
Row(
|
||||
@@ -641,6 +644,10 @@ fun ModuleItem(
|
||||
) {
|
||||
val moduleVersion = stringResource(id = R.string.module_version)
|
||||
val moduleAuthor = stringResource(id = R.string.module_author)
|
||||
val moduleId = stringResource(id = R.string.module_id)
|
||||
val moduleVersionCode = stringResource(id = R.string.module_version_code)
|
||||
val moduleUpdateJson = stringResource(id = R.string.module_update_json)
|
||||
val moduleUpdateJsonEmpty = stringResource(id = R.string.module_update_json_empty)
|
||||
|
||||
Column(
|
||||
modifier = Modifier.fillMaxWidth(0.8f)
|
||||
@@ -669,6 +676,33 @@ fun ModuleItem(
|
||||
fontFamily = MaterialTheme.typography.bodySmall.fontFamily,
|
||||
textDecoration = textDecoration
|
||||
)
|
||||
|
||||
if (developerOptionsEnabled) {
|
||||
|
||||
Text(
|
||||
text = "$moduleId: ${module.id}",
|
||||
fontSize = MaterialTheme.typography.bodySmall.fontSize,
|
||||
lineHeight = MaterialTheme.typography.bodySmall.lineHeight,
|
||||
fontFamily = MaterialTheme.typography.bodySmall.fontFamily,
|
||||
textDecoration = textDecoration
|
||||
)
|
||||
|
||||
Text(
|
||||
text = "$moduleVersionCode: ${module.versionCode}",
|
||||
fontSize = MaterialTheme.typography.bodySmall.fontSize,
|
||||
lineHeight = MaterialTheme.typography.bodySmall.lineHeight,
|
||||
fontFamily = MaterialTheme.typography.bodySmall.fontFamily,
|
||||
textDecoration = textDecoration
|
||||
)
|
||||
|
||||
Text(
|
||||
text = if (module.updateJson.isNotEmpty()) "$moduleUpdateJson: ${module.updateJson}" else "$moduleUpdateJson: $moduleUpdateJsonEmpty",
|
||||
fontSize = MaterialTheme.typography.bodySmall.fontSize,
|
||||
lineHeight = MaterialTheme.typography.bodySmall.lineHeight,
|
||||
fontFamily = MaterialTheme.typography.bodySmall.fontFamily,
|
||||
textDecoration = textDecoration
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
Spacer(modifier = Modifier.weight(1f))
|
||||
@@ -679,7 +713,7 @@ fun ModuleItem(
|
||||
) {
|
||||
Switch(
|
||||
enabled = !module.update,
|
||||
checked = isChecked,
|
||||
checked = module.enabled,
|
||||
onCheckedChange = onCheckChanged,
|
||||
interactionSource = if (!module.hasWebUi) interactionSource else null
|
||||
)
|
||||
@@ -712,6 +746,7 @@ fun ModuleItem(
|
||||
if (module.hasActionScript) {
|
||||
FilledTonalButton(
|
||||
modifier = Modifier.defaultMinSize(52.dp, 32.dp),
|
||||
enabled = !module.remove && module.enabled,
|
||||
onClick = {
|
||||
navigator.navigate(ExecuteModuleActionScreenDestination(module.dirId))
|
||||
viewModel.markNeedRefresh()
|
||||
@@ -739,6 +774,7 @@ fun ModuleItem(
|
||||
if (module.hasWebUi) {
|
||||
FilledTonalButton(
|
||||
modifier = Modifier.defaultMinSize(52.dp, 32.dp),
|
||||
enabled = !module.remove && module.enabled,
|
||||
onClick = { onClick(module) },
|
||||
interactionSource = interactionSource,
|
||||
contentPadding = ButtonDefaults.TextButtonContentPadding
|
||||
@@ -764,6 +800,7 @@ fun ModuleItem(
|
||||
if (updateUrl.isNotEmpty()) {
|
||||
Button(
|
||||
modifier = Modifier.defaultMinSize(52.dp, 32.dp),
|
||||
enabled = !module.remove,
|
||||
onClick = { onUpdate(module) },
|
||||
shape = ButtonDefaults.textShape,
|
||||
contentPadding = ButtonDefaults.TextButtonContentPadding
|
||||
@@ -818,7 +855,7 @@ fun ModuleItem(
|
||||
imageVector = Icons.Outlined.Delete,
|
||||
contentDescription = null
|
||||
)
|
||||
if (!module.hasActionScript && !module.hasWebUi && updateUrl.isEmpty()) {
|
||||
if (!module.hasActionScript && !module.hasWebUi && updateUrl.isEmpty()) {
|
||||
Text(
|
||||
modifier = Modifier.padding(start = 7.dp),
|
||||
fontFamily = MaterialTheme.typography.labelMedium.fontFamily,
|
||||
@@ -851,5 +888,5 @@ fun ModuleItemPreview() {
|
||||
hasActionScript = false,
|
||||
dirId = "dirId"
|
||||
)
|
||||
ModuleItem(EmptyDestinationsNavigator, module, true, "", {}, {}, {}, {}, {})
|
||||
}
|
||||
ModuleItem(EmptyDestinationsNavigator, module, "", {}, {}, {}, {}, {})
|
||||
}
|
||||
|
||||
@@ -63,6 +63,7 @@ import com.ramcosta.composedestinations.annotation.Destination
|
||||
import com.ramcosta.composedestinations.annotation.RootGraph
|
||||
import com.ramcosta.composedestinations.generated.destinations.AppProfileTemplateScreenDestination
|
||||
import com.ramcosta.composedestinations.generated.destinations.FlashScreenDestination
|
||||
import com.ramcosta.composedestinations.generated.destinations.BackupRestoreScreenDestination
|
||||
import com.ramcosta.composedestinations.navigation.DestinationsNavigator
|
||||
import com.ramcosta.composedestinations.navigation.EmptyDestinationsNavigator
|
||||
import kotlinx.coroutines.Dispatchers
|
||||
@@ -113,8 +114,6 @@ fun SettingScreen(navigator: DestinationsNavigator) {
|
||||
}
|
||||
val loadingDialog = rememberLoadingDialog()
|
||||
val shrinkDialog = rememberConfirmDialog()
|
||||
val restoreDialog = rememberConfirmDialog()
|
||||
val backupDialog = rememberConfirmDialog()
|
||||
|
||||
Column(
|
||||
modifier = Modifier
|
||||
@@ -159,10 +158,11 @@ fun SettingScreen(navigator: DestinationsNavigator) {
|
||||
}
|
||||
if (ksuVersion != null) {
|
||||
SwitchItem(
|
||||
icon = Icons.Filled.RemoveModerator,
|
||||
icon = Icons.Filled.FolderDelete,
|
||||
title = stringResource(id = R.string.settings_umount_modules_default),
|
||||
summary = stringResource(id = R.string.settings_umount_modules_default_summary),
|
||||
checked = umountChecked
|
||||
|
||||
) {
|
||||
if (Natives.setDefaultUmountModules(it)) {
|
||||
umountChecked = it
|
||||
@@ -170,8 +170,54 @@ fun SettingScreen(navigator: DestinationsNavigator) {
|
||||
}
|
||||
}
|
||||
|
||||
if (Natives.version >= Natives.MINIMAL_SUPPORTED_SU_COMPAT) {
|
||||
var isSuDisabled by rememberSaveable {
|
||||
mutableStateOf(!Natives.isSuEnabled())
|
||||
}
|
||||
SwitchItem(
|
||||
icon = Icons.Filled.RemoveModerator,
|
||||
title = stringResource(id = R.string.settings_disable_su),
|
||||
summary = stringResource(id = R.string.settings_disable_su_summary),
|
||||
checked = isSuDisabled
|
||||
) { checked ->
|
||||
val shouldEnable = !checked
|
||||
if (Natives.setSuEnabled(shouldEnable)) {
|
||||
isSuDisabled = !shouldEnable
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
val prefs = context.getSharedPreferences("settings", Context.MODE_PRIVATE)
|
||||
|
||||
val suSFS = getSuSFS()
|
||||
val isSUS_SU = getSuSFSFeatures()
|
||||
if (suSFS == "Supported") {
|
||||
if (isSUS_SU == "CONFIG_KSU_SUSFS_SUS_SU") {
|
||||
var isEnabled by rememberSaveable {
|
||||
mutableStateOf(susfsSUS_SU_Mode() == "2")
|
||||
}
|
||||
|
||||
LaunchedEffect(Unit) {
|
||||
isEnabled = susfsSUS_SU_Mode() == "2"
|
||||
}
|
||||
|
||||
SwitchItem(
|
||||
icon = Icons.Filled.VisibilityOff,
|
||||
title = stringResource(id = R.string.settings_susfs_toggle),
|
||||
summary = stringResource(id = R.string.settings_susfs_toggle_summary),
|
||||
checked = isEnabled
|
||||
) {
|
||||
if (it) {
|
||||
susfsSUS_SU_2()
|
||||
} else {
|
||||
susfsSUS_SU_0()
|
||||
}
|
||||
prefs.edit().putBoolean("enable_sus_su", it).apply()
|
||||
isEnabled = it
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
val hasShownWarning = rememberSaveable { mutableStateOf(prefs.getBoolean("has_shown_warning", false)) }
|
||||
|
||||
var useOverlayFs by rememberSaveable {
|
||||
@@ -271,7 +317,7 @@ fun SettingScreen(navigator: DestinationsNavigator) {
|
||||
)
|
||||
}
|
||||
SwitchItem(
|
||||
icon = Icons.Filled.DeveloperMode,
|
||||
icon = Icons.Filled.Web,
|
||||
title = stringResource(id = R.string.enable_web_debugging),
|
||||
summary = stringResource(id = R.string.enable_web_debugging_summary),
|
||||
checked = enableWebDebugging
|
||||
@@ -280,16 +326,33 @@ fun SettingScreen(navigator: DestinationsNavigator) {
|
||||
enableWebDebugging = it
|
||||
}
|
||||
|
||||
var developerOptionsEnabled by rememberSaveable {
|
||||
mutableStateOf(
|
||||
prefs.getBoolean("enable_developer_options", false)
|
||||
)
|
||||
}
|
||||
if (ksuVersion != null) {
|
||||
SwitchItem(
|
||||
icon = Icons.Filled.DeveloperMode,
|
||||
title = stringResource(id = R.string.enable_developer_options),
|
||||
summary = stringResource(id = R.string.enable_developer_options_summary),
|
||||
checked = developerOptionsEnabled
|
||||
) {
|
||||
prefs.edit().putBoolean("enable_developer_options", it).apply()
|
||||
developerOptionsEnabled = it
|
||||
}
|
||||
}
|
||||
|
||||
var showBottomsheet by remember { mutableStateOf(false) }
|
||||
|
||||
ListItem(
|
||||
leadingContent = {
|
||||
Icon(
|
||||
Icons.Filled.BugReport,
|
||||
stringResource(id = R.string.send_log)
|
||||
stringResource(id = R.string.export_log)
|
||||
)
|
||||
},
|
||||
headlineContent = { Text(stringResource(id = R.string.send_log)) },
|
||||
headlineContent = { Text(stringResource(id = R.string.export_log)) },
|
||||
modifier = Modifier.clickable {
|
||||
showBottomsheet = true
|
||||
}
|
||||
@@ -311,7 +374,7 @@ fun SettingScreen(navigator: DestinationsNavigator) {
|
||||
.clickable {
|
||||
val formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd_HH_mm")
|
||||
val current = LocalDateTime.now().format(formatter)
|
||||
exportBugreportLauncher.launch("KernelSU_bugreport_${current}.tar.gz")
|
||||
exportBugreportLauncher.launch("KernelSU_Next_bugreport_${current}.tar.gz")
|
||||
showBottomsheet = false
|
||||
}
|
||||
) {
|
||||
@@ -390,50 +453,17 @@ fun SettingScreen(navigator: DestinationsNavigator) {
|
||||
}
|
||||
|
||||
if (ksuVersion != null) {
|
||||
val moduleBackup = stringResource(id = R.string.module_backup)
|
||||
val backupMessage = stringResource(id = R.string.module_backup_message)
|
||||
val backupRestore = stringResource(id = R.string.backup_restore)
|
||||
ListItem(
|
||||
leadingContent = {
|
||||
Icon(
|
||||
Icons.Filled.Backup,
|
||||
moduleBackup
|
||||
backupRestore
|
||||
)
|
||||
},
|
||||
headlineContent = { Text(moduleBackup) },
|
||||
headlineContent = { Text(backupRestore) },
|
||||
modifier = Modifier.clickable {
|
||||
scope.launch {
|
||||
val result = backupDialog.awaitConfirm(title = moduleBackup, content = backupMessage)
|
||||
if (result == ConfirmResult.Confirmed) {
|
||||
loadingDialog.withLoading {
|
||||
moduleBackup()
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
)
|
||||
}
|
||||
|
||||
if (ksuVersion != null) {
|
||||
val moduleRestore = stringResource(id = R.string.module_restore)
|
||||
val restoreMessage = stringResource(id = R.string.module_restore_message)
|
||||
ListItem(
|
||||
leadingContent = {
|
||||
Icon(
|
||||
Icons.Filled.Restore,
|
||||
moduleRestore
|
||||
)
|
||||
},
|
||||
headlineContent = { Text(moduleRestore) },
|
||||
modifier = Modifier.clickable {
|
||||
scope.launch {
|
||||
val result = restoreDialog.awaitConfirm(title = moduleRestore, content = restoreMessage)
|
||||
if (result == ConfirmResult.Confirmed) {
|
||||
loadingDialog.withLoading {
|
||||
moduleRestore()
|
||||
showRebootDialog = true
|
||||
}
|
||||
}
|
||||
}
|
||||
navigator.navigate(BackupRestoreScreenDestination)
|
||||
}
|
||||
)
|
||||
}
|
||||
@@ -605,4 +635,4 @@ private fun TopBar(
|
||||
@Composable
|
||||
private fun SettingsPreview() {
|
||||
SettingScreen(EmptyDestinationsNavigator)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -11,6 +11,7 @@ import android.os.Environment
|
||||
import androidx.compose.runtime.Composable
|
||||
import androidx.compose.runtime.DisposableEffect
|
||||
import androidx.core.content.ContextCompat
|
||||
import com.rifsxd.ksunext.ksuApp
|
||||
import com.rifsxd.ksunext.ui.util.module.LatestVersionInfo
|
||||
|
||||
/**
|
||||
@@ -63,11 +64,11 @@ fun download(
|
||||
|
||||
fun checkNewVersion(): LatestVersionInfo {
|
||||
// Next version updates
|
||||
val url = "https://api.github.com/repos/rifsxd/KernelSU-Next/releases/latest"
|
||||
val url = "https://api.github.com/repos/KernelSU-Next/KernelSU-Next/releases/latest"
|
||||
// default null value if failed
|
||||
val defaultValue = LatestVersionInfo()
|
||||
runCatching {
|
||||
okhttp3.OkHttpClient().newCall(okhttp3.Request.Builder().url(url).build()).execute()
|
||||
ksuApp.okhttpClient.newCall(okhttp3.Request.Builder().url(url).build()).execute()
|
||||
.use { response ->
|
||||
if (!response.isSuccessful) {
|
||||
return defaultValue
|
||||
|
||||
@@ -49,6 +49,11 @@ fun getKsuDaemonPath(): String {
|
||||
}
|
||||
}
|
||||
|
||||
data class FlashResult(val code: Int, val err: String, val showReboot: Boolean) {
|
||||
constructor(result: Shell.Result, showReboot: Boolean) : this(result.code, result.err.joinToString("\n"), showReboot)
|
||||
constructor(result: Shell.Result) : this(result, result.isSuccess)
|
||||
}
|
||||
|
||||
object KsuCli {
|
||||
val SHELL: Shell = createRootShell()
|
||||
val GLOBAL_MNT_SHELL: Shell = createRootShell(true)
|
||||
@@ -190,10 +195,9 @@ private fun flashWithIO(
|
||||
|
||||
fun flashModule(
|
||||
uri: Uri,
|
||||
onFinish: (Boolean, Int) -> Unit,
|
||||
onStdout: (String) -> Unit,
|
||||
onStderr: (String) -> Unit
|
||||
): Boolean {
|
||||
): FlashResult {
|
||||
val resolver = ksuApp.contentResolver
|
||||
with(resolver.openInputStream(uri)) {
|
||||
val file = File(ksuApp.cacheDir, "module.zip")
|
||||
@@ -206,15 +210,14 @@ fun flashModule(
|
||||
|
||||
file.delete()
|
||||
|
||||
onFinish(result.isSuccess, result.code)
|
||||
return result.isSuccess
|
||||
return FlashResult(result)
|
||||
}
|
||||
}
|
||||
|
||||
fun runModuleAction(
|
||||
moduleId: String, onStdout: (String) -> Unit, onStderr: (String) -> Unit
|
||||
): Boolean {
|
||||
val shell = getRootShell()
|
||||
val shell = createRootShell(true)
|
||||
|
||||
val stdoutCallback: CallbackList<String?> = object : CallbackList<String?>() {
|
||||
override fun onAddElement(s: String?) {
|
||||
@@ -236,21 +239,19 @@ fun runModuleAction(
|
||||
}
|
||||
|
||||
fun restoreBoot(
|
||||
onFinish: (Boolean, Int) -> Unit, onStdout: (String) -> Unit, onStderr: (String) -> Unit
|
||||
): Boolean {
|
||||
onStdout: (String) -> Unit, onStderr: (String) -> Unit
|
||||
): FlashResult {
|
||||
val magiskboot = File(ksuApp.applicationInfo.nativeLibraryDir, "libmagiskboot.so")
|
||||
val result = flashWithIO("${getKsuDaemonPath()} boot-restore -f --magiskboot $magiskboot", onStdout, onStderr)
|
||||
onFinish(result.isSuccess, result.code)
|
||||
return result.isSuccess
|
||||
return FlashResult(result)
|
||||
}
|
||||
|
||||
fun uninstallPermanently(
|
||||
onFinish: (Boolean, Int) -> Unit, onStdout: (String) -> Unit, onStderr: (String) -> Unit
|
||||
): Boolean {
|
||||
onStdout: (String) -> Unit, onStderr: (String) -> Unit
|
||||
): FlashResult {
|
||||
val magiskboot = File(ksuApp.applicationInfo.nativeLibraryDir, "libmagiskboot.so")
|
||||
val result = flashWithIO("${getKsuDaemonPath()} uninstall --magiskboot $magiskboot", onStdout, onStderr)
|
||||
onFinish(result.isSuccess, result.code)
|
||||
return result.isSuccess
|
||||
return FlashResult(result)
|
||||
}
|
||||
|
||||
suspend fun shrinkModules(): Boolean = withContext(Dispatchers.IO) {
|
||||
@@ -268,10 +269,9 @@ fun installBoot(
|
||||
bootUri: Uri?,
|
||||
lkm: LkmSelection,
|
||||
ota: Boolean,
|
||||
onFinish: (Boolean, Int) -> Unit,
|
||||
onStdout: (String) -> Unit,
|
||||
onStderr: (String) -> Unit,
|
||||
): Boolean {
|
||||
): FlashResult {
|
||||
val resolver = ksuApp.contentResolver
|
||||
|
||||
val bootFile = bootUri?.let { uri ->
|
||||
@@ -334,15 +334,14 @@ fun installBoot(
|
||||
lkmFile?.delete()
|
||||
|
||||
// if boot uri is empty, it is direct install, when success, we should show reboot button
|
||||
onFinish(bootUri == null && result.isSuccess, result.code)
|
||||
return result.isSuccess
|
||||
return FlashResult(result, bootUri == null && result.isSuccess)
|
||||
}
|
||||
|
||||
fun reboot(reason: String = "") {
|
||||
val shell = getRootShell()
|
||||
if (reason == "recovery") {
|
||||
// KEYCODE_POWER = 26, hide incorrect "Factory data reset" message
|
||||
ShellUtils.fastCmd(shell, "/system/bin/input keyevent 26")
|
||||
ShellUtils.fastCmd(shell, "/system/bin/reboot $reason")
|
||||
}
|
||||
ShellUtils.fastCmd(shell, "/system/bin/svc power reboot $reason || /system/bin/reboot $reason")
|
||||
}
|
||||
@@ -503,6 +502,104 @@ fun moduleRestore(): Boolean {
|
||||
return result.isEmpty()
|
||||
}
|
||||
|
||||
fun allowlistBackupDir(): String? {
|
||||
val shell = getRootShell()
|
||||
val baseBackupDir = "/data/adb/allowlist_bak"
|
||||
val resultBase = ShellUtils.fastCmd(shell, "mkdir -p $baseBackupDir").trim()
|
||||
if (resultBase.isNotEmpty()) return null
|
||||
|
||||
val timestamp = ShellUtils.fastCmd(shell, "date +%Y%m%d_%H%M%S").trim()
|
||||
if (timestamp.isEmpty()) return null
|
||||
|
||||
val newBackupDir = "$baseBackupDir/$timestamp"
|
||||
val resultNewDir = ShellUtils.fastCmd(shell, "mkdir -p $newBackupDir").trim()
|
||||
|
||||
if (resultNewDir.isEmpty()) return newBackupDir
|
||||
return null
|
||||
}
|
||||
|
||||
fun allowlistBackup(): Boolean {
|
||||
val shell = getRootShell()
|
||||
|
||||
val checkEmptyCommand = "if [ -z \"$(ls -A /data/adb/ksu/.allowlist)\" ]; then echo 'empty'; fi"
|
||||
val resultCheckEmpty = ShellUtils.fastCmd(shell, checkEmptyCommand).trim()
|
||||
|
||||
if (resultCheckEmpty == "empty") {
|
||||
return false
|
||||
}
|
||||
|
||||
val backupDir = allowlistBackupDir() ?: return false
|
||||
val command = "cp -rp /data/adb/ksu/.allowlist $backupDir"
|
||||
val result = ShellUtils.fastCmd(shell, command).trim()
|
||||
|
||||
return result.isEmpty()
|
||||
}
|
||||
|
||||
fun allowlistRestore(): Boolean {
|
||||
val shell = getRootShell()
|
||||
|
||||
val command = "ls -t /data/adb/allowlist_bak | head -n 1"
|
||||
val latestBackupDir = ShellUtils.fastCmd(shell, command).trim()
|
||||
|
||||
if (latestBackupDir.isEmpty()) return false
|
||||
|
||||
val sourceDir = "/data/adb/allowlist_bak/$latestBackupDir"
|
||||
val destinationDir = "/data/adb/ksu/"
|
||||
|
||||
val createDestDirCommand = "mkdir -p $destinationDir"
|
||||
ShellUtils.fastCmd(shell, createDestDirCommand)
|
||||
|
||||
val moveCommand = "cp -rp $sourceDir/.allowlist $destinationDir"
|
||||
val result = ShellUtils.fastCmd(shell, moveCommand).trim()
|
||||
|
||||
return result.isEmpty()
|
||||
}
|
||||
|
||||
private fun getSuSFSDaemonPath(): String {
|
||||
return ksuApp.applicationInfo.nativeLibraryDir + File.separator + "libsusfsd.so"
|
||||
}
|
||||
|
||||
fun getSuSFS(): String {
|
||||
val shell = getRootShell()
|
||||
val result = ShellUtils.fastCmd(shell, "${getSuSFSDaemonPath()} support")
|
||||
return result
|
||||
}
|
||||
|
||||
fun getSuSFSVersion(): String {
|
||||
val shell = getRootShell()
|
||||
val result = ShellUtils.fastCmd(shell, "${getSuSFSDaemonPath()} version")
|
||||
return result
|
||||
}
|
||||
|
||||
fun getSuSFSVariant(): String {
|
||||
val shell = getRootShell()
|
||||
val result = ShellUtils.fastCmd(shell, "${getSuSFSDaemonPath()} variant")
|
||||
return result
|
||||
}
|
||||
fun getSuSFSFeatures(): String {
|
||||
val shell = getRootShell()
|
||||
val result = ShellUtils.fastCmd(shell, "${getSuSFSDaemonPath()} features")
|
||||
return result
|
||||
}
|
||||
|
||||
fun susfsSUS_SU_0(): String {
|
||||
val shell = getRootShell()
|
||||
val result = ShellUtils.fastCmd(shell, "${getSuSFSDaemonPath()} sus_su 0")
|
||||
return result
|
||||
}
|
||||
|
||||
fun susfsSUS_SU_2(): String {
|
||||
val shell = getRootShell()
|
||||
val result = ShellUtils.fastCmd(shell, "${getSuSFSDaemonPath()} sus_su 2")
|
||||
return result
|
||||
}
|
||||
|
||||
fun susfsSUS_SU_Mode(): String {
|
||||
val shell = getRootShell()
|
||||
val result = ShellUtils.fastCmd(shell, "${getSuSFSDaemonPath()} sus_su mode")
|
||||
return result
|
||||
}
|
||||
|
||||
fun setAppProfileTemplate(id: String, template: String): Boolean {
|
||||
val shell = getRootShell()
|
||||
val escapedTemplate = template.replace("\"", "\\\"")
|
||||
|
||||
@@ -101,7 +101,7 @@ fun getBugreportFile(context: Context): File {
|
||||
val formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd_HH_mm")
|
||||
val current = LocalDateTime.now().format(formatter)
|
||||
|
||||
val targetFile = File(context.cacheDir, "KernelSU_bugreport_${current}.tar.gz")
|
||||
val targetFile = File(context.cacheDir, "KernelSU_Next_bugreport_${current}.tar.gz")
|
||||
|
||||
shell.newJob().add("tar czf ${targetFile.absolutePath} -C ${bugreportDir.absolutePath} .").exec()
|
||||
shell.newJob().add("rm -rf ${bugreportDir.absolutePath}").exec()
|
||||
|
||||
@@ -7,15 +7,13 @@ import com.rifsxd.ksunext.R
|
||||
|
||||
@Composable
|
||||
fun getSELinuxStatus(): String {
|
||||
val shell = Shell.Builder.create()
|
||||
.setFlags(Shell.FLAG_REDIRECT_STDERR)
|
||||
.build("sh")
|
||||
|
||||
val shell = Shell.getShell() // Get the default shell instance
|
||||
val list = ArrayList<String>()
|
||||
val result = shell.use {
|
||||
it.newJob().add("getenforce").to(list, list).exec()
|
||||
}
|
||||
val output = result.out.joinToString("\n").trim()
|
||||
val result = shell.newJob()
|
||||
.add("getenforce")
|
||||
.to(list, list)
|
||||
.exec()
|
||||
val output = list.joinToString("\n").trim()
|
||||
|
||||
if (result.isSuccess) {
|
||||
return when (output) {
|
||||
|
||||
@@ -10,6 +10,10 @@ import androidx.lifecycle.ViewModel
|
||||
import androidx.lifecycle.viewModelScope
|
||||
import kotlinx.coroutines.Dispatchers
|
||||
import kotlinx.coroutines.launch
|
||||
import java.text.Collator
|
||||
import java.util.Locale
|
||||
import com.rifsxd.ksunext.ksuApp
|
||||
import com.rifsxd.ksunext.ui.util.HanziToPinyin
|
||||
import com.rifsxd.ksunext.ui.util.listModules
|
||||
import com.rifsxd.ksunext.ui.util.overlayFsAvailable
|
||||
import org.json.JSONArray
|
||||
@@ -51,6 +55,8 @@ class ModuleViewModel : ViewModel() {
|
||||
var isRefreshing by mutableStateOf(false)
|
||||
private set
|
||||
|
||||
var search by mutableStateOf("")
|
||||
|
||||
var sortAToZ by mutableStateOf(false)
|
||||
var sortZToA by mutableStateOf(false)
|
||||
|
||||
@@ -59,8 +65,13 @@ class ModuleViewModel : ViewModel() {
|
||||
sortAToZ -> compareBy<ModuleInfo> { it.name.lowercase() }
|
||||
sortZToA -> compareByDescending<ModuleInfo> { it.name.lowercase() }
|
||||
else -> compareBy<ModuleInfo> { it.dirId }
|
||||
}
|
||||
modules.sortedWith(comparator).also {
|
||||
}.thenBy(Collator.getInstance(Locale.getDefault()), ModuleInfo::id)
|
||||
|
||||
modules.filter {
|
||||
it.id.contains(search, ignoreCase = true) ||
|
||||
it.name.contains(search, ignoreCase = true) ||
|
||||
HanziToPinyin.getInstance().toPinyinString(it.name).contains(search, ignoreCase = true)
|
||||
}.sortedWith(comparator).also {
|
||||
isRefreshing = false
|
||||
}
|
||||
}
|
||||
@@ -83,7 +94,7 @@ class ModuleViewModel : ViewModel() {
|
||||
|
||||
kotlin.runCatching {
|
||||
isOverlayAvailable = overlayFsAvailable()
|
||||
|
||||
|
||||
val result = listModules()
|
||||
|
||||
Log.i(TAG, "result: $result")
|
||||
@@ -134,11 +145,8 @@ class ModuleViewModel : ViewModel() {
|
||||
val result = kotlin.runCatching {
|
||||
val url = m.updateJson
|
||||
Log.i(TAG, "checkUpdate url: $url")
|
||||
val response = okhttp3.OkHttpClient()
|
||||
.newCall(
|
||||
okhttp3.Request.Builder()
|
||||
.url(url)
|
||||
.build()
|
||||
val response = ksuApp.okhttpClient.newCall(
|
||||
okhttp3.Request.Builder().url(url).build()
|
||||
).execute()
|
||||
Log.d(TAG, "checkUpdate code: ${response.code}")
|
||||
if (response.isSuccessful) {
|
||||
@@ -167,4 +175,4 @@ class ModuleViewModel : ViewModel() {
|
||||
|
||||
return Triple(zipUrl, version, changelog)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -11,18 +11,17 @@ import kotlinx.coroutines.Dispatchers
|
||||
import kotlinx.coroutines.withContext
|
||||
import kotlinx.parcelize.Parcelize
|
||||
import com.rifsxd.ksunext.Natives
|
||||
import com.rifsxd.ksunext.ksuApp
|
||||
import com.rifsxd.ksunext.profile.Capabilities
|
||||
import com.rifsxd.ksunext.profile.Groups
|
||||
import com.rifsxd.ksunext.ui.util.getAppProfileTemplate
|
||||
import com.rifsxd.ksunext.ui.util.listAppProfileTemplates
|
||||
import com.rifsxd.ksunext.ui.util.setAppProfileTemplate
|
||||
import okhttp3.OkHttpClient
|
||||
import okhttp3.Request
|
||||
import org.json.JSONArray
|
||||
import org.json.JSONObject
|
||||
import java.text.Collator
|
||||
import java.util.Locale
|
||||
import java.util.concurrent.TimeUnit
|
||||
|
||||
|
||||
/**
|
||||
@@ -138,13 +137,7 @@ class TemplateViewModel : ViewModel() {
|
||||
|
||||
private fun fetchRemoteTemplates() {
|
||||
runCatching {
|
||||
val client: OkHttpClient = OkHttpClient.Builder()
|
||||
.connectTimeout(5, TimeUnit.SECONDS)
|
||||
.writeTimeout(5, TimeUnit.SECONDS)
|
||||
.readTimeout(10, TimeUnit.SECONDS)
|
||||
.build()
|
||||
|
||||
client.newCall(
|
||||
ksuApp.okhttpClient.newCall(
|
||||
Request.Builder().url(TEMPLATE_INDEX_URL).build()
|
||||
).execute().use { response ->
|
||||
if (!response.isSuccessful) {
|
||||
@@ -155,7 +148,7 @@ private fun fetchRemoteTemplates() {
|
||||
0.until(remoteTemplateIds.length()).forEach { i ->
|
||||
val id = remoteTemplateIds.getString(i)
|
||||
Log.i(TAG, "fetch template: $id")
|
||||
val templateJson = client.newCall(
|
||||
val templateJson = ksuApp.okhttpClient.newCall(
|
||||
Request.Builder().url(TEMPLATE_URL.format(id)).build()
|
||||
).runCatching {
|
||||
execute().use { response ->
|
||||
|
||||
1
manager/app/src/main/jniLibs/.gitignore
vendored
1
manager/app/src/main/jniLibs/.gitignore
vendored
@@ -1,2 +1,3 @@
|
||||
libksud_overlayfs.so
|
||||
libksud_magic.so
|
||||
libsusfsd.so
|
||||
9
manager/app/src/main/res/drawable/ic_sus.xml
Normal file
9
manager/app/src/main/res/drawable/ic_sus.xml
Normal file
File diff suppressed because one or more lines are too long
193
manager/app/src/main/res/values-de/strings.xml
Normal file
193
manager/app/src/main/res/values-de/strings.xml
Normal file
@@ -0,0 +1,193 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
<string name="issue_report_title">Haben Sie Probleme?</string>
|
||||
<string name="issue_report_body">Sind Sie auf einen Fehler gestoßen oder haben Sie Feedback??</string>
|
||||
<string name="issue_report_body_2">Melden Sie es so schnell wie möglich!</string>
|
||||
<string name="issue_report_github">Auf GitHub melden</string>
|
||||
<string name="issue_report_telegram">Kontakt über Telegramm</string>
|
||||
<string name="issue_report_github_link">https://github.com/KernelSU-Next/KernelSU-Next/issues</string>
|
||||
<string name="issue_report_telegram_link">https://t.me/ksunext</string>
|
||||
<string name="confirm">Bestätigen</string>
|
||||
<string name="app_name" translatable="false">KernelSU Next</string>
|
||||
<string name="home">Home</string>
|
||||
<string name="home_not_installed">Nicht installiert</string>
|
||||
<string name="home_click_to_install">Zum installieren klicken</string>
|
||||
<string name="home_working">Funktioniert</string>
|
||||
<string name="home_working_version">Version: %d</string>
|
||||
<string name="home_superuser_count">Superusers: %d</string>
|
||||
<string name="home_module_count">Module: %d</string>
|
||||
<string name="home_failure">KernelSU Next v2 Signatur nicht im Kernel gefunden! [ !KSU_NEXT || != size/hash ]</string>
|
||||
<string name="home_failure_tip">Bitten Sie Ihren Kernel-Entwickler, KernelSU Next zu integrieren!</string>
|
||||
<string name="home_kernel">Kernel version</string>
|
||||
<string name="home_susfs">SuSFS: %s</string>
|
||||
<string name="home_susfs_version">SuSFS version</string>
|
||||
<string name="home_susfs_sus_su">SuS SU</string>
|
||||
<string name="home_android">Android version</string>
|
||||
<string name="home_manager_version">Manager version</string>
|
||||
<string name="home_selinux_status">SELinux status</string>
|
||||
<string name="selinux_status_disabled">Deaktiviert</string>
|
||||
<string name="selinux_status_enforcing">Enforcing</string>
|
||||
<string name="selinux_status_permissive">Permissive</string>
|
||||
<string name="selinux_status_unknown">Unbekannt</string>
|
||||
<string name="superuser">Superuser</string>
|
||||
<string name="module_failed_to_enable">Aktivierung des Moduls fehlgeschlagen: %s</string>
|
||||
<string name="module_failed_to_disable">Deaktivierung des Moduls fehlgeschlagen: %s</string>
|
||||
<string name="module_empty">Kein Modul installiert</string>
|
||||
<string name="module">Modul</string>
|
||||
<string name="module_install_prompt_with_name">Das/die folgende(n) Modul(e) wird/werden installiert: %1$s</string>
|
||||
<string name="module_sort_a_to_z">Sortieren (A-Z)</string>
|
||||
<string name="module_sort_z_to_a">Sortieren (Z-A)</string>
|
||||
<string name="uninstall">Deinstallieren</string>
|
||||
<string name="restore">Wiederherstellen</string>
|
||||
<string name="module_install">Installieren</string>
|
||||
<string name="install">Installieren</string>
|
||||
<string name="reboot">Neustart</string>
|
||||
<string name="settings">Einstellungen</string>
|
||||
<string name="reboot_userspace">Weicher Neustart</string>
|
||||
<string name="reboot_recovery">Neustart zur Recovery</string>
|
||||
<string name="reboot_bootloader">Neustart zum Bootloader</string>
|
||||
<string name="reboot_download">Neustart zu Download</string>
|
||||
<string name="reboot_edl">Neustart zu EDL</string>
|
||||
<string name="about">Über</string>
|
||||
<string name="module_uninstall_confirm">Sind Sie sicher, dass Sie das Modul deinstallieren möchten? %s?</string>
|
||||
<string name="module_uninstall_success">%s deinstalliert</string>
|
||||
<string name="module_uninstall_failed">Deinstallierung fehlgeschlagen %s</string>
|
||||
<string name="module_restore_confirm">Sind Sie sicher, dass Sie das Modul wiederherstellen wollen? %s?</string>
|
||||
<string name="module_restore_success">%s wiederhergestekkt</string>
|
||||
<string name="module_restore_failed">Wiederherstellung fehlgeschlagen: %s</string>
|
||||
<string name="module_version">Version</string>
|
||||
<string name="module_author">Autor</string>
|
||||
<string name="module_id">ID</string>
|
||||
<string name="module_version_code">Code</string>
|
||||
<string name="module_update_json">UpdateJson</string>
|
||||
<string name="module_update_json_empty">leer</string>
|
||||
<string name="enable_developer_options">Aktiviere Entwickler-Optionen</string>
|
||||
<string name="enable_developer_options_summary">Versteckte Einstellungen und Debug-Informationen anzeigen, die nur für Entwickler relevant sind.</string>
|
||||
<string name="module_overlay_fs_not_available">Die Module sind nicht verfügbar, da OverlayFS vom Kernel deaktiviert ist.</string>
|
||||
<string name="refresh">Aktualisieren</string>
|
||||
<string name="show_system_apps">zeige system apps</string>
|
||||
<string name="hide_system_apps">verstecke system apps</string>
|
||||
<string name="export_log">Logs exportieren</string>
|
||||
<string name="safe_mode">Abgesicherter Modus</string>
|
||||
<string name="reboot_to_apply">Neustart, um wirksam zu werden</string>
|
||||
<string name="module_magisk_conflict">Die Module sind aufgrund eines Konflikts mit Magisk nicht verfügbar!</string>
|
||||
<string name="home_module_mount">Modul system</string>
|
||||
<string name="home_magic_mount">Magic Mount</string>
|
||||
<string name="home_overlayfs_mount">OverlayFS</string>
|
||||
<string name="unavailable">Nicht verfügbar</string>
|
||||
<string name="use_overlay_fs">OverlayFS verwenden</string>
|
||||
<string name="use_overlay_fs_summary">Schalten Sie zwischen der Verwendung von OverlayFS und Magic Mount für das mount System von KernelSU Next um.</string>
|
||||
<string name="reboot_required">Neustart erforderlich</string>
|
||||
<string name="reboot_message">Die Änderungen werden nach dem Neustart des Systems wirksam. Möchten Sie jetzt neu starten?</string>
|
||||
<string name="module_restore">Wiederherstellen module</string>
|
||||
<string name="module_restore_message">Wiederherstellen von Modulen aus der letzten Sicherung.</string>
|
||||
<string name="backup_restore">Sicherung & Wiederherstellen</string>
|
||||
<string name="module_backup">Sicherung module</string>
|
||||
<string name="module_backup_message">Sicherung der aktuell installierten Module.</string>
|
||||
<string name="allowlist_restore">Wiederherstellen der Zulassen-Liste</string>
|
||||
<string name="allowlist_restore_message">Wiederherstellen der Zulassen-Liste aus dem letzten Backup.</string>
|
||||
<string name="allowlist_backup">Sicherung der Zulassen-Liste</string>
|
||||
<string name="allowlist_backup_message">Sicherung der aktuell konfigurierten Zulassen-Liste.</string>
|
||||
<string name="warning">Warnung</string>
|
||||
<string name="warning_message">diese Funktion befindet sich noch in der Beta-Phase und in der Entwicklung. Bitte stellen Sie sicher, dass Sie Ihre Module sichern, bevor Sie fortfahren. Verwenden Sie diese Funktion nur, wenn Sie sich der möglichen Risiken bewusst sind. Gehen Sie mit Bedacht vor.</string>
|
||||
<string name="proceed">Fortfahren</string>
|
||||
<string name="cancel">Abbruch</string>
|
||||
<string name="later">Später</string>
|
||||
<string name="home_next_kernelsu">🔥 Next build</string>
|
||||
<string name="home_next_kernelsu_repo">https://github.com/KernelSU-Next/KernelSU-Next</string>
|
||||
<string name="home_next_kernelsu_body">Next experimenteller Zweig. Entdecken Sie es auf GitHub!</string>
|
||||
<string name="home_experimental_kernelsu">⚠️ Warnung vor experimenteller Entwicklung!</string>
|
||||
<string name="home_experimental_kernelsu_repo">127.0.0.1</string>
|
||||
<string name="home_experimental_kernelsu_body">KernelSU Next ist eine nicht-offizielle Version, die sich stets in aktiver experimenteller Entwicklung befindet. Sie wird im Ist-Zustand zur Verfügung gestellt, ohne Garantie auf Stabilität, Leistung oder Zuverlässigkeit.</string>
|
||||
<string name="home_experimental_kernelsu_body_point_1"> • Die Verwendung erfolgt auf eigene Gefahr: Abstürze, unerwartetes Verhalten oder Systemprobleme können auftreten.</string>
|
||||
<string name="home_experimental_kernelsu_body_point_2"> • Keine Garantie: Die Entwickler sind nicht verantwortlich für Datenverluste, Systemschäden oder andere Folgen, die sich aus der Nutzung ergeben.</string>
|
||||
<string name="home_experimental_kernelsu_body_point_3"> • Nur zu Testzwecken: für Benutzer, die sich der Risiken bewusst sind und mit der Behebung von Problemen vertraut sind.</string>
|
||||
<string name="about_source_code"><![CDATA[Quellcode ansehen unter %1$s]]></string>
|
||||
<string name="profile" translatable="false">App Profile</string>
|
||||
<string name="profile_default">Standard</string>
|
||||
<string name="profile_template">Vorlage</string>
|
||||
<string name="profile_custom">Benutzerdefiniert</string>
|
||||
<string name="profile_name">Profilname</string>
|
||||
<string name="profile_namespace">Mount namespace</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_groups">Gruppen</string>
|
||||
<string name="profile_capabilities">Funktionen</string>
|
||||
<string name="profile_selinux_context">SELinux context</string>
|
||||
<string name="profile_umount_modules">Umount Module</string>
|
||||
<string name="failed_to_update_app_profile">App-Profil konnte nicht aktualisiert werden für %s</string>
|
||||
<string name="require_kernel_version">Die aktuelle KernelSU Next Version %1$d ist zu veraltet, damit der Manager richtig funktioniert. aktualisieren Sie bitte auf Version %2$d oder höher!</string>
|
||||
<string name="settings_umount_modules_default">Umount Module</string>
|
||||
<string name="settings_umount_modules_default_summary">Der globale Standardwert für \„Umount Module\“ in App Profile. Wenn er aktiviert ist, werden alle Moduländerungen im System für Anwendungen entfernt, für die kein Profil festgelegt wurde.</string>
|
||||
<string name="settings_susfs_toggle">verstecke kprobe hooks</string>
|
||||
<string name="settings_susfs_toggle_summary">Diese Option deaktiviert die von ksu erzeugten kprobe-hooks und aktiviert stattdessen die eingebetteten nicht-kprobe-hooks, die die gleiche Funktionalität implementieren, die auf einen Nicht-GKI-Kernel angewendet würde, der kprobe nicht unterstützt.</string>
|
||||
<string name="profile_umount_modules_summary">Wenn Sie diese Option aktivieren, kann KernelSU Next alle von den Modulen für diese Anwendung geänderten Dateien wiederherstellen.</string>
|
||||
<string name="profile_selinux_domain">Domain</string>
|
||||
<string name="profile_selinux_rules">Regeln</string>
|
||||
<string name="module_update">Aktualisierung</string>
|
||||
<string name="module_downloading">Herunterladen des Moduls: %s</string>
|
||||
<string name="module_start_downloading">Mit dem Herunterladen beginnen: %s</string>
|
||||
<string name="new_version_available">Neue Version %s ist verfügbar, klicken Sie zum Aktualisieren.</string>
|
||||
<string name="launch_app">Start</string>
|
||||
<string name="close">Schließen</string>
|
||||
<string name="force_stop_app">Stopp erzwingen</string>
|
||||
<string name="restart_app">Neustart</string>
|
||||
<string name="failed_to_update_sepolicy">SELinux-Regeln konnten nicht aktualisiert werden: %s</string>
|
||||
<string name="su_not_allowed">Das Gewähren von Superuser ist nicht erlaubt: %s</string>
|
||||
<string name="module_changelog">Änderungsbericht</string>
|
||||
<string name="settings_profile_template">App Profil Vorlage</string>
|
||||
<string name="settings_profile_template_summary">Verwalten Sie lokale und Online-Vorlagen von App-Profilen</string>
|
||||
<string name="app_profile_template_create">Vorlage erstellen</string>
|
||||
<string name="app_profile_template_edit">Vorlage bearbeiten</string>
|
||||
<string name="app_profile_template_id">ID</string>
|
||||
<string name="app_profile_template_id_invalid">Ungültige Vorlagen-ID</string>
|
||||
<string name="app_profile_template_name">Name</string>
|
||||
<string name="app_profile_template_description">Beschreibung</string>
|
||||
<string name="app_profile_template_save">Speichern</string>
|
||||
<string name="app_profile_template_delete">Löschen</string>
|
||||
<string name="app_profile_template_view">Vorlage ansehen</string>
|
||||
<string name="app_profile_template_readonly">Nur lesen</string>
|
||||
<string name="app_profile_template_id_exist">Die Vorlagen-ID existiert bereits!</string>
|
||||
<string name="app_profile_import_export">Importieren/Exportieren</string>
|
||||
<string name="app_profile_import_from_clipboard">Importieren aus der Zwischenablage</string>
|
||||
<string name="app_profile_export_to_clipboard">In die Zwischenablage exportieren</string>
|
||||
<string name="app_profile_template_export_empty">Lokale Vorlage für den Export nicht gefunden!</string>
|
||||
<string name="app_profile_template_import_success">Erfolgreich importiert</string>
|
||||
<string name="app_profile_template_sync">Online-Vorlagen synchronisieren</string>
|
||||
<string name="app_profile_template_save_failed">Vorlage konnte nicht gespeichert werden</string>
|
||||
<string name="app_profile_template_import_empty">Die Zwischenablage ist leer!</string>
|
||||
<string name="module_changelog_failed">Abrufen des Änderungsberichts fehlgeschlagen: %s</string>
|
||||
<string name="settings_check_update">Prüfen auf Aktualisierung</string>
|
||||
<string name="settings_check_update_summary">Beim Öffnen der App automatisch nach Updates suchen.</string>
|
||||
<string name="grant_root_failed">Root konnte nicht gewährt werden!</string>
|
||||
<string name="action">Aktion</string>
|
||||
<string name="open">Öffnen</string>
|
||||
<string name="enable_web_debugging">WebView-Debugging aktivieren</string>
|
||||
<string name="enable_web_debugging_summary">Kann zum Debuggen von WebUI verwendet werden. Bitte nur bei Bedarf aktivieren.</string>
|
||||
<string name="direct_install">Direkte Installation (empfohlen)</string>
|
||||
<string name="select_file">Eine Datei auswählen</string>
|
||||
<string name="install_inactive_slot">Auf inaktivem slot installieren (nach OTA)</string>
|
||||
<string name="install_inactive_slot_warning">Ihr Gerät wird **gezwungen**, nach einem Neustart in den aktuell inaktiven slot zu booten!\n Verwenden Sie diese Option nur, nachdem OTA abgeschlossen ist.\nFortfahren?</string>
|
||||
<string name="install_next">Weiter</string>
|
||||
<string name="select_file_tip">%1$s Partitionsabbild wird empfohlen</string>
|
||||
<string name="select_kmi">KMI auswählen</string>
|
||||
<string name="shrink_sparse_image">Minimierung des sparse Abbildes</string>
|
||||
<string name="shrink_sparse_image_message">Ändern Sie die Größe des Sparse-Abbildes, in dem sich das Modul befindet, auf seine tatsächliche Größe. Beachten Sie, dass dies dazu führen kann, dass das Modul nicht ordnungsgemäß funktioniert, und verwenden Sie es daher nur, wenn es notwendig ist (z. B. zur Sicherung).</string>
|
||||
<string name="settings_uninstall">Deinstallieren</string>
|
||||
<string name="settings_uninstall_temporary">vorübergehend Deinstallieren</string>
|
||||
<string name="settings_uninstall_permanent">Endgültig deinstallieren</string>
|
||||
<string name="settings_restore_stock_image">Stock-Image wiederherstellen</string>
|
||||
<string name="settings_uninstall_temporary_message">Vorübergehende Deinstallation von KernelSU Next, Wiederherstellung des ursprünglichen Zustands nach dem nächsten Neustart.</string>
|
||||
<string name="settings_uninstall_permanent_message">KernelSU Next (Root und alle Module) vollständig und dauerhaft deinstallieren.</string>
|
||||
<string name="settings_restore_stock_image_message">Stellen Sie das Werksabbild wieder her (wenn ein Backup vorhanden ist), das normalerweise vor OTA verwendet wird; wenn Sie KernelSU als Nächstes deinstallieren müssen, verwenden Sie bitte \„Endgültig deinstallieren\“.</string>
|
||||
<string name="flashing">Flashing</string>
|
||||
<string name="flash_success">Flash erfolgreich</string>
|
||||
<string name="flash_failed">Flash fehlgeschlagen</string>
|
||||
<string name="selected_lkm">Ausgewähltes LKM: %s</string>
|
||||
<string name="save_log">Protokolle speichern</string>
|
||||
<string name="log_saved">Protokolle gespeichert</string>
|
||||
<string name="send_log">Protokolle teilen</string>
|
||||
<string name="settings_disable_su">Su-Kompatibilität deaktivieren</string>
|
||||
<string name="settings_disable_su_summary">Deaktivieren Sie vorübergehend alle Anwendungen, die über den Befehl su Root-Rechte erhalten (bestehende Root-Prozesse sind davon nicht betroffen).</string>
|
||||
</resources>
|
||||
179
manager/app/src/main/res/values-fr/strings.xml
Normal file
179
manager/app/src/main/res/values-fr/strings.xml
Normal file
@@ -0,0 +1,179 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
<string name="issue_report_title">Un souci ?</string>
|
||||
<string name="issue_report_body">Vous avez rencontré un bug ou avez des retours ?</string>
|
||||
<string name="issue_report_body_2">Signalez-le dès que possible !</string>
|
||||
<string name="issue_report_github">Signaler sur GitHub</string>
|
||||
<string name="issue_report_telegram">Contacter via Telegram</string>
|
||||
<string name="issue_report_github_link">https://github.com/KernelSU-Next/KernelSU-Next/issues</string>
|
||||
<string name="issue_report_telegram_link">https://t.me/ksunext</string>
|
||||
<string name="confirm">Confirmer</string>
|
||||
<string name="app_name" translatable="false">KernelSU Next</string>
|
||||
<string name="home">Menu</string>
|
||||
<string name="home_not_installed">Non installé</string>
|
||||
<string name="home_click_to_install">Cliquer pour installer</string>
|
||||
<string name="home_working">Fonctionnel</string>
|
||||
<string name="home_working_version">Version: %d</string>
|
||||
<string name="home_superuser_count">Superutilisateurs: %d</string>
|
||||
<string name="home_module_count">Modules: %d</string>
|
||||
<string name="home_failure">Signature KernelSU Next v2 introuvable dans le kernel! [ !KSU_NEXT || != size/hash ]</string>
|
||||
<string name="home_failure_tip">Demandez au développeur de votre kernel d\'intégrer KernelSU Next!</string>
|
||||
<string name="home_kernel">Version du kernel</string>
|
||||
<string name="home_susfs">SuSFS: %s</string>
|
||||
<string name="home_susfs_version">Version de SuSFS</string>
|
||||
<string name="home_susfs_sus_su">SuS SU</string>
|
||||
<string name="home_android">Version d\'Android</string>
|
||||
<string name="home_manager_version">Version du manager</string>
|
||||
<string name="home_selinux_status">Statut SELinux</string>
|
||||
<string name="selinux_status_disabled">Désactivé</string>
|
||||
<string name="selinux_status_enforcing">Appliqué</string>
|
||||
<string name="selinux_status_permissive">Permissif</string>
|
||||
<string name="selinux_status_unknown">Inconnu</string>
|
||||
<string name="superuser">SuperUtilisateur</string>
|
||||
<string name="module_failed_to_enable">Échec de l\'activation du module: %s</string>
|
||||
<string name="module_failed_to_disable">Échec de la désactivation du module: %s</string>
|
||||
<string name="module_empty">Aucun module installé</string>
|
||||
<string name="module">Module</string>
|
||||
<string name="module_install_prompt_with_name">Voulez-vous continuer à installer le module %1$s?</string>
|
||||
<string name="module_sort_a_to_z">Trier (A-Z)</string>
|
||||
<string name="module_sort_z_to_a">Trier (Z-A)</string>
|
||||
<string name="uninstall">Désinstaller</string>
|
||||
<string name="restore">Restaurer</string>
|
||||
<string name="module_install">Installer</string>
|
||||
<string name="install">Installer</string>
|
||||
<string name="reboot">Redémarrer</string>
|
||||
<string name="settings">Paramètres</string>
|
||||
<string name="reboot_userspace">Redémarrage logiciel</string>
|
||||
<string name="reboot_recovery">Redémarrer en mode Recovery</string>
|
||||
<string name="reboot_bootloader">Redémarrer en mode Bootloader</string>
|
||||
<string name="reboot_download">Redémarrer sur les Téléchargements</string>
|
||||
<string name="reboot_edl">Redémarrer en mode EDL</string>
|
||||
<string name="about">À propos</string>
|
||||
<string name="module_uninstall_confirm">Êtes-vous sûr de vouloir désinstaller le module %s?</string>
|
||||
<string name="module_uninstall_success">%s a été désinstallé</string>
|
||||
<string name="module_uninstall_failed">Échec de la désinstallation: %s</string>
|
||||
<string name="module_restore_confirm">Êtes-vous sûr de vouloir restaurer le module %s?</string>
|
||||
<string name="module_restore_success">%s a été restauré</string>
|
||||
<string name="module_restore_failed">Échec de la restauration: %s</string>
|
||||
<string name="module_version">Version</string>
|
||||
<string name="module_author">Auteur</string>
|
||||
<string name="module_overlay_fs_not_available">Les modules sont indisponibles car OverlayFS est désactivé par le kernel.</string>
|
||||
<string name="refresh">Rafraîchir</string>
|
||||
<string name="show_system_apps">Montrer les apps système</string>
|
||||
<string name="hide_system_apps">Cacher les apps système</string>
|
||||
<string name="export_log">Exporter les logs</string>
|
||||
<string name="safe_mode">Mode sécurisé</string>
|
||||
<string name="reboot_to_apply">Redémarrer pour appliquer les changements</string>
|
||||
<string name="module_magisk_conflict">Les modules sont indisponibles en raison d\'un conflit avec Magisk!</string>
|
||||
<string name="home_module_mount">Système de module</string>
|
||||
<string name="home_magic_mount">Magic Mount</string>
|
||||
<string name="home_overlayfs_mount">OverlayFS</string>
|
||||
<string name="unavailable">Indisponible</string>
|
||||
<string name="use_overlay_fs">Utiliser OverlayFS</string>
|
||||
<string name="use_overlay_fs_summary">Alterner entre l\’utilisation d’OverlayFS et de Magic Mount pour le système de montage de KernelSU Next.</string>
|
||||
<string name="reboot_required">Redémarrage requis</string>
|
||||
<string name="reboot_message">Les changements ne seront effectifs qu\'après un redémarrage. Voulez-vous redémarrer maintenant?</string>
|
||||
<string name="module_restore">Restaurer des modules</string>
|
||||
<string name="module_restore_message">Restaurer des modules depuis une sauvegarde récente</string>
|
||||
<string name="module_backup">Sauvegarder les modules</string>
|
||||
<string name="module_backup_message">Sauvegarder les modules installés</string>
|
||||
<string name="warning">Avertissement</string>
|
||||
<string name="warning_message">Cette fonctionnalité est encore en version bêta et en cours de développement. Veuillez sauvegarder vos modules avant de continuer. Utilisez cette fonctionnalité uniquement si vous comprenez les risques potentiels. Procédez avec prudence.</string>
|
||||
<string name="proceed">Continuer</string>
|
||||
<string name="cancel">Annuler</string>
|
||||
<string name="later">Plus tard</string>
|
||||
<string name="home_next_kernelsu">🔥 Next build</string>
|
||||
<string name="home_next_kernelsu_repo">https://github.com/KernelSU-Next/KernelSU-Next</string>
|
||||
<string name="home_next_kernelsu_body">Branche expérimentale Next. Allez la voir sur Github!</string>
|
||||
<string name="home_experimental_kernelsu">⚠️ Attention, développement expérimental!</string>
|
||||
<string name="home_experimental_kernelsu_repo">127.0.0.1</string>
|
||||
<string name="home_experimental_kernelsu_body">KernelSU Next est une version non-officielle, toujours en cours de développement. KernelSU Next vous est donc proposé tel quel, sans garantie de stabilité, de performance, ou d\'efficiacité.</string>
|
||||
<string name="home_experimental_kernelsu_body_point_1"> • Soyez donc en connaissance des risques : vous pourriez faire face à des crashs, des réactions inattendues ou encore des erreurs système.</string>
|
||||
<string name="home_experimental_kernelsu_body_point_2"> • Aucune garantie : Les développeurs ne seront tenus responsables d\'aucune perte de données, de dégâts au système ou d\'autres conséquences résultant de l\'utilisation de KernelSU Next.</string>
|
||||
<string name="home_experimental_kernelsu_body_point_3"> • Uniquement à but de tests : KernelSU Next est prévue pour des utilisateurs avertis, qui comprennent les risques et qui sont à l\'aise avec le fait de localiser un problème.</string>
|
||||
<string name="about_source_code"><![CDATA[View source code at %1$s]]></string>
|
||||
<string name="profile" translatable="false">Profil d\'application</string>
|
||||
<string name="profile_default">Par défaut</string>
|
||||
<string name="profile_template">Modèle</string>
|
||||
<string name="profile_custom">Custom</string>
|
||||
<string name="profile_name">Nom du modèle</string>
|
||||
<string name="profile_namespace">Monter le profil</string>
|
||||
<string name="profile_namespace_inherited">Hérité</string>
|
||||
<string name="profile_namespace_global">Global</string>
|
||||
<string name="profile_namespace_individual">Individuel</string>
|
||||
<string name="profile_groups">Groupes</string>
|
||||
<string name="profile_capabilities">Capacités</string>
|
||||
<string name="profile_selinux_context">Contexte SELinux</string>
|
||||
<string name="profile_umount_modules">Démonter les modules</string>
|
||||
<string name="failed_to_update_app_profile">Échec de la mise à jour du profil d\'application pour %s</string>
|
||||
<string name="require_kernel_version">La version actuelle de KernelSU Next %1$d Est trop ancienne pour que le gestionnaire fonctionne correctement. Merci de mettre à jour vers la version %2$d ou supérieur!</string>
|
||||
<string name="settings_umount_modules_default">Démonter les modules par défaut</string>
|
||||
<string name="settings_umount_modules_default_summary">Valeur globale par défaut pour \"Démonter les modules\" Dans le profil d\'application. Si activé, toutes les modifications systèmes effectuées par des modules seront annulées pour les applications n\'ayant pas de profil sélectionné.</string>
|
||||
<string name="settings_susfs_toggle">Cacher les hooks kprobe</string>
|
||||
<string name="settings_susfs_toggle_summary">Désactive les hooks kprobe créés par KSU et, à la place, active les hooks non-kprobe intégrés, implémentant les mêmes fonctionnalités qui seraient appliquées à un kernel non-GKI, qui ne supportent pas les kprobes.</string>
|
||||
<string name="profile_umount_modules_summary">Activer cette option permettra à KernelSU Next de restaurer n\'importe quel fichier modifié par les modules pour cette application.</string>
|
||||
<string name="profile_selinux_domain">Domaine</string>
|
||||
<string name="profile_selinux_rules">Règles</string>
|
||||
<string name="module_update">Mise à jour</string>
|
||||
<string name="module_downloading">Téléchargement du module : %s</string>
|
||||
<string name="module_start_downloading">Démarrage du téléchargement : %s</string>
|
||||
<string name="new_version_available">Une nouvelle version (%s) est disponible, appuyer pour mettre à jour.</string>
|
||||
<string name="launch_app">Lancer</string>
|
||||
<string name="close">Fermer</string>
|
||||
<string name="force_stop_app">Forcer l\'arrêt</string>
|
||||
<string name="restart_app">Redémarrer</string>
|
||||
<string name="failed_to_update_sepolicy">Échec de la mise à jour des règles SELinux pour: %s</string>
|
||||
<string name="module_changelog">Notes de mise à jour</string>
|
||||
<string name="settings_profile_template">Modèle de profil d\'application</string>
|
||||
<string name="settings_profile_template_summary">Gérer les profils d\'applications locaux et en ligne</string>
|
||||
<string name="app_profile_template_create">Créer un template</string>
|
||||
<string name="app_profile_template_edit">Éditer le template</string>
|
||||
<string name="app_profile_template_id">ID</string>
|
||||
<string name="app_profile_template_id_invalid">ID du template invalide</string>
|
||||
<string name="app_profile_template_name">Nom</string>
|
||||
<string name="app_profile_template_description">Description</string>
|
||||
<string name="app_profile_template_save">Sauvegarder</string>
|
||||
<string name="app_profile_template_delete">Supprimer</string>
|
||||
<string name="app_profile_template_view">Voir le modèle</string>
|
||||
<string name="app_profile_template_readonly">Lecture seule</string>
|
||||
<string name="app_profile_template_id_exist">L\'identifiant du template existe déjà!</string>
|
||||
<string name="app_profile_import_export">Importer/Exporter</string>
|
||||
<string name="app_profile_import_from_clipboard">Importer depuis le presse-papier</string>
|
||||
<string name="app_profile_export_to_clipboard">Exporter vers le presse-papier</string>
|
||||
<string name="app_profile_template_export_empty">Impossible de trouver le modèle local à exporter!</string>
|
||||
<string name="app_profile_template_import_success">Importé avec succès</string>
|
||||
<string name="app_profile_template_sync">Synchroniser les modèles en ligne</string>
|
||||
<string name="app_profile_template_save_failed">Échec de la sauvegarde du modèle</string>
|
||||
<string name="app_profile_template_import_empty">Le presse-papier est vide!</string>
|
||||
<string name="module_changelog_failed">Échec de la récupération des notes de mise à jour: %s</string>
|
||||
<string name="settings_check_update">Vérifier les mises à jour</string>
|
||||
<string name="settings_check_update_summary">Vérifier les mises à jour à l\'ouverture de l\'application</string>
|
||||
<string name="grant_root_failed">Échec de l\'accord du statut root!</string>
|
||||
<string name="action">Action</string>
|
||||
<string name="open">Ouvrir</string>
|
||||
<string name="enable_web_debugging">Activer le débogage de WebView</string>
|
||||
<string name="enable_web_debugging_summary">Peut être utilisé pour déboguer la WebUI. Merci de ne l\'activer qu\'en cas de nécéssité.</string>
|
||||
<string name="direct_install">Installation directe (recommandé)</string>
|
||||
<string name="select_file">Sélectionner un fichier</string>
|
||||
<string name="install_inactive_slot">Installer sur un slot inactif (après OTA)</string>
|
||||
<string name="install_inactive_slot_warning">Cela **FORCERA** votre appareil à démarrer sur le slot inactif après un redémarrage !\nN\'utiliser cette option qu\'après une mise à jour OTA.\nContinuer ?</string>
|
||||
<string name="install_next">Suivant</string>
|
||||
<string name="select_file_tip">%1$s Partitionner l\'image est recommandé.</string>
|
||||
<string name="select_kmi">Sélectionner le KMI</string>
|
||||
<string name="shrink_sparse_image">Minimiser l\'espace disponible réservé</string>
|
||||
<string name="shrink_sparse_image_message">Redimensionne l\'image où se trouve le module à sa taille réelle. Notez que cela peut entraîner un fonctionnement anormal des modules. Veuillez donc l\'utiliser uniquement en cas de nécessité (par exemple, pour une sauvegarde).</string>
|
||||
<string name="settings_uninstall">Désinstaller</string>
|
||||
<string name="settings_uninstall_temporary">Désinstaller temporairement</string>
|
||||
<string name="settings_uninstall_permanent">Désinstaller de façon permanente</string>
|
||||
<string name="settings_restore_stock_image">Restaurer l\'image stock</string>
|
||||
<string name="settings_uninstall_temporary_message">Désinstalle temporairement KernelSU Next, qui sera restauré au prochain redémarrage.</string>
|
||||
<string name="settings_uninstall_permanent_message">Désinstallation de KernelSU Next (Root et les modules) complètement et de façon définitive.</string>
|
||||
<string name="settings_restore_stock_image_message">Restaure l\'image stock (si une sauvegarde existe), habituellement utilisée avant une mise à jour OTA; Si vous avez besoin de désinstaller KernelSU Next, Merci de sélectionner \"Désinstaller de façon permanente\".</string>
|
||||
<string name="flashing">En cours de flash...</string>
|
||||
<string name="flash_success">Flash réussi!</string>
|
||||
<string name="flash_failed">Flash échoué</string>
|
||||
<string name="selected_lkm">LKM sélectionné: %s</string>
|
||||
<string name="save_log">Enregistrer les logs</string>
|
||||
<string name="log_saved">Logs Enregistrés</string>
|
||||
<string name="send_log">Partager les logs</string>
|
||||
</resources>
|
||||
@@ -5,7 +5,7 @@
|
||||
<string name="issue_report_body_2">Mohon beritahu kami sesegera mungkin!</string>
|
||||
<string name="issue_report_github">Laporkan di GitHub</string>
|
||||
<string name="issue_report_telegram">Hubungi melalui Telegram</string>
|
||||
<string name="issue_report_github_link">https://github.com/rifsxd/KernelSU-Next/issues</string>
|
||||
<string name="issue_report_github_link">https://github.com/KernelSU-Next/KernelSU-Next/issues</string>
|
||||
<string name="issue_report_telegram_link">https://t.me/ksunext</string>
|
||||
<string name="confirm">Yakin</string>
|
||||
<string name="app_name" translatable="false">KernelSU Next</string>
|
||||
@@ -17,8 +17,9 @@
|
||||
<string name="home_superuser_count">SuperUser: %d</string>
|
||||
<string name="home_module_count">Modul: %d</string>
|
||||
<string name="home_failure">Tandatangan KernelSU Next v2 tidak ditemukan pada kernel! [ !KSU_NEXT || != size/hash ]</string>
|
||||
<string name="home_failure_tip">Mohon agar para pengembang kernel anda mengintegrasikan KernelSU Next!</string>
|
||||
<string name="home_failure_tip">Minta pengembang kernel Anda untuk mengintegrasikan KernelSU Next!</string>
|
||||
<string name="home_kernel">Kernel</string>
|
||||
<string name="home_susfs_version">Versi SuSFS</string>
|
||||
<string name="home_android">Versi Android</string>
|
||||
<string name="home_manager_version">Versi Manager</string>
|
||||
<string name="home_selinux_status">Status SELinux</string>
|
||||
@@ -54,19 +55,44 @@
|
||||
<string name="module_restore_failed">Pemulihan gagal: %s</string>
|
||||
<string name="module_version">Versi</string>
|
||||
<string name="module_author">Oleh</string>
|
||||
<string name="module_id">ID</string>
|
||||
<string name="module_version_code">Kode</string>
|
||||
<string name="module_update_json">PembaruanJson</string>
|
||||
<string name="module_update_json_empty">Kosong</string>
|
||||
<string name="enable_developer_options">Aktifkan opsi pengembang</string>
|
||||
<string name="enable_developer_options_summary">Tampilkan pengaturan tersembunyi dan info debug module</string>
|
||||
<string name="module_overlay_fs_not_available">OverlayFS dinonaktifkan oleh kernel, modul tidak tersedia.</string>
|
||||
<string name="refresh">Muat ulang</string>
|
||||
<string name="show_system_apps">Tampilkan aplikasi sistem</string>
|
||||
<string name="hide_system_apps">Sembunyikan aplikasi sistem</string>
|
||||
<string name="send_log">Kirim Log</string>
|
||||
<string name="export_log">Ekspor Log</string>
|
||||
<string name="safe_mode">Mode aman</string>
|
||||
<string name="reboot_to_apply">Reboot agar berfungsi</string>
|
||||
<string name="module_magisk_conflict">Konflik dengan Magisk, fungsi modul ditiadakan!</string>
|
||||
<string name="home_module_mount">Modul Sistem</string>
|
||||
<string name="home_magic_mount">Magic Mount</string>
|
||||
<string name="home_overlayfs_mount">OverlayFS</string>
|
||||
<string name="unavailable">Tidak Tersedia</string>
|
||||
<string name="use_overlay_fs">Gunakan OverlayFS (Tahap Pengujian)</string>
|
||||
<string name="use_overlay_fs_summary">Beralih Modul Sistem dari Magic Mount ke OverlayFS Untuk KernelSU-Next.</string>
|
||||
<string name="reboot_required">Muat Ulang Di Perlukan</string>
|
||||
<string name="reboot_message">Perubahan akan berlaku setelah sistem dinyalakan ulang. Apakah Anda ingin menyalakan ulang sekarang Atau Nanti?</string>
|
||||
<string name="module_restore">Mengembalikan modul</string>
|
||||
<string name="module_restore_message">Pulihkan modul dari cadangan terbaru.</string>
|
||||
<string name="backup_restore">Cadangkan & Pulihkan</string>
|
||||
<string name="module_backup">Cadangkan modul</string>
|
||||
<string name="module_backup_message">Cadangkan modul yang terpasang saat ini.</string>
|
||||
<string name="allowlist_restore">Kembalikan daftar izin</string>
|
||||
<string name="allowlist_restore_message">Kembalikan daftar izin yang dikonfigurasi saat ini.</string>
|
||||
<string name="allowlist_backup">Cadangan daftar izin</string>
|
||||
<string name="allowlist_backup_message">Cadangkan daftar izin yang dikonfigurasi saat ini.</string>
|
||||
<string name="warning">Peringatan Keras!</string>
|
||||
<string name="warning_message">Fitur ini masih dalam tahap beta dan pengembangan. Pastikan Anda mencadangkan modul Anda sebelum melanjutkan. Gunakan fitur ini hanya jika Anda memahami potensi risikonya. Lanjutkan dengan hati-hati ya.</string>
|
||||
<string name="proceed">Lanjutkan</string>
|
||||
<string name="cancel">Batal</string>
|
||||
<string name="later">Nanti</string>
|
||||
<string name="home_next_kernelsu">🔥 Pembangunan Next</string>
|
||||
<string name="home_next_kernelsu_repo">https://github.com/rifsxd/KernelSU-Next</string>
|
||||
<string name="home_next_kernelsu_repo">https://github.com/KernelSU-Next/KernelSU-Next</string>
|
||||
<string name="home_next_kernelsu_body">Next cabang eksperimental. Lihat di GitHub!</string>
|
||||
<string name="home_experimental_kernelsu">⚠️ Peringatan Pengembangan Eksperimental!</string>
|
||||
<string name="home_experimental_kernelsu_repo">127.0.0.1</string>
|
||||
@@ -89,9 +115,11 @@
|
||||
<string name="profile_selinux_context">SELinux</string>
|
||||
<string name="profile_umount_modules">Umount Modul</string>
|
||||
<string name="failed_to_update_app_profile">Gagal membarui Profil pada %s</string>
|
||||
<string name="require_kernel_version">Versi KernelSU-Next %d terlalu rendah agar manajer berfungsi normal. Harap membarui ke versi %d atau di atasnya!</string>
|
||||
<string name="require_kernel_version">Versi KernelSU-Next %1$d terlalu rendah agar manajer berfungsi normal. Harap membarui ke versi %2$d atau di atasnya!</string>
|
||||
<string name="settings_umount_modules_default">Melepas Modul secara bawaan</string>
|
||||
<string name="settings_umount_modules_default_summary">Menggunakan \"Umount Modul\" secara universal pada Profil Aplikasi. Jika diaktifkan, akan menghapus semua modifikasi sistem untuk aplikasi yang tidak memiliki set profil.</string>
|
||||
<string name="settings_susfs_toggle">Sembunyikan hook kprobe</string>
|
||||
<string name="settings_susfs_toggle_summary">Ini menonaktifkan hook kprobe yang dibuat oleh ksu, dan sebagai gantinya, hook inline non-kprobe akan diaktifkan, sama seperti implementasi untuk kernel non-gki yang tidak mendukung kprobe.</string>
|
||||
<string name="profile_umount_modules_summary">Aktifkan opsi ini agar KernelSU dapat memulihkan kembali berkas termodifikasi oleh modul pada aplikasi ini.</string>
|
||||
<string name="profile_selinux_domain">Domain</string>
|
||||
<string name="profile_selinux_rules">Aturan</string>
|
||||
@@ -104,6 +132,7 @@
|
||||
<string name="force_stop_app">Paksa berhenti</string>
|
||||
<string name="restart_app">Mulai ulang</string>
|
||||
<string name="failed_to_update_sepolicy">Gagal membarui aturan SELinux pada: %s</string>
|
||||
<string name="su_not_allowed">Pemberian superuser tidak diizinkan untuk: %s</string>
|
||||
<string name="module_changelog">Catatan Perubahan</string>
|
||||
<string name="settings_profile_template">Templat Profil Aplikasi</string>
|
||||
<string name="settings_profile_template_summary">Atur templat Profil yang lokal dan daring</string>
|
||||
@@ -127,28 +156,28 @@
|
||||
<string name="app_profile_template_save_failed">Gagal menyimpan templat</string>
|
||||
<string name="app_profile_template_import_empty">Papan klip kosong!</string>
|
||||
<string name="module_changelog_failed">Gagal mengambil Changelog: %s</string>
|
||||
<string name="settings_check_update">Cek terbaru</string>
|
||||
<string name="settings_check_update_summary">Cek terbaru setiap membuka aplikasi.</string>
|
||||
<string name="settings_check_update">Periksa pembaruan</string>
|
||||
<string name="settings_check_update_summary">Periksa pembaruan secara otomatis saat membuka aplikasi.</string>
|
||||
<string name="grant_root_failed">Gagal memberikan akses root!</string>
|
||||
<string name="action">Tindakan</string>
|
||||
<string name="open">Buka</string>
|
||||
<string name="enable_web_debugging">Pengawakutuan WebView</string>
|
||||
<string name="enable_web_debugging_summary">Dapat mengawakutu WebView, hanya aktifkan jika butuh.</string>
|
||||
<string name="direct_install">Instal langsung (rekomendasi)</string>
|
||||
<string name="select_file">Pilih berkas</string>
|
||||
<string name="install_inactive_slot">Instal ke slot nonaktif (setelah OTA)</string>
|
||||
<string name="install_inactive_slot_warning">Gawai akan **DIPAKSA** untuk but ke slot nonaktif! \nHANYA gunakan setelah proses OTA selesai. \nLanjutkan?</string>
|
||||
<string name="enable_web_debugging">Aktifkan debugging WebView</string>
|
||||
<string name="enable_web_debugging_summary">Dapat digunakan untuk men-debug WebUI. Harap aktifkan hanya jika diperlukan.</string>
|
||||
<string name="direct_install">Instalasi langsung (Disarankan)</string>
|
||||
<string name="select_file">Pilih file</string>
|
||||
<string name="install_inactive_slot">Instal ke slot tidak aktif (Setelah OTA)</string>
|
||||
<string name="install_inactive_slot_warning">Perangkat Anda akan **DIPAKSA** untuk boot ke slot tidak aktif saat ini setelah reboot!\nGunakan opsi ini hanya setelah OTA selesai.\nLanjutkan?</string>
|
||||
<string name="install_next">Selanjutnya</string>
|
||||
<string name="select_file_tip">%1$s image partisi terekomendasi</string>
|
||||
<string name="select_file_tip">%1$s image partisi direkomendasikan</string>
|
||||
<string name="select_kmi">Pilih KMI</string>
|
||||
<string name="shrink_sparse_image">Meminimalkan sparse image</string>
|
||||
<string name="shrink_sparse_image_message">Mengembalikan sparse image, lokasi modul disimpan, ke ukuran sebenarnya. Dapat menyebabkan modul bekerja abnormal, maka gunakan saat dibutuhkan saja (mis. untuk pencadangan).</string>
|
||||
<string name="settings_uninstall">Hapus</string>
|
||||
<string name="settings_uninstall_temporary">Hapus temporer</string>
|
||||
<string name="settings_uninstall_permanent">Hapus permanen</string>
|
||||
<string name="settings_restore_stock_image">Pulihkan image asal</string>
|
||||
<string name="settings_uninstall_temporary_message">Hapus temporer KernelSU Next, pulihkan ke kondisi asali setelah but berikutnya.</string>
|
||||
<string name="settings_uninstall_permanent_message">Hapus permanen KernelSU-Next (root dan modul).</string>
|
||||
<string name="settings_uninstall">Copot Pemasangan</string>
|
||||
<string name="settings_uninstall_temporary">Copot pemasangan untuk sementara</string>
|
||||
<string name="settings_uninstall_permanent">Copot pemasangan secara permanen</string>
|
||||
<string name="settings_restore_stock_image">Pulihkan image bawaan</string>
|
||||
<string name="settings_uninstall_temporary_message">Copot pemasangan KernelSU Next untuk sementara, pulihkan ke keadaan semula setelah reboot berikutnya.</string>
|
||||
<string name="settings_uninstall_permanent_message">Mencopot pemasangan KernelSU Next (Root dan semua modul) sepenuhnya dan secara permanen.</string>
|
||||
<string name="settings_restore_stock_image_message">Pulihkan image bawaan ROM (jika cadangan tersedia), umumnya dilakukan sebelum OTA; jika ingin menghapus KernelSU, gunakan fungsi "Hapus permanen".</string>
|
||||
<string name="flashing">Pasang</string>
|
||||
<string name="flash_success">Pemasangan Berhasil</string>
|
||||
@@ -156,4 +185,7 @@
|
||||
<string name="selected_lkm">LKM dipilih: %s</string>
|
||||
<string name="save_log">Simpan Log</string>
|
||||
<string name="log_saved">Log disimpan</string>
|
||||
<string name="send_log">Kirim Log</string>
|
||||
<string name="settings_disable_su">Nonaktifkan kompatibilitas su</string>
|
||||
<string name="settings_disable_su_summary">Nonaktifkan sementara aplikasi apa pun agar tidak mendapatkan hak akses root melalui perintah su (proses root yang sudah ada tidak akan terpengaruh).</string>
|
||||
</resources>
|
||||
|
||||
179
manager/app/src/main/res/values-ja/strings.xml
Normal file
179
manager/app/src/main/res/values-ja/strings.xml
Normal file
@@ -0,0 +1,179 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
<string name="issue_report_title">問題に直面していますか?</string>
|
||||
<string name="issue_report_body">エラーを見つけていますか、または改善の提案がありますか?</string>
|
||||
<string name="issue_report_body_2">すぐに報告してください!</string>
|
||||
<string name="issue_report_github">GitHubで報告</string>
|
||||
<string name="issue_report_telegram">Telegramで連絡</string>
|
||||
<string name="issue_report_github_link">https://github.com/KernelSU-Next/KernelSU-Next/issues</string>
|
||||
<string name="issue_report_telegram_link">https://t.me/ksunext</string>
|
||||
<string name="confirm">確認</string>
|
||||
<string name="app_name" translatable="false">KernelSU Next</string>
|
||||
<string name="home">ホーム</string>
|
||||
<string name="home_not_installed">未インストール</string>
|
||||
<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_module_count">モジュール:%d</string>
|
||||
<string name="home_failure">カーネルに KernelSU Next V2 の署名が見つかりません! [ !KSU_NEXT || != size/hash ]</string>
|
||||
<string name="home_failure_tip">カーネル開発者に KernelSU Next を統合してもらってください!</string>
|
||||
<string name="home_kernel">カーネルバージョン</string>
|
||||
<string name="home_susfs">SuSFS:%s</string>
|
||||
<string name="home_susfs_version">SuSFS バージョン</string>
|
||||
<string name="home_susfs_sus_su">SuS SU</string>
|
||||
<string name="home_android">Android バージョン</string>
|
||||
<string name="home_manager_version">アプリのバージョン</string>
|
||||
<string name="home_selinux_status">SELinuxの状態</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>
|
||||
<string name="superuser">スーパーユーザー</string>
|
||||
<string name="module_failed_to_enable">モジュールを有効にできませんでした:%s</string>
|
||||
<string name="module_failed_to_disable">モジュールを無効にできませんでした:%s</string>
|
||||
<string name="module_empty">インストールされたモジュールはありません!</string>
|
||||
<string name="module">モジュール</string>
|
||||
<string name="module_install_prompt_with_name">%1$s モジュールをインストールしてもよろしいですか?</string>
|
||||
<string name="module_sort_a_to_z">A-Zで並べ替え</string>
|
||||
<string name="module_sort_z_to_a">Z-Aで並べ替え</string>
|
||||
<string name="uninstall">アンインストール</string>
|
||||
<string name="restore">復元</string>
|
||||
<string name="module_install">インストール</string>
|
||||
<string name="install">インストール</string>
|
||||
<string name="reboot">再起動</string>
|
||||
<string name="settings">設定</string>
|
||||
<string name="reboot_userspace">システムの再起動</string>
|
||||
<string name="reboot_recovery">Recoveryに再起動</string>
|
||||
<string name="reboot_bootloader">Bootloaderに再起動</string>
|
||||
<string name="reboot_download">ダウンロードに再起動</string>
|
||||
<string name="reboot_edl">EDLへ再起動</string>
|
||||
<string name="about">KernelSU Nextについて</string>
|
||||
<string name="module_uninstall_confirm">%s モジュールをアンインストールしてもよろしいですか?</string>
|
||||
<string name="module_uninstall_success">%s がアンインストールされました</string>
|
||||
<string name="module_uninstall_failed">アンインストールに失敗しました:%s</string>
|
||||
<string name="module_restore_confirm">%s モジュールを復元してもよろしいですか?</string>
|
||||
<string name="module_restore_success">%s が復元されました</string>
|
||||
<string name="module_restore_failed">復元に失敗しました:%s</string>
|
||||
<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="show_system_apps">システムアプリを表示</string>
|
||||
<string name="hide_system_apps">システムアプリを非表示</string>
|
||||
<string name="export_log">ログをエクスポート</string>
|
||||
<string name="safe_mode">セーフモード</string>
|
||||
<string name="reboot_to_apply">再起動して適用</string>
|
||||
<string name="module_magisk_conflict">Magiskとの競合により、モジュールは使用できません。</string>
|
||||
<string name="home_module_mount">モジュールシステム</string>
|
||||
<string name="home_magic_mount">Magicマウント</string>
|
||||
<string name="home_overlayfs_mount">OverlayFS</string>
|
||||
<string name="unavailable">利用不可</string>
|
||||
<string name="use_overlay_fs">OverlayFSを使用(実験的)</string>
|
||||
<string name="use_overlay_fs_summary">OverlayFSとMagicマウントの2つのマウントシステムの間で切り替えます。</string>
|
||||
<string name="reboot_required">再起動が必要です</string>
|
||||
<string name="reboot_message">変更はシステムを再起動した後に適用されます。今すぐ再起動しますか?</string>
|
||||
<string name="module_restore">モジュールを復元</string>
|
||||
<string name="module_restore_message">バックアップからモジュールを復元します。</string>
|
||||
<string name="module_backup">モジュールをバックアップ</string>
|
||||
<string name="module_backup_message">現在インストールされているモジュールをバックアップします。</string>
|
||||
<string name="warning">警告</string>
|
||||
<string name="warning_message">これはまだ開発中の実験的機能です。操作を続行する前に、モジュールがバックアップされていることを確認してください。この機能を使用するには、そのリスクを理解し、結果を知った上で慎重に操作してください。</string>
|
||||
<string name="proceed">続行</string>
|
||||
<string name="cancel">キャンセル</string>
|
||||
<string name="later">後で</string>
|
||||
<string name="home_next_kernelsu">🔥 次のビルド</string>
|
||||
<string name="home_next_kernelsu_repo">https://github.com/KernelSU-Next/KernelSU-Next</string>
|
||||
<string name="home_next_kernelsu_body">実験的ブランチ。GitHubで確認してください!</string>
|
||||
<string name="home_experimental_kernelsu">⚠️ Experimental development warning!</string>
|
||||
<string name="home_experimental_kernelsu_repo">127.0.0.1</string>
|
||||
<string name="home_experimental_kernelsu_body">KernelSU Nextはサードパーティのバージョンで、積極的な実験開発を維持しています。このバージョンでは、安定性、パフォーマンス、信頼性は保証されません。</string>
|
||||
<string name="home_experimental_kernelsu_body_point_1"> • リスクは自己責任:クラッシュ、予期しない動作、またはシステムの故障が発生する可能性があります。</string>
|
||||
<string name="home_experimental_kernelsu_body_point_2"> • 保証なし:開発者はデータの損失、システムの損傷などの問題に対して責任を負いません。</string>
|
||||
<string name="home_experimental_kernelsu_body_point_3"> • テスト専用:このバージョンはリスクを理解し、問題を簡単に解決できるユーザー向けです。</string>
|
||||
<string name="about_source_code"><![CDATA[ %1$s でソースコードを表示]]></string>
|
||||
<string name="profile" translatable="false">アプリプロファイル</string>
|
||||
<string name="profile_default">デフォルト</string>
|
||||
<string name="profile_template">テンプレート</string>
|
||||
<string name="profile_custom">カスタム</string>
|
||||
<string name="profile_name">名前</string>
|
||||
<string name="profile_namespace">ネームスペース</string>
|
||||
<string name="profile_namespace_inherited">継承</string>
|
||||
<string name="profile_namespace_global">グローバル</string>
|
||||
<string name="profile_namespace_individual">プライベート</string>
|
||||
<string name="profile_groups">グループ</string>
|
||||
<string name="profile_capabilities">権限</string>
|
||||
<string name="profile_selinux_context">SELinux</string>
|
||||
<string name="profile_umount_modules">モジュールをアンマウント</string>
|
||||
<string name="failed_to_update_app_profile">%s のアプリプロファイルの更新に失敗しました</string>
|
||||
<string name="require_kernel_version">現在の KernelSU Nextバージョン %1$d は低すぎるため、マネージャーは正常に動作しません。KernelSU Nextバージョンを %2$d 以上にアップグレードしてください!</string>
|
||||
<string name="settings_umount_modules_default">デフォルトのモジュールアンマウント</string>
|
||||
<string name="settings_umount_modules_default_summary">アプリプロファイル内の「モジュールのアンマウント」がデフォルトでオンになります。 有効にするとモジュールによるものを含め、プロファイルが設定されていないアプリすべてのシステム変更が削除されます。</string>
|
||||
<string name="settings_susfs_toggle">Kprobeフックを非表示</string>
|
||||
<string name="settings_susfs_toggle_summary">KSUによって作成された Kprobeフックを無効にし、非Kprobeインラインフックを代わりに使用します。これはKprobeをサポートしていない非GKIカーネルに似た方法です。</string>
|
||||
<string name="profile_umount_modules_summary">有効にすると、KernelSU Next がこのアプリのモジュールによって変更されたファイルを復元できるようになります。</string>
|
||||
<string name="profile_selinux_domain">ドメイン</string>
|
||||
<string name="profile_selinux_rules">ルール</string>
|
||||
<string name="module_update">更新</string>
|
||||
<string name="module_downloading">モジュールをダウンロード中:%s</string>
|
||||
<string name="module_start_downloading">ダウンロード開始:%s</string>
|
||||
<string name="new_version_available">新しいバージョンが見つかりました:%s、アップグレードをクリックしてください。</string>
|
||||
<string name="launch_app">起動</string>
|
||||
<string name="close">閉じる</string>
|
||||
<string name="force_stop_app">強制停止</string>
|
||||
<string name="restart_app">アプリを再起動</string>
|
||||
<string name="failed_to_update_sepolicy">%s の SELinuxルール更新に失敗しました</string>
|
||||
<string name="module_changelog">更新履歴</string>
|
||||
<string name="settings_profile_template">アプリプロファイルテンプレート</string>
|
||||
<string name="settings_profile_template_summary">ローカルおよびオンラインのアプリプロファイルテンプレートを管理します</string>
|
||||
<string name="app_profile_template_create">テンプレートを作成</string>
|
||||
<string name="app_profile_template_edit">テンプレートを編集</string>
|
||||
<string name="app_profile_template_id">テンプレート ID</string>
|
||||
<string name="app_profile_template_id_invalid">テンプレート ID が無効です</string>
|
||||
<string name="app_profile_template_name">名前</string>
|
||||
<string name="app_profile_template_description">説明</string>
|
||||
<string name="app_profile_template_save">保存</string>
|
||||
<string name="app_profile_template_delete">削除</string>
|
||||
<string name="app_profile_template_view">テンプレートを表示</string>
|
||||
<string name="app_profile_template_readonly">読み取り専用</string>
|
||||
<string name="app_profile_template_id_exist">テンプレート ID は既に存在します!</string>
|
||||
<string name="app_profile_import_export">インポート/エクスポート</string>
|
||||
<string name="app_profile_import_from_clipboard">クリップボードからインポート</string>
|
||||
<string name="app_profile_export_to_clipboard">クリップボードにエクスポート</string>
|
||||
<string name="app_profile_template_export_empty">エクスポートできるローカルテンプレートはありません!</string>
|
||||
<string name="app_profile_template_import_success">インポートに成功しました!</string>
|
||||
<string name="app_profile_template_sync">オンラインルールを同期</string>
|
||||
<string name="app_profile_template_save_failed">テンプレートの保存に失敗しました!</string>
|
||||
<string name="app_profile_template_import_empty">クリップボードが空です!</string>
|
||||
<string name="module_changelog_failed">更新ログの取得に失敗しました: %s</string>
|
||||
<string name="settings_check_update">更新を確認</string>
|
||||
<string name="settings_check_update_summary">アプリ起動後に自動的に最新バージョンを確認します。</string>
|
||||
<string name="grant_root_failed">rootの取得に失敗しました!</string>
|
||||
<string name="action">実行</string>
|
||||
<string name="open">開く</string>
|
||||
<string name="enable_web_debugging">WebViewデバッグを有効にする</string>
|
||||
<string name="enable_web_debugging_summary">WebUIのデバッグに使用できます。必要な場合のみ有効にしてください。</string>
|
||||
<string name="direct_install">直接インストール(推奨)</string>
|
||||
<string name="select_file">ファイルを選択</string>
|
||||
<string name="install_inactive_slot">未使用のスロットにインストール(OTA後)</string>
|
||||
<string name="install_inactive_slot_warning">再起動後に**強制的に**別のスロットに切り替わります!\nOTA更新完了後の再起動前にのみ使用してください。\n確認しますか?</string>
|
||||
<string name="install_next">次へ</string>
|
||||
<string name="select_file_tip">%1$sパーティションイメージを選択することをお勧めします</string>
|
||||
<string name="select_kmi">KMIを選択</string>
|
||||
<string name="shrink_sparse_image">スパースファイルを最小化</string>
|
||||
<string name="shrink_sparse_image_message">モジュールが存在するスパースファイルイメージを実際のサイズに調整します。これによりモジュールが正常に動作しない可能性がありますので、必要な場合(バックアップなど)にのみ使用してください。</string>
|
||||
<string name="settings_uninstall">アンインストール</string>
|
||||
<string name="settings_uninstall_temporary">一時的にアンインストール</string>
|
||||
<string name="settings_uninstall_permanent">完全にアンインストール</string>
|
||||
<string name="settings_restore_stock_image">工場出荷時のイメージを復元</string>
|
||||
<string name="settings_uninstall_temporary_message">KernelSU Nextを一時的にアンインストールし、次回の再起動後に復元します。</string>
|
||||
<string name="settings_uninstall_permanent_message">KernelSU Nextとすべてのモジュールを完全に削除します。</string>
|
||||
<string name="settings_restore_stock_image_message">工場出荷時のイメージを復元します。一般的にはOTA前に使用します。アンインストールする場合は「完全にアンインストール」を使用してください。</string>
|
||||
<string name="flashing">フラッシュ中</string>
|
||||
<string name="flash_success">フラッシュ成功</string>
|
||||
<string name="flash_failed">フラッシュ失敗</string>
|
||||
<string name="selected_lkm">選択されたLKM:%s</string>
|
||||
<string name="save_log">ログを保存</string>
|
||||
<string name="log_saved">ログが保存されました</string>
|
||||
<string name="send_log">ログを共有</string>
|
||||
</resources>
|
||||
@@ -1,11 +1,11 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
<string name="issue_report_title">문제가 있으신가요?</string>
|
||||
<string name="issue_report_body">버그가 발생했거나 피드백이 있으신가요?</string>
|
||||
<string name="issue_report_body_2">가능한 한 빨리 보고하세요!</string>
|
||||
<string name="issue_report_title">문제가 있으십니까?</string>
|
||||
<string name="issue_report_body">버그가 발생했거나 피드백이 있으십니까?</string>
|
||||
<string name="issue_report_body_2">가능한 한 빨리 보고하십시오!</string>
|
||||
<string name="issue_report_github">GitHub에 보고</string>
|
||||
<string name="issue_report_telegram">Telegram을 통해 문의</string>
|
||||
<string name="issue_report_github_link">https://github.com/rifsxd/KernelSU-Next/issues</string>
|
||||
<string name="issue_report_github_link">https://github.com/KernelSU-Next/KernelSU-Next/issues</string>
|
||||
<string name="issue_report_telegram_link">https://t.me/ksunext</string>
|
||||
<string name="confirm">확인</string>
|
||||
<string name="app_name" translatable="false">KernelSU Next</string>
|
||||
@@ -17,21 +17,24 @@
|
||||
<string name="home_superuser_count">루트 권한: %d개</string>
|
||||
<string name="home_module_count">설치된 모듈: %d개</string>
|
||||
<string name="home_failure">KernelSU Next v2 서명이 커널에서 발견되지 않았습니다! [ !KSU_NEXT || != size/hash ]</string>
|
||||
<string name="home_failure_tip">커널 개발자에게 KernelSU Next 지원을 문의해주세요!</string>
|
||||
<string name="home_failure_tip">커널 개발자에게 KernelSU Next 지원을 문의해주십시오!</string>
|
||||
<string name="home_kernel">커널 버전</string>
|
||||
<string name="home_susfs">SuSFS: %s</string>
|
||||
<string name="home_susfs_version">SuSFS 버전</string>
|
||||
<string name="home_susfs_sus_su">SuS SU</string>
|
||||
<string name="home_android">안드로이드 버전</string>
|
||||
<string name="home_manager_version">매니저 버전</string>
|
||||
<string name="home_selinux_status">SELinux 상태</string>
|
||||
<string name="selinux_status_disabled">비활성화됨</string>
|
||||
<string name="selinux_status_enforcing">적용</string>
|
||||
<string name="selinux_status_permissive">허용</string>
|
||||
<string name="selinux_status_enforcing">적용됨</string>
|
||||
<string name="selinux_status_permissive">허용됨</string>
|
||||
<string name="selinux_status_unknown">알 수 없음</string>
|
||||
<string name="superuser">슈퍼유저</string>
|
||||
<string name="module_failed_to_enable">모듈 활성화 실패: %s</string>
|
||||
<string name="module_failed_to_disable">모듈 비활성화 실패: %s</string>
|
||||
<string name="module_empty">설치된 모듈 없음</string>
|
||||
<string name="module">모듈</string>
|
||||
<string name="module_install_prompt_with_name">%1$s 모듈을 설치할까요?</string>
|
||||
<string name="module_install_prompt_with_name">%1$s 모듈(들)이 설치될 예정입니다.</string>
|
||||
<string name="module_sort_a_to_z">정렬 (A-Z)</string>
|
||||
<string name="module_sort_z_to_a">정렬 (Z-A)</string>
|
||||
<string name="uninstall">삭제</string>
|
||||
@@ -46,37 +49,53 @@
|
||||
<string name="reboot_download">다운로드 모드로 다시 시작</string>
|
||||
<string name="reboot_edl">EDL 모드로 다시 시작</string>
|
||||
<string name="about">정보</string>
|
||||
<string name="module_uninstall_confirm">%s 모듈을 삭제할까요?</string>
|
||||
<string name="module_uninstall_confirm">%s 모듈을 삭제하시겠습니까?</string>
|
||||
<string name="module_uninstall_success">%s 모듈 삭제됨</string>
|
||||
<string name="module_uninstall_failed">모듈 삭제 실패: %s</string>
|
||||
<string name="module_restore_confirm">%s 모듈을 복구할까요?</string>
|
||||
<string name="module_restore_confirm">%s 모듈을 복구하시겠습니까?</string>
|
||||
<string name="module_restore_success">%s 모듈 복구됨</string>
|
||||
<string name="module_restore_failed">모듈 복구 실패: %s</string>
|
||||
<string name="module_version">버전</string>
|
||||
<string name="module_author">개발자</string>
|
||||
<string name="module_id">아이디</string>
|
||||
<string name="module_version_code">버전 코드</string>
|
||||
<string name="module_update_json">업데이트 Json</string>
|
||||
<string name="module_update_json_empty">비어있음</string>
|
||||
<string name="enable_developer_options">개발자 옵션 활성화</string>
|
||||
<string name="enable_developer_options_summary">개발자를 위한 숨겨진 설정과 디버깅 정보를 표시</string>
|
||||
<string name="module_overlay_fs_not_available">커널에서 OverlayFS를 비활성화하여 모듈을 사용할 수 없습니다.</string>
|
||||
<string name="refresh">새로 고침</string>
|
||||
<string name="show_system_apps">시스템 앱 보이기</string>
|
||||
<string name="hide_system_apps">시스템 앱 숨기기</string>
|
||||
<string name="send_log">로그 보내기</string>
|
||||
<string name="export_log">로그 내보내기</string>
|
||||
<string name="safe_mode">안전 모드</string>
|
||||
<string name="reboot_to_apply">다시 시작하여 변경 사항 적용</string>
|
||||
<string name="module_magisk_conflict">Magisk와의 충돌로 모듈을 사용할 수 없습니다.!</string>
|
||||
<string name="home_module_mount">모듈 마운트 시스템</string>
|
||||
<string name="home_magic_mount">Magic Mount</string>
|
||||
<string name="home_overlayfs_mount">OverlayFS</string>
|
||||
<string name="unavailable">이용할 수 없음</string>
|
||||
<string name="use_overlay_fs">OverlayFS 사용하기 (베타)</string>
|
||||
<string name="use_overlay_fs_summary">토글 하여 KernelSU Next의 모듈 마운트 시스템을 Magic Mount와 OverlayFS 간에 전환합니다.</string>
|
||||
<string name="reboot_required">다시 시작 필요</string>
|
||||
<string name="reboot_message">시스템을 다시 시작한 후에 변경 사항들이 적용됩니다. 지금 다시 시작하시겠습니까?</string>
|
||||
<string name="module_restore">모듈 복원</string>
|
||||
<string name="module_restore_message">가장 최근의 백업으로부터 모듈을 복구합니다.</string>
|
||||
<string name="module_backup">모듈 백업</string>
|
||||
<string name="backup_restore">백업 & 복원</string>
|
||||
<string name="module_backup_message">현재 설치된 모듈들을 백업합니다.</string>
|
||||
<string name="warning">경고</string>
|
||||
<string name="warning_message">이 기능은 아직 베타 단계이며 개발 중입니다. 계속하기 전에 모듈들을 백업해 놓으시기를 바랍니다. 위험를 이해한 경우에만 이 기능을 이용하세요. 주의하여 계속하세요.</string>
|
||||
<string name="allowlist_restore">허용목록 복원</string>
|
||||
<string name="allowlist_restore_message">최근 백업으로부터 허용목록 복원</string>
|
||||
<string name="allowlist_backup">허용목록 백업</string>
|
||||
<string name="allowlist_backup_message">현재 설정된 허용목록 백업</string>
|
||||
<string name="warning_message">이 기능은 아직 베타 단계이며 개발 중입니다. 계속하기 전에 모듈들을 백업해 놓으시기를 바랍니다. 위험를 이해한 경우에만 이 기능을 이용하십시오. 그럼에도 계속하시겠습니까?</string>
|
||||
<string name="proceed">계속</string>
|
||||
<string name="cancel">취소</string>
|
||||
<string name="later">나중에</string>
|
||||
<string name="home_next_kernelsu">🔥 Next 빌드</string>
|
||||
<string name="home_next_kernelsu_repo">https://github.com/rifsxd/KernelSU-Next</string>
|
||||
<string name="home_next_kernelsu_body">Next 시험 브랜치. GitHub에서 확인하세요!</string>
|
||||
<string name="home_next_kernelsu_repo">https://github.com/KernelSU-Next/KernelSU-Next</string>
|
||||
<string name="home_next_kernelsu_body">Next 시험 브랜치입니다. GitHub에서 확인하십시오!</string>
|
||||
<string name="home_experimental_kernelsu">⚠️ 실험적 개발 버전 경고!</string>
|
||||
<string name="home_experimental_kernelsu_repo">127.0.0.1</string>
|
||||
<string name="home_experimental_kernelsu_body">KernelSU Next는 활발한 실험적 개발 단계에 있는 비공식 버전입니다. 안정성, 성능 또는 신뢰성에 대한 보장 없이 있는 그대로 제공됩니다.</string>
|
||||
@@ -98,21 +117,24 @@
|
||||
<string name="profile_selinux_context">SELinux 컨텍스</string>
|
||||
<string name="profile_umount_modules">모듈 마운트 해제</string>
|
||||
<string name="failed_to_update_app_profile">%s에 대한 앱 프로파일 업데이트 실패</string>
|
||||
<string name="require_kernel_version">현재 KernelSU Next 버전 %d이 너무 낮아 매니저가 올바르게 작동하기 어렵습니다. 버전 %d이상으로 업데이트해 주세요!</string>
|
||||
<string name="require_kernel_version">현재 KernelSU Next 버전 %1$d 이 너무 낮아 매니저가 올바르게 작동하기 어렵습니다. 버전 %2$d 이상으로 업데이트해 주십시오!</string>
|
||||
<string name="settings_umount_modules_default">기본적으로 모듈 마운트 해제</string>
|
||||
<string name="settings_umount_modules_default_summary">앱 프로파일의 \"모듈 마운트 해제\" 옵션에 대한 전역 기본값입니다. 이 옵션이 활성화되면, 프로파일이 설정되어 있지 않은 앱들에 대한 모듈의 모든 수정사항을 복구합니다.</string>
|
||||
<string name="settings_susfs_toggle">kprobe hook 숨기기</string>
|
||||
<string name="settings_susfs_toggle_summary">ksu에 의해 생성된 kprobe hook을 비활성화하고 대신 내장된 비-kprobe hook을 활성화하여 kprobe를 지원하지 않는 비-GKI 커널에 적용되는 것과 동일하게 구현합니다.</string>
|
||||
<string name="profile_umount_modules_summary">이 옵션이 활성화되면, 이 앱에 대한 모듈의 모든 수정사항을 복구합니다.</string>
|
||||
<string name="profile_selinux_domain">도메인</string>
|
||||
<string name="profile_selinux_rules">규칙</string>
|
||||
<string name="module_update">업데이트</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="launch_app">실행</string>
|
||||
<string name="close">닫기</string>
|
||||
<string name="force_stop_app">강제 종료</string>
|
||||
<string name="restart_app">앱 다시 시작</string>
|
||||
<string name="failed_to_update_sepolicy">%s 앱에 대한 SELinux 규칙 업데이트 실패</string>
|
||||
<string name="su_not_allowed">$s 앱에게 루트 권한 부여하는 것이 허용되지 않음</string>
|
||||
<string name="module_changelog">업데이트 내역</string>
|
||||
<string name="settings_profile_template">앱 프로파일 템플릿</string>
|
||||
<string name="settings_profile_template_summary">로컬과 온라인의 앱 프로파일 템플릿 관리</string>
|
||||
@@ -142,27 +164,30 @@
|
||||
<string name="action">동작 실행</string>
|
||||
<string name="open">열기</string>
|
||||
<string name="enable_web_debugging">WebView 디버깅 활성화</string>
|
||||
<string name="enable_web_debugging_summary">WebUI 디버깅에 사용 가능, 필요한 경우에만 활성화해주세요.</string>
|
||||
<string name="enable_web_debugging_summary">WebUI 디버깅에 사용 가능, 필요한 경우에만 활성화해주십시오.</string>
|
||||
<string name="direct_install">직접 설치 (권장)</string>
|
||||
<string name="select_file">파일 선택</string>
|
||||
<string name="install_inactive_slot">비활성 슬롯에 설치 (OTA 업데이트 이후)</string>
|
||||
<string name="install_inactive_slot_warning">재부팅 후 기기는 **강제로** 비활성 슬롯으로 부팅됩니다!\nOTA 업데이트를 진행한 후에만 이 옵션을 사용하세요.\n계속 진행하시겠습니까?</string>
|
||||
<string name="install_inactive_slot_warning">재부팅 후 기기는 **강제로** 비활성 슬롯으로 부팅됩니다!\nOTA 업데이트를 진행한 후에만 이 옵션을 사용하십시오.\n계속 진행하시겠습니까?</string>
|
||||
<string name="install_next">다음</string>
|
||||
<string name="select_file_tip">%1$s 파티션 이미지가 권장됨</string>
|
||||
<string name="select_kmi">KMI 선택</string>
|
||||
<string name="shrink_sparse_image">Sparse 이미지 최소화</string>
|
||||
<string name="shrink_sparse_image_message">모듈이 위치한 sparse 이미지를 실제 크기로 축소합니다. 모듈이 비정상적으로 작동할 수 있으니, 필요할 경우에만 (예: 백업) 사용하세요.</string>
|
||||
<string name="shrink_sparse_image_message">모듈이 위치한 sparse 이미지를 실제 크기로 축소합니다. 모듈이 비정상적으로 작동할 수 있으니, 필요할 경우에만 (예: 백업) 사용하십시오.</string>
|
||||
<string name="settings_uninstall">KernelSU Next 제거</string>
|
||||
<string name="settings_uninstall_temporary">임시 제거</string>
|
||||
<string name="settings_uninstall_permanent">영구 제거</string>
|
||||
<string name="settings_restore_stock_image">순정 이미지 복구</string>
|
||||
<string name="settings_uninstall_temporary_message">임시로 KernelSU Next룰 제거하고, 다음 재부팅 때 복구합니다.</string>
|
||||
<string name="settings_uninstall_permanent_message">KernelSU Next (루트 권한과 모든 모듈 포함)를 완전히, 그리고 영구히 제거합니다.</string>
|
||||
<string name="settings_restore_stock_image_message">순정 이미지 복구 (백업이 존재할 때), OTA 업데이트 전에 사용합니다; KernelSU Next를 제거하려면, \"영구 제거\"를 사용하세요.</string>
|
||||
<string name="settings_restore_stock_image_message">순정 이미지 복구 (백업이 존재할 때), OTA 업데이트 전에 사용합니다; KernelSU Next를 제거하려면, \"영구 제거\"를 사용하십시오.</string>
|
||||
<string name="flashing">플래시 중</string>
|
||||
<string name="flash_success">플래시 성공</string>
|
||||
<string name="flash_failed">플래시 실패</string>
|
||||
<string name="selected_lkm">선택된 LKM: %s</string>
|
||||
<string name="save_log">로그 저장</string>
|
||||
<string name="log_saved">로그 저장됨</string>
|
||||
<string name="send_log">로그 보내기</string>
|
||||
<string name="settings_disable_su">su 호환성 비활성화</string>
|
||||
<string name="settings_disable_su_summary">su 명령어를 통한 투르 권한 획득을 일시적으로 비활성화 (이미 존재하는 루트 프로세스는 영향을 받지 않음)</string>
|
||||
</resources>
|
||||
|
||||
179
manager/app/src/main/res/values-pl/strings.xml
Normal file
179
manager/app/src/main/res/values-pl/strings.xml
Normal file
@@ -0,0 +1,179 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
<string name="issue_report_title">Napotkałeś problem?</string>
|
||||
<string name="issue_report_body">Znalazłeś błąd lub chcesz zostawić opinię?</string>
|
||||
<string name="issue_report_body_2">Zgłoś to najszybciej jak to możliwe!</string>
|
||||
<string name="issue_report_github">Zgłoś na GitHubie</string>
|
||||
<string name="issue_report_telegram">Skontaktuj się na Telegramie</string>
|
||||
<string name="issue_report_github_link">https://github.com/KernelSU-Next/KernelSU-Next/issues</string>
|
||||
<string name="issue_report_telegram_link">https://t.me/ksunext</string>
|
||||
<string name="confirm">Potwierdź</string>
|
||||
<string name="app_name" translatable="false">KernelSU Next</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>
|
||||
<string name="home_working_version">Wersja: %d</string>
|
||||
<string name="home_superuser_count">Superużytkownicy: %d</string>
|
||||
<string name="home_module_count">Moduły: %d</string>
|
||||
<string name="home_failure">Nie znaleziono sygnatury KernelSU Next v2 w jądrze! [ !KSU_NEXT || != size/hash ]</string>
|
||||
<string name="home_failure_tip">Zapytaj swojego dewelopera o integrację z KernelSU Next!</string>
|
||||
<string name="home_kernel">Wersja jądra</string>
|
||||
<string name="home_susfs">SuSFS: %s</string>
|
||||
<string name="home_susfs_version">Wersja SuSFS</string>
|
||||
<string name="home_susfs_sus_su">SuS SU</string>
|
||||
<string name="home_android">Wersja Androida</string>
|
||||
<string name="home_manager_version">Wersja Managera</string>
|
||||
<string name="home_selinux_status">Status SELinux</string>
|
||||
<string name="selinux_status_disabled">Wyłączony</string>
|
||||
<string name="selinux_status_enforcing">Wymuszony</string>
|
||||
<string name="selinux_status_permissive">Dozwolony</string>
|
||||
<string name="selinux_status_unknown">Nieznany</string>
|
||||
<string name="superuser">Superużytkownik</string>
|
||||
<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">Nie zainstalowano żadnych modułów</string>
|
||||
<string name="module">Moduły</string>
|
||||
<string name="module_install_prompt_with_name">Zainstalować moduł %1$s?</string>
|
||||
<string name="module_sort_a_to_z">Sortuj (A-Z)</string>
|
||||
<string name="module_sort_z_to_a">Sortuj (Z-A)</string>
|
||||
<string name="uninstall">Odinstaluj</string>
|
||||
<string name="restore">Przywróć</string>
|
||||
<string name="module_install">Zainstaluj</string>
|
||||
<string name="install">Zainstaluj</string>
|
||||
<string name="reboot">Uruchom ponownie</string>
|
||||
<string name="settings">Ustawienia</string>
|
||||
<string name="reboot_userspace">Miękki restart</string>
|
||||
<string name="reboot_recovery">Restart do trybu Recovery</string>
|
||||
<string name="reboot_bootloader">Restart do trybu Bootloadera</string>
|
||||
<string name="reboot_download">Restart do trybu Download</string>
|
||||
<string name="reboot_edl">Restart do trybu EDL</string>
|
||||
<string name="about">Autor</string>
|
||||
<string name="module_uninstall_confirm">Odinstalować moduł %s?</string>
|
||||
<string name="module_uninstall_success">%s odstalowano</string>
|
||||
<string name="module_uninstall_failed">Nie można odinstalować: %s</string>
|
||||
<string name="module_restore_confirm">Przywrócić moduł %s?</string>
|
||||
<string name="module_restore_success">%s przywrócono</string>
|
||||
<string name="module_restore_failed">Nie można przywrócić: %s</string>
|
||||
<string name="module_version">Wersja</string>
|
||||
<string name="module_author">Autor</string>
|
||||
<string name="module_overlay_fs_not_available">Moduły są niedostępne, ponieważ OverlayFS jest wyłączony przez jądro.</string>
|
||||
<string name="refresh">Odśwież</string>
|
||||
<string name="show_system_apps">Pokaż aplikacje systemowe</string>
|
||||
<string name="hide_system_apps">Ukryj aplikacje systemowe</string>
|
||||
<string name="export_log">Eksport logów</string>
|
||||
<string name="safe_mode">Tryb bezpieczny</string>
|
||||
<string name="reboot_to_apply">Zrestartuj, aby zastosować zmiany</string>
|
||||
<string name="module_magisk_conflict">Moduły są niedostępne z powodu konfliku z Magiskiem!</string>
|
||||
<string name="home_module_mount">Moduł montowania</string>
|
||||
<string name="home_magic_mount">Magic Mount</string>
|
||||
<string name="home_overlayfs_mount">OverlayFS</string>
|
||||
<string name="unavailable">Niedostępne</string>
|
||||
<string name="use_overlay_fs">Użyj OverlayFS</string>
|
||||
<string name="use_overlay_fs_summary">Przełącz pomiędzy OverlayFS, a Magic Mount dla modułu montowania.</string>
|
||||
<string name="reboot_required">Wymagany restart</string>
|
||||
<string name="reboot_message">Zmiany zostaną zastosowane po restarcie. Uruchomić ponownie?</string>
|
||||
<string name="module_restore">Przywróć moduły</string>
|
||||
<string name="module_restore_message">Przywróć moduły z kopii zapasowej.</string>
|
||||
<string name="module_backup">Kopia zapasowa modułów</string>
|
||||
<string name="module_backup_message">Kopia zapasowa obecnie zainstalowanych modułów.</string>
|
||||
<string name="warning">Uwaga</string>
|
||||
<string name="warning_message">Ta funkcja jest dalej rozwijana. Upewnij się, że utworzyłeś kopię zapasową. Używaj tej opcji tylko, gdy rozumiesz ryzyko. Zachowaj ostrożność.</string>
|
||||
<string name="proceed">Dalej</string>
|
||||
<string name="cancel">Anuluj</string>
|
||||
<string name="later">Później</string>
|
||||
<string name="home_next_kernelsu">🔥 Nowa wersja</string>
|
||||
<string name="home_next_kernelsu_repo">https://github.com/KernelSU-Next/KernelSU-Next</string>
|
||||
<string name="home_next_kernelsu_body">Nowa wersja eksperymentalna. Sprawdź na GitHubie!</string>
|
||||
<string name="home_experimental_kernelsu">⚠️ Uwaga to wersja eksperymentalna!</string>
|
||||
<string name="home_experimental_kernelsu_repo">127.0.0.1</string>
|
||||
<string name="home_experimental_kernelsu_body">KernelSU Next to wersja nieoficjalna, która jest w fazie rozwoju. Nie gwarantujemy stabiności, wydajności, czy niezawodności.</string>
|
||||
<string name="home_experimental_kernelsu_body_point_1"> • Używasz na własne ryzyko: mogą wystąpić problemy.</string>
|
||||
<string name="home_experimental_kernelsu_body_point_2"> • Brak gwarancji: deweloperzy nie biorą odpowiedzialności za utratę danych i inne niespodziewane skutki.</string>
|
||||
<string name="home_experimental_kernelsu_body_point_3"> • Tylko dla testerów: przeznaczone dla użytkowników, którzy rozumieją ryzyko i wiedzą co robią.</string>
|
||||
<string name="about_source_code"><![CDATA[Zobacz kod źródłowy na %1$s]]></string>
|
||||
<string name="profile" translatable="false">Profil aplikacji</string>
|
||||
<string name="profile_default">Domyślny</string>
|
||||
<string name="profile_template">Szablon</string>
|
||||
<string name="profile_custom">Własny</string>
|
||||
<string name="profile_name">Nazwa profilu</string>
|
||||
<string name="profile_namespace">Przestrzeń nazw montowania</string>
|
||||
<string name="profile_namespace_inherited">Odziedziczona</string>
|
||||
<string name="profile_namespace_global">Globalna</string>
|
||||
<string name="profile_namespace_individual">Indywidualna</string>
|
||||
<string name="profile_groups">Grupy</string>
|
||||
<string name="profile_capabilities">Uprawnienia</string>
|
||||
<string name="profile_selinux_context">Kontekst SELinux</string>
|
||||
<string name="profile_umount_modules">Odmontuj moduły</string>
|
||||
<string name="failed_to_update_app_profile">Nie udało się zaktualizować profilu aplikacji dla %s</string>
|
||||
<string name="require_kernel_version">Obecna wersja KernelSU Next %1$d jest za niska, aby manager działał prawidłowo. Zaktualizuj do wersji %2$d lub wyższej!</string>
|
||||
<string name="settings_umount_modules_default">Domyślnie odmontuj moduły</string>
|
||||
<string name="settings_umount_modules_default_summary">Globalna wartość domyślna opcji \"Odmontuj moduły\" w profilu aplikacji. Jeśli jest włączona, wycofuje wszystkie modyfikacje dokonane przez moduły dla aplikacji, które nie mają ustawionego profilu.</string>
|
||||
<string name="settings_susfs_toggle">Ukryj kprobe hooks</string>
|
||||
<string name="settings_susfs_toggle_summary">Wyłącza kprobe hooks tworzone przez ksu i zastępuje je non-kprobe hooks, implementując tę samą funkcjonalność, która byłaby zastosowana w jądrze non-GKI, które nie obsługuje kprobe.</string>
|
||||
<string name="profile_umount_modules_summary">>Włączenie tej opcji umożliwi KernelSU przywrócenie wszelkich zmodyfikowanych plików przez moduły dla tej aplikacji.</string>
|
||||
<string name="profile_selinux_domain">Domena</string>
|
||||
<string name="profile_selinux_rules">Reguły</string>
|
||||
<string name="module_update">Zaktualizuj</string>
|
||||
<string name="module_downloading">Pobieranie modułu: %s</string>
|
||||
<string name="module_start_downloading">Rozpocznij pobieranie: %s</string>
|
||||
<string name="new_version_available">Nowa wersja %s jest dostępna. Kliknij, aby zaktualizować.</string>
|
||||
<string name="launch_app">Uruchom</string>
|
||||
<string name="close">Zamknij</string>
|
||||
<string name="force_stop_app">Wymuś zatrzymanie</string>
|
||||
<string name="restart_app">Restartuj</string>
|
||||
<string name="failed_to_update_sepolicy">Nie udało się zaktualizować reguł SELinux dla: %s</string>
|
||||
<string name="module_changelog">Lista zmian</string>
|
||||
<string name="settings_profile_template">Szablon profilu aplikacji</string>
|
||||
<string name="settings_profile_template_summary">Zarządzaj lokalnym i internetowym szablonem profilu aplikacji</string>
|
||||
<string name="app_profile_template_create">Stwórz szablon</string>
|
||||
<string name="app_profile_template_edit">Edytuj szablon</string>
|
||||
<string name="app_profile_template_id">Identyfikator</string>
|
||||
<string name="app_profile_template_id_invalid">Błędny identyfikator szablonu</string>
|
||||
<string name="app_profile_template_name">Nazwa</string>
|
||||
<string name="app_profile_template_description">Opis</string>
|
||||
<string name="app_profile_template_save">Zapisz</string>
|
||||
<string name="app_profile_template_delete">Usuń</string>
|
||||
<string name="app_profile_template_view">Zobacz szablon</string>
|
||||
<string name="app_profile_template_readonly">Tylko do odczytu</string>
|
||||
<string name="app_profile_template_id_exist">Szablon o takim identyfikatorze już istnieje!</string>
|
||||
<string name="app_profile_import_export">Importuj/Eksportuj</string>
|
||||
<string name="app_profile_import_from_clipboard">Importuj ze schowka</string>
|
||||
<string name="app_profile_export_to_clipboard">Eksportuj do schowka</string>
|
||||
<string name="app_profile_template_export_empty">Nie można znaleźć lokalnego szablonu do eksportu!</string>
|
||||
<string name="app_profile_template_import_success">Zaimportowano pomyślnie</string>
|
||||
<string name="app_profile_template_sync">Synchronizuj internetowe szablony</string>
|
||||
<string name="app_profile_template_save_failed">Nie udało się zapisać szablonu</string>
|
||||
<string name="app_profile_template_import_empty">Schowek jest pusty!</string>
|
||||
<string name="module_changelog_failed">Pobranie dziennika zmian nie powiodło się: %s</string>
|
||||
<string name="settings_check_update">Wyszukaj aktualizacje</string>
|
||||
<string name="settings_check_update_summary">Wyszukuj aktualizacje automatycznie przy otwieraniu aplikacji</string>
|
||||
<string name="grant_root_failed">Nie udało się przyznać roota!</string>
|
||||
<string name="action">Akcja</string>
|
||||
<string name="open">Otwórz</string>
|
||||
<string name="enable_web_debugging">Włącz debugowanie WebView</string>
|
||||
<string name="enable_web_debugging_summary">Może być użyte do debugowania WebUI. Włącz tylko w razie potrzeby.</string>
|
||||
<string name="direct_install">Instalacja bezpośrednia (zalecane)</string>
|
||||
<string name="select_file">Wybierz plik</string>
|
||||
<string name="install_inactive_slot">Zainstaluj do nieaktywnego slotu (po aktualizcji OTA)</string>
|
||||
<string name="install_inactive_slot_warning">Po ponownym uruchomieniu Twoje urządzenie zostanie **ZMUSZONE** do uruchomia się z obecnie nieaktywnego slotu!\nUżyj tej opcji dopiero po zakończeniu aktualizacji OTA.\nCzy chcesz kontynuować?</string>
|
||||
<string name="install_next">Dalej</string>
|
||||
<string name="select_file_tip">Obraz partycji %1$s jest zalecany</string>
|
||||
<string name="select_kmi">Wybierz KMI</string>
|
||||
<string name="shrink_sparse_image">Minimalizuj rozrzedzony (sparse) obraz</string>
|
||||
<string name="shrink_sparse_image_message">Zmienia rozmiar obrazu rozrzedzonego(sparse), w którym znajduje się moduł, do jego rzeczywistego rozmiaru. Należy pamiętać, że może to spowodować nieprawidłowe działanie modułu, więc należy go używać tylko wtedy, gdy jest to konieczne (np. do tworzenia kopii zapasowych).</string>
|
||||
<string name="settings_uninstall">Odinstaluj</string>
|
||||
<string name="settings_uninstall_temporary">Odinstaluj tymczasowo</string>
|
||||
<string name="settings_uninstall_permanent">Odinstaluj zupełnie</string>
|
||||
<string name="settings_restore_stock_image">Przywróć obraz fabryczny</string>
|
||||
<string name="settings_uninstall_temporary_message">Tymczasowo odinstaluj KernelSU, przywróć do oryginalnego stanu po następnym ponownym uruchomieniu.</string>
|
||||
<string name="settings_uninstall_permanent_message">Całkowite i trwałe odinstalowanie KernelSU (Root i wszystkich modułów).</string>
|
||||
<string name="settings_restore_stock_image_message">Przywróć obraz fabryczny (jeśli istnieje kopia zapasowa), zwykle używany przed OTA; jeśli chcesz odinstalować KernelSU, użyj opcji \"Odinstaluj całkowicie\".</string>
|
||||
<string name="flashing">Flashowanie</string>
|
||||
<string name="flash_success">Flashowanie ukończone pomyślnie</string>
|
||||
<string name="flash_failed">Flashowanie nieudane</string>
|
||||
<string name="selected_lkm">Wybrano LKM: %s</string>
|
||||
<string name="save_log">Zapisz logi</string>
|
||||
<string name="log_saved">Logi zapisane</string>
|
||||
<string name="send_log">Udostępnij logi</string>
|
||||
</resources>
|
||||
@@ -5,7 +5,7 @@
|
||||
<string name="issue_report_body_2">Reporte o mais rápido possível!</string>
|
||||
<string name="issue_report_github">Reportar no GitHub</string>
|
||||
<string name="issue_report_telegram">Contato via Telegram</string>
|
||||
<string name="issue_report_github_link">https://github.com/rifsxd/KernelSU-Next/issues</string>
|
||||
<string name="issue_report_github_link">https://github.com/KernelSU-Next/KernelSU-Next/issues</string>
|
||||
<string name="issue_report_telegram_link">https://t.me/ksunext</string>
|
||||
<string name="confirm">Confirmar</string>
|
||||
<string name="app_name" translatable="false">KernelSU Next</string>
|
||||
@@ -19,6 +19,9 @@
|
||||
<string name="home_failure">Assinatura KernelSU Next v2 não encontrada no kernel! [ !KSU_NEXT || != size/hash ]</string>
|
||||
<string name="home_failure_tip">Peça ao seu desenvolvedor de kernel para integrar o KernelSU Next!</string>
|
||||
<string name="home_kernel">Versão do kernel</string>
|
||||
<string name="home_susfs">SuSFS: %s</string>
|
||||
<string name="home_susfs_version">Versão do SuSFS</string>
|
||||
<string name="home_susfs_sus_su">SuS SU</string>
|
||||
<string name="home_android">Versão do Android</string>
|
||||
<string name="home_manager_version">Versão do gerenciador</string>
|
||||
<string name="home_selinux_status">Status do SELinux</string>
|
||||
@@ -31,7 +34,7 @@
|
||||
<string name="module_failed_to_disable">Falha ao desativar o módulo %s</string>
|
||||
<string name="module_empty">Nenhum módulo instalado</string>
|
||||
<string name="module">Módulo</string>
|
||||
<string name="module_install_prompt_with_name">Deseja continuar instalando o módulo %1$s?</string>
|
||||
<string name="module_install_prompt_with_name">Os seguintes módulos serão instalados: %1$s</string>
|
||||
<string name="module_sort_a_to_z">Ordenar (A-Z)</string>
|
||||
<string name="module_sort_z_to_a">Ordenar (Z-A)</string>
|
||||
<string name="uninstall">Desinstalar</string>
|
||||
@@ -54,19 +57,44 @@
|
||||
<string name="module_restore_failed">Falha ao restaurar %s</string>
|
||||
<string name="module_version">Versão</string>
|
||||
<string name="module_author">Autor</string>
|
||||
<string name="module_id">ID</string>
|
||||
<string name="module_version_code">Código</string>
|
||||
<string name="module_update_json">UpdateJson</string>
|
||||
<string name="module_update_json_empty">Vazio</string>
|
||||
<string name="enable_developer_options">Ativar opções do desenvolvedor</string>
|
||||
<string name="enable_developer_options_summary">Exibe as configurações ocultas e informações de depuração relevantes apenas para desenvolvedores.</string>
|
||||
<string name="module_overlay_fs_not_available">Os módulos estão indisponíveis porque OverlayFS está desabilitado pelo kernel!</string>
|
||||
<string name="refresh">Atualizar</string>
|
||||
<string name="show_system_apps">Mostrar apps do sistema</string>
|
||||
<string name="hide_system_apps">Ocultar apps do sistema</string>
|
||||
<string name="send_log">Reportar registros</string>
|
||||
<string name="export_log">Exportar registros</string>
|
||||
<string name="safe_mode">Modo de segurança</string>
|
||||
<string name="reboot_to_apply">Reinicie para entrar em vigor</string>
|
||||
<string name="module_magisk_conflict">Os módulos estão indisponíveis devido a um conflito com Magisk!</string>
|
||||
<string name="home_module_mount">Sistema de módulos</string>
|
||||
<string name="home_magic_mount">Magic Mount</string>
|
||||
<string name="home_overlayfs_mount">OverlayFS</string>
|
||||
<string name="unavailable">Indisponível</string>
|
||||
<string name="use_overlay_fs">Usar OverlayFS</string>
|
||||
<string name="use_overlay_fs_summary">Alterne entre usar OverlayFS sobre Magic Mount para o sistema de montagem do KernelSU Next.</string>
|
||||
<string name="reboot_required">Reinicialização necessária</string>
|
||||
<string name="reboot_message">As alterações entrarão em vigor após a reinicialização do sistema. Deseja reiniciar agora?</string>
|
||||
<string name="module_restore">Restaurar módulo</string>
|
||||
<string name="module_restore_message">Restaure os módulos de um backup recente.</string>
|
||||
<string name="backup_restore">Backup e restauração</string>
|
||||
<string name="module_backup">Backup do módulo</string>
|
||||
<string name="module_backup_message">Faça backup dos módulos atualmente instalados.</string>
|
||||
<string name="allowlist_restore">Restaurar lista de permissões</string>
|
||||
<string name="allowlist_restore_message">Restaure a lista de permissões de backup recente.</string>
|
||||
<string name="allowlist_backup">Backup da lista de permissões</string>
|
||||
<string name="allowlist_backup_message">Faça backup da lista de permissões configurada atualmente.</string>
|
||||
<string name="warning">Aviso</string>
|
||||
<string name="warning_message">Este recurso ainda está em beta e em desenvolvimento. Certifique-se de fazer backup de seus módulos antes de continuar. Use esse recurso somente se você compreender os riscos potenciais. Proceda com cautela.</string>
|
||||
<string name="proceed">Prosseguir</string>
|
||||
<string name="cancel">Cancelar</string>
|
||||
<string name="later">Mais tarde</string>
|
||||
<string name="home_next_kernelsu">🔥 Compilação next</string>
|
||||
<string name="home_next_kernelsu_repo">https://github.com/rifsxd/KernelSU-Next</string>
|
||||
<string name="home_next_kernelsu_repo">https://github.com/KernelSU-Next/KernelSU-Next</string>
|
||||
<string name="home_next_kernelsu_body">Branch next experimental. Confira no GitHub!</string>
|
||||
<string name="home_experimental_kernelsu">⚠️ Aviso de desenvolvimento experimental!</string>
|
||||
<string name="home_experimental_kernelsu_repo">127.0.0.1</string>
|
||||
@@ -89,9 +117,11 @@
|
||||
<string name="profile_selinux_context">Contexto do SELinux</string>
|
||||
<string name="profile_umount_modules">Desmontar módulos</string>
|
||||
<string name="failed_to_update_app_profile">Falha ao atualizar o Perfil do Aplicativo para %s</string>
|
||||
<string name="require_kernel_version">A versão atual do KernelSU Next %d é muito baixa para o gerenciador funcionar corretamente. Por favor, atualize para a versão %d ou superior!</string>
|
||||
<string name="settings_umount_modules_default">Desmontar módulos por padrão</string>
|
||||
<string name="require_kernel_version">A versão atual do KernelSU Next %1$d é muito baixa para o gerenciador funcionar corretamente. Por favor, atualize para a versão %2$d ou superior!</string>
|
||||
<string name="settings_umount_modules_default">Desmontar módulos</string>
|
||||
<string name="settings_umount_modules_default_summary">O valor padrão global para \"Desmontar módulos\" em Perfil do Aplicativo. Se ativado, ele removerá todas as modificações do módulo no sistema para apps que não possuem um perfil definido.</string>
|
||||
<string name="settings_susfs_toggle">Ocultar ganchos kprobe</string>
|
||||
<string name="settings_susfs_toggle_summary">Esta opção desativa os ganchos kprobe criados pelo ksu e, em vez disso, ativa os ganchos embutidos não-kprobe, implementando a mesma funcionalidade que seria aplicada a um kernel não-GKI, que não oferece suporte para kprobe.</string>
|
||||
<string name="profile_umount_modules_summary">Ativar esta opção permitirá que o KernelSU Next restaure quaisquer arquivos modificados pelos módulos para este app.</string>
|
||||
<string name="profile_selinux_domain">Domínio</string>
|
||||
<string name="profile_selinux_rules">Regras</string>
|
||||
@@ -104,6 +134,7 @@
|
||||
<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="su_not_allowed">O acesso de SuperUsuário não é permitido para: %s</string>
|
||||
<string name="module_changelog">Registro de alterações</string>
|
||||
<string name="settings_profile_template">Modelo do Perfil do Aplicativo</string>
|
||||
<string name="settings_profile_template_summary">Gerencie o modelo local e online do Perfil do Aplicativo.</string>
|
||||
@@ -156,4 +187,7 @@
|
||||
<string name="selected_lkm">LKM selecionado: %s</string>
|
||||
<string name="save_log">Salvar registros</string>
|
||||
<string name="log_saved">Registros salvos</string>
|
||||
<string name="send_log">Compartilhar registros</string>
|
||||
<string name="settings_disable_su">Desativar compatibilidade su</string>
|
||||
<string name="settings_disable_su_summary">Desative temporariamente a capacidade de qualquer app obter privilégios root por meio do comando su (processos root existentes não serão afetados).</string>
|
||||
</resources>
|
||||
|
||||
179
manager/app/src/main/res/values-ru/strings.xml
Normal file
179
manager/app/src/main/res/values-ru/strings.xml
Normal file
@@ -0,0 +1,179 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
<string name="issue_report_title">Возникли проблемы?</string>
|
||||
<string name="issue_report_body">Обнаружена ошибка или есть обратная связь?</string>
|
||||
<string name="issue_report_body_2">Сообщите об этом как можно скорее!</string>
|
||||
<string name="issue_report_github">Сообщить на GitHub</string>
|
||||
<string name="issue_report_telegram">Связаться через Telegram</string>
|
||||
<string name="issue_report_github_link">https://github.com/KernelSU-Next/KernelSU-Next/issues</string>
|
||||
<string name="issue_report_telegram_link">https://t.me/ksunext</string>
|
||||
<string name="confirm">Подтвердить</string>
|
||||
<string name="app_name" translatable="false">KernelSU Next</string>
|
||||
<string name="home">Главная</string>
|
||||
<string name="home_not_installed">Не установлено</string>
|
||||
<string name="home_click_to_install">Нажмите, чтобы установить</string>
|
||||
<string name="home_working">Работает</string>
|
||||
<string name="home_working_version">Версия: %d</string>
|
||||
<string name="home_superuser_count">Superusers: %d</string>
|
||||
<string name="home_module_count">Модули: %d</string>
|
||||
<string name="home_failure">Подпись KernelSU Next v2 не найдена в ядре! [!KSU_NEXT || != size/hash]</string>
|
||||
<string name="home_failure_tip">Попросите вашего разработчика ядра интегрировать KernelSU Next!</string>
|
||||
<string name="home_kernel">Версия ядра</string>
|
||||
<string name="home_susfs">SuSFS: %s</string>
|
||||
<string name="home_susfs_version">Версия SuSFS</string>
|
||||
<string name="home_susfs_sus_su">SuS SU</string>
|
||||
<string name="home_android">Версия Android</string>
|
||||
<string name="home_manager_version">Версия менеджера</string>
|
||||
<string name="home_selinux_status">Статус SELinux</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>
|
||||
<string name="superuser">Superuser</string>
|
||||
<string name="module_failed_to_enable">Не удалось включить модуль: %s</string>
|
||||
<string name="module_failed_to_disable">Не удалось отключить модуль: %s</string>
|
||||
<string name="module_empty">Нет установленных модулей</string>
|
||||
<string name="module">Модули</string>
|
||||
<string name="module_install_prompt_with_name">Вы хотите продолжить установку модуля %1$s?</string>
|
||||
<string name="module_sort_a_to_z">Сортировать (А-Я)</string>
|
||||
<string name="module_sort_z_to_a">Сортировать (Я-А)</string>
|
||||
<string name="uninstall">Удалить</string>
|
||||
<string name="restore">Восстановить</string>
|
||||
<string name="module_install">Установить</string>
|
||||
<string name="install">Установить</string>
|
||||
<string name="reboot">Перезагрузка</string>
|
||||
<string name="settings">Настройки</string>
|
||||
<string name="reboot_userspace">Мягкая перезагрузка</string>
|
||||
<string name="reboot_recovery">Перезагрузка в Recovery</string>
|
||||
<string name="reboot_bootloader">Перезагрузка в Bootloader</string>
|
||||
<string name="reboot_download">Перезагрузка в Download</string>
|
||||
<string name="reboot_edl">Перезагрузка в EDL</string>
|
||||
<string name="about">О программе</string>
|
||||
<string name="module_uninstall_confirm">Вы уверены, что хотите удалить модуль %s?</string>
|
||||
<string name="module_uninstall_success">%s удалён</string>
|
||||
<string name="module_uninstall_failed">Не удалось удалить: %s</string>
|
||||
<string name="module_restore_confirm">Вы уверены, что хотите восстановить модуль %s?</string>
|
||||
<string name="module_restore_success">%s восстановлен</string>
|
||||
<string name="module_restore_failed">Не удалось восстановить: %s</string>
|
||||
<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="show_system_apps">Показать системные приложения</string>
|
||||
<string name="hide_system_apps">Скрыть системные приложения</string>
|
||||
<string name="export_log">Экспорт логов</string>
|
||||
<string name="safe_mode">Безопасный режим</string>
|
||||
<string name="reboot_to_apply">Перезагрузите для применения</string>
|
||||
<string name="module_magisk_conflict">Модули недоступны из-за конфликта с Magisk!</string>
|
||||
<string name="home_module_mount">Система модулей</string>
|
||||
<string name="home_magic_mount">Magic Mount</string>
|
||||
<string name="home_overlayfs_mount">OverlayFS</string>
|
||||
<string name="unavailable">Недоступно</string>
|
||||
<string name="use_overlay_fs">Использовать OverlayFS (Бета)</string>
|
||||
<string name="use_overlay_fs_summary">Переключение между использованием OverlayFS и Magic Mount для системы монтирования KernelSU Next.</string>
|
||||
<string name="reboot_required">Требуется перезагрузка</string>
|
||||
<string name="reboot_message">Изменения вступят в силу после перезагрузки системы. Перезагрузить сейчас?</string>
|
||||
<string name="module_restore">Восстановить модуль</string>
|
||||
<string name="module_restore_message">Восстановление модулей из последней резервной копии.</string>
|
||||
<string name="module_backup">Резервное копирование модуля</string>
|
||||
<string name="module_backup_message">Резервное копирование текущих установленных модулей.</string>
|
||||
<string name="warning">Предупреждение</string>
|
||||
<string name="warning_message">Эта функция всё ещё находится в стадии бета-тестирования. Пожалуйста, убедитесь, что вы создали резервные копии модулей перед использованием. Используйте это только если понимаете возможные риски. Будьте осторожны.</string>
|
||||
<string name="proceed">Продолжить</string>
|
||||
<string name="cancel">Отмена</string>
|
||||
<string name="later">Позже</string>
|
||||
<string name="home_next_kernelsu">🔥 Следующий билд</string>
|
||||
<string name="home_next_kernelsu_repo">https://github.com/KernelSU-Next/KernelSU-Next</string>
|
||||
<string name="home_next_kernelsu_body">Следующая экспериментальная ветка. Посмотрите на GitHub!</string>
|
||||
<string name="home_experimental_kernelsu">⚠️ Предупреждение об экспериментальной разработке!</string>
|
||||
<string name="home_experimental_kernelsu_repo">127.0.0.1</string>
|
||||
<string name="home_experimental_kernelsu_body">KernelSU Next — это неофициальная версия, которая всегда находится в стадии активной экспериментальной разработки. Она предоставляется как есть, без гарантий стабильности, производительности или надёжности.</string>
|
||||
<string name="home_experimental_kernelsu_body_point_1"> • Используйте на свой страх и риск: могут возникнуть сбои, непредвиденное поведение или проблемы с системой.</string>
|
||||
<string name="home_experimental_kernelsu_body_point_2"> • Нет гарантии: разработчики не несут ответственности за потерю данных, повреждение системы или другие последствия, вызванные использованием.</string>
|
||||
<string name="home_experimental_kernelsu_body_point_3"> • Только для тестирования: предназначено для пользователей, которые понимают риски и готовы решать возникающие проблемы.</string>
|
||||
<string name="about_source_code"><![CDATA[Посмотреть исходный код на %1$s]]></string>
|
||||
<string name="profile" translatable="false">Профиль приложения</string>
|
||||
<string name="profile_default">По умолчанию</string>
|
||||
<string name="profile_template">Шаблон</string>
|
||||
<string name="profile_custom">Пользовательский</string>
|
||||
<string name="profile_name">Имя профиля</string>
|
||||
<string name="profile_namespace">Пространство монтирования</string>
|
||||
<string name="profile_namespace_inherited">Унаследовано</string>
|
||||
<string name="profile_namespace_global">Глобальное</string>
|
||||
<string name="profile_namespace_individual">Индивидуальное</string>
|
||||
<string name="profile_groups">Группы</string>
|
||||
<string name="profile_capabilities">Возможности</string>
|
||||
<string name="profile_selinux_context">Контекст SELinux</string>
|
||||
<string name="profile_umount_modules">Отключить модули</string>
|
||||
<string name="failed_to_update_app_profile">Не удалось обновить Профиль Приложения для %s</string>
|
||||
<string name="require_kernel_version">Текущая версия KernelSU Next %1$d слишком низкая для корректной работы менеджера. Пожалуйста, обновитесь до версии %2$d или выше!</string>
|
||||
<string name="settings_umount_modules_default">Отключать модули по умолчанию</string>
|
||||
<string name="settings_umount_modules_default_summary">Глобальное значение по умолчанию для \"Отключить модули\" в профиле приложения. Если включено, это удалит все модификации системы модулями для приложений без установленного профиля.</string>
|
||||
<string name="settings_susfs_toggle">Скрыть хуки kprobe</string>
|
||||
<string name="settings_susfs_toggle_summary">Отключает хуки kprobe, созданные ksu, и вместо этого активирует встроенные некрючковые функции, реализующие ту же функциональность для неконечных ядер, которые не поддерживают kprobe.</string>
|
||||
<string name="profile_umount_modules_summary">Включение этой опции позволит KernelSU Next восстанавливать любые изменённые модулями файлы для этого приложения.</string>
|
||||
<string name="profile_selinux_domain">Домен</string>
|
||||
<string name="profile_selinux_rules">Правила</string>
|
||||
<string name="module_update">Обновить</string>
|
||||
<string name="module_downloading">Загрузка модуля: %s</string>
|
||||
<string name="module_start_downloading">Начало загрузки: %s</string>
|
||||
<string name="new_version_available">Доступна новая версия %s, нажмите для обновления.</string>
|
||||
<string name="launch_app">Запустить</string>
|
||||
<string name="close">Закрыть</string>
|
||||
<string name="force_stop_app">Принудительно остановить</string>
|
||||
<string name="restart_app">Перезапустить</string>
|
||||
<string name="failed_to_update_sepolicy">Не удалось обновить правила SELinux для: %s</string>
|
||||
<string name="module_changelog">Журнал изменений</string>
|
||||
<string name="settings_profile_template">Шаблон Профиля Приложения</string>
|
||||
<string name="settings_profile_template_summary">Управление локальными и онлайн-шаблонами профилей приложений</string>
|
||||
<string name="app_profile_template_create">Создать шаблон</string>
|
||||
<string name="app_profile_template_edit">Редактировать шаблон</string>
|
||||
<string name="app_profile_template_id">Идентификатор</string>
|
||||
<string name="app_profile_template_id_invalid">Неверный идентификатор шаблона</string>
|
||||
<string name="app_profile_template_name">Имя</string>
|
||||
<string name="app_profile_template_description">Описание</string>
|
||||
<string name="app_profile_template_save">Сохранить</string>
|
||||
<string name="app_profile_template_delete">Удалить</string>
|
||||
<string name="app_profile_template_view">Просмотр шаблона</string>
|
||||
<string name="app_profile_template_readonly">Только для чтения</string>
|
||||
<string name="app_profile_template_id_exist">Идентификатор шаблона уже существует!</string>
|
||||
<string name="app_profile_import_export">Импорт/Экспорт</string>
|
||||
<string name="app_profile_import_from_clipboard">Импорт из буфера обмена</string>
|
||||
<string name="app_profile_export_to_clipboard">Экспорт в буфер обмена</string>
|
||||
<string name="app_profile_template_export_empty">Не удалось найти локальный шаблон для экспорта!</string>
|
||||
<string name="app_profile_template_import_success">Успешно импортировано</string>
|
||||
<string name="app_profile_template_sync">Синхронизировать онлайн-шаблоны</string>
|
||||
<string name="app_profile_template_save_failed">Не удалось сохранить шаблон</string>
|
||||
<string name="app_profile_template_import_empty">Буфер обмена пуст!</string>
|
||||
<string name="module_changelog_failed">Не удалось получить журнал изменений: %s</string>
|
||||
<string name="settings_check_update">Проверить обновления</string>
|
||||
<string name="settings_check_update_summary">Автоматически проверять обновления при открытии приложения.</string>
|
||||
<string name="grant_root_failed">Не удалось предоставить root-доступ!</string>
|
||||
<string name="action">Действие</string>
|
||||
<string name="open">Открыть</string>
|
||||
<string name="enable_web_debugging">Включить отладку WebView</string>
|
||||
<string name="enable_web_debugging_summary">Можно использовать для отладки WebUI. Включайте только при необходимости.</string>
|
||||
<string name="direct_install">Прямая установка (Рекомендуется)</string>
|
||||
<string name="select_file">Выберите файл</string>
|
||||
<string name="install_inactive_slot">Установить в неактивный слот (После OTA)</string>
|
||||
<string name="install_inactive_slot_warning">Ваше устройство будет **ПРИНУДИТЕЛЬНО** загружено в текущий неактивный слот после перезагрузки!\nИспользуйте эту опцию только после завершения OTA.\nПродолжить?</string>
|
||||
<string name="install_next">Далее</string>
|
||||
<string name="select_file_tip">Рекомендуется образ раздела %1$s</string>
|
||||
<string name="select_kmi">Выберите KMI</string>
|
||||
<string name="shrink_sparse_image">Уменьшить modules.img образ</string>
|
||||
<string name="shrink_sparse_image_message">Измените размер modules.img образа, в котором находятся модули, до его фактического размера. Обратите внимание, что это может вызвать ненормальную работу модулей, поэтому используйте только при необходимости (например, для резервного копирования).</string>
|
||||
<string name="settings_uninstall">Удаление</string>
|
||||
<string name="settings_uninstall_temporary">Временное удаление</string>
|
||||
<string name="settings_uninstall_permanent">Полное удаление</string>
|
||||
<string name="settings_restore_stock_image">Восстановить стандартное изображение</string>
|
||||
<string name="settings_uninstall_temporary_message">Временно удалите KernelSU Next, восстановив исходное состояние после следующей перезагрузки.</string>
|
||||
<string name="settings_uninstall_permanent_message">Полное и окончательное удаление KernelSU Next (Root и всех модулей).</string>
|
||||
<string name="settings_restore_stock_image_message">Восстановление стандартного заводского образа (если есть резервная копия), обычно используется перед OTA; если необходимо удалить KernelSU Next, используйте "Полное удаление".</string>
|
||||
<string name="flashing">Прошивка</string>
|
||||
<string name="flash_success">Прошивка выполнена успешно</string>
|
||||
<string name="flash_failed">Ошибка прошивки</string>
|
||||
<string name="selected_lkm">Выбран LKM: %s</string>
|
||||
<string name="save_log">Сохранить логи</string>
|
||||
<string name="log_saved">Логи сохранены</string>
|
||||
<string name="send_log">Поделиться логами</string>
|
||||
</resources>
|
||||
179
manager/app/src/main/res/values-th/strings.xml
Normal file
179
manager/app/src/main/res/values-th/strings.xml
Normal file
@@ -0,0 +1,179 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
<string name="issue_report_title">มีปัญหาหรือเจอบั๊กหรือไม่?</string>
|
||||
<string name="issue_report_body">เจอบั๊กหรือข้อแนะนําไหม?</string>
|
||||
<string name="issue_report_body_2">โปรดรายงานมันให้เร็วที่สุด!</string>
|
||||
<string name="issue_report_github">รายงานบน Github</string>
|
||||
<string name="issue_report_telegram">ติดต่อผ่านทาง Telegram</string>
|
||||
<string name="issue_report_github_link">https://github.com/KernelSU-Next/KernelSU-Next/issues</string>
|
||||
<string name="issue_report_telegram_link">https://t.me/ksunext</string>
|
||||
<string name="confirm">ยืนยัน</string>
|
||||
<string name="app_name" translatable="false">KernelSU Next</string>
|
||||
<string name="home">หน้าหลัก</string>
|
||||
<string name="home_not_installed">ยังไม่ได้ติดตั้ง</string>
|
||||
<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_module_count">โมดูล: %d</string>
|
||||
<string name="home_failure">ลายเซ็น KernelSU Next v2 ไม่เจอในเคอร์เนล [ !KSU_NEXT || != size/hash ]</string>
|
||||
<string name="home_failure_tip">กรุณาถามผู้พัฒนาเคอร์เนลของคุณให้นํา KernelSU Next เข้าไปในเคอร์เนล</string>
|
||||
<string name="home_kernel">เวอร์ชันเคอร์เนล</string>
|
||||
<string name="home_susfs">SuSFS: %s</string>
|
||||
<string name="home_susfs_version">เวอร์ชัน SuSFS</string>
|
||||
<string name="home_susfs_sus_su">SuS SU</string>
|
||||
<string name="home_android">เวอร์ชันแอนดรอยด์</string>
|
||||
<string name="home_manager_version">เวอร์ชันตัวจัดการ</string>
|
||||
<string name="home_selinux_status">สถานะ SELinux</string>
|
||||
<string name="selinux_status_disabled">ปิดการใช้งาน</string>
|
||||
<string name="selinux_status_enforcing">Enforcing</string>
|
||||
<string name="selinux_status_permissive">Permissive</string>
|
||||
<string name="selinux_status_unknown">ไม่ทราบ</string>
|
||||
<string name="superuser">สิทธิ์ผู้ใช้ขั้นสูง</string>
|
||||
<string name="module_failed_to_enable">ล้มเหลวในการเปิดใช้งานโมดูล: %s</string>
|
||||
<string name="module_failed_to_disable">ล้มเหลวในการปิดใช้งานโมดูล: %s</string>
|
||||
<string name="module_empty">ไม่มีโมดูลที่ติดตั้ง</string>
|
||||
<string name="module">โมดูล</string>
|
||||
<string name="module_install_prompt_with_name">คุณแน่ใจที่จะติดตั้งโมดูล %s หรือไม่?</string>
|
||||
<string name="module_sort_a_to_z">เรียงลำดับ (A-Z)</string>
|
||||
<string name="module_sort_z_to_a">เรียงลำดับ (Z-A)</string>
|
||||
<string name="uninstall">ถอนการติดตั้ง</string>
|
||||
<string name="restore">กู้คืน</string>
|
||||
<string name="module_install">ติดตั้ง</string>
|
||||
<string name="install">ติดตั้ง</string>
|
||||
<string name="reboot">รีบูต</string>
|
||||
<string name="settings">การตั้งค่า</string>
|
||||
<string name="reboot_userspace">ซอฟต์รีบูต</string>
|
||||
<string name="reboot_recovery">รีบูตเข้าสู่โหมดกู้คืน</string>
|
||||
<string name="reboot_bootloader">รีบูตเข้าสู่โหมด Bootloader</string>
|
||||
<string name="reboot_download">รีบูตเข้าสู่โหมด Download</string>
|
||||
<string name="reboot_edl">รีบูตเข้าสู่โหมด EDL</string>
|
||||
<string name="about">เกี่ยวกับ</string>
|
||||
<string name="module_uninstall_confirm">คุณแน่ใจว่าจะถอนการติดตั้งโมดูล %s หรือไม่?</string>
|
||||
<string name="module_uninstall_success">%s ถูกถอนการติดตั้งเรียบร้อยแล้ว</string>
|
||||
<string name="module_uninstall_failed">ล้มเหลวในการถอนการติดตั้ง: %s</string>
|
||||
<string name="module_restore_confirm">คุณแน่ใจที่จะกู้คืนโมดูล %s กลับมาหรือไม่?</string>
|
||||
<string name="module_restore_success">%s ถูกกู้คืนเรียบร้อยแล้ว</string>
|
||||
<string name="module_restore_failed">ล้มเหลวในการกู้คืน: %s</string>
|
||||
<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="show_system_apps">แสดงแอประบบ</string>
|
||||
<string name="hide_system_apps">ซ่อนแอประบบ</string>
|
||||
<string name="export_log">ส่งออกไฟล์ logs</string>
|
||||
<string name="safe_mode">โหมดปลอดภัย</string>
|
||||
<string name="reboot_to_apply">รีบูตเพื่อให้มีผล</string>
|
||||
<string name="module_magisk_conflict">โมดูลไม่สามารถใช้งานได้ เนื่องจากขัดแย้งกับ Magisk!</string>
|
||||
<string name="home_module_mount">โมดูลระบบ</string>
|
||||
<string name="home_magic_mount">Magic Mount</string>
|
||||
<string name="home_overlayfs_mount">OverlayFS</string>
|
||||
<string name="unavailable">ไม่สามารถใช้งานได้</string>
|
||||
<string name="use_overlay_fs">ใช้ OverlayFS (เบต้า)</string>
|
||||
<string name="use_overlay_fs_summary">สลับระหว่างการใช้ OverlayFS บน Magic Mount สำหรับโมดูลระบบของ KernelSU Next</string>
|
||||
<string name="reboot_required">จำเป็นที่ต้องรีบูต</string>
|
||||
<string name="reboot_message">การเปลี่ยนแปลงนี้จะส่งผลหลังจากที่รีบูท คุณต้องการรีบูทตอนนี้เลยไหม?</string>
|
||||
<string name="module_restore">กู้คืนโมดูล</string>
|
||||
<string name="module_restore_message">กู้คืนโมดูลจากแบ็คอัพล่าสุด</string>
|
||||
<string name="module_backup">แบ็คอัพโมดูล</string>
|
||||
<string name="module_backup_message">จะแบ็คอัพให้เฉพาะกับโมดูลที่ถูกติดตั้งเท่านั้น</string>
|
||||
<string name="warning">คำเตือน</string>
|
||||
<string name="warning_message">คุณสมบัตินี้ยังอยู่ในเบต้าและภายใต้การพัฒนากรุณาแบ็คอัพโมดูลของคุณก่อนที่จะดำเนินการต่อ โปรดใช้คุณสมบัตินี้เมื่อคุณเข้าใจในความเสี่ยงและรู้ว่ากำลังทำอะไรอยู่ กรุณาใช้พิจารณาในการดำเนินการต่อ</string>
|
||||
<string name="proceed">ดำเนินการต่อ</string>
|
||||
<string name="cancel">ยกเลิก</string>
|
||||
<string name="later">ภายหลัง</string>
|
||||
<string name="home_next_kernelsu">🔥 Next build</string>
|
||||
<string name="home_next_kernelsu_repo">https://github.com/KernelSU-Next/KernelSU-Next</string>
|
||||
<string name="home_next_kernelsu_body">Branch ทดลอง Next ดูได้ที่ GitHub!</string>
|
||||
<string name="home_experimental_kernelsu">⚠️ คำเตือนสิ่งนี้อยู่ภายใต้การพัฒนา!</string>
|
||||
<string name="home_experimental_kernelsu_repo">127.0.0.1</string>
|
||||
<string name="home_experimental_kernelsu_body">KernelSU Next เป็นเวอร์ชั่นอย่างไม่เป็นทางการที่อยู่ภายใต้การทดลอง เวอร์ชั่นนี้จะไม่มีการรับรองในเรื่องความเสถียร ประสิทธิภาพและอื่นๆ</string>
|
||||
<string name="home_experimental_kernelsu_body_point_1"> • โปรดใช้ในภายใต้ความเสี่ยงของคุณ: อาจจะเกิดปัญหา crashes สิ่งที่ไม่คาดฝันหรือปัญหาในระบบอื่นๆ</string>
|
||||
<string name="home_experimental_kernelsu_body_point_2"> • ไม่มีการรับรอง: ผู้พัฒนาจะไม่รับผิดชอบในกรณีที่เกิดข้อมูลหายหรือไฟล์ระบบได้รับความเสียหายและอื่นๆจากการใช้งานสิ่งนี้</string>
|
||||
<string name="home_experimental_kernelsu_body_point_3"> • สำหรับการทดลองเท่านั้น: ไว้เฉพาะกับผู้ใช้งานที่เข้าใจในความเสี่ยงและมีความรู้ความสามารถเบื้องต้นในการแก้ไขปัญหา</string>
|
||||
<string name="about_source_code"><![CDATA[สามารถดู Source Code ได้ที่ %1$s]]></string>
|
||||
<string name="profile" translatable="false">โปรไฟล์แอป</string>
|
||||
<string name="profile_default">ค่าเริ่มต้น</string>
|
||||
<string name="profile_template">เทมเพลต</string>
|
||||
<string name="profile_custom">กำหนดเอง</string>
|
||||
<string name="profile_name">ชื่อโปรไฟล์</string>
|
||||
<string name="profile_namespace">Mount เนมสเปซ</string>
|
||||
<string name="profile_namespace_inherited">สืบทอด</string>
|
||||
<string name="profile_namespace_global">ทั่วไป</string>
|
||||
<string name="profile_namespace_individual">ส่วนบุคคล</string>
|
||||
<string name="profile_groups">หมวดหมู่</string>
|
||||
<string name="profile_capabilities">ความสามารถของแอป</string>
|
||||
<string name="profile_selinux_context">บริบท SELinux</string>
|
||||
<string name="profile_umount_modules">Umount โมดูล</string>
|
||||
<string name="failed_to_update_app_profile">ไม่สามารถอัปเดตโปรไฟล์แอปสำหรับ %s ได้</string>
|
||||
<string name="require_kernel_version">KernelSU Next เวอร์ชัน %1$d ต่ำเกินไป ทำให้ตัวจัดการไม่สามารถทำงานได้อย่างถูกต้อง โปรดอัปเกรดเป็นเวอร์ชัน %2$d หรือสูงกว่า!</string>
|
||||
<string name="settings_umount_modules_default">Umount โมดูลตามค่าเริ่มต้น</string>
|
||||
<string name="settings_umount_modules_default_summary">หากเปิดใช้งานค่าเริ่มต้นโดยทั่วไปสำหรับ \"Umount โมดูล\" ในโปรไฟล์แอป จะเป็นการลบการแก้ไขโมดูลทั้งหมดในระบบสำหรับแอปพลิเคชันที่ไม่มีการตั้งค่าโปรไฟล์</string>
|
||||
<string name="settings_susfs_toggle">ซ่อน kprobe hooks</string>
|
||||
<string name="settings_susfs_toggle_summary">จะปิดใช้งาน kprobe hooks ที่สร้างโดย ksu และเปิดใช้งาน non-kprobe hooks ที่ฝังไว้แทน โดยใช้ฟังก์ชันการทำงานเดียวกันกับที่ใช้กับเคอร์เนลที่ไม่ใช่ GKI ซึ่งไม่รองรับ</string>
|
||||
<string name="profile_umount_modules_summary">การเปิดใช้งานตัวเลือกนี้จะทำให้ KernelSU Next สามารถกู้คืนไฟล์ที่แก้ไขโดยโมดูลสำหรับแอปนี้ได้</string>
|
||||
<string name="profile_selinux_domain">โดเมน</string>
|
||||
<string name="profile_selinux_rules">กฎ</string>
|
||||
<string name="module_update">อัปเดต</string>
|
||||
<string name="module_downloading">กำลังดาวน์โหลดโมดูล: %s</string>
|
||||
<string name="module_start_downloading">กำลังเริ่มดาวน์โหลด: %s</string>
|
||||
<string name="new_version_available">เวอร์ชันใหม่: %s พร้อมใช้งาน คลิกเพื่ออัปเกรด</string>
|
||||
<string name="launch_app">เปิด</string>
|
||||
<string name="close">ปิด</string>
|
||||
<string name="force_stop_app">บังคับหยุด</string>
|
||||
<string name="restart_app">รีสตาร์ท</string>
|
||||
<string name="failed_to_update_sepolicy">ไม่สามารถอัปเดตนโยบาย SElinux สำหรับ: %s ได้</string>
|
||||
<string name="module_changelog">การเปลี่ยนแปลง</string>
|
||||
<string name="settings_profile_template">เทมเพลตโปรไฟล์แอป</string>
|
||||
<string name="settings_profile_template_summary">จัดการเทมเพลตโปรไฟล์แอปในเครื่องและเทมเพลตออนไลน์</string>
|
||||
<string name="app_profile_template_create">สร้างเทมเพลต</string>
|
||||
<string name="app_profile_template_edit">แก้ไขเทมเพลต</string>
|
||||
<string name="app_profile_template_id">ไอดี</string>
|
||||
<string name="app_profile_template_id_invalid">ไอดีเทมเพลตไม่ถูกต้อง</string>
|
||||
<string name="app_profile_template_name">ชื่อ</string>
|
||||
<string name="app_profile_template_description">คำอธิบาย</string>
|
||||
<string name="app_profile_template_save">บันทึก</string>
|
||||
<string name="app_profile_template_delete">ลบ</string>
|
||||
<string name="app_profile_template_view">ดูเทมเพลต</string>
|
||||
<string name="app_profile_template_readonly">อ่านเท่านั้น</string>
|
||||
<string name="app_profile_template_id_exist">มีไอดีเทมเพลตนี้อยู่แล้ว!</string>
|
||||
<string name="app_profile_import_export">นำเข้า/ส่งออก</string>
|
||||
<string name="app_profile_import_from_clipboard">นำเข้าจากคลิปบอร์ด</string>
|
||||
<string name="app_profile_export_to_clipboard">ส่งออกไปยังคลิปบอร์ด</string>
|
||||
<string name="app_profile_template_export_empty">ไม่พบเทมเพลตในเครื่องที่จะส่งออก!</string>
|
||||
<string name="app_profile_template_import_success">นำเข้าเสร็จสิ้น</string>
|
||||
<string name="app_profile_template_sync">ซิงค์เทมเพลตออนไลน์</string>
|
||||
<string name="app_profile_template_save_failed">ไม่สามารถบันทึกเทมเพลต</string>
|
||||
<string name="app_profile_template_import_empty">คลิปบอร์ดว่างเปล่า!</string>
|
||||
<string name="module_changelog_failed">ดึงข้อมูลบันทึกการเปลี่ยนแปลงล้มเหลว: %s</string>
|
||||
<string name="settings_check_update">ตรวจสอบการอัปเดต</string>
|
||||
<string name="settings_check_update_summary">ตรวจสอบการอัปเดตโดยอัตโนมัติเมื่อเปิดแอป</string>
|
||||
<string name="grant_root_failed">ไม่สามารถให้สิทธิ์รูทได้!</string>
|
||||
<string name="action">คำสั่ง</string>
|
||||
<string name="open">เปิด</string>
|
||||
<string name="enable_web_debugging">เปิดใช้งานการแก้ไขข้อบกพร่อง WebView</string>
|
||||
<string name="enable_web_debugging_summary">สามารถใช้เพื่อดีบัก WebUI โปรดเปิดใช้งานเมื่อจำเป็นเท่านั้น</string>
|
||||
<string name="direct_install">ติดตั้งโดยตรง (แนะนำ)</string>
|
||||
<string name="select_file">เลือกไฟล์</string>
|
||||
<string name="install_inactive_slot">ติดตั้งลงในสล็อตที่ไม่ใช้งาน (หลังจาก OTA)</string>
|
||||
<string name="install_inactive_slot_warning">อุปกรณ์ของคุณจะถูก **บังคับ** ให้บูตไปยังสล็อตที่ไม่ได้ใช้งานหลังจากรีบูต!\nโปรดใช้ตัวเลือกนี้หลังจาก OTA เสร็จแล้วเท่านั้น\nดำเนินการต่อหรือไม่?</string>
|
||||
<string name="install_next">ต่อไป</string>
|
||||
<string name="select_file_tip">แนะนำให้ใช้อิมเมจพาร์ติชัน %1$s</string>
|
||||
<string name="select_kmi">เลือก KMI</string>
|
||||
<string name="shrink_sparse_image">ลดความกระจายของอิมเมจ</string>
|
||||
<string name="shrink_sparse_image_message">ปรับขนาดความกระจายของอิมเมจในโมดูลให้เป็นขนาดจริง โปรดทราบว่านี่อาจทำให้โมดูลทำงานผิดปกติ โปรดใช้เมื่อจำเป็นเท่านั้น (เช่น การสำรองข้อมูล)</string>
|
||||
<string name="settings_uninstall">ถอนการติดตั้ง</string>
|
||||
<string name="settings_uninstall_temporary">ถอนการติดตั้งชั่วคราว</string>
|
||||
<string name="settings_uninstall_permanent">ถอนการติดตั้งถาวร</string>
|
||||
<string name="settings_restore_stock_image">เรียกคืนอิมเมจดั้งเดิม</string>
|
||||
<string name="settings_uninstall_temporary_message">ถอนการติดตั้ง KernelSU Next ชั่วคราว จะคืนค่าเป็นสถานะดั้งเดิมหลังจากรีบูตในครั้งถัดไป</string>
|
||||
<string name="settings_uninstall_permanent_message">การถอนการติดตั้ง KernelSU Next (การรูทและโมดูลทั้งหมด) อย่างสมบูรณ์โดยถาวร</string>
|
||||
<string name="settings_restore_stock_image_message">คืนค่าโรงงานอิมเมจดั้งเดิม (หากมีข้อมูลสำรอง) ส่วนใหญ่มักใช้ก่อนทำการ OTA ซึ่งหากคุณต้องการถอนการติดตั้ง KernelSU Next โปรดใช้ \"ถอนการติดตั้งถาวร\"</string>
|
||||
<string name="flashing">กำลังแฟลช</string>
|
||||
<string name="flash_success">แฟลชสำเร็จ</string>
|
||||
<string name="flash_failed">แฟลชล้มเหลว</string>
|
||||
<string name="selected_lkm">เลือก LKM: %s</string>
|
||||
<string name="save_log">บันทึกไฟล์ Logs</string>
|
||||
<string name="log_saved">บันทึกไฟล์ Logs แล้ว</string>
|
||||
<string name="send_log">แชร์ไฟล์ Logs</string>
|
||||
</resources>
|
||||
179
manager/app/src/main/res/values-tr/strings.xml
Normal file
179
manager/app/src/main/res/values-tr/strings.xml
Normal file
@@ -0,0 +1,179 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
<string name="issue_report_title">Sorun mu yaşıyorsunuz?</string>
|
||||
<string name="issue_report_body">Bir hata mı buldunuz veya geri bildirimde mi bulunmak istiyorsunuz?</string>
|
||||
<string name="issue_report_body_2">Hemen bildirin!</string>
|
||||
<string name="issue_report_github">GitHub\'da Bildir</string>
|
||||
<string name="issue_report_telegram">Telegram\'dan İletişime Geçin</string>
|
||||
<string name="issue_report_github_link">https://github.com/KernelSU-Next/KernelSU-Next/issues</string>
|
||||
<string name="issue_report_telegram_link">https://t.me/ksunext</string>
|
||||
<string name="confirm">Onayla</string>
|
||||
<string name="app_name" translatable="false">KernelSU Next</string>
|
||||
<string name="home">Ana Sayfa</string>
|
||||
<string name="home_not_installed">Yüklenmedi</string>
|
||||
<string name="home_click_to_install">Yüklemek için tıklayın</string>
|
||||
<string name="home_working">Çalışıyor</string>
|
||||
<string name="home_working_version">Sürüm: %d</string>
|
||||
<string name="home_superuser_count">Süper kullanıcılar: %d</string>
|
||||
<string name="home_module_count">Modüller: %d</string>
|
||||
<string name="home_failure">KernelSU Next v2 imzası çekirdek içinde bulunamadı! [ !KSU_NEXT || != boyut/hash ]</string>
|
||||
<string name="home_failure_tip">Çekirdek geliştiricinizden KernelSU Next\'i entegre etmesini isteyin!</string>
|
||||
<string name="home_kernel">Çekirdek sürümü</string>
|
||||
<string name="home_susfs">SuSFS: %s</string>
|
||||
<string name="home_susfs_version">SuSFS sürümü</string>
|
||||
<string name="home_susfs_sus_su">SuS SU</string>
|
||||
<string name="home_android">Android sürümü</string>
|
||||
<string name="home_manager_version">Yönetici sürümü</string>
|
||||
<string name="home_selinux_status">SELinux durumu</string>
|
||||
<string name="selinux_status_disabled">Devre dışı</string>
|
||||
<string name="selinux_status_enforcing">Zorlanıyor (Enforcing)</string>
|
||||
<string name="selinux_status_permissive">Serbest (Permissive)</string>
|
||||
<string name="selinux_status_unknown">Bilinmiyor</string>
|
||||
<string name="superuser">SüperKullanıcı</string>
|
||||
<string name="module_failed_to_enable">Modül etkinleştirilemedi: %s</string>
|
||||
<string name="module_failed_to_disable">Modül devre dışı bırakılamadı: %s</string>
|
||||
<string name="module_empty">Yüklü modül yok</string>
|
||||
<string name="module">Modüller</string>
|
||||
<string name="module_install_prompt_with_name">%1$s modülünü yüklemeye devam etmek istiyor musunuz?</string>
|
||||
<string name="module_sort_a_to_z">Sırala (A-Z)</string>
|
||||
<string name="module_sort_z_to_a">Sırala (Z-A)</string>
|
||||
<string name="uninstall">Kaldır</string>
|
||||
<string name="restore">Geri Yükle</string>
|
||||
<string name="module_install">Yükle</string>
|
||||
<string name="install">Yükle</string>
|
||||
<string name="reboot">Yeniden Başlat</string>
|
||||
<string name="settings">Ayarlar</string>
|
||||
<string name="reboot_userspace">Yumuşak Yeniden Başlat</string>
|
||||
<string name="reboot_recovery">Kurtarma Modunda Yeniden Başlat</string>
|
||||
<string name="reboot_bootloader">Bootloader\'da Yeniden Başlat</string>
|
||||
<string name="reboot_download">Download Modunda Yeniden Başlat</string>
|
||||
<string name="reboot_edl">EDL Modunda Yeniden Başlat</string>
|
||||
<string name="about">Hakkında</string>
|
||||
<string name="module_uninstall_confirm">%s modülünü kaldırmak istediğinizden emin misiniz?</string>
|
||||
<string name="module_uninstall_success">%s kaldırıldı</string>
|
||||
<string name="module_uninstall_failed">Kaldırma başarısız: %s</string>
|
||||
<string name="module_restore_confirm">%s modülünü geri yüklemek istediğinizden emin misiniz?</string>
|
||||
<string name="module_restore_success">%s geri yüklendi</string>
|
||||
<string name="module_restore_failed">Geri yükleme başarısız: %s</string>
|
||||
<string name="module_version">Sürüm</string>
|
||||
<string name="module_author">Yazar</string>
|
||||
<string name="module_overlay_fs_not_available">Modüller kullanılamıyor çünkü OverlayFS çekirdek tarafından devre dışı bırakılmış.</string>
|
||||
<string name="refresh">Yenile</string>
|
||||
<string name="show_system_apps">Sistem uygulamalarını göster</string>
|
||||
<string name="hide_system_apps">Sistem uygulamalarını gizle</string>
|
||||
<string name="export_log">Günlükleri dışa aktar</string>
|
||||
<string name="safe_mode">Güvenli Mod</string>
|
||||
<string name="reboot_to_apply">Değişikliklerin etkili olması için yeniden başlatın</string>
|
||||
<string name="module_magisk_conflict">Modüller Magisk ile çakışma nedeniyle kullanılamıyor!</string>
|
||||
<string name="home_module_mount">Modül Sistemi</string>
|
||||
<string name="home_magic_mount">Magic Mount</string>
|
||||
<string name="home_overlayfs_mount">OverlayFS</string>
|
||||
<string name="unavailable">Kullanılamaz</string>
|
||||
<string name="use_overlay_fs">OverlayFS Kullan</string>
|
||||
<string name="use_overlay_fs_summary">KernelSU Next\'in Mount sistemi için OverlayFS ile Magic Mount arasında geçiş yapın.</string>
|
||||
<string name="reboot_required">Yeniden Başlatma Gerekiyor</string>
|
||||
<string name="reboot_message">Değişiklikler sistem yeniden başlatıldıktan sonra etkili olacaktır. Şimdi yeniden başlatmak istiyor musunuz?</string>
|
||||
<string name="module_restore">Modülleri Geri Yükle</string>
|
||||
<string name="module_restore_message">Modülleri son yedekten geri yükler.</string>
|
||||
<string name="module_backup">Modülleri Yedekle</string>
|
||||
<string name="module_backup_message">Şu anda yüklü olan modülleri yedekler.</string>
|
||||
<string name="warning">Uyarı</string>
|
||||
<string name="warning_message">Bu özellik hâlâ beta aşamasında ve geliştirilme sürecinde. Lütfen devam etmeden önce modüllerinizi yedeklediğinizden emin olun. Yalnızca bu özelliğin potansiyel risklerini anlıyorsanız kullanın. Dikkatli olun.</string>
|
||||
<string name="proceed">Devam Et</string>
|
||||
<string name="cancel">İptal</string>
|
||||
<string name="later">Sonra</string>
|
||||
<string name="home_next_kernelsu">🔥 Yeni Sürüm</string>
|
||||
<string name="home_next_kernelsu_repo">https://github.com/KernelSU-Next/KernelSU-Next</string>
|
||||
<string name="home_next_kernelsu_body">Son deneysel dal. GitHub\'da kontrol edin!</string>
|
||||
<string name="home_experimental_kernelsu">⚠️ Deneysel Geliştirme Uyarısı!</string>
|
||||
<string name="home_experimental_kernelsu_repo">127.0.0.1</string>
|
||||
<string name="home_experimental_kernelsu_body">KernelSU Next resmi olmayan bir sürümdür ve her zaman aktif deneysel geliştirme altındadır. Stabilite, performans veya güvenilirlik garantisi verilmez.</string>
|
||||
<string name="home_experimental_kernelsu_body_point_1"> • Risk aldığınızı bilerek kullanın: Çökme, beklenmeyen davranış veya sistem sorunları olabilir.</string>
|
||||
<string name="home_experimental_kernelsu_body_point_2"> • Garanti verilmez: geliştiriciler, bunun kullanımı sonucu oluşabilecek veri kaybı, sistem hasarı veya diğer sonuçlardan sorumlu değildir.</string>
|
||||
<string name="home_experimental_kernelsu_body_point_3"> • Test amaçlıdır: yalnızca riskleri anlayan ve sorun giderme konusunda rahat olan kullanıcılar için tasarlanmıştır.</string>
|
||||
<string name="about_source_code"><![CDATA[Kaynak kodu şu adreste görüntüleyin: %1$s]]></string>
|
||||
<string name="profile" translatable="false">Uygulama Profili</string>
|
||||
<string name="profile_default">Varsayılan</string>
|
||||
<string name="profile_template">Şablon</string>
|
||||
<string name="profile_custom">Özel</string>
|
||||
<string name="profile_name">Profil Adı</string>
|
||||
<string name="profile_namespace">Ad Alanını Bağla</string>
|
||||
<string name="profile_namespace_inherited">Kalıtsal</string>
|
||||
<string name="profile_namespace_global">Küresel</string>
|
||||
<string name="profile_namespace_individual">Bireysel</string>
|
||||
<string name="profile_groups">Gruplar</string>
|
||||
<string name="profile_capabilities">Yetkinlikler</string>
|
||||
<string name="profile_selinux_context">SELinux Bağlamı</string>
|
||||
<string name="profile_umount_modules">Modüllerin Bağlantısını kes</string>
|
||||
<string name="failed_to_update_app_profile">%s için uygulama profili güncellenemedi.</string>
|
||||
<string name="require_kernel_version">Mevcut KernelSU Next sürümü %1$d, yöneticinin düzgün çalışması için çok düşük. Lütfen sürümü %2$d veya daha yüksek bir sürüme yükseltin!</string>
|
||||
<string name="settings_umount_modules_default">Varsayılan olarak modüllerin bağlantısını kes</string>
|
||||
<string name="settings_umount_modules_default_summary">Uygulama profilindeki \"Modüllerin bağlantısını kes\" seçeneği için varsayılan değer. Etkinleştirilirse, profil ayarı yapılmamış uygulamalar için modüllerin sistemde yaptığı tüm değişiklikler kaldırılacaktır.</string>
|
||||
<string name="settings_susfs_toggle">Kprobe kancalarını gizle</string>
|
||||
<string name="settings_susfs_toggle_summary">Kprobe kancalarını devre dışı bırakır ve bunun yerine gömülü olmayan kancaları etkinleştirir. Bu, kprobe\'yi desteklemeyen bir çekirdek için uygulanacak aynı işlevselliği sağlar.</string>
|
||||
<string name="profile_umount_modules_summary">Bu seçeneği etkinleştirmek, KernelSU Next\'in bu uygulama için modüller tarafından değiştirilmiş herhangi bir dosyayı geri yüklemesini sağlar.</string>
|
||||
<string name="profile_selinux_domain">İsim Alanı</string>
|
||||
<string name="profile_selinux_rules">Kurallar</string>
|
||||
<string name="module_update">Güncelle</string>
|
||||
<string name="module_downloading">Modül indiriliyor: %s</string>
|
||||
<string name="module_start_downloading">İndirme başlatılıyor: %s</string>
|
||||
<string name="new_version_available">Yeni sürüm %s mevcut, güncellemek için tıklayın.</string>
|
||||
<string name="launch_app">Uygulamayı başlat</string>
|
||||
<string name="close">Kapat</string>
|
||||
<string name="force_stop_app">Uygulamayı durmaya zorla</string>
|
||||
<string name="restart_app">Uygulamayı yeniden başlat</string>
|
||||
<string name="failed_to_update_sepolicy">%s için SELinux kuralları güncellenemedi.</string>
|
||||
<string name="module_changelog">Değişiklik Günlüğü</string>
|
||||
<string name="settings_profile_template">Uygulama Profili Şablonu</string>
|
||||
<string name="settings_profile_template_summary">Yerel ve çevrimiçi Uygulama Profili şablonlarını yönetin</string>
|
||||
<string name="app_profile_template_create">Şablon oluştur</string>
|
||||
<string name="app_profile_template_edit">Şablonu düzenle</string>
|
||||
<string name="app_profile_template_id">ID</string>
|
||||
<string name="app_profile_template_id_invalid">Geçersiz şablon ID\'si</string>
|
||||
<string name="app_profile_template_name">İsim</string>
|
||||
<string name="app_profile_template_description">Açıklama</string>
|
||||
<string name="app_profile_template_save">Kaydet</string>
|
||||
<string name="app_profile_template_delete">Sil</string>
|
||||
<string name="app_profile_template_view">Şablonu görüntüle</string>
|
||||
<string name="app_profile_template_readonly">Salt okunur</string>
|
||||
<string name="app_profile_template_id_exist">Şablon ID\'si zaten mevcut!</string>
|
||||
<string name="app_profile_import_export">İçe/Dışa Aktar</string>
|
||||
<string name="app_profile_import_from_clipboard">Panodan içe aktar</string>
|
||||
<string name="app_profile_export_to_clipboard">Panoya dışa aktar</string>
|
||||
<string name="app_profile_template_export_empty">Dışa aktarılacak yerel şablon bulunamadı!</string>
|
||||
<string name="app_profile_template_import_success">Başarıyla içe aktarıldı</string>
|
||||
<string name="app_profile_template_sync">Çevrimiçi şablonları senkronize et</string>
|
||||
<string name="app_profile_template_save_failed">Şablon kaydedilemedi</string>
|
||||
<string name="app_profile_template_import_empty">Pano boş!</string>
|
||||
<string name="module_changelog_failed">%s için değişiklik günlüğü alınamadı.</string>
|
||||
<string name="settings_check_update">Güncellemeleri kontrol et</string>
|
||||
<string name="settings_check_update_summary">Başlangıçta otomatik olarak güncellemeleri kontrol et.</string>
|
||||
<string name="grant_root_failed">Root yetkisi verilemedi!</string>
|
||||
<string name="action">Eylem</string>
|
||||
<string name="open">Aç</string>
|
||||
<string name="enable_web_debugging">WebView hata ayıklamayı etkinleştir</string>
|
||||
<string name="enable_web_debugging_summary">WebUI\'da hata ayıklamak için kullanılabilir. Lütfen yalnızca gerektiğinde etkinleştirin.</string>
|
||||
<string name="direct_install">Doğrudan yükleme (Önerilen)</string>
|
||||
<string name="select_file">Bir dosya seç</string>
|
||||
<string name="install_inactive_slot">Pasif bölüme yükle (OTA sonrası)</string>
|
||||
<string name="install_inactive_slot_warning">Cihazınız bir sonraki yeniden başlatmada **ZORUNLU** olarak mevcut pasif bölüme önyükleme yapacaktır!\nBu seçeneği yalnızca OTA işlemi tamamlandıktan sonra kullanın.\nDevam edilsin mi?</string>
|
||||
<string name="install_next">İleri</string>
|
||||
<string name="select_file_tip">%1$s bölüm görüntüsü önerilir</string>
|
||||
<string name="select_kmi">KMI seç</string>
|
||||
<string name="shrink_sparse_image">Sparse imajını küçült</string>
|
||||
<string name="shrink_sparse_image_message">Modüllerin bulunduğu sparse imajını gerçek boyutuna yeniden boyutlandırın. Bunun modüllerin anormal çalışmasına neden olabileceğini unutmayın, bu yüzden yalnızca gerektiğinde kullanın (Örneğin yedekleme için).</string>
|
||||
<string name="settings_uninstall">Kaldır</string>
|
||||
<string name="settings_uninstall_temporary">Geçici olarak kaldır</string>
|
||||
<string name="settings_uninstall_permanent">Kalıcı olarak kaldır</string>
|
||||
<string name="settings_restore_stock_image">Stok görüntüyü geri yükle</string>
|
||||
<string name="settings_uninstall_temporary_message">KernelSU Next\'i geçici olarak kaldırın, bir sonraki yeniden başlatmadan sonra orijinal duruma geri döner.</string>
|
||||
<string name="settings_uninstall_permanent_message">KernelSU Next\'i (Root ve tüm modüller) tamamen ve kalıcı olarak kaldır.</string>
|
||||
<string name="settings_restore_stock_image_message">Stok fabrika görüntüsünü geri yükle (Eğer bir yedek varsa), genellikle OTA\'dan önce kullanılır; KernelSU Next\'i kaldırmanız gerekiyorsa lütfen \"Kalıcı olarak kaldır\" seçeneğini kullanın.</string>
|
||||
<string name="flashing">Yükleniyor</string>
|
||||
<string name="flash_success">Yükleme başarılı</string>
|
||||
<string name="flash_failed">Yükleme başarısız</string>
|
||||
<string name="selected_lkm">Seçilen LKM: %s</string>
|
||||
<string name="save_log">Günlükleri kaydet</string>
|
||||
<string name="log_saved">Günlükler kaydedildi</string>
|
||||
<string name="send_log">Günlükleri paylaş</string>
|
||||
</resources>
|
||||
190
manager/app/src/main/res/values-vi/strings.xml
Normal file
190
manager/app/src/main/res/values-vi/strings.xml
Normal file
@@ -0,0 +1,190 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
<string name="issue_report_title">Đang gặp sự cố?</string>
|
||||
<string name="issue_report_body">Muốn báo cáo lỗi hoặc góp ý?</string>
|
||||
<string name="issue_report_body_2">Báo cáo hoặc góp ý nhanh nhất có thể!</string>
|
||||
<string name="issue_report_github">Báo cáo trên GitHub</string>
|
||||
<string name="issue_report_telegram">Liên hệ qua Telegram</string>
|
||||
<string name="issue_report_github_link">https://github.com/KernelSU-Next/KernelSU-Next/issues</string>
|
||||
<string name="issue_report_telegram_link">https://t.me/ksunext</string>
|
||||
<string name="confirm">Xác nhận</string>
|
||||
<string name="app_name" translatable="false">KernelSU Next</string>
|
||||
<string name="home">Màn hình chính</string>
|
||||
<string name="home_not_installed">Chưa cài đặt</string>
|
||||
<string name="home_click_to_install">Bấm để cái đặt</string>
|
||||
<string name="home_working">Đã cài đặt và hoạt động</string>
|
||||
<string name="home_working_version">Phiên bản: %d</string>
|
||||
<string name="home_superuser_count">Ứng dụng đã cấp su: %d</string>
|
||||
<string name="home_module_count">Modules: %d</string>
|
||||
<string name="home_failure">Chữ kí KernelSU Next v2 Không dược tìm thấy (chưa cài đặt,nhúng sai cách hoặc nhầm trình quản lý?) [ !KSU_NEXT || != size/hash ]</string>
|
||||
<string name="home_failure_tip">Hỏi hoặc tự nhúng nhân KernelSU Next vào Kernel của bạn!</string>
|
||||
<string name="home_kernel">Phiên bản kernel</string>
|
||||
<string name="home_susfs">SuSFS: %s</string>
|
||||
<string name="home_susfs_version">Phiên bản SuSFS</string>
|
||||
<string name="home_susfs_sus_su">SuS SU</string>
|
||||
<string name="home_android">Phiên bản android</string>
|
||||
<string name="home_manager_version">Phiên bản trình quản lý</string>
|
||||
<string name="home_selinux_status">Trạng thái SELinux</string>
|
||||
<string name="selinux_status_disabled">Vô hiệu hoá</string>
|
||||
<string name="selinux_status_enforcing">Enforcing</string>
|
||||
<string name="selinux_status_permissive">Permissive</string>
|
||||
<string name="selinux_status_unknown">Chịu</string>
|
||||
<string name="superuser">Superuser</string>
|
||||
<string name="module_failed_to_enable">Không thể kích hoạt module: %s</string>
|
||||
<string name="module_failed_to_disable">Không thể vô hiệu hoá module: %s</string>
|
||||
<string name="module_empty">Chưa cài module nào</string>
|
||||
<string name="module">Module</string>
|
||||
<string name="module_install_prompt_with_name">Bạn có THẬT SỰ muốn cài module này không (kiểm tra trước khi cài ASAF) %1$s?</string>
|
||||
<string name="module_sort_a_to_z">Sắp xếp (A-Z)</string>
|
||||
<string name="module_sort_z_to_a">Sắp xếp (Z-A)</string>
|
||||
<string name="uninstall">Gỡ cài đặt</string>
|
||||
<string name="restore">Khôi phục</string>
|
||||
<string name="module_install">Cài đặt</string>
|
||||
<string name="install">Cài đặt</string>
|
||||
<string name="reboot">Khởi động lại</string>
|
||||
<string name="settings">Cài đặt</string>
|
||||
<string name="reboot_userspace">Khởi động lại systemctrl</string>
|
||||
<string name="reboot_recovery">Vào Recovery</string>
|
||||
<string name="reboot_bootloader">Vào Bootloader</string>
|
||||
<string name="reboot_download">Vào Download Mode</string>
|
||||
<string name="reboot_edl">Vào EDL</string>
|
||||
<string name="about">Thông tin</string>
|
||||
<string name="module_uninstall_confirm">Bạn có THẬT SỰ muốn gỡ module %s?</string>
|
||||
<string name="module_uninstall_success">%s đã được gỡ</string>
|
||||
<string name="module_uninstall_failed">Gỡ cài đặt thất bại: %s</string>
|
||||
<string name="module_restore_confirm">Khôi phục module lại như lúc cài %s?</string>
|
||||
<string name="module_restore_success">%s đã khôi phục</string>
|
||||
<string name="module_restore_failed">Khôi phục thất bại, vui lòng cài lại : %s</string>
|
||||
<string name="module_version">Phiên bản</string>
|
||||
<string name="module_author">Người tạo ra</string>
|
||||
<string name="module_id">ID</string>
|
||||
<string name="module_version_code">Code</string>
|
||||
<string name="module_update_json">UpdateJson</string>
|
||||
<string name="module_update_json_empty">Trống</string>
|
||||
<string name="enable_developer_options">Kích hoạt tính năng dành cho nhà phát triển</string>
|
||||
<string name="enable_developer_options_summary">Hiện thị những cài đặt ẩn và nhũng log DÀNH RIÊNG CHO NHÀ PHÁT TRIỂN.</string>
|
||||
<string name="module_overlay_fs_not_available">Không thể sử dụng module vì flag Overlayfs không được kích hoạt trong kernel, vui lòng kích hoạt</string>
|
||||
<string name="refresh">Làm mới</string>
|
||||
<string name="show_system_apps">Hiện thị ứng dụng hệ thống</string>
|
||||
<string name="hide_system_apps">Ẩn ứng dụng hệ thống</string>
|
||||
<string name="export_log">Xuất logs</string>
|
||||
<string name="safe_mode">CHẾ ĐỘ AN TOÀN!?!?</string>
|
||||
<string name="reboot_to_apply">Khởi động lại để có hiệu lực</string>
|
||||
<string name="module_magisk_conflict">Vui lòng gỡ magisk để sử dụng module</string>
|
||||
<string name="home_module_mount">Module hệ thống</string>
|
||||
<string name="home_magic_mount">Magic Mount</string>
|
||||
<string name="home_overlayfs_mount">OverlayFS</string>
|
||||
<string name="unavailable">Không có sẵn</string>
|
||||
<string name="use_overlay_fs">Sử dụng OverlayFS</string>
|
||||
<string name="use_overlay_fs_summary">Gạt bật tắt chuyển giữa phương thức OverlayFS và Magic Mount cho các tập mount hệ thống.</string>
|
||||
<string name="reboot_required">Yêu cầu khởi động lại</string>
|
||||
<string name="reboot_message">Một/Nhiều thay đổi cần được khởi động lại hệ thống, khởi động luôn?</string>
|
||||
<string name="module_restore">Khôi phục module</string>
|
||||
<string name="module_restore_message">Khôi phục modules từ bản sao lưu gần nhất.</string>
|
||||
<string name="backup_restore">Sao lưu & Khôi phục</string>
|
||||
<string name="module_backup">Sao lưu module</string>
|
||||
<string name="module_backup_message">Sao lưu những module đang được cài đặt.</string>
|
||||
<string name="allowlist_restore">Khôi phục danh sách ngoại trừ</string>
|
||||
<string name="allowlist_restore_message">Khôi phục danh sách ngoại trừ từ bản sao lưu gần nhất</string>
|
||||
<string name="allowlist_backup">Sao lưu danh sách ngoại trừ</string>
|
||||
<string name="allowlist_backup_message">Sao lưu danh sách ngoại trừ từ bản sao lưu gần nhất</string>
|
||||
<string name="warning">LƯU Ý!!!</string>
|
||||
<string name="warning_message">Tính năng này vẫn đang trong giai đoạn thử nghiệm, chỉ sử dụng khi bạn chịu trách nghiệm và đủ hiểu biết </string>
|
||||
<string name="proceed">Tiếp tục</string>
|
||||
<string name="cancel">Huỷ</string>
|
||||
<string name="later">Để sau</string>
|
||||
<string name="home_next_kernelsu">🔥 Bản dựng tiếp theo</string>
|
||||
<string name="home_next_kernelsu_repo">https://github.com/KernelSU-Next/KernelSU-Next</string>
|
||||
<string name="home_next_kernelsu_body">Nhánh thử nghiệm tiếp theo. Xem trong GitHub!</string>
|
||||
<string name="home_experimental_kernelsu">⚠️ Cảnh báo nhánh thử nghiệm cho nhà phát triển!</string>
|
||||
<string name="home_experimental_kernelsu_repo">127.0.0.1</string>
|
||||
<string name="home_experimental_kernelsu_body">KernelSU Next là 1 nhánh của KernelSU luôn có những nhánh thử nghiệm và cập nhật hàng ngày, nó có thể không ổn định</string>
|
||||
<string name="home_experimental_kernelsu_body_point_1"> • Tự chịu trách nghiệm: crashes, những thứ kì lạ, không vào được 1 vài ứng dụng,... có thể diễn ra.</string>
|
||||
<string name="home_experimental_kernelsu_body_point_2"> • Không bảo hành: Những nhà phát triển trong KernelSU (Next) và bên ngoài sẽ không chịu trách nghiệm khi hardbrick,bootloop,mất dữ liệu,... .</string>
|
||||
<string name="home_experimental_kernelsu_body_point_3"> • Đùng để thử nghiệm là chính: Chỉ dành cho những người có kĩ năng, kinh nghiệm, trải nghiệm .</string>
|
||||
<string name="about_source_code"><![CDATA[Xem mã nguồn tại %1$s]]></string>
|
||||
<string name="profile" translatable="false">Hồ sơ ứng dụng</string>
|
||||
<string name="profile_default">Mặc định</string>
|
||||
<string name="profile_template">Mẫu</string>
|
||||
<string name="profile_custom">Tuỳ biến</string>
|
||||
<string name="profile_name">Tên hồ sơ</string>
|
||||
<string name="profile_namespace">Mount namespace</string>
|
||||
<string name="profile_namespace_inherited">Thừa hưởng</string>
|
||||
<string name="profile_namespace_global">Chung</string>
|
||||
<string name="profile_namespace_individual">Riêng biệt</string>
|
||||
<string name="profile_groups">Nhóm</string>
|
||||
<string name="profile_capabilities">Tính tương thích</string>
|
||||
<string name="profile_selinux_context">Nội dung của SELinux</string>
|
||||
<string name="profile_umount_modules">Umount modules</string>
|
||||
<string name="failed_to_update_app_profile">Cập nhật hồ sơ ứng dụng thất bại cho %s</string>
|
||||
<string name="require_kernel_version">Phiên bản KernelSU Next được nhúng trong kernel là %1$d và nó quá thấp để trình quản lý hoạt động. Vui lòng cập nhật lên phiên bản %2$d hoặc!</string>
|
||||
<string name="settings_umount_modules_default">Umount modules cho toàn hệ thống</string>
|
||||
<string name="settings_umount_modules_default_summary">Giá trị mặc định chung cho \"Umount modules\" trong hồ sơ ứng dụng. Nếu bật, tất cả nhưng module có can thiệp/thay đổi hệ thống sẽ không đổi trừ khi được kích hoạt trong hồ sơ ứng dụng riêng biệt. (modder oem rom hoặc những người muốn chép file vào phân vùng hệ thống nên tắt).</string>
|
||||
<string name="settings_susfs_toggle">Ẩn kprobe hooks</string>
|
||||
<string name="settings_susfs_toggle_summary">Tính năng này sẽ vô hiệu hoá những kprobe hooks đã tạo bởi kernelsu và sẽ kích hoạt và nhúng những non-kprobe hooks,đảm bảo những kernel non-GKI(EOL) hoạt động ổn định.</string>
|
||||
<string name="profile_umount_modules_summary">Kích hoạt tính năng này sẽ tách các ứng dụng chưa cấp hồ sơ riêng và root.</string>
|
||||
<string name="profile_selinux_domain">Tên miền</string>
|
||||
<string name="profile_selinux_rules">Luật</string>
|
||||
<string name="module_update">Có cập nhật!</string>
|
||||
<string name="module_downloading">Tải xuống module: %s</string>
|
||||
<string name="module_start_downloading">Đang tải xuống module: %s</string>
|
||||
<string name="new_version_available">Phiên bản %s đã ra mắt, bấm để cập nhật.</string>
|
||||
<string name="launch_app">Mở</string>
|
||||
<string name="close">Đóng</string>
|
||||
<string name="force_stop_app">Buốc tắt</string>
|
||||
<string name="restart_app">Khởi động lại</string>
|
||||
<string name="failed_to_update_sepolicy">Cập nhất luật SELinux thất bại cho: %s</string>
|
||||
<string name="module_changelog">Nhật kí thay đổi</string>
|
||||
<string name="settings_profile_template">Mẫu hồ sơ ứng dụng</string>
|
||||
<string name="settings_profile_template_summary">Quản lý/Tải xuống trực tuyến hồ sơ ứng dụng</string>
|
||||
<string name="app_profile_template_create">Tạo mẫu hồ sơ ứng dụng</string>
|
||||
<string name="app_profile_template_edit">Sửa mẫu hồ sơ ứng dụng</string>
|
||||
<string name="app_profile_template_id">ID</string>
|
||||
<string name="app_profile_template_id_invalid">ID mẫu không hợp lệ/tồn tại</string>
|
||||
<string name="app_profile_template_name">Tên</string>
|
||||
<string name="app_profile_template_description">Chi tiết</string>
|
||||
<string name="app_profile_template_save">Lưu</string>
|
||||
<string name="app_profile_template_delete">Xoá</string>
|
||||
<string name="app_profile_template_view">Xem mẫu hồ sơ ứng dụng</string>
|
||||
<string name="app_profile_template_readonly">Chỉ đọc</string>
|
||||
<string name="app_profile_template_id_exist">ID mẫu hồ sơ ứng dụng đã tồn tại</string>
|
||||
<string name="app_profile_import_export">Nhập/Xuất</string>
|
||||
<string name="app_profile_import_from_clipboard">Nhập từ bảng nhớ</string>
|
||||
<string name="app_profile_export_to_clipboard">Xuất đến bảng nhớ</string>
|
||||
<string name="app_profile_template_export_empty">Không tìm thấy hồ sơ ứng dụng nội bộ!</string>
|
||||
<string name="app_profile_template_import_success">Nhập thành công</string>
|
||||
<string name="app_profile_template_sync">Đồng bộ với hồ sơ ứng dụng trực tuyến</string>
|
||||
<string name="app_profile_template_save_failed">Lưu hồ sơ ứng dụng thất bại</string>
|
||||
<string name="app_profile_template_import_empty">Bảng nhớ tạm đang trống hoặc sai thông tin!</string>
|
||||
<string name="module_changelog_failed">Đọc nhất kí thay đôi thất bại: %s</string>
|
||||
<string name="settings_check_update">Kiểm tra cập nhật</string>
|
||||
<string name="settings_check_update_summary">Tự động kiểm tra cập nhật khi mở ứng dụng.</string>
|
||||
<string name="grant_root_failed">Cấp quyền root thất bại!</string>
|
||||
<string name="action">Chạy</string>
|
||||
<string name="open">Mở</string>
|
||||
<string name="enable_web_debugging">Kích hoạt WebView debugging</string>
|
||||
<string name="enable_web_debugging_summary">Sử dụng để debug WebUI. Sử dụng khi bạn có kinh nghiệm, kĩ năng.</string>
|
||||
<string name="direct_install">Cài đặt trực tiếp (cho GKI 2.0)</string>
|
||||
<string name="select_file">Chọn file</string>
|
||||
<string name="install_inactive_slot">Cài đặt vào phân vùng update (cho người OTA)</string>
|
||||
<string name="install_inactive_slot_warning">Thiết bị của bạn sẽ BUỘC khởi động vào phân dùng chưa được sử dụng (có thể A hoặc B)\nSử dụng sau khi update OTA.\nTiếp?</string>
|
||||
<string name="install_next">Tiếp</string>
|
||||
<string name="select_file_tip">tập tin %1$s được khuyến kích</string>
|
||||
<string name="select_kmi">Chọn KMI</string>
|
||||
<string name="shrink_sparse_image">Nén module.img</string>
|
||||
<string name="shrink_sparse_image_message">Nén lại module.img về kích thước thực, CHỈ SỬ DỤNG KHI CÓ HIỂU BIẾT VÀ CẦN THIẾT!?!?!?!?!.</string>
|
||||
<string name="settings_uninstall">Gỡ cài đặt</string>
|
||||
<string name="settings_uninstall_temporary">Gỡ cài đặt tạm thời</string>
|
||||
<string name="settings_uninstall_permanent">Gỡ cài đặt sạch</string>
|
||||
<string name="settings_restore_stock_image">Khôi phục phân vùng khởi động về mặc định</string>
|
||||
<string name="settings_uninstall_temporary_message">Tạm thời gỡ KernelSU Next.</string>
|
||||
<string name="settings_uninstall_permanent_message">Gỡ cài đặt sạch hoàn toàn, trả về trạng thái lúc đầu .</string>
|
||||
<string name="settings_restore_stock_image_message">Khôi phục lại boot lúc đầu (nếu có); nếu bạn cần gỡ hẳn KernelSU Next, sử dụng\"Gỡ cài đặt sạch\".</string>
|
||||
<string name="flashing">Đang cài đặt</string>
|
||||
<string name="flash_success">Cài đặt thành công</string>
|
||||
<string name="flash_failed">Cài đặt thất bại</string>
|
||||
<string name="selected_lkm">Đã chọn file LKM: %s</string>
|
||||
<string name="save_log">Lưu logs</string>
|
||||
<string name="log_saved">Logs đã được lưu</string>
|
||||
<string name="send_log">Chia sẻ logs</string>
|
||||
</resources>
|
||||
@@ -1,11 +1,11 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
<string name="issue_report_title">有任何问题?</string>
|
||||
<string name="issue_report_body">遇到错误或者需要反馈?</string>
|
||||
<string name="issue_report_body_2">请尽快告知我们!</string>
|
||||
<string name="issue_report_title">遇到问题?</string>
|
||||
<string name="issue_report_body">发现错误或者有改进建议?</string>
|
||||
<string name="issue_report_body_2">快向我们报告吧!</string>
|
||||
<string name="issue_report_github">在 GitHub 报告</string>
|
||||
<string name="issue_report_telegram">通过 Telegram 联系</string>
|
||||
<string name="issue_report_github_link">https://github.com/rifsxd/KernelSU-Next/issues</string>
|
||||
<string name="issue_report_telegram">在 Telegram 联系</string>
|
||||
<string name="issue_report_github_link">https://github.com/KernelSU-Next/KernelSU-Next/issues</string>
|
||||
<string name="issue_report_telegram_link">https://t.me/ksunext</string>
|
||||
<string name="confirm">确认</string>
|
||||
<string name="app_name" translatable="false">KernelSU Next</string>
|
||||
@@ -13,12 +13,15 @@
|
||||
<string name="home_not_installed">未安装</string>
|
||||
<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_module_count">模块数: %d</string>
|
||||
<string name="home_failure">内核中未找到 KernelSU Next v2 签名! [ !KSU_NEXT || != size/hash ]</string>
|
||||
<string name="home_working_version">版本:%d</string>
|
||||
<string name="home_superuser_count">超级用户数:%d</string>
|
||||
<string name="home_module_count">模块数:%d</string>
|
||||
<string name="home_failure">内核中未找到 KernelSU Next V2 签名! [ !KSU_NEXT || != size/hash ]</string>
|
||||
<string name="home_failure_tip">请让你的内核开发人员集成 KernelSU Next!</string>
|
||||
<string name="home_kernel">内核版本</string>
|
||||
<string name="home_susfs">SuSFS:%s</string>
|
||||
<string name="home_susfs_version">SuSFS 版本</string>
|
||||
<string name="home_susfs_sus_su">SuS SU</string>
|
||||
<string name="home_android">安卓版本</string>
|
||||
<string name="home_manager_version">管理器版本</string>
|
||||
<string name="home_selinux_status">SELinux 状态</string>
|
||||
@@ -27,13 +30,13 @@
|
||||
<string name="selinux_status_permissive">宽容模式</string>
|
||||
<string name="selinux_status_unknown">未知</string>
|
||||
<string name="superuser">超级用户</string>
|
||||
<string name="module_failed_to_enable">无法启用模块: %s</string>
|
||||
<string name="module_failed_to_disable">无法禁用模块: %s</string>
|
||||
<string name="module_failed_to_enable">无法启用模块:%s</string>
|
||||
<string name="module_failed_to_disable">无法禁用模块:%s</string>
|
||||
<string name="module_empty">没有安装模块</string>
|
||||
<string name="module">模块</string>
|
||||
<string name="module_install_prompt_with_name">是否要继续安装模块 %1$s ?</string>
|
||||
<string name="module_sort_a_to_z">按 A - Z 排序</string>
|
||||
<string name="module_sort_z_to_a">按 Z - A 排序</string>
|
||||
<string name="module_sort_a_to_z">按 A-Z 排序</string>
|
||||
<string name="module_sort_z_to_a">按 Z-A 排序</string>
|
||||
<string name="uninstall">卸载</string>
|
||||
<string name="restore">恢复</string>
|
||||
<string name="module_install">安装</string>
|
||||
@@ -48,46 +51,57 @@
|
||||
<string name="about">关于</string>
|
||||
<string name="module_uninstall_confirm">确定要卸载模块 %s 吗?</string>
|
||||
<string name="module_uninstall_success">%s 已卸载</string>
|
||||
<string name="module_uninstall_failed">卸载失败: %s</string>
|
||||
<string name="module_uninstall_failed">卸载失败:%s</string>
|
||||
<string name="module_restore_confirm">你确定要恢复模块 %s 吗?</string>
|
||||
<string name="module_restore_success">%s 已恢复</string>
|
||||
<string name="module_restore_failed">恢复失败: %s</string>
|
||||
<string name="module_restore_failed">恢复失败:%s</string>
|
||||
<string name="module_version">版本</string>
|
||||
<string name="module_author">作者</string>
|
||||
<string name="module_id">模块标识</string>
|
||||
<string name="module_version_code">模块版本</string>
|
||||
<string name="module_update_json">更新配置</string>
|
||||
<string name="module_update_json_empty">无更新配置</string>
|
||||
<string name="enable_developer_options">启用开发者模式</string>
|
||||
<string name="enable_developer_options_summary">显示隐藏的开发者专用设置和调试信息</string>
|
||||
<string name="module_overlay_fs_not_available">OverlayFS 被内核禁用,模块不可用。</string>
|
||||
<string name="refresh">刷新</string>
|
||||
<string name="show_system_apps">显示系统应用</string>
|
||||
<string name="hide_system_apps">隐藏系统应用</string>
|
||||
<string name="send_log">发送日志</string>
|
||||
<string name="export_log">导出日志</string>
|
||||
<string name="safe_mode">安全模式</string>
|
||||
<string name="reboot_to_apply">重启生效</string>
|
||||
<string name="module_magisk_conflict">由于与 Magisk 有冲突,所有模块不可用!</string>
|
||||
<string name="module_magisk_conflict">由于与 Magisk 冲突,模块不可用。</string>
|
||||
<string name="home_module_mount">模块系统</string>
|
||||
<string name="home_magic_mount">Magic Mount</string>
|
||||
<string name="home_overlayfs_mount">OverlayFS</string>
|
||||
<string name="unavailable">不可用</string>
|
||||
<string name="use_overlay_fs">使用 OverlayFS (Beta)</string>
|
||||
<string name="use_overlay_fs_summary">对于 KernelSU Next 的挂载系统,在使用 OverlayFS 和 Magic Mount 之间进行切换。</string>
|
||||
<string name="use_overlay_fs">使用 OverlayFS(实验性)</string>
|
||||
<string name="use_overlay_fs_summary">在 OverlayFS 和 Magic Mount 两种挂载系统之间进行切换。</string>
|
||||
<string name="reboot_required">需要重启</string>
|
||||
<string name="reboot_message">更改将在重启系统后生效。您想现在重启吗?</string>
|
||||
<string name="module_restore">恢复模块</string>
|
||||
<string name="module_restore_message">从备份中恢复模块。</string>
|
||||
<string name="backup_restore">备份 & 恢复</string>
|
||||
<string name="allowlist_restore">恢复超级用户列表</string>
|
||||
<string name="allowlist_restore_message">从最近的备份中恢复超级用户列表</string>
|
||||
<string name="allowlist_backup">备份超级用户列表</string>
|
||||
<string name="allowlist_backup_message">备份当前的超级用户列表</string>
|
||||
<string name="module_backup">备份模块</string>
|
||||
<string name="module_backup_message">备份当前已安装的模块。</string>
|
||||
<string name="warning">警告</string>
|
||||
<string name="warning_message">此功能仍处于测试阶段且在开发中。请确保在继续之前备份您的模块。仅当您了解潜在风险时才能使用此功能。谨慎行事。</string>
|
||||
<string name="warning_message">此为尚在开发阶段的实验功能,继续操作前请确保模块已备份。使用此功能需要先了解其风险,在知晓后果的情况下谨慎操作。</string>
|
||||
<string name="proceed">继续</string>
|
||||
<string name="cancel">取消</string>
|
||||
<string name="later">稍后</string>
|
||||
<string name="home_next_kernelsu">🔥 Next 构建</string>
|
||||
<string name="home_next_kernelsu_repo">https://github.com/rifsxd/KernelSU-Next</string>
|
||||
<string name="home_next_kernelsu_repo">https://github.com/KernelSU-Next/KernelSU-Next</string>
|
||||
<string name="home_next_kernelsu_body">Next 实验性分支。在 GitHub 上查看!</string>
|
||||
<string name="home_experimental_kernelsu">⚠️ 实验性开发警告!</string>
|
||||
<string name="home_experimental_kernelsu_repo">127.0.0.1</string>
|
||||
<string name="home_experimental_kernelsu_body">KernelSU Next 是非官方版本,始终处于积极的实验开发阶段。它按原样提供,不保证稳定性、性能或可靠性。</string>
|
||||
<string name="home_experimental_kernelsu_body_point_1"> • 使用风险自负:可能会发生崩溃、意外行为或导致系统问题。</string>
|
||||
<string name="home_experimental_kernelsu_body_point_2"> • 无担保:开发人员不对因使用而产生的任何数据丢失、系统损坏或其他后果负责。</string>
|
||||
<string name="home_experimental_kernelsu_body_point_3"> • 仅用于测试目的:它适用于了解风险并能轻松解决问题的用户。</string>
|
||||
<string name="home_experimental_kernelsu_body">KernelSU Next 属于第三方版本,保持着积极的实验开发。该版本所得即所用,不保证稳定性、性能和可靠性。</string>
|
||||
<string name="home_experimental_kernelsu_body_point_1"> • 风险自担:可能会发生崩溃、意外行为或导致系统故障。</string>
|
||||
<string name="home_experimental_kernelsu_body_point_2"> • 不做保证:开发者不对数据丢失、系统损坏等问题负责。</string>
|
||||
<string name="home_experimental_kernelsu_body_point_3"> • 仅供测试:此版适合了解风险并能轻松解决问题的用户。</string>
|
||||
<string name="about_source_code"><![CDATA[在 %1$s 查看源码]]></string>
|
||||
<string name="profile" translatable="false">App Profile</string>
|
||||
<string name="profile_default">默认</string>
|
||||
@@ -103,10 +117,12 @@
|
||||
<string name="profile_selinux_context">SELinux</string>
|
||||
<string name="profile_umount_modules">卸载模块</string>
|
||||
<string name="failed_to_update_app_profile">为 %s 更新 App Profile 失败</string>
|
||||
<string name="require_kernel_version">当前 KernelSU-Next 版本 %d 过低,管理器无法正常工作,请升级内核 KernelSU-Next 版本至 %d 或以上!</string>
|
||||
<string name="require_kernel_version">当前 KernelSU Next 版本 %1$d 过低,管理器无法正常工作,请升级内核 KernelSU Next 版本至 %2$d 或以上!</string>
|
||||
<string name="settings_umount_modules_default">默认卸载模块</string>
|
||||
<string name="settings_umount_modules_default_summary">App Profile 中\"卸载模块\"的全局默认值,如果启用,将会为没有设置 Profile 的应用移除所有模块针对系统的修改。</string>
|
||||
<string name="profile_umount_modules_summary">启用后将允许 KernelSU-Next 为本应用还原被模块修改过的文件。</string>
|
||||
<string name="settings_umount_modules_default_summary">App Profile 中“卸载模块”的全局默认值,如果启用,将会为没有设置 Profile 的应用移除所有模块针对系统的修改。</string>
|
||||
<string name="settings_susfs_toggle">隐藏 Kprobe 钩子</string>
|
||||
<string name="settings_susfs_toggle_summary">禁用由 KSU 创建的 Kprobe 钩子,并使用非 Kprobe 内联钩子代替,实现方式类似于不支持 Kprobe 的非 GKI 内核。</string>
|
||||
<string name="profile_umount_modules_summary">启用后将允许 KernelSU Next 为本应用还原被模块修改过的文件。</string>
|
||||
<string name="profile_selinux_domain">域</string>
|
||||
<string name="profile_selinux_rules">规则</string>
|
||||
<string name="module_update">更新</string>
|
||||
@@ -117,21 +133,21 @@
|
||||
<string name="close">关闭</string>
|
||||
<string name="force_stop_app">强制停止</string>
|
||||
<string name="restart_app">重新启动</string>
|
||||
<string name="failed_to_update_sepolicy">为:%s 更新 SELinux 规则失败</string>
|
||||
<string name="failed_to_update_sepolicy">为 %s 更新 SELinux 规则失败</string>
|
||||
<string name="module_changelog">更新日志</string>
|
||||
<string name="settings_profile_template">App Profile 模板</string>
|
||||
<string name="settings_profile_template_summary">管理本地和在线的 App Profile 模版</string>
|
||||
<string name="app_profile_template_create">创建模版</string>
|
||||
<string name="app_profile_template_edit">编辑模版</string>
|
||||
<string name="app_profile_template_id">模板 id</string>
|
||||
<string name="app_profile_template_id_invalid">模板 id 不合法</string>
|
||||
<string name="app_profile_template_id">模板 ID</string>
|
||||
<string name="app_profile_template_id_invalid">模板 ID 不合规</string>
|
||||
<string name="app_profile_template_name">名字</string>
|
||||
<string name="app_profile_template_description">描述</string>
|
||||
<string name="app_profile_template_save">保存</string>
|
||||
<string name="app_profile_template_delete">删除</string>
|
||||
<string name="app_profile_template_view">查看模板</string>
|
||||
<string name="app_profile_template_readonly">只读</string>
|
||||
<string name="app_profile_template_id_exist">模板 id 已存在!</string>
|
||||
<string name="app_profile_template_id_exist">模板 ID 已存在!</string>
|
||||
<string name="app_profile_import_export">导入/导出</string>
|
||||
<string name="app_profile_import_from_clipboard">从剪贴板导入</string>
|
||||
<string name="app_profile_export_to_clipboard">导出到剪贴板</string>
|
||||
@@ -147,7 +163,7 @@
|
||||
<string name="action">执行</string>
|
||||
<string name="open">打开</string>
|
||||
<string name="enable_web_debugging">启用 WebView 调试</string>
|
||||
<string name="enable_web_debugging_summary">可用于调试 WebUI ,请仅在需要时启用。</string>
|
||||
<string name="enable_web_debugging_summary">可用于调试 WebUI,请仅在需要时启用。</string>
|
||||
<string name="direct_install">直接安装(推荐)</string>
|
||||
<string name="select_file">选择一个文件</string>
|
||||
<string name="install_inactive_slot">安装到未使用的槽位(OTA 后)</string>
|
||||
@@ -159,15 +175,18 @@
|
||||
<string name="shrink_sparse_image_message">将模块所在的稀疏文件镜像调整为其实际大小,注意这可能导致模块工作异常,请仅在必要时(如备份)使用</string>
|
||||
<string name="settings_uninstall">卸载</string>
|
||||
<string name="settings_uninstall_temporary">临时卸载</string>
|
||||
<string name="settings_uninstall_permanent">永久卸载</string>
|
||||
<string name="settings_uninstall_permanent">完全卸载</string>
|
||||
<string name="settings_restore_stock_image">恢复原厂镜像</string>
|
||||
<string name="settings_uninstall_temporary_message">临时卸载 KernelSU-Next,下次重启后恢复。</string>
|
||||
<string name="settings_uninstall_permanent_message">完全并永久移除 KernelSU-Next 和所有模块。</string>
|
||||
<string name="settings_restore_stock_image_message">恢复原厂镜像,一般在 OTA 前使用;如需卸载请使用“永久卸载”。</string>
|
||||
<string name="settings_uninstall_temporary_message">临时卸载 KernelSU Next,下次重启后恢复。</string>
|
||||
<string name="settings_uninstall_permanent_message">彻底移除 KernelSU Next 和所有模块。</string>
|
||||
<string name="settings_restore_stock_image_message">恢复原厂镜像,一般在 OTA 前使用;如需卸载请使用“完全卸载”。</string>
|
||||
<string name="flashing">刷写中</string>
|
||||
<string name="flash_success">刷写成功</string>
|
||||
<string name="flash_failed">刷写失败</string>
|
||||
<string name="selected_lkm">选择的 LKM: %s</string>
|
||||
<string name="selected_lkm">选择的 LKM:%s</string>
|
||||
<string name="save_log">保存日志</string>
|
||||
<string name="log_saved">日志已保存</string>
|
||||
</resources>
|
||||
<string name="send_log">分享日志</string>
|
||||
<string name="settings_disable_su">关闭 su 兼容</string>
|
||||
<string name="settings_disable_su_summary">临时禁止任何应用通过 su 命令获取 root 权限(已运行的 root 进程不受影响)</string>
|
||||
</resources>
|
||||
|
||||
176
manager/app/src/main/res/values-zh-rTW/strings.xml
Normal file
176
manager/app/src/main/res/values-zh-rTW/strings.xml
Normal file
@@ -0,0 +1,176 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
<string name="issue_report_title">有任何問題?</string>
|
||||
<string name="issue_report_body">遇到錯誤或者需要反饋?</string>
|
||||
<string name="issue_report_body_2">請儘快告知我們!</string>
|
||||
<string name="issue_report_github">在 GitHub 回報</string>
|
||||
<string name="issue_report_telegram">透過 Telegram 聯繫</string>
|
||||
<string name="issue_report_github_link">https://github.com/KernelSU-Next/KernelSU-Next/issues</string>
|
||||
<string name="issue_report_telegram_link">https://t.me/ksunext</string>
|
||||
<string name="confirm">確認</string>
|
||||
<string name="app_name" translatable="false">KernelSU Next</string>
|
||||
<string name="home">主頁</string>
|
||||
<string name="home_not_installed">未安裝</string>
|
||||
<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_module_count">模組數: %d</string>
|
||||
<string name="home_failure">內核中未找到 KernelSU Next v2 簽名! [ !KSU_NEXT || != size/hash ]</string>
|
||||
<string name="home_failure_tip">請讓你的內核開發人員整合 KernelSU Next!</string>
|
||||
<string name="home_kernel">內核版本</string>
|
||||
<string name="home_android">Android 版本</string>
|
||||
<string name="home_manager_version">管理器版本</string>
|
||||
<string name="home_selinux_status">SELinux 狀態</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>
|
||||
<string name="superuser">超級使用者</string>
|
||||
<string name="module_failed_to_enable">無法啟用模組: %s</string>
|
||||
<string name="module_failed_to_disable">無法禁用模組: %s</string>
|
||||
<string name="module_empty">沒有安裝模組</string>
|
||||
<string name="module">模組</string>
|
||||
<string name="module_install_prompt_with_name">是否要繼續安裝模組 %1$s ?</string>
|
||||
<string name="module_sort_a_to_z">按 A - Z 排序</string>
|
||||
<string name="module_sort_z_to_a">按 Z - A 排序</string>
|
||||
<string name="uninstall">卸載</string>
|
||||
<string name="restore">恢復</string>
|
||||
<string name="module_install">安裝</string>
|
||||
<string name="install">安裝</string>
|
||||
<string name="reboot">重啟</string>
|
||||
<string name="settings">設定</string>
|
||||
<string name="reboot_userspace">軟重啟</string>
|
||||
<string name="reboot_recovery">重啟到 Recovery</string>
|
||||
<string name="reboot_bootloader">重啟到 Bootloader</string>
|
||||
<string name="reboot_download">重啟到 Download</string>
|
||||
<string name="reboot_edl">重啟到 EDL</string>
|
||||
<string name="about">關於</string>
|
||||
<string name="module_uninstall_confirm">確定要卸載模組 %s 嗎?</string>
|
||||
<string name="module_uninstall_success">%s 已卸載</string>
|
||||
<string name="module_uninstall_failed">卸載失敗: %s</string>
|
||||
<string name="module_restore_confirm">你確定要恢復模組 %s 嗎?</string>
|
||||
<string name="module_restore_success">%s 已恢復</string>
|
||||
<string name="module_restore_failed">恢復失敗: %s</string>
|
||||
<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="show_system_apps">顯示系統應用</string>
|
||||
<string name="hide_system_apps">隱藏系統應用</string>
|
||||
<string name="export_log">匯出日誌</string>
|
||||
<string name="safe_mode">安全模式</string>
|
||||
<string name="reboot_to_apply">重啟生效</string>
|
||||
<string name="module_magisk_conflict">由於與 Magisk 有衝突,所有模組不可用!</string>
|
||||
<string name="home_module_mount">模組系統</string>
|
||||
<string name="home_magic_mount">Magic Mount</string>
|
||||
<string name="home_overlayfs_mount">OverlayFS</string>
|
||||
<string name="unavailable">不可用</string>
|
||||
<string name="use_overlay_fs">使用 OverlayFS (實驗性功能)</string>
|
||||
<string name="use_overlay_fs_summary">對於 KernelSU Next 的掛載系統,在使用 OverlayFS 和 Magic Mount 之間進行切換。</string>
|
||||
<string name="reboot_required">需要重啟</string>
|
||||
<string name="reboot_message">更改將在重啟系統後生效。您想現在重啟嗎?</string>
|
||||
<string name="module_restore">恢復模組</string>
|
||||
<string name="module_restore_message">從備份中恢復模組。</string>
|
||||
<string name="module_backup">備份模組</string>
|
||||
<string name="module_backup_message">備份當前已安裝的模組。</string>
|
||||
<string name="warning">警告</string>
|
||||
<string name="warning_message">此功能仍處於測試階段且在開發中。請確保在繼續之前備份您的模組。僅當您了解潛在風險時才能使用此功能。謹慎行事。</string>
|
||||
<string name="proceed">繼續</string>
|
||||
<string name="cancel">取消</string>
|
||||
<string name="later">稍後</string>
|
||||
<string name="home_next_kernelsu">🔥 Next 構建</string>
|
||||
<string name="home_next_kernelsu_repo">https://github.com/KernelSU-Next/KernelSU-Next</string>
|
||||
<string name="home_next_kernelsu_body">Next 實驗性分支。在 GitHub 上查看!</string>
|
||||
<string name="home_experimental_kernelsu">⚠️ 實驗性開發警告!</string>
|
||||
<string name="home_experimental_kernelsu_repo">127.0.0.1</string>
|
||||
<string name="home_experimental_kernelsu_body">KernelSU Next 是非官方版本,始終處於積極的實驗開發階段。它按原樣提供,不保證穩定性、性能或可靠性。</string>
|
||||
<string name="home_experimental_kernelsu_body_point_1"> • 使用風險自負:可能會發生崩潰、意外行為或導致系統問題。</string>
|
||||
<string name="home_experimental_kernelsu_body_point_2"> • 無擔保:開發人員不對因使用而產生的任何數據丟失、系統損壞或其他後果負責。</string>
|
||||
<string name="home_experimental_kernelsu_body_point_3"> • 僅用於測試目的:它適用於了解風險並能輕鬆解決問題的使用者。</string>
|
||||
<string name="about_source_code"><![CDATA[在 %1$s 查看原始碼]]></string>
|
||||
<string name="profile" translatable="false">App Profile</string>
|
||||
<string name="profile_default">預設</string>
|
||||
<string name="profile_template">模板</string>
|
||||
<string name="profile_custom">自訂</string>
|
||||
<string name="profile_name">名稱</string>
|
||||
<string name="profile_namespace">命名空間</string>
|
||||
<string name="profile_namespace_inherited">繼承</string>
|
||||
<string name="profile_namespace_global">全域</string>
|
||||
<string name="profile_namespace_individual">私有</string>
|
||||
<string name="profile_groups">組</string>
|
||||
<string name="profile_capabilities">權能</string>
|
||||
<string name="profile_selinux_context">SELinux</string>
|
||||
<string name="profile_umount_modules">卸載模組</string>
|
||||
<string name="failed_to_update_app_profile">為 %s 更新 App Profile 失敗</string>
|
||||
<string name="require_kernel_version">當前 KernelSU-Next 版本 %1$d 過低,管理器無法正常工作,請升級內核 KernelSU-Next 版本至 %2$d 或以上!</string>
|
||||
<string name="settings_umount_modules_default">預設卸載模組</string>
|
||||
<string name="settings_umount_modules_default_summary">App Profile 中"卸載模組"的全域預設值,如果啟用,將會為沒有設定 Profile 的應用移除所有模組針對系統的修改。</string>
|
||||
<string name="settings_susfs_toggle">隱藏kprobe鉤子</string>
|
||||
<string name="settings_susfs_toggle_summary">它禁用由ksu所建立的kprobe鉤子,並啟用非kprobe內聯鉤子,就如同無法支援kprobe的non-gki核心的實現方式。</string>
|
||||
<string name="profile_umount_modules_summary">啟用後將允許 KernelSU-Next 為本應用還原被模組修改過的檔案。</string>
|
||||
<string name="profile_selinux_domain">域</string>
|
||||
<string name="profile_selinux_rules">規則</string>
|
||||
<string name="module_update">更新</string>
|
||||
<string name="module_downloading">正在下載模組: %s</string>
|
||||
<string name="module_start_downloading">開始下載: %s</string>
|
||||
<string name="new_version_available">發現新版本:%s,點擊升級。</string>
|
||||
<string name="launch_app">啟動</string>
|
||||
<string name="close">關閉</string>
|
||||
<string name="force_stop_app">強制停止</string>
|
||||
<string name="restart_app">重新啟動</string>
|
||||
<string name="failed_to_update_sepolicy">為:%s 更新 SELinux 規則失敗</string>
|
||||
<string name="module_changelog">更新日誌</string>
|
||||
<string name="settings_profile_template">App Profile 模板</string>
|
||||
<string name="settings_profile_template_summary">管理本地和線上的 App Profile 模板</string>
|
||||
<string name="app_profile_template_create">創建模板</string>
|
||||
<string name="app_profile_template_edit">編輯模板</string>
|
||||
<string name="app_profile_template_id">模板 id</string>
|
||||
<string name="app_profile_template_id_invalid">模板 id 不合法</string>
|
||||
<string name="app_profile_template_name">名字</string>
|
||||
<string name="app_profile_template_description">描述</string>
|
||||
<string name="app_profile_template_save">保存</string>
|
||||
<string name="app_profile_template_delete">刪除</string>
|
||||
<string name="app_profile_template_view">查看模板</string>
|
||||
<string name="app_profile_template_readonly">只讀</string>
|
||||
<string name="app_profile_template_id_exist">模板 id 已存在!</string>
|
||||
<string name="app_profile_import_export">匯入/匯出</string>
|
||||
<string name="app_profile_import_from_clipboard">從剪貼簿匯入</string>
|
||||
<string name="app_profile_export_to_clipboard">匯出到剪貼簿</string>
|
||||
<string name="app_profile_template_export_empty">沒有本地模板可以匯出!</string>
|
||||
<string name="app_profile_template_import_success">匯入成功!</string>
|
||||
<string name="app_profile_template_sync">同步線上規則</string>
|
||||
<string name="app_profile_template_save_failed">模板保存失敗!</string>
|
||||
<string name="app_profile_template_import_empty">剪貼簿為空!</string>
|
||||
<string name="module_changelog_failed">獲取更新日誌失敗: %s</string>
|
||||
<string name="settings_check_update">檢查更新</string>
|
||||
<string name="settings_check_update_summary">在應用啟動後自動檢查是否有最新版。</string>
|
||||
<string name="grant_root_failed">獲取 root 失敗!</string>
|
||||
<string name="action">執行</string>
|
||||
<string name="open">打開</string>
|
||||
<string name="enable_web_debugging">啟用 WebView 偵錯</string>
|
||||
<string name="enable_web_debugging_summary">可用於偵錯 WebUI ,請僅在需要時啟用。</string>
|
||||
<string name="direct_install">直接安裝(推薦)</string>
|
||||
<string name="select_file">選擇一個檔案</string>
|
||||
<string name="install_inactive_slot">安裝到未使用的槽位(OTA 後)</string>
|
||||
<string name="install_inactive_slot_warning">將在重啟後 **強制** 切換到另一個槽位!\n注意只能在 OTA 更新完成後的重啟之前使用。\n確認?</string>
|
||||
<string name="install_next">下一步</string>
|
||||
<string name="select_file_tip">建議選擇 %1$s 分區映像檔</string>
|
||||
<string name="select_kmi">選擇 KMI</string>
|
||||
<string name="shrink_sparse_image">最小化稀疏檔案</string>
|
||||
<string name="shrink_sparse_image_message">將模組所在的稀疏檔案映像調整為其實際大小,注意這可能導致模組工作異常,請僅在必要時(如備份)使用</string>
|
||||
<string name="settings_uninstall">卸載</string>
|
||||
<string name="settings_uninstall_temporary">臨時卸載</string>
|
||||
<string name="settings_uninstall_permanent">永久卸載</string>
|
||||
<string name="settings_restore_stock_image">恢復原廠映像檔</string>
|
||||
<string name="settings_uninstall_temporary_message">臨時卸載 KernelSU-Next,下次重啟後恢復。</string>
|
||||
<string name="settings_uninstall_permanent_message">完全並永久移除 KernelSU-Next 和所有模組。</string>
|
||||
<string name="settings_restore_stock_image_message">恢復原廠映像檔,一般在 OTA 前使用;如需卸載請使用“永久卸載”。</string>
|
||||
<string name="flashing">刷寫中</string>
|
||||
<string name="flash_success">刷寫成功</string>
|
||||
<string name="flash_failed">刷寫失敗</string>
|
||||
<string name="selected_lkm">選擇的 LKM: %s</string>
|
||||
<string name="save_log">保存日誌</string>
|
||||
<string name="log_saved">日誌已保存</string>
|
||||
<string name="send_log">發送日誌</string>
|
||||
</resources>
|
||||
@@ -5,7 +5,7 @@
|
||||
<string name="issue_report_body_2">Report it as soon as possible!</string>
|
||||
<string name="issue_report_github">Report on GitHub</string>
|
||||
<string name="issue_report_telegram">Contact via Telegram</string>
|
||||
<string name="issue_report_github_link">https://github.com/rifsxd/KernelSU-Next/issues</string>
|
||||
<string name="issue_report_github_link">https://github.com/KernelSU-Next/KernelSU-Next/issues</string>
|
||||
<string name="issue_report_telegram_link">https://t.me/ksunext</string>
|
||||
<string name="confirm">Confirm</string>
|
||||
<string name="app_name" translatable="false">KernelSU Next</string>
|
||||
@@ -19,6 +19,9 @@
|
||||
<string name="home_failure">KernelSU Next v2 signature not found in kernel! [ !KSU_NEXT || != size/hash ]</string>
|
||||
<string name="home_failure_tip">Ask your kernel developer to integrate KernelSU Next!</string>
|
||||
<string name="home_kernel">Kernel version</string>
|
||||
<string name="home_susfs">SuSFS: %s</string>
|
||||
<string name="home_susfs_version">SuSFS version</string>
|
||||
<string name="home_susfs_sus_su">SuS SU</string>
|
||||
<string name="home_android">Android version</string>
|
||||
<string name="home_manager_version">Manager version</string>
|
||||
<string name="home_selinux_status">SELinux status</string>
|
||||
@@ -31,7 +34,7 @@
|
||||
<string name="module_failed_to_disable">Failed to disable module: %s</string>
|
||||
<string name="module_empty">No module installed</string>
|
||||
<string name="module">Module</string>
|
||||
<string name="module_install_prompt_with_name">Do you want to continue installing module %1$s?</string>
|
||||
<string name="module_install_prompt_with_name">The following module(s) will be installed: %1$s</string>
|
||||
<string name="module_sort_a_to_z">Sort (A-Z)</string>
|
||||
<string name="module_sort_z_to_a">Sort (Z-A)</string>
|
||||
<string name="uninstall">Uninstall</string>
|
||||
@@ -54,11 +57,17 @@
|
||||
<string name="module_restore_failed">Failed to restore: %s</string>
|
||||
<string name="module_version">Version</string>
|
||||
<string name="module_author">Author</string>
|
||||
<string name="module_id">ID</string>
|
||||
<string name="module_version_code">Code</string>
|
||||
<string name="module_update_json">UpdateJson</string>
|
||||
<string name="module_update_json_empty">Empty</string>
|
||||
<string name="enable_developer_options">Enable developer options</string>
|
||||
<string name="enable_developer_options_summary">Show hidden settings and debug info relevant only for developers.</string>
|
||||
<string name="module_overlay_fs_not_available">Modules are unavailable as OverlayFS is disabled by the kernel.</string>
|
||||
<string name="refresh">Refresh</string>
|
||||
<string name="show_system_apps">Show system apps</string>
|
||||
<string name="hide_system_apps">Hide system apps</string>
|
||||
<string name="send_log">Send logs</string>
|
||||
<string name="export_log">Export logs</string>
|
||||
<string name="safe_mode">Safe mode</string>
|
||||
<string name="reboot_to_apply">Reboot to take effect</string>
|
||||
<string name="module_magisk_conflict">Modules are unavailable due to a conflict with Magisk!</string>
|
||||
@@ -66,21 +75,26 @@
|
||||
<string name="home_magic_mount">Magic Mount</string>
|
||||
<string name="home_overlayfs_mount">OverlayFS</string>
|
||||
<string name="unavailable">Unavailable</string>
|
||||
<string name="use_overlay_fs">Use OverlayFS (Beta)</string>
|
||||
<string name="use_overlay_fs">Use OverlayFS</string>
|
||||
<string name="use_overlay_fs_summary">Toggle between using OverlayFS over Magic Mount for KernelSU Next\'s mount system.</string>
|
||||
<string name="reboot_required">Reboot Required</string>
|
||||
<string name="reboot_message">Changes will take effect after rebooting the system. Would you like to reboot now?</string>
|
||||
<string name="reboot_required">Reboot required</string>
|
||||
<string name="reboot_message">The changes will take effect after the system restart. Do you want to reboot now?</string>
|
||||
<string name="module_restore">Restore module</string>
|
||||
<string name="module_restore_message">Restore modules from recent backup.</string>
|
||||
<string name="backup_restore">Backup & Restore</string>
|
||||
<string name="module_backup">Backup module</string>
|
||||
<string name="module_backup_message">Backup currently installed modules.</string>
|
||||
<string name="allowlist_restore">Restore allowlist</string>
|
||||
<string name="allowlist_restore_message">Restore allowlist from recent backup.</string>
|
||||
<string name="allowlist_backup">Backup allowlist</string>
|
||||
<string name="allowlist_backup_message">Backup currently configured allowlist.</string>
|
||||
<string name="warning">Warning</string>
|
||||
<string name="warning_message">This feature is still in beta and under development. Please ensure you backup your modules before proceeding. Use this feature only if you understand the potential risks. Proceed with caution.</string>
|
||||
<string name="warning_message">This feature is still in beta and under development. Please ensure you backup your modules before proceeding. Only use this feature if you understand the potential risks. Proceed with caution.</string>
|
||||
<string name="proceed">Proceed</string>
|
||||
<string name="cancel">Cancel</string>
|
||||
<string name="later">Later</string>
|
||||
<string name="home_next_kernelsu">🔥 Next build</string>
|
||||
<string name="home_next_kernelsu_repo">https://github.com/rifsxd/KernelSU-Next</string>
|
||||
<string name="home_next_kernelsu_repo">https://github.com/KernelSU-Next/KernelSU-Next</string>
|
||||
<string name="home_next_kernelsu_body">Next experimental branch. Check it out on GitHub!</string>
|
||||
<string name="home_experimental_kernelsu">⚠️ Experimental development warning!</string>
|
||||
<string name="home_experimental_kernelsu_repo">127.0.0.1</string>
|
||||
@@ -103,9 +117,11 @@
|
||||
<string name="profile_selinux_context">SELinux context</string>
|
||||
<string name="profile_umount_modules">Umount modules</string>
|
||||
<string name="failed_to_update_app_profile">Failed to update App Profile for %s</string>
|
||||
<string name="require_kernel_version">The current KernelSU Next version %d is too low for the manager to work properly. Please upgrade to version %d or higher!</string>
|
||||
<string name="settings_umount_modules_default">Umount modules by default</string>
|
||||
<string name="require_kernel_version">The current KernelSU Next version %1$d is too low for the manager to work properly. Please upgrade to version %2$d or higher!</string>
|
||||
<string name="settings_umount_modules_default">Umount modules</string>
|
||||
<string name="settings_umount_modules_default_summary">The global default value for \"Umount modules\" in App Profile. If enabled, it will remove all module modifications to the system for apps that don\'t have a profile set.</string>
|
||||
<string name="settings_susfs_toggle">Hide kprobe hooks</string>
|
||||
<string name="settings_susfs_toggle_summary">This option disables the kprobe hooks created by ksu and, instead, activates the embedded non-kprobe hooks, implementing the same functionality that would be applied to a non-GKI kernel, which doesn\'t support kprobe.</string>
|
||||
<string name="profile_umount_modules_summary">Enabling this option will allow KernelSU Next to restore any modified files by the modules for this app.</string>
|
||||
<string name="profile_selinux_domain">Domain</string>
|
||||
<string name="profile_selinux_rules">Rules</string>
|
||||
@@ -118,6 +134,7 @@
|
||||
<string name="force_stop_app">Force stop</string>
|
||||
<string name="restart_app">Restart</string>
|
||||
<string name="failed_to_update_sepolicy">Failed to update SELinux rules for: %s</string>
|
||||
<string name="su_not_allowed">Granting superuser isn\'t allowed for: %s</string>
|
||||
<string name="module_changelog">Changelog</string>
|
||||
<string name="settings_profile_template">App Profile Template</string>
|
||||
<string name="settings_profile_template_summary">Manage local and online template of App Profile</string>
|
||||
@@ -147,7 +164,7 @@
|
||||
<string name="action">Action</string>
|
||||
<string name="open">Open</string>
|
||||
<string name="enable_web_debugging">Enable WebView debugging</string>
|
||||
<string name="enable_web_debugging_summary">Can be used to debug WebUI, please enable only when needed.</string>
|
||||
<string name="enable_web_debugging_summary">Can be used to debug WebUI. Please enable only when needed.</string>
|
||||
<string name="direct_install">Direct install (Recommended)</string>
|
||||
<string name="select_file">Select a file</string>
|
||||
<string name="install_inactive_slot">Install to inactive slot (After OTA)</string>
|
||||
@@ -170,4 +187,7 @@
|
||||
<string name="selected_lkm">Selected LKM: %s</string>
|
||||
<string name="save_log">Save logs</string>
|
||||
<string name="log_saved">Logs saved</string>
|
||||
<string name="send_log">Share logs</string>
|
||||
<string name="settings_disable_su">Disable su compatibility</string>
|
||||
<string name="settings_disable_su_summary">Temporarily disable the ability of any app to gain root privileges via the su command (existing root processes won\'t be affected).</string>
|
||||
</resources>
|
||||
|
||||
@@ -30,7 +30,7 @@ cmaker {
|
||||
val androidMinSdkVersion = 26
|
||||
val androidTargetSdkVersion = 35
|
||||
val androidCompileSdkVersion = 35
|
||||
val androidCompileNdkVersion = "27.2.12479018"
|
||||
val androidCompileNdkVersion = "28.0.13004108"
|
||||
val androidSourceCompatibility = JavaVersion.VERSION_21
|
||||
val androidTargetCompatibility = JavaVersion.VERSION_21
|
||||
val managerVersionCode by extra(getVersionCode())
|
||||
|
||||
@@ -1,14 +1,14 @@
|
||||
[versions]
|
||||
agp = "8.7.3"
|
||||
kotlin = "2.1.0"
|
||||
ksp = "2.1.0-1.0.29"
|
||||
compose-bom = "2024.12.01"
|
||||
agp = "8.8.1"
|
||||
kotlin = "2.1.10"
|
||||
ksp = "2.1.10-1.0.30"
|
||||
compose-bom = "2025.02.00"
|
||||
lifecycle = "2.8.7"
|
||||
navigation = "2.8.5"
|
||||
activity-compose = "1.9.3"
|
||||
navigation = "2.8.7"
|
||||
activity-compose = "1.10.0"
|
||||
kotlinx-coroutines = "1.10.1"
|
||||
coil-compose = "2.7.0"
|
||||
compose-destination = "2.1.0-beta15"
|
||||
compose-destination = "2.1.0-beta16"
|
||||
sheets-compose-dialogs = "1.3.0"
|
||||
markdown = "4.6.2"
|
||||
webkit = "1.12.1"
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
distributionBase=GRADLE_USER_HOME
|
||||
distributionPath=wrapper/dists
|
||||
distributionUrl=https\://services.gradle.org/distributions/gradle-8.12-bin.zip
|
||||
distributionUrl=https\://services.gradle.org/distributions/gradle-8.12.1-bin.zip
|
||||
networkTimeout=10000
|
||||
validateDistributionUrl=true
|
||||
zipStoreBase=GRADLE_USER_HOME
|
||||
zipStorePath=wrapper/dists
|
||||
zipStorePath=wrapper/dists
|
||||
|
||||
@@ -4,10 +4,9 @@ import sys
|
||||
from telethon import TelegramClient
|
||||
from telethon.tl.functions.help import GetConfigRequest
|
||||
|
||||
API_ID = 611335
|
||||
API_HASH = "d524b414d21f4d37f08684c1df41ac9c"
|
||||
|
||||
|
||||
# Environment Variables
|
||||
API_ID = os.environ.get("API_ID")
|
||||
API_HASH = os.environ.get("API_HASH")
|
||||
BOT_TOKEN = os.environ.get("BOT_TOKEN")
|
||||
CHAT_ID = os.environ.get("CHAT_ID")
|
||||
MESSAGE_THREAD_ID = os.environ.get("MESSAGE_THREAD_ID")
|
||||
@@ -82,7 +81,7 @@ async def main():
|
||||
exit(1)
|
||||
print("[+] Logging in Telegram with bot")
|
||||
script_dir = os.path.dirname(os.path.abspath(sys.argv[0]))
|
||||
session_dir = os.path.join(script_dir, "ksubot")
|
||||
session_dir = os.path.join(script_dir, "ksunextbot")
|
||||
async with await TelegramClient(session=session_dir, api_id=API_ID, api_hash=API_HASH).start(bot_token=BOT_TOKEN) as bot:
|
||||
caption = [""] * len(files)
|
||||
caption[-1] = get_caption()
|
||||
@@ -91,7 +90,13 @@ async def main():
|
||||
print(caption)
|
||||
print("---")
|
||||
print("[+] Sending")
|
||||
await bot.send_file(entity=CHAT_ID, file=files, caption=caption, reply_to=MESSAGE_THREAD_ID, parse_mode="markdown")
|
||||
await bot.send_file(
|
||||
entity=CHAT_ID,
|
||||
file=files,
|
||||
caption=caption,
|
||||
reply_to=MESSAGE_THREAD_ID,
|
||||
parse_mode="markdown"
|
||||
)
|
||||
print("[+] Done!")
|
||||
|
||||
if __name__ == "__main__":
|
||||
334
userspace/ksud_magic/Cargo.lock
generated
334
userspace/ksud_magic/Cargo.lock
generated
@@ -29,7 +29,7 @@ version = "0.8.11"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "e89da841a80418a9b391ebaea17f5c112ffaaa96f621d2c285b5174da76b9011"
|
||||
dependencies = [
|
||||
"cfg-if 1.0.0",
|
||||
"cfg-if",
|
||||
"once_cell",
|
||||
"version_check",
|
||||
"zerocopy",
|
||||
@@ -120,19 +120,20 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "anstyle-wincon"
|
||||
version = "3.0.6"
|
||||
version = "3.0.7"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "2109dbce0e72be3ec00bed26e6a7479ca384ad226efdd66db8fa2e3a38c83125"
|
||||
checksum = "ca3534e77181a9cc07539ad51f2141fe32f6c3ffd4df76db8ad92346b003ae4e"
|
||||
dependencies = [
|
||||
"anstyle",
|
||||
"once_cell",
|
||||
"windows-sys 0.59.0",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "anyhow"
|
||||
version = "1.0.95"
|
||||
version = "1.0.96"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "34ac096ce696dc2fcabef30516bb13c0a68a11d30131d3df6f04711467681b04"
|
||||
checksum = "6b964d184e89d9b6b67dd2715bc8e74cf3107fb2b529990c90cf517326150bf4"
|
||||
|
||||
[[package]]
|
||||
name = "arbitrary"
|
||||
@@ -145,9 +146,9 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "async-trait"
|
||||
version = "0.1.85"
|
||||
version = "0.1.86"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "3f934833b4b7233644e5848f235df3f57ed8c80f1528a26c3dfa13d2147fa056"
|
||||
checksum = "644dd749086bf3771a2fbc5f256fdb982d53f011c7d5d560304eafeecebce79d"
|
||||
dependencies = [
|
||||
"proc-macro2",
|
||||
"quote",
|
||||
@@ -167,7 +168,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "8d82cb332cdfaed17ae235a638438ac4d4839913cc2af585c3c6746e8f8bee1a"
|
||||
dependencies = [
|
||||
"addr2line",
|
||||
"cfg-if 1.0.0",
|
||||
"cfg-if",
|
||||
"libc",
|
||||
"miniz_oxide",
|
||||
"object",
|
||||
@@ -183,9 +184,9 @@ checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a"
|
||||
|
||||
[[package]]
|
||||
name = "bitflags"
|
||||
version = "2.6.0"
|
||||
version = "2.8.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "b048fb63fd8b5923fc5aa7b340d8e156aec7ec02f0c78fa8a6ddc2613f6f71de"
|
||||
checksum = "8f68f53c83ab957f72c32642f3868eec03eb974d1fb82e453128456482613d36"
|
||||
|
||||
[[package]]
|
||||
name = "block-buffer"
|
||||
@@ -198,9 +199,9 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "bumpalo"
|
||||
version = "3.16.0"
|
||||
version = "3.17.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "79296716171880943b8470b5f8d03aa55eb2e645a4874bdbb28adb49162e012c"
|
||||
checksum = "1628fb46dfa0b37568d12e5edd512553eccf6a22a78e8bde00bb4aed84d5bdbf"
|
||||
|
||||
[[package]]
|
||||
name = "byteorder"
|
||||
@@ -210,25 +211,19 @@ checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b"
|
||||
|
||||
[[package]]
|
||||
name = "bytes"
|
||||
version = "1.9.0"
|
||||
version = "1.10.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "325918d6fe32f23b19878fe4b34794ae41fc19ddbe53b10571a4874d44ffd39b"
|
||||
checksum = "f61dac84819c6588b558454b194026eb1f09c293b9036ae9b159e74e73ab6cf9"
|
||||
|
||||
[[package]]
|
||||
name = "cc"
|
||||
version = "1.2.7"
|
||||
version = "1.2.15"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "a012a0df96dd6d06ba9a1b29d6402d1a5d77c6befd2566afdc26e10603dc93d7"
|
||||
checksum = "c736e259eea577f443d5c86c304f9f4ae0295c43f3ba05c21f1d66b5f06001af"
|
||||
dependencies = [
|
||||
"shlex",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "cfg-if"
|
||||
version = "0.1.10"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "4785bdd1c96b2a846b2bd7cc02e86b6b3dbf14e7e53446c4f54c92a361040822"
|
||||
|
||||
[[package]]
|
||||
name = "cfg-if"
|
||||
version = "1.0.0"
|
||||
@@ -251,9 +246,9 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "clap"
|
||||
version = "4.5.24"
|
||||
version = "4.5.30"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "9560b07a799281c7e0958b9296854d6fafd4c5f31444a7e5bb1ad6dde5ccf1bd"
|
||||
checksum = "92b7b18d71fad5313a1e320fa9897994228ce274b60faa4d694fe0ea89cd9e6d"
|
||||
dependencies = [
|
||||
"clap_builder",
|
||||
"clap_derive",
|
||||
@@ -261,9 +256,9 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "clap_builder"
|
||||
version = "4.5.24"
|
||||
version = "4.5.30"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "874e0dd3eb68bf99058751ac9712f622e61e6f393a94f7128fa26e3f02f5c7cd"
|
||||
checksum = "a35db2071778a7344791a4fb4f95308b5673d219dee3ae348b86642574ecc90c"
|
||||
dependencies = [
|
||||
"anstream",
|
||||
"anstyle",
|
||||
@@ -273,9 +268,9 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "clap_derive"
|
||||
version = "4.5.24"
|
||||
version = "4.5.28"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "54b755194d6389280185988721fffba69495eed5ee9feeee9a599b53db80318c"
|
||||
checksum = "bf4ced95c6f4a675af3da73304b9ac4ed991640c36374e4b46795c49e17cf1ed"
|
||||
dependencies = [
|
||||
"heck",
|
||||
"proc-macro2",
|
||||
@@ -332,9 +327,9 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "cpufeatures"
|
||||
version = "0.2.16"
|
||||
version = "0.2.17"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "16b80225097f2e5ae4e7179dd2266824648f3e2f49d9134d584b76389d31c4c3"
|
||||
checksum = "59ed5838eebb26a2bb2e58f6d5b5316989ae9d08bab10e0e6d103e656d1b0280"
|
||||
dependencies = [
|
||||
"libc",
|
||||
]
|
||||
@@ -360,7 +355,7 @@ version = "1.4.2"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "a97769d94ddab943e4510d138150169a2758b5ef3eb191a9ee688de3e23ef7b3"
|
||||
dependencies = [
|
||||
"cfg-if 1.0.0",
|
||||
"cfg-if",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
@@ -495,9 +490,9 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "either"
|
||||
version = "1.13.0"
|
||||
version = "1.14.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "60b1af1c220855b6ceac025d3f6ecdd2b7c4894bfe9cd9bda4fbb4bc7c0d4cf0"
|
||||
checksum = "b7914353092ddf589ad78f25c5c1c21b7f80b0ff8621e7c814c3485b5306da9d"
|
||||
|
||||
[[package]]
|
||||
name = "encoding_rs"
|
||||
@@ -505,7 +500,7 @@ version = "0.8.35"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "75030f3c4f45dafd7586dd6780965a8c7e8e285a5ecb86713e63a79c5b2766f3"
|
||||
dependencies = [
|
||||
"cfg-if 1.0.0",
|
||||
"cfg-if",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
@@ -535,9 +530,9 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "equivalent"
|
||||
version = "1.0.1"
|
||||
version = "1.0.2"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5"
|
||||
checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f"
|
||||
|
||||
[[package]]
|
||||
name = "errno"
|
||||
@@ -589,9 +584,9 @@ checksum = "37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be"
|
||||
|
||||
[[package]]
|
||||
name = "flate2"
|
||||
version = "1.0.35"
|
||||
version = "1.1.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "c936bfdafb507ebbf50b8074c54fa31c5be9a1e7e5f467dd659697041407d07c"
|
||||
checksum = "11faaf5a5236997af9848be0bef4db95824b1d534ebc64d0f0c6cf3e67bd38dc"
|
||||
dependencies = [
|
||||
"crc32fast",
|
||||
"miniz_oxide",
|
||||
@@ -618,13 +613,14 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "getrandom"
|
||||
version = "0.2.15"
|
||||
version = "0.3.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "c4567c8db10ae91089c99af84c68c38da3ec2f087c3f82960bcdbf3656b6f4d7"
|
||||
checksum = "43a49c392881ce6d5c3b8cb70f98717b7c07aabbdff06687b9030dbfbe2725f8"
|
||||
dependencies = [
|
||||
"cfg-if 1.0.0",
|
||||
"cfg-if",
|
||||
"libc",
|
||||
"wasi",
|
||||
"windows-targets",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
@@ -661,19 +657,6 @@ version = "0.4.3"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70"
|
||||
|
||||
[[package]]
|
||||
name = "hole-punch"
|
||||
version = "0.0.4-alpha.0"
|
||||
source = "git+https://github.com/tiann/hole-punch#11ab7a61bfb98682b72fd7f58a47d8e5d997328e"
|
||||
dependencies = [
|
||||
"cfg-if 0.1.10",
|
||||
"errno 0.2.8",
|
||||
"libc",
|
||||
"memmap",
|
||||
"thiserror 1.0.69",
|
||||
"winapi",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "humansize"
|
||||
version = "2.1.3"
|
||||
@@ -731,9 +714,9 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "indexmap"
|
||||
version = "2.7.0"
|
||||
version = "2.7.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "62f822373a4fe84d4bb149bf54e584a7f4abec90e072ed49cda0edea5b95471f"
|
||||
checksum = "8c9c992b02b5b4c94ea26e32fe5bccb7aa7d9f390ab5c1221ff895bc7ea8b652"
|
||||
dependencies = [
|
||||
"equivalent",
|
||||
"hashbrown 0.15.2",
|
||||
@@ -772,9 +755,9 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "js-sys"
|
||||
version = "0.3.76"
|
||||
version = "0.3.77"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "6717b6b5b077764fb5966237269cb3c64edddde4b14ce42647430a78ced9e7b7"
|
||||
checksum = "1cfaf33c695fc6e08064efbc1f72ec937429614f25eef83af942d0e227c3a28f"
|
||||
dependencies = [
|
||||
"once_cell",
|
||||
"wasm-bindgen",
|
||||
@@ -805,7 +788,6 @@ dependencies = [
|
||||
"env_logger",
|
||||
"extattr",
|
||||
"getopts",
|
||||
"hole-punch",
|
||||
"humansize",
|
||||
"is_executable",
|
||||
"java-properties",
|
||||
@@ -816,10 +798,8 @@ dependencies = [
|
||||
"nom",
|
||||
"procfs",
|
||||
"regex-lite",
|
||||
"retry",
|
||||
"rust-embed",
|
||||
"rustix 0.38.34",
|
||||
"serde",
|
||||
"serde_json",
|
||||
"sha1",
|
||||
"sha256",
|
||||
@@ -837,9 +817,9 @@ checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe"
|
||||
|
||||
[[package]]
|
||||
name = "libc"
|
||||
version = "0.2.169"
|
||||
version = "0.2.170"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "b5aba8db14291edd000dfcc4d620c7ebfb122c613afb886ca8803fa4e128a20a"
|
||||
checksum = "875b3680cb2f8f71bdcf9a30f38d48282f5d3c95cbf9b3fa57269bb5d5c06828"
|
||||
|
||||
[[package]]
|
||||
name = "libflate"
|
||||
@@ -885,9 +865,9 @@ checksum = "9374ef4228402d4b7e403e5838cb880d9ee663314b0a900d5a6aabf0c213552e"
|
||||
|
||||
[[package]]
|
||||
name = "log"
|
||||
version = "0.4.22"
|
||||
version = "0.4.26"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "a7a70ba024b9dc04c27ea2f0c0548feb474ec5c54bba33a7f72f873a39d07b24"
|
||||
checksum = "30bde2b3dc3671ae49d8e2e9f044c7c005836e7a023ee57cffa25ab82764bb9e"
|
||||
|
||||
[[package]]
|
||||
name = "loopdev"
|
||||
@@ -914,39 +894,22 @@ version = "2.7.4"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3"
|
||||
|
||||
[[package]]
|
||||
name = "memmap"
|
||||
version = "0.7.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "6585fd95e7bb50d6cc31e20d4cf9afb4e2ba16c5846fc76793f11218da9c475b"
|
||||
dependencies = [
|
||||
"libc",
|
||||
"winapi",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "minimal-lexical"
|
||||
version = "0.2.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a"
|
||||
|
||||
[[package]]
|
||||
name = "miniz_oxide"
|
||||
version = "0.8.2"
|
||||
version = "0.8.5"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "4ffbe83022cedc1d264172192511ae958937694cd57ce297164951b8b3568394"
|
||||
checksum = "8e3e04debbb59698c15bacbb6d93584a8c0ca9cc3213cb423d31f760d8843ce5"
|
||||
dependencies = [
|
||||
"adler2",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "nom"
|
||||
version = "7.1.3"
|
||||
version = "8.0.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "d273983c5a657a70a3e8f2a01329822f3b8c8172b73826411a55751e404a0a4a"
|
||||
checksum = "df9761775871bdef83bee530e60050f7e54b1105350d6884eb0fb4f46c2f9405"
|
||||
dependencies = [
|
||||
"memchr",
|
||||
"minimal-lexical",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
@@ -975,9 +938,9 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "once_cell"
|
||||
version = "1.20.2"
|
||||
version = "1.20.3"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "1261fe7e33c73b354eab43b1273a57c8f967d0391e80353e51f764ac02cf6775"
|
||||
checksum = "945462a4b81e43c4e3ba96bd7b49d834c6f61198356aa858733bc4acf3cbe62e"
|
||||
|
||||
[[package]]
|
||||
name = "pin-project-lite"
|
||||
@@ -991,20 +954,11 @@ version = "0.2.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391"
|
||||
|
||||
[[package]]
|
||||
name = "ppv-lite86"
|
||||
version = "0.2.20"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "77957b295656769bb8ad2b6a6b09d897d94f05c41b069aede1fcdaa675eaea04"
|
||||
dependencies = [
|
||||
"zerocopy",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "proc-macro2"
|
||||
version = "1.0.92"
|
||||
version = "1.0.93"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "37d3544b3f2748c54e147655edb5025752e2303145b5aefb3c3ea2c78b973bb0"
|
||||
checksum = "60946a68e5f9d28b0dc1c21bb8a97ee7d018a8b322fa57838ba31cc878e22d99"
|
||||
dependencies = [
|
||||
"unicode-ident",
|
||||
]
|
||||
@@ -1015,12 +969,12 @@ version = "0.17.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "cc5b72d8145275d844d4b5f6d4e1eef00c8cd889edb6035c21675d1bb1f45c9f"
|
||||
dependencies = [
|
||||
"bitflags 2.6.0",
|
||||
"bitflags 2.8.0",
|
||||
"chrono",
|
||||
"flate2",
|
||||
"hex",
|
||||
"procfs-core",
|
||||
"rustix 0.38.42",
|
||||
"rustix 0.38.44",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
@@ -1029,7 +983,7 @@ version = "0.17.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "239df02d8349b06fc07398a3a1697b06418223b1c7725085e801e7c0fc6a12ec"
|
||||
dependencies = [
|
||||
"bitflags 2.6.0",
|
||||
"bitflags 2.8.0",
|
||||
"chrono",
|
||||
"hex",
|
||||
]
|
||||
@@ -1043,36 +997,6 @@ dependencies = [
|
||||
"proc-macro2",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "rand"
|
||||
version = "0.8.5"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404"
|
||||
dependencies = [
|
||||
"libc",
|
||||
"rand_chacha",
|
||||
"rand_core",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "rand_chacha"
|
||||
version = "0.3.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88"
|
||||
dependencies = [
|
||||
"ppv-lite86",
|
||||
"rand_core",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "rand_core"
|
||||
version = "0.6.4"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c"
|
||||
dependencies = [
|
||||
"getrandom",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "rayon"
|
||||
version = "1.10.0"
|
||||
@@ -1099,15 +1023,6 @@ version = "0.1.6"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "53a49587ad06b26609c52e423de037e7f57f20d53535d66e08c695f347df952a"
|
||||
|
||||
[[package]]
|
||||
name = "retry"
|
||||
version = "2.0.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "9166d72162de3575f950507683fac47e30f6f2c3836b71b7fbc61aa517c9c5f4"
|
||||
dependencies = [
|
||||
"rand",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "rle-decode-fast"
|
||||
version = "1.0.3"
|
||||
@@ -1160,7 +1075,7 @@ name = "rustix"
|
||||
version = "0.38.34"
|
||||
source = "git+https://github.com/Kernel-SU/rustix.git?branch=main#4a53fbc7cb7a07cabe87125cc21dbc27db316259"
|
||||
dependencies = [
|
||||
"bitflags 2.6.0",
|
||||
"bitflags 2.8.0",
|
||||
"errno 0.3.10",
|
||||
"itoa",
|
||||
"libc",
|
||||
@@ -1171,11 +1086,11 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "rustix"
|
||||
version = "0.38.42"
|
||||
version = "0.38.44"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "f93dc38ecbab2eb790ff964bb77fa94faf256fd3e73285fd7ba0903b76bedb85"
|
||||
checksum = "fdb5bc1ae2baa591800df16c9ca78619bf65c0488b41b96ccec5d11220d8c154"
|
||||
dependencies = [
|
||||
"bitflags 2.6.0",
|
||||
"bitflags 2.8.0",
|
||||
"errno 0.3.10",
|
||||
"libc",
|
||||
"linux-raw-sys",
|
||||
@@ -1183,10 +1098,16 @@ dependencies = [
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "ryu"
|
||||
version = "1.0.18"
|
||||
name = "rustversion"
|
||||
version = "1.0.19"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "f3cb5ba0dc43242ce17de99c180e96db90b235b8a9fdc9543c96d2209116bd9f"
|
||||
checksum = "f7c45b9784283f1b2e7fb61b42047c2fd678ef0960d4f6f1eba131594cc369d4"
|
||||
|
||||
[[package]]
|
||||
name = "ryu"
|
||||
version = "1.0.19"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "6ea1a2d0a644769cc99faa24c3ad26b379b786fe7c36fd3c546254801650e6dd"
|
||||
|
||||
[[package]]
|
||||
name = "same-file"
|
||||
@@ -1199,18 +1120,18 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "serde"
|
||||
version = "1.0.217"
|
||||
version = "1.0.218"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "02fc4265df13d6fa1d00ecff087228cc0a2b5f3c0e87e258d8b94a156e984c70"
|
||||
checksum = "e8dfc9d19bdbf6d17e22319da49161d5d0108e4188e8b680aef6299eed22df60"
|
||||
dependencies = [
|
||||
"serde_derive",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "serde_derive"
|
||||
version = "1.0.217"
|
||||
version = "1.0.218"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "5a9bf7cf98d04a2b28aead066b7496853d4779c9cc183c440dbac457641e19a0"
|
||||
checksum = "f09503e191f4e797cb8aac08e9a4a4695c5edf6a2e70e376d961ddd5c969f82b"
|
||||
dependencies = [
|
||||
"proc-macro2",
|
||||
"quote",
|
||||
@@ -1219,9 +1140,9 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "serde_json"
|
||||
version = "1.0.135"
|
||||
version = "1.0.139"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "2b0d7ba2887406110130a978386c4e1befb98c674b4fba677954e4db976630d9"
|
||||
checksum = "44f86c3acccc9c65b153fe1b85a3be07fe5515274ec9f0653b4a0875731c72a6"
|
||||
dependencies = [
|
||||
"itoa",
|
||||
"memchr",
|
||||
@@ -1235,7 +1156,7 @@ version = "0.10.6"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "e3bf829a2d51ab4a5ddf1352d8470c140cadc8301b2ae1789db023f01cedd6ba"
|
||||
dependencies = [
|
||||
"cfg-if 1.0.0",
|
||||
"cfg-if",
|
||||
"cpufeatures",
|
||||
"digest",
|
||||
]
|
||||
@@ -1246,7 +1167,7 @@ version = "0.10.8"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "793db75ad2bcafc3ffa7c68b215fee268f537982cd901d132f89c6343f3a3dc8"
|
||||
dependencies = [
|
||||
"cfg-if 1.0.0",
|
||||
"cfg-if",
|
||||
"cpufeatures",
|
||||
"digest",
|
||||
]
|
||||
@@ -1284,9 +1205,9 @@ checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f"
|
||||
|
||||
[[package]]
|
||||
name = "syn"
|
||||
version = "2.0.95"
|
||||
version = "2.0.98"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "46f71c0377baf4ef1cc3e3402ded576dccc315800fbc62dfc7fe04b009773b4a"
|
||||
checksum = "36147f1a48ae0ec2b5b3bc5b537d267457555a10dc06f3dbc8cb11ba3006d3b1"
|
||||
dependencies = [
|
||||
"proc-macro2",
|
||||
"quote",
|
||||
@@ -1295,52 +1216,32 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "tempfile"
|
||||
version = "3.15.0"
|
||||
version = "3.17.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "9a8a559c81686f576e8cd0290cd2a24a2a9ad80c98b3478856500fcbd7acd704"
|
||||
checksum = "22e5a0acb1f3f55f65cc4a866c361b2fb2a0ff6366785ae6fbb5f85df07ba230"
|
||||
dependencies = [
|
||||
"cfg-if 1.0.0",
|
||||
"cfg-if",
|
||||
"fastrand",
|
||||
"getrandom",
|
||||
"once_cell",
|
||||
"rustix 0.38.42",
|
||||
"rustix 0.38.44",
|
||||
"windows-sys 0.59.0",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "thiserror"
|
||||
version = "1.0.69"
|
||||
version = "2.0.11"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52"
|
||||
checksum = "d452f284b73e6d76dd36758a0c8684b1d5be31f92b89d07fd5822175732206fc"
|
||||
dependencies = [
|
||||
"thiserror-impl 1.0.69",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "thiserror"
|
||||
version = "2.0.9"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "f072643fd0190df67a8bab670c20ef5d8737177d6ac6b2e9a236cb096206b2cc"
|
||||
dependencies = [
|
||||
"thiserror-impl 2.0.9",
|
||||
"thiserror-impl",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "thiserror-impl"
|
||||
version = "1.0.69"
|
||||
version = "2.0.11"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1"
|
||||
dependencies = [
|
||||
"proc-macro2",
|
||||
"quote",
|
||||
"syn",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "thiserror-impl"
|
||||
version = "2.0.9"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "7b50fa271071aae2e6ee85f842e2e28ba8cd2c5fb67f11fcb1fd70b276f9e7d4"
|
||||
checksum = "26afc1baea8a989337eeb52b6e72a039780ce45c3edfcc9c5b9d112feeb173c2"
|
||||
dependencies = [
|
||||
"proc-macro2",
|
||||
"quote",
|
||||
@@ -1379,15 +1280,15 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "typenum"
|
||||
version = "1.17.0"
|
||||
version = "1.18.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825"
|
||||
checksum = "1dccffe3ce07af9386bfd29e80c0ab1a8205a2fc34e4bcd40364df902cfa8f3f"
|
||||
|
||||
[[package]]
|
||||
name = "unicode-ident"
|
||||
version = "1.0.14"
|
||||
version = "1.0.17"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "adb9e6ca4f869e1180728b7950e35922a7fc6397f7b641499e8f3ef06e50dc83"
|
||||
checksum = "00e2473a93778eb0bad35909dff6a10d28e63f792f16ed15e404fca9d5eeedbe"
|
||||
|
||||
[[package]]
|
||||
name = "unicode-width"
|
||||
@@ -1425,26 +1326,30 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "wasi"
|
||||
version = "0.11.0+wasi-snapshot-preview1"
|
||||
version = "0.13.3+wasi-0.2.2"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423"
|
||||
checksum = "26816d2e1a4a36a2940b96c5296ce403917633dff8f3440e9b236ed6f6bacad2"
|
||||
dependencies = [
|
||||
"wit-bindgen-rt",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "wasm-bindgen"
|
||||
version = "0.2.99"
|
||||
version = "0.2.100"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "a474f6281d1d70c17ae7aa6a613c87fce69a127e2624002df63dcb39d6cf6396"
|
||||
checksum = "1edc8929d7499fc4e8f0be2262a241556cfc54a0bea223790e71446f2aab1ef5"
|
||||
dependencies = [
|
||||
"cfg-if 1.0.0",
|
||||
"cfg-if",
|
||||
"once_cell",
|
||||
"rustversion",
|
||||
"wasm-bindgen-macro",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "wasm-bindgen-backend"
|
||||
version = "0.2.99"
|
||||
version = "0.2.100"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "5f89bb38646b4f81674e8f5c3fb81b562be1fd936d84320f3264486418519c79"
|
||||
checksum = "2f0a0651a5c2bc21487bde11ee802ccaf4c51935d0d3d42a6101f98161700bc6"
|
||||
dependencies = [
|
||||
"bumpalo",
|
||||
"log",
|
||||
@@ -1456,9 +1361,9 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "wasm-bindgen-macro"
|
||||
version = "0.2.99"
|
||||
version = "0.2.100"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "2cc6181fd9a7492eef6fef1f33961e3695e4579b9872a6f7c83aee556666d4fe"
|
||||
checksum = "7fe63fc6d09ed3792bd0897b314f53de8e16568c2b3f7982f468c0bf9bd0b407"
|
||||
dependencies = [
|
||||
"quote",
|
||||
"wasm-bindgen-macro-support",
|
||||
@@ -1466,9 +1371,9 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "wasm-bindgen-macro-support"
|
||||
version = "0.2.99"
|
||||
version = "0.2.100"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "30d7a95b763d3c45903ed6c81f156801839e5ee968bb07e534c44df0fcd330c2"
|
||||
checksum = "8ae87ea40c9f689fc23f209965b6fb8a99ad69aeeb0231408be24920604395de"
|
||||
dependencies = [
|
||||
"proc-macro2",
|
||||
"quote",
|
||||
@@ -1479,19 +1384,22 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "wasm-bindgen-shared"
|
||||
version = "0.2.99"
|
||||
version = "0.2.100"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "943aab3fdaaa029a6e0271b35ea10b72b943135afe9bffca82384098ad0e06a6"
|
||||
checksum = "1a05d73b933a847d6cccdda8f838a22ff101ad9bf93e33684f39c1f5f0eece3d"
|
||||
dependencies = [
|
||||
"unicode-ident",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "which"
|
||||
version = "7.0.1"
|
||||
version = "7.0.2"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "fb4a9e33648339dc1642b0e36e21b3385e6148e289226f657c809dee59df5028"
|
||||
checksum = "2774c861e1f072b3aadc02f8ba886c26ad6321567ecc294c935434cad06f1283"
|
||||
dependencies = [
|
||||
"either",
|
||||
"env_home",
|
||||
"rustix 0.38.42",
|
||||
"rustix 0.38.44",
|
||||
"winsafe",
|
||||
]
|
||||
|
||||
@@ -1623,13 +1531,21 @@ version = "0.0.19"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "d135d17ab770252ad95e9a872d365cf3090e3be864a34ab46f48555993efc904"
|
||||
|
||||
[[package]]
|
||||
name = "wit-bindgen-rt"
|
||||
version = "0.33.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "3268f3d866458b787f390cf61f4bbb563b922d091359f9608842999eaee3943c"
|
||||
dependencies = [
|
||||
"bitflags 2.8.0",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "zerocopy"
|
||||
version = "0.7.35"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "1b9b4fd18abc82b8136838da5d50bae7bdea537c574d8dc1a34ed098d6c166f0"
|
||||
dependencies = [
|
||||
"byteorder",
|
||||
"zerocopy-derive",
|
||||
]
|
||||
|
||||
@@ -1659,7 +1575,7 @@ dependencies = [
|
||||
"indexmap",
|
||||
"lzma-rs",
|
||||
"memchr",
|
||||
"thiserror 2.0.9",
|
||||
"thiserror",
|
||||
"time",
|
||||
"zopfli",
|
||||
]
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
[package]
|
||||
name = "ksud"
|
||||
version = "0.1.0"
|
||||
edition = "2021"
|
||||
edition = "2024"
|
||||
|
||||
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
|
||||
|
||||
@@ -20,16 +20,14 @@ zip-extensions = { version = "0.8", features = [
|
||||
java-properties = { git = "https://github.com/Kernel-SU/java-properties.git", branch = "master", default-features = false }
|
||||
log = "0.4"
|
||||
env_logger = { version = "0.11", default-features = false }
|
||||
serde = { version = "1" }
|
||||
serde_json = "1"
|
||||
encoding_rs = "0.8"
|
||||
retry = "2"
|
||||
humansize = "2"
|
||||
libc = "0.2"
|
||||
extattr = "1"
|
||||
jwalk = "0.8"
|
||||
is_executable = "1"
|
||||
nom = "7"
|
||||
nom = "8"
|
||||
derive-new = "0.7"
|
||||
rust-embed = { version = "8", features = [
|
||||
"debug-embed",
|
||||
@@ -41,7 +39,6 @@ sha256 = "1"
|
||||
sha1 = "0.10"
|
||||
tempfile = "3"
|
||||
chrono = "0.4"
|
||||
hole-punch = { git = "https://github.com/tiann/hole-punch" }
|
||||
regex-lite = "0.1"
|
||||
|
||||
[target.'cfg(any(target_os = "android", target_os = "linux"))'.dependencies]
|
||||
|
||||
3
userspace/ksud_magic/bin/.gitignore
vendored
3
userspace/ksud_magic/bin/.gitignore
vendored
@@ -1 +1,2 @@
|
||||
**/*.ko
|
||||
**/*.ko
|
||||
susfsd
|
||||
@@ -1,4 +1,4 @@
|
||||
use anyhow::{ensure, Result};
|
||||
use anyhow::{Result, ensure};
|
||||
use std::io::{Read, Seek, SeekFrom};
|
||||
|
||||
pub fn get_apk_signature(apk: &str) -> Result<(u32, String)> {
|
||||
|
||||
@@ -9,13 +9,9 @@ pub const RESETPROP_PATH: &str = concatcp!(BINARY_DIR, "resetprop");
|
||||
pub const BUSYBOX_PATH: &str = concatcp!(BINARY_DIR, "busybox");
|
||||
pub const BOOTCTL_PATH: &str = concatcp!(BINARY_DIR, "bootctl");
|
||||
|
||||
#[cfg(all(target_arch = "x86_64", target_os = "android"))]
|
||||
#[derive(RustEmbed)]
|
||||
#[folder = "bin/x86_64"]
|
||||
struct Asset;
|
||||
#[allow(dead_code)]
|
||||
pub const SUSFSD_PATH: &str = concatcp!(BINARY_DIR, "susfsd");
|
||||
|
||||
// IF NOT x86_64 ANDROID, ie. macos, linux, windows, always use aarch64
|
||||
#[cfg(not(all(target_arch = "x86_64", target_os = "android")))]
|
||||
#[derive(RustEmbed)]
|
||||
#[folder = "bin/aarch64"]
|
||||
struct Asset;
|
||||
|
||||
@@ -5,11 +5,11 @@ use std::path::PathBuf;
|
||||
use std::process::Command;
|
||||
use std::process::Stdio;
|
||||
|
||||
use anyhow::Context;
|
||||
use anyhow::Result;
|
||||
use anyhow::anyhow;
|
||||
use anyhow::bail;
|
||||
use anyhow::ensure;
|
||||
use anyhow::Context;
|
||||
use anyhow::Result;
|
||||
use regex_lite::Regex;
|
||||
use which::which;
|
||||
|
||||
@@ -74,7 +74,7 @@ fn parse_kmi_from_modules() -> Result<String> {
|
||||
// find a *.ko in /vendor/lib/modules
|
||||
let modfile = std::fs::read_dir("/vendor/lib/modules")?
|
||||
.filter_map(Result::ok)
|
||||
.find(|entry| entry.path().extension().map_or(false, |ext| ext == "ko"))
|
||||
.find(|entry| entry.path().extension().is_some_and(|ext| ext == "ko"))
|
||||
.map(|entry| entry.path())
|
||||
.ok_or_else(|| anyhow!("No kernel module found"))?;
|
||||
let output = Command::new("modinfo").arg(modfile).output()?;
|
||||
@@ -97,7 +97,7 @@ pub fn get_current_kmi() -> Result<String> {
|
||||
}
|
||||
|
||||
fn parse_kmi_from_kernel(kernel: &PathBuf, workdir: &Path) -> Result<String> {
|
||||
use std::fs::{copy, File};
|
||||
use std::fs::{File, copy};
|
||||
use std::io::{BufReader, Read};
|
||||
let kernel_path = workdir.join("kernel");
|
||||
copy(kernel, &kernel_path).context("Failed to copy kernel")?;
|
||||
@@ -235,7 +235,10 @@ pub fn restore(
|
||||
ensure!(status.success(), "magiskboot unpack failed");
|
||||
|
||||
let is_kernelsu_patched = is_kernelsu_patched(&magiskboot, workdir)?;
|
||||
ensure!(is_kernelsu_patched, "boot image is not patched by KernelSU Next");
|
||||
ensure!(
|
||||
is_kernelsu_patched,
|
||||
"boot image is not patched by KernelSU Next"
|
||||
);
|
||||
|
||||
let mut new_boot = None;
|
||||
let mut from_backup = false;
|
||||
|
||||
@@ -305,7 +305,6 @@ pub fn run() -> Result<()> {
|
||||
#[cfg(any(target_os = "linux", target_os = "android"))]
|
||||
{
|
||||
utils::switch_mnt_ns(1)?;
|
||||
utils::unshare_mnt_ns()?;
|
||||
}
|
||||
match command {
|
||||
Module::Install { zip } => module::install_module(&zip),
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user