You've already forked KernelSU
mirror of
https://github.com/tiann/KernelSU.git
synced 2025-08-27 23:46:34 +00:00
Compare commits
231 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
8828939994 | ||
|
|
a3b92d6fee | ||
|
|
a22959beae | ||
|
|
7753dc0987 | ||
|
|
960c40129b | ||
|
|
f371d784ea | ||
|
|
59b45ce822 | ||
|
|
340595276f | ||
|
|
72d756c9f2 | ||
|
|
3d59071571 | ||
|
|
394cfe7516 | ||
|
|
0810db101e | ||
|
|
ab0ae9d196 | ||
|
|
13748300eb | ||
|
|
c4db2bab4f | ||
|
|
e352ccc470 | ||
|
|
7747c0e211 | ||
|
|
2661a36375 | ||
|
|
1bdddb13ce | ||
|
|
7d3c50ef0a | ||
|
|
2ee7696d67 | ||
|
|
54ee400dc5 | ||
|
|
945e2c3209 | ||
|
|
298e42cb42 | ||
|
|
3a657a9dbb | ||
|
|
55aa54ca85 | ||
|
|
0b8359a2e2 | ||
|
|
afb04126f6 | ||
|
|
98fae23864 | ||
|
|
23805d4784 | ||
|
|
01bf24fa7b | ||
|
|
47f05a139d | ||
|
|
3c0c70ba7f | ||
|
|
c19ba7fab0 | ||
|
|
1f42bbac5e | ||
|
|
cbb98a1de9 | ||
|
|
08745664a6 | ||
|
|
eac6fd0484 | ||
|
|
ad1dbf77a1 | ||
|
|
81bbb31098 | ||
|
|
52234d040f | ||
|
|
1fb2aad893 | ||
|
|
64744bb31d | ||
|
|
b9747fbe69 | ||
|
|
85922946b7 | ||
|
|
40fc6d2163 | ||
|
|
da662133ae | ||
|
|
25592a0614 | ||
|
|
2d96aaa28f | ||
|
|
64cf6eb8b9 | ||
|
|
7e44765074 | ||
|
|
d84fdada31 | ||
|
|
71c14d96ab | ||
|
|
5d988002c7 | ||
|
|
15ff9fbf41 | ||
|
|
542d3e40af | ||
|
|
7c4fb51b5c | ||
|
|
5b10d10b82 | ||
|
|
677d3357b9 | ||
|
|
5e893e3d04 | ||
|
|
685cd75c99 | ||
|
|
8354204c32 | ||
|
|
d394fd2e01 | ||
|
|
71799c7aed | ||
|
|
76bdd12f73 | ||
|
|
fb103472c6 | ||
|
|
9f17bafbf0 | ||
|
|
b2f9f3ade9 | ||
|
|
12a095fd1a | ||
|
|
7153336ad1 | ||
|
|
5f2566e478 | ||
|
|
0af25af1be | ||
|
|
ea3b397f34 | ||
|
|
6aeb76a3ef | ||
|
|
ae9519de42 | ||
|
|
8bf33e9aca | ||
|
|
b91a294138 | ||
|
|
d274a315b1 | ||
|
|
b0c3c3a9a2 | ||
|
|
1147eb205d | ||
|
|
f160abf9ce | ||
|
|
61ad99dbe5 | ||
|
|
9a126645e8 | ||
|
|
21f39f6de8 | ||
|
|
0ddb8a4c89 | ||
|
|
c9997b5ca9 | ||
|
|
0b1bab5b01 | ||
|
|
676590be15 | ||
|
|
b52bf53d01 | ||
|
|
7bdb885816 | ||
|
|
cde3e95180 | ||
|
|
7ecb4b03ee | ||
|
|
e8a90aadb2 | ||
|
|
beaa048be3 | ||
|
|
936b650f12 | ||
|
|
747c91d5c8 | ||
|
|
5023d0ab1d | ||
|
|
5b638c876e | ||
|
|
d6a7231fae | ||
|
|
06681a2490 | ||
|
|
278cbef3ec | ||
|
|
a83390b0ec | ||
|
|
907bcad1a7 | ||
|
|
4c0a36785b | ||
|
|
983ad2c1fd | ||
|
|
a3590b767e | ||
|
|
12e00dc717 | ||
|
|
e00a355fa8 | ||
|
|
e95c5a9675 | ||
|
|
d0b8144b96 | ||
|
|
d16d3f87a6 | ||
|
|
76decba8d9 | ||
|
|
d75678fca0 | ||
|
|
abe1fa471d | ||
|
|
07a430aa5b | ||
|
|
df9cf61575 | ||
|
|
bfe8c2eecd | ||
|
|
b732765811 | ||
|
|
a966252fa5 | ||
|
|
3664003260 | ||
|
|
978178afc0 | ||
|
|
16f6f30eae | ||
|
|
63851f8c88 | ||
|
|
34c6765752 | ||
|
|
c23d1bcf58 | ||
|
|
6ae7e1624f | ||
|
|
ba4b014a99 | ||
|
|
f192638943 | ||
|
|
0323ee7958 | ||
|
|
021ef521cb | ||
|
|
34086cd445 | ||
|
|
c306eddee8 | ||
|
|
c72f7d750e | ||
|
|
f9a91848ad | ||
|
|
cd8013a616 | ||
|
|
dc536d652a | ||
|
|
3114f6d7f6 | ||
|
|
e2f5015107 | ||
|
|
884dd606eb | ||
|
|
8d246a6b9d | ||
|
|
2ee3d55c88 | ||
|
|
55b540bf4c | ||
|
|
c0d147dcad | ||
|
|
be413fd147 | ||
|
|
786f3d6441 | ||
|
|
8f50b5f6e5 | ||
|
|
90639fad6c | ||
|
|
2979434e2a | ||
|
|
56d145666c | ||
|
|
db5f77aa96 | ||
|
|
5fbce8ef07 | ||
|
|
4cc3644416 | ||
|
|
01a7678a26 | ||
|
|
95d22d2bb4 | ||
|
|
3efb2be456 | ||
|
|
3b7ca2d7e8 | ||
|
|
7b45bc5aad | ||
|
|
ed1e892600 | ||
|
|
f188802044 | ||
|
|
965c23867f | ||
|
|
b271b2f587 | ||
|
|
0953f50e0c | ||
|
|
77ac974ce8 | ||
|
|
d714ab0c5d | ||
|
|
38eb93d5ca | ||
|
|
080d5bd9e8 | ||
|
|
d05ec41379 | ||
|
|
d07956ead6 | ||
|
|
4e3af6dab3 | ||
|
|
45d96b98c5 | ||
|
|
b554c66b46 | ||
|
|
fb87d0f0f5 | ||
|
|
37abe48702 | ||
|
|
ec9babea76 | ||
|
|
8a464ac7b2 | ||
|
|
eb5a99e4b6 | ||
|
|
047312e0e5 | ||
|
|
45a25eda50 | ||
|
|
120c2f43de | ||
|
|
9deb820923 | ||
|
|
ae21d4c9fd | ||
|
|
5381ceabae | ||
|
|
5d07e1d392 | ||
|
|
d78f24098a | ||
|
|
cd952f5e45 | ||
|
|
156b17f69d | ||
|
|
f4d2b0feab | ||
|
|
2c0a9cd64c | ||
|
|
134507b928 | ||
|
|
2b42d14ef8 | ||
|
|
e6071b5247 | ||
|
|
f288cfccae | ||
|
|
1cc9da5efe | ||
|
|
0aee64f339 | ||
|
|
cbbdc665c8 | ||
|
|
1b2635784f | ||
|
|
ee5d2f8c84 | ||
|
|
dfc2a86e70 | ||
|
|
c0066b68f5 | ||
|
|
6ef5e4ef76 | ||
|
|
e3e77fde78 | ||
|
|
8ea55c7f2f | ||
|
|
d2a976b3cc | ||
|
|
d675662862 | ||
|
|
839b318785 | ||
|
|
971f59c11e | ||
|
|
ab58808b64 | ||
|
|
9cbb7cb10e | ||
|
|
70f2df11d1 | ||
|
|
827a2f2901 | ||
|
|
a9c33f6940 | ||
|
|
2bb73a2a92 | ||
|
|
90407986be | ||
|
|
b85ece440b | ||
|
|
a10d2651c1 | ||
|
|
b308a368d3 | ||
|
|
e6fea652de | ||
|
|
0856b718de | ||
|
|
6f1ccc5b3c | ||
|
|
da959b4e17 | ||
|
|
0bfd6d9e30 | ||
|
|
980f1d09bc | ||
|
|
b644c124e3 | ||
|
|
65005131bd | ||
|
|
18aa7f2a17 | ||
|
|
cd5bc2efa9 | ||
|
|
477361f119 | ||
|
|
d3632e4b3b | ||
|
|
0c2f90123b | ||
|
|
09d90e1a0a | ||
|
|
4fe167c361 |
5
.github/FUNDING.yml
vendored
Normal file
5
.github/FUNDING.yml
vendored
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
# These are supported funding model platforms
|
||||||
|
|
||||||
|
github: tiann
|
||||||
|
patreon: weishu
|
||||||
|
custom: https://vxposed.com/donate.html
|
||||||
2
.github/ISSUE_TEMPLATE/add_device.yml
vendored
2
.github/ISSUE_TEMPLATE/add_device.yml
vendored
@@ -6,7 +6,7 @@ body:
|
|||||||
- type: markdown
|
- type: markdown
|
||||||
attributes:
|
attributes:
|
||||||
value: |
|
value: |
|
||||||
Thanks for supporting KernelSU !
|
Thanks for supporting KernelSU!
|
||||||
- type: input
|
- type: input
|
||||||
id: repo-url
|
id: repo-url
|
||||||
attributes:
|
attributes:
|
||||||
|
|||||||
6
.github/ISSUE_TEMPLATE/bug_report.md
vendored
6
.github/ISSUE_TEMPLATE/bug_report.md
vendored
@@ -11,13 +11,13 @@ assignees: ''
|
|||||||
A clear and concise description of what the bug is.
|
A clear and concise description of what the bug is.
|
||||||
|
|
||||||
**To Reproduce**
|
**To Reproduce**
|
||||||
Steps to reproduce the behavior:
|
Steps to reproduce the behaviour:
|
||||||
1. Go to '...'
|
1. Go to '...'
|
||||||
2. Click on '....'
|
2. Click on '....'
|
||||||
3. Scroll down to '....'
|
3. Scroll down to '....'
|
||||||
4. See error
|
4. See the error
|
||||||
|
|
||||||
**Expected behavior**
|
**Expected behaviour**
|
||||||
A clear and concise description of what you expected to happen.
|
A clear and concise description of what you expected to happen.
|
||||||
|
|
||||||
**Screenshots**
|
**Screenshots**
|
||||||
|
|||||||
10
.github/ISSUE_TEMPLATE/custom.md
vendored
10
.github/ISSUE_TEMPLATE/custom.md
vendored
@@ -1,10 +0,0 @@
|
|||||||
---
|
|
||||||
name: Custom issue template
|
|
||||||
about: Describe this issue template's purpose here.
|
|
||||||
title: ''
|
|
||||||
labels: ''
|
|
||||||
assignees: ''
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
|
|
||||||
11
.github/ISSUE_TEMPLATE/custom.yml
vendored
Normal file
11
.github/ISSUE_TEMPLATE/custom.yml
vendored
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
name: Custom issue template
|
||||||
|
description: WARNING! If you are reporting a bug but use this template, the issue will be closed directly.
|
||||||
|
title: '[Custom]'
|
||||||
|
body:
|
||||||
|
- type: textarea
|
||||||
|
id: description
|
||||||
|
attributes:
|
||||||
|
label: "Describe your problem."
|
||||||
|
validations:
|
||||||
|
required: true
|
||||||
|
|
||||||
20
.github/ISSUE_TEMPLATE/feature_request.md
vendored
20
.github/ISSUE_TEMPLATE/feature_request.md
vendored
@@ -1,20 +0,0 @@
|
|||||||
---
|
|
||||||
name: Feature request
|
|
||||||
about: Suggest an idea for this project
|
|
||||||
title: ''
|
|
||||||
labels: ''
|
|
||||||
assignees: ''
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
**Is your feature request related to a problem? Please describe.**
|
|
||||||
A clear and concise description of what the problem is. Ex. I'm always frustrated when [...]
|
|
||||||
|
|
||||||
**Describe the solution you'd like**
|
|
||||||
A clear and concise description of what you want to happen.
|
|
||||||
|
|
||||||
**Describe alternatives you've considered**
|
|
||||||
A clear and concise description of any alternative solutions or features you've considered.
|
|
||||||
|
|
||||||
**Additional context**
|
|
||||||
Add any other context or screenshots about the feature request here.
|
|
||||||
40
.github/ISSUE_TEMPLATE/feature_request.yml
vendored
Normal file
40
.github/ISSUE_TEMPLATE/feature_request.yml
vendored
Normal file
@@ -0,0 +1,40 @@
|
|||||||
|
name: Feature Request
|
||||||
|
description: "Suggest an idea for this project"
|
||||||
|
title: "[Feature]"
|
||||||
|
labels: "feature"
|
||||||
|
assignees: tiann
|
||||||
|
body:
|
||||||
|
- type: markdown
|
||||||
|
id: feature-info
|
||||||
|
attributes:
|
||||||
|
value: "## Feature Infomation"
|
||||||
|
- type: textarea
|
||||||
|
id: feature-main
|
||||||
|
validations:
|
||||||
|
required: true
|
||||||
|
attributes:
|
||||||
|
label: "Is your feature request related to a problem? Please describe."
|
||||||
|
description: "A clear and concise description of what the problem is."
|
||||||
|
placeholder: "I'm always frustrated when [...]"
|
||||||
|
- type: textarea
|
||||||
|
id: feature-solution
|
||||||
|
validations:
|
||||||
|
required: true
|
||||||
|
attributes:
|
||||||
|
label: "Describe the solution you'd like."
|
||||||
|
description: "A clear and concise description of what you want to happen."
|
||||||
|
- type: textarea
|
||||||
|
id: feature-describe
|
||||||
|
validations:
|
||||||
|
required: true
|
||||||
|
attributes:
|
||||||
|
label: "Describe alternatives you've considered."
|
||||||
|
description: "A clear and concise description of any alternative solutions or features you've considered."
|
||||||
|
- type: textarea
|
||||||
|
id: feature-extra
|
||||||
|
validations:
|
||||||
|
required: false
|
||||||
|
attributes:
|
||||||
|
label: "Additional context"
|
||||||
|
description: "Add any other context or screenshots about the feature request here."
|
||||||
|
|
||||||
2
.github/workflows/add-device.yml
vendored
2
.github/workflows/add-device.yml
vendored
@@ -11,7 +11,7 @@ jobs:
|
|||||||
env:
|
env:
|
||||||
ISSUE_CONTENT: ${{ github.event.issue.body }}
|
ISSUE_CONTENT: ${{ github.event.issue.body }}
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v3
|
- uses: actions/checkout@v4
|
||||||
- name: Parse issue body
|
- name: Parse issue body
|
||||||
id: handle-add-device
|
id: handle-add-device
|
||||||
run: |
|
run: |
|
||||||
|
|||||||
16
.github/workflows/build-debug-kernel.yml
vendored
16
.github/workflows/build-debug-kernel.yml
vendored
@@ -7,9 +7,9 @@ jobs:
|
|||||||
uses: ./.github/workflows/gki-kernel.yml
|
uses: ./.github/workflows/gki-kernel.yml
|
||||||
with:
|
with:
|
||||||
version: android12-5.10
|
version: android12-5.10
|
||||||
version_name: android12-5.10.177
|
version_name: android12-5.10.185
|
||||||
tag: android12-5.10-2023-06
|
tag: android12-5.10-2023-09
|
||||||
os_patch_level: 2023-06
|
os_patch_level: 2023-09
|
||||||
patch_path: "5.10"
|
patch_path: "5.10"
|
||||||
debug: true
|
debug: true
|
||||||
build-debug-kernel-a13:
|
build-debug-kernel-a13:
|
||||||
@@ -17,15 +17,15 @@ jobs:
|
|||||||
matrix:
|
matrix:
|
||||||
include:
|
include:
|
||||||
- version: "5.10"
|
- version: "5.10"
|
||||||
sub_level: 177
|
sub_level: 187
|
||||||
os_patch_level: 2023-06
|
os_patch_level: 2023-08
|
||||||
- version: "5.15"
|
- version: "5.15"
|
||||||
sub_level: 94
|
sub_level: 119
|
||||||
os_patch_level: 2023-06
|
os_patch_level: 2023-09
|
||||||
uses: ./.github/workflows/gki-kernel.yml
|
uses: ./.github/workflows/gki-kernel.yml
|
||||||
with:
|
with:
|
||||||
version: android13-${{ matrix.version }}
|
version: android13-${{ matrix.version }}
|
||||||
version_name: android13-${{ matrix.version }}.${{ matrix.sub_level }}
|
version_name: android13-${{ matrix.version }}.${{ matrix.sub_level }}
|
||||||
tag: android13-${{ matrix.version }}-${{ matrix.os_patch_level }}
|
tag: android13-${{ matrix.version }}-${{ matrix.os_patch_level }}
|
||||||
patch_path: ${{ matrix.version }}
|
patch_path: ${{ matrix.version }}
|
||||||
debug: true
|
debug: true
|
||||||
|
|||||||
12
.github/workflows/build-kernel-a12.yml
vendored
12
.github/workflows/build-kernel-a12.yml
vendored
@@ -22,13 +22,15 @@ jobs:
|
|||||||
matrix:
|
matrix:
|
||||||
include:
|
include:
|
||||||
- sub_level: 66
|
- sub_level: 66
|
||||||
os_patch_level: 2021-11
|
os_patch_level: 2022-01
|
||||||
- sub_level: 81
|
- sub_level: 81
|
||||||
os_patch_level: 2022-03
|
os_patch_level: 2022-03
|
||||||
- sub_level: 101
|
- sub_level: 101
|
||||||
os_patch_level: 2022-05
|
os_patch_level: 2022-05
|
||||||
- sub_level: 110
|
- sub_level: 110
|
||||||
os_patch_level: 2022-07
|
os_patch_level: 2022-07
|
||||||
|
- sub_level: 117
|
||||||
|
os_patch_level: 2022-09
|
||||||
- sub_level: 136
|
- sub_level: 136
|
||||||
os_patch_level: 2022-11
|
os_patch_level: 2022-11
|
||||||
- sub_level: 149
|
- sub_level: 149
|
||||||
@@ -38,7 +40,9 @@ jobs:
|
|||||||
- sub_level: 168
|
- sub_level: 168
|
||||||
os_patch_level: 2023-05
|
os_patch_level: 2023-05
|
||||||
- sub_level: 177
|
- sub_level: 177
|
||||||
os_patch_level: 2023-06
|
os_patch_level: 2023-07
|
||||||
|
- sub_level: 185
|
||||||
|
os_patch_level: 2023-09
|
||||||
uses: ./.github/workflows/gki-kernel.yml
|
uses: ./.github/workflows/gki-kernel.yml
|
||||||
secrets: inherit
|
secrets: inherit
|
||||||
with:
|
with:
|
||||||
@@ -63,7 +67,7 @@ jobs:
|
|||||||
- name: Download artifacts
|
- name: Download artifacts
|
||||||
uses: actions/download-artifact@v3
|
uses: actions/download-artifact@v3
|
||||||
|
|
||||||
- uses: actions/checkout@v3
|
- uses: actions/checkout@v4
|
||||||
with:
|
with:
|
||||||
path: KernelSU
|
path: KernelSU
|
||||||
fetch-depth: 0
|
fetch-depth: 0
|
||||||
@@ -75,7 +79,7 @@ jobs:
|
|||||||
- name: Download prebuilt toolchain
|
- name: Download prebuilt toolchain
|
||||||
run: |
|
run: |
|
||||||
AOSP_MIRROR=https://android.googlesource.com
|
AOSP_MIRROR=https://android.googlesource.com
|
||||||
BRANCH=master-kernel-build-2022
|
BRANCH=main-kernel-build-2023
|
||||||
git clone $AOSP_MIRROR/platform/prebuilts/build-tools -b $BRANCH --depth 1 build-tools
|
git clone $AOSP_MIRROR/platform/prebuilts/build-tools -b $BRANCH --depth 1 build-tools
|
||||||
git clone $AOSP_MIRROR/kernel/prebuilts/build-tools -b $BRANCH --depth 1 kernel-build-tools
|
git clone $AOSP_MIRROR/kernel/prebuilts/build-tools -b $BRANCH --depth 1 kernel-build-tools
|
||||||
git clone $AOSP_MIRROR/platform/system/tools/mkbootimg -b $BRANCH --depth 1
|
git clone $AOSP_MIRROR/platform/system/tools/mkbootimg -b $BRANCH --depth 1
|
||||||
|
|||||||
25
.github/workflows/build-kernel-a13.yml
vendored
25
.github/workflows/build-kernel-a13.yml
vendored
@@ -36,12 +36,18 @@ jobs:
|
|||||||
- version: "5.10"
|
- version: "5.10"
|
||||||
sub_level: 177
|
sub_level: 177
|
||||||
os_patch_level: 2023-06
|
os_patch_level: 2023-06
|
||||||
|
- version: "5.10"
|
||||||
|
sub_level: 186
|
||||||
|
os_patch_level: 2023-08
|
||||||
|
- version: "5.10"
|
||||||
|
sub_level: 186
|
||||||
|
os_patch_level: 2023-09
|
||||||
- version: "5.15"
|
- version: "5.15"
|
||||||
sub_level: 41
|
sub_level: 41
|
||||||
os_patch_level: 2022-11
|
os_patch_level: 2022-11
|
||||||
- version: "5.15"
|
- version: "5.15"
|
||||||
sub_level: 74
|
sub_level: 74
|
||||||
os_patch_level: 2023-02
|
os_patch_level: 2023-01
|
||||||
- version: "5.15"
|
- version: "5.15"
|
||||||
sub_level: 78
|
sub_level: 78
|
||||||
os_patch_level: 2023-03
|
os_patch_level: 2023-03
|
||||||
@@ -50,7 +56,10 @@ jobs:
|
|||||||
os_patch_level: 2023-05
|
os_patch_level: 2023-05
|
||||||
- version: "5.15"
|
- version: "5.15"
|
||||||
sub_level: 104
|
sub_level: 104
|
||||||
os_patch_level: 2023-06
|
os_patch_level: 2023-07
|
||||||
|
- version: "5.15"
|
||||||
|
sub_level: 119
|
||||||
|
os_patch_level: 2023-09
|
||||||
uses: ./.github/workflows/gki-kernel.yml
|
uses: ./.github/workflows/gki-kernel.yml
|
||||||
secrets: inherit
|
secrets: inherit
|
||||||
with:
|
with:
|
||||||
@@ -75,7 +84,7 @@ jobs:
|
|||||||
- name: Download artifacts
|
- name: Download artifacts
|
||||||
uses: actions/download-artifact@v3
|
uses: actions/download-artifact@v3
|
||||||
|
|
||||||
- uses: actions/checkout@v3
|
- uses: actions/checkout@v4
|
||||||
with:
|
with:
|
||||||
path: KernelSU
|
path: KernelSU
|
||||||
fetch-depth: 0
|
fetch-depth: 0
|
||||||
@@ -87,7 +96,7 @@ jobs:
|
|||||||
- name: Download prebuilt toolchain
|
- name: Download prebuilt toolchain
|
||||||
run: |
|
run: |
|
||||||
AOSP_MIRROR=https://android.googlesource.com
|
AOSP_MIRROR=https://android.googlesource.com
|
||||||
BRANCH=master-kernel-build-2022
|
BRANCH=main-kernel-build-2023
|
||||||
git clone $AOSP_MIRROR/platform/prebuilts/build-tools -b $BRANCH --depth 1 build-tools
|
git clone $AOSP_MIRROR/platform/prebuilts/build-tools -b $BRANCH --depth 1 build-tools
|
||||||
git clone $AOSP_MIRROR/kernel/prebuilts/build-tools -b $BRANCH --depth 1 kernel-build-tools
|
git clone $AOSP_MIRROR/kernel/prebuilts/build-tools -b $BRANCH --depth 1 kernel-build-tools
|
||||||
git clone $AOSP_MIRROR/platform/system/tools/mkbootimg -b $BRANCH --depth 1
|
git clone $AOSP_MIRROR/platform/system/tools/mkbootimg -b $BRANCH --depth 1
|
||||||
@@ -132,11 +141,11 @@ jobs:
|
|||||||
matrix:
|
matrix:
|
||||||
include:
|
include:
|
||||||
- version: "5.10"
|
- version: "5.10"
|
||||||
sub_level: 177
|
sub_level: 187
|
||||||
os_patch_level: 2023-06
|
os_patch_level: 2023-08
|
||||||
- version: "5.15"
|
- version: "5.15"
|
||||||
sub_level: 104
|
sub_level: 119
|
||||||
os_patch_level: 2023-06
|
os_patch_level: 2023-09
|
||||||
uses: ./.github/workflows/gki-kernel.yml
|
uses: ./.github/workflows/gki-kernel.yml
|
||||||
with:
|
with:
|
||||||
version: android13-${{ matrix.version }}
|
version: android13-${{ matrix.version }}
|
||||||
|
|||||||
7
.github/workflows/build-kernel-arcvm.yml
vendored
7
.github/workflows/build-kernel-arcvm.yml
vendored
@@ -59,10 +59,9 @@ jobs:
|
|||||||
sudo ln -s --force /usr/bin/clang++-$LLVM_VERSION /usr/bin/clang++
|
sudo ln -s --force /usr/bin/clang++-$LLVM_VERSION /usr/bin/clang++
|
||||||
|
|
||||||
- name: Checkout KernelSU
|
- name: Checkout KernelSU
|
||||||
uses: actions/checkout@v3
|
uses: actions/checkout@v4
|
||||||
with:
|
with:
|
||||||
path: KernelSU
|
path: KernelSU
|
||||||
ref: main
|
|
||||||
fetch-depth: 0
|
fetch-depth: 0
|
||||||
|
|
||||||
- name: Setup kernel source
|
- name: Setup kernel source
|
||||||
@@ -98,6 +97,10 @@ jobs:
|
|||||||
run: |
|
run: |
|
||||||
set -a && . build.config.gki.x86_64; set +a
|
set -a && . build.config.gki.x86_64; set +a
|
||||||
export DEFCONFIG=x86_64_arcvm_defconfig
|
export DEFCONFIG=x86_64_arcvm_defconfig
|
||||||
|
if [ ! -z ${{ vars.EXPECTED_SIZE }} ] && [ ! -z ${{ vars.EXPECTED_HASH }} ]; then
|
||||||
|
export KSU_EXPECTED_SIZE=${{ vars.EXPECTED_SIZE }}
|
||||||
|
export KSU_EXPECTED_HASH=${{ vars.EXPECTED_HASH }}
|
||||||
|
fi
|
||||||
|
|
||||||
make LLVM=1 LLVM_IAS=1 DEPMOD=depmod DTC=dtc O=${PWD} mrproper
|
make LLVM=1 LLVM_IAS=1 DEPMOD=depmod DTC=dtc O=${PWD} mrproper
|
||||||
make LLVM=1 LLVM_IAS=1 DEPMOD=depmod DTC=dtc O=${PWD} ${DEFCONFIG} < /dev/null
|
make LLVM=1 LLVM_IAS=1 DEPMOD=depmod DTC=dtc O=${PWD} ${DEFCONFIG} < /dev/null
|
||||||
|
|||||||
76
.github/workflows/build-kernel-wsa.yml
vendored
76
.github/workflows/build-kernel-wsa.yml
vendored
@@ -18,32 +18,7 @@ jobs:
|
|||||||
strategy:
|
strategy:
|
||||||
matrix:
|
matrix:
|
||||||
arch: [x86_64, arm64]
|
arch: [x86_64, arm64]
|
||||||
version: ["5.15.78.1", "5.15.94.4"]
|
version: ["5.15.94.2", "5.15.104.1", "5.15.104.2", "5.15.104.3"]
|
||||||
include:
|
|
||||||
- arch: x86_64
|
|
||||||
file_name: "bzImage"
|
|
||||||
- arch: arm64
|
|
||||||
file_name: "Image"
|
|
||||||
cross_compile: "aarch64-linux-gnu"
|
|
||||||
- version: "5.15.78.1"
|
|
||||||
arch: x86_64
|
|
||||||
make_config: config-wsa-x64
|
|
||||||
- version: "5.15.78.1"
|
|
||||||
arch: arm64
|
|
||||||
make_config: config-wsa-arm64
|
|
||||||
- version: "5.15.94.4"
|
|
||||||
arch: x86_64
|
|
||||||
make_config: config-wsa-x64
|
|
||||||
- version: "5.15.94.4"
|
|
||||||
arch: arm64
|
|
||||||
make_config: config-wsa-arm64
|
|
||||||
- version: "5.15.78.1"
|
|
||||||
device_code: latte-2
|
|
||||||
kernel_version: "5.15"
|
|
||||||
- version: "5.15.94.4"
|
|
||||||
device_code: latte-2
|
|
||||||
kernel_version: "5.15"
|
|
||||||
|
|
||||||
|
|
||||||
name: Build WSA-Kernel-${{ matrix.version }}-${{ matrix.arch }}
|
name: Build WSA-Kernel-${{ matrix.version }}-${{ matrix.arch }}
|
||||||
runs-on: ubuntu-20.04
|
runs-on: ubuntu-20.04
|
||||||
@@ -58,32 +33,30 @@ jobs:
|
|||||||
sudo apt-get update
|
sudo apt-get update
|
||||||
sudo apt-get install -y --no-install-recommends bc bison build-essential ca-certificates flex git gnupg libelf-dev libssl-dev lsb-release software-properties-common wget libncurses-dev binutils-aarch64-linux-gnu gcc-aarch64-linux-gnu nuget gzip
|
sudo apt-get install -y --no-install-recommends bc bison build-essential ca-certificates flex git gnupg libelf-dev libssl-dev lsb-release software-properties-common wget libncurses-dev binutils-aarch64-linux-gnu gcc-aarch64-linux-gnu nuget gzip
|
||||||
export LLVM_VERSION=12
|
export LLVM_VERSION=12
|
||||||
wget https://apt.llvm.org/llvm.sh
|
wget -q https://apt.llvm.org/llvm.sh
|
||||||
chmod +x llvm.sh
|
sudo bash ./llvm.sh $LLVM_VERSION
|
||||||
sudo ./llvm.sh $LLVM_VERSION
|
cd /usr/bin
|
||||||
rm ./llvm.sh
|
sudo ln -sf clang-$LLVM_VERSION clang
|
||||||
sudo ln -s --force /usr/bin/clang-$LLVM_VERSION /usr/bin/clang
|
sudo ln -sf ld.lld-$LLVM_VERSION ld.lld
|
||||||
sudo ln -s --force /usr/bin/ld.lld-$LLVM_VERSION /usr/bin/ld.lld
|
sudo ln -sf llvm-objdump-$LLVM_VERSION llvm-objdump
|
||||||
sudo ln -s --force /usr/bin/llvm-objdump-$LLVM_VERSION /usr/bin/llvm-objdump
|
sudo ln -sf llvm-ar-$LLVM_VERSION llvm-ar
|
||||||
sudo ln -s --force /usr/bin/llvm-ar-$LLVM_VERSION /usr/bin/llvm-ar
|
sudo ln -sf llvm-nm-$LLVM_VERSION llvm-nm
|
||||||
sudo ln -s --force /usr/bin/llvm-nm-$LLVM_VERSION /usr/bin/llvm-nm
|
sudo ln -sf llvm-strip-$LLVM_VERSION llvm-strip
|
||||||
sudo ln -s --force /usr/bin/llvm-strip-$LLVM_VERSION /usr/bin/llvm-strip
|
sudo ln -sf llvm-objcopy-$LLVM_VERSION llvm-objcopy
|
||||||
sudo ln -s --force /usr/bin/llvm-objcopy-$LLVM_VERSION /usr/bin/llvm-objcopy
|
sudo ln -sf llvm-readelf-$LLVM_VERSION llvm-readelf
|
||||||
sudo ln -s --force /usr/bin/llvm-readelf-$LLVM_VERSION /usr/bin/llvm-readelf
|
sudo ln -sf clang++-$LLVM_VERSION clang++
|
||||||
sudo ln -s --force /usr/bin/clang++-$LLVM_VERSION /usr/bin/clang++
|
|
||||||
|
|
||||||
- name: Checkout KernelSU
|
- name: Checkout KernelSU
|
||||||
uses: actions/checkout@v3
|
uses: actions/checkout@v4
|
||||||
with:
|
with:
|
||||||
path: KernelSU
|
path: KernelSU
|
||||||
ref: main
|
|
||||||
fetch-depth: 0
|
fetch-depth: 0
|
||||||
|
|
||||||
- name: Setup kernel source
|
- name: Setup kernel source
|
||||||
uses: actions/checkout@v3
|
uses: actions/checkout@v4
|
||||||
with:
|
with:
|
||||||
repository: microsoft/WSA-Linux-Kernel
|
repository: microsoft/WSA-Linux-Kernel
|
||||||
ref: android-lts/${{ matrix.device_code }}/${{ matrix.version }}
|
ref: android-lts/latte-2/${{ matrix.version }}
|
||||||
path: WSA-Linux-Kernel
|
path: WSA-Linux-Kernel
|
||||||
|
|
||||||
- name: Setup Ccache
|
- name: Setup Ccache
|
||||||
@@ -105,7 +78,7 @@ jobs:
|
|||||||
DRIVER_MAKEFILE=$KERNEL_ROOT/drivers/Makefile
|
DRIVER_MAKEFILE=$KERNEL_ROOT/drivers/Makefile
|
||||||
grep -q "kernelsu" $DRIVER_MAKEFILE || echo "obj-y += kernelsu/" >> $DRIVER_MAKEFILE
|
grep -q "kernelsu" $DRIVER_MAKEFILE || echo "obj-y += kernelsu/" >> $DRIVER_MAKEFILE
|
||||||
echo "[+] Apply KernelSU patches"
|
echo "[+] Apply KernelSU patches"
|
||||||
cd $KERNEL_ROOT && git apply $GITHUB_WORKSPACE/KernelSU/.github/patches/${{ matrix.kernel_version }}/*.patch
|
cd $KERNEL_ROOT && git apply $GITHUB_WORKSPACE/KernelSU/.github/patches/5.15/*.patch
|
||||||
echo "[+] KernelSU setup done."
|
echo "[+] KernelSU setup done."
|
||||||
cd $GITHUB_WORKSPACE/KernelSU
|
cd $GITHUB_WORKSPACE/KernelSU
|
||||||
VERSION=$(($(git rev-list --count HEAD) + 10200))
|
VERSION=$(($(git rev-list --count HEAD) + 10200))
|
||||||
@@ -115,10 +88,17 @@ jobs:
|
|||||||
- name: Build Kernel
|
- name: Build Kernel
|
||||||
working-directory: WSA-Linux-Kernel
|
working-directory: WSA-Linux-Kernel
|
||||||
run: |
|
run: |
|
||||||
cp configs/wsa/${{ matrix.make_config }} .config
|
declare -A ARCH_MAP=(["x86_64"]="x64" ["arm64"]="arm64")
|
||||||
|
cp configs/wsa/config-wsa-${ARCH_MAP[${{ matrix.arch }}]} .config
|
||||||
make olddefconfig
|
make olddefconfig
|
||||||
make -j`nproc` LLVM=1 ARCH=${{ matrix.arch }} CROSS_COMPILE=${{ matrix.cross_compile }} ${{ matrix.file_name }} CCACHE="/usr/bin/ccache"
|
if [ ! -z ${{ vars.EXPECTED_SIZE }} ] && [ ! -z ${{ vars.EXPECTED_HASH }} ]; then
|
||||||
echo "file_path=WSA-Linux-Kernel/arch/${{ matrix.arch }}/boot/${{ matrix.file_name }}" >> $GITHUB_ENV
|
export KSU_EXPECTED_SIZE=${{ vars.EXPECTED_SIZE }}
|
||||||
|
export KSU_EXPECTED_HASH=${{ vars.EXPECTED_HASH }}
|
||||||
|
fi
|
||||||
|
declare -A FILE_NAME=(["x86_64"]="bzImage" ["arm64"]="Image")
|
||||||
|
make -j`nproc` LLVM=1 ARCH=${{ matrix.arch }} $(if [ "${{ matrix.arch }}" == "arm64" ]; then echo CROSS_COMPILE=aarch64-linux-gnu; fi) ${FILE_NAME[${{ matrix.arch }}]} CCACHE="/usr/bin/ccache"
|
||||||
|
declare -A ARCH_MAP_FILE=(["x86_64"]="x86" ["arm64"]="arm64")
|
||||||
|
echo "file_path=WSA-Linux-Kernel/arch/${ARCH_MAP_FILE[${{ matrix.arch }}]}/boot/${FILE_NAME[${{ matrix.arch }}]}" >> $GITHUB_ENV
|
||||||
|
|
||||||
- name: Upload kernel-${{ matrix.arch }}-${{ matrix.version }}
|
- name: Upload kernel-${{ matrix.arch }}-${{ matrix.version }}
|
||||||
uses: actions/upload-artifact@v3
|
uses: actions/upload-artifact@v3
|
||||||
@@ -127,7 +107,7 @@ jobs:
|
|||||||
path: "${{ env.file_path }}"
|
path: "${{ env.file_path }}"
|
||||||
|
|
||||||
- name: Post to Telegram
|
- name: Post to Telegram
|
||||||
if: ${{ ( github.event_name == 'push' && github.ref == 'refs/heads/main' ) || github.ref_type == 'tag' }}
|
if: github.event_name == 'push' && github.ref == 'refs/heads/main' || github.ref_type == 'tag'
|
||||||
env:
|
env:
|
||||||
CHAT_ID: ${{ secrets.CHAT_ID }}
|
CHAT_ID: ${{ secrets.CHAT_ID }}
|
||||||
CACHE_CHAT_ID: ${{ secrets.CACHE_CHAT_ID }}
|
CACHE_CHAT_ID: ${{ secrets.CACHE_CHAT_ID }}
|
||||||
|
|||||||
4
.github/workflows/build-ksud.yml
vendored
4
.github/workflows/build-ksud.yml
vendored
@@ -2,13 +2,13 @@ name: Build KSUD
|
|||||||
on:
|
on:
|
||||||
push:
|
push:
|
||||||
branches: [ "main", "ci" ]
|
branches: [ "main", "ci" ]
|
||||||
paths:
|
paths:
|
||||||
- '.github/workflows/build-ksud.yml'
|
- '.github/workflows/build-ksud.yml'
|
||||||
- '.github/workflows/ksud.yml'
|
- '.github/workflows/ksud.yml'
|
||||||
- 'userspace/ksud/**'
|
- 'userspace/ksud/**'
|
||||||
pull_request:
|
pull_request:
|
||||||
branches: [ "main" ]
|
branches: [ "main" ]
|
||||||
paths:
|
paths:
|
||||||
- '.github/workflows/build-ksud.yml'
|
- '.github/workflows/build-ksud.yml'
|
||||||
- '.github/workflows/ksud.yml'
|
- '.github/workflows/ksud.yml'
|
||||||
- 'userspace/ksud/**'
|
- 'userspace/ksud/**'
|
||||||
|
|||||||
2
.github/workflows/build-manager.yml
vendored
2
.github/workflows/build-manager.yml
vendored
@@ -33,7 +33,7 @@ jobs:
|
|||||||
|
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout
|
- name: Checkout
|
||||||
uses: actions/checkout@v3
|
uses: actions/checkout@v4
|
||||||
with:
|
with:
|
||||||
fetch-depth: 0
|
fetch-depth: 0
|
||||||
|
|
||||||
|
|||||||
6
.github/workflows/build-su.yml
vendored
6
.github/workflows/build-su.yml
vendored
@@ -2,20 +2,20 @@ name: Build SU
|
|||||||
on:
|
on:
|
||||||
push:
|
push:
|
||||||
branches: [ "main" ]
|
branches: [ "main" ]
|
||||||
paths:
|
paths:
|
||||||
- '.github/workflows/build-su.yml'
|
- '.github/workflows/build-su.yml'
|
||||||
- 'userspace/su/**'
|
- 'userspace/su/**'
|
||||||
- 'scripts/ksubot.py'
|
- 'scripts/ksubot.py'
|
||||||
pull_request:
|
pull_request:
|
||||||
branches: [ "main" ]
|
branches: [ "main" ]
|
||||||
paths:
|
paths:
|
||||||
- 'userspace/su/**'
|
- 'userspace/su/**'
|
||||||
jobs:
|
jobs:
|
||||||
build-su:
|
build-su:
|
||||||
name: Build userspace su
|
name: Build userspace su
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v3
|
- uses: actions/checkout@v4
|
||||||
with:
|
with:
|
||||||
fetch-depth: 0
|
fetch-depth: 0
|
||||||
- name: Setup need_upload
|
- name: Setup need_upload
|
||||||
|
|||||||
2
.github/workflows/clippy.yml
vendored
2
.github/workflows/clippy.yml
vendored
@@ -21,7 +21,7 @@ jobs:
|
|||||||
clippy:
|
clippy:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v3
|
- uses: actions/checkout@v4
|
||||||
# cross build failed after Rust 1.68, see https://github.com/cross-rs/cross/issues/1222
|
# cross build failed after Rust 1.68, see https://github.com/cross-rs/cross/issues/1222
|
||||||
- run: rustup default 1.67.0
|
- run: rustup default 1.67.0
|
||||||
- uses: Swatinem/rust-cache@v2
|
- uses: Swatinem/rust-cache@v2
|
||||||
|
|||||||
2
.github/workflows/deploy-website.yml
vendored
2
.github/workflows/deploy-website.yml
vendored
@@ -16,7 +16,7 @@ jobs:
|
|||||||
run:
|
run:
|
||||||
working-directory: ./website
|
working-directory: ./website
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v3
|
- uses: actions/checkout@v4
|
||||||
with:
|
with:
|
||||||
fetch-depth: 0
|
fetch-depth: 0
|
||||||
- uses: actions/setup-node@v3
|
- uses: actions/setup-node@v3
|
||||||
|
|||||||
34
.github/workflows/gki-kernel.yml
vendored
34
.github/workflows/gki-kernel.yml
vendored
@@ -70,7 +70,17 @@ jobs:
|
|||||||
CCACHE_NOHASHDIR: "true"
|
CCACHE_NOHASHDIR: "true"
|
||||||
CCACHE_HARDLINK: "true"
|
CCACHE_HARDLINK: "true"
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v3
|
- name: Maximize build space
|
||||||
|
uses: easimon/maximize-build-space@master
|
||||||
|
with:
|
||||||
|
root-reserve-mb: 8192
|
||||||
|
temp-reserve-mb: 2048
|
||||||
|
remove-dotnet: 'true'
|
||||||
|
remove-android: 'true'
|
||||||
|
remove-haskell: 'true'
|
||||||
|
remove-codeql: 'true'
|
||||||
|
|
||||||
|
- uses: actions/checkout@v4
|
||||||
with:
|
with:
|
||||||
path: KernelSU
|
path: KernelSU
|
||||||
fetch-depth: 0
|
fetch-depth: 0
|
||||||
@@ -86,17 +96,22 @@ jobs:
|
|||||||
|
|
||||||
- name: Setup kernel source
|
- name: Setup kernel source
|
||||||
run: |
|
run: |
|
||||||
|
echo "Free space:"
|
||||||
|
df -h
|
||||||
cd $GITHUB_WORKSPACE
|
cd $GITHUB_WORKSPACE
|
||||||
git clone https://gerrit.googlesource.com/git-repo
|
sudo apt-get install repo -y
|
||||||
mkdir android-kernel && cd android-kernel
|
mkdir android-kernel && cd android-kernel
|
||||||
../git-repo/repo init --depth=1 --u https://android.googlesource.com/kernel/manifest -b common-${{ inputs.tag }}
|
repo init --depth=1 --u https://android.googlesource.com/kernel/manifest -b common-${{ inputs.tag }} --repo-rev=v2.16
|
||||||
REMOTE_BRANCH=$(git ls-remote https://android.googlesource.com/kernel/common ${{ inputs.tag }})
|
REMOTE_BRANCH=$(git ls-remote https://android.googlesource.com/kernel/common ${{ inputs.tag }})
|
||||||
|
DEFAULT_MANIFEST_PATH=.repo/manifests/default.xml
|
||||||
if grep -q deprecated <<< $REMOTE_BRANCH; then
|
if grep -q deprecated <<< $REMOTE_BRANCH; then
|
||||||
echo "Found deprecated branch: ${{ inputs.tag }}"
|
echo "Found deprecated branch: ${{ inputs.tag }}"
|
||||||
sed -i 's/"${{ inputs.tag }}"/"deprecated\/${{ inputs.tag }}"/g' .repo/manifests/default.xml
|
sed -i 's/"${{ inputs.tag }}"/"deprecated\/${{ inputs.tag }}"/g' $DEFAULT_MANIFEST_PATH
|
||||||
cat .repo/manifests/default.xml
|
cat $DEFAULT_MANIFEST_PATH
|
||||||
fi
|
fi
|
||||||
../git-repo/repo sync -j$(nproc --all)
|
repo --version
|
||||||
|
repo --trace sync -c -j$(nproc --all) --no-tags
|
||||||
|
df -h
|
||||||
|
|
||||||
- name: Setup KernelSU
|
- name: Setup KernelSU
|
||||||
env:
|
env:
|
||||||
@@ -144,7 +159,12 @@ jobs:
|
|||||||
|
|
||||||
- name: Build boot.img
|
- name: Build boot.img
|
||||||
working-directory: android-kernel
|
working-directory: android-kernel
|
||||||
run: CCACHE="/usr/bin/ccache" LTO=thin BUILD_CONFIG=common/build.config.gki.aarch64 build/build.sh
|
run: |
|
||||||
|
if [ ! -z ${{ vars.EXPECTED_SIZE }} ] && [ ! -z ${{ vars.EXPECTED_HASH }} ]; then
|
||||||
|
export KSU_EXPECTED_SIZE=${{ vars.EXPECTED_SIZE }}
|
||||||
|
export KSU_EXPECTED_HASH=${{ vars.EXPECTED_HASH }}
|
||||||
|
fi
|
||||||
|
CCACHE="/usr/bin/ccache" LTO=thin BUILD_CONFIG=common/build.config.gki.aarch64 build/build.sh
|
||||||
|
|
||||||
- name: Prepare artifacts
|
- name: Prepare artifacts
|
||||||
id: prepareArtifacts
|
id: prepareArtifacts
|
||||||
|
|||||||
2
.github/workflows/ksud.yml
vendored
2
.github/workflows/ksud.yml
vendored
@@ -13,7 +13,7 @@ jobs:
|
|||||||
build:
|
build:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v3
|
- uses: actions/checkout@v4
|
||||||
with:
|
with:
|
||||||
fetch-depth: 0
|
fetch-depth: 0
|
||||||
# cross build failed after Rust 1.68, see https://github.com/cross-rs/cross/issues/1222
|
# cross build failed after Rust 1.68, see https://github.com/cross-rs/cross/issues/1222
|
||||||
|
|||||||
15
.github/workflows/release.yml
vendored
15
.github/workflows/release.yml
vendored
@@ -15,12 +15,15 @@ jobs:
|
|||||||
uses: ./.github/workflows/build-kernel-a13.yml
|
uses: ./.github/workflows/build-kernel-a13.yml
|
||||||
build-wsa-kernel:
|
build-wsa-kernel:
|
||||||
uses: ./.github/workflows/build-kernel-wsa.yml
|
uses: ./.github/workflows/build-kernel-wsa.yml
|
||||||
|
build-arcvm-kernel:
|
||||||
|
uses: ./.github/workflows/build-kernel-arcvm.yml
|
||||||
release:
|
release:
|
||||||
needs:
|
needs:
|
||||||
- build-manager
|
- build-manager
|
||||||
- build-a12-kernel
|
- build-a12-kernel
|
||||||
- build-a13-kernel
|
- build-a13-kernel
|
||||||
- build-wsa-kernel
|
- build-wsa-kernel
|
||||||
|
- build-arcvm-kernel
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- name: Download artifacts
|
- name: Download artifacts
|
||||||
@@ -43,6 +46,15 @@ jobs:
|
|||||||
fi
|
fi
|
||||||
done
|
done
|
||||||
|
|
||||||
|
- name: Zip ChromeOS ARCVM kernel
|
||||||
|
run: |
|
||||||
|
for dir in kernel-ARCVM-*; do
|
||||||
|
if [ -d "$dir" ]; then
|
||||||
|
echo "------ Zip $dir ----------"
|
||||||
|
(cd $dir && zip -r9 "$dir".zip ./* -x .git .gitignore ./*.zip && mv *.zip ..)
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
|
||||||
- name: Display structure of downloaded files
|
- name: Display structure of downloaded files
|
||||||
run: ls -R
|
run: ls -R
|
||||||
|
|
||||||
@@ -54,3 +66,4 @@ jobs:
|
|||||||
AnyKernel3-*.zip
|
AnyKernel3-*.zip
|
||||||
boot-images-*/Image-*/*.img.gz
|
boot-images-*/Image-*/*.img.gz
|
||||||
kernel-WSA*.zip
|
kernel-WSA*.zip
|
||||||
|
kernel-ARCVM*.zip
|
||||||
|
|||||||
6
.github/workflows/rustfmt.yml
vendored
6
.github/workflows/rustfmt.yml
vendored
@@ -21,13 +21,13 @@ jobs:
|
|||||||
format:
|
format:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v3
|
- uses: actions/checkout@v4
|
||||||
|
|
||||||
- uses: dtolnay/rust-toolchain@nightly
|
- uses: dtolnay/rust-toolchain@nightly
|
||||||
with:
|
with:
|
||||||
components: rustfmt
|
components: rustfmt
|
||||||
|
|
||||||
- uses: LoliGothick/rustfmt-check@v0.3.1
|
- uses: LoliGothick/rustfmt-check@master
|
||||||
with:
|
with:
|
||||||
token: ${{ github.token }}
|
token: ${{ github.token }}
|
||||||
options: --manifest-path userspace/ksud/Cargo.toml
|
working-directory: userspace/ksud
|
||||||
|
|||||||
2
.github/workflows/shellcheck.yml
vendored
2
.github/workflows/shellcheck.yml
vendored
@@ -18,7 +18,7 @@ jobs:
|
|||||||
shellcheck:
|
shellcheck:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v3
|
- uses: actions/checkout@v4
|
||||||
|
|
||||||
- name: Run ShellCheck
|
- name: Run ShellCheck
|
||||||
uses: ludeeus/action-shellcheck@2.0.0
|
uses: ludeeus/action-shellcheck@2.0.0
|
||||||
|
|||||||
42
README.md
42
README.md
@@ -1,42 +0,0 @@
|
|||||||
**English** | [简体中文](README_CN.md) | [繁體中文](README_TW.md) | [日本語](README_JP.md) | [Portuguese-Brazil](README_PT-BR.md) | [Türkçe](README_TR.md)
|
|
||||||
|
|
||||||
# KernelSU
|
|
||||||
|
|
||||||
A Kernel based root solution for Android devices.
|
|
||||||
|
|
||||||
## Features
|
|
||||||
|
|
||||||
1. Kernel-based `su` and root access management.
|
|
||||||
2. Module system based on overlayfs.
|
|
||||||
|
|
||||||
## Compatibility State
|
|
||||||
|
|
||||||
KernelSU officially supports Android GKI 2.0 devices(with kernel 5.10+), old kernels(4.14+) is also compatible, but you need to build kernel yourself.
|
|
||||||
|
|
||||||
WSA and containter-based Android should also work with KernelSU integrated.
|
|
||||||
|
|
||||||
And the current supported ABIs are : `arm64-v8a` and `x86_64`
|
|
||||||
|
|
||||||
## Usage
|
|
||||||
|
|
||||||
[Installation](https://kernelsu.org/guide/installation.html)
|
|
||||||
|
|
||||||
## Build
|
|
||||||
|
|
||||||
[How to build?](https://kernelsu.org/guide/how-to-build.html)
|
|
||||||
|
|
||||||
### Discussion
|
|
||||||
|
|
||||||
- Telegram: [@KernelSU](https://t.me/KernelSU)
|
|
||||||
|
|
||||||
## License
|
|
||||||
|
|
||||||
- Files under `kernel` directory are [GPL-2](https://www.gnu.org/licenses/old-licenses/gpl-2.0.en.html)
|
|
||||||
- All other parts except `kernel` directory are [GPL-3](https://www.gnu.org/licenses/gpl-3.0.html)
|
|
||||||
|
|
||||||
## Credits
|
|
||||||
|
|
||||||
- [kernel-assisted-superuser](https://git.zx2c4.com/kernel-assisted-superuser/about/): the KernelSU idea.
|
|
||||||
- [genuine](https://github.com/brevent/genuine/): apk v2 signature validation.
|
|
||||||
- [Diamorphine](https://github.com/m0nad/Diamorphine): some rootkit skills.
|
|
||||||
- [Magisk](https://github.com/topjohnwu/Magisk): the sepolicy implementation.
|
|
||||||
42
README_CN.md
42
README_CN.md
@@ -1,42 +0,0 @@
|
|||||||
[English](README.md) | **简体中文** | [繁體中文](README_TW.md) | [日本語](README_JP.md) | [Portuguese-Brazil](README_PT-BR.md) | [Türkçe](README_TR.md)
|
|
||||||
|
|
||||||
# KernelSU
|
|
||||||
|
|
||||||
一个 Android 上基于内核的 root 方案。
|
|
||||||
|
|
||||||
## 特性
|
|
||||||
|
|
||||||
- 基于内核的 su 和权限管理。
|
|
||||||
- 基于 overlayfs 的模块系统。
|
|
||||||
|
|
||||||
## 兼容状态
|
|
||||||
|
|
||||||
KernelSU 官方支持 GKI 2.0 的设备(内核版本5.10以上);旧内核也是兼容的(最低4.14+),不过需要自己编译内核。
|
|
||||||
|
|
||||||
WSA 和运行在容器上的 Android 也可以与 KernelSU 一起工作。
|
|
||||||
|
|
||||||
目前支持架构 : `arm64-v8a` 和 `x86_64`
|
|
||||||
|
|
||||||
## 使用方法
|
|
||||||
|
|
||||||
[安装教程](https://kernelsu.org/zh_CN/guide/installation.html)
|
|
||||||
|
|
||||||
## 构建
|
|
||||||
|
|
||||||
[如何构建?](https://kernelsu.org/zh_CN/guide/how-to-build.html)
|
|
||||||
|
|
||||||
### 讨论
|
|
||||||
|
|
||||||
- Telegram: [@KernelSU](https://t.me/KernelSU)
|
|
||||||
|
|
||||||
## 许可证
|
|
||||||
|
|
||||||
- 目录 `kernel` 下所有文件为 [GPL-2](https://www.gnu.org/licenses/old-licenses/gpl-2.0.en.html)
|
|
||||||
- 除 `kernel` 目录的其他部分均为 [GPL-3](https://www.gnu.org/licenses/gpl-3.0.html)
|
|
||||||
|
|
||||||
## 鸣谢
|
|
||||||
|
|
||||||
- [kernel-assisted-superuser](https://git.zx2c4.com/kernel-assisted-superuser/about/):KernelSU 的灵感。
|
|
||||||
- [genuine](https://github.com/brevent/genuine/):apk v2 签名验证。
|
|
||||||
- [Diamorphine](https://github.com/m0nad/Diamorphine):一些 rootkit 技巧。
|
|
||||||
- [Magisk](https://github.com/topjohnwu/Magisk):sepolicy 的实现。
|
|
||||||
@@ -1,47 +0,0 @@
|
|||||||
[English](README.md) | [简体中文](README_CN.md) | [繁體中文](README_TW.md) | [日本語](README_JP.md) | **Portuguese-Brazil** | [Türkçe](README_TR.md)
|
|
||||||
|
|
||||||
# KernelSU
|
|
||||||
|
|
||||||
Uma solução raiz baseada em Kernel para dispositivos Android.
|
|
||||||
|
|
||||||
## Características
|
|
||||||
|
|
||||||
1. `su` baseado em kernel e gerenciamento de acesso root.
|
|
||||||
|
|
||||||
2. Sistema modular baseado em overlayfs.
|
|
||||||
|
|
||||||
## Estado de compatibilidade
|
|
||||||
|
|
||||||
O KernelSU suporta oficialmente dispositivos Android GKI 2.0 (com kernel 5.10+), kernels antigos (4.14+) também são compatíveis, mas você mesmo precisa construir o kernel.
|
|
||||||
|
|
||||||
O Android baseado em WSA e contêiner também deve funcionar com o KernelSU integrado.
|
|
||||||
|
|
||||||
E os ABIs atualmente suportados são: `arm64-v8a` e `x86_64`
|
|
||||||
|
|
||||||
## Uso
|
|
||||||
|
|
||||||
[Instalação](https://kernelsu.org/guide/installation.html)
|
|
||||||
|
|
||||||
## Construir
|
|
||||||
|
|
||||||
[Como construir?](https://kernelsu.org/guide/how-to-build.html)
|
|
||||||
|
|
||||||
### Discussão
|
|
||||||
|
|
||||||
- Telegram: [@KernelSU](https://t.me/KernelSU)
|
|
||||||
|
|
||||||
## Licença
|
|
||||||
|
|
||||||
- Os arquivos no diretório `kernel` são [GPL-2](https://www.gnu.org/licenses/old-licenses/gpl-2.0.en.html)
|
|
||||||
|
|
||||||
- Todas as outras partes, exceto o diretório `kernel`, são [GPL-3](https://www.gnu.org/licenses/gpl-3.0.html)
|
|
||||||
|
|
||||||
## Créditos
|
|
||||||
|
|
||||||
- [kernel-assisted-superuser](https://git.zx2c4.com/kernel-assisted-superuser/about/): a ideia do KernelSU.
|
|
||||||
|
|
||||||
- [genuine](https://github.com/brevent/genuine/): validação de assinatura apk v2.
|
|
||||||
|
|
||||||
- [Diamorphine](https://github.com/m0nad/Diamorphine): algumas habilidades de rootkit.
|
|
||||||
|
|
||||||
- [Magisk](https://github.com/topjohnwu/Magisk): a implementação da sepolicy.
|
|
||||||
7
SECURITY.md
Normal file
7
SECURITY.md
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
# Reporting Security Issues
|
||||||
|
|
||||||
|
The KernelSU team and community take security bugs in KernelSU seriously. We appreciate your efforts to responsibly disclose your findings, and will make every effort to acknowledge your contributions.
|
||||||
|
|
||||||
|
To report a security issue, please use the GitHub Security Advisory ["Report a Vulnerability"](https://github.com/tiann/KernelSU/security/advisories/new) tab, or you can mailto [weishu](mailto:twsxtd@gmail.com) directly.
|
||||||
|
|
||||||
|
The KernelSU team will send a response indicating the next steps in handling your report. After the initial reply to your report, the security team will keep you informed of the progress towards a fix and full announcement, and may ask for additional information or guidance.
|
||||||
46
docs/README.md
Normal file
46
docs/README.md
Normal file
@@ -0,0 +1,46 @@
|
|||||||
|
|
||||||
|
**English** | [Español](README_ES.md) | [简体中文](README_CN.md) | [繁體中文](README_TW.md) | [日本語](README_JP.md) | [Polski](README_PL.md) | [Portuguese-Brazil](README_PT-BR.md) | [Türkçe](README_TR.md) | [Русский](README_RU.md) | [Tiếng Việt](README_VI.md) | [Indonesia](README_ID.md) | [עברית](README_iw.md) | [हिंदी](README_IN.md)
|
||||||
|
|
||||||
|
# KernelSU
|
||||||
|
|
||||||
|
A Kernel-based root solution for Android devices.
|
||||||
|
|
||||||
|
## Features
|
||||||
|
|
||||||
|
1. Kernel-based `su` and root access management.
|
||||||
|
2. Module system based on overlayfs.
|
||||||
|
3. [App Profile](https://kernelsu.org/guide/app-profile.html): Lock up the root power in a cage.
|
||||||
|
|
||||||
|
## Compatibility State
|
||||||
|
|
||||||
|
KernelSU officially supports Android GKI 2.0 devices (kernel 5.10+). Older kernels (4.14+) are also compatible, but the kernel will have to be built manually.
|
||||||
|
|
||||||
|
With this, WSA, ChromeOS, and container-based Android are all supported.
|
||||||
|
|
||||||
|
Currently, only `arm64-v8a` and `x86_64` are supported.
|
||||||
|
|
||||||
|
## Usage
|
||||||
|
|
||||||
|
- [Installation Instruction](https://kernelsu.org/guide/installation.html)
|
||||||
|
- [How to build?](https://kernelsu.org/guide/how-to-build.html)
|
||||||
|
- [Official Website](https://kernelsu.org/)
|
||||||
|
|
||||||
|
## Translation
|
||||||
|
|
||||||
|
To help translate KernelSU or improve existing translations, please use [Weblate](https://hosted.weblate.org/engage/kernelsu/).
|
||||||
|
|
||||||
|
## Discussion
|
||||||
|
|
||||||
|
- Telegram: [@KernelSU](https://t.me/KernelSU)
|
||||||
|
|
||||||
|
## License
|
||||||
|
|
||||||
|
- Files under the `kernel` directory are [GPL-2](https://www.gnu.org/licenses/old-licenses/gpl-2.0.en.html)
|
||||||
|
- All other parts except the `kernel` directory are [GPL-3](https://www.gnu.org/licenses/gpl-3.0.html)
|
||||||
|
|
||||||
|
## 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.
|
||||||
44
docs/README_CN.md
Normal file
44
docs/README_CN.md
Normal file
@@ -0,0 +1,44 @@
|
|||||||
|
[English](README.md) | [Español](README_ES.md) | **简体中文** | [繁體中文](README_TW.md) | [日本語](README_JP.md) | [Polski](README_PL.md) | [Portuguese-Brazil](README_PT-BR.md) | [Türkçe](README_TR.md) | [Русский](README_RU.md) | [Tiếng Việt](README_VI.md) | [Indonesia](README_ID.md) | [עברית](README_iw.md) | [हिंदी](README_IN.md)
|
||||||
|
|
||||||
|
# KernelSU
|
||||||
|
|
||||||
|
一个 Android 上基于内核的 root 方案。
|
||||||
|
|
||||||
|
## 特性
|
||||||
|
|
||||||
|
- 基于内核的 su 和权限管理。
|
||||||
|
- 基于 overlayfs 的模块系统。
|
||||||
|
- [App Profile](https://kernelsu.org/guide/app-profile.html): 把 Root 权限关进笼子里。
|
||||||
|
|
||||||
|
## 兼容状态
|
||||||
|
|
||||||
|
KernelSU 官方支持 GKI 2.0 的设备(内核版本5.10以上);旧内核也是兼容的(最低4.14+),不过需要自己编译内核。
|
||||||
|
|
||||||
|
WSA, ChromeOS 和运行在容器上的 Android 也可以与 KernelSU 一起工作。
|
||||||
|
|
||||||
|
目前支持架构 : `arm64-v8a` 和 `x86_64`
|
||||||
|
|
||||||
|
## 使用方法
|
||||||
|
|
||||||
|
- [安装教程](https://kernelsu.org/zh_CN/guide/installation.html)
|
||||||
|
- [如何构建?](https://kernelsu.org/zh_CN/guide/how-to-build.html)
|
||||||
|
|
||||||
|
## 参与翻译
|
||||||
|
|
||||||
|
要将 KernelSU 翻译成您的语言,或完善现有的翻译,请使用 [Weblate](https://hosted.weblate.org/engage/kernelsu/)。
|
||||||
|
|
||||||
|
## 讨论
|
||||||
|
|
||||||
|
- Telegram: [@KernelSU](https://t.me/KernelSU)
|
||||||
|
|
||||||
|
## 许可证
|
||||||
|
|
||||||
|
- 目录 `kernel` 下所有文件为 [GPL-2](https://www.gnu.org/licenses/old-licenses/gpl-2.0.en.html)
|
||||||
|
- 除 `kernel` 目录的其他部分均为 [GPL-3](https://www.gnu.org/licenses/gpl-3.0.html)
|
||||||
|
|
||||||
|
## 鸣谢
|
||||||
|
|
||||||
|
- [kernel-assisted-superuser](https://git.zx2c4.com/kernel-assisted-superuser/about/):KernelSU 的灵感。
|
||||||
|
- [Magisk](https://github.com/topjohnwu/Magisk):强大的 root 工具箱。
|
||||||
|
- [genuine](https://github.com/brevent/genuine/):apk v2 签名验证。
|
||||||
|
- [Diamorphine](https://github.com/m0nad/Diamorphine):一些 rootkit 技巧。
|
||||||
47
docs/README_ES.md
Normal file
47
docs/README_ES.md
Normal file
@@ -0,0 +1,47 @@
|
|||||||
|
[ 🇬🇧 English](README.md) | 🇪🇸 **Español** | [🇨🇳 简体中文](README_CN.md) | [🇹🇼 繁體中文](README_TW.md) | [ 🇯🇵 日本語](README_JP.md) | [🇵🇱 Polski](README_PL.md) | [🇧🇷 Portuguese-Brazil](README_PT-BR.md) | [🇹🇷 Türkçe](README_TR.md) | [🇷🇺Русский](README_RU.md) | [🇻🇳Tiếng Việt](README_VI.md) | [ɪᴅ indonesia](README_ID.md) | [עברית](README_iw.md) | [🇮🇳हिंदी](README_IN.md)
|
||||||
|
|
||||||
|
<div style="display: flex; align-items: center;">
|
||||||
|
<img src="https://kernelsu.org/logo.png" style="width: 96px;" alt="">
|
||||||
|
<div style="margin-left: 20px;">
|
||||||
|
<span style="font-size: large; "><b>KernelSU</b></span>
|
||||||
|
<br>
|
||||||
|
<span style="font-size: medium; "><i>Una solución root basada en el kernel para dispositivos Android.</i></span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
## 🚀 Características
|
||||||
|
|
||||||
|
**1.** Binario `su` basado en el kernel y gestión de acceso root.<br/>
|
||||||
|
**2.** Sistema de módulos basado en **OverlayFS**.
|
||||||
|
|
||||||
|
## ✅ Estado de compatibilidad
|
||||||
|
|
||||||
|
**KernelSU** soporta de forma oficial dispositivos Android con **GKI 2.0** (a partir de la versión **5.10** del kernel). Los kernels antiguos (a partir de la versión **4.14**) también son compatibles, pero necesitas compilarlos por tu cuenta.
|
||||||
|
|
||||||
|
El **Subsistema de Windows para Android (WSA)** e implementaciones de Android basadas en contenedores, como **Waydroid**, también deberían funcionar con **KernelSU** integrado.
|
||||||
|
|
||||||
|
Actualmente se soportan las siguientes **ABIs**: `arm64-v8a`; `x86_64`.
|
||||||
|
|
||||||
|
## 📖 Uso
|
||||||
|
|
||||||
|
[¿Cómo instalarlo?](https://kernelsu.org/guide/installation.html)
|
||||||
|
|
||||||
|
## 🔨 Compilación
|
||||||
|
|
||||||
|
[¿Cómo compilarlo?](https://kernelsu.org/guide/how-to-build.html)
|
||||||
|
|
||||||
|
## 💬 Discusión
|
||||||
|
|
||||||
|
- Telegram: [@KernelSU](https://t.me/KernelSU)
|
||||||
|
|
||||||
|
## ⚖️ Licencia
|
||||||
|
|
||||||
|
- Los archivos bajo el directorio `kernel` están licenciados bajo [GPL-2](https://www.gnu.org/licenses/old-licenses/gpl-2.0.en.html).
|
||||||
|
- Todas las demás partes, a excepción del directorio `kernel`, están licenciados bajo [GPL-3](https://www.gnu.org/licenses/gpl-3.0.html).
|
||||||
|
|
||||||
|
## 👥 Créditos
|
||||||
|
|
||||||
|
- [kernel-assisted-superuser](https://git.zx2c4.com/kernel-assisted-superuser/about/): la idea de **KernelSU**.
|
||||||
|
- [genuine](https://github.com/brevent/genuine/): la validación del **esquema de firmas APK v2**.
|
||||||
|
- [Diamorphine](https://github.com/m0nad/Diamorphine): algunas habilidades de rootkit.
|
||||||
|
- [Magisk](https://github.com/topjohnwu/Magisk): la implementación de la **política de SELinux (SEPolicy)**.
|
||||||
45
docs/README_ID.md
Normal file
45
docs/README_ID.md
Normal file
@@ -0,0 +1,45 @@
|
|||||||
|
[English](README.md) | [Español](README_ES.md) | [简体中文](README_CN.md) | [繁體中文](README_TW.md) | [日本語](README_JP.md) | [Polski](README_PL.md) | [Portugis-Brasil](README_PT-BR.md) | [Türkçe](README_TR.md) | [Русский](README_RU.md) | [Tiếng Việt](README_VI.md) | **Indonesia** | [עברית](README_iw.md) | [हिंदी](README_IN.md)
|
||||||
|
|
||||||
|
# KernelSU
|
||||||
|
|
||||||
|
Solusi root berbasis Kernel untuk perangkat Android.
|
||||||
|
|
||||||
|
## Fitur
|
||||||
|
|
||||||
|
1. Manajemen akses root dan `su` berbasis kernel.
|
||||||
|
2. Sistem modul berdasarkan overlayfs.
|
||||||
|
3. [Profil Aplikasi](https://kernelsu.org/guide/app-profile.html): Kunci daya root di dalam sangkar.
|
||||||
|
|
||||||
|
## Status Kompatibilitas
|
||||||
|
|
||||||
|
KernelSU secara resmi mendukung perangkat Android GKI 2.0 (dengan kernel 5.10+), kernel lama (4.14+) juga kompatibel, tetapi Anda perlu membuat kernel sendiri.
|
||||||
|
|
||||||
|
WSA, ChromeOS, dan Android berbasis wadah juga dapat bekerja dengan KernelSU terintegrasi.
|
||||||
|
|
||||||
|
Dan ABI yang didukung saat ini adalah: `arm64-v8a` dan `x86_64`
|
||||||
|
|
||||||
|
## Penggunaan
|
||||||
|
|
||||||
|
- [Petunjuk Instalasi](https://kernelsu.org/guide/installation.html)
|
||||||
|
- [Bagaimana cara membuat?](https://kernelsu.org/guide/how-to-build.html)
|
||||||
|
- [Situs Web Resmi](https://kernelsu.org/)
|
||||||
|
|
||||||
|
## Terjemahan
|
||||||
|
|
||||||
|
Untuk menerjemahkan KernelSU ke dalam bahasa Anda atau menyempurnakan terjemahan yang sudah ada, harap gunakan [Weblat](https://hosted.weblate.org/engage/kernelsu/).
|
||||||
|
|
||||||
|
## Diskusi
|
||||||
|
|
||||||
|
- Telegram: [@KernelSU](https://t.me/KernelSU)
|
||||||
|
|
||||||
|
## Lisensi
|
||||||
|
|
||||||
|
- File di bawah direktori `kernel` adalah [GPL-2](https://www.gnu.org/licenses/old-licenses/gpl-2.0.en.html)
|
||||||
|
- Semua bagian lain kecuali direktori `kernel` adalah [GPL-3](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 ampuh.
|
||||||
|
- [genuine](https://github.com/brevent/genuine/): validasi tanda tangan apk v2.
|
||||||
|
- [Diamorphine](https://github.com/m0nad/Diamorphine): beberapa keterampilan rootkit.
|
||||||
51
docs/README_IN.md
Normal file
51
docs/README_IN.md
Normal file
@@ -0,0 +1,51 @@
|
|||||||
|
|
||||||
|
[English](README.md) | [Español](README_ES.md) | [简体中文](README_CN.md) | [繁體中文](README_TW.md) | [日本語](README_JP.md) | [Polski](README_PL.md) | [Portuguese-Brazil](README_PT-BR.md) | [Türkçe](README_TR.md) | [Русский](README_RU.md) | [Tiếng Việt](README_VI.md) | [Indonesia](README_ID.md) | [עברית](README_iw.md) | **हिंदी**
|
||||||
|
|
||||||
|
<div style="display: flex; align-items: center;">
|
||||||
|
<img src="https://kernelsu.org/logo.png" style="width: 96px;" alt="">
|
||||||
|
<div style="margin-left: 20px;">
|
||||||
|
<span style="font-size: large; "><b>KernelSU</b></span>
|
||||||
|
<br>
|
||||||
|
<span style="font-size: medium; "><i>Android उपकरणों के लिए कर्नेल-आधारित रूट समाधान।</i></span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
## विशेषताएँ
|
||||||
|
|
||||||
|
1. कर्नेल-आधारित `su` और रूट एक्सेस प्रबंधन।
|
||||||
|
2. Overlayfs पर आधारित मॉड्यूल प्रणाली।
|
||||||
|
3. [App Profile](https://kernelsu.org/guide/app-profile.html): Root शक्ति को पिंजरे में बंद कर दो।
|
||||||
|
|
||||||
|
## अनुकूलता अवस्था
|
||||||
|
|
||||||
|
KernelSU आधिकारिक तौर पर Android GKI 2.0 डिवाइस (कर्नेल 5.10+) का समर्थन करता है। पुराने कर्नेल (4.14+) भी संगत हैं, लेकिन कर्नेल को मैन्युअल रूप से बनाना होगा।
|
||||||
|
|
||||||
|
इसके साथ, WSA, ChromeOS और कंटेनर-आधारित Android सभी समर्थित हैं।
|
||||||
|
|
||||||
|
वर्तमान में, केवल `arm64-v8a` और `x86_64` समर्थित हैं।
|
||||||
|
|
||||||
|
## प्रयोग
|
||||||
|
|
||||||
|
- [स्थापना निर्देश](https://kernelsu.org/guide/installation.html)
|
||||||
|
- [कैसे बनाना है ?](https://kernelsu.org/guide/how-to-build.html)
|
||||||
|
- [आधिकारिक वेबसाइट](https://kernelsu.org/)
|
||||||
|
|
||||||
|
## अनुवाद करना
|
||||||
|
|
||||||
|
KernelSU का अनुवाद करने या मौजूदा अनुवादों को बेहतर बनाने में सहायता के लिए, कृपया इसका उपयोग करें [Weblate](https://hosted.weblate.org/engage/kernelsu/).
|
||||||
|
|
||||||
|
## बहस
|
||||||
|
|
||||||
|
- Telegram: [@KernelSU](https://t.me/KernelSU)
|
||||||
|
|
||||||
|
## लाइसेंस
|
||||||
|
|
||||||
|
- `Kernel` निर्देशिका के अंतर्गत फ़ाइलें हैं [GPL-2](https://www.gnu.org/licenses/old-licenses/gpl-2.0.en.html)
|
||||||
|
- `Kernel` निर्देशिका को छोड़कर अन्य सभी भाग हैं [GPL-3](https://www.gnu.org/licenses/gpl-3.0.html)
|
||||||
|
|
||||||
|
## आभार सूची
|
||||||
|
|
||||||
|
- [kernel-assisted-superuser](https://git.zx2c4.com/kernel-assisted-superuser/about/): KernelSU विचार।
|
||||||
|
- [Magisk](https://github.com/topjohnwu/Magisk): शक्तिशाली root उपकरण।
|
||||||
|
- [genuine](https://github.com/brevent/genuine/): apk v2 हस्ताक्षर सत्यापन।
|
||||||
|
- [Diamorphine](https://github.com/m0nad/Diamorphine): कुछ रूटकिट कौशल।
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
[English](README.md) | [简体中文](README_CN.md) | [繁體中文](README_TW.md) | **日本語** | [Portuguese-Brazil](README_PT-BR.md) | [Türkçe](README_TR.md)
|
[English](README.md) | [Español](README_ES.md) | [简体中文](README_CN.md) | [繁體中文](README_TW.md) | **日本語** | [Polski](README_PL.md) | [Portuguese-Brazil](README_PT-BR.md) | [Türkçe](README_TR.md) | [Русский](README_RU.md) | | [Tiếng Việt](README_VI.md) | [Indonesia](README_ID.md) | [עברית](README_iw.md) | [हिंदी](README_IN.md)
|
||||||
|
|
||||||
# KernelSU
|
# KernelSU
|
||||||
|
|
||||||
@@ -8,24 +8,28 @@ Android におけるカーネルベースの root ソリューションです。
|
|||||||
|
|
||||||
1. カーネルベースの `su` と権限管理
|
1. カーネルベースの `su` と権限管理
|
||||||
2. OverlayFS に基づくモジュールシステム
|
2. OverlayFS に基づくモジュールシステム
|
||||||
|
3. [アプリのプロファイル](https://kernelsu.org/guide/app-profile.html): root の権限をケージ内に閉じ込めます。
|
||||||
|
|
||||||
|
|
||||||
## 対応状況
|
## 対応状況
|
||||||
|
|
||||||
KernelSU は GKI 2.0 デバイス(カーネルバージョン 5.10 以上)を公式にサポートしています。古いカーネル(4.14以上)とも互換性がありますが、自分でカーネルをビルドする必要があります。
|
KernelSU は GKI 2.0 デバイス(カーネルバージョン 5.10 以上)を公式にサポートしています。古いカーネル(4.14以上)とも互換性がありますが、自分でカーネルをビルドする必要があります。
|
||||||
|
|
||||||
WSA とコンテナ上で動作する Android でも KernelSU を統合して動かせます。
|
WSA 、ChromeOS とコンテナ上で動作する Android でも KernelSU を統合して動かせます。
|
||||||
|
|
||||||
現在サポートしているアーキテクチャは `arm64-v8a` および `x86_64` です。
|
現在サポートしているアーキテクチャは `arm64-v8a` および `x86_64` です。
|
||||||
|
|
||||||
## 使用方法
|
## 使用方法
|
||||||
|
|
||||||
[インストール方法はこちら](https://kernelsu.org/ja_JP/guide/installation.html)
|
- [インストール方法はこちら](https://kernelsu.org/ja_JP/guide/installation.html)
|
||||||
|
- [ビルド方法はこちら](https://kernelsu.org/guide/how-to-build.html)
|
||||||
|
- [公式サイト](https://kernelsu.org)
|
||||||
|
|
||||||
## ビルド
|
## 翻訳
|
||||||
|
|
||||||
[ビルド方法はこちら](https://kernelsu.org/guide/how-to-build.html)
|
KernelSU をあなたの言語に翻訳するか、既存の翻訳を改善するには、[Weblate](https://hosted.weblate.org/engage/kernelsu/) を使用してください。
|
||||||
|
|
||||||
### ディスカッション
|
## ディスカッション
|
||||||
|
|
||||||
- Telegram: [@KernelSU](https://t.me/KernelSU)
|
- Telegram: [@KernelSU](https://t.me/KernelSU)
|
||||||
|
|
||||||
@@ -37,6 +41,7 @@ WSA とコンテナ上で動作する Android でも KernelSU を統合して動
|
|||||||
## クレジット
|
## クレジット
|
||||||
|
|
||||||
- [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 のスキル
|
- [Diamorphine](https://github.com/m0nad/Diamorphine): rootkit のスキル
|
||||||
- [Magisk](https://github.com/topjohnwu/Magisk):sepolicy の実装
|
|
||||||
42
docs/README_PL.md
Normal file
42
docs/README_PL.md
Normal file
@@ -0,0 +1,42 @@
|
|||||||
|
[English](README.md) | [Español](README_ES.md) | [简体中文](README_CN.md) | [繁體中文](README_TW.md) | [日本語](README_JP.md) | **Polski** | [Portuguese-Brazil](README_PT-BR.md) | [Türkçe](README_TR.md) | [Русский](README_RU.md) | [Tiếng Việt](README_VI.md) | [Indonesia](README_ID.md) | [עברית](README_iw.md) | [हिंदी](README_IN.md)
|
||||||
|
|
||||||
|
# KernelSU
|
||||||
|
|
||||||
|
Rozwiązanie root oparte na jądrze dla urządzeń z systemem Android.
|
||||||
|
|
||||||
|
## Cechy
|
||||||
|
|
||||||
|
1. Oparte na jądrze `su` i zarządzanie dostępem roota.
|
||||||
|
2. System modułów oparty na overlayfs.
|
||||||
|
|
||||||
|
## Kompatybilność
|
||||||
|
|
||||||
|
KernelSU oficjalnie obsługuje urządzenia z Androidem GKI 2.0 (z jądrem 5.10+), starsze jądra (4.14+) są również kompatybilne, ale musisz sam skompilować jądro.
|
||||||
|
|
||||||
|
WSA i Android oparty na kontenerach również powinny działać ze zintegrowanym KernelSU.
|
||||||
|
|
||||||
|
Aktualnie obsługiwane ABI to : `arm64-v8a` i `x86_64`.
|
||||||
|
|
||||||
|
## Użycie
|
||||||
|
|
||||||
|
[Instalacja](https://kernelsu.org/guide/installation.html)
|
||||||
|
|
||||||
|
## Kompilacja
|
||||||
|
|
||||||
|
[Jak skompilować?](https://kernelsu.org/guide/how-to-build.html)
|
||||||
|
|
||||||
|
## Dyskusja
|
||||||
|
|
||||||
|
- Telegram: [@KernelSU](https://t.me/KernelSU)
|
||||||
|
|
||||||
|
## Licencja
|
||||||
|
|
||||||
|
- Pliki w katalogu `kernel` są na licencji [GPL-2](https://www.gnu.org/licenses/old-licenses/gpl-2.0.en.html)
|
||||||
|
- Wszystkie inne części poza katalogiem `kernel` są na licencji [GPL-3](https://www.gnu.org/licenses/gpl-3.0.html)
|
||||||
|
|
||||||
|
## Podziękowania
|
||||||
|
|
||||||
|
- [kernel-assisted-superuser](https://git.zx2c4.com/kernel-assisted-superuser/about/): pomysłodawca KernelSU.
|
||||||
|
- [genuine](https://github.com/brevent/genuine/): walidacja podpisu apk v2.
|
||||||
|
- [Diamorphine](https://github.com/m0nad/Diamorphine): cenna znajomość rootkitów.
|
||||||
|
- [Magisk](https://github.com/topjohnwu/Magisk): implementacja sepolicy.
|
||||||
46
docs/README_PT-BR.md
Normal file
46
docs/README_PT-BR.md
Normal file
@@ -0,0 +1,46 @@
|
|||||||
|
[English](README.md) | [Español](README_ES.md) | [简体中文](README_CN.md) | [繁體中文](README_TW.md) | [日本語](README_JP.md) | [Polski](README_PL.md) | **Português (Brasil)** | [Türkçe](README_TR.md) | [Русский](README_RU.md) | [Tiếng Việt](README_VI.md) | [Indonesia](README_ID.md) | [עברית](README_iw.md) | [हिंदी](README_IN.md)
|
||||||
|
|
||||||
|
# KernelSU
|
||||||
|
|
||||||
|
Uma solução root baseada em kernel para dispositivos Android.
|
||||||
|
|
||||||
|
## Características
|
||||||
|
|
||||||
|
1. `su` e gerenciamento de acesso root baseado em kernel.
|
||||||
|
|
||||||
|
2. Sistema modular baseado em overlayfs.
|
||||||
|
|
||||||
|
3. [Perfil do Aplicativo](https://kernelsu.org/pt_BR/guide/app-profile.html): Tranque o poder root em uma gaiola.
|
||||||
|
|
||||||
|
## Estado de Compatibilidade
|
||||||
|
|
||||||
|
O KernelSU oferece suporte oficial a dispositivos Android GKI 2.0 (kernel 5.10+). Kernels mais antigos (4.14+) também são compatíveis, mas o kernel terá que ser construído manualmente.
|
||||||
|
|
||||||
|
Com isso, WSA, ChromeOS e Android baseado em contêiner são todos suportados.
|
||||||
|
|
||||||
|
Atualmente, apenas `arm64-v8a` e `x86_64` são suportados.
|
||||||
|
|
||||||
|
## Uso
|
||||||
|
- [Instalação](https://kernelsu.org/pt_BR/guide/installation.html)
|
||||||
|
- [Como construir o KernelSU?](https://kernelsu.org/pt_BR/guide/how-to-build.html)
|
||||||
|
- [Site oficial](https://kernelsu.org/pt_BR/)
|
||||||
|
|
||||||
|
## Tradução
|
||||||
|
Para ajudar a traduzir o KernelSU ou melhorar as traduções existentes, use o [Weblate](https://hosted.weblate.org/engage/kernelsu/), por favor.
|
||||||
|
|
||||||
|
## Discussão
|
||||||
|
|
||||||
|
- Telegram: [@KernelSU](https://t.me/KernelSU)
|
||||||
|
|
||||||
|
## Licença
|
||||||
|
|
||||||
|
- Os arquivos no diretório `kernel` são [GPL-2](https://www.gnu.org/licenses/old-licenses/gpl-2.0.en.html)
|
||||||
|
|
||||||
|
- Todas as outras partes, exceto o diretório `kernel` são [GPL-3](https://www.gnu.org/licenses/gpl-3.0.html)
|
||||||
|
|
||||||
|
## 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.
|
||||||
42
docs/README_RU.md
Normal file
42
docs/README_RU.md
Normal file
@@ -0,0 +1,42 @@
|
|||||||
|
[English](README.md) | [Español](README_ES.md) | [简体中文](README_CN.md) | [繁體中文](README_TW.md) | [日本語](README_JP.md) | [Polski](README_PL.md) | [Portuguese-Brazil](README_PT-BR.md) | [Türkçe](README_TR.md) | **Русский** | [Tiếng Việt](README_VI.md) | [Indonesia](README_ID.md) | [עברית](README_iw.md) | [हिंदी](README_IN.md)
|
||||||
|
|
||||||
|
# KernelSU
|
||||||
|
|
||||||
|
Решение на основе ядра root для Android-устройств.
|
||||||
|
|
||||||
|
## Особенности
|
||||||
|
|
||||||
|
1. Управление `su` и root-доступом на основе ядра.
|
||||||
|
2. Система модулей на основе overlayfs.
|
||||||
|
|
||||||
|
## Совместимость
|
||||||
|
|
||||||
|
KernelSU официально поддерживает устройства на базе Android GKI 2.0 (с ядром 5.10+), старые ядра (4.14+) также совместимы, но для этого необходимо собрать ядро самостоятельно.
|
||||||
|
|
||||||
|
WSA и Android на основе контейнеров также должны работать с интегрированным KernelSU.
|
||||||
|
|
||||||
|
В настоящее время поддерживаются следующие ABI: `arm64-v8a` и `x86_64`.
|
||||||
|
|
||||||
|
## Использование
|
||||||
|
|
||||||
|
[Установка](https://kernelsu.org/ru_RU/guide/installation.html)
|
||||||
|
|
||||||
|
## Сборка
|
||||||
|
|
||||||
|
[Как собрать?](https://kernelsu.org/ru_RU/guide/how-to-build.html)
|
||||||
|
|
||||||
|
## Обсуждение
|
||||||
|
|
||||||
|
- Telegram: [@KernelSU](https://t.me/KernelSU)
|
||||||
|
|
||||||
|
## Лицензия
|
||||||
|
|
||||||
|
- Файлы в директории `kernel` - [GPL-2](https://www.gnu.org/licenses/old-licenses/gpl-2.0.en.html)
|
||||||
|
- Все остальные части, кроме директории `kernel` - [GPL-3](https://www.gnu.org/licenses/gpl-3.0.html)
|
||||||
|
|
||||||
|
## Благодарности
|
||||||
|
|
||||||
|
- [kernel-assisted-superuser](https://git.zx2c4.com/kernel-assisted-superuser/about/): идея KernelSU.
|
||||||
|
- [genuine](https://github.com/brevent/genuine/): проверка подписи apk v2.
|
||||||
|
- [Diamorphine](https://github.com/m0nad/Diamorphine): некоторые навыки руткита.
|
||||||
|
- [Magisk](https://github.com/topjohnwu/Magisk): реализация sepolicy.
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
[English](README.md) | [简体中文](README_CN.md) | [繁體中文](README_TW.md) | [日本語](README_JP.md) | [Portuguese-Brazil](README_PT-BR.md) | **Türkçe**
|
[English](README.md) | [Español](README_ES.md) | [简体中文](README_CN.md) | [繁體中文](README_TW.md) | [日本語](README_JP.md) | [Polski](README_PL.md) | [Portuguese-Brazil](README_PT-BR.md) | **Türkçe** | [Русский](README_RU.md) | [Tiếng Việt](README_VI.md) | [Indonesia](README_ID.md) | [עברית](README_iw.md) | [हिंदी](README_IN.md)
|
||||||
|
|
||||||
# KernelSU
|
# KernelSU
|
||||||
|
|
||||||
@@ -8,6 +8,7 @@ Android cihazlar için kernel tabanlı bir root çözümü.
|
|||||||
|
|
||||||
1. Kernel-tabanlı `su` ve root erişimi yönetimi.
|
1. Kernel-tabanlı `su` ve root erişimi yönetimi.
|
||||||
2. Overlayfs'ye dayalı modül sistemi.
|
2. Overlayfs'ye dayalı modül sistemi.
|
||||||
|
3. [Uygulama profili](https://kernelsu.org/guide/app-profile.html): Root gücünü bir kafese kapatın.
|
||||||
|
|
||||||
## Uyumluluk Durumu
|
## Uyumluluk Durumu
|
||||||
|
|
||||||
@@ -19,13 +20,15 @@ Ve desteklenen mevcut ABI'ler : `arm64-v8a` ve `x86_64`
|
|||||||
|
|
||||||
## Kullanım
|
## Kullanım
|
||||||
|
|
||||||
[Yükleme](https://kernelsu.org/guide/installation.html)
|
- [Yükleme](https://kernelsu.org/guide/installation.html)
|
||||||
|
- [Nasıl inşa edilir?](https://kernelsu.org/guide/how-to-build.html)
|
||||||
|
- [Resmi WEB sitesi](https://kernelsu.org/)
|
||||||
|
|
||||||
## İnşaa
|
## Çeviri
|
||||||
|
|
||||||
[Nasıl inşa edilir?](https://kernelsu.org/guide/how-to-build.html)
|
KernelSU'yu kendi dilinize çevirmek veya varolan bir çeviriyi geliştirmek istiyorsanız, lütfen [Weblate](https://hosted.weblate.org/engage/kernelsu/)'i kullanın.
|
||||||
|
|
||||||
### Tartışma
|
## Tartışma
|
||||||
|
|
||||||
- Telegram: [@KernelSU](https://t.me/KernelSU)
|
- Telegram: [@KernelSU](https://t.me/KernelSU)
|
||||||
|
|
||||||
@@ -37,6 +40,6 @@ Ve desteklenen mevcut ABI'ler : `arm64-v8a` ve `x86_64`
|
|||||||
## Krediler
|
## Krediler
|
||||||
|
|
||||||
- [kernel-assisted-superuser](https://git.zx2c4.com/kernel-assisted-superuser/about/): KernelSU fikri.
|
- [kernel-assisted-superuser](https://git.zx2c4.com/kernel-assisted-superuser/about/): KernelSU fikri.
|
||||||
|
- [Magisk](https://github.com/topjohnwu/Magisk): güçlü root aracı.
|
||||||
- [genuine](https://github.com/brevent/genuine/): apk v2 imza doğrulama.
|
- [genuine](https://github.com/brevent/genuine/): apk v2 imza doğrulama.
|
||||||
- [Diamorphine](https://github.com/m0nad/Diamorphine): bazı rootkit becerileri.
|
- [Diamorphine](https://github.com/m0nad/Diamorphine): bazı rootkit becerileri.
|
||||||
- [Magisk](https://github.com/topjohnwu/Magisk): sepolicy uygulaması.
|
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
[English](README.md) | [简体中文](README_CN.md) | **繁體中文** | [日本語](README_JP.md) | [Portuguese-Brazil](README_PT-BR.md) | [Türkçe](README_TR.md)
|
[English](README.md) | [Español](README_ES.md) | [简体中文](README_CN.md) | **繁體中文** | [日本語](README_JP.md) | [Polski](README_PL.md) | [Portuguese-Brazil](README_PT-BR.md) | [Türkçe](README_TR.md) | [Русский](README_RU.md) | [Tiếng Việt](README_VI.md) | [Indonesia](README_ID.md) | [עברית](README_iw.md) | [हिंदी](README_IN.md)
|
||||||
|
|
||||||
# KernelSU
|
# KernelSU
|
||||||
|
|
||||||
45
docs/README_VI.md
Normal file
45
docs/README_VI.md
Normal file
@@ -0,0 +1,45 @@
|
|||||||
|
[English](README.md) | [Español](README_ES.md) | [简体中文](README_CN.md) | [繁體中文](README_TW.md) | [日本語](README_JP.md) | [Polski](README_PL.md) | [Portuguese-Brazil](README_PT-BR.md) | [Türkçe](README_TR.md) | [Русский](README_RU.md) | **Tiếng Việt** | [Indonesia](README_ID.md) | [עברית](README_iw.md) | [हिंदी](README_IN.md)
|
||||||
|
|
||||||
|
# KernelSU
|
||||||
|
|
||||||
|
Giải pháp root thông qua thay đổi trên Kernel hệ điều hành cho các thiết bị Android.
|
||||||
|
|
||||||
|
## Tính năng
|
||||||
|
|
||||||
|
1. Hỗ trợ gói thực thi `su` và quản lý quyền root.
|
||||||
|
2. Hệ thống mô-đun thông qua overlayfs.
|
||||||
|
3. [App Profile](https://kernelsu.org/guide/app-profile.html): Hạn chế quyền root của ứng dụng.
|
||||||
|
|
||||||
|
## Tình trạng tương thích
|
||||||
|
|
||||||
|
KernelSU chính thức hỗ trợ các thiết bị Android với kernel GKI 2.0 (phiên bản kernel 5.10+), các phiên bản kernel cũ hơn (4.14+) cũng tương thích, nhưng bạn cần phải tự biên dịch.
|
||||||
|
|
||||||
|
WSA, ChromeOS và Android dựa trên container(container-based) cũng được hỗ trợ bởi KernelSU.
|
||||||
|
|
||||||
|
Hiên tại Giao diện nhị phân của ứng dụng (ABI) được hỗ trợ bao gồm `arm64-v8a` và `x86_64`
|
||||||
|
|
||||||
|
## Sử dụng
|
||||||
|
|
||||||
|
- [Hướng dẫn cài đặt](https://kernelsu.org/vi_VN/guide/installation.html)
|
||||||
|
- [Cách để build?](https://kernelsu.org/vi_VN/guide/how-to-build.html)
|
||||||
|
- [Website Chính Thức](https://kernelsu.org/vi_VN/)
|
||||||
|
|
||||||
|
## Hỗ trợ dịch
|
||||||
|
|
||||||
|
Nếu bạn muốn hỗ trợ dịch KernelSU sang một ngôn ngữ khác hoặc cải thiện các bản dịch trước, vui lòng sử dụng [Weblate](https://hosted.weblate.org/engage/kernelsu/).
|
||||||
|
|
||||||
|
## Thảo luận
|
||||||
|
|
||||||
|
- Telegram: [@KernelSU](https://t.me/KernelSU)
|
||||||
|
|
||||||
|
## Giấy phép
|
||||||
|
|
||||||
|
- Tất cả các file trong thư mục `kernel` dùng giấy phép [GPL-2](https://www.gnu.org/licenses/old-licenses/gpl-2.0.en.html)
|
||||||
|
- Tất cả các thành phần khác ngoại trừ thư mục `kernel` dùng giấy phép [GPL-3](https://www.gnu.org/licenses/gpl-3.0.html)
|
||||||
|
|
||||||
|
## Lời cảm ơn
|
||||||
|
|
||||||
|
- [kernel-assisted-superuser](https://git.zx2c4.com/kernel-assisted-superuser/about/): ý tưởng cho KernelSU.
|
||||||
|
- [Magisk](https://github.com/topjohnwu/Magisk): công cụ root mạnh mẽ.
|
||||||
|
- [genuine](https://github.com/brevent/genuine/): phương pháp xác thực apk v2.
|
||||||
|
- [Diamorphine](https://github.com/m0nad/Diamorphine): các phương pháp ẩn của rootkit .
|
||||||
45
docs/README_iw.md
Normal file
45
docs/README_iw.md
Normal file
@@ -0,0 +1,45 @@
|
|||||||
|
[English](README.md) | [Español](README_ES.md) | [简体中文](README_CN.md) | [繁體中文](README_TW.md) | [日本語](README_JP.md) | [Polski](README_PL.md) | [Portuguese-Brazil](README_PT-BR.md) | [Türkçe](README_TR.md) | [Русский](README_RU.md) | [Tiếng Việt](README_VI.md) | [Indonesia](README_ID.md) | **עברית** | [हिंदी](README_IN.md)
|
||||||
|
|
||||||
|
# KernelSU
|
||||||
|
|
||||||
|
פתרון לניהול root מבוסס על Kernel עבור מכשירי Android.
|
||||||
|
|
||||||
|
## תכונות
|
||||||
|
|
||||||
|
1. ניהול root ו־`su` מבוססים על Kernel.
|
||||||
|
2. מערכת מודולים מבוססת overlayfs.
|
||||||
|
3. [פרופיל אפליקציה](https://kernelsu.org/guide/app-profile.html): נעילת גישת root בכלוב.
|
||||||
|
|
||||||
|
## מצב תאימות
|
||||||
|
|
||||||
|
KernelSU תומך במכשירי Android GKI 2.0 (kernel 5.10+) באופן רשמי. לליבות ישנות (4.14+) יש גם תאימות, אך יידרש לבנות את הליבה באופן ידני.
|
||||||
|
|
||||||
|
באמצעות זה, תמיכה זמינה גם ל-WSA, ChromeOS ומכשירי Android המבוססים על מיכלים.
|
||||||
|
|
||||||
|
כרגע, רק `arm64-v8a` ו־`x86_64` נתמכים.
|
||||||
|
|
||||||
|
## שימוש
|
||||||
|
|
||||||
|
- [הוראות התקנה](https://kernelsu.org/guide/installation.html)
|
||||||
|
- [איך לבנות?](https://kernelsu.org/guide/how-to-build.html)
|
||||||
|
- [האתר רשמי](https://kernelsu.org/)
|
||||||
|
|
||||||
|
## תרגום
|
||||||
|
|
||||||
|
כדי לעזור בתרגום של KernelSU או לשפר תרגומים קיימים, יש להשתמש ב-[Weblate](https://hosted.weblate.org/engage/kernelsu/).
|
||||||
|
|
||||||
|
## דיון
|
||||||
|
|
||||||
|
- Telegram: [@KernelSU](https://t.me/KernelSU)
|
||||||
|
|
||||||
|
## רשיון
|
||||||
|
|
||||||
|
- קבצים תחת הספרייה `kernel` מוגנים על פי [GPL-2](https://www.gnu.org/licenses/old-licenses/gpl-2.0.en.html)
|
||||||
|
- כל החלקים האחרים, למעט הספרייה `kernel`, מוגנים על פי [GPL-3](https://www.gnu.org/licenses/gpl-3.0.html)
|
||||||
|
|
||||||
|
## קרדיטים
|
||||||
|
|
||||||
|
- [kernel-assisted-superuser](https://git.zx2c4.com/kernel-assisted-superuser/about/): הרעיון של KernelSU.
|
||||||
|
- [Magisk](https://github.com/topjohnwu/Magisk): הכלי הסופר חזק לניהול root.
|
||||||
|
- [genuine](https://github.com/brevent/genuine/): אימות חתימת apk v2.
|
||||||
|
- [Diamorphine](https://github.com/m0nad/Diamorphine): כמה יכולות רוט.
|
||||||
@@ -2,7 +2,7 @@ menu "KernelSU"
|
|||||||
|
|
||||||
config KSU
|
config KSU
|
||||||
tristate "KernelSU function support"
|
tristate "KernelSU function support"
|
||||||
select OVERLAY_FS
|
depends on OVERLAY_FS
|
||||||
default y
|
default y
|
||||||
help
|
help
|
||||||
Enable kernel-level root privileges on Android System.
|
Enable kernel-level root privileges on Android System.
|
||||||
|
|||||||
@@ -15,18 +15,27 @@ obj-y += selinux/
|
|||||||
# .git is a text file while the module is imported by 'git submodule add'.
|
# .git is a text file while the module is imported by 'git submodule add'.
|
||||||
ifeq ($(shell test -e $(srctree)/$(src)/../.git; echo $$?),0)
|
ifeq ($(shell test -e $(srctree)/$(src)/../.git; echo $$?),0)
|
||||||
KSU_GIT_VERSION := $(shell cd $(srctree)/$(src); /usr/bin/env PATH="$$PATH":/usr/bin:/usr/local/bin git rev-list --count HEAD)
|
KSU_GIT_VERSION := $(shell cd $(srctree)/$(src); /usr/bin/env PATH="$$PATH":/usr/bin:/usr/local/bin git rev-list --count HEAD)
|
||||||
ccflags-y += -DKSU_GIT_VERSION=$(KSU_GIT_VERSION)
|
# ksu_version: major * 10000 + git version + 200 for historical reasons
|
||||||
|
$(eval KSU_VERSION=$(shell expr 10000 + $(KSU_GIT_VERSION) + 200))
|
||||||
|
$(info -- KernelSU 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 a git submodule!")
|
||||||
|
ccflags-y += -DKSU_VERSION=16
|
||||||
endif
|
endif
|
||||||
|
|
||||||
ifndef EXPECTED_SIZE
|
ifndef KSU_EXPECTED_SIZE
|
||||||
EXPECTED_SIZE := 0x033b
|
KSU_EXPECTED_SIZE := 0x033b
|
||||||
endif
|
endif
|
||||||
|
|
||||||
ifndef EXPECTED_HASH
|
ifndef KSU_EXPECTED_HASH
|
||||||
EXPECTED_HASH := 0xb0b91415
|
KSU_EXPECTED_HASH := c371061b19d8c7d7d6133c6a9bafe198fa944e50c1b31c9d8daa8d7f1fc2d2d6
|
||||||
endif
|
endif
|
||||||
|
|
||||||
ccflags-y += -DEXPECTED_SIZE=$(EXPECTED_SIZE)
|
$(info -- KernelSU Manager signature size: $(KSU_EXPECTED_SIZE))
|
||||||
ccflags-y += -DEXPECTED_HASH=$(EXPECTED_HASH)
|
$(info -- KernelSU Manager signature hash: $(KSU_EXPECTED_HASH))
|
||||||
|
|
||||||
|
ccflags-y += -DEXPECTED_SIZE=$(KSU_EXPECTED_SIZE)
|
||||||
|
ccflags-y += -DEXPECTED_HASH=\"$(KSU_EXPECTED_HASH)\"
|
||||||
ccflags-y += -Wno-implicit-function-declaration -Wno-strict-prototypes -Wno-int-conversion -Wno-gcc-compat
|
ccflags-y += -Wno-implicit-function-declaration -Wno-strict-prototypes -Wno-int-conversion -Wno-gcc-compat
|
||||||
ccflags-y += -Wno-declaration-after-statement
|
ccflags-y += -Wno-declaration-after-statement
|
||||||
|
|||||||
@@ -97,7 +97,7 @@ void ksu_show_allow_list(void)
|
|||||||
{
|
{
|
||||||
struct perm_data *p = NULL;
|
struct perm_data *p = NULL;
|
||||||
struct list_head *pos = NULL;
|
struct list_head *pos = NULL;
|
||||||
pr_info("ksu_show_allow_list");
|
pr_info("ksu_show_allow_list\n");
|
||||||
list_for_each (pos, &allow_list) {
|
list_for_each (pos, &allow_list) {
|
||||||
p = list_entry(pos, struct perm_data, list);
|
p = list_entry(pos, struct perm_data, list);
|
||||||
pr_info("uid :%d, allow: %d\n", p->profile.current_uid,
|
pr_info("uid :%d, allow: %d\n", p->profile.current_uid,
|
||||||
@@ -349,10 +349,9 @@ void do_save_allow_list(struct work_struct *work)
|
|||||||
struct perm_data *p = NULL;
|
struct perm_data *p = NULL;
|
||||||
struct list_head *pos = NULL;
|
struct list_head *pos = NULL;
|
||||||
loff_t off = 0;
|
loff_t off = 0;
|
||||||
KWORKER_INSTALL_KEYRING();
|
|
||||||
struct file *fp =
|
|
||||||
filp_open(KERNEL_SU_ALLOWLIST, O_WRONLY | O_CREAT, 0644);
|
|
||||||
|
|
||||||
|
struct file *fp =
|
||||||
|
ksu_filp_open_compat(KERNEL_SU_ALLOWLIST, O_WRONLY | O_CREAT, 0644);
|
||||||
if (IS_ERR(fp)) {
|
if (IS_ERR(fp)) {
|
||||||
pr_err("save_allow_list create file failed: %ld\n", PTR_ERR(fp));
|
pr_err("save_allow_list create file failed: %ld\n", PTR_ERR(fp));
|
||||||
return;
|
return;
|
||||||
@@ -392,15 +391,14 @@ void do_load_allow_list(struct work_struct *work)
|
|||||||
struct file *fp = NULL;
|
struct file *fp = NULL;
|
||||||
u32 magic;
|
u32 magic;
|
||||||
u32 version;
|
u32 version;
|
||||||
KWORKER_INSTALL_KEYRING();
|
|
||||||
|
|
||||||
#ifdef CONFIG_KSU_DEBUG
|
#ifdef CONFIG_KSU_DEBUG
|
||||||
// always allow adb shell by default
|
// always allow adb shell by default
|
||||||
ksu_grant_root_to_shell();
|
ksu_grant_root_to_shell();
|
||||||
#endif
|
#endif
|
||||||
// load allowlist now!
|
|
||||||
fp = filp_open(KERNEL_SU_ALLOWLIST, O_RDONLY, 0);
|
|
||||||
|
|
||||||
|
// load allowlist now!
|
||||||
|
fp = ksu_filp_open_compat(KERNEL_SU_ALLOWLIST, O_RDONLY, 0);
|
||||||
if (IS_ERR(fp)) {
|
if (IS_ERR(fp)) {
|
||||||
pr_err("load_allow_list open file failed: %ld\n", PTR_ERR(fp));
|
pr_err("load_allow_list open file failed: %ld\n", PTR_ERR(fp));
|
||||||
return;
|
return;
|
||||||
|
|||||||
@@ -1,12 +1,122 @@
|
|||||||
|
#include "linux/err.h"
|
||||||
#include "linux/fs.h"
|
#include "linux/fs.h"
|
||||||
|
#include "linux/gfp.h"
|
||||||
|
#include "linux/kernel.h"
|
||||||
#include "linux/moduleparam.h"
|
#include "linux/moduleparam.h"
|
||||||
|
|
||||||
#include "apk_sign.h"
|
#include "apk_sign.h"
|
||||||
#include "klog.h" // IWYU pragma: keep
|
#include "klog.h" // IWYU pragma: keep
|
||||||
#include "kernel_compat.h"
|
#include "kernel_compat.h"
|
||||||
|
#include "crypto/hash.h"
|
||||||
|
#include "linux/slab.h"
|
||||||
|
#include "linux/version.h"
|
||||||
|
|
||||||
static __always_inline int
|
#if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 11, 0)
|
||||||
check_v2_signature(char *path, unsigned expected_size, unsigned expected_hash)
|
#include "crypto/sha2.h"
|
||||||
|
#else
|
||||||
|
#include "crypto/sha.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
struct sdesc {
|
||||||
|
struct shash_desc shash;
|
||||||
|
char ctx[];
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct sdesc *init_sdesc(struct crypto_shash *alg)
|
||||||
|
{
|
||||||
|
struct sdesc *sdesc;
|
||||||
|
int size;
|
||||||
|
|
||||||
|
size = sizeof(struct shash_desc) + crypto_shash_descsize(alg);
|
||||||
|
sdesc = kmalloc(size, GFP_KERNEL);
|
||||||
|
if (!sdesc)
|
||||||
|
return ERR_PTR(-ENOMEM);
|
||||||
|
sdesc->shash.tfm = alg;
|
||||||
|
return sdesc;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int calc_hash(struct crypto_shash *alg, const unsigned char *data,
|
||||||
|
unsigned int datalen, unsigned char *digest)
|
||||||
|
{
|
||||||
|
struct sdesc *sdesc;
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
sdesc = init_sdesc(alg);
|
||||||
|
if (IS_ERR(sdesc)) {
|
||||||
|
pr_info("can't alloc sdesc\n");
|
||||||
|
return PTR_ERR(sdesc);
|
||||||
|
}
|
||||||
|
|
||||||
|
ret = crypto_shash_digest(&sdesc->shash, data, datalen, digest);
|
||||||
|
kfree(sdesc);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int ksu_sha256(const unsigned char *data, unsigned int datalen,
|
||||||
|
unsigned char *digest)
|
||||||
|
{
|
||||||
|
struct crypto_shash *alg;
|
||||||
|
char *hash_alg_name = "sha256";
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
alg = crypto_alloc_shash(hash_alg_name, 0, 0);
|
||||||
|
if (IS_ERR(alg)) {
|
||||||
|
pr_info("can't alloc alg %s\n", hash_alg_name);
|
||||||
|
return PTR_ERR(alg);
|
||||||
|
}
|
||||||
|
ret = calc_hash(alg, data, datalen, digest);
|
||||||
|
crypto_free_shash(alg);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
static bool check_block(struct file *fp, u32 *size4, loff_t *pos, u32 *offset,
|
||||||
|
unsigned expected_size, const char* expected_sha256)
|
||||||
|
{
|
||||||
|
ksu_kernel_read_compat(fp, size4, 0x4, pos); // signer-sequence length
|
||||||
|
ksu_kernel_read_compat(fp, size4, 0x4, pos); // signer length
|
||||||
|
ksu_kernel_read_compat(fp, size4, 0x4, pos); // signed data length
|
||||||
|
|
||||||
|
*offset += 0x4 * 3;
|
||||||
|
|
||||||
|
ksu_kernel_read_compat(fp, size4, 0x4, pos); // digests-sequence length
|
||||||
|
|
||||||
|
*pos += *size4;
|
||||||
|
*offset += 0x4 + *size4;
|
||||||
|
|
||||||
|
ksu_kernel_read_compat(fp, size4, 0x4, pos); // certificates length
|
||||||
|
ksu_kernel_read_compat(fp, size4, 0x4, pos); // certificate length
|
||||||
|
*offset += 0x4 * 2;
|
||||||
|
|
||||||
|
if (*size4 == expected_size) {
|
||||||
|
*offset += *size4;
|
||||||
|
|
||||||
|
#define CERT_MAX_LENGTH 1024
|
||||||
|
char cert[CERT_MAX_LENGTH];
|
||||||
|
if (*size4 > CERT_MAX_LENGTH) {
|
||||||
|
pr_info("cert length overlimit\n");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
ksu_kernel_read_compat(fp, cert, *size4, pos);
|
||||||
|
unsigned char digest[SHA256_DIGEST_SIZE];
|
||||||
|
if (IS_ERR(ksu_sha256(cert, *size4, digest))) {
|
||||||
|
pr_info("sha256 error\n");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
char hash_str[SHA256_DIGEST_SIZE * 2 + 1];
|
||||||
|
hash_str[SHA256_DIGEST_SIZE * 2] = '\0';
|
||||||
|
|
||||||
|
bin2hex(hash_str, digest, SHA256_DIGEST_SIZE);
|
||||||
|
pr_info("sha256: %s, expected: %s\n", hash_str, expected_sha256);
|
||||||
|
if (strcmp(expected_sha256, hash_str) == 0) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
static __always_inline bool
|
||||||
|
check_v2_signature(char *path, unsigned expected_size, const char *expected_sha256)
|
||||||
{
|
{
|
||||||
unsigned char buffer[0x11] = { 0 };
|
unsigned char buffer[0x11] = { 0 };
|
||||||
u32 size4;
|
u32 size4;
|
||||||
@@ -14,18 +124,20 @@ check_v2_signature(char *path, unsigned expected_size, unsigned expected_hash)
|
|||||||
|
|
||||||
loff_t pos;
|
loff_t pos;
|
||||||
|
|
||||||
int sign = -1;
|
bool v2_signing_valid = false;
|
||||||
|
bool v3_signing_exist = false;
|
||||||
|
bool v3_1_signing_exist = false;
|
||||||
|
|
||||||
int i;
|
int i;
|
||||||
struct file *fp = filp_open(path, O_RDONLY, 0);
|
struct file *fp = ksu_filp_open_compat(path, O_RDONLY, 0);
|
||||||
if (IS_ERR(fp)) {
|
if (IS_ERR(fp)) {
|
||||||
pr_err("open %s error.", path);
|
pr_err("open %s error.\n", path);
|
||||||
return PTR_ERR(fp);
|
return PTR_ERR(fp);
|
||||||
}
|
}
|
||||||
|
|
||||||
// disable inotify for this file
|
// disable inotify for this file
|
||||||
fp->f_mode |= FMODE_NONOTIFY;
|
fp->f_mode |= FMODE_NONOTIFY;
|
||||||
|
|
||||||
sign = 1;
|
|
||||||
// https://en.wikipedia.org/wiki/Zip_(file_format)#End_of_central_directory_record_(EOCD)
|
// https://en.wikipedia.org/wiki/Zip_(file_format)#End_of_central_directory_record_(EOCD)
|
||||||
for (i = 0;; ++i) {
|
for (i = 0;; ++i) {
|
||||||
unsigned short n;
|
unsigned short n;
|
||||||
@@ -64,59 +176,23 @@ check_v2_signature(char *path, unsigned expected_size, unsigned expected_hash)
|
|||||||
for (;;) {
|
for (;;) {
|
||||||
uint32_t id;
|
uint32_t id;
|
||||||
uint32_t offset;
|
uint32_t offset;
|
||||||
ksu_kernel_read_compat(fp, &size8, 0x8, &pos); // sequence length
|
ksu_kernel_read_compat(fp, &size8, 0x8,
|
||||||
|
&pos); // sequence length
|
||||||
if (size8 == size_of_block) {
|
if (size8 == size_of_block) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
ksu_kernel_read_compat(fp, &id, 0x4, &pos); // id
|
ksu_kernel_read_compat(fp, &id, 0x4, &pos); // id
|
||||||
offset = 4;
|
offset = 4;
|
||||||
pr_info("id: 0x%08x\n", id);
|
pr_info("id: 0x%08x\n", id);
|
||||||
if ((id ^ 0xdeadbeefu) == 0xafa439f5u ||
|
if (id == 0x7109871au) {
|
||||||
(id ^ 0xdeadbeefu) == 0x2efed62f) {
|
v2_signing_valid = check_block(fp, &size4, &pos, &offset,
|
||||||
ksu_kernel_read_compat(fp, &size4, 0x4,
|
expected_size, expected_sha256);
|
||||||
&pos); // signer-sequence length
|
} else if (id == 0xf05368c0u) {
|
||||||
ksu_kernel_read_compat(fp, &size4, 0x4, &pos); // signer length
|
// http://aospxref.com/android-14.0.0_r2/xref/frameworks/base/core/java/android/util/apk/ApkSignatureSchemeV3Verifier.java#73
|
||||||
ksu_kernel_read_compat(fp, &size4, 0x4,
|
v3_signing_exist = true;
|
||||||
&pos); // signed data length
|
} else if (id == 0x1b93ad61u) {
|
||||||
offset += 0x4 * 3;
|
// http://aospxref.com/android-14.0.0_r2/xref/frameworks/base/core/java/android/util/apk/ApkSignatureSchemeV3Verifier.java#74
|
||||||
|
v3_1_signing_exist = true;
|
||||||
ksu_kernel_read_compat(fp, &size4, 0x4,
|
|
||||||
&pos); // digests-sequence length
|
|
||||||
pos += size4;
|
|
||||||
offset += 0x4 + size4;
|
|
||||||
|
|
||||||
ksu_kernel_read_compat(fp, &size4, 0x4,
|
|
||||||
&pos); // certificates length
|
|
||||||
ksu_kernel_read_compat(fp, &size4, 0x4,
|
|
||||||
&pos); // certificate length
|
|
||||||
offset += 0x4 * 2;
|
|
||||||
#if 0
|
|
||||||
int hash = 1;
|
|
||||||
signed char c;
|
|
||||||
for (i = 0; i < size4; ++i) {
|
|
||||||
ksu_kernel_read_compat(fp, &c, 0x1, &pos);
|
|
||||||
hash = 31 * hash + c;
|
|
||||||
}
|
|
||||||
offset += size4;
|
|
||||||
pr_info(" size: 0x%04x, hash: 0x%08x\n", size4, ((unsigned) hash) ^ 0x14131211u);
|
|
||||||
#else
|
|
||||||
if (size4 == expected_size) {
|
|
||||||
int hash = 1;
|
|
||||||
signed char c;
|
|
||||||
for (i = 0; i < size4; ++i) {
|
|
||||||
ksu_kernel_read_compat(fp, &c, 0x1, &pos);
|
|
||||||
hash = 31 * hash + c;
|
|
||||||
}
|
|
||||||
offset += size4;
|
|
||||||
if ((((unsigned)hash) ^ 0x14131211u) ==
|
|
||||||
expected_hash) {
|
|
||||||
sign = 0;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// don't try again.
|
|
||||||
break;
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
pos += (size8 - offset);
|
pos += (size8 - offset);
|
||||||
}
|
}
|
||||||
@@ -124,13 +200,18 @@ check_v2_signature(char *path, unsigned expected_size, unsigned expected_hash)
|
|||||||
clean:
|
clean:
|
||||||
filp_close(fp, 0);
|
filp_close(fp, 0);
|
||||||
|
|
||||||
return sign;
|
if (v3_signing_exist || v3_1_signing_exist) {
|
||||||
|
pr_err("Unexpected v3 signature scheme found!\n");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return v2_signing_valid;
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef CONFIG_KSU_DEBUG
|
#ifdef CONFIG_KSU_DEBUG
|
||||||
|
|
||||||
unsigned ksu_expected_size = EXPECTED_SIZE;
|
unsigned ksu_expected_size = EXPECTED_SIZE;
|
||||||
unsigned ksu_expected_hash = EXPECTED_HASH;
|
const char *ksu_expected_hash = EXPECTED_HASH;
|
||||||
|
|
||||||
#include "manager.h"
|
#include "manager.h"
|
||||||
|
|
||||||
@@ -138,15 +219,16 @@ static int set_expected_size(const char *val, const struct kernel_param *kp)
|
|||||||
{
|
{
|
||||||
int rv = param_set_uint(val, kp);
|
int rv = param_set_uint(val, kp);
|
||||||
ksu_invalidate_manager_uid();
|
ksu_invalidate_manager_uid();
|
||||||
pr_info("ksu_expected_size set to %x", ksu_expected_size);
|
pr_info("ksu_expected_size set to %x\n", ksu_expected_size);
|
||||||
return rv;
|
return rv;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int set_expected_hash(const char *val, const struct kernel_param *kp)
|
static int set_expected_hash(const char *val, const struct kernel_param *kp)
|
||||||
{
|
{
|
||||||
int rv = param_set_uint(val, kp);
|
pr_info("set_expected_hash: %s\n", val);
|
||||||
|
int rv = param_set_charp(val, kp);
|
||||||
ksu_invalidate_manager_uid();
|
ksu_invalidate_manager_uid();
|
||||||
pr_info("ksu_expected_hash set to %x", ksu_expected_hash);
|
pr_info("ksu_expected_hash set to %s\n", ksu_expected_hash);
|
||||||
return rv;
|
return rv;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -157,7 +239,8 @@ static struct kernel_param_ops expected_size_ops = {
|
|||||||
|
|
||||||
static struct kernel_param_ops expected_hash_ops = {
|
static struct kernel_param_ops expected_hash_ops = {
|
||||||
.set = set_expected_hash,
|
.set = set_expected_hash,
|
||||||
.get = param_get_uint,
|
.get = param_get_charp,
|
||||||
|
.free = param_free_charp,
|
||||||
};
|
};
|
||||||
|
|
||||||
module_param_cb(ksu_expected_size, &expected_size_ops, &ksu_expected_size,
|
module_param_cb(ksu_expected_size, &expected_size_ops, &ksu_expected_size,
|
||||||
@@ -165,14 +248,14 @@ module_param_cb(ksu_expected_size, &expected_size_ops, &ksu_expected_size,
|
|||||||
module_param_cb(ksu_expected_hash, &expected_hash_ops, &ksu_expected_hash,
|
module_param_cb(ksu_expected_hash, &expected_hash_ops, &ksu_expected_hash,
|
||||||
S_IRUSR | S_IWUSR);
|
S_IRUSR | S_IWUSR);
|
||||||
|
|
||||||
int is_manager_apk(char *path)
|
bool is_manager_apk(char *path)
|
||||||
{
|
{
|
||||||
return check_v2_signature(path, ksu_expected_size, ksu_expected_hash);
|
return check_v2_signature(path, ksu_expected_size, ksu_expected_hash);
|
||||||
}
|
}
|
||||||
|
|
||||||
#else
|
#else
|
||||||
|
|
||||||
int is_manager_apk(char *path)
|
bool is_manager_apk(char *path)
|
||||||
{
|
{
|
||||||
return check_v2_signature(path, EXPECTED_SIZE, EXPECTED_HASH);
|
return check_v2_signature(path, EXPECTED_SIZE, EXPECTED_HASH);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,7 +1,8 @@
|
|||||||
#ifndef __KSU_H_APK_V2_SIGN
|
#ifndef __KSU_H_APK_V2_SIGN
|
||||||
#define __KSU_H_APK_V2_SIGN
|
#define __KSU_H_APK_V2_SIGN
|
||||||
|
|
||||||
// return 0 if signature match
|
#include "linux/types.h"
|
||||||
int is_manager_apk(char *path);
|
|
||||||
|
bool is_manager_apk(char *path);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -8,7 +8,8 @@
|
|||||||
#define __PT_PARM1_REG regs[0]
|
#define __PT_PARM1_REG regs[0]
|
||||||
#define __PT_PARM2_REG regs[1]
|
#define __PT_PARM2_REG regs[1]
|
||||||
#define __PT_PARM3_REG regs[2]
|
#define __PT_PARM3_REG regs[2]
|
||||||
#define __PT_PARM4_REG regs[3]
|
#define __PT_SYSCALL_PARM4_REG regs[3]
|
||||||
|
#define __PT_CCALL_PARM4_REG regs[3]
|
||||||
#define __PT_PARM5_REG regs[4]
|
#define __PT_PARM5_REG regs[4]
|
||||||
#define __PT_PARM6_REG regs[5]
|
#define __PT_PARM6_REG regs[5]
|
||||||
#define __PT_RET_REG regs[30]
|
#define __PT_RET_REG regs[30]
|
||||||
@@ -29,8 +30,8 @@
|
|||||||
#define __PT_PARM2_REG si
|
#define __PT_PARM2_REG si
|
||||||
#define __PT_PARM3_REG dx
|
#define __PT_PARM3_REG dx
|
||||||
/* syscall uses r10 for PARM4 */
|
/* syscall uses r10 for PARM4 */
|
||||||
#define __PT_PARM4_REG r10
|
#define __PT_SYSCALL_PARM4_REG r10
|
||||||
// #define __PT_PARM4_REG cx
|
#define __PT_CCALL_PARM4_REG cx
|
||||||
#define __PT_PARM5_REG r8
|
#define __PT_PARM5_REG r8
|
||||||
#define __PT_PARM6_REG r9
|
#define __PT_PARM6_REG r9
|
||||||
#define __PT_RET_REG sp
|
#define __PT_RET_REG sp
|
||||||
@@ -56,7 +57,8 @@
|
|||||||
#define PT_REGS_PARM1(x) (__PT_REGS_CAST(x)->__PT_PARM1_REG)
|
#define PT_REGS_PARM1(x) (__PT_REGS_CAST(x)->__PT_PARM1_REG)
|
||||||
#define PT_REGS_PARM2(x) (__PT_REGS_CAST(x)->__PT_PARM2_REG)
|
#define PT_REGS_PARM2(x) (__PT_REGS_CAST(x)->__PT_PARM2_REG)
|
||||||
#define PT_REGS_PARM3(x) (__PT_REGS_CAST(x)->__PT_PARM3_REG)
|
#define PT_REGS_PARM3(x) (__PT_REGS_CAST(x)->__PT_PARM3_REG)
|
||||||
#define PT_REGS_PARM4(x) (__PT_REGS_CAST(x)->__PT_PARM4_REG)
|
#define PT_REGS_SYSCALL_PARM4(x) (__PT_REGS_CAST(x)->__PT_SYSCALL_PARM4_REG)
|
||||||
|
#define PT_REGS_CCALL_PARM4(x) (__PT_REGS_CAST(x)->__PT_CCALL_PARM4_REG)
|
||||||
#define PT_REGS_PARM5(x) (__PT_REGS_CAST(x)->__PT_PARM5_REG)
|
#define PT_REGS_PARM5(x) (__PT_REGS_CAST(x)->__PT_PARM5_REG)
|
||||||
#define PT_REGS_PARM6(x) (__PT_REGS_CAST(x)->__PT_PARM6_REG)
|
#define PT_REGS_PARM6(x) (__PT_REGS_CAST(x)->__PT_PARM6_REG)
|
||||||
#define PT_REGS_RET(x) (__PT_REGS_CAST(x)->__PT_RET_REG)
|
#define PT_REGS_RET(x) (__PT_REGS_CAST(x)->__PT_RET_REG)
|
||||||
|
|||||||
@@ -3,6 +3,7 @@
|
|||||||
#include "linux/dcache.h"
|
#include "linux/dcache.h"
|
||||||
#include "linux/err.h"
|
#include "linux/err.h"
|
||||||
#include "linux/init.h"
|
#include "linux/init.h"
|
||||||
|
#include "linux/init_task.h"
|
||||||
#include "linux/kernel.h"
|
#include "linux/kernel.h"
|
||||||
#include "linux/kprobes.h"
|
#include "linux/kprobes.h"
|
||||||
#include "linux/lsm_hooks.h"
|
#include "linux/lsm_hooks.h"
|
||||||
@@ -184,7 +185,7 @@ int ksu_handle_rename(struct dentry *old_dentry, struct dentry *new_dentry)
|
|||||||
if (strcmp(buf, "/system/packages.list")) {
|
if (strcmp(buf, "/system/packages.list")) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
pr_info("renameat: %s -> %s, new path: %s", old_dentry->d_iname,
|
pr_info("renameat: %s -> %s, new path: %s\n", old_dentry->d_iname,
|
||||||
new_dentry->d_iname, buf);
|
new_dentry->d_iname, buf);
|
||||||
|
|
||||||
update_uid();
|
update_uid();
|
||||||
@@ -232,8 +233,10 @@ int ksu_handle_prctl(int option, unsigned long arg2, unsigned long arg3,
|
|||||||
// someone wants to be root manager, just check it!
|
// someone wants to be root manager, just check it!
|
||||||
// arg3 should be `/data/user/<userId>/<manager_package_name>`
|
// arg3 should be `/data/user/<userId>/<manager_package_name>`
|
||||||
char param[128];
|
char param[128];
|
||||||
if (copy_from_user(param, arg3, sizeof(param))) {
|
if (ksu_strncpy_from_user_nofault(param, arg3, sizeof(param)) == -EFAULT) {
|
||||||
|
#ifdef CONFIG_KSU_DEBUG
|
||||||
pr_err("become_manager: copy param err\n");
|
pr_err("become_manager: copy param err\n");
|
||||||
|
#endif
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -311,7 +314,7 @@ int ksu_handle_prctl(int option, unsigned long arg2, unsigned long arg3,
|
|||||||
static bool post_fs_data_lock = false;
|
static bool post_fs_data_lock = false;
|
||||||
if (!post_fs_data_lock) {
|
if (!post_fs_data_lock) {
|
||||||
post_fs_data_lock = true;
|
post_fs_data_lock = true;
|
||||||
pr_info("post-fs-data triggered");
|
pr_info("post-fs-data triggered\n");
|
||||||
on_post_fs_data();
|
on_post_fs_data();
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
@@ -320,7 +323,7 @@ int ksu_handle_prctl(int option, unsigned long arg2, unsigned long arg3,
|
|||||||
static bool boot_complete_lock = false;
|
static bool boot_complete_lock = false;
|
||||||
if (!boot_complete_lock) {
|
if (!boot_complete_lock) {
|
||||||
boot_complete_lock = true;
|
boot_complete_lock = true;
|
||||||
pr_info("boot_complete triggered");
|
pr_info("boot_complete triggered\n");
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@@ -480,7 +483,18 @@ static bool should_umount(struct path *path)
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void try_umount(const char *mnt)
|
static void ksu_umount_mnt(struct path *path, int flags) {
|
||||||
|
#if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 9, 0)
|
||||||
|
int err = path_umount(path, flags);
|
||||||
|
if (err) {
|
||||||
|
pr_info("umount %s failed: %d\n", path->dentry->d_iname, err);
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
// TODO: umount for non GKI kernel
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
static void try_umount(const char *mnt, bool check_mnt, int flags)
|
||||||
{
|
{
|
||||||
struct path path;
|
struct path path;
|
||||||
int err = kern_path(mnt, 0, &path);
|
int err = kern_path(mnt, 0, &path);
|
||||||
@@ -489,16 +503,11 @@ static void try_umount(const char *mnt)
|
|||||||
}
|
}
|
||||||
|
|
||||||
// we are only interest in some specific mounts
|
// we are only interest in some specific mounts
|
||||||
if (!should_umount(&path)) {
|
if (check_mnt && !should_umount(&path)) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
#if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 9, 0)
|
ksu_umount_mnt(&path, flags);
|
||||||
err = path_umount(&path, 0);
|
|
||||||
if (err) {
|
|
||||||
pr_info("umount %s failed: %d\n", mnt, err);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int ksu_handle_setuid(struct cred *new, const struct cred *old)
|
int ksu_handle_setuid(struct cred *new, const struct cred *old)
|
||||||
@@ -517,8 +526,8 @@ int ksu_handle_setuid(struct cred *new, const struct cred *old)
|
|||||||
|
|
||||||
// todo: check old process's selinux context, if it is not zygote, ignore it!
|
// todo: check old process's selinux context, if it is not zygote, ignore it!
|
||||||
|
|
||||||
if (!is_appuid(new_uid)) {
|
if (!is_appuid(new_uid) || is_isolated_uid(new_uid.val)) {
|
||||||
// pr_info("handle setuid ignore non application uid: %d\n", new_uid.val);
|
// pr_info("handle setuid ignore non application or isolated uid: %d\n", new_uid.val);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -540,9 +549,10 @@ int ksu_handle_setuid(struct cred *new, const struct cred *old)
|
|||||||
|
|
||||||
// fixme: use `collect_mounts` and `iterate_mount` to iterate all mountpoint and
|
// fixme: use `collect_mounts` and `iterate_mount` to iterate all mountpoint and
|
||||||
// filter the mountpoint whose target is `/data/adb`
|
// filter the mountpoint whose target is `/data/adb`
|
||||||
try_umount("/system");
|
try_umount("/system", true, 0);
|
||||||
try_umount("/vendor");
|
try_umount("/vendor", true, 0);
|
||||||
try_umount("/product");
|
try_umount("/product", true, 0);
|
||||||
|
try_umount("/data/adb/modules", false, MNT_DETACH);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@@ -559,7 +569,14 @@ static int handler_pre(struct kprobe *p, struct pt_regs *regs)
|
|||||||
int option = (int)PT_REGS_PARM1(real_regs);
|
int option = (int)PT_REGS_PARM1(real_regs);
|
||||||
unsigned long arg2 = (unsigned long)PT_REGS_PARM2(real_regs);
|
unsigned long arg2 = (unsigned long)PT_REGS_PARM2(real_regs);
|
||||||
unsigned long arg3 = (unsigned long)PT_REGS_PARM3(real_regs);
|
unsigned long arg3 = (unsigned long)PT_REGS_PARM3(real_regs);
|
||||||
unsigned long arg4 = (unsigned long)PT_REGS_PARM4(real_regs);
|
#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 16, 0)
|
||||||
|
// PRCTL_SYMBOL is the arch-specificed one, which receive raw pt_regs from syscall
|
||||||
|
unsigned long arg4 = (unsigned long)PT_REGS_SYSCALL_PARM4(real_regs);
|
||||||
|
#else
|
||||||
|
// PRCTL_SYMBOL is the common one, called by C convention in do_syscall_64
|
||||||
|
// https://elixir.bootlin.com/linux/v4.15.18/source/arch/x86/entry/common.c#L287
|
||||||
|
unsigned long arg4 = (unsigned long)PT_REGS_CCALL_PARM4(real_regs);
|
||||||
|
#endif
|
||||||
unsigned long arg5 = (unsigned long)PT_REGS_PARM5(real_regs);
|
unsigned long arg5 = (unsigned long)PT_REGS_PARM5(real_regs);
|
||||||
|
|
||||||
return ksu_handle_prctl(option, arg2, arg3, arg4, arg5);
|
return ksu_handle_prctl(option, arg2, arg3, arg4, arg5);
|
||||||
@@ -579,7 +596,7 @@ static int renameat_handler_pre(struct kprobe *p, struct pt_regs *regs)
|
|||||||
struct dentry *new_entry = rd->new_dentry;
|
struct dentry *new_entry = rd->new_dentry;
|
||||||
#else
|
#else
|
||||||
struct dentry *old_entry = (struct dentry *)PT_REGS_PARM2(regs);
|
struct dentry *old_entry = (struct dentry *)PT_REGS_PARM2(regs);
|
||||||
struct dentry *new_entry = (struct dentry *)PT_REGS_PARM4(regs);
|
struct dentry *new_entry = (struct dentry *)PT_REGS_CCALL_PARM4(regs);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
return ksu_handle_rename(old_entry, new_entry);
|
return ksu_handle_rename(old_entry, new_entry);
|
||||||
@@ -632,7 +649,7 @@ static int ksu_key_permission(key_ref_t key_ref, const struct cred *cred,
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
init_session_keyring = cred->session_keyring;
|
init_session_keyring = cred->session_keyring;
|
||||||
pr_info("kernel_compat: got init_session_keyring");
|
pr_info("kernel_compat: got init_session_keyring\n");
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -1,34 +1,178 @@
|
|||||||
#include "linux/version.h"
|
#include "linux/version.h"
|
||||||
#include "linux/fs.h"
|
#include "linux/fs.h"
|
||||||
|
#include "linux/nsproxy.h"
|
||||||
|
#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 10, 0)
|
||||||
|
#include "linux/sched/task.h"
|
||||||
|
#include "linux/uaccess.h"
|
||||||
|
#elif LINUX_VERSION_CODE >= KERNEL_VERSION(4, 4, 0)
|
||||||
|
#include "linux/uaccess.h"
|
||||||
|
#include "linux/sched.h"
|
||||||
|
#else
|
||||||
|
#include "linux/sched.h"
|
||||||
|
#endif
|
||||||
|
#include "klog.h" // IWYU pragma: keep
|
||||||
|
|
||||||
#if LINUX_VERSION_CODE < KERNEL_VERSION(4, 10, 0)
|
#if LINUX_VERSION_CODE < KERNEL_VERSION(4, 10, 0)
|
||||||
#include "linux/key.h"
|
#include "linux/key.h"
|
||||||
#include "linux/errno.h"
|
#include "linux/errno.h"
|
||||||
|
#include "linux/cred.h"
|
||||||
struct key *init_session_keyring = NULL;
|
struct key *init_session_keyring = NULL;
|
||||||
|
|
||||||
|
static inline int install_session_keyring(struct key *keyring)
|
||||||
|
{
|
||||||
|
struct cred *new;
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
new = prepare_creds();
|
||||||
|
if (!new)
|
||||||
|
return -ENOMEM;
|
||||||
|
|
||||||
|
ret = install_session_keyring_to_cred(new, keyring);
|
||||||
|
if (ret < 0) {
|
||||||
|
abort_creds(new);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
return commit_creds(new);
|
||||||
|
}
|
||||||
#endif
|
#endif
|
||||||
ssize_t ksu_kernel_read_compat(struct file *p, void *buf, size_t count, loff_t *pos){
|
|
||||||
|
extern struct task_struct init_task;
|
||||||
|
|
||||||
|
// mnt_ns context switch for environment that android_init->nsproxy->mnt_ns != init_task.nsproxy->mnt_ns, such as WSA
|
||||||
|
struct ksu_ns_fs_saved {
|
||||||
|
struct nsproxy *ns;
|
||||||
|
struct fs_struct *fs;
|
||||||
|
};
|
||||||
|
|
||||||
|
static void ksu_save_ns_fs(struct ksu_ns_fs_saved *ns_fs_saved)
|
||||||
|
{
|
||||||
|
ns_fs_saved->ns = current->nsproxy;
|
||||||
|
ns_fs_saved->fs = current->fs;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void ksu_load_ns_fs(struct ksu_ns_fs_saved *ns_fs_saved)
|
||||||
|
{
|
||||||
|
current->nsproxy = ns_fs_saved->ns;
|
||||||
|
current->fs = ns_fs_saved->fs;
|
||||||
|
}
|
||||||
|
|
||||||
|
static bool android_context_saved_checked = false;
|
||||||
|
static bool android_context_saved_enabled = false;
|
||||||
|
static struct ksu_ns_fs_saved android_context_saved;
|
||||||
|
|
||||||
|
void ksu_android_ns_fs_check()
|
||||||
|
{
|
||||||
|
if (android_context_saved_checked)
|
||||||
|
return;
|
||||||
|
android_context_saved_checked = true;
|
||||||
|
task_lock(current);
|
||||||
|
if (current->nsproxy && current->fs &&
|
||||||
|
current->nsproxy->mnt_ns != init_task.nsproxy->mnt_ns) {
|
||||||
|
android_context_saved_enabled = true;
|
||||||
|
pr_info("android context saved enabled due to init mnt_ns(%p) != android mnt_ns(%p)\n",
|
||||||
|
current->nsproxy->mnt_ns, init_task.nsproxy->mnt_ns);
|
||||||
|
ksu_save_ns_fs(&android_context_saved);
|
||||||
|
} else {
|
||||||
|
pr_info("android context saved disabled\n");
|
||||||
|
}
|
||||||
|
task_unlock(current);
|
||||||
|
}
|
||||||
|
|
||||||
|
struct file *ksu_filp_open_compat(const char *filename, int flags, umode_t mode)
|
||||||
|
{
|
||||||
|
#if LINUX_VERSION_CODE < KERNEL_VERSION(4, 10, 0)
|
||||||
|
if (init_session_keyring != NULL && !current_cred()->session_keyring &&
|
||||||
|
(current->flags & PF_WQ_WORKER)) {
|
||||||
|
pr_info("installing init session keyring for older kernel\n");
|
||||||
|
install_session_keyring(init_session_keyring);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
// switch mnt_ns even if current is not wq_worker, to ensure what we open is the correct file in android mnt_ns, rather than user created mnt_ns
|
||||||
|
struct ksu_ns_fs_saved saved;
|
||||||
|
if (android_context_saved_enabled) {
|
||||||
|
pr_info("start switch current nsproxy and fs to android context\n");
|
||||||
|
task_lock(current);
|
||||||
|
ksu_save_ns_fs(&saved);
|
||||||
|
ksu_load_ns_fs(&android_context_saved);
|
||||||
|
task_unlock(current);
|
||||||
|
}
|
||||||
|
struct file *fp = filp_open(filename, flags, mode);
|
||||||
|
if (android_context_saved_enabled) {
|
||||||
|
task_lock(current);
|
||||||
|
ksu_load_ns_fs(&saved);
|
||||||
|
task_unlock(current);
|
||||||
|
pr_info("switch current nsproxy and fs back to saved successfully\n");
|
||||||
|
}
|
||||||
|
return fp;
|
||||||
|
}
|
||||||
|
|
||||||
|
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)
|
||||||
return kernel_read(p, buf, count, pos);
|
return kernel_read(p, buf, count, pos);
|
||||||
#else
|
#else
|
||||||
loff_t offset = pos ? *pos : 0;
|
loff_t offset = pos ? *pos : 0;
|
||||||
ssize_t result = kernel_read(p, offset, (char *)buf, count);
|
ssize_t result = kernel_read(p, offset, (char *)buf, count);
|
||||||
if (pos && result > 0)
|
if (pos && result > 0) {
|
||||||
{
|
*pos = offset + result;
|
||||||
*pos = offset + result;
|
}
|
||||||
}
|
return result;
|
||||||
return result;
|
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
ssize_t ksu_kernel_write_compat(struct file *p, const void *buf, size_t count, loff_t *pos){
|
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)
|
||||||
return kernel_write(p, buf, count, pos);
|
return kernel_write(p, buf, count, pos);
|
||||||
#else
|
#else
|
||||||
loff_t offset = pos ? *pos : 0;
|
loff_t offset = pos ? *pos : 0;
|
||||||
ssize_t result = kernel_write(p, buf, count, offset);
|
ssize_t result = kernel_write(p, buf, count, offset);
|
||||||
if (pos && result > 0)
|
if (pos && result > 0) {
|
||||||
{
|
*pos = offset + result;
|
||||||
*pos = offset + result;
|
}
|
||||||
}
|
return result;
|
||||||
return result;
|
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 8, 0)
|
||||||
|
long ksu_strncpy_from_user_nofault(char *dst, const void __user *unsafe_addr,
|
||||||
|
long count)
|
||||||
|
{
|
||||||
|
return strncpy_from_user_nofault(dst, unsafe_addr, count);
|
||||||
|
}
|
||||||
|
#elif LINUX_VERSION_CODE >= KERNEL_VERSION(5, 3, 0)
|
||||||
|
long ksu_strncpy_from_user_nofault(char *dst, const void __user *unsafe_addr,
|
||||||
|
long count)
|
||||||
|
{
|
||||||
|
return strncpy_from_unsafe_user(dst, unsafe_addr, count);
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
// Copied from: https://elixir.bootlin.com/linux/v4.9.337/source/mm/maccess.c#L201
|
||||||
|
long ksu_strncpy_from_user_nofault(char *dst, const void __user *unsafe_addr,
|
||||||
|
long count)
|
||||||
|
{
|
||||||
|
mm_segment_t old_fs = get_fs();
|
||||||
|
long ret;
|
||||||
|
|
||||||
|
if (unlikely(count <= 0))
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
set_fs(USER_DS);
|
||||||
|
pagefault_disable();
|
||||||
|
ret = strncpy_from_user(dst, unsafe_addr, count);
|
||||||
|
pagefault_enable();
|
||||||
|
set_fs(old_fs);
|
||||||
|
|
||||||
|
if (ret >= count) {
|
||||||
|
ret = count;
|
||||||
|
dst[ret - 1] = '\0';
|
||||||
|
} else if (ret > 0) {
|
||||||
|
ret++;
|
||||||
|
}
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|||||||
@@ -5,38 +5,20 @@
|
|||||||
#include "linux/key.h"
|
#include "linux/key.h"
|
||||||
#include "linux/version.h"
|
#include "linux/version.h"
|
||||||
|
|
||||||
extern struct key *init_session_keyring;
|
extern long ksu_strncpy_from_user_nofault(char *dst,
|
||||||
|
const void __user *unsafe_addr,
|
||||||
extern ssize_t ksu_kernel_read_compat(struct file *p, void *buf, size_t count, loff_t *pos);
|
long count);
|
||||||
extern 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, 10, 0)
|
#if LINUX_VERSION_CODE < KERNEL_VERSION(4, 10, 0)
|
||||||
static inline int install_session_keyring(struct key *keyring)
|
extern struct key *init_session_keyring;
|
||||||
{
|
|
||||||
struct cred *new;
|
|
||||||
int ret;
|
|
||||||
|
|
||||||
new = prepare_creds();
|
|
||||||
if (!new)
|
|
||||||
return -ENOMEM;
|
|
||||||
|
|
||||||
ret = install_session_keyring_to_cred(new, keyring);
|
|
||||||
if (ret < 0) {
|
|
||||||
abort_creds(new);
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
return commit_creds(new);
|
|
||||||
}
|
|
||||||
#define KWORKER_INSTALL_KEYRING() \
|
|
||||||
static bool keyring_installed = false; \
|
|
||||||
if (init_session_keyring != NULL && !keyring_installed) \
|
|
||||||
{ \
|
|
||||||
install_session_keyring(init_session_keyring); \
|
|
||||||
keyring_installed = true; \
|
|
||||||
}
|
|
||||||
#else
|
|
||||||
#define KWORKER_INSTALL_KEYRING()
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
extern void ksu_android_ns_fs_check();
|
||||||
|
extern struct file *ksu_filp_open_compat(const char *filename, int flags,
|
||||||
|
umode_t mode);
|
||||||
|
extern ssize_t ksu_kernel_read_compat(struct file *p, void *buf, size_t count,
|
||||||
|
loff_t *pos);
|
||||||
|
extern ssize_t ksu_kernel_write_compat(struct file *p, const void *buf,
|
||||||
|
size_t count, loff_t *pos);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -39,7 +39,7 @@ int __init kernelsu_init(void)
|
|||||||
pr_alert("*************************************************************");
|
pr_alert("*************************************************************");
|
||||||
pr_alert("** NOTICE NOTICE NOTICE NOTICE NOTICE NOTICE NOTICE **");
|
pr_alert("** NOTICE NOTICE NOTICE NOTICE NOTICE NOTICE NOTICE **");
|
||||||
pr_alert("** **");
|
pr_alert("** **");
|
||||||
pr_alert("** You are running DEBUG version of KernelSU **");
|
pr_alert("** You are running KernelSU in DEBUG mode **");
|
||||||
pr_alert("** **");
|
pr_alert("** **");
|
||||||
pr_alert("** NOTICE NOTICE NOTICE NOTICE NOTICE NOTICE NOTICE **");
|
pr_alert("** NOTICE NOTICE NOTICE NOTICE NOTICE NOTICE NOTICE **");
|
||||||
pr_alert("*************************************************************");
|
pr_alert("*************************************************************");
|
||||||
@@ -47,7 +47,7 @@ int __init kernelsu_init(void)
|
|||||||
|
|
||||||
ksu_core_init();
|
ksu_core_init();
|
||||||
|
|
||||||
ksu_workqueue = alloc_workqueue("kernelsu_work_queue", 0, 0);
|
ksu_workqueue = alloc_ordered_workqueue("kernelsu_work_queue", 0);
|
||||||
|
|
||||||
ksu_allowlist_init();
|
ksu_allowlist_init();
|
||||||
|
|
||||||
|
|||||||
11
kernel/ksu.h
11
kernel/ksu.h
@@ -4,16 +4,7 @@
|
|||||||
#include "linux/types.h"
|
#include "linux/types.h"
|
||||||
#include "linux/workqueue.h"
|
#include "linux/workqueue.h"
|
||||||
|
|
||||||
#ifndef KSU_GIT_VERSION
|
#define KERNEL_SU_VERSION KSU_VERSION
|
||||||
#warning \
|
|
||||||
"KSU_GIT_VERSION not defined! It is better to make KernelSU a git submodule!"
|
|
||||||
#define KERNEL_SU_VERSION (16)
|
|
||||||
#else
|
|
||||||
#define KERNEL_SU_VERSION \
|
|
||||||
(10000 + KSU_GIT_VERSION + \
|
|
||||||
200) // major * 10000 + git version + 200 for historical reasons
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#define KERNEL_SU_OPTION 0xDEADBEEF
|
#define KERNEL_SU_OPTION 0xDEADBEEF
|
||||||
|
|
||||||
#define CMD_GRANT_ROOT 0
|
#define CMD_GRANT_ROOT 0
|
||||||
|
|||||||
131
kernel/ksud.c
131
kernel/ksud.c
@@ -1,7 +1,5 @@
|
|||||||
#include "asm/current.h"
|
#include "asm/current.h"
|
||||||
#include "linux/string.h"
|
|
||||||
#include "linux/compat.h"
|
#include "linux/compat.h"
|
||||||
#include "linux/cred.h"
|
|
||||||
#include "linux/dcache.h"
|
#include "linux/dcache.h"
|
||||||
#include "linux/err.h"
|
#include "linux/err.h"
|
||||||
#include "linux/fs.h"
|
#include "linux/fs.h"
|
||||||
@@ -12,12 +10,12 @@
|
|||||||
#include "linux/uaccess.h"
|
#include "linux/uaccess.h"
|
||||||
#include "linux/version.h"
|
#include "linux/version.h"
|
||||||
#include "linux/workqueue.h"
|
#include "linux/workqueue.h"
|
||||||
#include "linux/input.h"
|
|
||||||
|
|
||||||
#include "allowlist.h"
|
#include "allowlist.h"
|
||||||
#include "arch.h"
|
#include "arch.h"
|
||||||
#include "klog.h" // IWYU pragma: keep
|
#include "klog.h" // IWYU pragma: keep
|
||||||
#include "ksud.h"
|
#include "ksud.h"
|
||||||
|
#include "kernel_compat.h"
|
||||||
#include "selinux/selinux.h"
|
#include "selinux/selinux.h"
|
||||||
|
|
||||||
static const char KERNEL_SU_RC[] =
|
static const char KERNEL_SU_RC[] =
|
||||||
@@ -61,11 +59,11 @@ void on_post_fs_data(void)
|
|||||||
{
|
{
|
||||||
static bool done = false;
|
static bool done = false;
|
||||||
if (done) {
|
if (done) {
|
||||||
pr_info("on_post_fs_data already done");
|
pr_info("on_post_fs_data already done\n");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
done = true;
|
done = true;
|
||||||
pr_info("on_post_fs_data!");
|
pr_info("on_post_fs_data!\n");
|
||||||
ksu_load_allow_list();
|
ksu_load_allow_list();
|
||||||
// sanity check, this may influence the performance
|
// sanity check, this may influence the performance
|
||||||
stop_input_hook();
|
stop_input_hook();
|
||||||
@@ -140,8 +138,9 @@ static int __maybe_unused count(struct user_arg_ptr argv, int max)
|
|||||||
return i;
|
return i;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// the call from execve_handler_pre won't provided correct value for __never_use_argument, use them after fix execve_handler_pre, keeping them for consistence for manually patched code
|
||||||
int ksu_handle_execveat_ksud(int *fd, struct filename **filename_ptr,
|
int ksu_handle_execveat_ksud(int *fd, struct filename **filename_ptr,
|
||||||
void *argv, void *envp, int *flags)
|
struct user_arg_ptr *argv, struct user_arg_ptr *envp, int *__never_use_flags)
|
||||||
{
|
{
|
||||||
#ifndef CONFIG_KPROBES
|
#ifndef CONFIG_KPROBES
|
||||||
if (!ksu_execveat_hook) {
|
if (!ksu_execveat_hook) {
|
||||||
@@ -152,7 +151,11 @@ int ksu_handle_execveat_ksud(int *fd, struct filename **filename_ptr,
|
|||||||
|
|
||||||
static const char app_process[] = "/system/bin/app_process";
|
static const char app_process[] = "/system/bin/app_process";
|
||||||
static bool first_app_process = true;
|
static bool first_app_process = true;
|
||||||
|
|
||||||
|
/* This applies to versions Android 10+ */
|
||||||
static const char system_bin_init[] = "/system/bin/init";
|
static const char system_bin_init[] = "/system/bin/init";
|
||||||
|
/* This applies to versions between Android 6 ~ 9 */
|
||||||
|
static const char old_system_init[] = "/init";
|
||||||
static bool init_second_stage_executed = false;
|
static bool init_second_stage_executed = false;
|
||||||
|
|
||||||
if (!filename_ptr)
|
if (!filename_ptr)
|
||||||
@@ -163,51 +166,84 @@ int ksu_handle_execveat_ksud(int *fd, struct filename **filename_ptr,
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (unlikely(!memcmp(filename->name, system_bin_init,
|
if (unlikely(!memcmp(filename->name, system_bin_init,
|
||||||
sizeof(system_bin_init) - 1))) {
|
sizeof(system_bin_init) - 1))) {
|
||||||
#ifdef __aarch64__
|
|
||||||
// /system/bin/init executed
|
// /system/bin/init executed
|
||||||
struct user_arg_ptr *ptr = (struct user_arg_ptr*) argv;
|
int argc = count(*argv, MAX_ARG_STRINGS);
|
||||||
int argc = count(*ptr, MAX_ARG_STRINGS);
|
|
||||||
pr_info("/system/bin/init argc: %d\n", argc);
|
pr_info("/system/bin/init argc: %d\n", argc);
|
||||||
if (argc > 1 && !init_second_stage_executed) {
|
if (argc > 1 && !init_second_stage_executed) {
|
||||||
const char __user *p = get_user_arg_ptr(*ptr, 1);
|
const char __user *p = get_user_arg_ptr(*argv, 1);
|
||||||
if (p && !IS_ERR(p)) {
|
if (p && !IS_ERR(p)) {
|
||||||
char first_arg[16];
|
char first_arg[16];
|
||||||
#if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 8, 0)
|
ksu_strncpy_from_user_nofault(first_arg, p, sizeof(first_arg));
|
||||||
strncpy_from_user_nofault(first_arg, p, sizeof(first_arg));
|
pr_info("/system/bin/init first arg: %s\n", first_arg);
|
||||||
#elif LINUX_VERSION_CODE >= KERNEL_VERSION(5, 3, 0)
|
|
||||||
strncpy_from_unsafe_user(first_arg, p, sizeof(first_arg));
|
|
||||||
#else
|
|
||||||
strncpy_from_user(first_arg, p, sizeof(first_arg));
|
|
||||||
#endif
|
|
||||||
pr_info("first arg: %s\n", first_arg);
|
|
||||||
if (!strcmp(first_arg, "second_stage")) {
|
if (!strcmp(first_arg, "second_stage")) {
|
||||||
pr_info("/system/bin/init second_stage executed\n");
|
pr_info("/system/bin/init second_stage executed\n");
|
||||||
apply_kernelsu_rules();
|
apply_kernelsu_rules();
|
||||||
init_second_stage_executed = true;
|
init_second_stage_executed = true;
|
||||||
|
ksu_android_ns_fs_check();
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
pr_err("/system/bin/init parse args err!\n");
|
pr_err("/system/bin/init parse args err!\n");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#else
|
} else if (unlikely(!memcmp(filename->name, old_system_init,
|
||||||
// The argument parse is incorrect becuase of the struct user_arg_ptr has 16bytes
|
sizeof(old_system_init) - 1))) {
|
||||||
// and it is passed by value(not pointer), in arm64, it is correct becuase the register
|
// /init executed
|
||||||
// is just arranged correct accidentally, but is not correct in x86_64
|
int argc = count(*argv, MAX_ARG_STRINGS);
|
||||||
// i have no device to test, so revert it for x86_64
|
pr_info("/init argc: %d\n", argc);
|
||||||
static int init_count = 0;
|
if (argc > 1 && !init_second_stage_executed) {
|
||||||
if (++init_count == 2) {
|
/* This applies to versions between Android 6 ~ 7 */
|
||||||
// 1: /system/bin/init selinux_setup
|
const char __user *p = get_user_arg_ptr(*argv, 1);
|
||||||
// 2: /system/bin/init second_stage
|
if (p && !IS_ERR(p)) {
|
||||||
pr_info("/system/bin/init second_stage executed\n");
|
char first_arg[16];
|
||||||
apply_kernelsu_rules();
|
ksu_strncpy_from_user_nofault(first_arg, p, sizeof(first_arg));
|
||||||
|
pr_info("/init first arg: %s\n", first_arg);
|
||||||
|
if (!strcmp(first_arg, "--second-stage")) {
|
||||||
|
pr_info("/init second_stage executed\n");
|
||||||
|
apply_kernelsu_rules();
|
||||||
|
init_second_stage_executed = true;
|
||||||
|
ksu_android_ns_fs_check();
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
pr_err("/init parse args err!\n");
|
||||||
|
}
|
||||||
|
} else if (argc == 1 && !init_second_stage_executed) {
|
||||||
|
/* This applies to versions between Android 8 ~ 9 */
|
||||||
|
int envc = count(*envp, MAX_ARG_STRINGS);
|
||||||
|
if (envc > 0) {
|
||||||
|
int n;
|
||||||
|
for (n = 1; n <= envc; n++) {
|
||||||
|
const char __user *p = get_user_arg_ptr(*envp, n);
|
||||||
|
if (!p || IS_ERR(p)) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
char env[256];
|
||||||
|
// Reading environment variable strings from user space
|
||||||
|
if (ksu_strncpy_from_user_nofault(env, p, sizeof(env)) < 0)
|
||||||
|
continue;
|
||||||
|
// Parsing environment variable names and values
|
||||||
|
char *env_name = env;
|
||||||
|
char *env_value = strchr(env, '=');
|
||||||
|
if (env_value == NULL)
|
||||||
|
continue;
|
||||||
|
// Replace equal sign with string terminator
|
||||||
|
*env_value = '\0';
|
||||||
|
env_value++;
|
||||||
|
// Check if the environment variable name and value are matching
|
||||||
|
if (!strcmp(env_name, "INIT_SECOND_STAGE") && (!strcmp(env_value, "1") || !strcmp(env_value, "true"))) {
|
||||||
|
pr_info("/init second_stage executed\n");
|
||||||
|
apply_kernelsu_rules();
|
||||||
|
init_second_stage_executed = true;
|
||||||
|
ksu_android_ns_fs_check();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (unlikely(first_app_process &&
|
if (unlikely(first_app_process &&
|
||||||
!memcmp(filename->name, app_process, sizeof(app_process) - 1))) {
|
!memcmp(filename->name, app_process, sizeof(app_process) - 1))) {
|
||||||
first_app_process = false;
|
first_app_process = false;
|
||||||
pr_info("exec app_process, /data prepared, second_stage: %d\n", init_second_stage_executed);
|
pr_info("exec app_process, /data prepared, second_stage: %d\n", init_second_stage_executed);
|
||||||
on_post_fs_data(); // we keep this for old ksud
|
on_post_fs_data(); // we keep this for old ksud
|
||||||
@@ -228,7 +264,7 @@ static ssize_t read_proxy(struct file *file, char __user *buf, size_t count,
|
|||||||
bool first_read = file->f_pos == 0;
|
bool first_read = file->f_pos == 0;
|
||||||
ssize_t ret = orig_read(file, buf, count, pos);
|
ssize_t ret = orig_read(file, buf, count, pos);
|
||||||
if (first_read) {
|
if (first_read) {
|
||||||
pr_info("read_proxy append %ld + %ld", ret, read_count_append);
|
pr_info("read_proxy append %ld + %ld\n", ret, read_count_append);
|
||||||
ret += read_count_append;
|
ret += read_count_append;
|
||||||
}
|
}
|
||||||
return ret;
|
return ret;
|
||||||
@@ -239,7 +275,7 @@ static ssize_t read_iter_proxy(struct kiocb *iocb, struct iov_iter *to)
|
|||||||
bool first_read = iocb->ki_pos == 0;
|
bool first_read = iocb->ki_pos == 0;
|
||||||
ssize_t ret = orig_read_iter(iocb, to);
|
ssize_t ret = orig_read_iter(iocb, to);
|
||||||
if (first_read) {
|
if (first_read) {
|
||||||
pr_info("read_iter_proxy append %ld + %ld", ret,
|
pr_info("read_iter_proxy append %ld + %ld\n", ret,
|
||||||
read_count_append);
|
read_count_append);
|
||||||
ret += read_count_append;
|
ret += read_count_append;
|
||||||
}
|
}
|
||||||
@@ -308,7 +344,7 @@ int ksu_handle_vfs_read(struct file **file_ptr, char __user **buf_ptr,
|
|||||||
current->comm, count, rc_count);
|
current->comm, count, rc_count);
|
||||||
|
|
||||||
if (count < rc_count) {
|
if (count < rc_count) {
|
||||||
pr_err("count: %d < rc_count: %d", count, rc_count);
|
pr_err("count: %d < rc_count: %d\n", count, rc_count);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -400,11 +436,19 @@ static int execve_handler_pre(struct kprobe *p, struct pt_regs *regs)
|
|||||||
int *fd = (int *)&PT_REGS_PARM1(regs);
|
int *fd = (int *)&PT_REGS_PARM1(regs);
|
||||||
struct filename **filename_ptr =
|
struct filename **filename_ptr =
|
||||||
(struct filename **)&PT_REGS_PARM2(regs);
|
(struct filename **)&PT_REGS_PARM2(regs);
|
||||||
void *argv = (void *)&PT_REGS_PARM3(regs);
|
struct user_arg_ptr argv;
|
||||||
void *envp = (void *)&PT_REGS_PARM4(regs);
|
#ifdef CONFIG_COMPAT
|
||||||
int *flags = (int *)&PT_REGS_PARM5(regs);
|
argv.is_compat = PT_REGS_PARM3(regs);
|
||||||
|
if (unlikely(argv.is_compat)) {
|
||||||
|
argv.ptr.compat = PT_REGS_CCALL_PARM4(regs);
|
||||||
|
} else {
|
||||||
|
argv.ptr.native = PT_REGS_CCALL_PARM4(regs);
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
argv.ptr.native = PT_REGS_PARM3(regs);
|
||||||
|
#endif
|
||||||
|
|
||||||
return ksu_handle_execveat_ksud(fd, filename_ptr, argv, envp, flags);
|
return ksu_handle_execveat_ksud(fd, filename_ptr, &argv, NULL, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int read_handler_pre(struct kprobe *p, struct pt_regs *regs)
|
static int read_handler_pre(struct kprobe *p, struct pt_regs *regs)
|
||||||
@@ -412,7 +456,7 @@ static int read_handler_pre(struct kprobe *p, struct pt_regs *regs)
|
|||||||
struct file **file_ptr = (struct file **)&PT_REGS_PARM1(regs);
|
struct file **file_ptr = (struct file **)&PT_REGS_PARM1(regs);
|
||||||
char __user **buf_ptr = (char **)&PT_REGS_PARM2(regs);
|
char __user **buf_ptr = (char **)&PT_REGS_PARM2(regs);
|
||||||
size_t *count_ptr = (size_t *)&PT_REGS_PARM3(regs);
|
size_t *count_ptr = (size_t *)&PT_REGS_PARM3(regs);
|
||||||
loff_t **pos_ptr = (loff_t **)&PT_REGS_PARM4(regs);
|
loff_t **pos_ptr = (loff_t **)&PT_REGS_CCALL_PARM4(regs);
|
||||||
|
|
||||||
return ksu_handle_vfs_read(file_ptr, buf_ptr, count_ptr, pos_ptr);
|
return ksu_handle_vfs_read(file_ptr, buf_ptr, count_ptr, pos_ptr);
|
||||||
}
|
}
|
||||||
@@ -422,7 +466,7 @@ static int input_handle_event_handler_pre(struct kprobe *p,
|
|||||||
{
|
{
|
||||||
unsigned int *type = (unsigned int *)&PT_REGS_PARM2(regs);
|
unsigned int *type = (unsigned int *)&PT_REGS_PARM2(regs);
|
||||||
unsigned int *code = (unsigned int *)&PT_REGS_PARM3(regs);
|
unsigned int *code = (unsigned int *)&PT_REGS_PARM3(regs);
|
||||||
int *value = (int *)&PT_REGS_PARM4(regs);
|
int *value = (int *)&PT_REGS_CCALL_PARM4(regs);
|
||||||
return ksu_handle_input_handle_event(type, code, value);
|
return ksu_handle_input_handle_event(type, code, value);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -470,6 +514,7 @@ static void stop_vfs_read_hook()
|
|||||||
pr_info("unregister vfs_read kprobe: %d!\n", ret);
|
pr_info("unregister vfs_read kprobe: %d!\n", ret);
|
||||||
#else
|
#else
|
||||||
ksu_vfs_read_hook = false;
|
ksu_vfs_read_hook = false;
|
||||||
|
pr_info("stop vfs_read_hook\n");
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -480,6 +525,7 @@ static void stop_execve_hook()
|
|||||||
pr_info("unregister execve kprobe: %d!\n", ret);
|
pr_info("unregister execve kprobe: %d!\n", ret);
|
||||||
#else
|
#else
|
||||||
ksu_execveat_hook = false;
|
ksu_execveat_hook = false;
|
||||||
|
pr_info("stop execve_hook\n");
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -495,6 +541,7 @@ static void stop_input_hook()
|
|||||||
pr_info("unregister input kprobe: %d!\n", ret);
|
pr_info("unregister input kprobe: %d!\n", ret);
|
||||||
#else
|
#else
|
||||||
ksu_input_hook = false;
|
ksu_input_hook = false;
|
||||||
|
pr_info("stop input_hook\n");
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -52,7 +52,7 @@ bool become_manager(char *pkg)
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
// we have found the apk!
|
// we have found the apk!
|
||||||
pr_info("found apk: %s", cwd);
|
pr_info("found apk: %s\n", cwd);
|
||||||
char *pkg_index = strstr(cwd, pkg);
|
char *pkg_index = strstr(cwd, pkg);
|
||||||
if (!pkg_index) {
|
if (!pkg_index) {
|
||||||
pr_info("apk path not match package name!\n");
|
pr_info("apk path not match package name!\n");
|
||||||
@@ -70,7 +70,7 @@ bool become_manager(char *pkg)
|
|||||||
pr_info("invalid pkg: %s\n", pkg);
|
pr_info("invalid pkg: %s\n", pkg);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
if (is_manager_apk(cwd) == 0) {
|
if (is_manager_apk(cwd)) {
|
||||||
// check passed
|
// check passed
|
||||||
uid_t uid = current_uid().val;
|
uid_t uid = current_uid().val;
|
||||||
pr_info("manager uid: %d\n", uid);
|
pr_info("manager uid: %d\n", uid);
|
||||||
@@ -80,7 +80,7 @@ bool become_manager(char *pkg)
|
|||||||
result = true;
|
result = true;
|
||||||
goto clean;
|
goto clean;
|
||||||
} else {
|
} else {
|
||||||
pr_info("manager signature invalid!");
|
pr_info("manager signature invalid!\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
break;
|
break;
|
||||||
|
|||||||
@@ -39,7 +39,7 @@ static struct policydb *get_policydb(void)
|
|||||||
void apply_kernelsu_rules()
|
void apply_kernelsu_rules()
|
||||||
{
|
{
|
||||||
if (!getenforce()) {
|
if (!getenforce()) {
|
||||||
pr_info("SELinux permissive or disabled, apply rules!");
|
pr_info("SELinux permissive or disabled, apply rules!\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
rcu_read_lock();
|
rcu_read_lock();
|
||||||
@@ -84,6 +84,8 @@ void apply_kernelsu_rules()
|
|||||||
// our ksud triggered by init
|
// our ksud triggered by init
|
||||||
ksu_allow(db, "init", "adb_data_file", "file", ALL);
|
ksu_allow(db, "init", "adb_data_file", "file", ALL);
|
||||||
ksu_allow(db, "init", KERNEL_SU_DOMAIN, ALL, ALL);
|
ksu_allow(db, "init", KERNEL_SU_DOMAIN, ALL, ALL);
|
||||||
|
// we need to umount modules in zygote
|
||||||
|
ksu_allow(db, "zygote", "adb_data_file", "dir", "search");
|
||||||
|
|
||||||
// copied from Magisk rules
|
// copied from Magisk rules
|
||||||
// suRights
|
// suRights
|
||||||
@@ -114,6 +116,10 @@ void apply_kernelsu_rules()
|
|||||||
ksu_allow(db, "hwservicemanager", KERNEL_SU_DOMAIN, "process",
|
ksu_allow(db, "hwservicemanager", KERNEL_SU_DOMAIN, "process",
|
||||||
"getattr");
|
"getattr");
|
||||||
|
|
||||||
|
// For mounting loop devices, mirrors, tmpfs
|
||||||
|
ksu_allow(db, "kernel", ALL, "file", "read");
|
||||||
|
ksu_allow(db, "kernel", ALL, "file", "write");
|
||||||
|
|
||||||
// Allow all binder transactions
|
// Allow all binder transactions
|
||||||
ksu_allow(db, ALL, KERNEL_SU_DOMAIN, "binder", ALL);
|
ksu_allow(db, ALL, KERNEL_SU_DOMAIN, "binder", ALL);
|
||||||
|
|
||||||
@@ -245,7 +251,7 @@ int handle_sepolicy(unsigned long arg3, void __user *arg4)
|
|||||||
} else if (subcmd == 4) {
|
} else if (subcmd == 4) {
|
||||||
success = ksu_dontaudit(db, s, t, c, p);
|
success = ksu_dontaudit(db, s, t, c, p);
|
||||||
} else {
|
} else {
|
||||||
pr_err("sepol: unknown subcmd: %d", subcmd);
|
pr_err("sepol: unknown subcmd: %d\n", subcmd);
|
||||||
}
|
}
|
||||||
ret = success ? 0 : -1;
|
ret = success ? 0 : -1;
|
||||||
|
|
||||||
@@ -290,7 +296,7 @@ int handle_sepolicy(unsigned long arg3, void __user *arg4)
|
|||||||
} else if (subcmd == 3) {
|
} else if (subcmd == 3) {
|
||||||
success = ksu_dontauditxperm(db, s, t, c, perm_set);
|
success = ksu_dontauditxperm(db, s, t, c, perm_set);
|
||||||
} else {
|
} else {
|
||||||
pr_err("sepol: unknown subcmd: %d", subcmd);
|
pr_err("sepol: unknown subcmd: %d\n", subcmd);
|
||||||
}
|
}
|
||||||
ret = success ? 0 : -1;
|
ret = success ? 0 : -1;
|
||||||
} else if (cmd == CMD_TYPE_STATE) {
|
} else if (cmd == CMD_TYPE_STATE) {
|
||||||
@@ -307,7 +313,7 @@ int handle_sepolicy(unsigned long arg3, void __user *arg4)
|
|||||||
} else if (subcmd == 2) {
|
} else if (subcmd == 2) {
|
||||||
success = ksu_enforce(db, src);
|
success = ksu_enforce(db, src);
|
||||||
} else {
|
} else {
|
||||||
pr_err("sepol: unknown subcmd: %d", subcmd);
|
pr_err("sepol: unknown subcmd: %d\n", subcmd);
|
||||||
}
|
}
|
||||||
if (success)
|
if (success)
|
||||||
ret = 0;
|
ret = 0;
|
||||||
@@ -422,7 +428,7 @@ int handle_sepolicy(unsigned long arg3, void __user *arg4)
|
|||||||
success = ksu_type_member(db, src, tgt, cls,
|
success = ksu_type_member(db, src, tgt, cls,
|
||||||
default_type);
|
default_type);
|
||||||
} else {
|
} else {
|
||||||
pr_err("sepol: unknown subcmd: %d", subcmd);
|
pr_err("sepol: unknown subcmd: %d\n", subcmd);
|
||||||
}
|
}
|
||||||
if (success)
|
if (success)
|
||||||
ret = 0;
|
ret = 0;
|
||||||
|
|||||||
@@ -26,7 +26,9 @@ static int transive_to_domain(const char *domain)
|
|||||||
}
|
}
|
||||||
|
|
||||||
error = security_secctx_to_secid(domain, strlen(domain), &sid);
|
error = security_secctx_to_secid(domain, strlen(domain), &sid);
|
||||||
pr_info("error: %d, sid: %d\n", error, sid);
|
if (error) {
|
||||||
|
pr_info("security_secctx_to_secid %s -> sid: %d, error: %d\n", domain, sid, error);
|
||||||
|
}
|
||||||
if (!error) {
|
if (!error) {
|
||||||
if (!ksu_sid)
|
if (!ksu_sid)
|
||||||
ksu_sid = sid;
|
ksu_sid = sid;
|
||||||
@@ -42,7 +44,7 @@ static int transive_to_domain(const char *domain)
|
|||||||
void setup_selinux(const char *domain)
|
void setup_selinux(const char *domain)
|
||||||
{
|
{
|
||||||
if (transive_to_domain(domain)) {
|
if (transive_to_domain(domain)) {
|
||||||
pr_err("transive domain failed.");
|
pr_err("transive domain failed.\n");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -73,7 +73,7 @@ static bool add_typeattribute(struct policydb *db, const char *type,
|
|||||||
// rules
|
// rules
|
||||||
#define strip_av(effect, invert) ((effect == AVTAB_AUDITDENY) == !invert)
|
#define strip_av(effect, invert) ((effect == AVTAB_AUDITDENY) == !invert)
|
||||||
|
|
||||||
#define ksu_hash_for_each(node_ptr, n_slot, cur) \
|
#define ksu_hash_for_each(node_ptr, n_slot, cur) \
|
||||||
int i; \
|
int i; \
|
||||||
for (i = 0; i < n_slot; ++i) \
|
for (i = 0; i < n_slot; ++i) \
|
||||||
for (cur = node_ptr[i]; cur; cur = cur->next)
|
for (cur = node_ptr[i]; cur; cur = cur->next)
|
||||||
@@ -81,10 +81,11 @@ static bool add_typeattribute(struct policydb *db, const char *type,
|
|||||||
// htable is a struct instead of pointer above 5.8.0:
|
// htable is a struct instead of pointer above 5.8.0:
|
||||||
// https://elixir.bootlin.com/linux/v5.8-rc1/source/security/selinux/ss/symtab.h
|
// https://elixir.bootlin.com/linux/v5.8-rc1/source/security/selinux/ss/symtab.h
|
||||||
#if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 8, 0)
|
#if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 8, 0)
|
||||||
#define ksu_hashtab_for_each(htab, cur) ksu_hash_for_each (htab.htable, htab.size, cur)
|
#define ksu_hashtab_for_each(htab, cur) \
|
||||||
|
ksu_hash_for_each(htab.htable, htab.size, cur)
|
||||||
#else
|
#else
|
||||||
#define ksu_hashtab_for_each(htab, cur) \
|
#define ksu_hashtab_for_each(htab, cur) \
|
||||||
ksu_hash_for_each (htab->htable, htab->size, cur)
|
ksu_hash_for_each(htab->htable, htab->size, cur)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// symtab_search is introduced on 5.9.0:
|
// symtab_search is introduced on 5.9.0:
|
||||||
@@ -95,8 +96,7 @@ static bool add_typeattribute(struct policydb *db, const char *type,
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define avtab_for_each(avtab, cur) \
|
#define avtab_for_each(avtab, cur) \
|
||||||
ksu_hash_for_each (avtab.htable, avtab.nslot, cur) \
|
ksu_hash_for_each(avtab.htable, avtab.nslot, cur);
|
||||||
;
|
|
||||||
|
|
||||||
static struct avtab_node *get_avtab_node(struct policydb *db,
|
static struct avtab_node *get_avtab_node(struct policydb *db,
|
||||||
struct avtab_key *key,
|
struct avtab_key *key,
|
||||||
@@ -592,14 +592,14 @@ static bool add_filename_trans(struct policydb *db, const char *s,
|
|||||||
trans = (struct filename_trans_datum *)kcalloc(sizeof(*trans),
|
trans = (struct filename_trans_datum *)kcalloc(sizeof(*trans),
|
||||||
1, GFP_ATOMIC);
|
1, GFP_ATOMIC);
|
||||||
if (!trans) {
|
if (!trans) {
|
||||||
pr_err("add_filename_trans: Failed to alloc datum");
|
pr_err("add_filename_trans: Failed to alloc datum\n");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
struct filename_trans *new_key =
|
struct filename_trans *new_key =
|
||||||
(struct filename_trans *)kmalloc(sizeof(*new_key),
|
(struct filename_trans *)kmalloc(sizeof(*new_key),
|
||||||
GFP_ATOMIC);
|
GFP_ATOMIC);
|
||||||
if (!new_key) {
|
if (!new_key) {
|
||||||
pr_err("add_filename_trans: Failed to alloc new_key");
|
pr_err("add_filename_trans: Failed to alloc new_key\n");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
*new_key = key;
|
*new_key = key;
|
||||||
@@ -693,7 +693,7 @@ static bool add_type(struct policydb *db, const char *type_name, bool attr)
|
|||||||
int i;
|
int i;
|
||||||
for (i = 0; i < db->p_roles.nprim; ++i) {
|
for (i = 0; i < db->p_roles.nprim; ++i) {
|
||||||
ebitmap_set_bit(&db->role_val_to_struct[i]->types, value - 1,
|
ebitmap_set_bit(&db->role_val_to_struct[i]->types, value - 1,
|
||||||
0);
|
1);
|
||||||
}
|
}
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
@@ -743,7 +743,7 @@ static bool add_type(struct policydb *db, const char *type_name, bool attr)
|
|||||||
int i;
|
int i;
|
||||||
for (i = 0; i < db->p_roles.nprim; ++i) {
|
for (i = 0; i < db->p_roles.nprim; ++i) {
|
||||||
ebitmap_set_bit(&db->role_val_to_struct[i]->types, value - 1,
|
ebitmap_set_bit(&db->role_val_to_struct[i]->types, value - 1,
|
||||||
0);
|
1);
|
||||||
}
|
}
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
@@ -854,7 +854,7 @@ static bool add_type(struct policydb *db, const char *type_name, bool attr)
|
|||||||
int i;
|
int i;
|
||||||
for (i = 0; i < db->p_roles.nprim; ++i) {
|
for (i = 0; i < db->p_roles.nprim; ++i) {
|
||||||
ebitmap_set_bit(&db->role_val_to_struct[i]->types, value - 1,
|
ebitmap_set_bit(&db->role_val_to_struct[i]->types, value - 1,
|
||||||
0);
|
1);
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -16,6 +16,7 @@
|
|||||||
#include "arch.h"
|
#include "arch.h"
|
||||||
#include "klog.h" // IWYU pragma: keep
|
#include "klog.h" // IWYU pragma: keep
|
||||||
#include "ksud.h"
|
#include "ksud.h"
|
||||||
|
#include "kernel_compat.h"
|
||||||
|
|
||||||
#define SU_PATH "/system/bin/su"
|
#define SU_PATH "/system/bin/su"
|
||||||
#define SH_PATH "/system/bin/sh"
|
#define SH_PATH "/system/bin/sh"
|
||||||
@@ -41,32 +42,27 @@ static char __user *sh_user_path(void)
|
|||||||
int ksu_handle_faccessat(int *dfd, const char __user **filename_user, int *mode,
|
int ksu_handle_faccessat(int *dfd, const char __user **filename_user, int *mode,
|
||||||
int *flags)
|
int *flags)
|
||||||
{
|
{
|
||||||
struct filename *filename;
|
|
||||||
const char su[] = SU_PATH;
|
const char su[] = SU_PATH;
|
||||||
|
|
||||||
if (!ksu_is_allow_uid(current_uid().val)) {
|
if (!ksu_is_allow_uid(current_uid().val)) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
filename = getname(*filename_user);
|
char path[sizeof(su) + 1];
|
||||||
|
memset(path, 0, sizeof(path));
|
||||||
|
ksu_strncpy_from_user_nofault(path, *filename_user, sizeof(path));
|
||||||
|
|
||||||
if (IS_ERR(filename)) {
|
if (unlikely(!memcmp(path, su, sizeof(su)))) {
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
if (unlikely(!memcmp(filename->name, su, sizeof(su)))) {
|
|
||||||
pr_info("faccessat su->sh!\n");
|
pr_info("faccessat su->sh!\n");
|
||||||
*filename_user = sh_user_path();
|
*filename_user = sh_user_path();
|
||||||
}
|
}
|
||||||
|
|
||||||
putname(filename);
|
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int ksu_handle_stat(int *dfd, const char __user **filename_user, int *flags)
|
int ksu_handle_stat(int *dfd, const char __user **filename_user, int *flags)
|
||||||
{
|
{
|
||||||
// const char sh[] = SH_PATH;
|
// const char sh[] = SH_PATH;
|
||||||
struct filename *filename;
|
|
||||||
const char su[] = SU_PATH;
|
const char su[] = SU_PATH;
|
||||||
|
|
||||||
if (!ksu_is_allow_uid(current_uid().val)) {
|
if (!ksu_is_allow_uid(current_uid().val)) {
|
||||||
@@ -77,23 +73,21 @@ int ksu_handle_stat(int *dfd, const char __user **filename_user, int *flags)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
filename = getname(*filename_user);
|
char path[sizeof(su) + 1];
|
||||||
|
memset(path, 0, sizeof(path));
|
||||||
|
ksu_strncpy_from_user_nofault(path, *filename_user, sizeof(path));
|
||||||
|
|
||||||
if (IS_ERR(filename)) {
|
if (unlikely(!memcmp(path, su, sizeof(su)))) {
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
if (unlikely(!memcmp(filename->name, su, sizeof(su)))) {
|
|
||||||
pr_info("newfstatat su->sh!\n");
|
pr_info("newfstatat su->sh!\n");
|
||||||
*filename_user = sh_user_path();
|
*filename_user = sh_user_path();
|
||||||
}
|
}
|
||||||
|
|
||||||
putname(filename);
|
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// the call from execve_handler_pre won't provided correct value for __never_use_argument, use them after fix execve_handler_pre, keeping them for consistence for manually patched code
|
||||||
int ksu_handle_execveat_sucompat(int *fd, struct filename **filename_ptr,
|
int ksu_handle_execveat_sucompat(int *fd, struct filename **filename_ptr,
|
||||||
void *argv, void *envp, int *flags)
|
void *__never_use_argv, void *__never_use_envp, int *__never_use_flags)
|
||||||
{
|
{
|
||||||
struct filename *filename;
|
struct filename *filename;
|
||||||
const char sh[] = KSUD_PATH;
|
const char sh[] = KSUD_PATH;
|
||||||
@@ -128,7 +122,8 @@ static int faccessat_handler_pre(struct kprobe *p, struct pt_regs *regs)
|
|||||||
int *dfd = (int *)PT_REGS_PARM1(regs);
|
int *dfd = (int *)PT_REGS_PARM1(regs);
|
||||||
const char __user **filename_user = (const char **)&PT_REGS_PARM2(regs);
|
const char __user **filename_user = (const char **)&PT_REGS_PARM2(regs);
|
||||||
int *mode = (int *)&PT_REGS_PARM3(regs);
|
int *mode = (int *)&PT_REGS_PARM3(regs);
|
||||||
int *flags = (int *)&PT_REGS_PARM4(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);
|
return ksu_handle_faccessat(dfd, filename_user, mode, flags);
|
||||||
}
|
}
|
||||||
@@ -142,7 +137,7 @@ static int newfstatat_handler_pre(struct kprobe *p, struct pt_regs *regs)
|
|||||||
int *flags = (int *)&PT_REGS_PARM3(regs);
|
int *flags = (int *)&PT_REGS_PARM3(regs);
|
||||||
#else
|
#else
|
||||||
// int vfs_fstatat(int dfd, const char __user *filename, struct kstat *stat,int flag)
|
// int vfs_fstatat(int dfd, const char __user *filename, struct kstat *stat,int flag)
|
||||||
int *flags = (int *)&PT_REGS_PARM4(regs);
|
int *flags = (int *)&PT_REGS_CCALL_PARM4(regs);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
return ksu_handle_stat(dfd, filename_user, flags);
|
return ksu_handle_stat(dfd, filename_user, flags);
|
||||||
@@ -154,12 +149,8 @@ static int execve_handler_pre(struct kprobe *p, struct pt_regs *regs)
|
|||||||
int *fd = (int *)&PT_REGS_PARM1(regs);
|
int *fd = (int *)&PT_REGS_PARM1(regs);
|
||||||
struct filename **filename_ptr =
|
struct filename **filename_ptr =
|
||||||
(struct filename **)&PT_REGS_PARM2(regs);
|
(struct filename **)&PT_REGS_PARM2(regs);
|
||||||
void *argv = (void *)&PT_REGS_PARM3(regs);
|
|
||||||
void *envp = (void *)&PT_REGS_PARM4(regs);
|
|
||||||
int *flags = (int *)&PT_REGS_PARM5(regs);
|
|
||||||
|
|
||||||
return ksu_handle_execveat_sucompat(fd, filename_ptr, argv, envp,
|
return ksu_handle_execveat_sucompat(fd, filename_ptr, NULL, NULL, NULL);
|
||||||
flags);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct kprobe faccessat_kp = {
|
static struct kprobe faccessat_kp = {
|
||||||
|
|||||||
@@ -39,8 +39,7 @@ static bool is_uid_exist(uid_t uid, void *data)
|
|||||||
|
|
||||||
static void do_update_uid(struct work_struct *work)
|
static void do_update_uid(struct work_struct *work)
|
||||||
{
|
{
|
||||||
KWORKER_INSTALL_KEYRING();
|
struct file *fp = ksu_filp_open_compat(SYSTEM_PACKAGES_LIST_PATH, O_RDONLY, 0);
|
||||||
struct file *fp = filp_open(SYSTEM_PACKAGES_LIST_PATH, O_RDONLY, 0);
|
|
||||||
if (IS_ERR(fp)) {
|
if (IS_ERR(fp)) {
|
||||||
pr_err("do_update_uid, open " SYSTEM_PACKAGES_LIST_PATH
|
pr_err("do_update_uid, open " SYSTEM_PACKAGES_LIST_PATH
|
||||||
" failed: %d\n",
|
" failed: %d\n",
|
||||||
|
|||||||
@@ -111,4 +111,6 @@ dependencies {
|
|||||||
implementation(libs.sheet.compose.dialogs.core)
|
implementation(libs.sheet.compose.dialogs.core)
|
||||||
implementation(libs.sheet.compose.dialogs.list)
|
implementation(libs.sheet.compose.dialogs.list)
|
||||||
implementation(libs.sheet.compose.dialogs.input)
|
implementation(libs.sheet.compose.dialogs.input)
|
||||||
|
|
||||||
|
implementation(libs.markdown)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -15,7 +15,8 @@ object Natives {
|
|||||||
// 10931: app profile struct add 'version' field
|
// 10931: app profile struct add 'version' field
|
||||||
// 10946: add capabilities
|
// 10946: add capabilities
|
||||||
// 10977: change groups_count and groups to avoid overflow write
|
// 10977: change groups_count and groups to avoid overflow write
|
||||||
const val MINIMAL_SUPPORTED_KERNEL = 10977
|
// 11071: Fix the issue of failing to set a custom SELinux type.
|
||||||
|
const val MINIMAL_SUPPORTED_KERNEL = 11071
|
||||||
|
|
||||||
init {
|
init {
|
||||||
System.loadLibrary("kernelsu")
|
System.loadLibrary("kernelsu")
|
||||||
@@ -93,6 +94,7 @@ object Natives {
|
|||||||
|
|
||||||
val nonRootUseDefault: Boolean = true,
|
val nonRootUseDefault: Boolean = true,
|
||||||
val umountModules: Boolean = true,
|
val umountModules: Boolean = true,
|
||||||
|
var rules: String = "", // this field is save in ksud!!
|
||||||
) : Parcelable {
|
) : Parcelable {
|
||||||
enum class Namespace {
|
enum class Namespace {
|
||||||
Inherited,
|
Inherited,
|
||||||
|
|||||||
@@ -1,20 +1,33 @@
|
|||||||
package me.weishu.kernelsu.ui.component
|
package me.weishu.kernelsu.ui.component
|
||||||
|
|
||||||
|
import android.graphics.text.LineBreaker
|
||||||
|
import android.text.Layout
|
||||||
|
import android.text.method.LinkMovementMethod
|
||||||
|
import android.view.ViewGroup
|
||||||
|
import android.widget.TextView
|
||||||
import androidx.compose.foundation.layout.Box
|
import androidx.compose.foundation.layout.Box
|
||||||
|
import androidx.compose.foundation.layout.fillMaxWidth
|
||||||
import androidx.compose.foundation.layout.size
|
import androidx.compose.foundation.layout.size
|
||||||
|
import androidx.compose.foundation.layout.wrapContentHeight
|
||||||
import androidx.compose.foundation.shape.RoundedCornerShape
|
import androidx.compose.foundation.shape.RoundedCornerShape
|
||||||
import androidx.compose.material3.AlertDialog
|
import androidx.compose.material3.AlertDialog
|
||||||
import androidx.compose.material3.CircularProgressIndicator
|
import androidx.compose.material3.CircularProgressIndicator
|
||||||
|
import androidx.compose.material3.ExperimentalMaterial3Api
|
||||||
|
import androidx.compose.material3.LocalContentColor
|
||||||
import androidx.compose.material3.Surface
|
import androidx.compose.material3.Surface
|
||||||
import androidx.compose.material3.Text
|
import androidx.compose.material3.Text
|
||||||
import androidx.compose.material3.TextButton
|
import androidx.compose.material3.TextButton
|
||||||
import androidx.compose.runtime.*
|
import androidx.compose.runtime.*
|
||||||
import androidx.compose.ui.Alignment
|
import androidx.compose.ui.Alignment
|
||||||
import androidx.compose.ui.Modifier
|
import androidx.compose.ui.Modifier
|
||||||
|
import androidx.compose.ui.graphics.toArgb
|
||||||
import androidx.compose.ui.res.stringResource
|
import androidx.compose.ui.res.stringResource
|
||||||
import androidx.compose.ui.unit.dp
|
import androidx.compose.ui.unit.dp
|
||||||
|
import androidx.compose.ui.viewinterop.AndroidView
|
||||||
import androidx.compose.ui.window.Dialog
|
import androidx.compose.ui.window.Dialog
|
||||||
import androidx.compose.ui.window.DialogProperties
|
import androidx.compose.ui.window.DialogProperties
|
||||||
|
import io.noties.markwon.Markwon
|
||||||
|
import io.noties.markwon.utils.NoCopySpannableFactory
|
||||||
import kotlinx.coroutines.CancellableContinuation
|
import kotlinx.coroutines.CancellableContinuation
|
||||||
import kotlinx.coroutines.coroutineScope
|
import kotlinx.coroutines.coroutineScope
|
||||||
import kotlinx.coroutines.launch
|
import kotlinx.coroutines.launch
|
||||||
@@ -36,6 +49,7 @@ interface PromptDialogVisuals : DialogVisuals {
|
|||||||
interface ConfirmDialogVisuals : PromptDialogVisuals {
|
interface ConfirmDialogVisuals : PromptDialogVisuals {
|
||||||
val confirm: String?
|
val confirm: String?
|
||||||
val dismiss: String?
|
val dismiss: String?
|
||||||
|
val isMarkdown: Boolean
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -68,15 +82,15 @@ class DialogHostState {
|
|||||||
private object LoadingDialogVisualsImpl : LoadingDialogVisuals
|
private object LoadingDialogVisualsImpl : LoadingDialogVisuals
|
||||||
|
|
||||||
private data class PromptDialogVisualsImpl(
|
private data class PromptDialogVisualsImpl(
|
||||||
override val title: String,
|
override val title: String, override val content: String
|
||||||
override val content: String
|
|
||||||
) : PromptDialogVisuals
|
) : PromptDialogVisuals
|
||||||
|
|
||||||
private data class ConfirmDialogVisualsImpl(
|
private data class ConfirmDialogVisualsImpl(
|
||||||
override val title: String,
|
override val title: String,
|
||||||
override val content: String,
|
override val content: String,
|
||||||
override val confirm: String?,
|
override val confirm: String?,
|
||||||
override val dismiss: String?
|
override val dismiss: String?,
|
||||||
|
override val isMarkdown: Boolean,
|
||||||
) : ConfirmDialogVisuals
|
) : ConfirmDialogVisuals
|
||||||
|
|
||||||
private data class LoadingDialogDataImpl(
|
private data class LoadingDialogDataImpl(
|
||||||
@@ -121,8 +135,7 @@ class DialogHostState {
|
|||||||
mutex.withLock {
|
mutex.withLock {
|
||||||
suspendCancellableCoroutine { continuation ->
|
suspendCancellableCoroutine { continuation ->
|
||||||
currentDialogData = LoadingDialogDataImpl(
|
currentDialogData = LoadingDialogDataImpl(
|
||||||
visuals = LoadingDialogVisualsImpl,
|
visuals = LoadingDialogVisualsImpl, continuation = continuation
|
||||||
continuation = continuation
|
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -161,13 +174,14 @@ class DialogHostState {
|
|||||||
suspend fun showConfirm(
|
suspend fun showConfirm(
|
||||||
title: String,
|
title: String,
|
||||||
content: String,
|
content: String,
|
||||||
|
markdown: Boolean = false,
|
||||||
confirm: String? = null,
|
confirm: String? = null,
|
||||||
dismiss: String? = null
|
dismiss: String? = null
|
||||||
): ConfirmResult = mutex.withLock {
|
): ConfirmResult = mutex.withLock {
|
||||||
try {
|
try {
|
||||||
return@withLock suspendCancellableCoroutine { continuation ->
|
return@withLock suspendCancellableCoroutine { continuation ->
|
||||||
currentDialogData = ConfirmDialogDataImpl(
|
currentDialogData = ConfirmDialogDataImpl(
|
||||||
visuals = ConfirmDialogVisualsImpl(title, content, confirm, dismiss),
|
visuals = ConfirmDialogVisualsImpl(title, content, confirm, dismiss, markdown),
|
||||||
continuation = continuation
|
continuation = continuation
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
@@ -201,9 +215,7 @@ fun LoadingDialog(
|
|||||||
}
|
}
|
||||||
Dialog(onDismissRequest = {}, properties = dialogProperties) {
|
Dialog(onDismissRequest = {}, properties = dialogProperties) {
|
||||||
Surface(
|
Surface(
|
||||||
modifier = Modifier
|
modifier = Modifier.size(100.dp), shape = RoundedCornerShape(8.dp)
|
||||||
.size(100.dp),
|
|
||||||
shape = RoundedCornerShape(8.dp)
|
|
||||||
) {
|
) {
|
||||||
Box(
|
Box(
|
||||||
contentAlignment = Alignment.Center,
|
contentAlignment = Alignment.Center,
|
||||||
@@ -240,11 +252,13 @@ fun PromptDialog(
|
|||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@OptIn(ExperimentalMaterial3Api::class)
|
||||||
@Composable
|
@Composable
|
||||||
fun ConfirmDialog(state: DialogHostState = LocalDialogHost.current) {
|
fun ConfirmDialog(state: DialogHostState = LocalDialogHost.current) {
|
||||||
val confirmDialogData = state.currentDialogData.tryInto<ConfirmDialogData>() ?: return
|
val confirmDialogData = state.currentDialogData.tryInto<ConfirmDialogData>() ?: return
|
||||||
|
|
||||||
val visuals = confirmDialogData.visuals
|
val visuals = confirmDialogData.visuals
|
||||||
|
|
||||||
AlertDialog(
|
AlertDialog(
|
||||||
onDismissRequest = {
|
onDismissRequest = {
|
||||||
confirmDialogData.dismiss()
|
confirmDialogData.dismiss()
|
||||||
@@ -253,7 +267,11 @@ fun ConfirmDialog(state: DialogHostState = LocalDialogHost.current) {
|
|||||||
Text(text = visuals.title)
|
Text(text = visuals.title)
|
||||||
},
|
},
|
||||||
text = {
|
text = {
|
||||||
Text(text = visuals.content)
|
if (visuals.isMarkdown) {
|
||||||
|
MarkdownContent(content = visuals.content)
|
||||||
|
} else {
|
||||||
|
Text(text = visuals.content)
|
||||||
|
}
|
||||||
},
|
},
|
||||||
confirmButton = {
|
confirmButton = {
|
||||||
TextButton(onClick = { confirmDialogData.confirm() }) {
|
TextButton(onClick = { confirmDialogData.confirm() }) {
|
||||||
@@ -266,4 +284,28 @@ fun ConfirmDialog(state: DialogHostState = LocalDialogHost.current) {
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
)
|
)
|
||||||
|
}
|
||||||
|
@Composable
|
||||||
|
private fun MarkdownContent(content: String) {
|
||||||
|
val contentColor = LocalContentColor.current
|
||||||
|
|
||||||
|
AndroidView(
|
||||||
|
factory = { context ->
|
||||||
|
TextView(context).apply {
|
||||||
|
movementMethod = LinkMovementMethod.getInstance()
|
||||||
|
setSpannableFactory(NoCopySpannableFactory.getInstance())
|
||||||
|
breakStrategy = LineBreaker.BREAK_STRATEGY_SIMPLE
|
||||||
|
hyphenationFrequency = Layout.HYPHENATION_FREQUENCY_NONE
|
||||||
|
layoutParams = ViewGroup.LayoutParams(
|
||||||
|
ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT
|
||||||
|
)
|
||||||
|
}
|
||||||
|
},
|
||||||
|
modifier = Modifier
|
||||||
|
.fillMaxWidth()
|
||||||
|
.wrapContentHeight(),
|
||||||
|
update = {
|
||||||
|
Markwon.create(it.context).setMarkdown(it, content)
|
||||||
|
it.setTextColor(contentColor.toArgb())
|
||||||
|
})
|
||||||
}
|
}
|
||||||
@@ -0,0 +1,28 @@
|
|||||||
|
package me.weishu.kernelsu.ui.component
|
||||||
|
|
||||||
|
import androidx.compose.foundation.focusable
|
||||||
|
import androidx.compose.foundation.layout.Box
|
||||||
|
import androidx.compose.runtime.Composable
|
||||||
|
import androidx.compose.runtime.LaunchedEffect
|
||||||
|
import androidx.compose.runtime.remember
|
||||||
|
import androidx.compose.ui.Modifier
|
||||||
|
import androidx.compose.ui.focus.FocusRequester
|
||||||
|
import androidx.compose.ui.focus.focusRequester
|
||||||
|
import androidx.compose.ui.input.key.KeyEvent
|
||||||
|
import androidx.compose.ui.input.key.onKeyEvent
|
||||||
|
|
||||||
|
@Composable
|
||||||
|
fun KeyEventBlocker(predicate: (KeyEvent) -> Boolean) {
|
||||||
|
val requester = remember { FocusRequester() }
|
||||||
|
Box(
|
||||||
|
Modifier
|
||||||
|
.onKeyEvent {
|
||||||
|
predicate(it)
|
||||||
|
}
|
||||||
|
.focusRequester(requester)
|
||||||
|
.focusable()
|
||||||
|
)
|
||||||
|
LaunchedEffect(Unit) {
|
||||||
|
requester.requestFocus()
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -175,6 +175,7 @@ fun RootProfileConfig(
|
|||||||
onProfileChange(
|
onProfileChange(
|
||||||
profile.copy(
|
profile.copy(
|
||||||
context = domain,
|
context = domain,
|
||||||
|
rules = rules,
|
||||||
rootUseDefault = false
|
rootUseDefault = false
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
@@ -357,11 +358,14 @@ private fun UidPanel(uid: Int, label: String, onUidChange: (Int) -> Unit) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Composable
|
@Composable
|
||||||
private fun SELinuxPanel(profile: Natives.Profile, onSELinuxChange: (domain: String, rules: String) -> Unit) {
|
private fun SELinuxPanel(
|
||||||
|
profile: Natives.Profile,
|
||||||
|
onSELinuxChange: (domain: String, rules: String) -> Unit
|
||||||
|
) {
|
||||||
var showDialog by remember { mutableStateOf(false) }
|
var showDialog by remember { mutableStateOf(false) }
|
||||||
if (showDialog) {
|
if (showDialog) {
|
||||||
var domain by remember { mutableStateOf(profile.context) }
|
var domain by remember { mutableStateOf(profile.context) }
|
||||||
var rules by remember { mutableStateOf("") }
|
var rules by remember { mutableStateOf(profile.rules) }
|
||||||
|
|
||||||
val inputOptions = listOf(
|
val inputOptions = listOf(
|
||||||
InputTextField(
|
InputTextField(
|
||||||
@@ -382,7 +386,7 @@ private fun SELinuxPanel(profile: Natives.Profile, onSELinuxChange: (domain: Str
|
|||||||
// value can be a-zA-Z0-9_
|
// value can be a-zA-Z0-9_
|
||||||
val regex = Regex("^[a-z_]+:[a-z0-9_]+:[a-z0-9_]+(:[a-z0-9_]+)?$")
|
val regex = Regex("^[a-z_]+:[a-z0-9_]+:[a-z0-9_]+(:[a-z0-9_]+)?$")
|
||||||
if (value?.matches(regex) == true) ValidationResult.Valid
|
if (value?.matches(regex) == true) ValidationResult.Valid
|
||||||
else ValidationResult.Invalid("Domain must be valid sepolicy")
|
else ValidationResult.Invalid("Domain must be in the format of \"user:role:type:level\"")
|
||||||
}
|
}
|
||||||
),
|
),
|
||||||
InputTextField(
|
InputTextField(
|
||||||
@@ -393,7 +397,6 @@ private fun SELinuxPanel(profile: Natives.Profile, onSELinuxChange: (domain: Str
|
|||||||
type = InputTextFieldType.OUTLINED,
|
type = InputTextFieldType.OUTLINED,
|
||||||
keyboardOptions = KeyboardOptions(
|
keyboardOptions = KeyboardOptions(
|
||||||
keyboardType = KeyboardType.Ascii,
|
keyboardType = KeyboardType.Ascii,
|
||||||
imeAction = ImeAction.Done
|
|
||||||
),
|
),
|
||||||
singleLine = false,
|
singleLine = false,
|
||||||
resultListener = {
|
resultListener = {
|
||||||
@@ -401,8 +404,8 @@ private fun SELinuxPanel(profile: Natives.Profile, onSELinuxChange: (domain: Str
|
|||||||
},
|
},
|
||||||
validationListener = { value ->
|
validationListener = { value ->
|
||||||
if (isSepolicyValid(value)) ValidationResult.Valid
|
if (isSepolicyValid(value)) ValidationResult.Valid
|
||||||
else ValidationResult.Invalid("Rules must be valid sepolicy")
|
else ValidationResult.Invalid("SELinux rules is invalid!")
|
||||||
},
|
}
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|||||||
@@ -1,11 +1,13 @@
|
|||||||
package me.weishu.kernelsu.ui.screen
|
package me.weishu.kernelsu.ui.screen
|
||||||
|
|
||||||
import android.util.Log
|
|
||||||
import androidx.annotation.StringRes
|
import androidx.annotation.StringRes
|
||||||
import androidx.compose.animation.Crossfade
|
import androidx.compose.animation.Crossfade
|
||||||
|
import androidx.compose.foundation.gestures.detectTapGestures
|
||||||
import androidx.compose.foundation.layout.Arrangement
|
import androidx.compose.foundation.layout.Arrangement
|
||||||
|
import androidx.compose.foundation.layout.BoxWithConstraints
|
||||||
import androidx.compose.foundation.layout.Column
|
import androidx.compose.foundation.layout.Column
|
||||||
import androidx.compose.foundation.layout.Row
|
import androidx.compose.foundation.layout.Row
|
||||||
|
import androidx.compose.foundation.layout.fillMaxSize
|
||||||
import androidx.compose.foundation.layout.fillMaxWidth
|
import androidx.compose.foundation.layout.fillMaxWidth
|
||||||
import androidx.compose.foundation.layout.height
|
import androidx.compose.foundation.layout.height
|
||||||
import androidx.compose.foundation.layout.padding
|
import androidx.compose.foundation.layout.padding
|
||||||
@@ -20,6 +22,8 @@ import androidx.compose.material.icons.filled.ArrowDropDown
|
|||||||
import androidx.compose.material.icons.filled.ArrowDropUp
|
import androidx.compose.material.icons.filled.ArrowDropUp
|
||||||
import androidx.compose.material.icons.filled.Security
|
import androidx.compose.material.icons.filled.Security
|
||||||
import androidx.compose.material3.Divider
|
import androidx.compose.material3.Divider
|
||||||
|
import androidx.compose.material3.DropdownMenu
|
||||||
|
import androidx.compose.material3.DropdownMenuItem
|
||||||
import androidx.compose.material3.ExperimentalMaterial3Api
|
import androidx.compose.material3.ExperimentalMaterial3Api
|
||||||
import androidx.compose.material3.ExposedDropdownMenuBox
|
import androidx.compose.material3.ExposedDropdownMenuBox
|
||||||
import androidx.compose.material3.FilterChip
|
import androidx.compose.material3.FilterChip
|
||||||
@@ -38,10 +42,14 @@ import androidx.compose.runtime.rememberCoroutineScope
|
|||||||
import androidx.compose.runtime.saveable.rememberSaveable
|
import androidx.compose.runtime.saveable.rememberSaveable
|
||||||
import androidx.compose.runtime.setValue
|
import androidx.compose.runtime.setValue
|
||||||
import androidx.compose.ui.Modifier
|
import androidx.compose.ui.Modifier
|
||||||
|
import androidx.compose.ui.geometry.Offset
|
||||||
|
import androidx.compose.ui.input.pointer.pointerInput
|
||||||
import androidx.compose.ui.platform.LocalContext
|
import androidx.compose.ui.platform.LocalContext
|
||||||
|
import androidx.compose.ui.platform.LocalDensity
|
||||||
import androidx.compose.ui.res.stringResource
|
import androidx.compose.ui.res.stringResource
|
||||||
import androidx.compose.ui.tooling.preview.Preview
|
import androidx.compose.ui.tooling.preview.Preview
|
||||||
import androidx.compose.ui.unit.Dp
|
import androidx.compose.ui.unit.Dp
|
||||||
|
import androidx.compose.ui.unit.DpOffset
|
||||||
import androidx.compose.ui.unit.dp
|
import androidx.compose.ui.unit.dp
|
||||||
import coil.compose.AsyncImage
|
import coil.compose.AsyncImage
|
||||||
import coil.request.ImageRequest
|
import coil.request.ImageRequest
|
||||||
@@ -54,6 +62,11 @@ import me.weishu.kernelsu.ui.component.SwitchItem
|
|||||||
import me.weishu.kernelsu.ui.component.profile.AppProfileConfig
|
import me.weishu.kernelsu.ui.component.profile.AppProfileConfig
|
||||||
import me.weishu.kernelsu.ui.component.profile.RootProfileConfig
|
import me.weishu.kernelsu.ui.component.profile.RootProfileConfig
|
||||||
import me.weishu.kernelsu.ui.util.LocalSnackbarHost
|
import me.weishu.kernelsu.ui.util.LocalSnackbarHost
|
||||||
|
import me.weishu.kernelsu.ui.util.forceStopApp
|
||||||
|
import me.weishu.kernelsu.ui.util.getSepolicy
|
||||||
|
import me.weishu.kernelsu.ui.util.launchApp
|
||||||
|
import me.weishu.kernelsu.ui.util.restartApp
|
||||||
|
import me.weishu.kernelsu.ui.util.setSepolicy
|
||||||
import me.weishu.kernelsu.ui.viewmodel.SuperUserViewModel
|
import me.weishu.kernelsu.ui.viewmodel.SuperUserViewModel
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -71,16 +84,20 @@ fun AppProfileScreen(
|
|||||||
val scope = rememberCoroutineScope()
|
val scope = rememberCoroutineScope()
|
||||||
val failToUpdateAppProfile =
|
val failToUpdateAppProfile =
|
||||||
stringResource(R.string.failed_to_update_app_profile).format(appInfo.label)
|
stringResource(R.string.failed_to_update_app_profile).format(appInfo.label)
|
||||||
|
val failToUpdateSepolicy =
|
||||||
|
stringResource(R.string.failed_to_update_sepolicy).format(appInfo.label)
|
||||||
|
|
||||||
val packageName = appInfo.packageName
|
val packageName = appInfo.packageName
|
||||||
|
val initialProfile = Natives.getAppProfile(packageName, appInfo.uid)
|
||||||
|
if (initialProfile.allowSu) {
|
||||||
|
initialProfile.rules = getSepolicy(packageName)
|
||||||
|
}
|
||||||
var profile by rememberSaveable {
|
var profile by rememberSaveable {
|
||||||
mutableStateOf(Natives.getAppProfile(packageName, appInfo.uid))
|
mutableStateOf(initialProfile)
|
||||||
}
|
}
|
||||||
|
|
||||||
Log.i("mylog", "profile: $profile")
|
|
||||||
|
|
||||||
Scaffold(
|
Scaffold(
|
||||||
topBar = { TopBar { navigator.popBackStack() } }
|
topBar = { TopBar { navigator.popBackStack() } },
|
||||||
) { paddingValues ->
|
) { paddingValues ->
|
||||||
AppProfileInner(
|
AppProfileInner(
|
||||||
modifier = Modifier
|
modifier = Modifier
|
||||||
@@ -104,6 +121,12 @@ fun AppProfileScreen(
|
|||||||
profile = profile,
|
profile = profile,
|
||||||
onProfileChange = {
|
onProfileChange = {
|
||||||
scope.launch {
|
scope.launch {
|
||||||
|
if (it.allowSu && !it.rootUseDefault && it.rules.isNotEmpty()) {
|
||||||
|
if (!setSepolicy(profile.name, it.rules)) {
|
||||||
|
snackbarHost.showSnackbar(failToUpdateSepolicy)
|
||||||
|
return@launch
|
||||||
|
}
|
||||||
|
}
|
||||||
if (!Natives.setAppProfile(it)) {
|
if (!Natives.setAppProfile(it)) {
|
||||||
snackbarHost.showSnackbar(failToUpdateAppProfile.format(appInfo.uid))
|
snackbarHost.showSnackbar(failToUpdateAppProfile.format(appInfo.uid))
|
||||||
} else {
|
} else {
|
||||||
@@ -128,11 +151,13 @@ private fun AppProfileInner(
|
|||||||
val isRootGranted = profile.allowSu
|
val isRootGranted = profile.allowSu
|
||||||
|
|
||||||
Column(modifier = modifier) {
|
Column(modifier = modifier) {
|
||||||
ListItem(
|
AppMenuBox(packageName) {
|
||||||
headlineContent = { Text(appLabel) },
|
ListItem(
|
||||||
supportingContent = { Text(packageName) },
|
headlineContent = { Text(appLabel) },
|
||||||
leadingContent = appIcon,
|
supportingContent = { Text(packageName) },
|
||||||
)
|
leadingContent = appIcon,
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
SwitchItem(
|
SwitchItem(
|
||||||
icon = Icons.Filled.Security,
|
icon = Icons.Filled.Security,
|
||||||
@@ -291,6 +316,64 @@ private fun ProfileBox(
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Composable
|
||||||
|
private fun AppMenuBox(packageName: String, content: @Composable () -> Unit) {
|
||||||
|
|
||||||
|
var expanded by remember { mutableStateOf(false) }
|
||||||
|
var touchPoint: Offset by remember { mutableStateOf(Offset.Zero) }
|
||||||
|
val density = LocalDensity.current
|
||||||
|
|
||||||
|
BoxWithConstraints(
|
||||||
|
Modifier
|
||||||
|
.fillMaxSize()
|
||||||
|
.pointerInput(Unit) {
|
||||||
|
detectTapGestures {
|
||||||
|
touchPoint = it
|
||||||
|
expanded = true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
) {
|
||||||
|
|
||||||
|
content()
|
||||||
|
|
||||||
|
val (offsetX, offsetY) = with(density) {
|
||||||
|
(touchPoint.x.toDp()) to (touchPoint.y.toDp())
|
||||||
|
}
|
||||||
|
|
||||||
|
DropdownMenu(
|
||||||
|
expanded = expanded,
|
||||||
|
offset = DpOffset(offsetX, -offsetY),
|
||||||
|
onDismissRequest = {
|
||||||
|
expanded = false
|
||||||
|
},
|
||||||
|
) {
|
||||||
|
DropdownMenuItem(
|
||||||
|
text = { Text(stringResource(id = R.string.launch_app)) },
|
||||||
|
onClick = {
|
||||||
|
expanded = false
|
||||||
|
launchApp(packageName)
|
||||||
|
},
|
||||||
|
)
|
||||||
|
DropdownMenuItem(
|
||||||
|
text = { Text(stringResource(id = R.string.force_stop_app)) },
|
||||||
|
onClick = {
|
||||||
|
expanded = false
|
||||||
|
forceStopApp(packageName)
|
||||||
|
},
|
||||||
|
)
|
||||||
|
DropdownMenuItem(
|
||||||
|
text = { Text(stringResource(id = R.string.restart_app)) },
|
||||||
|
onClick = {
|
||||||
|
expanded = false
|
||||||
|
restartApp(packageName)
|
||||||
|
},
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
@Preview
|
@Preview
|
||||||
@Composable
|
@Composable
|
||||||
private fun AppProfilePreview() {
|
private fun AppProfilePreview() {
|
||||||
|
|||||||
@@ -23,16 +23,18 @@ import androidx.compose.ui.graphics.Color
|
|||||||
import androidx.compose.ui.platform.LocalContext
|
import androidx.compose.ui.platform.LocalContext
|
||||||
import androidx.compose.ui.platform.LocalUriHandler
|
import androidx.compose.ui.platform.LocalUriHandler
|
||||||
import androidx.compose.ui.res.stringResource
|
import androidx.compose.ui.res.stringResource
|
||||||
import androidx.compose.ui.text.font.FontFamily
|
|
||||||
import androidx.compose.ui.tooling.preview.Preview
|
import androidx.compose.ui.tooling.preview.Preview
|
||||||
import androidx.compose.ui.unit.dp
|
import androidx.compose.ui.unit.dp
|
||||||
import com.ramcosta.composedestinations.annotation.Destination
|
import com.ramcosta.composedestinations.annotation.Destination
|
||||||
import com.ramcosta.composedestinations.annotation.RootNavGraph
|
import com.ramcosta.composedestinations.annotation.RootNavGraph
|
||||||
import com.ramcosta.composedestinations.navigation.DestinationsNavigator
|
import com.ramcosta.composedestinations.navigation.DestinationsNavigator
|
||||||
import kotlinx.coroutines.Dispatchers
|
import kotlinx.coroutines.Dispatchers
|
||||||
|
import kotlinx.coroutines.launch
|
||||||
import kotlinx.coroutines.withContext
|
import kotlinx.coroutines.withContext
|
||||||
import me.weishu.kernelsu.*
|
import me.weishu.kernelsu.*
|
||||||
import me.weishu.kernelsu.R
|
import me.weishu.kernelsu.R
|
||||||
|
import me.weishu.kernelsu.ui.component.ConfirmDialog
|
||||||
|
import me.weishu.kernelsu.ui.component.ConfirmResult
|
||||||
import me.weishu.kernelsu.ui.screen.destinations.SettingScreenDestination
|
import me.weishu.kernelsu.ui.screen.destinations.SettingScreenDestination
|
||||||
import me.weishu.kernelsu.ui.util.*
|
import me.weishu.kernelsu.ui.util.*
|
||||||
|
|
||||||
@@ -72,6 +74,7 @@ fun HomeScreen(navigator: DestinationsNavigator) {
|
|||||||
DonateCard()
|
DonateCard()
|
||||||
LearnMoreCard()
|
LearnMoreCard()
|
||||||
Spacer(Modifier)
|
Spacer(Modifier)
|
||||||
|
ConfirmDialog()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -79,22 +82,37 @@ fun HomeScreen(navigator: DestinationsNavigator) {
|
|||||||
@Composable
|
@Composable
|
||||||
fun UpdateCard() {
|
fun UpdateCard() {
|
||||||
val context = LocalContext.current
|
val context = LocalContext.current
|
||||||
val newVersion by produceState(initialValue = 0 to "") {
|
val newVersion by produceState(initialValue = Triple(0, "", "")) {
|
||||||
value = withContext(Dispatchers.IO) { checkNewVersion() }
|
value = withContext(Dispatchers.IO) { checkNewVersion() }
|
||||||
}
|
}
|
||||||
val currentVersionCode = getManagerVersion(context).second
|
val currentVersionCode = getManagerVersion(context).second
|
||||||
val newVersionCode = newVersion.first
|
val newVersionCode = newVersion.first
|
||||||
val newVersionUrl = newVersion.second
|
val newVersionUrl = newVersion.second
|
||||||
|
val changelog = newVersion.third
|
||||||
if (newVersionCode <= currentVersionCode) {
|
if (newVersionCode <= currentVersionCode) {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
val uriHandler = LocalUriHandler.current
|
val uriHandler = LocalUriHandler.current
|
||||||
|
val dialogHost = LocalDialogHost.current
|
||||||
|
val title = stringResource(id = R.string.module_changelog)
|
||||||
|
val updateText = stringResource(id = R.string.module_update)
|
||||||
|
val scope = rememberCoroutineScope()
|
||||||
WarningCard(
|
WarningCard(
|
||||||
message = stringResource(id = R.string.new_version_available).format(newVersionCode),
|
message = stringResource(id = R.string.new_version_available).format(newVersionCode),
|
||||||
MaterialTheme.colorScheme.outlineVariant
|
MaterialTheme.colorScheme.outlineVariant
|
||||||
) {
|
) {
|
||||||
uriHandler.openUri(newVersionUrl)
|
scope.launch {
|
||||||
|
if (changelog.isEmpty() || dialogHost.showConfirm(
|
||||||
|
title = title,
|
||||||
|
content = changelog,
|
||||||
|
markdown = true,
|
||||||
|
confirm = updateText,
|
||||||
|
) == ConfirmResult.Confirmed
|
||||||
|
) {
|
||||||
|
uriHandler.openUri(newVersionUrl)
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -216,7 +234,6 @@ private fun StatusCard(kernelVersion: KernelVersion, ksuVersion: Int?) {
|
|||||||
Column(Modifier.padding(start = 20.dp)) {
|
Column(Modifier.padding(start = 20.dp)) {
|
||||||
Text(
|
Text(
|
||||||
text = stringResource(R.string.home_unsupported),
|
text = stringResource(R.string.home_unsupported),
|
||||||
fontFamily = FontFamily.Serif,
|
|
||||||
style = MaterialTheme.typography.titleMedium
|
style = MaterialTheme.typography.titleMedium
|
||||||
)
|
)
|
||||||
Spacer(Modifier.height(4.dp))
|
Spacer(Modifier.height(4.dp))
|
||||||
@@ -233,7 +250,7 @@ private fun StatusCard(kernelVersion: KernelVersion, ksuVersion: Int?) {
|
|||||||
|
|
||||||
@Composable
|
@Composable
|
||||||
fun WarningCard(
|
fun WarningCard(
|
||||||
message: String, color: Color = MaterialTheme.colorScheme.error, onClick: () -> Unit = {}
|
message: String, color: Color = MaterialTheme.colorScheme.error, onClick: (() -> Unit)? = null
|
||||||
) {
|
) {
|
||||||
ElevatedCard(
|
ElevatedCard(
|
||||||
colors = CardDefaults.elevatedCardColors(
|
colors = CardDefaults.elevatedCardColors(
|
||||||
@@ -243,16 +260,12 @@ fun WarningCard(
|
|||||||
Row(
|
Row(
|
||||||
modifier = Modifier
|
modifier = Modifier
|
||||||
.fillMaxWidth()
|
.fillMaxWidth()
|
||||||
|
.then(onClick?.let { Modifier.clickable { it() } } ?: Modifier)
|
||||||
.padding(24.dp)
|
.padding(24.dp)
|
||||||
.clickable {
|
|
||||||
onClick()
|
|
||||||
}, verticalAlignment = Alignment.CenterVertically
|
|
||||||
) {
|
) {
|
||||||
Column() {
|
Text(
|
||||||
Text(
|
text = message, style = MaterialTheme.typography.bodyMedium
|
||||||
text = message, style = MaterialTheme.typography.bodyMedium
|
)
|
||||||
)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -364,3 +377,15 @@ private fun StatusCardPreview() {
|
|||||||
StatusCard(KernelVersion(4, 10, 101), null)
|
StatusCard(KernelVersion(4, 10, 101), null)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Preview
|
||||||
|
@Composable
|
||||||
|
private fun WarningCardPreview() {
|
||||||
|
Column {
|
||||||
|
WarningCard(message = "Warning message")
|
||||||
|
WarningCard(
|
||||||
|
message = "Warning message ",
|
||||||
|
MaterialTheme.colorScheme.outlineVariant,
|
||||||
|
onClick = {})
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -13,8 +13,13 @@ import androidx.compose.material.icons.filled.Refresh
|
|||||||
import androidx.compose.material.icons.filled.Save
|
import androidx.compose.material.icons.filled.Save
|
||||||
import androidx.compose.material3.*
|
import androidx.compose.material3.*
|
||||||
import androidx.compose.runtime.*
|
import androidx.compose.runtime.*
|
||||||
|
import androidx.compose.runtime.saveable.rememberSaveable
|
||||||
|
import androidx.compose.ui.ExperimentalComposeUiApi
|
||||||
import androidx.compose.ui.Modifier
|
import androidx.compose.ui.Modifier
|
||||||
|
import androidx.compose.ui.input.key.Key
|
||||||
|
import androidx.compose.ui.input.key.key
|
||||||
import androidx.compose.ui.res.stringResource
|
import androidx.compose.ui.res.stringResource
|
||||||
|
import androidx.compose.ui.text.font.FontFamily
|
||||||
import androidx.compose.ui.tooling.preview.Preview
|
import androidx.compose.ui.tooling.preview.Preview
|
||||||
import androidx.compose.ui.unit.dp
|
import androidx.compose.ui.unit.dp
|
||||||
import com.ramcosta.composedestinations.annotation.Destination
|
import com.ramcosta.composedestinations.annotation.Destination
|
||||||
@@ -23,6 +28,7 @@ import kotlinx.coroutines.Dispatchers
|
|||||||
import kotlinx.coroutines.launch
|
import kotlinx.coroutines.launch
|
||||||
import kotlinx.coroutines.withContext
|
import kotlinx.coroutines.withContext
|
||||||
import me.weishu.kernelsu.R
|
import me.weishu.kernelsu.R
|
||||||
|
import me.weishu.kernelsu.ui.component.KeyEventBlocker
|
||||||
import me.weishu.kernelsu.ui.util.LocalSnackbarHost
|
import me.weishu.kernelsu.ui.util.LocalSnackbarHost
|
||||||
import me.weishu.kernelsu.ui.util.installModule
|
import me.weishu.kernelsu.ui.util.installModule
|
||||||
import me.weishu.kernelsu.ui.util.reboot
|
import me.weishu.kernelsu.ui.util.reboot
|
||||||
@@ -34,15 +40,18 @@ import java.util.*
|
|||||||
* @author weishu
|
* @author weishu
|
||||||
* @date 2023/1/1.
|
* @date 2023/1/1.
|
||||||
*/
|
*/
|
||||||
|
@OptIn(ExperimentalComposeUiApi::class)
|
||||||
@Composable
|
@Composable
|
||||||
@Destination
|
@Destination
|
||||||
fun InstallScreen(navigator: DestinationsNavigator, uri: Uri) {
|
fun InstallScreen(navigator: DestinationsNavigator, uri: Uri) {
|
||||||
|
|
||||||
var text by remember { mutableStateOf("") }
|
var text by rememberSaveable { mutableStateOf("") }
|
||||||
var showFloatAction by remember { mutableStateOf(false) }
|
val logContent = StringBuilder()
|
||||||
|
var showFloatAction by rememberSaveable { mutableStateOf(false) }
|
||||||
|
|
||||||
val snackBarHost = LocalSnackbarHost.current
|
val snackBarHost = LocalSnackbarHost.current
|
||||||
val scope = rememberCoroutineScope()
|
val scope = rememberCoroutineScope()
|
||||||
|
val scrollState = rememberScrollState()
|
||||||
|
|
||||||
LaunchedEffect(Unit) {
|
LaunchedEffect(Unit) {
|
||||||
if (text.isNotEmpty()) {
|
if (text.isNotEmpty()) {
|
||||||
@@ -53,9 +62,15 @@ fun InstallScreen(navigator: DestinationsNavigator, uri: Uri) {
|
|||||||
if (success) {
|
if (success) {
|
||||||
showFloatAction = true
|
showFloatAction = true
|
||||||
}
|
}
|
||||||
}) {
|
}, onStdout = {
|
||||||
text += "$it\n"
|
text += "$it\n"
|
||||||
}
|
scope.launch {
|
||||||
|
scrollState.animateScrollTo(scrollState.maxValue)
|
||||||
|
}
|
||||||
|
logContent.append(it).append("\n")
|
||||||
|
}, onStderr = {
|
||||||
|
logContent.append(it).append("\n")
|
||||||
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -73,7 +88,7 @@ fun InstallScreen(navigator: DestinationsNavigator, uri: Uri) {
|
|||||||
Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS),
|
Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS),
|
||||||
"KernelSU_install_log_${date}.log"
|
"KernelSU_install_log_${date}.log"
|
||||||
)
|
)
|
||||||
file.writeText(text)
|
file.writeText(logContent.toString())
|
||||||
snackBarHost.showSnackbar("Log saved to ${file.absolutePath}")
|
snackBarHost.showSnackbar("Log saved to ${file.absolutePath}")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -97,17 +112,20 @@ fun InstallScreen(navigator: DestinationsNavigator, uri: Uri) {
|
|||||||
|
|
||||||
}
|
}
|
||||||
) { innerPadding ->
|
) { innerPadding ->
|
||||||
|
KeyEventBlocker {
|
||||||
|
it.key == Key.VolumeDown || it.key == Key.VolumeUp
|
||||||
|
}
|
||||||
Column(
|
Column(
|
||||||
modifier = Modifier
|
modifier = Modifier
|
||||||
.fillMaxSize(1f)
|
.fillMaxSize(1f)
|
||||||
.padding(innerPadding)
|
.padding(innerPadding)
|
||||||
.verticalScroll(rememberScrollState()),
|
.verticalScroll(scrollState),
|
||||||
) {
|
) {
|
||||||
Text(
|
Text(
|
||||||
modifier = Modifier.padding(8.dp),
|
modifier = Modifier.padding(8.dp),
|
||||||
text = text,
|
text = text,
|
||||||
fontSize = MaterialTheme.typography.bodySmall.fontSize,
|
fontSize = MaterialTheme.typography.bodySmall.fontSize,
|
||||||
fontFamily = MaterialTheme.typography.bodySmall.fontFamily,
|
fontFamily = FontFamily.Monospace,
|
||||||
lineHeight = MaterialTheme.typography.bodySmall.lineHeight,
|
lineHeight = MaterialTheme.typography.bodySmall.lineHeight,
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -19,6 +19,7 @@ import androidx.compose.material.pullrefresh.pullRefresh
|
|||||||
import androidx.compose.material.pullrefresh.rememberPullRefreshState
|
import androidx.compose.material.pullrefresh.rememberPullRefreshState
|
||||||
import androidx.compose.material3.*
|
import androidx.compose.material3.*
|
||||||
import androidx.compose.runtime.*
|
import androidx.compose.runtime.*
|
||||||
|
import androidx.compose.runtime.saveable.rememberSaveable
|
||||||
import androidx.compose.ui.Alignment
|
import androidx.compose.ui.Alignment
|
||||||
import androidx.compose.ui.Modifier
|
import androidx.compose.ui.Modifier
|
||||||
import androidx.compose.ui.platform.LocalContext
|
import androidx.compose.ui.platform.LocalContext
|
||||||
@@ -33,14 +34,18 @@ import androidx.compose.ui.unit.dp
|
|||||||
import androidx.lifecycle.viewmodel.compose.viewModel
|
import androidx.lifecycle.viewmodel.compose.viewModel
|
||||||
import com.ramcosta.composedestinations.annotation.Destination
|
import com.ramcosta.composedestinations.annotation.Destination
|
||||||
import com.ramcosta.composedestinations.navigation.DestinationsNavigator
|
import com.ramcosta.composedestinations.navigation.DestinationsNavigator
|
||||||
|
import kotlinx.coroutines.Dispatchers
|
||||||
import kotlinx.coroutines.launch
|
import kotlinx.coroutines.launch
|
||||||
|
import kotlinx.coroutines.withContext
|
||||||
import me.weishu.kernelsu.Natives
|
import me.weishu.kernelsu.Natives
|
||||||
import me.weishu.kernelsu.R
|
import me.weishu.kernelsu.R
|
||||||
import me.weishu.kernelsu.ui.component.ConfirmDialog
|
import me.weishu.kernelsu.ui.component.ConfirmDialog
|
||||||
import me.weishu.kernelsu.ui.component.ConfirmResult
|
import me.weishu.kernelsu.ui.component.ConfirmResult
|
||||||
|
import me.weishu.kernelsu.ui.component.LoadingDialog
|
||||||
import me.weishu.kernelsu.ui.screen.destinations.InstallScreenDestination
|
import me.weishu.kernelsu.ui.screen.destinations.InstallScreenDestination
|
||||||
import me.weishu.kernelsu.ui.util.*
|
import me.weishu.kernelsu.ui.util.*
|
||||||
import me.weishu.kernelsu.ui.viewmodel.ModuleViewModel
|
import me.weishu.kernelsu.ui.viewmodel.ModuleViewModel
|
||||||
|
import okhttp3.OkHttpClient
|
||||||
|
|
||||||
@Destination
|
@Destination
|
||||||
@Composable
|
@Composable
|
||||||
@@ -48,7 +53,7 @@ fun ModuleScreen(navigator: DestinationsNavigator) {
|
|||||||
val viewModel = viewModel<ModuleViewModel>()
|
val viewModel = viewModel<ModuleViewModel>()
|
||||||
|
|
||||||
LaunchedEffect(Unit) {
|
LaunchedEffect(Unit) {
|
||||||
if (viewModel.moduleList.isEmpty()) {
|
if (viewModel.moduleList.isEmpty() || viewModel.isNeedRefresh) {
|
||||||
viewModel.fetchModuleList()
|
viewModel.fetchModuleList()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -76,6 +81,8 @@ fun ModuleScreen(navigator: DestinationsNavigator) {
|
|||||||
|
|
||||||
navigator.navigate(InstallScreenDestination(uri))
|
navigator.navigate(InstallScreenDestination(uri))
|
||||||
|
|
||||||
|
viewModel.markNeedRefresh()
|
||||||
|
|
||||||
Log.i("ModuleScreen", "select zip result: ${it.data}")
|
Log.i("ModuleScreen", "select zip result: ${it.data}")
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -94,6 +101,8 @@ fun ModuleScreen(navigator: DestinationsNavigator) {
|
|||||||
|
|
||||||
ConfirmDialog()
|
ConfirmDialog()
|
||||||
|
|
||||||
|
LoadingDialog()
|
||||||
|
|
||||||
when {
|
when {
|
||||||
hasMagisk -> {
|
hasMagisk -> {
|
||||||
Box(
|
Box(
|
||||||
@@ -137,9 +146,67 @@ private fun ModuleList(
|
|||||||
val uninstall = stringResource(id = R.string.uninstall)
|
val uninstall = stringResource(id = R.string.uninstall)
|
||||||
val cancel = stringResource(id = android.R.string.cancel)
|
val cancel = stringResource(id = android.R.string.cancel)
|
||||||
val moduleUninstallConfirm = stringResource(id = R.string.module_uninstall_confirm)
|
val moduleUninstallConfirm = stringResource(id = R.string.module_uninstall_confirm)
|
||||||
|
val updateText = stringResource(R.string.module_update)
|
||||||
|
val changelogText = stringResource(R.string.module_changelog)
|
||||||
|
val downloadingText = stringResource(R.string.module_downloading)
|
||||||
|
val startDownloadingText = stringResource(R.string.module_start_downloading)
|
||||||
|
|
||||||
val dialogHost = LocalDialogHost.current
|
val dialogHost = LocalDialogHost.current
|
||||||
val snackBarHost = LocalSnackbarHost.current
|
val snackBarHost = LocalSnackbarHost.current
|
||||||
|
val context = LocalContext.current
|
||||||
|
|
||||||
|
suspend fun onModuleUpdate(
|
||||||
|
module: ModuleViewModel.ModuleInfo,
|
||||||
|
changelogUrl: String,
|
||||||
|
downloadUrl: String,
|
||||||
|
fileName: String
|
||||||
|
) {
|
||||||
|
val changelog = dialogHost.withLoading {
|
||||||
|
withContext(Dispatchers.IO) {
|
||||||
|
OkHttpClient().newCall(
|
||||||
|
okhttp3.Request.Builder().url(changelogUrl).build()
|
||||||
|
).execute().body!!.string()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (changelog.isNotEmpty()) {
|
||||||
|
// changelog is not empty, show it and wait for confirm
|
||||||
|
val confirmResult = dialogHost.showConfirm(
|
||||||
|
changelogText,
|
||||||
|
content = changelog,
|
||||||
|
markdown = true,
|
||||||
|
confirm = updateText,
|
||||||
|
)
|
||||||
|
|
||||||
|
if (confirmResult != ConfirmResult.Confirmed) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
withContext(Dispatchers.Main) {
|
||||||
|
Toast.makeText(
|
||||||
|
context,
|
||||||
|
startDownloadingText.format(module.name),
|
||||||
|
Toast.LENGTH_SHORT
|
||||||
|
).show()
|
||||||
|
}
|
||||||
|
|
||||||
|
val downloading = downloadingText.format(module.name)
|
||||||
|
withContext(Dispatchers.IO) {
|
||||||
|
download(
|
||||||
|
context,
|
||||||
|
downloadUrl,
|
||||||
|
fileName,
|
||||||
|
downloading,
|
||||||
|
onDownloaded = onInstallModule,
|
||||||
|
onDownloading = {
|
||||||
|
launch(Dispatchers.Main) {
|
||||||
|
Toast.makeText(context, downloading, Toast.LENGTH_SHORT).show()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
suspend fun onModuleUninstall(module: ModuleViewModel.ModuleInfo) {
|
suspend fun onModuleUninstall(module: ModuleViewModel.ModuleInfo) {
|
||||||
val confirmResult = dialogHost.showConfirm(
|
val confirmResult = dialogHost.showConfirm(
|
||||||
@@ -152,7 +219,12 @@ private fun ModuleList(
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
val success = uninstallModule(module.id)
|
val success = dialogHost.withLoading {
|
||||||
|
withContext(Dispatchers.IO) {
|
||||||
|
uninstallModule(module.id)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (success) {
|
if (success) {
|
||||||
viewModel.fetchModuleList()
|
viewModel.fetchModuleList()
|
||||||
}
|
}
|
||||||
@@ -175,48 +247,70 @@ private fun ModuleList(
|
|||||||
val refreshState = rememberPullRefreshState(refreshing = viewModel.isRefreshing,
|
val refreshState = rememberPullRefreshState(refreshing = viewModel.isRefreshing,
|
||||||
onRefresh = { viewModel.fetchModuleList() })
|
onRefresh = { viewModel.fetchModuleList() })
|
||||||
Box(modifier.pullRefresh(refreshState)) {
|
Box(modifier.pullRefresh(refreshState)) {
|
||||||
if (viewModel.isOverlayAvailable) {
|
val context = LocalContext.current
|
||||||
val context = LocalContext.current
|
|
||||||
|
|
||||||
LazyColumn(
|
LazyColumn(
|
||||||
modifier = Modifier.fillMaxSize(),
|
modifier = Modifier.fillMaxSize(),
|
||||||
verticalArrangement = Arrangement.spacedBy(16.dp),
|
verticalArrangement = Arrangement.spacedBy(16.dp),
|
||||||
contentPadding = remember {
|
contentPadding = remember {
|
||||||
PaddingValues(
|
PaddingValues(
|
||||||
start = 16.dp,
|
start = 16.dp,
|
||||||
top = 16.dp,
|
top = 16.dp,
|
||||||
end = 16.dp,
|
end = 16.dp,
|
||||||
bottom = 16.dp + 16.dp + 56.dp /* Scaffold Fab Spacing + Fab container height */
|
bottom = 16.dp + 16.dp + 56.dp /* Scaffold Fab Spacing + Fab container height */
|
||||||
)
|
)
|
||||||
},
|
},
|
||||||
) {
|
) {
|
||||||
val isEmpty = viewModel.moduleList.isEmpty()
|
when {
|
||||||
if (isEmpty) {
|
!viewModel.isOverlayAvailable -> {
|
||||||
item {
|
item {
|
||||||
Box(
|
Box(
|
||||||
modifier = Modifier.fillMaxSize(), contentAlignment = Alignment.Center
|
modifier = Modifier.fillParentMaxSize(),
|
||||||
|
contentAlignment = Alignment.Center
|
||||||
) {
|
) {
|
||||||
Text(stringResource(R.string.module_empty))
|
Text(
|
||||||
|
stringResource(R.string.module_overlay_fs_not_available),
|
||||||
|
textAlign = TextAlign.Center
|
||||||
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
}
|
||||||
|
|
||||||
|
viewModel.moduleList.isEmpty() -> {
|
||||||
|
item {
|
||||||
|
Box(
|
||||||
|
modifier = Modifier.fillParentMaxSize(),
|
||||||
|
contentAlignment = Alignment.Center
|
||||||
|
) {
|
||||||
|
Text(
|
||||||
|
stringResource(R.string.module_empty),
|
||||||
|
textAlign = TextAlign.Center
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
else -> {
|
||||||
items(viewModel.moduleList) { module ->
|
items(viewModel.moduleList) { module ->
|
||||||
var isChecked by remember(module) { mutableStateOf(module.enabled) }
|
var isChecked by rememberSaveable(module) { mutableStateOf(module.enabled) }
|
||||||
val scope = rememberCoroutineScope()
|
val scope = rememberCoroutineScope()
|
||||||
val updateUrl by produceState(initialValue = "") {
|
val updatedModule by produceState(initialValue = Triple("", "", "")) {
|
||||||
viewModel.checkUpdate(module) { value = it.orEmpty() }
|
scope.launch(Dispatchers.IO) {
|
||||||
|
value = viewModel.checkUpdate(module)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
val downloadingText = stringResource(R.string.module_downloading)
|
ModuleItem(module, isChecked, updatedModule.first, onUninstall = {
|
||||||
val startDownloadingText = stringResource(R.string.module_start_downloading)
|
|
||||||
|
|
||||||
ModuleItem(module, isChecked, updateUrl, onUninstall = {
|
|
||||||
scope.launch { onModuleUninstall(module) }
|
scope.launch { onModuleUninstall(module) }
|
||||||
}, onCheckChanged = {
|
}, onCheckChanged = {
|
||||||
val success = toggleModule(module.id, !isChecked)
|
scope.launch {
|
||||||
if (success) {
|
val success = dialogHost.withLoading {
|
||||||
isChecked = it
|
withContext(Dispatchers.IO) {
|
||||||
scope.launch {
|
toggleModule(module.id, !isChecked)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (success) {
|
||||||
|
isChecked = it
|
||||||
viewModel.fetchModuleList()
|
viewModel.fetchModuleList()
|
||||||
|
|
||||||
val result = snackBarHost.showSnackbar(
|
val result = snackBarHost.showSnackbar(
|
||||||
@@ -225,32 +319,20 @@ private fun ModuleList(
|
|||||||
if (result == SnackbarResult.ActionPerformed) {
|
if (result == SnackbarResult.ActionPerformed) {
|
||||||
reboot()
|
reboot()
|
||||||
}
|
}
|
||||||
|
} else {
|
||||||
|
val message = if (isChecked) failedDisable else failedEnable
|
||||||
|
snackBarHost.showSnackbar(message.format(module.name))
|
||||||
}
|
}
|
||||||
} else scope.launch {
|
|
||||||
val message = if (isChecked) failedDisable else failedEnable
|
|
||||||
snackBarHost.showSnackbar(message.format(module.name))
|
|
||||||
}
|
}
|
||||||
}, onUpdate = {
|
}, onUpdate = {
|
||||||
|
|
||||||
scope.launch {
|
scope.launch {
|
||||||
Toast.makeText(
|
onModuleUpdate(
|
||||||
context,
|
module,
|
||||||
startDownloadingText.format(module.name),
|
updatedModule.third,
|
||||||
Toast.LENGTH_SHORT
|
updatedModule.first,
|
||||||
).show()
|
"${module.name}-${updatedModule.second}.zip"
|
||||||
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
val downloading = downloadingText.format(module.name)
|
|
||||||
download(
|
|
||||||
context,
|
|
||||||
updateUrl,
|
|
||||||
"${module.name}-${module.version}.zip",
|
|
||||||
downloading,
|
|
||||||
onDownloaded = onInstallModule,
|
|
||||||
onDownloading = {
|
|
||||||
Toast.makeText(context, downloading, Toast.LENGTH_SHORT).show()
|
|
||||||
}
|
|
||||||
)
|
|
||||||
})
|
})
|
||||||
|
|
||||||
// fix last item shadow incomplete in LazyColumn
|
// fix last item shadow incomplete in LazyColumn
|
||||||
@@ -258,15 +340,10 @@ private fun ModuleList(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
DownloadListener(context, onInstallModule)
|
|
||||||
|
|
||||||
} else {
|
|
||||||
Box(modifier = Modifier.fillMaxSize(), contentAlignment = Alignment.Center) {
|
|
||||||
Text(stringResource(R.string.module_overlay_fs_not_available))
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
DownloadListener(context, onInstallModule)
|
||||||
|
|
||||||
PullRefreshIndicator(
|
PullRefreshIndicator(
|
||||||
refreshing = viewModel.isRefreshing, state = refreshState, modifier = Modifier.align(
|
refreshing = viewModel.isRefreshing, state = refreshState, modifier = Modifier.align(
|
||||||
Alignment.TopCenter
|
Alignment.TopCenter
|
||||||
|
|||||||
@@ -60,9 +60,9 @@ fun download(
|
|||||||
downloadManager.enqueue(request)
|
downloadManager.enqueue(request)
|
||||||
}
|
}
|
||||||
|
|
||||||
fun checkNewVersion(): Pair<Int, String> {
|
fun checkNewVersion(): Triple<Int, String, String> {
|
||||||
val url = "https://api.github.com/repos/tiann/KernelSU/releases/latest"
|
val url = "https://api.github.com/repos/tiann/KernelSU/releases/latest"
|
||||||
val defaultValue = 0 to ""
|
val defaultValue = Triple(0, "", "")
|
||||||
runCatching {
|
runCatching {
|
||||||
okhttp3.OkHttpClient().newCall(okhttp3.Request.Builder().url(url).build()).execute()
|
okhttp3.OkHttpClient().newCall(okhttp3.Request.Builder().url(url).build()).execute()
|
||||||
.use { response ->
|
.use { response ->
|
||||||
@@ -71,6 +71,7 @@ fun checkNewVersion(): Pair<Int, String> {
|
|||||||
}
|
}
|
||||||
val body = response.body?.string() ?: return defaultValue
|
val body = response.body?.string() ?: return defaultValue
|
||||||
val json = org.json.JSONObject(body)
|
val json = org.json.JSONObject(body)
|
||||||
|
val changelog = json.optString("body")
|
||||||
|
|
||||||
val assets = json.getJSONArray("assets")
|
val assets = json.getJSONArray("assets")
|
||||||
for (i in 0 until assets.length()) {
|
for (i in 0 until assets.length()) {
|
||||||
@@ -86,7 +87,7 @@ fun checkNewVersion(): Pair<Int, String> {
|
|||||||
val versionCode = matchResult.groupValues[2].toInt()
|
val versionCode = matchResult.groupValues[2].toInt()
|
||||||
val downloadUrl = asset.getString("browser_download_url")
|
val downloadUrl = asset.getString("browser_download_url")
|
||||||
|
|
||||||
return versionCode to downloadUrl
|
return Triple(versionCode, downloadUrl, changelog)
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -9,7 +9,6 @@ import com.topjohnwu.superuser.ShellUtils
|
|||||||
import me.weishu.kernelsu.BuildConfig
|
import me.weishu.kernelsu.BuildConfig
|
||||||
import me.weishu.kernelsu.Natives
|
import me.weishu.kernelsu.Natives
|
||||||
import me.weishu.kernelsu.ksuApp
|
import me.weishu.kernelsu.ksuApp
|
||||||
import me.weishu.kernelsu.ui.viewmodel.ModuleViewModel
|
|
||||||
import org.json.JSONArray
|
import org.json.JSONArray
|
||||||
import java.io.File
|
import java.io.File
|
||||||
|
|
||||||
@@ -92,7 +91,7 @@ fun uninstallModule(id: String): Boolean {
|
|||||||
return result
|
return result
|
||||||
}
|
}
|
||||||
|
|
||||||
fun installModule(uri: Uri, onFinish: (Boolean) -> Unit, onOutput: (String) -> Unit): Boolean {
|
fun installModule(uri: Uri, onFinish: (Boolean) -> Unit, onStdout: (String) -> Unit, onStderr: (String) -> Unit): Boolean {
|
||||||
val resolver = ksuApp.contentResolver
|
val resolver = ksuApp.contentResolver
|
||||||
with(resolver.openInputStream(uri)) {
|
with(resolver.openInputStream(uri)) {
|
||||||
val file = File(ksuApp.cacheDir, "module.zip")
|
val file = File(ksuApp.cacheDir, "module.zip")
|
||||||
@@ -103,14 +102,20 @@ fun installModule(uri: Uri, onFinish: (Boolean) -> Unit, onOutput: (String) -> U
|
|||||||
|
|
||||||
val shell = getRootShell()
|
val shell = getRootShell()
|
||||||
|
|
||||||
val callbackList: CallbackList<String?> = object : CallbackList<String?>() {
|
val stdoutCallback: CallbackList<String?> = object : CallbackList<String?>() {
|
||||||
override fun onAddElement(s: String?) {
|
override fun onAddElement(s: String?) {
|
||||||
onOutput(s ?: "")
|
onStdout(s ?: "")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
val stderrCallback: CallbackList<String?> = object : CallbackList<String?>() {
|
||||||
|
override fun onAddElement(s: String?) {
|
||||||
|
onStderr(s ?: "")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
val result =
|
val result =
|
||||||
shell.newJob().add("${getKsuDaemonPath()} $cmd").to(callbackList, callbackList).exec()
|
shell.newJob().add("${getKsuDaemonPath()} $cmd").to(stdoutCallback, stderrCallback).exec()
|
||||||
Log.i("KernelSU", "install module $uri result: $result")
|
Log.i("KernelSU", "install module $uri result: $result")
|
||||||
|
|
||||||
file.delete()
|
file.delete()
|
||||||
@@ -148,6 +153,40 @@ fun isSepolicyValid(rules: String?): Boolean {
|
|||||||
}
|
}
|
||||||
val shell = getRootShell()
|
val shell = getRootShell()
|
||||||
val result =
|
val result =
|
||||||
shell.newJob().add("ksud sepolicy check '$rules'").to(ArrayList(), null).exec()
|
shell.newJob().add("${getKsuDaemonPath()} sepolicy check '$rules'").to(ArrayList(), null).exec()
|
||||||
return result.isSuccess
|
return result.isSuccess
|
||||||
|
}
|
||||||
|
|
||||||
|
fun getSepolicy(pkg: String): String {
|
||||||
|
val shell = getRootShell()
|
||||||
|
val result =
|
||||||
|
shell.newJob().add("${getKsuDaemonPath()} profile get-sepolicy $pkg").to(ArrayList(), null).exec()
|
||||||
|
Log.i(TAG, "code: ${result.code}, out: ${result.out}, err: ${result.err}")
|
||||||
|
return result.out.joinToString("\n")
|
||||||
|
}
|
||||||
|
|
||||||
|
fun setSepolicy(pkg: String, rules: String): Boolean {
|
||||||
|
val shell = getRootShell()
|
||||||
|
val result =
|
||||||
|
shell.newJob().add("${getKsuDaemonPath()} profile set-sepolicy $pkg '$rules'").to(ArrayList(), null).exec()
|
||||||
|
Log.i(TAG, "set sepolicy result: ${result.code}")
|
||||||
|
return result.isSuccess
|
||||||
|
}
|
||||||
|
|
||||||
|
fun forceStopApp(packageName: String) {
|
||||||
|
val shell = getRootShell()
|
||||||
|
val result = shell.newJob().add("am force-stop $packageName").exec()
|
||||||
|
Log.i(TAG, "force stop $packageName result: $result")
|
||||||
|
}
|
||||||
|
|
||||||
|
fun launchApp(packageName: String) {
|
||||||
|
|
||||||
|
val shell = getRootShell()
|
||||||
|
val result = shell.newJob().add("monkey -p $packageName -c android.intent.category.LAUNCHER 1").exec()
|
||||||
|
Log.i(TAG, "launch $packageName result: $result")
|
||||||
|
}
|
||||||
|
|
||||||
|
fun restartApp(packageName: String) {
|
||||||
|
forceStopApp(packageName)
|
||||||
|
launchApp(packageName)
|
||||||
}
|
}
|
||||||
@@ -58,6 +58,13 @@ class ModuleViewModel : ViewModel() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var isNeedRefresh by mutableStateOf(false)
|
||||||
|
private set
|
||||||
|
|
||||||
|
fun markNeedRefresh() {
|
||||||
|
isNeedRefresh = true
|
||||||
|
}
|
||||||
|
|
||||||
fun fetchModuleList() {
|
fun fetchModuleList() {
|
||||||
viewModelScope.launch(Dispatchers.IO) {
|
viewModelScope.launch(Dispatchers.IO) {
|
||||||
isRefreshing = true
|
isRefreshing = true
|
||||||
@@ -80,17 +87,19 @@ class ModuleViewModel : ViewModel() {
|
|||||||
.map { obj ->
|
.map { obj ->
|
||||||
ModuleInfo(
|
ModuleInfo(
|
||||||
obj.getString("id"),
|
obj.getString("id"),
|
||||||
obj.getString("name"),
|
|
||||||
|
obj.optString("name"),
|
||||||
obj.optString("author", "Unknown"),
|
obj.optString("author", "Unknown"),
|
||||||
obj.optString("version", "Unknown"),
|
obj.optString("version", "Unknown"),
|
||||||
obj.optInt("versionCode", 0),
|
obj.optInt("versionCode", 0),
|
||||||
obj.getString("description"),
|
obj.optString("description"),
|
||||||
obj.getBoolean("enabled"),
|
obj.getBoolean("enabled"),
|
||||||
obj.getBoolean("update"),
|
obj.getBoolean("update"),
|
||||||
obj.getBoolean("remove"),
|
obj.getBoolean("remove"),
|
||||||
obj.optString("updateJson", "")
|
obj.optString("updateJson")
|
||||||
)
|
)
|
||||||
}.toList()
|
}.toList()
|
||||||
|
isNeedRefresh = false
|
||||||
}.onFailure { e ->
|
}.onFailure { e ->
|
||||||
Log.e(TAG, "fetchModuleList: ", e)
|
Log.e(TAG, "fetchModuleList: ", e)
|
||||||
isRefreshing = false
|
isRefreshing = false
|
||||||
@@ -106,56 +115,46 @@ class ModuleViewModel : ViewModel() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fun checkUpdate(m: ModuleInfo, callback: (String?) -> Unit) {
|
fun checkUpdate(m: ModuleInfo): Triple<String, String, String> {
|
||||||
if (m.updateJson.isEmpty()) {
|
val empty = Triple("", "", "")
|
||||||
callback(null)
|
if (m.updateJson.isEmpty() || m.remove || m.update || !m.enabled) {
|
||||||
return
|
return empty
|
||||||
}
|
}
|
||||||
viewModelScope.launch(Dispatchers.IO) {
|
// download updateJson
|
||||||
// download updateJson
|
val result = kotlin.runCatching {
|
||||||
val result = kotlin.runCatching {
|
val url = m.updateJson
|
||||||
val url = m.updateJson
|
Log.i(TAG, "checkUpdate url: $url")
|
||||||
Log.i(TAG, "checkUpdate url: $url")
|
val response = okhttp3.OkHttpClient()
|
||||||
val response = okhttp3.OkHttpClient()
|
.newCall(
|
||||||
.newCall(
|
|
||||||
okhttp3.Request.Builder()
|
okhttp3.Request.Builder()
|
||||||
.url(url)
|
.url(url)
|
||||||
.build()
|
.build()
|
||||||
).execute()
|
).execute()
|
||||||
Log.d(TAG, "checkUpdate code: ${response.code}")
|
Log.d(TAG, "checkUpdate code: ${response.code}")
|
||||||
if (response.isSuccessful) {
|
if (response.isSuccessful) {
|
||||||
response.body?.string() ?: ""
|
response.body?.string() ?: ""
|
||||||
} else {
|
} else {
|
||||||
""
|
""
|
||||||
}
|
|
||||||
}.getOrDefault("")
|
|
||||||
Log.i(TAG, "checkUpdate result: $result")
|
|
||||||
|
|
||||||
if (result.isEmpty()) {
|
|
||||||
callback(null)
|
|
||||||
return@launch
|
|
||||||
}
|
}
|
||||||
|
}.getOrDefault("")
|
||||||
|
Log.i(TAG, "checkUpdate result: $result")
|
||||||
|
|
||||||
val updateJson = kotlin.runCatching {
|
if (result.isEmpty()) {
|
||||||
JSONObject(result)
|
return empty
|
||||||
}.getOrNull()
|
|
||||||
|
|
||||||
if (updateJson == null) {
|
|
||||||
callback(null)
|
|
||||||
return@launch
|
|
||||||
}
|
|
||||||
|
|
||||||
val version = updateJson.optString("version", "")
|
|
||||||
val versionCode = updateJson.optInt("versionCode", 0)
|
|
||||||
val zipUrl = updateJson.optString("zipUrl", "")
|
|
||||||
val changelog = updateJson.optString("changelog", "")
|
|
||||||
if (versionCode <= m.versionCode || zipUrl.isEmpty()) {
|
|
||||||
callback(null)
|
|
||||||
return@launch
|
|
||||||
}
|
|
||||||
|
|
||||||
callback(zipUrl)
|
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
|
val updateJson = kotlin.runCatching {
|
||||||
|
JSONObject(result)
|
||||||
|
}.getOrNull() ?: return empty
|
||||||
|
|
||||||
|
val version = updateJson.optString("version", "")
|
||||||
|
val versionCode = updateJson.optInt("versionCode", 0)
|
||||||
|
val zipUrl = updateJson.optString("zipUrl", "")
|
||||||
|
val changelog = updateJson.optString("changelog", "")
|
||||||
|
if (versionCode <= m.versionCode || zipUrl.isEmpty()) {
|
||||||
|
return empty
|
||||||
|
}
|
||||||
|
|
||||||
|
return Triple(zipUrl, version, changelog)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,22 +1,19 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<resources>
|
<resources>
|
||||||
<string name="app_name" translatable="false">KernelSU</string>
|
|
||||||
|
|
||||||
<string name="home">الرئيسية</string>
|
<string name="home">الرئيسية</string>
|
||||||
<string name="home_not_installed">غير مثبت</string>
|
<string name="home_not_installed">غير مثبت</string>
|
||||||
<string name="home_click_to_install">إضغط للتثبيت</string>
|
<string name="home_click_to_install">إضغط للتثبيت</string>
|
||||||
<string name="home_working">يعمل</string>
|
<string name="home_working">يعمل</string>
|
||||||
<string name="home_working_version">الإصدار: %d</string>
|
<string name="home_working_version">الإصدار: %d</string>
|
||||||
<string name="home_superuser_count">مستخدمين الجذر: %d</string>
|
<string name="home_superuser_count">المستخدمين الخارقين: %d</string>
|
||||||
<string name="home_module_count">الوحدات: %d</string>
|
<string name="home_module_count">الوحدات: %d</string>
|
||||||
<string name="home_unsupported">غير مدعوم</string>
|
<string name="home_unsupported">غير مدعوم</string>
|
||||||
<string name="home_unsupported_reason">KernelSU يدعم GKI kernels فقط</string>
|
<string name="home_unsupported_reason">KernelSU يدعم GKI kernels فقط</string>
|
||||||
|
|
||||||
<string name="home_kernel">إصدار النواة</string>
|
<string name="home_kernel">إصدار النواة</string>
|
||||||
<string name="home_manager_version">إصدار المدير</string>
|
<string name="home_manager_version">إصدار المدير</string>
|
||||||
<string name="home_fingerprint">البصمة</string>
|
<string name="home_fingerprint">البصمة</string>
|
||||||
|
|
||||||
<string name="home_selinux_status">وضع SELinux</string>
|
<string name="home_selinux_status">وضع SELinux</string>
|
||||||
<string name="selinux_status_disabled">غير مفعل</string>
|
<string name="selinux_status_disabled">معطل</string>
|
||||||
<string name="selinux_status_enforcing">مفروض</string>
|
<string name="selinux_status_enforcing">مفروض</string>
|
||||||
<string name="selinux_status_permissive">متساهل</string>
|
<string name="selinux_status_permissive">متساهل</string>
|
||||||
<string name="selinux_status_unknown">مجهول</string>
|
<string name="selinux_status_unknown">مجهول</string>
|
||||||
@@ -24,8 +21,7 @@
|
|||||||
<string name="module_failed_to_enable">فشل في تمكين الوحدة: %s</string>
|
<string name="module_failed_to_enable">فشل في تمكين الوحدة: %s</string>
|
||||||
<string name="module_failed_to_disable">فشل تعطيل الوحدة : %s</string>
|
<string name="module_failed_to_disable">فشل تعطيل الوحدة : %s</string>
|
||||||
<string name="module_empty">لا توجد وحدة مثبتة</string>
|
<string name="module_empty">لا توجد وحدة مثبتة</string>
|
||||||
|
<string name="module">الوحدات</string>
|
||||||
<string name="module">وحدة</string>
|
|
||||||
<string name="uninstall">إلغاء التثبيت</string>
|
<string name="uninstall">إلغاء التثبيت</string>
|
||||||
<string name="module_install">تثبيت الوحدة</string>
|
<string name="module_install">تثبيت الوحدة</string>
|
||||||
<string name="install">تثبيت</string>
|
<string name="install">تثبيت</string>
|
||||||
@@ -49,13 +45,39 @@
|
|||||||
<string name="send_log">إرسال السجلات</string>
|
<string name="send_log">إرسال السجلات</string>
|
||||||
<string name="safe_mode">الوضع الآمن</string>
|
<string name="safe_mode">الوضع الآمن</string>
|
||||||
<string name="reboot_to_apply">إعادة التشغيل لتطبيق التغييرات</string>
|
<string name="reboot_to_apply">إعادة التشغيل لتطبيق التغييرات</string>
|
||||||
<string name="module_magisk_conflict">تم تعطيل الوحدة لأنها تتعارض مع وحدات Magisk</string>
|
<string name="module_magisk_conflict">تم تعطيل الوحدات النمطية لأنها تتعارض مع Magisk!</string>
|
||||||
<string name="home_learn_kernelsu">تعلم KernelSU</string>
|
<string name="home_learn_kernelsu">تعلم KernelSU</string>
|
||||||
<string name="home_learn_kernelsu_url">https://kernelsu.org/guide/what-is-kernelsu.html</string>
|
<string name="home_learn_kernelsu_url">https://kernelsu.org/guide/what-is-kernelsu.html</string>
|
||||||
<string name="home_click_to_learn_kernelsu">تعرف على كيفية تثبيت KernelSU واستخدام الوحدات</string>
|
<string name="home_click_to_learn_kernelsu">تعرف على كيفية تثبيت KernelSU واستخدام الوحدات</string>
|
||||||
<string name="home_support_title">إدعمنا</string>
|
<string name="home_support_title">إدعمنا</string>
|
||||||
<string name="home_support_content">KernelSU سيظل دائماً مجانياً ومفتوح المصدر. مع ذلك، يمكنك أن تظهر لنا أنك تهتم بالتبرع.</string>
|
<string name="home_support_content">KernelSU سيظل دائماً مجانياً ومفتوح المصدر. مع ذلك، يمكنك أن تظهر لنا أنك تهتم بالتبرع.</string>
|
||||||
<string name="about_source_code"><![CDATA[أنظر إلى مصدر البرمجة في %1$s<br/>إنضم إلى قناتنا في %2$s ]]></string>
|
<string name="about_source_code"><![CDATA[أنظر إلى مصدر البرمجة في %1$s<br/>إنضم إلى قناتنا في %2$s ]]></string>
|
||||||
</resources>
|
<string name="profile_capabilities">القدرات</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="profile_default">الإفتراضي</string>
|
||||||
|
<string name="profile_template">نموذج</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_custom">مُخصّص</string>
|
||||||
|
<string name="profile_namespace">تركيب مساحة الاسم</string>
|
||||||
|
<string name="profile_umount_modules">الغاء تحميل الوحدات</string>
|
||||||
|
<string name="failed_to_update_app_profile">فشل تحديث ملف تعريف التطبيق لـ %s</string>
|
||||||
|
<string name="profile_selinux_context">سياق SELinux</string>
|
||||||
|
<string name="force_stop_app">ايقاف إجباري</string>
|
||||||
|
<string name="settings_umount_modules_default">الغاء تحميل الوحدات بشكل افتراضي</string>
|
||||||
|
<string name="settings_umount_modules_default_summary">القيمة الافتراضية العامة ل \"إلغاء تحميل الوحدات \" في ملفات تعريف التطبيقات. إذا تم تمكينه ، إزالة جميع تعديلات الوحدة النمطية على النظام للتطبيقات التي لا تحتوي على مجموعة ملف تعريف.</string>
|
||||||
|
<string name="profile_umount_modules_summary">سيسمح تمكين هذا الخيار ل KernelSU باستعادة أي ملفات معدلة بواسطة الوحدات النمطية لهذا التطبيق.</string>
|
||||||
|
<string name="profile_selinux_domain">المجال</string>
|
||||||
|
<string name="profile_selinux_rules">القواعد</string>
|
||||||
|
<string name="restart_app">إعادة تشغيل التطبيق</string>
|
||||||
|
<string name="failed_to_update_sepolicy">فشل تحديث قواعد SELinux لما يلي: %s</string>
|
||||||
|
<string name="profile_name">اسم الملف الشخصي</string>
|
||||||
|
<string name="require_kernel_version">إصدار KernelSU الحالي %d منخفض جدًا بحيث لا يعمل المدير بشكل صحيح. الرجاء الترقية إلى الإصدار %d أو أعلى!</string>
|
||||||
|
<string name="module_changelog">سجل التغييرات</string>
|
||||||
|
</resources>
|
||||||
81
manager/app/src/main/res/values-az/strings.xml
Normal file
81
manager/app/src/main/res/values-az/strings.xml
Normal file
@@ -0,0 +1,81 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<resources>
|
||||||
|
<string name="home">Ana səhifə</string>
|
||||||
|
<string name="home_superuser_count">Super istifadəçilər: %d</string>
|
||||||
|
<string name="home_kernel">Nüvə</string>
|
||||||
|
<string name="home_not_installed">Yüklənmədi</string>
|
||||||
|
<string name="home_click_to_install">Yükləmək üçün toxunun</string>
|
||||||
|
<string name="home_working">İşləyir</string>
|
||||||
|
<string name="home_working_version">Versiya: %d</string>
|
||||||
|
<string name="home_module_count">Modullar: %d</string>
|
||||||
|
<string name="home_unsupported_reason">Hal-hazırda KernelSU yalnız GKI nüvələrini dəstəkləyir</string>
|
||||||
|
<string name="home_unsupported">Dəstəklənmir</string>
|
||||||
|
<string name="module_install">Yüklə</string>
|
||||||
|
<string name="install">Yüklə</string>
|
||||||
|
<string name="selinux_status_unknown">Naməlum</string>
|
||||||
|
<string name="home_fingerprint">Barmaq izi</string>
|
||||||
|
<string name="home_manager_version">Menecer versiyası</string>
|
||||||
|
<string name="selinux_status_disabled">Qeyri-aktiv</string>
|
||||||
|
<string name="home_selinux_status">SELinux vəziyyəti</string>
|
||||||
|
<string name="selinux_status_permissive">Sərbəst</string>
|
||||||
|
<string name="selinux_status_enforcing">Məcburi</string>
|
||||||
|
<string name="superuser">Super istifadəçi</string>
|
||||||
|
<string name="uninstall">Sil</string>
|
||||||
|
<string name="module_failed_to_enable">Modulu aktiv etmək mümkün olmadı: %s</string>
|
||||||
|
<string name="module_failed_to_disable">Modulu deaktiv etmək mümkün olmadı: %s</string>
|
||||||
|
<string name="module_empty">Heç bir modul quraşdırılmayıb</string>
|
||||||
|
<string name="module">Modul</string>
|
||||||
|
<string name="reboot">Yenidən başlat</string>
|
||||||
|
<string name="settings">Parametrlər</string>
|
||||||
|
<string name="reboot_recovery">Bərpa rejimində yenidən başlat</string>
|
||||||
|
<string name="reboot_userspace">Yüngül vəziyyətdə yenodən başlat</string>
|
||||||
|
<string name="reboot_bootloader">Bootloader rejimində yenidən başlat</string>
|
||||||
|
<string name="reboot_download">Yükləmə rejimində yenidən başlat</string>
|
||||||
|
<string name="module_version">Versiya</string>
|
||||||
|
<string name="module_author">Sahib</string>
|
||||||
|
<string name="module_uninstall_confirm">Modulu silmək istədiyinizdən əminsiniz %s\?</string>
|
||||||
|
<string name="show_system_apps">Sistem proqramlarını göstər</string>
|
||||||
|
<string name="about">Haqqında</string>
|
||||||
|
<string name="reboot_edl">EDL rejimində yenidən başlat</string>
|
||||||
|
<string name="module_uninstall_failed">Silmək mümkün olmadı: %s</string>
|
||||||
|
<string name="module_uninstall_success">%s silindi</string>
|
||||||
|
<string name="hide_system_apps">Sistem proqramlarını gizlət</string>
|
||||||
|
<string name="module_overlay_fs_not_available">overlayfs mövcud deyil,modul işləyə bilməyəcək!</string>
|
||||||
|
<string name="send_log">Log-u göndər</string>
|
||||||
|
<string name="refresh">Yenilə</string>
|
||||||
|
<string name="safe_mode">Təhlükəsiz rejimi</string>
|
||||||
|
<string name="reboot_to_apply">Qüvvəyə minməsi üçün yenidən başlat</string>
|
||||||
|
<string name="module_magisk_conflict">Modular deaktiv edilir,çünki o Magisk-in modulları ilə toqquşur!</string>
|
||||||
|
<string name="home_learn_kernelsu">KernelSU-yu öyrən</string>
|
||||||
|
<string name="home_learn_kernelsu_url">https://kernelsu.org/guide/what-is-kernelsu.html</string>
|
||||||
|
<string name="home_support_title">Bizi dəstəkləyin</string>
|
||||||
|
<string name="home_click_to_learn_kernelsu">KernelSU-yu necə quraşdırılacağını və modulların necə istifadə ediləcəyini öyrən</string>
|
||||||
|
<string name="profile_template">Şablon</string>
|
||||||
|
<string name="profile_default">Defolt</string>
|
||||||
|
<string name="profile_custom">Özəl</string>
|
||||||
|
<string name="home_support_content">KernelSU pulsuz və açıq mənbəlidir,həmişə belə olacaqdır. Bununla belə, ianə etməklə bizə qayğı göstərdiyinizi göstərə bilərsiniz.</string>
|
||||||
|
<string name="about_source_code">Mənbə kodlarımıza baxın %1$s<br/>Kanalımıza %2$s qoşulun</string>
|
||||||
|
<string name="profile_name">Profil adı</string>
|
||||||
|
<string name="profile_capabilities">Bacarıqlar</string>
|
||||||
|
<string name="profile_umount_modules">Modulları umount et</string>
|
||||||
|
<string name="profile_namespace_inherited">Miras qalmış</string>
|
||||||
|
<string name="profile_namespace_global">Qlobal</string>
|
||||||
|
<string name="profile_namespace">Bölmənin ad sahəsi</string>
|
||||||
|
<string name="profile_namespace_individual">Fərdi</string>
|
||||||
|
<string name="profile_groups">Qruplar</string>
|
||||||
|
<string name="settings_umount_modules_default">Defolt olaraq modulları umount et</string>
|
||||||
|
<string name="profile_selinux_context">SELinux konteksi</string>
|
||||||
|
<string name="failed_to_update_app_profile">%s görə tətbiq profillərini güncəlləmək mümkün olmadı</string>
|
||||||
|
<string name="settings_umount_modules_default_summary">Tətbiq Profillərində \"Umount modulları\" üçün qlobal standart dəyər. Aktivləşdirilərsə, o, Profil dəsti olmayan proqramlar üçün sistemdəki bütün modul dəyişikliklərini siləcək.</string>
|
||||||
|
<string name="profile_selinux_domain">Domen</string>
|
||||||
|
<string name="profile_selinux_rules">Qaydalar</string>
|
||||||
|
<string name="module_update">Güncəllə</string>
|
||||||
|
<string name="module_start_downloading">Endirməni başlat: %s</string>
|
||||||
|
<string name="new_version_available">Yeni versiya: %s əlçatandır, endirmək üçün toxunun</string>
|
||||||
|
<string name="module_downloading">Modul yüklənir: %s</string>
|
||||||
|
<string name="profile_umount_modules_summary">Bu seçimi aktivləşdirmək KernelSU-ya bu proqram üçün modullar tərəfindən hər hansı dəyişdirilmiş faylları bərpa etməyə imkan verəcək.</string>
|
||||||
|
<string name="launch_app">Aç</string>
|
||||||
|
<string name="force_stop_app">Məcburi dayandır</string>
|
||||||
|
<string name="restart_app">Yenidən başlat</string>
|
||||||
|
<string name="failed_to_update_sepolicy">%s görə SELinux qaydalarını güncəlləmək mümkün olmadı</string>
|
||||||
|
</resources>
|
||||||
51
manager/app/src/main/res/values-bn-rBD/strings.xml
Normal file
51
manager/app/src/main/res/values-bn-rBD/strings.xml
Normal file
@@ -0,0 +1,51 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<resources>
|
||||||
|
<string name="home_unsupported_reason">কর্নেল এস ইউ কেবল মাত্র জিকআই কর্নেল সাপোর্ট করে</string>
|
||||||
|
<string name="home_selinux_status">এসইলিনাক্স স্টেটাস</string>
|
||||||
|
<string name="selinux_status_unknown">আননোন</string>
|
||||||
|
<string name="module_failed_to_enable">মোডিউল ইনেবল করা যায়নি: %s</string>
|
||||||
|
<string name="home_click_to_install">ইন্সটল করটে চাপুন</string>
|
||||||
|
<string name="home_working">কাজ করছে</string>
|
||||||
|
<string name="home_module_count">মোডিউল: %d</string>
|
||||||
|
<string name="home_unsupported">অমূলক</string>
|
||||||
|
<string name="home_kernel">কর্নেল</string>
|
||||||
|
<string name="home_manager_version">ম্যানেজার ভারসন</string>
|
||||||
|
<string name="home_fingerprint">ফিঙ্গারপ্রিন্ট</string>
|
||||||
|
<string name="selinux_status_disabled">ডিসেবল</string>
|
||||||
|
<string name="selinux_status_enforcing">এনফোর্সিং</string>
|
||||||
|
<string name="superuser">সুপার ইউজার</string>
|
||||||
|
<string name="module">মোডিউল</string>
|
||||||
|
<string name="uninstall">আনইন্সটল</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="profile_namespace_global">গ্লোবাল</string>
|
||||||
|
<string name="profile_groups">গ্রুপস</string>
|
||||||
|
<string name="profile_selinux_context">এসইলিনাক্স কন্টেক্সট</string>
|
||||||
|
<string name="failed_to_update_app_profile">%s এর জন্য অ্যাপ প্রফাইল আপডেট করা যায়নি</string>
|
||||||
|
<string name="settings_umount_modules_default">বাইডিফল্ট মোডিউল আনমাউন্ট</string>
|
||||||
|
<string name="home">হোম</string>
|
||||||
|
<string name="home_not_installed">ইন্সটল হয়নী</string>
|
||||||
|
<string name="selinux_status_permissive">পারমিসিভ</string>
|
||||||
|
<string name="module_failed_to_disable">মোডিউল ডিসেবল করা যায়নি: %s</string>
|
||||||
|
<string name="module_empty">কোনো মোডিউল ইন্সটল করা নেই</string>
|
||||||
|
<string name="home_working_version">ভারসন: %d</string>
|
||||||
|
<string name="home_superuser_count">সুপার ইউজার: %d</string>
|
||||||
|
<string name="profile_namespace">নেইম স্পেস মাউন্ট</string>
|
||||||
|
<string name="profile_namespace_inherited">ইনহেরিটেড</string>
|
||||||
|
<string name="profile_namespace_individual">ইন্ডিভিজুয়াল</string>
|
||||||
|
<string name="profile_capabilities">ক্যাপাবিলিটিস</string>
|
||||||
|
<string name="profile_umount_modules">আনমাউন্ট মোডিউলস</string>
|
||||||
|
<string name="reboot_recovery">রিকভারিতে বুট</string>
|
||||||
|
<string name="reboot_bootloader">বুটলোডারে বুট</string>
|
||||||
|
<string name="reboot_download">ডাউনলোড মডে বুট</string>
|
||||||
|
<string name="reboot_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_version">ভার্সন</string>
|
||||||
|
<string name="module_author">অথার</string>
|
||||||
|
</resources>
|
||||||
@@ -1,7 +1,5 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<resources>
|
<resources>
|
||||||
<string name="app_name" translatable="false">কার্নেলএসইউ</string>
|
|
||||||
|
|
||||||
<string name="home">হোম</string>
|
<string name="home">হোম</string>
|
||||||
<string name="home_not_installed">ইনস্টল করা হয়নি</string>
|
<string name="home_not_installed">ইনস্টল করা হয়নি</string>
|
||||||
<string name="home_click_to_install">ইনস্টল করার জন্য ক্লিক করুন</string>
|
<string name="home_click_to_install">ইনস্টল করার জন্য ক্লিক করুন</string>
|
||||||
@@ -11,11 +9,9 @@
|
|||||||
<string name="home_module_count">মডিউল: %d</string>
|
<string name="home_module_count">মডিউল: %d</string>
|
||||||
<string name="home_unsupported">অসমর্থিত</string>
|
<string name="home_unsupported">অসমর্থিত</string>
|
||||||
<string name="home_unsupported_reason">কার্নেলএসইউ শুধুমাত্র জিকেআই কার্নেল সমর্থন করে</string>
|
<string name="home_unsupported_reason">কার্নেলএসইউ শুধুমাত্র জিকেআই কার্নেল সমর্থন করে</string>
|
||||||
|
|
||||||
<string name="home_kernel">কার্নেল</string>
|
<string name="home_kernel">কার্নেল</string>
|
||||||
<string name="home_manager_version">ম্যানেজার সংস্করণ</string>
|
<string name="home_manager_version">ম্যানেজার সংস্করণ</string>
|
||||||
<string name="home_fingerprint">ফিঙ্গারপ্রিন্ট</string>
|
<string name="home_fingerprint">ফিঙ্গারপ্রিন্ট</string>
|
||||||
|
|
||||||
<string name="home_selinux_status">সেলিনাক্স স্ট্যাটাস</string>
|
<string name="home_selinux_status">সেলিনাক্স স্ট্যাটাস</string>
|
||||||
<string name="selinux_status_disabled">ডিজেবল</string>
|
<string name="selinux_status_disabled">ডিজেবল</string>
|
||||||
<string name="selinux_status_enforcing">এনফোর্সিং</string>
|
<string name="selinux_status_enforcing">এনফোর্সিং</string>
|
||||||
@@ -25,7 +21,6 @@
|
|||||||
<string name="module_failed_to_enable">মডিউল সক্ষম করতে ব্যর্থ হয়েছে: %s</string>
|
<string name="module_failed_to_enable">মডিউল সক্ষম করতে ব্যর্থ হয়েছে: %s</string>
|
||||||
<string name="module_failed_to_disable">মডিউল নিষ্ক্রিয় করতে ব্যর্থ হয়েছে: %s</string>
|
<string name="module_failed_to_disable">মডিউল নিষ্ক্রিয় করতে ব্যর্থ হয়েছে: %s</string>
|
||||||
<string name="module_empty">কোন মডিউল ইনস্টল করা নেই</string>
|
<string name="module_empty">কোন মডিউল ইনস্টল করা নেই</string>
|
||||||
|
|
||||||
<string name="module">মডিউল</string>
|
<string name="module">মডিউল</string>
|
||||||
<string name="uninstall">আনইন্সটল</string>
|
<string name="uninstall">আনইন্সটল</string>
|
||||||
<string name="module_install">মডিউল ইনস্টল</string>
|
<string name="module_install">মডিউল ইনস্টল</string>
|
||||||
@@ -57,4 +52,15 @@
|
|||||||
<string name="home_support_title">সাপোর্ট টাইটেল</string>
|
<string name="home_support_title">সাপোর্ট টাইটেল</string>
|
||||||
<string name="home_support_content">কার্নেলএসইউ বিনামূল্যে এবং ওপেন সোর্স, এবং সবসময় থাকবে। আপনি সবসময় একটি অনুদান দিয়ে আপনার কৃতজ্ঞতা প্রদর্শন করতে পারেন.</string>
|
<string name="home_support_content">কার্নেলএসইউ বিনামূল্যে এবং ওপেন সোর্স, এবং সবসময় থাকবে। আপনি সবসময় একটি অনুদান দিয়ে আপনার কৃতজ্ঞতা প্রদর্শন করতে পারেন.</string>
|
||||||
<string name="about_source_code"><![CDATA[Bekijk source code op %1$s<br/>আমাদের %2$s চ্যানেল মার্জ করুন]]></string>
|
<string name="about_source_code"><![CDATA[Bekijk source code op %1$s<br/>আমাদের %2$s চ্যানেল মার্জ করুন]]></string>
|
||||||
</resources>
|
<string name="profile_name">প্রফাইলের নাম</string>
|
||||||
|
<string name="profile_namespace">নেমস্পেস মাউন্ট</string>
|
||||||
|
<string name="profile_groups">গ্রুপস</string>
|
||||||
|
<string name="profile_capabilities">যোগ্যতা</string>
|
||||||
|
<string name="profile_selinux_context">এসই লিনাক্স কনটেক্সট</string>
|
||||||
|
<string name="profile_default">ডিফল্ট</string>
|
||||||
|
<string name="profile_template">টেমপ্লেট</string>
|
||||||
|
<string name="profile_custom">কাস্টম</string>
|
||||||
|
<string name="profile_namespace_global">গ্লোবাল</string>
|
||||||
|
<string name="profile_namespace_individual">আলাদাভাবে</string>
|
||||||
|
<string name="profile_umount_modules">আনমাউন্ট মোডিউল</string>
|
||||||
|
</resources>
|
||||||
82
manager/app/src/main/res/values-bs/strings.xml
Normal file
82
manager/app/src/main/res/values-bs/strings.xml
Normal file
@@ -0,0 +1,82 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<resources>
|
||||||
|
<string name="profile_namespace">Imenski prostor nosača</string>
|
||||||
|
<string name="profile_namespace_inherited">Naslijeđen</string>
|
||||||
|
<string name="profile_namespace_global">Globalan</string>
|
||||||
|
<string name="profile_namespace_individual">Pojedinačan</string>
|
||||||
|
<string name="profile_groups">Grupe</string>
|
||||||
|
<string name="profile_capabilities">Sposobnosti</string>
|
||||||
|
<string name="profile_selinux_context">SELinux kontekst</string>
|
||||||
|
<string name="profile_umount_modules">Umount module</string>
|
||||||
|
<string name="failed_to_update_app_profile">Ažuriranje Profila Aplikacije za %s nije uspjelo</string>
|
||||||
|
<string name="require_kernel_version">Trenutna KernelSU verzija %d je preniska da bi upravitelj ispravno radio. Molimo vas da nadogradite na verziju %d ili noviju!</string>
|
||||||
|
<string name="settings_umount_modules_default">Umount module po zadanom</string>
|
||||||
|
<string name="settings_umount_modules_default_summary">Globalna zadana vrijednost za \"Umount module\" u Profilima Aplikacije. Ako je omogućeno, uklonit će sve izmjene modula na sistemu za aplikacije koje nemaju postavljen Profil.</string>
|
||||||
|
<string name="profile_umount_modules_summary">Uključivanjem ove opcije omogućit će KernelSU-u da vrati sve izmjenute datoteke od strane modula za ovu aplikaciju.</string>
|
||||||
|
<string name="module_update">Ažuriranje</string>
|
||||||
|
<string name="module_downloading">Skidanje module: %s</string>
|
||||||
|
<string name="module_start_downloading">Započnite sa skidanjem: %s</string>
|
||||||
|
<string name="new_version_available">Nova verzija: %s je dostupna, kliknite da skinete</string>
|
||||||
|
<string name="launch_app">Pokrenite</string>
|
||||||
|
<string name="force_stop_app">Prisilno Zaustavite</string>
|
||||||
|
<string name="restart_app">Resetujte</string>
|
||||||
|
<string name="selinux_status_enforcing">U Provođenju</string>
|
||||||
|
<string name="home">Početna</string>
|
||||||
|
<string name="home_not_installed">Nije instalirano</string>
|
||||||
|
<string name="home_click_to_install">Kliknite da instalirate</string>
|
||||||
|
<string name="home_superuser_count">Superkorisnici: %d</string>
|
||||||
|
<string name="home_module_count">Module: %d</string>
|
||||||
|
<string name="home_unsupported">Nepodržano</string>
|
||||||
|
<string name="home_unsupported_reason">KernelSU samo podržava GKI kernele sad</string>
|
||||||
|
<string name="home_manager_version">Verzija Upravitelja</string>
|
||||||
|
<string name="home_fingerprint">Otisak prsta</string>
|
||||||
|
<string name="home_selinux_status">SELinux stanje</string>
|
||||||
|
<string name="module_install">Instalirajte</string>
|
||||||
|
<string name="install">Instalirajte</string>
|
||||||
|
<string name="reboot">Ponovo pokrenite</string>
|
||||||
|
<string name="settings">Podešavanja</string>
|
||||||
|
<string name="module_version">Verzija</string>
|
||||||
|
<string name="module_author">Autor</string>
|
||||||
|
<string name="refresh">Osvježi</string>
|
||||||
|
<string name="show_system_apps">Prikažite sistemske aplikacije</string>
|
||||||
|
<string name="hide_system_apps">Sakrijte sistemske aplikacije</string>
|
||||||
|
<string name="safe_mode">Sigurnosni mod</string>
|
||||||
|
<string name="reboot_to_apply">Ponovo pokrenite da bi proradilo</string>
|
||||||
|
<string name="module_magisk_conflict">Module su isključene jer je u sukobu sa Magisk-om!</string>
|
||||||
|
<string name="home_learn_kernelsu_url">https://kernelsu.org/guide/what-is-kernelsu.html</string>
|
||||||
|
<string name="home_click_to_learn_kernelsu">Naučite kako da instalirate KernelSU i da koristite module</string>
|
||||||
|
<string name="home_support_title">Podržite Nas</string>
|
||||||
|
<string name="send_log">Pošaljite Izvještaj</string>
|
||||||
|
<string name="home_learn_kernelsu">Naučite KernelSU</string>
|
||||||
|
<string name="about_source_code">Pogledajte izvornu kodu na %1$s<br/>Pridružite nam se na %2$s kanalu</string>
|
||||||
|
<string name="profile_selinux_domain">Domena</string>
|
||||||
|
<string name="profile_selinux_rules">Pravila</string>
|
||||||
|
<string name="failed_to_update_sepolicy">Neuspješno ažuriranje SELinux pravila za: %s</string>
|
||||||
|
<string name="home_working">Radi</string>
|
||||||
|
<string name="home_working_version">Verzija: %d</string>
|
||||||
|
<string name="home_kernel">Kernel</string>
|
||||||
|
<string name="selinux_status_permissive">Permisivno</string>
|
||||||
|
<string name="uninstall">Deinstalirajte</string>
|
||||||
|
<string name="selinux_status_unknown">Nepoznato</string>
|
||||||
|
<string name="module_empty">Nema instaliranih modula</string>
|
||||||
|
<string name="superuser">Superkorisnik</string>
|
||||||
|
<string name="module">Modula</string>
|
||||||
|
<string name="reboot_bootloader">Ponovo pokrenite u Pogonski Učitavatelj</string>
|
||||||
|
<string name="reboot_recovery">Ponovo pokrenite u Oporavu</string>
|
||||||
|
<string name="module_uninstall_success">%s deinstalirana</string>
|
||||||
|
<string name="reboot_userspace">Lagano Ponovo pokretanje</string>
|
||||||
|
<string name="module_failed_to_enable">Neuspješno uključivanje module: %s</string>
|
||||||
|
<string name="reboot_download">Ponovo pokrenite u Preuzimanje</string>
|
||||||
|
<string name="module_failed_to_disable">Neuspješno isključivanje module: %s</string>
|
||||||
|
<string name="reboot_edl">Ponovo pokrenite u EDL</string>
|
||||||
|
<string name="module_uninstall_failed">Neuspješna deinstalacija: %s</string>
|
||||||
|
<string name="selinux_status_disabled">Isključeno</string>
|
||||||
|
<string name="about">O</string>
|
||||||
|
<string name="module_uninstall_confirm">Jeste li sigurni da želite deinstalirati modulu %s\?</string>
|
||||||
|
<string name="module_overlay_fs_not_available">overlayfs nije dostupan, modula ne može raditi!</string>
|
||||||
|
<string name="home_support_content">KernelSU je, i uvijek če biti, besplatan, i otvorenog izvora. Možete nam međutim pokazati da vas je briga s time da napravite donaciju.</string>
|
||||||
|
<string name="profile_default">Zadano</string>
|
||||||
|
<string name="profile_template">Šablon</string>
|
||||||
|
<string name="profile_custom">Prilagođeno</string>
|
||||||
|
<string name="profile_name">Naziv profila</string>
|
||||||
|
</resources>
|
||||||
82
manager/app/src/main/res/values-da/strings.xml
Normal file
82
manager/app/src/main/res/values-da/strings.xml
Normal file
@@ -0,0 +1,82 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<resources>
|
||||||
|
<string name="home_working">Arbejder</string>
|
||||||
|
<string name="home_module_count">Moduler: %d</string>
|
||||||
|
<string name="home_unsupported">Ikke understøttet</string>
|
||||||
|
<string name="home_kernel">Kernel</string>
|
||||||
|
<string name="home_unsupported_reason">KernelSU understøtter kun GKI kernels</string>
|
||||||
|
<string name="home_manager_version">Manager Version</string>
|
||||||
|
<string name="home_selinux_status">SELinux-status</string>
|
||||||
|
<string name="selinux_status_disabled">Deaktiveret</string>
|
||||||
|
<string name="selinux_status_permissive">Tilladende</string>
|
||||||
|
<string name="superuser">Superbruger</string>
|
||||||
|
<string name="selinux_status_enforcing">Håndhævende</string>
|
||||||
|
<string name="module_failed_to_disable">Deaktivering af modul fejlede: %s</string>
|
||||||
|
<string name="module_empty">Intet modul installeret</string>
|
||||||
|
<string name="uninstall">Afinstaller</string>
|
||||||
|
<string name="module_install">Installer</string>
|
||||||
|
<string name="install">Installer</string>
|
||||||
|
<string name="reboot">Genstart</string>
|
||||||
|
<string name="settings">Indstillinger</string>
|
||||||
|
<string name="reboot_userspace">Blød Genstart</string>
|
||||||
|
<string name="reboot_download">Genstart til Download</string>
|
||||||
|
<string name="reboot_edl">Genstart til EDL</string>
|
||||||
|
<string name="about">Om</string>
|
||||||
|
<string name="module_uninstall_confirm">Er du sikker på, at du vil afinstallere modulet %s\?</string>
|
||||||
|
<string name="module_uninstall_success">%s afinstalleret</string>
|
||||||
|
<string name="module_uninstall_failed">Afinstallation af: %s fejlede</string>
|
||||||
|
<string name="module_overlay_fs_not_available">overlayfs er ikke tilgængeligt, modulet kan ikke fungere!</string>
|
||||||
|
<string name="refresh">Opdater</string>
|
||||||
|
<string name="send_log">Send Log</string>
|
||||||
|
<string name="safe_mode">Sikker tilstand</string>
|
||||||
|
<string name="reboot_to_apply">Genstart for at tage effekt</string>
|
||||||
|
<string name="home_learn_kernelsu">Lær KernelSU</string>
|
||||||
|
<string name="home_learn_kernelsu_url">https://kernelsu.org/guide/what-is-kernelsu.html</string>
|
||||||
|
<string name="home_click_to_learn_kernelsu">Lær hvordan man installerer KernelSU og moduler</string>
|
||||||
|
<string name="about_source_code">Se source koden ved %1$s<br/>Deltage i vores %2$s kanal</string>
|
||||||
|
<string name="profile_default">Standard</string>
|
||||||
|
<string name="profile_template">Skabelon</string>
|
||||||
|
<string name="profile_namespace">Monter navnerum</string>
|
||||||
|
<string name="profile_namespace_inherited">Arvet</string>
|
||||||
|
<string name="profile_namespace_global">Global</string>
|
||||||
|
<string name="profile_groups">Grupper</string>
|
||||||
|
<string name="profile_capabilities">Evner</string>
|
||||||
|
<string name="profile_selinux_context">SELinux-kontext</string>
|
||||||
|
<string name="profile_umount_modules">Afmonteret moduler</string>
|
||||||
|
<string name="settings_umount_modules_default">Afmontere moduler som standard</string>
|
||||||
|
<string name="profile_umount_modules_summary">Aktivering af denne indstilling vil tillade KernelSU at gendanne hvilken som helst modificeret filer af modulet for denne applikation.</string>
|
||||||
|
<string name="module_update">Opdatering</string>
|
||||||
|
<string name="module_downloading">Downloader modulet: %s</string>
|
||||||
|
<string name="new_version_available">Ny version: %s er tilgængelig, kilk for at downloade</string>
|
||||||
|
<string name="launch_app">Start</string>
|
||||||
|
<string name="force_stop_app">Tving Stop</string>
|
||||||
|
<string name="failed_to_update_sepolicy">Opdatering af SELinux-regler for: %s fejlede</string>
|
||||||
|
<string name="module_start_downloading">Start download: %s</string>
|
||||||
|
<string name="home_click_to_install">Klik for at installere</string>
|
||||||
|
<string name="home_working_version">Version: %d</string>
|
||||||
|
<string name="home">Hjem</string>
|
||||||
|
<string name="home_not_installed">Ikke installeret</string>
|
||||||
|
<string name="home_superuser_count">Superbrugere: %d</string>
|
||||||
|
<string name="home_fingerprint">Fingeraftryk</string>
|
||||||
|
<string name="selinux_status_unknown">Ukendt</string>
|
||||||
|
<string name="module_failed_to_enable">Aktivering af modul fejlede: %s</string>
|
||||||
|
<string name="reboot_recovery">Genstart til Recovery</string>
|
||||||
|
<string name="module">Modul</string>
|
||||||
|
<string name="module_author">Forfatter</string>
|
||||||
|
<string name="reboot_bootloader">Genstart til Bootloader</string>
|
||||||
|
<string name="module_version">Version</string>
|
||||||
|
<string name="hide_system_apps">Gem system-apps</string>
|
||||||
|
<string name="show_system_apps">Vis system-apps</string>
|
||||||
|
<string name="module_magisk_conflict">Moduler er deaktiveret, fordi der er konflikt med Magiskes!</string>
|
||||||
|
<string name="home_support_title">Støt Os</string>
|
||||||
|
<string name="home_support_content">KernelSU er, og vil altid være gratis og open source. Du kan stadig vise os din støtte ved at donere.</string>
|
||||||
|
<string name="profile_custom">Brugerdefineret</string>
|
||||||
|
<string name="profile_name">Profilnavn</string>
|
||||||
|
<string name="profile_namespace_individual">Individuel</string>
|
||||||
|
<string name="failed_to_update_app_profile">Opdatering af App Profil for %s fejlede</string>
|
||||||
|
<string name="settings_umount_modules_default_summary">Den globale standard værdi for \"Afmonter moduler\" i App Profiler. Hvis aktiveret vil den fjerne alle modulers modifikationer til system applikationerne der ikke har en sat Profil.</string>
|
||||||
|
<string name="profile_selinux_domain">Domæne</string>
|
||||||
|
<string name="profile_selinux_rules">Regler</string>
|
||||||
|
<string name="restart_app">Genstart</string>
|
||||||
|
<string name="require_kernel_version">Den nuværende KernelSU version %d er for lav til manageren for at fungere ordentligt. Opgrader til version %d eller højere!</string>
|
||||||
|
</resources>
|
||||||
83
manager/app/src/main/res/values-de/strings.xml
Normal file
83
manager/app/src/main/res/values-de/strings.xml
Normal file
@@ -0,0 +1,83 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<resources>
|
||||||
|
<string name="home">Startseite</string>
|
||||||
|
<string name="home_not_installed">Nicht installiert</string>
|
||||||
|
<string name="selinux_status_permissive">Permissiv</string>
|
||||||
|
<string name="home_working">Funktioniert</string>
|
||||||
|
<string name="home_working_version">Version: %d</string>
|
||||||
|
<string name="superuser">Superuser</string>
|
||||||
|
<string name="home_click_to_install">Tippen zum Installieren</string>
|
||||||
|
<string name="home_superuser_count">Superuser: %d</string>
|
||||||
|
<string name="selinux_status_unknown">Unbekannt</string>
|
||||||
|
<string name="selinux_status_enforcing">Erzwingen</string>
|
||||||
|
<string name="reboot_bootloader">Neustart mit Bootloader</string>
|
||||||
|
<string name="reboot_download">Neustart mit Download-Modus</string>
|
||||||
|
<string name="reboot_edl">Neustart mit EDL-Modus</string>
|
||||||
|
<string name="module_author">Autor</string>
|
||||||
|
<string name="module_overlay_fs_not_available">overlayfs nicht verfügbar, Modul kann nicht funktionieren!</string>
|
||||||
|
<string name="about">Über</string>
|
||||||
|
<string name="module_magisk_conflict">Module sind deaktiviert, weil es einen Konflikt mit Magisk gibt!</string>
|
||||||
|
<string name="home_learn_kernelsu_url">https://kernelsu.org/guide/what-is-kernelsu.html</string>
|
||||||
|
<string name="home_click_to_learn_kernelsu">Verstehe, wie du KernelSU installieren und Module verwendest</string>
|
||||||
|
<string name="home_support_title">Unterstütze uns</string>
|
||||||
|
<string name="home_support_content">KernelSU ist und wird immer frei und quelloffen sein. Du kannst uns jedoch zeigen, dass du dich für uns interessierst, indem du eine Spende tätigst.</string>
|
||||||
|
<string name="profile_selinux_context">SELinux-Kontext</string>
|
||||||
|
<string name="settings_umount_modules_default">Module standardmäßig aushängen</string>
|
||||||
|
<string name="settings_umount_modules_default_summary">Globaler Standardwert für \'Module aushängen\' in App-Profilen. Wenn er aktiviert ist, werden alle Moduländerungen im App-System entfernt, für die kein Profil festgelegt ist.</string>
|
||||||
|
<string name="profile_default">Standard</string>
|
||||||
|
<string name="profile_template">Vorlage</string>
|
||||||
|
<string name="profile_custom">Benutzerdefiniert</string>
|
||||||
|
<string name="failed_to_update_app_profile">App-Profilaktualisierung für %s fehlgeschlagen</string>
|
||||||
|
<string name="profile_namespace_inherited">Vererbt</string>
|
||||||
|
<string name="profile_namespace_global">Global</string>
|
||||||
|
<string name="profile_namespace_individual">Individuell</string>
|
||||||
|
<string name="profile_selinux_domain">Domain</string>
|
||||||
|
<string name="module_update">Aktualisieren</string>
|
||||||
|
<string name="profile_umount_modules_summary">Wenn du diese Option aktivierst, kann KernelSU alle von den Modulen für diese App geänderten Dateien wiederherstellen.</string>
|
||||||
|
<string name="profile_selinux_rules">Regeln</string>
|
||||||
|
<string name="module_start_downloading">Herunterladen starten: %s</string>
|
||||||
|
<string name="failed_to_update_sepolicy">Fehler beim Aktualisieren der SELinux-Regeln für: %s</string>
|
||||||
|
<string name="launch_app">Starten</string>
|
||||||
|
<string name="new_version_available">Neue Version: %s verfügbar, tippen zum Aktualisieren</string>
|
||||||
|
<string name="force_stop_app">Stopp erzwingen</string>
|
||||||
|
<string name="restart_app">Neustart</string>
|
||||||
|
<string name="home_module_count">Module: %d</string>
|
||||||
|
<string name="home_manager_version">Verwalter-Version</string>
|
||||||
|
<string name="home_selinux_status">SELinux-Status</string>
|
||||||
|
<string name="selinux_status_disabled">Deaktiviert</string>
|
||||||
|
<string name="module_failed_to_enable">Modulaktivierung fehlgeschlagen: %s</string>
|
||||||
|
<string name="module_failed_to_disable">Moduldeaktivierung fehlgeschlagen: %s</string>
|
||||||
|
<string name="module_empty">Kein Modul installiert</string>
|
||||||
|
<string name="module">Modul</string>
|
||||||
|
<string name="uninstall">Deinstallieren</string>
|
||||||
|
<string name="install">Installieren</string>
|
||||||
|
<string name="reboot">Neustart</string>
|
||||||
|
<string name="settings">Einstellungen</string>
|
||||||
|
<string name="reboot_recovery">Neustart mit Recovery</string>
|
||||||
|
<string name="module_uninstall_success">%s deinstalliert</string>
|
||||||
|
<string name="module_version">Version</string>
|
||||||
|
<string name="refresh">Neu laden</string>
|
||||||
|
<string name="show_system_apps">System-Apps anzeigen</string>
|
||||||
|
<string name="hide_system_apps">System-Apps ausblenden</string>
|
||||||
|
<string name="send_log">Protokoll senden</string>
|
||||||
|
<string name="home_learn_kernelsu">KernelSU verstehen</string>
|
||||||
|
<string name="safe_mode">Sicherer Modus</string>
|
||||||
|
<string name="reboot_to_apply">Neu starten, damit die Effekte auftreten</string>
|
||||||
|
<string name="about_source_code">Quellcode unter %1$s ansehen<br/>Unserem %2$s-Kanal beitreten</string>
|
||||||
|
<string name="profile_name">Profilname</string>
|
||||||
|
<string name="profile_namespace">Namespace einhängen</string>
|
||||||
|
<string name="profile_groups">Gruppen</string>
|
||||||
|
<string name="profile_capabilities">Fähigkeiten</string>
|
||||||
|
<string name="profile_umount_modules">Module aushängen</string>
|
||||||
|
<string name="module_downloading">Modul herunterladen: %s</string>
|
||||||
|
<string name="home_unsupported">Nicht unterstützt</string>
|
||||||
|
<string name="home_unsupported_reason">KernelSU unterstützt derzeit nur GKI-Kernel</string>
|
||||||
|
<string name="home_kernel">Kernel</string>
|
||||||
|
<string name="home_fingerprint">Fingerabdruck</string>
|
||||||
|
<string name="module_install">Installieren</string>
|
||||||
|
<string name="reboot_userspace">Leichter Neustart</string>
|
||||||
|
<string name="module_uninstall_confirm">Sicher, dass du das Modul %s deinstallieren möchtest\?</string>
|
||||||
|
<string name="module_uninstall_failed">Deinstallation fehlgeschlagen: %s</string>
|
||||||
|
<string name="require_kernel_version">Die aktuelle Kernel-Version %d ist zu alt für diese Manager-Version. Bitte auf Version %d oder höher upgraden!</string>
|
||||||
|
<string name="module_changelog">Änderungsprotokoll</string>
|
||||||
|
</resources>
|
||||||
84
manager/app/src/main/res/values-es/strings.xml
Normal file
84
manager/app/src/main/res/values-es/strings.xml
Normal file
@@ -0,0 +1,84 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<resources>
|
||||||
|
<string name="home">Inicio</string>
|
||||||
|
<string name="home_not_installed">No instalado</string>
|
||||||
|
<string name="home_click_to_install">Haga clic para instalar</string>
|
||||||
|
<string name="home_working">Activo</string>
|
||||||
|
<string name="home_working_version">Versión: %d</string>
|
||||||
|
<string name="home_superuser_count">Superusuarios: %d</string>
|
||||||
|
<string name="home_module_count">Módulos: %d</string>
|
||||||
|
<string name="home_unsupported">No soportado</string>
|
||||||
|
<string name="home_unsupported_reason">Por el momento, KernelSU solo es compatible con kernels genéricos (GKIs)</string>
|
||||||
|
<string name="home_kernel">Versión del kernel</string>
|
||||||
|
<string name="home_manager_version">Versión del manager</string>
|
||||||
|
<string name="home_fingerprint">Huella del dispositivo</string>
|
||||||
|
<string name="home_selinux_status">Estado de SELinux</string>
|
||||||
|
<!-- It may be better to leave SELinux statuses untranslated -->
|
||||||
|
<string name="selinux_status_disabled">Disabled</string>
|
||||||
|
<string name="selinux_status_enforcing">Enforcing</string>
|
||||||
|
<string name="selinux_status_permissive">Permissive</string>
|
||||||
|
<string name="selinux_status_unknown">Unknown</string>
|
||||||
|
<string name="superuser">Superusuario</string>
|
||||||
|
<string name="module_failed_to_enable">No se pudo habilitar el módulo \"%s\"</string>
|
||||||
|
<string name="module_failed_to_disable">No se pudo deshabilitar el módulo \"%s\"</string>
|
||||||
|
<string name="module_empty">No hay ningún módulo instalado</string>
|
||||||
|
<string name="module">Módulo</string>
|
||||||
|
<string name="uninstall">Desinstalar</string>
|
||||||
|
<string name="module_install">Instalar módulo</string>
|
||||||
|
<string name="install">Instalar</string>
|
||||||
|
<string name="reboot">Reiniciar</string>
|
||||||
|
<string name="settings">Ajustes</string>
|
||||||
|
<string name="reboot_userspace">Reinicio suave</string>
|
||||||
|
<string name="reboot_recovery">Reiniciar en modo recovery</string>
|
||||||
|
<string name="reboot_bootloader">Reiniciar en modo bootloader</string>
|
||||||
|
<string name="reboot_download">Reiniciar en modo download</string>
|
||||||
|
<string name="reboot_edl">Reiniciar en modo EDL</string>
|
||||||
|
<string name="about">Acerca de</string>
|
||||||
|
<string name="module_uninstall_confirm">¿Estás seguro de que quieres desinstalar el módulo \"%s\"?</string>
|
||||||
|
<string name="module_uninstall_success">\"%s\" desinstalado</string>
|
||||||
|
<string name="module_uninstall_failed">No se pudo desinstalar \"%s\"</string>
|
||||||
|
<string name="module_version">Versión</string>
|
||||||
|
<string name="module_author">Autor</string>
|
||||||
|
<string name="module_overlay_fs_not_available">El módulo no puede funcionar ya que OverlayFS no está disponible!</string>
|
||||||
|
<string name="refresh">Recargar</string>
|
||||||
|
<string name="show_system_apps">Mostrar apps del sistema</string>
|
||||||
|
<string name="hide_system_apps">Ocultar apps del sistema</string>
|
||||||
|
<string name="send_log">Enviar registro</string>
|
||||||
|
<string name="safe_mode">Modo seguro</string>
|
||||||
|
<string name="reboot_to_apply">Reiniciar para aplicar cambios</string>
|
||||||
|
<string name="module_magisk_conflict">Se deshabilitaron los módulos ya que entran en conflicto con Magisk!</string>
|
||||||
|
<string name="home_learn_kernelsu">Descubre KernelSU</string>
|
||||||
|
<string name="home_learn_kernelsu_url">https://kernelsu.org/guide/what-is-kernelsu.html</string>
|
||||||
|
<string name="home_click_to_learn_kernelsu">Descubre cómo instalar KernelSU y utilizar módulos</string>
|
||||||
|
<string name="home_support_title">Apóyanos</string>
|
||||||
|
<string name="home_support_content">KernelSU es y siempre será, libre y de código abierto. De todas formas, puedes mostrarnos tu apoyo mediante una donación.</string>
|
||||||
|
<string name="about_source_code"><![CDATA[Ver código fuente en %1$s<br/>Únete a nuestro canal de %2$s]]></string>
|
||||||
|
<string name="profile_default">Predeterminado</string>
|
||||||
|
<string name="profile_template">Plantilla</string>
|
||||||
|
<string name="profile_custom">Personalizado</string>
|
||||||
|
<string name="profile_name">Nombre de perfil</string>
|
||||||
|
<string name="profile_namespace">Modo de montaje del espacio de nombres</string>
|
||||||
|
<string name="profile_namespace_inherited">Heredado</string>
|
||||||
|
<string name="profile_namespace_global">Global</string>
|
||||||
|
<string name="profile_namespace_individual">Individual</string>
|
||||||
|
<string name="profile_groups">Grupos</string>
|
||||||
|
<string name="profile_capabilities">Capacidades</string>
|
||||||
|
<string name="profile_selinux_context">Contexto de SELinux</string>
|
||||||
|
<string name="profile_umount_modules">Desmontar módulos</string>
|
||||||
|
<string name="failed_to_update_app_profile">No se pudo actualizar el perfil de la app para %s</string>
|
||||||
|
<string name="settings_umount_modules_default">Desmontar módulos por defecto</string>
|
||||||
|
<string name="settings_umount_modules_default_summary">El valor global predeterminado para \"Desmontar módulos\" en los perfiles de las aplicaciones. Si la habilitas, se desharán todas las modificaciones al sistema hechas por el módulo para las apps que no tengan un perfil establecido.</string>
|
||||||
|
<string name="profile_umount_modules_summary">Si habilitas esta opción, KernelSU podrá restaurar cualquier archivo modificado por los módulos para esta app.</string>
|
||||||
|
<string name="profile_selinux_domain">Dominio</string>
|
||||||
|
<string name="profile_selinux_rules">Reglas</string>
|
||||||
|
<string name="module_update">Actualizar</string>
|
||||||
|
<string name="module_downloading">Descargando módulo: \"%s\"</string>
|
||||||
|
<string name="module_start_downloading">Iniciar descarga: %s</string>
|
||||||
|
<string name="new_version_available">Nueva versión: %s está disponible, haga clic para actualizar</string>
|
||||||
|
<string name="launch_app">Lanzar Aplicacion</string>
|
||||||
|
<string name="force_stop_app">Forzar cierre de la aplicacion</string>
|
||||||
|
<string name="restart_app">Reiniciar aplicacion</string>
|
||||||
|
<string name="failed_to_update_sepolicy">Falló al actualizar reglas de SEpolicy por: %s</string>
|
||||||
|
<string name="require_kernel_version">La versión actual de KernelSU %d es demasiado baja para que el gestor funcione correctamente. ¡Por favor actualiza a la versión %d o superior!</string>
|
||||||
|
<string name="module_changelog">Registro de cambios</string>
|
||||||
|
</resources>
|
||||||
@@ -1,5 +1,4 @@
|
|||||||
<resources>
|
<resources>
|
||||||
<string name="app_name" translatable="false">KernelSU</string>
|
|
||||||
<string name="home">خانه</string>
|
<string name="home">خانه</string>
|
||||||
<string name="home_not_installed">نصب نشده است</string>
|
<string name="home_not_installed">نصب نشده است</string>
|
||||||
<string name="home_click_to_install">برای نصب ضربه بزنید</string>
|
<string name="home_click_to_install">برای نصب ضربه بزنید</string>
|
||||||
|
|||||||
69
manager/app/src/main/res/values-fil/strings.xml
Normal file
69
manager/app/src/main/res/values-fil/strings.xml
Normal file
@@ -0,0 +1,69 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<resources>
|
||||||
|
<string name="home_selinux_status">Katayuan ng SELinux</string>
|
||||||
|
<string name="selinux_status_disabled">Hindi pinagana</string>
|
||||||
|
<string name="selinux_status_enforcing">Enforcing</string>
|
||||||
|
<string name="selinux_status_permissive">Permissive</string>
|
||||||
|
<string name="home_not_installed">Hindi naka-install</string>
|
||||||
|
<string name="home">Home</string>
|
||||||
|
<string name="home_click_to_install">Pindutin para mag-install</string>
|
||||||
|
<string name="home_working">Gumagana</string>
|
||||||
|
<string name="home_working_version">Bersyon: %d</string>
|
||||||
|
<string name="selinux_status_unknown">Hindi matukoy</string>
|
||||||
|
<string name="home_module_count">Mga Modyul: %d</string>
|
||||||
|
<string name="home_unsupported">Hindi Suportado</string>
|
||||||
|
<string name="home_unsupported_reason">Sinusuportahan lang ng KernelSU ang mga kernel ng GKI ngayon</string>
|
||||||
|
<string name="module_failed_to_enable">Nabigong paganahin ang modyul: %s</string>
|
||||||
|
<string name="module_failed_to_disable">Nabigong i-disable ang modyul: %s</string>
|
||||||
|
<string name="module_empty">Walang naka-install na modyul</string>
|
||||||
|
<string name="module">Modyul</string>
|
||||||
|
<string name="module_install">I-install</string>
|
||||||
|
<string name="install">I-install</string>
|
||||||
|
<string name="reboot">I-reboot</string>
|
||||||
|
<string name="reboot_userspace">I-soft Reboot</string>
|
||||||
|
<string name="reboot_download">I-reboot sa Download</string>
|
||||||
|
<string name="reboot_edl">I-reboot sa EDL</string>
|
||||||
|
<string name="about">Tungkol</string>
|
||||||
|
<string name="module_uninstall_confirm">Sigurado ka bang gusto mong i-uninstall ang modyul %s\?</string>
|
||||||
|
<string name="module_uninstall_success">Na-uninstall ang %s</string>
|
||||||
|
<string name="module_uninstall_failed">Nabigong i-uninstall: %s</string>
|
||||||
|
<string name="module_author">May-akda</string>
|
||||||
|
<string name="module_overlay_fs_not_available">Ang overlayfs ay hindi magagamit, ang modyul ay hindi gagana!</string>
|
||||||
|
<string name="refresh">I-refresh</string>
|
||||||
|
<string name="show_system_apps">Ipakita ang mga application ng system</string>
|
||||||
|
<string name="send_log">Magpadala ng Log</string>
|
||||||
|
<string name="reboot_to_apply">I-reboot para umepekto</string>
|
||||||
|
<string name="module_magisk_conflict">Hindi pinagana ang mga modyul dahil salungat ito sa Magisk!</string>
|
||||||
|
<string name="home_learn_kernelsu">Alamin ang KernelSU</string>
|
||||||
|
<string name="home_click_to_learn_kernelsu">Matutunan kung paano mag-install ng KernelSU at gumamit ng mga modyul</string>
|
||||||
|
<string name="home_support_title">Suportahan Kami</string>
|
||||||
|
<string name="home_support_content">Ang KernelSU ay, at palaging magiging, libre, at open source. Gayunpaman, maaari mong ipakita sa amin na nagmamalasakit ka sa pamamagitan ng pagbibigay ng donasyon.</string>
|
||||||
|
<string name="about_source_code">Tingnan ang source code sa %1$s<br/>Sumali sa aming %2$s channel</string>
|
||||||
|
<string name="profile_namespace">I-mount ang namespace</string>
|
||||||
|
<string name="profile_namespace_individual">Indibidwal</string>
|
||||||
|
<string name="profile_groups">Mga Grupo</string>
|
||||||
|
<string name="profile_capabilities">Mga Kakayanan</string>
|
||||||
|
<string name="profile_selinux_context">Konteksto ng SELinux</string>
|
||||||
|
<string name="profile_umount_modules">I-unmount ang mga modyul</string>
|
||||||
|
<string name="failed_to_update_app_profile">Nabigong i-update ang App Profile para sa %s</string>
|
||||||
|
<string name="require_kernel_version">Ang kasalukuyang bersyon ng KernelSU %d ay masyadong mababa para gumana nang maayos ang manager. Mangyaring mag-upgrade sa bersyon %d o mas mataas!</string>
|
||||||
|
<string name="profile_umount_modules_summary">Ang pagpapagana sa opsyong ito ay magbibigay-daan sa KernelSU na ibalik ang anumang binagong file ng mga modyul para sa aplikasyon na ito.</string>
|
||||||
|
<string name="profile_selinux_rules">Mga Tuntunin</string>
|
||||||
|
<string name="module_downloading">Nagda-download ng modyul: %s</string>
|
||||||
|
<string name="module_start_downloading">Simulan ang pag-download: %s</string>
|
||||||
|
<string name="new_version_available">Bagong bersyon: Available ang %s, i-click upang i-download</string>
|
||||||
|
<string name="launch_app">Ilunsad</string>
|
||||||
|
<string name="force_stop_app">Pilit na I-hinto</string>
|
||||||
|
<string name="restart_app">I-restart</string>
|
||||||
|
<string name="failed_to_update_sepolicy">Nabigong i-update ang mga panuntunan ng SELinux para sa: %s</string>
|
||||||
|
<string name="home_manager_version">Bersyon ng Manager</string>
|
||||||
|
<string name="settings">Mga setting</string>
|
||||||
|
<string name="reboot_recovery">I-reboot sa Recovery</string>
|
||||||
|
<string name="reboot_bootloader">I-reboot sa Bootloader</string>
|
||||||
|
<string name="module_version">Bersyon</string>
|
||||||
|
<string name="uninstall">I-uninstall</string>
|
||||||
|
<string name="hide_system_apps">Itago ang mga application ng system</string>
|
||||||
|
<string name="profile_name">Pangalan ng profile</string>
|
||||||
|
<string name="profile_namespace_inherited">Minana</string>
|
||||||
|
<string name="settings_umount_modules_default_summary">Ang pangkalahatang default na halaga para sa \"Umount modules\" sa Mga Profile ng App. Kung pinagana, aalisin nito ang lahat ng mga pagbabago sa modyul sa system para sa mga aplikasyon na walang hanay ng Profile.</string>
|
||||||
|
</resources>
|
||||||
83
manager/app/src/main/res/values-fr/strings.xml
Normal file
83
manager/app/src/main/res/values-fr/strings.xml
Normal file
@@ -0,0 +1,83 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<resources>
|
||||||
|
<string name="home_not_installed">Non installé</string>
|
||||||
|
<string name="home_working">Fonctionnel</string>
|
||||||
|
<string name="home_working_version">Version : %d</string>
|
||||||
|
<string name="home_superuser_count">Super-utilisateurs : %d</string>
|
||||||
|
<string name="home_module_count">Modules : %d</string>
|
||||||
|
<string name="home_unsupported_reason">Actuellement, KernelSU ne supporte que les noyaux GKI</string>
|
||||||
|
<string name="home_kernel">Noyau</string>
|
||||||
|
<string name="home_fingerprint">Empreinte digitale</string>
|
||||||
|
<string name="home_selinux_status">Statut de SELinux</string>
|
||||||
|
<string name="selinux_status_disabled">Désactivé</string>
|
||||||
|
<string name="selinux_status_permissive">Permissive</string>
|
||||||
|
<string name="selinux_status_unknown">Inconnu</string>
|
||||||
|
<string name="superuser">Super-utilisateur</string>
|
||||||
|
<string name="module_empty">Aucun module installé</string>
|
||||||
|
<string name="home">Accueil</string>
|
||||||
|
<string name="home_click_to_install">Appuyez ici pour installer</string>
|
||||||
|
<string name="home_unsupported">Non supporté</string>
|
||||||
|
<string name="module_uninstall_failed">Échec de la désinstallation : %s</string>
|
||||||
|
<string name="module_version">Version</string>
|
||||||
|
<string name="home_manager_version">Version du gestionnaire</string>
|
||||||
|
<string name="selinux_status_enforcing">Enforcing</string>
|
||||||
|
<string name="module_failed_to_enable">Échec de l\'activation du module : %s</string>
|
||||||
|
<string name="module">Modules</string>
|
||||||
|
<string name="uninstall">Désinstaller</string>
|
||||||
|
<string name="module_install">Installer</string>
|
||||||
|
<string name="module_failed_to_disable">Échec de la désactivation du module : %s</string>
|
||||||
|
<string name="reboot">Redémarrer</string>
|
||||||
|
<string name="install">Installer</string>
|
||||||
|
<string name="settings">Paramètres</string>
|
||||||
|
<string name="reboot_bootloader">Redémarrer vers le bootloader</string>
|
||||||
|
<string name="reboot_userspace">Redémarrage logiciel</string>
|
||||||
|
<string name="reboot_recovery">Redémarrer en mode récupération</string>
|
||||||
|
<string name="reboot_edl">Redémarrer en mode EDL</string>
|
||||||
|
<string name="about">À propos</string>
|
||||||
|
<string name="module_uninstall_success">%s désinstallé</string>
|
||||||
|
<string name="reboot_download">Redémarrer en mode téléchargement</string>
|
||||||
|
<string name="module_author">Auteur</string>
|
||||||
|
<string name="module_uninstall_confirm">Êtes-vous sûr(e) de vouloir désinstaller le module %s \?</string>
|
||||||
|
<string name="home_learn_kernelsu">Découvrir KernelSU</string>
|
||||||
|
<string name="module_overlay_fs_not_available">OverlayFS n\'est pas disponible, impossible de faire fonctionner le module !</string>
|
||||||
|
<string name="refresh">Rafraîchir</string>
|
||||||
|
<string name="show_system_apps">Afficher les applications système</string>
|
||||||
|
<string name="hide_system_apps">Masquer les applications système</string>
|
||||||
|
<string name="safe_mode">Mode sans échec</string>
|
||||||
|
<string name="send_log">Envoyer les logs</string>
|
||||||
|
<string name="reboot_to_apply">Redémarrez pour appliquer les modifications</string>
|
||||||
|
<string name="module_magisk_conflict">Les modules sont désactivés car ils sont en conflit avec ceux de Magisk !</string>
|
||||||
|
<string name="home_learn_kernelsu_url">https://kernelsu.org/guide/what-is-kernelsu.html</string>
|
||||||
|
<string name="home_support_title">Soutenez-nous</string>
|
||||||
|
<string name="home_click_to_learn_kernelsu">Découvrez comment installer KernelSU et utiliser les modules</string>
|
||||||
|
<string name="home_support_content">KernelSU est et restera toujours gratuit et open source. Vous pouvez cependant nous témoigner de votre soutien en nous faisant un don.</string>
|
||||||
|
<string name="about_source_code">Voir le code source sur %1$s<br/>
|
||||||
|
\nRejoindre notre canal %2$s</string>
|
||||||
|
<string name="profile_template">Modèle</string>
|
||||||
|
<string name="profile_default">Par défaut</string>
|
||||||
|
<string name="profile_custom">Personnalisé</string>
|
||||||
|
<string name="profile_name">Nom du profil</string>
|
||||||
|
<string name="profile_namespace">Espace de noms de montage</string>
|
||||||
|
<string name="profile_namespace_inherited">Hérité</string>
|
||||||
|
<string name="profile_namespace_individual">Individuel</string>
|
||||||
|
<string name="profile_selinux_context">Contexte SELinux</string>
|
||||||
|
<string name="profile_namespace_global">Global</string>
|
||||||
|
<string name="profile_groups">Groupes</string>
|
||||||
|
<string name="profile_capabilities">Capacités</string>
|
||||||
|
<string name="profile_umount_modules">Démonter les modules</string>
|
||||||
|
<string name="failed_to_update_app_profile">Échec de la modification du profil d\'application de %s</string>
|
||||||
|
<string name="profile_umount_modules_summary">L\'activation de cette option permettra à KernelSU de restaurer tous les fichiers modifiés par les modules de cette application.</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 les profils d\'application. Si l\'option est activée, les modifications apportées au système par les modules seront supprimées pour les applications qui n\'ont pas de profil défini.</string>
|
||||||
|
<string name="profile_selinux_domain">Domaine</string>
|
||||||
|
<string name="profile_selinux_rules">Règles</string>
|
||||||
|
<string name="module_update">Mettre à jour</string>
|
||||||
|
<string name="module_downloading">Téléchargement du module : %s</string>
|
||||||
|
<string name="launch_app">Lancer</string>
|
||||||
|
<string name="new_version_available">Nouvelle version : la %s est disponible, appuyez ici pour la télécharger</string>
|
||||||
|
<string name="module_start_downloading">Début du téléchargement de : %s</string>
|
||||||
|
<string name="force_stop_app">Forcer l\'arrêt</string>
|
||||||
|
<string name="restart_app">Relancer l\'application</string>
|
||||||
|
<string name="failed_to_update_sepolicy">Échec de la mise à jour des règles de SELinux pour : %s</string>
|
||||||
|
<string name="require_kernel_version">La version actuelle (%d) de KernelSU est trop ancienne pour que le gestionnaire fonctionne correctement. Veuillez passer à la version %d ou à une version supérieure !</string>
|
||||||
|
</resources>
|
||||||
83
manager/app/src/main/res/values-hi/strings.xml
Normal file
83
manager/app/src/main/res/values-hi/strings.xml
Normal file
@@ -0,0 +1,83 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<resources>
|
||||||
|
<string name="reboot_to_apply">प्रभाव में होने के लिए रीबूट करें</string>
|
||||||
|
<string name="home_click_to_learn_kernelsu">जानें कि KernelSU कैसे स्थापित करें और मॉड्यूल का उपयोग कैसे करें</string>
|
||||||
|
<string name="selinux_status_unknown">अज्ञात</string>
|
||||||
|
<string name="show_system_apps">सिस्टम एप्प दिखाए</string>
|
||||||
|
<string name="module_uninstall_success">%s अनइंस्टॉल सफल हुआ</string>
|
||||||
|
<string name="profile_umount_modules">मॉड्यूल्स अनमाउंट करें</string>
|
||||||
|
<string name="send_log">लॉग भेजे</string>
|
||||||
|
<string name="selinux_status_disabled">डिसेबल्ड (बंद)</string>
|
||||||
|
<string name="home_support_title">हमें प्रोत्साहन दें</string>
|
||||||
|
<string name="profile_namespace_inherited">Inherited</string>
|
||||||
|
<string name="module_magisk_conflict">मॉड्यूल बंद कर दिए गए हैं क्योंकि यह मैजिक के साथ टकरा रहे है!</string>
|
||||||
|
<string name="module_changelog">क्या बदलाव हुए है</string>
|
||||||
|
<string name="selinux_status_permissive">पर्मिसिव</string>
|
||||||
|
<string name="reboot_download">डाउनलोड में रिबूट करें</string>
|
||||||
|
<string name="settings_umount_modules_default">डिफ़ॉल्ट रूप से मॉड्यूल अनमाउन्ट करें</string>
|
||||||
|
<string name="profile_umount_modules_summary">इस विकल्प को चालू करने से KernelSU को इस एप्लिकेशन के लिए मॉड्यूल द्वारा किसी भी मोडिफाइड फ़ाइल को रिस्टोर करें।</string>
|
||||||
|
<string name="profile_namespace_individual">Individual</string>
|
||||||
|
<string name="module_failed_to_enable">%s मॉड्यूल चालू करने में विफल</string>
|
||||||
|
<string name="force_stop_app">जबर्दस्ती बंद करें</string>
|
||||||
|
<string name="reboot_edl">EDL मोड में रिबूट करें</string>
|
||||||
|
<string name="restart_app">फिर से चालू करें</string>
|
||||||
|
<string name="profile_capabilities">क्षमताएं</string>
|
||||||
|
<string name="home_superuser_count">सुपरयूजर : %d</string>
|
||||||
|
<string name="module_start_downloading">%s की डाउनलोडिंग स्टार्ट करें</string>
|
||||||
|
<string name="profile_namespace_global">Global</string>
|
||||||
|
<string name="settings_umount_modules_default_summary">ऐप प्रोफाइल में \"अनमाउंट मॉड्यूल\" के लिए ग्लोबल डिफ़ॉल्ट वैल्यू। यदि चालू किया गया है, तो यह एप्लीकेशंस के लिऐ सिस्टम के सभी मॉड्यूल मोडिफिकेशन को हटा देगा जिनकी प्रोफ़ाइल सेट नहीं है।</string>
|
||||||
|
<string name="home_module_count">मॉड्यूल्स : %d</string>
|
||||||
|
<string name="selinux_status_enforcing">एनफोर्सिंग</string>
|
||||||
|
<string name="profile_selinux_context">SELinux context</string>
|
||||||
|
<string name="home_fingerprint">फिंगरप्रिंट</string>
|
||||||
|
<string name="profile_default">डिफॉल्ट</string>
|
||||||
|
<string name="launch_app">लॉन्च करें</string>
|
||||||
|
<string name="safe_mode">सेफ मोड</string>
|
||||||
|
<string name="require_kernel_version">मैनेजर के ठीक से काम करने के लिए वर्तमान KernelSU वर्जन %d बहुत कम है। कृपया वर्जन %d या उच्चतर में अपग्रेड करें!</string>
|
||||||
|
<string name="reboot_recovery">रिकवरी में रिबूट करें</string>
|
||||||
|
<string name="reboot_userspace">सॉफ्ट रिबूट</string>
|
||||||
|
<string name="profile_name">प्रोफाइल का नाम</string>
|
||||||
|
<string name="home_support_content">KernelSU मुफ़्त और ओपन सोर्स और हमेशा रहेगा। हालाँकि आप दान देकर हमें दिखा सकते हैं कि आप संरक्षण करते हैं।</string>
|
||||||
|
<string name="uninstall">अनइंस्टॉल करें</string>
|
||||||
|
<string name="profile_namespace">Namspace माउंट करें</string>
|
||||||
|
<string name="module_install">इंस्टाल करें</string>
|
||||||
|
<string name="home_click_to_install">इंस्टाल करने के लिए क्लिक करें</string>
|
||||||
|
<string name="profile_selinux_rules">नियम</string>
|
||||||
|
<string name="profile_groups">समूह</string>
|
||||||
|
<string name="module_overlay_fs_not_available">Overlayfs उपलब्ध नहीं है, मॉड्यूल काम नहीं कर सकता !</string>
|
||||||
|
<string name="module">मॉड्यूल</string>
|
||||||
|
<string name="module_author">निर्माता</string>
|
||||||
|
<string name="about">हमारे बारे में</string>
|
||||||
|
<string name="home_working_version">वर्जन: %d</string>
|
||||||
|
<string name="reboot">रीबूट करें</string>
|
||||||
|
<string name="home_unsupported_reason">KernelSU अभी केवल GKI कर्नल्स को सपोर्ट करता है</string>
|
||||||
|
<string name="home_selinux_status">SELinux स्थिति</string>
|
||||||
|
<string name="hide_system_apps">सिस्टम एप्प छिपाए</string>
|
||||||
|
<string name="module_version">वर्जन</string>
|
||||||
|
<string name="home_unsupported">सपोर्ट नहीं करता है</string>
|
||||||
|
<string name="profile_selinux_domain">डोमेन</string>
|
||||||
|
<string name="home">होम</string>
|
||||||
|
<string name="profile_custom">कस्टम</string>
|
||||||
|
<string name="profile_template">टेम्पलेट</string>
|
||||||
|
<string name="refresh">रिफ्रेश</string>
|
||||||
|
<string name="module_downloading">%s मॉड्यूल डाउनलोड हो रहा है</string>
|
||||||
|
<string name="module_update">अपडेट</string>
|
||||||
|
<string name="home_learn_kernelsu">KernelSU सीखें</string>
|
||||||
|
<string name="module_uninstall_confirm">क्या आप सच में मॉड्यूल %s को अनइंस्टॉल करना चाहते हैं\?</string>
|
||||||
|
<string name="module_uninstall_failed">%s अनइंस्टल करने में असफल</string>
|
||||||
|
<string name="superuser">सुपरयूजर</string>
|
||||||
|
<string name="settings">सेटिंग</string>
|
||||||
|
<string name="home_working">काम कर रहा है</string>
|
||||||
|
<string name="module_failed_to_disable">%s मॉड्यूल बंद करने में विफल</string>
|
||||||
|
<string name="module_empty">कोई मॉड्यूल इंस्टाल नहीं हुआ</string>
|
||||||
|
<string name="install">इंस्टाल करें</string>
|
||||||
|
<string name="home_kernel">कर्नल</string>
|
||||||
|
<string name="home_not_installed">इंस्टाल नहीं हुआ</string>
|
||||||
|
<string name="failed_to_update_app_profile">%s के लिए ऐप प्रोफ़ाइल अपडेट करने में विफल</string>
|
||||||
|
<string name="home_learn_kernelsu_url">https://kernelsu.org/guide/what-is-kernelsu.html</string>
|
||||||
|
<string name="failed_to_update_sepolicy">%s के लिए SELinux नियमों को अपटेड करने में विफल</string>
|
||||||
|
<string name="reboot_bootloader">बुटलोडर में रिबूट करें</string>
|
||||||
|
<string name="about_source_code">%1$s पर स्रोत कोड देखें<br/>हमारे %2$s चैनल से जुड़ें</string>
|
||||||
|
<string name="home_manager_version">मैनेजर वर्जन</string>
|
||||||
|
<string name="new_version_available">नया वर्जन: %s उपलब्ध है,अपग्रेड के लिए क्लिक करें</string>
|
||||||
|
</resources>
|
||||||
82
manager/app/src/main/res/values-hr/strings.xml
Normal file
82
manager/app/src/main/res/values-hr/strings.xml
Normal file
@@ -0,0 +1,82 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<resources>
|
||||||
|
<string name="show_system_apps">Prikažite sistemske aplikacije</string>
|
||||||
|
<string name="hide_system_apps">Sakrijte sistemske aplikacije</string>
|
||||||
|
<string name="send_log">Pošaljite Izvještaj</string>
|
||||||
|
<string name="safe_mode">Sigurnosni mod</string>
|
||||||
|
<string name="reboot_to_apply">Ponovno pokrenite da bi proradilo</string>
|
||||||
|
<string name="failed_to_update_sepolicy">Neuspješno ažuriranje SELinux pravila za: %s</string>
|
||||||
|
<string name="home">Početna</string>
|
||||||
|
<string name="home_not_installed">Nije instalirano</string>
|
||||||
|
<string name="home_working_version">Verzija: %d</string>
|
||||||
|
<string name="home_click_to_install">Kliknite da instalirate</string>
|
||||||
|
<string name="home_working">Radi</string>
|
||||||
|
<string name="home_superuser_count">Superkorisnici: %d</string>
|
||||||
|
<string name="home_module_count">Module: %d</string>
|
||||||
|
<string name="home_unsupported">Nepodržano</string>
|
||||||
|
<string name="home_unsupported_reason">KernelSU samo podržava GKI kernele sad</string>
|
||||||
|
<string name="home_kernel">Kernel</string>
|
||||||
|
<string name="home_manager_version">Verzija Voditelja</string>
|
||||||
|
<string name="home_fingerprint">Otisak prsta</string>
|
||||||
|
<string name="selinux_status_disabled">Isključeno</string>
|
||||||
|
<string name="selinux_status_enforcing">U Provođenju</string>
|
||||||
|
<string name="selinux_status_permissive">Permisivno</string>
|
||||||
|
<string name="home_selinux_status">SELinux stanje</string>
|
||||||
|
<string name="selinux_status_unknown">Nepoznato</string>
|
||||||
|
<string name="superuser">Superkorisnik</string>
|
||||||
|
<string name="module_failed_to_enable">Neuspješno uključivanje module: %s</string>
|
||||||
|
<string name="module_failed_to_disable">Neuspješno isključivanje module: %s</string>
|
||||||
|
<string name="module_empty">Nema instaliranih modula</string>
|
||||||
|
<string name="module">Modula</string>
|
||||||
|
<string name="uninstall">Deinstalirajte</string>
|
||||||
|
<string name="module_install">Instalirajte</string>
|
||||||
|
<string name="install">Instalirajte</string>
|
||||||
|
<string name="reboot">Ponovno pokrenite</string>
|
||||||
|
<string name="settings">Postavke</string>
|
||||||
|
<string name="reboot_userspace">Lagano Ponovno pokretanje</string>
|
||||||
|
<string name="reboot_recovery">Ponovno pokrenite u Oporavu</string>
|
||||||
|
<string name="reboot_bootloader">Ponovno pokrenite u Pogonski Učitavalac</string>
|
||||||
|
<string name="reboot_download">Ponovno pokrenite u Preuzimanje</string>
|
||||||
|
<string name="reboot_edl">Ponovo pokrenite u EDL</string>
|
||||||
|
<string name="about">O</string>
|
||||||
|
<string name="module_uninstall_confirm">Jeste li sigurni da želite deinstalirati modulu %s\?</string>
|
||||||
|
<string name="module_uninstall_success">%s deinstalirana</string>
|
||||||
|
<string name="module_uninstall_failed">Neuspješna deinstalacija: %s</string>
|
||||||
|
<string name="module_version">Verzija</string>
|
||||||
|
<string name="module_author">Autor</string>
|
||||||
|
<string name="refresh">Osvježi</string>
|
||||||
|
<string name="module_overlay_fs_not_available">overlayfs nije dostupan, modula ne može raditi!</string>
|
||||||
|
<string name="module_magisk_conflict">Module su isključene jer je u sukobu sa Magisk-om!</string>
|
||||||
|
<string name="home_learn_kernelsu">Naučite KernelSU</string>
|
||||||
|
<string name="home_learn_kernelsu_url">https://kernelsu.org/guide/what-is-kernelsu.html</string>
|
||||||
|
<string name="home_click_to_learn_kernelsu">Naučite kako da instalirate KernelSU i da koristite module</string>
|
||||||
|
<string name="home_support_title">Podržite Nas</string>
|
||||||
|
<string name="home_support_content">KernelSU je, i uvijek če biti, besplatan, i otvorenog izvora. Možete nam međutim pokazati da vas je briga s time da napravite donaciju.</string>
|
||||||
|
<string name="about_source_code">Pogledajte izvornu kodu na %1$s<br/>Pridružite nam se na %2$s kanalu</string>
|
||||||
|
<string name="profile_default">Zadano</string>
|
||||||
|
<string name="profile_template">Šablon</string>
|
||||||
|
<string name="profile_custom">Prilagođeno</string>
|
||||||
|
<string name="profile_name">Naziv profila</string>
|
||||||
|
<string name="profile_namespace_inherited">Naslijeđen</string>
|
||||||
|
<string name="profile_namespace">Imenski prostor nosača</string>
|
||||||
|
<string name="failed_to_update_app_profile">Ažuriranje Profila Aplikacije za %s nije uspjelo</string>
|
||||||
|
<string name="profile_namespace_global">Globalan</string>
|
||||||
|
<string name="profile_namespace_individual">Pojedinačan</string>
|
||||||
|
<string name="profile_umount_modules">Umount module</string>
|
||||||
|
<string name="profile_groups">Grupe</string>
|
||||||
|
<string name="profile_capabilities">Sposobnosti</string>
|
||||||
|
<string name="profile_selinux_context">SELinux kontekst</string>
|
||||||
|
<string name="require_kernel_version">Trenutna KernelSU verzija %d je preniska da bi voditelj ispravno radio. Molimo vas da nadogradite na verziju %d ili noviju!</string>
|
||||||
|
<string name="settings_umount_modules_default">Umount module po zadanom</string>
|
||||||
|
<string name="settings_umount_modules_default_summary">Globalna zadana vrijednost za \"Umount module\" u Profilima Aplikacije. Ako je omogućeno, uklonit će sve izmjene modula na sistemu za aplikacije koje nemaju postavljen Profil.</string>
|
||||||
|
<string name="profile_selinux_domain">Domena</string>
|
||||||
|
<string name="profile_umount_modules_summary">Uključivanjem ove opcije omogućit će KernelSU-u da vrati sve izmjenute datoteke od strane modula za ovu aplikaciju.</string>
|
||||||
|
<string name="profile_selinux_rules">Pravila</string>
|
||||||
|
<string name="module_update">Ažuriranje</string>
|
||||||
|
<string name="module_downloading">Preuzimanje module: %s</string>
|
||||||
|
<string name="module_start_downloading">Započnite sa preuzimanjem: %s</string>
|
||||||
|
<string name="new_version_available">Nova verzija: %s je dostupna, kliknite da preuzmete</string>
|
||||||
|
<string name="launch_app">Pokrenite</string>
|
||||||
|
<string name="force_stop_app">Prisilno Zaustavite</string>
|
||||||
|
<string name="restart_app">Resetujte</string>
|
||||||
|
</resources>
|
||||||
82
manager/app/src/main/res/values-hu/strings.xml
Normal file
82
manager/app/src/main/res/values-hu/strings.xml
Normal file
@@ -0,0 +1,82 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<resources>
|
||||||
|
<string name="home_working">Működik</string>
|
||||||
|
<string name="home_working_version">Verzió: %d</string>
|
||||||
|
<string name="home_module_count">Modulok: %d</string>
|
||||||
|
<string name="home_unsupported_reason">KernelSU csak GKI kerneleket támogat jelenleg</string>
|
||||||
|
<string name="home_kernel">Kernel</string>
|
||||||
|
<string name="home_manager_version">App verziója</string>
|
||||||
|
<string name="home_fingerprint">Build Fingerprint</string>
|
||||||
|
<string name="selinux_status_disabled">Kikapcsolt</string>
|
||||||
|
<string name="reboot_download">Újraindítás letöltő módba</string>
|
||||||
|
<string name="reboot_edl">Újraindítás EDL-be</string>
|
||||||
|
<string name="about">Névjegy</string>
|
||||||
|
<string name="module_uninstall_confirm">Biztos vagy benne hogy eltávolítod a következő modult: %s\?</string>
|
||||||
|
<string name="module_uninstall_failed">Nem sikerült eltávolítani: %s</string>
|
||||||
|
<string name="module_author">Készítő</string>
|
||||||
|
<string name="module_overlay_fs_not_available">Overlayfs nem elérhető, a modul nem tud enélkül működni!</string>
|
||||||
|
<string name="refresh">Újratöltés</string>
|
||||||
|
<string name="show_system_apps">Mutasd a rendszer alkalmazásokat</string>
|
||||||
|
<string name="hide_system_apps">Rejtsd el a rendszer alkalmazásokat</string>
|
||||||
|
<string name="safe_mode">Biztonságos mód</string>
|
||||||
|
<string name="module_magisk_conflict">A modul letiltva mert ütközik a Magisk verziójával!</string>
|
||||||
|
<string name="home_learn_kernelsu">Tudj meg többet a KernelSU-ról</string>
|
||||||
|
<string name="home_click_to_learn_kernelsu">Tudd meg hogyan telepítsd a KernelSU-t és használd moduljait</string>
|
||||||
|
<string name="home_support_title">Támogass minket</string>
|
||||||
|
<string name="about_source_code">Tekintsd meg a forráskódot a %1$s-n<br/>Csatlakozz a %2$s csatornánkhoz</string>
|
||||||
|
<string name="profile_default">Alapértelmezett</string>
|
||||||
|
<string name="profile_template">Sablon</string>
|
||||||
|
<string name="profile_custom">Egyedi</string>
|
||||||
|
<string name="profile_name">Profil neve</string>
|
||||||
|
<string name="profile_namespace">Mountold a névteret</string>
|
||||||
|
<string name="profile_namespace_inherited">Örökölt</string>
|
||||||
|
<string name="home_learn_kernelsu_url">https://kernelsu.org/guide/what-is-kernelsu.html</string>
|
||||||
|
<string name="profile_namespace_individual">Különálló</string>
|
||||||
|
<string name="profile_groups">Csoportok</string>
|
||||||
|
<string name="profile_capabilities">Jogosultságok</string>
|
||||||
|
<string name="profile_selinux_context">SElinux kontextus</string>
|
||||||
|
<string name="settings_umount_modules_default">Umountold a modulokat alpértelmezés szerint</string>
|
||||||
|
<string name="profile_umount_modules_summary">Ennek az opciónak az engedélyezése lehetővé teszi, hogy a KernelSU visszaállítsa az alkalmazás moduljai által módosított fájlokat.</string>
|
||||||
|
<string name="profile_selinux_domain">Tartomány</string>
|
||||||
|
<string name="profile_selinux_rules">Szabályok</string>
|
||||||
|
<string name="module_update">Frissítés</string>
|
||||||
|
<string name="module_downloading">A %s modul letöltése folyamatban</string>
|
||||||
|
<string name="module_start_downloading">Indítsd el a letöltést: %s</string>
|
||||||
|
<string name="launch_app">Indítás</string>
|
||||||
|
<string name="force_stop_app">Kényszerített leállítás</string>
|
||||||
|
<string name="restart_app">újraindítás</string>
|
||||||
|
<string name="home">Kezdőlap</string>
|
||||||
|
<string name="home_not_installed">Nincs telepítve</string>
|
||||||
|
<string name="home_click_to_install">Kattints a telepítéshez</string>
|
||||||
|
<string name="home_superuser_count">Engedélyezett alkalmazások: %d</string>
|
||||||
|
<string name="home_unsupported">Nem támogatott</string>
|
||||||
|
<string name="home_selinux_status">SELinux státusz</string>
|
||||||
|
<string name="selinux_status_enforcing">Érvényesítés</string>
|
||||||
|
<string name="selinux_status_permissive">Megengedő</string>
|
||||||
|
<string name="selinux_status_unknown">Ismeretlen</string>
|
||||||
|
<string name="superuser">Superuser</string>
|
||||||
|
<string name="module_failed_to_enable">Nem sikerült engedélyezni a következő modult: %s</string>
|
||||||
|
<string name="module_failed_to_disable">Nem sikerült letiltani a következő modulokat: %s</string>
|
||||||
|
<string name="module_empty">Nincs modul telepítve</string>
|
||||||
|
<string name="module">Modulok</string>
|
||||||
|
<string name="uninstall">Eltávolítás</string>
|
||||||
|
<string name="module_install">Telepítés</string>
|
||||||
|
<string name="install">Telepítés</string>
|
||||||
|
<string name="reboot">Újraindítás</string>
|
||||||
|
<string name="settings">Beállítások</string>
|
||||||
|
<string name="reboot_userspace">Android felület újraindítása</string>
|
||||||
|
<string name="reboot_recovery">Újraindítás recovery-módba</string>
|
||||||
|
<string name="reboot_bootloader">Újraindítás bootloader-módba</string>
|
||||||
|
<string name="module_uninstall_success">%s eltávolítva</string>
|
||||||
|
<string name="module_version">Verzió</string>
|
||||||
|
<string name="send_log">Fejlesztői napló küldése</string>
|
||||||
|
<string name="reboot_to_apply">Indítsd újra a készüléket hogy érvényesítsd a változást</string>
|
||||||
|
<string name="home_support_content">A KernelSU ingyenes és nyílt forráskódú és mindig is az lesz. Te viszont meg tudod mutatni azt, hogy törődsz ennek a projektnek a sorsával egy adomány formájában.</string>
|
||||||
|
<string name="profile_namespace_global">Globális</string>
|
||||||
|
<string name="profile_umount_modules">Unmountold a modulokat</string>
|
||||||
|
<string name="failed_to_update_app_profile">Nem sikerült frissíteni az App Profilt ehhez %s</string>
|
||||||
|
<string name="settings_umount_modules_default_summary">A „Modulok csatlakoztatása” globális alapértelmezett értéke az alkalmazásprofilokban. Ha engedélyezve van, eltávolítja a rendszer összes modul-módosítását azoknál az alkalmazásoknál, amelyeknek nincs beállított profilja.</string>
|
||||||
|
<string name="new_version_available">Új verzió: %s elérhető, kattints a letöltéséhez</string>
|
||||||
|
<string name="failed_to_update_sepolicy">Nem sikerült frissíteni a SELinux szabályait a következőhöz: %s</string>
|
||||||
|
<string name="require_kernel_version">A jelenlegi KernelSU verzió %d túlságosan elavult. Kérlek frissíts a %d verzióra vagy újabbra!</string>
|
||||||
|
</resources>
|
||||||
@@ -1,77 +1,84 @@
|
|||||||
<resources>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<string name="app_name" translatable="false">KernelSU</string>
|
<resources>
|
||||||
|
<string name="home">Beranda</string>
|
||||||
<string name="home">Beranda</string>
|
<string name="home_not_installed">Tidak terpasang</string>
|
||||||
<string name="home_not_installed">Tidak terpasang</string>
|
<string name="home_click_to_install">Klik untuk memasang</string>
|
||||||
<string name="home_click_to_install">Klik untuk memasang</string>
|
<string name="home_working">Bekerja</string>
|
||||||
<string name="home_working">Bekerja</string>
|
<string name="home_working_version">Versi: %d</string>
|
||||||
<string name="home_working_version">Versi: %d</string>
|
<string name="home_superuser_count">Superusers: %d</string>
|
||||||
<string name="home_superuser_count">Superusers: %d</string>
|
<string name="home_module_count">Modul: %d</string>
|
||||||
<string name="home_module_count">Modul: %d</string>
|
<string name="home_unsupported">Tidak didukung</string>
|
||||||
<string name="home_unsupported">Tidak didukung</string>
|
<string name="home_unsupported_reason">KernelSU hanya mendukung kernel GKI saat ini</string>
|
||||||
<string name="home_unsupported_reason">KernelSU hanya mendukung kernel GKI saat ini</string>
|
<string name="home_kernel">Kernel</string>
|
||||||
|
<string name="home_manager_version">Versi Manager</string>
|
||||||
<string name="home_kernel">Kernel</string>
|
<string name="home_fingerprint">Sidik jari</string>
|
||||||
<string name="home_manager_version">Versi Manager</string>
|
<string name="home_selinux_status">Status SELinux</string>
|
||||||
<string name="home_fingerprint">Sidik jari</string>
|
<string name="selinux_status_disabled">Dinonaktifkan</string>
|
||||||
|
<string name="selinux_status_enforcing">Enforcing</string>
|
||||||
<string name="home_selinux_status">status SELinux</string>
|
<string name="selinux_status_permissive">Permasif</string>
|
||||||
<string name="selinux_status_disabled">Dinonaktifkan</string>
|
<string name="selinux_status_unknown">Tidak dikenal</string>
|
||||||
<string name="selinux_status_enforcing">Enforcing</string>
|
<string name="superuser">Superuser</string>
|
||||||
<string name="selinux_status_permissive">Permissive</string>
|
<string name="module_failed_to_enable">Gagal mengaktifkan modul: %s</string>
|
||||||
<string name="selinux_status_unknown">Tidak dikenal</string>
|
<string name="module_failed_to_disable">Gagal menonaktifkan modul: %s</string>
|
||||||
<string name="superuser">Superuser</string>
|
<string name="module_empty">Tidak ada modul yang terpasang</string>
|
||||||
<string name="module_failed_to_enable">Gagal mengaktifkan modul: %s</string>
|
<string name="module">Modul</string>
|
||||||
<string name="module_failed_to_disable">Gagal menonaktifkan modul: %s</string>
|
<string name="uninstall">Copot</string>
|
||||||
<string name="module_empty">Tidak ada modul terpasang</string>
|
<string name="module_install">Pasang</string>
|
||||||
|
<string name="install">Pasang</string>
|
||||||
<string name="module">Modul</string>
|
<string name="reboot">Mulai ulang</string>
|
||||||
<string name="uninstall">Copot</string>
|
<string name="settings">Pengaturan</string>
|
||||||
<string name="module_install">Pasang</string>
|
<string name="reboot_userspace">Soft Reboot</string>
|
||||||
<string name="install">Pasang</string>
|
<string name="reboot_recovery">Mulai ulang ke Recovery</string>
|
||||||
<string name="reboot">Reboot</string>
|
<string name="reboot_bootloader">Mulai ulang ke Bootloader</string>
|
||||||
<string name="settings">Pengaturan</string>
|
<string name="reboot_download">Mulai ulang ke Download</string>
|
||||||
<string name="reboot_userspace">Reboot Lembut</string>
|
<string name="reboot_edl">Mulai ulang ke EDL</string>
|
||||||
<string name="reboot_recovery">Reboot ke Recovery</string>
|
<string name="about">Tentang</string>
|
||||||
<string name="reboot_bootloader">Reboot ke Bootloader</string>
|
<string name="module_uninstall_confirm">Apakah Anda yakin ingin mencopot modul %s?</string>
|
||||||
<string name="reboot_download">Reboot ke Download</string>
|
<string name="module_uninstall_success">%s Tercopot</string>
|
||||||
<string name="reboot_edl">Reboot ke EDL</string>
|
<string name="module_uninstall_failed">Gagal untuk mencopot: %s</string>
|
||||||
<string name="about">Tentang</string>
|
<string name="module_version">Versi</string>
|
||||||
<string name="module_uninstall_confirm">Apakah Anda yakin ingin mencopot modul %s?</string>
|
<string name="module_author">Pembuat</string>
|
||||||
<string name="module_uninstall_success">%s Tercopot</string>
|
<string name="module_overlay_fs_not_available">overlayfs tidak tersedia, modul tidak dapat bekerja!</string>
|
||||||
<string name="module_uninstall_failed">Gagal untuk mencopot: %s</string>
|
<string name="refresh">Segarkan</string>
|
||||||
<string name="module_version">Versi</string>
|
<string name="show_system_apps">Tampilkan apl sistem</string>
|
||||||
<string name="module_author">Pembuat</string>
|
<string name="hide_system_apps">Sembunyikan apl sistem</string>
|
||||||
<string name="module_overlay_fs_not_available">overlayfs tidak tersedia, modul tidak dapat bekerja!</string>
|
<string name="send_log">Kirim Log</string>
|
||||||
<string name="refresh">Segarkan</string>
|
<string name="safe_mode">Mode aman</string>
|
||||||
<string name="show_system_apps">Tampilkan apl sistem</string>
|
<string name="reboot_to_apply">Mulai ulang untuk menerapkan</string>
|
||||||
<string name="hide_system_apps">Sembunyikan apl sistem</string>
|
<string name="module_magisk_conflict">Modul dinonaktifkan karena bertentangan dengan Magisk!</string>
|
||||||
<string name="send_log">Kirim Log</string>
|
<string name="home_learn_kernelsu">Pelajari KernelSU</string>
|
||||||
<string name="safe_mode">Mode aman</string>
|
<string name="home_learn_kernelsu_url">https://kernelsu.org/id_ID/guide/what-is-kernelsu.html</string>
|
||||||
<string name="reboot_to_apply">Reboot untuk menerapkan</string>
|
<string name="home_click_to_learn_kernelsu">Pelajari cara memasang KernelSU dan menggunakan modul</string>
|
||||||
<string name="module_magisk_conflict">Modul dinonaktifkan karena bertentangan dengan Magisk!</string>
|
<string name="home_support_title">Dukung Kami</string>
|
||||||
<string name="home_learn_kernelsu">Pelajari KernelSU</string>
|
<string name="home_support_content">KernelSU gratis dan bersumber terbuka, dan akan selalu seperti itu. Bagaimanapun juga Anda dapat menunjukan kepedulian Anda kepada kami dengan mengirimkan sedikit donasi.</string>
|
||||||
<string name="home_learn_kernelsu_url">https://kernelsu.org/guide/what-is-kernelsu.html</string>
|
<string name="about_source_code"><![CDATA[Lihat sumber code di %1$s<br/>Gabung kanal %2$s kami]]></string>
|
||||||
<string name="home_click_to_learn_kernelsu">Pelajari cara memasang KernelSU dan menggunakan modul</string>
|
<string name="profile">Profil Apl</string>
|
||||||
<string name="home_support_title">Dukung Kami</string>
|
<string name="profile_default">Bawaan</string>
|
||||||
<string name="home_support_content">KernelSU gratis dan bersumber terbuka, dan akan selalu seperti itu. Bagaimanapun juga Anda dapat menunjukan kepedulian Anda kepada kami dengan mengirimkan sedikit donasi.</string>
|
<string name="profile_template">Templat</string>
|
||||||
<string name="about_source_code"><![CDATA[Lihat sumber code di %1$s<br/>Gabung kanal %2$s kami]]></string>
|
<string name="profile_custom">Khusus</string>
|
||||||
<string name="profile">Profil Apl</string>
|
<string name="profile_name">Nama profil</string>
|
||||||
<string name="profile_default">Bawaan</string>
|
<string name="profile_namespace">Ikat ruang-nama</string>
|
||||||
<string name="profile_template">Templat</string>
|
<string name="profile_namespace_inherited">Diwariskan</string>
|
||||||
<string name="profile_custom">Khusus</string>
|
<string name="profile_namespace_global">Universal</string>
|
||||||
<string name="profile_name">Nama profil</string>
|
<string name="profile_namespace_individual">Personal</string>
|
||||||
<string name="profile_namespace">Ikat ruang-nama</string>
|
<string name="profile_groups">Kelompok</string>
|
||||||
<string name="profile_namespace_inherited">Diwariskan</string>
|
<string name="profile_capabilities">Kemampuan</string>
|
||||||
<string name="profile_namespace_global">Universal</string>
|
<string name="profile_selinux_context">Konteks SELinux</string>
|
||||||
<string name="profile_namespace_individual">Personal</string>
|
<string name="profile_umount_modules">Lepas modul</string>
|
||||||
<string name="profile_groups">Kelompok</string>
|
<string name="failed_to_update_app_profile">Gagal memperbarui Profil Apl untuk %s</string>
|
||||||
<string name="profile_capabilities">Kemampuan</string>
|
<string name="settings_umount_modules_default">Lepas modul secara bawaan</string>
|
||||||
<string name="profile_selinux_context">Konteks SELinux</string>
|
<string name="settings_umount_modules_default_summary">Nilai bawaan universal untuk \"Lepas modul\" di Profil-profil Apl. Jika diaktifkan, ini akan menghapus semua modifikasi modul pada sistem untuk aplikasi yang tidak memiliki set Profil.</string>
|
||||||
<string name="profile_umount_modules">Lepas modul</string>
|
<string name="profile_umount_modules_summary">Mengaktifkan opsi ini akan mengizinkan KernelSU memulihkan file-file yang dimodifikasi oleh modul untuk aplikasi ini.</string>
|
||||||
<string name="failed_to_update_app_profile">Gagal memperbarui Profil Apl untuk %s</string>
|
<string name="profile_selinux_domain">Domain</string>
|
||||||
<string name="require_kernel_version">Versi kernel saat ini %d terlalu rendah bagi manager untuk berfungsi dengan baik. Tolong tingkatkan ke versi %d atau lebih tinggi!</string>
|
<string name="profile_selinux_rules">Aturan</string>
|
||||||
<string name="settings_umount_modules_default">Lepas modul secara bawaan</string>
|
<string name="module_update">Perbarui</string>
|
||||||
<string name="settings_umount_modules_default_summary">Nilai bawaan universal untuk \"Lepas modul\" di Profil-profil Apl. Jika diaktifkan, ini akan menghapus semua modifikasi modul pada sistem untuk aplikasi yang tidak memiliki set Profil.</string>
|
<string name="module_downloading">Mengunduh module: %s</string>
|
||||||
<string name="profile_umount_modules_summary">Mengaktifkan opsi ini akan mengizinkan KernelSU memulihkan file-file yang dimodifikasi oleh modul untuk aplikasi ini.</string>
|
<string name="module_start_downloading">Mulai mengunduh: %s</string>
|
||||||
</resources>
|
<string name="new_version_available">Versi baru: %s sudah tersedia, tap untuk mengunduh</string>
|
||||||
|
<string name="launch_app">Jalankan</string>
|
||||||
|
<string name="force_stop_app">Paksa Berhenti</string>
|
||||||
|
<string name="restart_app">Mulai ulang</string>
|
||||||
|
<string name="failed_to_update_sepolicy">Gagal memperbarui aturan SELinux untuk: %s</string>
|
||||||
|
<string name="require_kernel_version">Versi KernelSU saat ini %d terlalu rendah bagi manajer untuk dapat berfungsi dengan baik. Harap tingkatkan ke versi %d atau yang lebih tinggi!</string>
|
||||||
|
<string name="module_changelog">Catatan Perubahan</string>
|
||||||
|
</resources>
|
||||||
@@ -1,3 +1,4 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<resources>
|
<resources>
|
||||||
<string name="home">Home</string>
|
<string name="home">Home</string>
|
||||||
<string name="home_not_installed">Non installato</string>
|
<string name="home_not_installed">Non installato</string>
|
||||||
@@ -8,11 +9,9 @@
|
|||||||
<string name="home_module_count">Moduli: %d</string>
|
<string name="home_module_count">Moduli: %d</string>
|
||||||
<string name="home_unsupported">Non supportato</string>
|
<string name="home_unsupported">Non supportato</string>
|
||||||
<string name="home_unsupported_reason">KernelSU ora supporta solo i kernel GKI</string>
|
<string name="home_unsupported_reason">KernelSU ora supporta solo i kernel GKI</string>
|
||||||
|
|
||||||
<string name="home_kernel">Kernel</string>
|
<string name="home_kernel">Kernel</string>
|
||||||
<string name="home_manager_version">Versione del manager</string>
|
<string name="home_manager_version">Versione del manager</string>
|
||||||
<string name="home_fingerprint">Fingerprint</string>
|
<string name="home_fingerprint">Fingerprint</string>
|
||||||
|
|
||||||
<string name="home_selinux_status">Stato SELinux</string>
|
<string name="home_selinux_status">Stato SELinux</string>
|
||||||
<string name="selinux_status_disabled">Disabilitato</string>
|
<string name="selinux_status_disabled">Disabilitato</string>
|
||||||
<string name="selinux_status_enforcing">Enforcing</string>
|
<string name="selinux_status_enforcing">Enforcing</string>
|
||||||
@@ -22,7 +21,6 @@
|
|||||||
<string name="module_failed_to_enable">Impossibile abilitare il modulo: %s</string>
|
<string name="module_failed_to_enable">Impossibile abilitare il modulo: %s</string>
|
||||||
<string name="module_failed_to_disable">Impossibile disabilitare il modulo: %s</string>
|
<string name="module_failed_to_disable">Impossibile disabilitare il modulo: %s</string>
|
||||||
<string name="module_empty">Nessun modulo installato</string>
|
<string name="module_empty">Nessun modulo installato</string>
|
||||||
|
|
||||||
<string name="module">Moduli</string>
|
<string name="module">Moduli</string>
|
||||||
<string name="uninstall">Disinstalla</string>
|
<string name="uninstall">Disinstalla</string>
|
||||||
<string name="module_install">Installa</string>
|
<string name="module_install">Installa</string>
|
||||||
@@ -54,4 +52,31 @@
|
|||||||
<string name="home_support_title">Supportaci</string>
|
<string name="home_support_title">Supportaci</string>
|
||||||
<string name="home_support_content">KernelSU è, e sempre sarà, gratuito e open source. Puoi comunque mostrarci il tuo apprezzamento facendo una donazione.</string>
|
<string name="home_support_content">KernelSU è, e sempre sarà, gratuito e open source. Puoi comunque mostrarci il tuo apprezzamento facendo una donazione.</string>
|
||||||
<string name="about_source_code"><![CDATA[Visualizza il codice sorgente su %1$s<br/>Unisciti al nostro canale %2$s]]></string>
|
<string name="about_source_code"><![CDATA[Visualizza il codice sorgente su %1$s<br/>Unisciti al nostro canale %2$s]]></string>
|
||||||
</resources>
|
<string name="profile_name">Nome profilo</string>
|
||||||
|
<string name="profile_namespace">Namespace di mount</string>
|
||||||
|
<string name="profile_namespace_global">Globale</string>
|
||||||
|
<string name="profile_groups">Gruppi</string>
|
||||||
|
<string name="profile_namespace_inherited">Ereditato</string>
|
||||||
|
<string name="profile_namespace_individual">Individuale</string>
|
||||||
|
<string name="profile_default">Predefinito</string>
|
||||||
|
<string name="profile_custom">Personalizzato</string>
|
||||||
|
<string name="profile_template">Template</string>
|
||||||
|
<string name="profile_umount_modules">Scollega moduli</string>
|
||||||
|
<string name="profile_selinux_context">Contesto SELinux</string>
|
||||||
|
<string name="failed_to_update_app_profile">Aggiornamento Profilo per %s fallito</string>
|
||||||
|
<string name="module_update">Aggiorna</string>
|
||||||
|
<string name="launch_app">Apri</string>
|
||||||
|
<string name="profile_capabilities">Capacità</string>
|
||||||
|
<string name="settings_umount_modules_default">Scollega moduli da default</string>
|
||||||
|
<string name="profile_selinux_rules">Regole</string>
|
||||||
|
<string name="module_downloading">Sto scaricando il modulo: %s</string>
|
||||||
|
<string name="module_start_downloading">Inizia a scaricare:%s</string>
|
||||||
|
<string name="new_version_available">Nuova versione: %s disponibile, tocca per scaricare</string>
|
||||||
|
<string name="force_stop_app">Arresto forzato</string>
|
||||||
|
<string name="restart_app">Riavvia</string>
|
||||||
|
<string name="failed_to_update_sepolicy">Aggiornamento regole SELinux per %s fallito</string>
|
||||||
|
<string name="profile_umount_modules_summary">Attivando questa opzione permetterai a KernelSU di ripristinare ogni file modificato dai moduli per questa app.</string>
|
||||||
|
<string name="profile_selinux_domain">Dominio</string>
|
||||||
|
<string name="settings_umount_modules_default_summary">Il valore predefinito per \"Scollega moduli\" in Profili App. Se attivato, rimuoverà tutte le modifiche al sistema da parte dei moduli per le applicazioni che non hanno un profilo impostato.</string>
|
||||||
|
<string name="require_kernel_version">La versione attualmente installata di KernelSU (%d) è troppo vecchia ed il gestore non può funzionare correttamente. Si prega di aggiornare alla versione %d o successiva!</string>
|
||||||
|
</resources>
|
||||||
83
manager/app/src/main/res/values-iw/strings.xml
Normal file
83
manager/app/src/main/res/values-iw/strings.xml
Normal file
@@ -0,0 +1,83 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<resources>
|
||||||
|
<string name="reboot_to_apply">הפעל מחדש כדי להכניס לתוקף</string>
|
||||||
|
<string name="home_click_to_learn_kernelsu">למד כיצד להתקין את KernelSU ולהשתמש במודולים</string>
|
||||||
|
<string name="selinux_status_unknown">לא ידוע</string>
|
||||||
|
<string name="show_system_apps">הצג אפליקציות מערכת</string>
|
||||||
|
<string name="module_uninstall_success">%s הוסר</string>
|
||||||
|
<string name="profile_umount_modules">הסרת טעינת מודולים</string>
|
||||||
|
<string name="send_log">שלח לוג</string>
|
||||||
|
<string name="selinux_status_disabled">מושבת</string>
|
||||||
|
<string name="home_support_title">תמכו בנו</string>
|
||||||
|
<string name="profile_namespace_inherited">ירושה</string>
|
||||||
|
<string name="module_magisk_conflict">מודולים מושבתים מכיוון שהם מתנגשים עם זה של Magisk!</string>
|
||||||
|
<string name="module_changelog">יומן שינויים</string>
|
||||||
|
<string name="selinux_status_permissive">התרים</string>
|
||||||
|
<string name="reboot_download">הפעלה מחדש למצב הורדה</string>
|
||||||
|
<string name="settings_umount_modules_default">טעינת מודולים כברירת מחדל</string>
|
||||||
|
<string name="profile_umount_modules_summary">הפעלת אפשרות זו תאפשר ל-KernelSU לשחזר קבצים שהשתנו על ידי המודולים עבור יישום זה.</string>
|
||||||
|
<string name="profile_namespace_individual">אישי</string>
|
||||||
|
<string name="module_failed_to_enable">הפעלת המודל נכשלה: %s</string>
|
||||||
|
<string name="force_stop_app">עצירה בכח</string>
|
||||||
|
<string name="reboot_edl">הפעלה מחדש למצב EDL</string>
|
||||||
|
<string name="restart_app">איתחול</string>
|
||||||
|
<string name="profile_capabilities">יכולת</string>
|
||||||
|
<string name="home_superuser_count">משתמשי על: %d</string>
|
||||||
|
<string name="module_start_downloading">מפעיל מודל: %s</string>
|
||||||
|
<string name="profile_namespace_global">גלובלי</string>
|
||||||
|
<string name="settings_umount_modules_default_summary">ערך ברירת המחדל הגלובלי עבור \"טעינת מודולים\" בפרופילי אפליקציה. אם מופעל, זה יסיר את כל שינויי המודול למערכת עבור יישומים שאין להם ערכת פרופיל.</string>
|
||||||
|
<string name="home_module_count">מודלים:%d</string>
|
||||||
|
<string name="selinux_status_enforcing">אכיפה</string>
|
||||||
|
<string name="profile_selinux_context">הקשר SELinux</string>
|
||||||
|
<string name="home_fingerprint">טביעת אצבע</string>
|
||||||
|
<string name="profile_default">ברירת מחדל</string>
|
||||||
|
<string name="launch_app">להשיק</string>
|
||||||
|
<string name="safe_mode">מצב בטוח</string>
|
||||||
|
<string name="require_kernel_version">גרסת KernelSU הנוכחית %d נמוכה מדי כדי שהמנהל יפעל כראוי. אנא שדרג לגרסה %d ומעלה!</string>
|
||||||
|
<string name="reboot_recovery">הפעלה מחדש לריקברי</string>
|
||||||
|
<string name="reboot_userspace">רך Reboot</string>
|
||||||
|
<string name="profile_name">שם פרופיל</string>
|
||||||
|
<string name="home_support_content">KernelSU הוא, ותמיד יהיה, חינמי וקוד פתוח. עם זאת, תוכל להראות לנו שאכפת לך על ידי תרומה.</string>
|
||||||
|
<string name="uninstall">הסרה</string>
|
||||||
|
<string name="profile_namespace">טעינת מרחב שמות</string>
|
||||||
|
<string name="module_install">התקנה</string>
|
||||||
|
<string name="home_click_to_install">לחץ להתקנה</string>
|
||||||
|
<string name="profile_selinux_rules">כללים</string>
|
||||||
|
<string name="profile_groups">קבוצה</string>
|
||||||
|
<string name="module_overlay_fs_not_available">שכבות-על לא זמינות, המודול לא יכול לעבוד!</string>
|
||||||
|
<string name="module">מודולים</string>
|
||||||
|
<string name="module_author">יוצר</string>
|
||||||
|
<string name="about">אודות</string>
|
||||||
|
<string name="home_working_version">גרסה: %d</string>
|
||||||
|
<string name="reboot">הפעלה מחדש</string>
|
||||||
|
<string name="home_unsupported_reason">KernelSU תומך רק בליבת GKI כעת</string>
|
||||||
|
<string name="home_selinux_status">סטטוס SELinux</string>
|
||||||
|
<string name="hide_system_apps">הסתר אפליקציות מערכת</string>
|
||||||
|
<string name="module_version">גרסה</string>
|
||||||
|
<string name="home_unsupported">אינו נתמך</string>
|
||||||
|
<string name="profile_selinux_domain">תחום</string>
|
||||||
|
<string name="home">בית</string>
|
||||||
|
<string name="profile_custom">מותאם אישית</string>
|
||||||
|
<string name="profile_template">תבנית</string>
|
||||||
|
<string name="refresh">רענון</string>
|
||||||
|
<string name="module_downloading">מוריד מודל: %s</string>
|
||||||
|
<string name="module_update">עדכון</string>
|
||||||
|
<string name="home_learn_kernelsu">למד אודות KernelSU</string>
|
||||||
|
<string name="module_uninstall_confirm">האם אתה בטוח שברצונך להסיר את התקנת המודל %s\?</string>
|
||||||
|
<string name="module_uninstall_failed">הסרת התקנת %s נכשלה:</string>
|
||||||
|
<string name="superuser">משתמש על</string>
|
||||||
|
<string name="settings">הגדרות</string>
|
||||||
|
<string name="home_working">עובד</string>
|
||||||
|
<string name="module_failed_to_disable">השבתת מודל %s נכשלה:</string>
|
||||||
|
<string name="module_empty">אין מודלים מותקנים</string>
|
||||||
|
<string name="install">להתקין</string>
|
||||||
|
<string name="home_kernel">Kernel</string>
|
||||||
|
<string name="home_not_installed">לא מותקן</string>
|
||||||
|
<string name="failed_to_update_app_profile">נכשל עדכון פרופיל האפליקציה עבור %s</string>
|
||||||
|
<string name="home_learn_kernelsu_url">https://kernelsu.org/guide/what-is-kernelsu.html</string>
|
||||||
|
<string name="failed_to_update_sepolicy">נכשל עדכון כללי SELinux עבור: %s</string>
|
||||||
|
<string name="reboot_bootloader">הפעלה מחדש לבוטלאודר</string>
|
||||||
|
<string name="about_source_code">ראה את קוד המקור ב%1$s<br/>הצטרף אלינו %2$s בערוץ</string>
|
||||||
|
<string name="home_manager_version">גרסת מנהל</string>
|
||||||
|
<string name="new_version_available">גרסה חדשה עבור: %s זמינה, לחץ כדי לשדרג</string>
|
||||||
|
</resources>
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<resources>
|
<resources>
|
||||||
|
|
||||||
<string name="home">ホーム</string>
|
<string name="home">ホーム</string>
|
||||||
<string name="home_not_installed">未インストール</string>
|
<string name="home_not_installed">未インストール</string>
|
||||||
<string name="home_click_to_install">タップでインストール</string>
|
<string name="home_click_to_install">タップでインストール</string>
|
||||||
@@ -8,14 +8,12 @@
|
|||||||
<string name="home_superuser_count">スーパーユーザー: %d</string>
|
<string name="home_superuser_count">スーパーユーザー: %d</string>
|
||||||
<string name="home_module_count">モジュール: %d</string>
|
<string name="home_module_count">モジュール: %d</string>
|
||||||
<string name="home_unsupported">非対応</string>
|
<string name="home_unsupported">非対応</string>
|
||||||
<string name="home_unsupported_reason">KernelSU は現在、GKI カーネルにのみ対応しています</string>
|
<string name="home_unsupported_reason">現在、 KernelSU は GKI カーネルにのみ対応しています</string>
|
||||||
|
|
||||||
<string name="home_kernel">カーネル</string>
|
<string name="home_kernel">カーネル</string>
|
||||||
<string name="home_manager_version">バージョン</string>
|
<string name="home_manager_version">バージョン</string>
|
||||||
<string name="home_fingerprint">フィンガープリント</string>
|
<string name="home_fingerprint">Fingerprint</string>
|
||||||
|
|
||||||
<string name="home_selinux_status">SELinux の状態</string>
|
<string name="home_selinux_status">SELinux の状態</string>
|
||||||
<string name="selinux_status_disabled">無効</string>
|
<string name="selinux_status_disabled">Disabled</string>
|
||||||
<string name="selinux_status_enforcing">Enforcing</string>
|
<string name="selinux_status_enforcing">Enforcing</string>
|
||||||
<string name="selinux_status_permissive">Permissive</string>
|
<string name="selinux_status_permissive">Permissive</string>
|
||||||
<string name="selinux_status_unknown">不明</string>
|
<string name="selinux_status_unknown">不明</string>
|
||||||
@@ -23,16 +21,15 @@
|
|||||||
<string name="module_failed_to_enable">モジュールの有効化に失敗: %s</string>
|
<string name="module_failed_to_enable">モジュールの有効化に失敗: %s</string>
|
||||||
<string name="module_failed_to_disable">モジュールの無効化に失敗: %s</string>
|
<string name="module_failed_to_disable">モジュールの無効化に失敗: %s</string>
|
||||||
<string name="module_empty">モジュールをインストールしていません</string>
|
<string name="module_empty">モジュールをインストールしていません</string>
|
||||||
|
|
||||||
<string name="module">モジュール</string>
|
<string name="module">モジュール</string>
|
||||||
<string name="uninstall">アンインストール</string>
|
<string name="uninstall">アンインストール</string>
|
||||||
<string name="module_install">インストール</string>
|
<string name="module_install">インストール</string>
|
||||||
<string name="install">インストール</string>
|
<string name="install">インストール</string>
|
||||||
<string name="reboot">再起動</string>
|
<string name="reboot">再起動</string>
|
||||||
<string name="settings">設定</string>
|
<string name="settings">設定</string>
|
||||||
<string name="reboot_userspace">ソフトリブート</string>
|
<string name="reboot_userspace">通常の再起動</string>
|
||||||
<string name="reboot_recovery">リカバリーへ再起動</string>
|
<string name="reboot_recovery">リカバリーへ再起動</string>
|
||||||
<string name="reboot_bootloader">Bootloader へ再起動</string>
|
<string name="reboot_bootloader">ブートローダー へ再起動</string>
|
||||||
<string name="reboot_download">ダウンロードモードへ再起動</string>
|
<string name="reboot_download">ダウンロードモードへ再起動</string>
|
||||||
<string name="reboot_edl">EDLへ再起動</string>
|
<string name="reboot_edl">EDLへ再起動</string>
|
||||||
<string name="about">アプリについて</string>
|
<string name="about">アプリについて</string>
|
||||||
@@ -41,7 +38,7 @@
|
|||||||
<string name="module_uninstall_failed">アンインストールに失敗: %s</string>
|
<string name="module_uninstall_failed">アンインストールに失敗: %s</string>
|
||||||
<string name="module_version">バージョン</string>
|
<string name="module_version">バージョン</string>
|
||||||
<string name="module_author">制作者</string>
|
<string name="module_author">制作者</string>
|
||||||
<string name="module_overlay_fs_not_available">OverlayFS が有効でないためモジュールは動作しません</string>
|
<string name="module_overlay_fs_not_available">OverlayFS が有効でないためモジュールは動作しません!</string>
|
||||||
<string name="refresh">更新</string>
|
<string name="refresh">更新</string>
|
||||||
<string name="show_system_apps">システムアプリを表示</string>
|
<string name="show_system_apps">システムアプリを表示</string>
|
||||||
<string name="hide_system_apps">システムアプリを非表示</string>
|
<string name="hide_system_apps">システムアプリを非表示</string>
|
||||||
@@ -53,16 +50,35 @@
|
|||||||
<string name="home_learn_kernelsu_url">https://kernelsu.org/ja_JP/guide/what-is-kernelsu.html</string>
|
<string name="home_learn_kernelsu_url">https://kernelsu.org/ja_JP/guide/what-is-kernelsu.html</string>
|
||||||
<string name="home_click_to_learn_kernelsu">KernelSU のインストール方法やモジュールの使い方はこちら</string>
|
<string name="home_click_to_learn_kernelsu">KernelSU のインストール方法やモジュールの使い方はこちら</string>
|
||||||
<string name="home_support_title">支援する</string>
|
<string name="home_support_title">支援する</string>
|
||||||
<string name="home_support_content">KernelSU は無料かつオープンソースです。寄付していただくことで開発を支援できます。</string>
|
<string name="home_support_content">KernelSU はこれからもずっとフリーでオープンソースです。寄付をすることで私たちを気にかけていることを示せます。</string>
|
||||||
<string name="about_source_code"><![CDATA[%1$s でソースコードを表示<br/>%2$s チャンネルに参加]]></string>
|
<string name="about_source_code"><![CDATA[%1$s でソースコードを表示<br/>%2$s チャンネルに参加]]></string>
|
||||||
<string name="profile">アプリのプロファイル</string>
|
<string name="profile">アプリのプロファイル</string>
|
||||||
<string name="profile_default">デフォルト</string>
|
<string name="profile_default">既定</string>
|
||||||
<string name="profile_template">テンプレート</string>
|
<string name="profile_template">テンプレート</string>
|
||||||
<string name="profile_custom">カスタム</string>
|
<string name="profile_custom">カスタム</string>
|
||||||
<string name="profile_name">プロファイル名</string>
|
<string name="profile_name">プロファイル名</string>
|
||||||
<string name="profile_namespace">マウント名前空間</string>
|
<string name="profile_namespace">名前空間のマウント</string>
|
||||||
<string name="profile_namespace_inherited">継承</string>
|
<string name="profile_namespace_inherited">継承</string>
|
||||||
<string name="profile_namespace_global">グローバル</string>
|
<string name="profile_namespace_global">共通</string>
|
||||||
<string name="profile_namespace_individual">分離</string>
|
<string name="profile_namespace_individual">分離</string>
|
||||||
<string name="profile_umount_modules">モジュールのアンマウント</string>
|
<string name="profile_umount_modules">モジュールのアンマウント</string>
|
||||||
</resources>
|
<string name="profile_groups">グループ</string>
|
||||||
|
<string name="profile_selinux_context">SELinux コンテキスト</string>
|
||||||
|
<string name="failed_to_update_app_profile">%sのアプリのプロファイルの更新をできませでした</string>
|
||||||
|
<string name="profile_selinux_domain">ドメイン</string>
|
||||||
|
<string name="profile_selinux_rules">ルール</string>
|
||||||
|
<string name="new_version_available">新しいバージョン: %s が利用可能です。タップしてダウンロード</string>
|
||||||
|
<string name="module_update">アップデート</string>
|
||||||
|
<string name="module_start_downloading">ダウンロードを開始:%s</string>
|
||||||
|
<string name="launch_app">起動</string>
|
||||||
|
<string name="force_stop_app">強制停止</string>
|
||||||
|
<string name="restart_app">再起動</string>
|
||||||
|
<string name="failed_to_update_sepolicy">SELinux ルールの更新に失敗しました: %s</string>
|
||||||
|
<string name="profile_capabilities">ケーパビリティ</string>
|
||||||
|
<string name="module_downloading">モジュールをダウンロード中: %s</string>
|
||||||
|
<string name="profile_umount_modules_summary">このオプションを有効にすると、KernelSU はこのアプリのモジュールによって変更されたファイルを復元できるようになります。</string>
|
||||||
|
<string name="settings_umount_modules_default">既定でモジュールのマウントを解除</string>
|
||||||
|
<string name="settings_umount_modules_default_summary">アプリプロファイルの「モジュールのマウント解除」の共通既定値です。 有効にすると、プロファイル セットを持たないアプリでのシステムに対するすべてのモジュール変更が削除されます。</string>
|
||||||
|
<string name="require_kernel_version">現在の KernelSU バージョン %d はマネージャーが適切に機能するには低すぎます。 バージョン %d 以降にアップグレードしてください!</string>
|
||||||
|
<string name="module_changelog">変更履歴</string>
|
||||||
|
</resources>
|
||||||
69
manager/app/src/main/res/values-kn/strings.xml
Normal file
69
manager/app/src/main/res/values-kn/strings.xml
Normal file
@@ -0,0 +1,69 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<resources>
|
||||||
|
<string name="reboot_to_apply">ಪರಿಣಾಮ ಬೀರಲು ರೀಬೂಟ್ ಮಾಡಿ</string>
|
||||||
|
<string name="home_click_to_learn_kernelsu">KernelSU ಅನ್ನು ಹೇಗೆ ಸ್ಥಾಪಿಸಬೇಕು ಮತ್ತು ಮಾಡ್ಯೂಲ್ಗಳನ್ನು ಬಳಸುವುದು ಹೇಗೆ ಎಂದು ತಿಳಿಯಿರಿ</string>
|
||||||
|
<string name="selinux_status_unknown">ತಿಳಿಯದ</string>
|
||||||
|
<string name="show_system_apps">ಸಿಸ್ಟಮ್ ಅಪ್ಲಿಕೇಶನ್ಗಳನ್ನು ತೋರಿಸಿ</string>
|
||||||
|
<string name="module_uninstall_success">%s ಅನ್ಇನ್ಸ್ಟಾಲ್ ಮಾಡಲಾಗಿದೆ</string>
|
||||||
|
<string name="profile_umount_modules">Umount ಮಾಡ್ಯೂಲ್ಗಳು</string>
|
||||||
|
<string name="send_log">ಲಾಗ್ ಕಳುಹಿಸಿ</string>
|
||||||
|
<string name="home_support_title">ನಮ್ಮನ್ನು ಬೆಂಬಲಿಸಿ</string>
|
||||||
|
<string name="profile_namespace_inherited">ಪಿತ್ರಾರ್ಜಿತ</string>
|
||||||
|
<string name="module_magisk_conflict">ಮಾಡ್ಯೂಲ್ಗಳನ್ನು ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಲಾಗಿದೆ ಏಕೆಂದರೆ ಇದು ಮ್ಯಾಜಿಸ್ಕ್ನೊಂದಿಗೆ ಸಂಘರ್ಷವಾಗಿದೆ!</string>
|
||||||
|
<string name="module_changelog">ಚೇಂಜ್ಲಾಗ್</string>
|
||||||
|
<string name="selinux_status_permissive">Permissive</string>
|
||||||
|
<string name="settings_umount_modules_default">ಡೀಫಾಲ್ಟ್ ಆಗಿ Umount ಮಾಡ್ಯೂಲ್</string>
|
||||||
|
<string name="profile_umount_modules_summary">ಈ ಆಯ್ಕೆಯನ್ನು ಸಕ್ರಿಯಗೊಳಿಸುವುದರಿಂದ ಈ ಅಪ್ಲಿಕೇಶನ್ಗಾಗಿ ಮಾಡ್ಯೂಲ್ಗಳ ಮೂಲಕ ಯಾವುದೇ ಮಾರ್ಪಡಿಸಿದ ಫೈಲ್ಗಳನ್ನು ಮರುಸ್ಥಾಪಿಸಲು KernelSU ಗೆ ಅನುಮತಿಸುತ್ತದೆ.</string>
|
||||||
|
<string name="profile_namespace_individual">ವೈಯಕ್ತಿಕ</string>
|
||||||
|
<string name="module_failed_to_enable">ಮಾಡ್ಯೂಲ್ ಅನ್ನು ಸಕ್ರಿಯಗೊಳಿಸಲು ವಿಫಲವಾಗಿದೆ: %s</string>
|
||||||
|
<string name="force_stop_app">ಫೋರ್ಸ್ ಸ್ಟಾಪ್</string>
|
||||||
|
<string name="reboot_edl">EDL ಗೆ ರೀಬೂಟ್</string>
|
||||||
|
<string name="profile_capabilities">ಸಾಮರ್ಥ್ಯಗಳು</string>
|
||||||
|
<string name="home_superuser_count">ಸೂಪರ್ಯೂಸರ್ಗಳು: %d</string>
|
||||||
|
<string name="module_start_downloading">ಡೌನ್ಲೋಡ್ ಮಾಡುವುದನ್ನು ಪ್ರಾರಂಭಿಸಿ: %s</string>
|
||||||
|
<string name="profile_namespace_global">ಜಾಗತಿಕ</string>
|
||||||
|
<string name="settings_umount_modules_default_summary">ಅಪ್ಲಿಕೇಶನ್ ಪ್ರೊಫೈಲ್ಗಳಲ್ಲಿ \"Umount ಮಾಡ್ಯೂಲ್\" ಗಾಗಿ ಜಾಗತಿಕ ಡೀಫಾಲ್ಟ್ ಮೌಲ್ಯ. ಸಕ್ರಿಯಗೊಳಿಸಿದರೆ, ಪ್ರೊಫೈಲ್ ಸೆಟ್ ಅನ್ನು ಹೊಂದಿರದ ಅಪ್ಲಿಕೇಶನ್ಗಳಿಗಾಗಿ ಸಿಸ್ಟಮ್ಗೆ ಎಲ್ಲಾ ಮಾಡ್ಯೂಲ್ ಮಾರ್ಪಾಡುಗಳನ್ನು ಇದು ತೆಗೆದುಹಾಕುತ್ತದೆ.</string>
|
||||||
|
<string name="home_module_count">ಮಾಡ್ಯೂಲ್ಗಳು: %d</string>
|
||||||
|
<string name="profile_selinux_context">SELinux ಸಂದರ್ಭ</string>
|
||||||
|
<string name="profile_default">ಡೀಫಾಲ್ಟ್</string>
|
||||||
|
<string name="launch_app">ಲಾಂಚ್</string>
|
||||||
|
<string name="safe_mode">ಸುರಕ್ಷಿತ ಮೋಡ್</string>
|
||||||
|
<string name="require_kernel_version">ಪ್ರಸ್ತುತ KernelSU ಆವೃತ್ತಿ %d ಮ್ಯಾನೇಜರ್ ಸರಿಯಾಗಿ ಕಾರ್ಯನಿರ್ವಹಿಸಲು ತುಂಬಾ ಕಡಿಮೆಯಾಗಿದೆ. ದಯವಿಟ್ಟು ಆವೃತ್ತಿ %d ಅಥವಾ ಹೆಚ್ಚಿನದಕ್ಕೆ ಅಪ್ಗ್ರೇಡ್ ಮಾಡಿ!</string>
|
||||||
|
<string name="reboot_userspace">ಸಾಫ್ಟ್ ರೀಬೂಟ್</string>
|
||||||
|
<string name="profile_name">ಪ್ರೊಫೈಲ್ ಹೆಸರು</string>
|
||||||
|
<string name="home_support_content">KernelSU ಉಚಿತ ಮತ್ತು ಮುಕ್ತ ಮೂಲವಾಗಿದೆ ಮತ್ತು ಯಾವಾಗಲೂ ಇರುತ್ತದೆ. ಆದಾಗ್ಯೂ ನೀವು ದೇಣಿಗೆ ನೀಡುವ ಮೂಲಕ ನೀವು ಕಾಳಜಿ ವಹಿಸುತ್ತೀರಿ ಎಂದು ನಮಗೆ ತೋರಿಸಬಹುದು.</string>
|
||||||
|
<string name="uninstall">ಅನ್ಇನ್ಸ್ಟಾಲ್</string>
|
||||||
|
<string name="profile_namespace">ಮೌಂಟ್ ನೇಮ್ಸ್ಪೇಸ್</string>
|
||||||
|
<string name="profile_selinux_rules">ನಿಯಮಗಳು</string>
|
||||||
|
<string name="profile_groups">ಗುಂಪುಗಳು</string>
|
||||||
|
<string name="module_overlay_fs_not_available">ಓವರ್ಲೇಫ್ಗಳು ಲಭ್ಯವಿಲ್ಲ, ಮಾಡ್ಯೂಲ್ ಕಾರ್ಯನಿರ್ವಹಿಸುವುದಿಲ್ಲ!</string>
|
||||||
|
<string name="module">ಮಾಡ್ಯೂಲ್</string>
|
||||||
|
<string name="module_author">ಲೇಖಕ</string>
|
||||||
|
<string name="about">ಬಗ್ಗೆ</string>
|
||||||
|
<string name="home_working_version">ವರ್ಷನ್: %d</string>
|
||||||
|
<string name="reboot">ರೀಬೂಟ್</string>
|
||||||
|
<string name="home_unsupported_reason">KernelSU ಈಗ GKI ಕರ್ನಲ್ಗಳನ್ನು ಮಾತ್ರ ಬೆಂಬಲಿಸುತ್ತದೆ</string>
|
||||||
|
<string name="home_selinux_status">SELinux ಸ್ಥಿತಿ</string>
|
||||||
|
<string name="hide_system_apps">ಸಿಸ್ಟಮ್ ಅಪ್ಲಿಕೇಶನ್ಗಳನ್ನು ಮರೆಮಾಡಿ</string>
|
||||||
|
<string name="module_version">ವರ್ಷನ್</string>
|
||||||
|
<string name="home_unsupported">ಬೆಂಬಲಿತವಾಗಿಲ್ಲ</string>
|
||||||
|
<string name="profile_selinux_domain">ಡೊಮೇನ್</string>
|
||||||
|
<string name="home">ಮನೆ</string>
|
||||||
|
<string name="profile_custom">ಕಸ್ಟಮ್</string>
|
||||||
|
<string name="profile_template">ಟೆಂಪ್ಲೇಟ್</string>
|
||||||
|
<string name="refresh">ರಿಫ್ರೆಶ್</string>
|
||||||
|
<string name="module_downloading">ಮಾಡ್ಯೂಲ್ ಅನ್ನು ಡೌನ್ಲೋಡ್ ಮಾಡಲಾಗುತ್ತಿದೆ: %s</string>
|
||||||
|
<string name="home_learn_kernelsu">KernelSU ಕಲಿಯಿರಿ</string>
|
||||||
|
<string name="module_uninstall_confirm">%s ಮಾಡ್ಯೂಲ್ ಅನ್ನು ಅಸ್ಥಾಪಿಸಲು ನೀವು ಖಚಿತವಾಗಿ ಬಯಸುವಿರಾ\?</string>
|
||||||
|
<string name="module_uninstall_failed">ಅನ್ಇನ್ಸ್ಟಾಲ್ ಮಾಡಲು ವಿಫಲವಾಗಿದೆ: %s</string>
|
||||||
|
<string name="superuser">ಸೂಪರ್ಯೂಸರ್</string>
|
||||||
|
<string name="home_working">ಕೆಲಸ ಮಾಡುತ್ತಿದೆ</string>
|
||||||
|
<string name="module_failed_to_disable">ಮಾಡ್ಯೂಲ್ ಅನ್ನು ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಲು ವಿಫಲವಾಗಿದೆ: %s</string>
|
||||||
|
<string name="module_empty">ಮಾಡ್ಯೂಲ್ ಅನ್ನು ಸ್ಥಾಪಿಸಲಾಗಿಲ್ಲ</string>
|
||||||
|
<string name="home_kernel">ಕರ್ನಲ್</string>
|
||||||
|
<string name="failed_to_update_app_profile">%s ಗಾಗಿ ಅಪ್ಲಿಕೇಶನ್ ಪ್ರೊಫೈಲ್ ಅನ್ನು ನವೀಕರಿಸಲು ವಿಫಲವಾಗಿದೆ</string>
|
||||||
|
<string name="home_learn_kernelsu_url">https://kernelsu.org/guide/what-is-kernelsu.html</string>
|
||||||
|
<string name="about_source_code">%1$s ನಲ್ಲಿ ಮೂಲ ಕೋಡ್ ಅನ್ನು ವೀಕ್ಷಿಸಿ<br/>ನಮ್ಮ %2$s ಚಾನಲ್ಗೆ ಸೇರಿ</string>
|
||||||
|
<string name="home_manager_version">ಮ್ಯಾನೇಜರ್ ವರ್ಷನ್</string>
|
||||||
|
<string name="new_version_available">ಹೊಸ ಆವೃತ್ತಿ: %s ಲಭ್ಯವಿದೆ, ಅಪ್ಗ್ರೇಡ್ ಮಾಡಲು ಕ್ಲಿಕ್ ಮಾಡಿ</string>
|
||||||
|
</resources>
|
||||||
@@ -1,3 +1,4 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<resources>
|
<resources>
|
||||||
<string name="home">홈</string>
|
<string name="home">홈</string>
|
||||||
<string name="home_not_installed">설치되지 않음</string>
|
<string name="home_not_installed">설치되지 않음</string>
|
||||||
@@ -8,11 +9,9 @@
|
|||||||
<string name="home_module_count">설치된 모듈: %d개</string>
|
<string name="home_module_count">설치된 모듈: %d개</string>
|
||||||
<string name="home_unsupported">지원되지 않음</string>
|
<string name="home_unsupported">지원되지 않음</string>
|
||||||
<string name="home_unsupported_reason">KernelSU는 현재 GKI 커널만 지원합니다</string>
|
<string name="home_unsupported_reason">KernelSU는 현재 GKI 커널만 지원합니다</string>
|
||||||
|
|
||||||
<string name="home_kernel">커널</string>
|
<string name="home_kernel">커널</string>
|
||||||
<string name="home_manager_version">매니저 버전</string>
|
<string name="home_manager_version">매니저 버전</string>
|
||||||
<string name="home_fingerprint">빌드 정보</string>
|
<string name="home_fingerprint">빌드 정보</string>
|
||||||
|
|
||||||
<string name="home_selinux_status">SELinux 상태</string>
|
<string name="home_selinux_status">SELinux 상태</string>
|
||||||
<string name="selinux_status_disabled">비활성화됨</string>
|
<string name="selinux_status_disabled">비활성화됨</string>
|
||||||
<string name="selinux_status_enforcing">적용</string>
|
<string name="selinux_status_enforcing">적용</string>
|
||||||
@@ -22,7 +21,6 @@
|
|||||||
<string name="module_failed_to_enable">모듈 활성화 실패: %s</string>
|
<string name="module_failed_to_enable">모듈 활성화 실패: %s</string>
|
||||||
<string name="module_failed_to_disable">모듈 비활성화 실패: %s</string>
|
<string name="module_failed_to_disable">모듈 비활성화 실패: %s</string>
|
||||||
<string name="module_empty">설치된 모듈 없음</string>
|
<string name="module_empty">설치된 모듈 없음</string>
|
||||||
|
|
||||||
<string name="module">모듈</string>
|
<string name="module">모듈</string>
|
||||||
<string name="uninstall">삭제</string>
|
<string name="uninstall">삭제</string>
|
||||||
<string name="module_install">설치</string>
|
<string name="module_install">설치</string>
|
||||||
@@ -49,8 +47,35 @@
|
|||||||
<string name="reboot_to_apply">다시 시작하여 변경 사항 적용</string>
|
<string name="reboot_to_apply">다시 시작하여 변경 사항 적용</string>
|
||||||
<string name="module_magisk_conflict">Magisk와의 충돌로 인해 모듈을 사용할 수 없습니다!</string>
|
<string name="module_magisk_conflict">Magisk와의 충돌로 인해 모듈을 사용할 수 없습니다!</string>
|
||||||
<string name="home_learn_kernelsu">KernelSU 알아보기</string>
|
<string name="home_learn_kernelsu">KernelSU 알아보기</string>
|
||||||
<string name="home_click_to_learn_kernelsu">KernelSU 설치 방법과 모듈 사용 방법을 확인합니다.</string>
|
<string name="home_click_to_learn_kernelsu">KernelSU 설치 방법과 모듈 사용 방법을 확인합니다</string>
|
||||||
<string name="home_support_title">지원이 필요해요!</string>
|
<string name="home_support_title">지원이 필요합니다</string>
|
||||||
<string name="home_support_content">KernelSU는 지금도, 앞으로도 항상 무료이며 오픈 소스로 유지됩니다. 기부를 통해 여러분의 관심을 보여주세요.</string>
|
<string name="home_support_content">KernelSU는 지금도, 앞으로도 항상 무료이며 오픈 소스로 유지됩니다. 기부를 통해 여러분의 관심을 보여주세요.</string>
|
||||||
<string name="about_source_code"><![CDATA[%1$s에서 소스 코드 보기<br/>%2$s 채널 참가하기]]></string>
|
<string name="about_source_code"><![CDATA[%1$s에서 소스 코드 보기<br/>%2$s 채널 참가하기]]></string>
|
||||||
</resources>
|
<string name="home_learn_kernelsu_url">https://kernelsu.org/guide/what-is-kernelsu.html</string>
|
||||||
|
<string name="settings_umount_modules_default_summary">앱 프로필 메뉴의 \"모듈 사용 해제\" 설정에 대한 전역 기본값을 설정합니다. 활성화 시, 개별 프로필이 설정되지 않은 앱은 시스템에 대한 모듈의 모든 수정사항이 적용되지 않습니다.</string>
|
||||||
|
<string name="restart_app">다시 시작</string>
|
||||||
|
<string name="profile_selinux_rules">규칙</string>
|
||||||
|
<string name="new_version_available">새 버전: %s 사용 가능, 여기를 눌러서 받기</string>
|
||||||
|
<string name="module_start_downloading">다운로드 시작: %s</string>
|
||||||
|
<string name="force_stop_app">강제 중지</string>
|
||||||
|
<string name="profile_default">기본값</string>
|
||||||
|
<string name="profile_custom">사용자 지정</string>
|
||||||
|
<string name="profile_template">템플릿</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_umount_modules">모듈 사용 해제</string>
|
||||||
|
<string name="profile_selinux_context">SELinux 컨텍스트</string>
|
||||||
|
<string name="profile_capabilities">권한</string>
|
||||||
|
<string name="failed_to_update_app_profile">%s에 대한 앱 프로필 업데이트 실패</string>
|
||||||
|
<string name="settings_umount_modules_default">기본값으로 모듈 사용 해제</string>
|
||||||
|
<string name="profile_umount_modules_summary">이 옵션이 활성화되면, KernelSU는 이 애플리케이션에 대한 모듈의 모든 수정사항을 복구합니다.</string>
|
||||||
|
<string name="module_update">업데이트</string>
|
||||||
|
<string name="module_downloading">모듈 받는 중: %s</string>
|
||||||
|
<string name="profile_selinux_domain">도메인</string>
|
||||||
|
<string name="launch_app">실행</string>
|
||||||
|
<string name="failed_to_update_sepolicy">다음 앱에 대한 SELinux 규칙 업데이트 실패: %s</string>
|
||||||
|
</resources>
|
||||||
83
manager/app/src/main/res/values-lt/strings.xml
Normal file
83
manager/app/src/main/res/values-lt/strings.xml
Normal file
@@ -0,0 +1,83 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<resources>
|
||||||
|
<string name="home_fingerprint">Pirštų atspaudas</string>
|
||||||
|
<string name="selinux_status_disabled">Išjungta</string>
|
||||||
|
<string name="selinux_status_enforcing">Priverstinas</string>
|
||||||
|
<string name="selinux_status_unknown">Nežinomas</string>
|
||||||
|
<string name="superuser">Supernaudotojai</string>
|
||||||
|
<string name="module_failed_to_enable">Nepavyko įjungti modulio: %s</string>
|
||||||
|
<string name="module_failed_to_disable">Nepavyko išjungti modulio: %s</string>
|
||||||
|
<string name="selinux_status_permissive">Leistinas</string>
|
||||||
|
<string name="module_empty">Nėra įdiegtų modulių</string>
|
||||||
|
<string name="module">Moduliai</string>
|
||||||
|
<string name="reboot_userspace">Perkrovimas neišjungus</string>
|
||||||
|
<string name="reboot_recovery">Perkrauti į atkūrimo rėžimą</string>
|
||||||
|
<string name="reboot_bootloader">Perkrauti į įkrovos tvarkyklę</string>
|
||||||
|
<string name="reboot_download">Perkrauti į atsisiuntimo rėžimą</string>
|
||||||
|
<string name="about">Apie</string>
|
||||||
|
<string name="module_uninstall_failed">Nepavyko išdiegti: %s</string>
|
||||||
|
<string name="module_uninstall_success">%s išdiegtas</string>
|
||||||
|
<string name="module_version">Versija</string>
|
||||||
|
<string name="module_author">Autorius</string>
|
||||||
|
<string name="module_overlay_fs_not_available">overlayfs nepasiekiamas, modulis negali veikti!</string>
|
||||||
|
<string name="show_system_apps">Rodyti sistemos programas</string>
|
||||||
|
<string name="hide_system_apps">Slėpti sistemos programas</string>
|
||||||
|
<string name="send_log">Siųsti žurnalą</string>
|
||||||
|
<string name="reboot">Paleisti iš naujo</string>
|
||||||
|
<string name="refresh">Atšviežinti</string>
|
||||||
|
<string name="safe_mode">Saugus rėžimas</string>
|
||||||
|
<string name="reboot_to_apply">Paleiskite iš naujo, kad įsigaliotų</string>
|
||||||
|
<string name="module_magisk_conflict">Moduliai yra išjungti, nes jie konfliktuoja su Magisk\'s!</string>
|
||||||
|
<string name="home_learn_kernelsu_url">https://kernelsu.org/guide/what-is-kernelsu.html</string>
|
||||||
|
<string name="home_learn_kernelsu">Sužinokite apie KernelSU</string>
|
||||||
|
<string name="home_click_to_learn_kernelsu">Sužinokite, kaip įdiegti KernelSU ir naudoti modulius</string>
|
||||||
|
<string name="about_source_code">Peržiūrėkite šaltinio kodą %1$s<br/>Prisijunkite prie mūsų %2$s kanalo</string>
|
||||||
|
<string name="profile_default">Numatytas</string>
|
||||||
|
<string name="profile_template">Šablonas</string>
|
||||||
|
<string name="profile_custom">Pasirinktinis</string>
|
||||||
|
<string name="profile_name">Profilio pavadinimas</string>
|
||||||
|
<string name="profile_namespace">Prijungti vardų erdvę</string>
|
||||||
|
<string name="profile_namespace_inherited">Paveldėtas</string>
|
||||||
|
<string name="profile_namespace_global">Globalus</string>
|
||||||
|
<string name="profile_namespace_individual">Individualus</string>
|
||||||
|
<string name="profile_groups">Grupės</string>
|
||||||
|
<string name="profile_capabilities">Galimybės</string>
|
||||||
|
<string name="profile_selinux_context">SELinux kontekstas</string>
|
||||||
|
<string name="profile_umount_modules">Atjungti modulius</string>
|
||||||
|
<string name="settings_umount_modules_default">Atjungti modulius pagal numatytuosius parametrus</string>
|
||||||
|
<string name="profile_umount_modules_summary">Įjungus šią parinktį, KernelSU galės atkurti visus modulių modifikuotus failus šiai programai.</string>
|
||||||
|
<string name="profile_selinux_domain">Domenas</string>
|
||||||
|
<string name="profile_selinux_rules">Taisyklės</string>
|
||||||
|
<string name="module_update">Atnaujinti</string>
|
||||||
|
<string name="module_downloading">Atsisiunčiamas modulis: %s</string>
|
||||||
|
<string name="module_start_downloading">Pradedamas atsisiuntimas: %s</string>
|
||||||
|
<string name="new_version_available">Nauja versija: %s pasiekiama, spustelėkite norėdami atsinaujinti</string>
|
||||||
|
<string name="launch_app">Paleisti</string>
|
||||||
|
<string name="force_stop_app">Priversti sustoti</string>
|
||||||
|
<string name="restart_app">Perkrauti</string>
|
||||||
|
<string name="failed_to_update_sepolicy">Nepavyko atnaujinti SELinux taisyklių: %s</string>
|
||||||
|
<string name="home">Namai</string>
|
||||||
|
<string name="home_not_installed">Neįdiegta</string>
|
||||||
|
<string name="home_unsupported_reason">KernelSU dabar palaiko tik GKI branduolius</string>
|
||||||
|
<string name="home_click_to_install">Spustelėkite norėdami įdiegti</string>
|
||||||
|
<string name="home_working">Veikia</string>
|
||||||
|
<string name="home_superuser_count">Supernaudotojai: %d</string>
|
||||||
|
<string name="home_working_version">Versija: %d</string>
|
||||||
|
<string name="home_unsupported">Nepalaikoma</string>
|
||||||
|
<string name="home_module_count">Moduliai: %d</string>
|
||||||
|
<string name="home_manager_version">Tvarkyklės versija</string>
|
||||||
|
<string name="home_kernel">Branduolys</string>
|
||||||
|
<string name="home_selinux_status">SELinux statusas</string>
|
||||||
|
<string name="uninstall">Išdiegti</string>
|
||||||
|
<string name="module_install">Įdiegti</string>
|
||||||
|
<string name="install">Įdiegti</string>
|
||||||
|
<string name="settings">Parametrai</string>
|
||||||
|
<string name="reboot_edl">Perkrauti į EDL</string>
|
||||||
|
<string name="module_uninstall_confirm">Ar tikrai norite išdiegti modulį %s\?</string>
|
||||||
|
<string name="home_support_title">Paremkite mus</string>
|
||||||
|
<string name="home_support_content">KernelSU yra ir visada bus nemokamas ir atvirojo kodo. Tačiau galite parodyti, kad jums rūpi, paaukodami mums.</string>
|
||||||
|
<string name="failed_to_update_app_profile">Nepavyko atnaujinti programos profilio %s</string>
|
||||||
|
<string name="settings_umount_modules_default_summary">Visuotinė numatytoji „Modulių atjungimo“ reikšmė programų profiliuose. Jei įjungta, ji pašalins visus sistemos modulio pakeitimus programoms, kurios neturi profilio.</string>
|
||||||
|
<string name="module_changelog">Keitimų žurnalas</string>
|
||||||
|
<string name="require_kernel_version">Ši KernelSU versija %d yra per žema, kad šis vadybininkas galėtų tinkamai funkcionuoti. Prašome atsinaujinti į versiją %d ar aukščiau!</string>
|
||||||
|
</resources>
|
||||||
81
manager/app/src/main/res/values-mr/strings.xml
Normal file
81
manager/app/src/main/res/values-mr/strings.xml
Normal file
@@ -0,0 +1,81 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<resources>
|
||||||
|
<string name="home_not_installed">इंस्टॉल केले नाही</string>
|
||||||
|
<string name="home">होम</string>
|
||||||
|
<string name="home_click_to_install">इंस्टॉल साठी क्लिक करा</string>
|
||||||
|
<string name="home_working">कार्यरत</string>
|
||||||
|
<string name="home_working_version">आवृत्ती: %d</string>
|
||||||
|
<string name="home_module_count">मॉड्यूल्स: %d</string>
|
||||||
|
<string name="home_superuser_count">सुपरयूझर: %d</string>
|
||||||
|
<string name="home_unsupported">असमर्थित</string>
|
||||||
|
<string name="home_unsupported_reason">KernelSU आता फक्त GKI कर्नलचे समर्थन करते</string>
|
||||||
|
<string name="home_kernel">कर्नल</string>
|
||||||
|
<string name="home_fingerprint">फिंगरप्रिंट</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="install">स्थापित करा</string>
|
||||||
|
<string name="module_empty">कोणतेही मॉड्यूल स्थापित केलेले नाही</string>
|
||||||
|
<string name="reboot">रीबूट करा</string>
|
||||||
|
<string name="superuser">सुपरयुझर</string>
|
||||||
|
<string name="module_failed_to_enable">मॉड्यूल सक्षम करण्यात अयशस्वी: %s</string>
|
||||||
|
<string name="uninstall">विस्थापित करा</string>
|
||||||
|
<string name="module_failed_to_disable">मॉड्यूल अक्षम करण्यात अयशस्वी: %s</string>
|
||||||
|
<string name="module">मॉड्यूल</string>
|
||||||
|
<string name="module_install">स्थापित करा</string>
|
||||||
|
<string name="settings">सेटिंग्ज</string>
|
||||||
|
<string name="reboot_userspace">सॉफ्ट रीबूट</string>
|
||||||
|
<string name="about">बद्दल</string>
|
||||||
|
<string name="reboot_edl">EDL वर रीबूट करा</string>
|
||||||
|
<string name="module_uninstall_confirm">तुमची खात्री आहे की तुम्ही मॉड्यूल %s विस्थापित करू इच्छिता\?</string>
|
||||||
|
<string name="module_uninstall_failed">विस्थापित करण्यात अयशस्वी: %s</string>
|
||||||
|
<string name="module_overlay_fs_not_available">overlayfs उपलब्ध नाही, मॉड्यूल काम करू शकत नाही!</string>
|
||||||
|
<string name="show_system_apps">सिस्टम अॅप्स दाखवा</string>
|
||||||
|
<string name="reboot_bootloader">बूटलोडरवर रीबूट करा</string>
|
||||||
|
<string name="module_uninstall_success">%s विस्थापित</string>
|
||||||
|
<string name="module_version">आवृत्ती</string>
|
||||||
|
<string name="module_author">लेखक</string>
|
||||||
|
<string name="refresh">रिफ्रेश करा</string>
|
||||||
|
<string name="reboot_recovery">रिकवरी मध्ये रिबुट करा</string>
|
||||||
|
<string name="reboot_download">डाउनलोड करण्यासाठी रीबूट करा</string>
|
||||||
|
<string name="send_log">लॉग पाठवा</string>
|
||||||
|
<string name="safe_mode">सुरक्षित मोड</string>
|
||||||
|
<string name="hide_system_apps">सिस्टम अॅप्स लपवा</string>
|
||||||
|
<string name="reboot_to_apply">प्रभावी होण्यासाठी रीबूट करा</string>
|
||||||
|
<string name="home_learn_kernelsu">KernelSU शिका</string>
|
||||||
|
<string name="home_learn_kernelsu_url">https://kernelsu.org/guide/what-is-kernelsu.html</string>
|
||||||
|
<string name="module_magisk_conflict">मॉड्यूल अक्षम केले आहेत कारण ते Magisk च्या विरोधाभास आहे!</string>
|
||||||
|
<string name="home_click_to_learn_kernelsu">KernelSU कसे स्थापित करायचे आणि मॉड्यूल कसे वापरायचे ते शिका</string>
|
||||||
|
<string name="home_support_content">KernelSU विनामूल्य आणि मुक्त स्रोत आहे, आणि नेहमीच असेल. तथापि, देणगी देऊन तुम्ही आम्हाला दाखवू शकता की तुमची काळजी आहे.</string>
|
||||||
|
<string name="home_support_title">आम्हाला पाठिंबा द्या</string>
|
||||||
|
<string name="profile_custom">कस्टम</string>
|
||||||
|
<string name="profile_namespace">माउंट नेमस्पेस</string>
|
||||||
|
<string name="profile_default">डीफॉल्ट</string>
|
||||||
|
<string name="profile_template">साचा</string>
|
||||||
|
<string name="profile_namespace_individual">वैयक्तिक</string>
|
||||||
|
<string name="profile_capabilities">क्षमता</string>
|
||||||
|
<string name="about_source_code">%1$s वर स्रोत कोड पहा<br/>आमच्या %2$s चॅनेलमध्ये सामील व्हा</string>
|
||||||
|
<string name="profile_name">प्रोफाइल नाव</string>
|
||||||
|
<string name="profile_namespace_inherited">इनहेरीटेड</string>
|
||||||
|
<string name="profile_namespace_global">जागतिक</string>
|
||||||
|
<string name="profile_groups">गट</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="settings_umount_modules_default">डीफॉल्टनुसार मॉड्यूल्स उमाउंट करा</string>
|
||||||
|
<string name="settings_umount_modules_default_summary">अॅप प्रोफाइलमधील \"उमाउंट मॉड्यूल्स\" साठी जागतिक डीफॉल्ट मूल्य. सक्षम असल्यास, ते प्रोफाइल सेट नसलेल्या ॲप्लिकेशनचे सिस्टममधील सर्व मॉड्यूल बदल काढून टाकेल.</string>
|
||||||
|
<string name="profile_umount_modules_summary">हा पर्याय सक्षम केल्याने KernelSU ला या ऍप्लिकेशनसाठी मॉड्यूल्सद्वारे कोणत्याही सुधारित फाइल्स पुनर्संचयित करण्यास अनुमती मिळेल.</string>
|
||||||
|
<string name="failed_to_update_sepolicy">यासाठी SELinux नियम अपडेट करण्यात अयशस्वी: %s</string>
|
||||||
|
<string name="profile_selinux_rules">नियम</string>
|
||||||
|
<string name="module_update">अपडेट करा</string>
|
||||||
|
<string name="profile_selinux_domain">डोमेन</string>
|
||||||
|
<string name="module_downloading">मॉड्यूल डाउनलोड करत आहे: %s</string>
|
||||||
|
<string name="module_start_downloading">डाउनलोड करणे सुरू करा: %s</string>
|
||||||
|
<string name="new_version_available">नवीन आवृत्ती: %s उपलब्ध आहे, डाउनलोड करण्यासाठी क्लिक करा</string>
|
||||||
|
<string name="force_stop_app">सक्तीने थांबा</string>
|
||||||
|
<string name="launch_app">लाँच करा</string>
|
||||||
|
<string name="restart_app">पुन्हा सुरू करा</string>
|
||||||
|
</resources>
|
||||||
@@ -1,30 +1,26 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<resources>
|
<resources>
|
||||||
<string name="app_name" translatable="false">KernelSU</string>
|
|
||||||
|
|
||||||
<string name="home">Home</string>
|
<string name="home">Home</string>
|
||||||
<string name="home_not_installed">Niet geïnstalleerd</string>
|
<string name="home_not_installed">Niet geïnstalleerd</string>
|
||||||
<string name="home_click_to_install">Klik om te installeren</string>
|
<string name="home_click_to_install">Klik om te installeren</string>
|
||||||
<string name="home_working">Werkend</string>
|
<string name="home_working">Werkend</string>
|
||||||
<string name="home_working_version">Versie: %d</string>
|
<string name="home_working_version">Versie: %d</string>
|
||||||
<string name="home_superuser_count">Superusers: %d</string>
|
<string name="home_superuser_count">Supergebruikers: %d</string>
|
||||||
<string name="home_module_count">Modules: %d</string>
|
<string name="home_module_count">Modules: %d</string>
|
||||||
<string name="home_unsupported">Niet ondersteund</string>
|
<string name="home_unsupported">Niet ondersteund</string>
|
||||||
<string name="home_unsupported_reason">KernelSU ondersteunt alleen GKI kernels</string>
|
<string name="home_unsupported_reason">KernelSU ondersteunt alleen GKI kernels</string>
|
||||||
|
|
||||||
<string name="home_kernel">Kernel</string>
|
<string name="home_kernel">Kernel</string>
|
||||||
<string name="home_manager_version">Manager Versie</string>
|
<string name="home_manager_version">Manager Versie</string>
|
||||||
<string name="home_fingerprint">Fingerprint</string>
|
<string name="home_fingerprint">Fingerprint</string>
|
||||||
|
|
||||||
<string name="home_selinux_status">SELinux status</string>
|
<string name="home_selinux_status">SELinux status</string>
|
||||||
<string name="selinux_status_disabled">Uitgeschakeld</string>
|
<string name="selinux_status_disabled">Uitgeschakeld</string>
|
||||||
<string name="selinux_status_enforcing">Afgedwongen</string>
|
<string name="selinux_status_enforcing">Afgedwongen</string>
|
||||||
<string name="selinux_status_permissive">Permissief</string>
|
<string name="selinux_status_permissive">Permissief</string>
|
||||||
<string name="selinux_status_unknown">Niet gekend</string>
|
<string name="selinux_status_unknown">Niet gekend</string>
|
||||||
<string name="superuser">Superuser</string>
|
<string name="superuser">Supergebruiker</string>
|
||||||
<string name="module_failed_to_enable">Mislukt om module in te schakelen: %s</string>
|
<string name="module_failed_to_enable">Mislukt om module in te schakelen: %s</string>
|
||||||
<string name="module_failed_to_disable">Mislukt om module uit te schakelen: %s</string>
|
<string name="module_failed_to_disable">Mislukt om module uit te schakelen: %s</string>
|
||||||
<string name="module_empty">Geen module geïnstalleerd</string>
|
<string name="module_empty">Geen module geïnstalleerd</string>
|
||||||
|
|
||||||
<string name="module">Module</string>
|
<string name="module">Module</string>
|
||||||
<string name="uninstall">Verwijderen</string>
|
<string name="uninstall">Verwijderen</string>
|
||||||
<string name="module_install">Installeren</string>
|
<string name="module_install">Installeren</string>
|
||||||
@@ -70,7 +66,6 @@
|
|||||||
<string name="profile_selinux_context">SELinux context</string>
|
<string name="profile_selinux_context">SELinux context</string>
|
||||||
<string name="profile_umount_modules">Ontkoppel modules</string>
|
<string name="profile_umount_modules">Ontkoppel modules</string>
|
||||||
<string name="failed_to_update_app_profile">Mislukt om App Profiel te updaten voor %s</string>
|
<string name="failed_to_update_app_profile">Mislukt om App Profiel te updaten voor %s</string>
|
||||||
<string name="require_kernel_version">De bestaande kernel versie %d is te laag voor de manager om goed te werken. Upgrade best tot versie %d of hoger!</string>
|
|
||||||
<string name="settings_umount_modules_default">Ontkoppel standaard de modules</string>
|
<string name="settings_umount_modules_default">Ontkoppel standaard de modules</string>
|
||||||
<string name="settings_umount_modules_default_summary">De globale standaard waarde voor \"Ontkoppel modules\" in App Profielen. Indien geactiveerd, zal het alle module wijzigingen tot het systeem verwijderen voor applicaties die geen Profiel ingesteld hebben.</string>
|
<string name="settings_umount_modules_default_summary">De globale standaard waarde voor \"Ontkoppel modules\" in App Profielen. Indien geactiveerd, zal het alle module wijzigingen tot het systeem verwijderen voor applicaties die geen Profiel ingesteld hebben.</string>
|
||||||
<string name="profile_umount_modules_summary">Met deze optie ingeschakeld zal KernelSU toelaten om alle gewijzigde bestanden door de modules voor deze applicatie te herstellen.</string>
|
<string name="profile_umount_modules_summary">Met deze optie ingeschakeld zal KernelSU toelaten om alle gewijzigde bestanden door de modules voor deze applicatie te herstellen.</string>
|
||||||
@@ -79,4 +74,10 @@
|
|||||||
<string name="module_update">Update</string>
|
<string name="module_update">Update</string>
|
||||||
<string name="module_downloading">Downloaden van module: %s</string>
|
<string name="module_downloading">Downloaden van module: %s</string>
|
||||||
<string name="new_version_available">Nieuwe versie: %s is beschikbaar, klik om te downloaden</string>
|
<string name="new_version_available">Nieuwe versie: %s is beschikbaar, klik om te downloaden</string>
|
||||||
</resources>
|
<string name="launch_app">Start</string>
|
||||||
|
<string name="force_stop_app">Forceer Stop</string>
|
||||||
|
<string name="restart_app">Herstart</string>
|
||||||
|
<string name="module_start_downloading">Begin met downloaden: %s</string>
|
||||||
|
<string name="failed_to_update_sepolicy">Kan SELinux-regels niet bijwerken voor: %s</string>
|
||||||
|
<string name="require_kernel_version">De huidige KernelSU-versie %d is te laag om de manager correct te laten functioneren. Upgrade naar versie %d of hoger!</string>
|
||||||
|
</resources>
|
||||||
85
manager/app/src/main/res/values-pl/strings.xml
Normal file
85
manager/app/src/main/res/values-pl/strings.xml
Normal file
@@ -0,0 +1,85 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<resources>
|
||||||
|
<string name="app_name" translatable="false">KernelSU</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żytkowników: %d</string>
|
||||||
|
<string name="home_module_count">Modułów: %d</string>
|
||||||
|
<string name="home_unsupported">Nieobsługiwany</string>
|
||||||
|
<string name="home_unsupported_reason">KernelSU obsługuje obecnie tylko jądra GKI</string>
|
||||||
|
<string name="home_kernel">Jądro</string>
|
||||||
|
<string name="home_manager_version">Wersja menedżera</string>
|
||||||
|
<string name="home_fingerprint">Odcisk</string>
|
||||||
|
<string name="home_selinux_status">Status SELinux</string>
|
||||||
|
<string name="selinux_status_disabled">Wyłączony</string>
|
||||||
|
<string name="selinux_status_enforcing">Enforcing</string>
|
||||||
|
<string name="selinux_status_permissive">Permissive</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">Brak zainstalowanych modułów</string>
|
||||||
|
<string name="module">Moduły</string>
|
||||||
|
<string name="uninstall">Odinstaluj</string>
|
||||||
|
<string name="module_install">Instaluj</string>
|
||||||
|
<string name="install">Instaluj</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 Bootloader</string>
|
||||||
|
<string name="reboot_download">Restart do trybu Download</string>
|
||||||
|
<string name="reboot_edl">Restart do trybu EDL</string>
|
||||||
|
<string name="about">Informacje</string>
|
||||||
|
<string name="module_uninstall_confirm">Czy na pewno chcesz odinstalować moduł %s?</string>
|
||||||
|
<string name="module_uninstall_success">Odinstalowano %s</string>
|
||||||
|
<string name="module_uninstall_failed">Nie udało się odinstalować:: %s</string>
|
||||||
|
<string name="module_version">Wersja</string>
|
||||||
|
<string name="module_author">Autor</string>
|
||||||
|
<string name="module_overlay_fs_not_available">overlayfs jest niedostępny, moduł nie zadziała!</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="send_log">Wyślij log</string>
|
||||||
|
<string name="safe_mode">Tryb bezpieczny</string>
|
||||||
|
<string name="reboot_to_apply">Uruchom ponownie, aby zastosować zmiany</string>
|
||||||
|
<string name="module_magisk_conflict">Moduły są wyłączone, ponieważ są w konflikcie z modułami Magiska!</string>
|
||||||
|
<string name="home_learn_kernelsu">Poznaj KernelSU</string>
|
||||||
|
<string name="home_learn_kernelsu_url">https://kernelsu.org/guide/what-is-kernelsu.html</string>
|
||||||
|
<string name="home_click_to_learn_kernelsu">Dowiedz się jak zainstalować KernelSU i jak korzystać z modułów.</string>
|
||||||
|
<string name="home_support_title">Wesprzyj nas</string>
|
||||||
|
<string name="home_support_content">KernelSU jest i zawsze będzie darmowy oraz otwarty. Niemniej jednak możesz nam pokazać, że Ci zależy, wysyłając darowiznę.</string>
|
||||||
|
<string name="about_source_code"><![CDATA[Przejrzyj kod źródłowy na %1$s<br/>Dołącz do kanału %2$s]]></string>
|
||||||
|
<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="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 profilach aplikacji. Jeśli jest włączona, odwraca wszystkie modyfikacje dokonane przez moduły dla aplikacji, które nie mają ustawionego profilu.</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="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="require_kernel_version">Obecna wersja KernelSU %d jest zbyt stara, aby menedżer działał poprawnie. Prosimy o aktualizację do wersji %d lub nowszej!</string>
|
||||||
|
<string name="module_changelog">Dziennik zmian</string>
|
||||||
|
</resources>
|
||||||
@@ -1,60 +1,56 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<resources>
|
<resources>
|
||||||
<string name="app_name" translatable="false">KernelSU</string>
|
|
||||||
|
|
||||||
<string name="home">Início</string>
|
<string name="home">Início</string>
|
||||||
<string name="home_not_installed">Não instalado</string>
|
<string name="home_not_installed">Não instalado</string>
|
||||||
<string name="home_click_to_install">Clique para instalar</string>
|
<string name="home_click_to_install">Clique para instalar</string>
|
||||||
<string name="home_working">Em Execução</string>
|
<string name="home_working">Em execução</string>
|
||||||
<string name="home_working_version">Versão: %d</string>
|
<string name="home_working_version">Versão: %d</string>
|
||||||
<string name="home_superuser_count">Superusuários: %d</string>
|
<string name="home_superuser_count">Superusuários: %d</string>
|
||||||
<string name="home_module_count">Módulos: %d</string>
|
<string name="home_module_count">Módulos: %d</string>
|
||||||
<string name="home_unsupported">Sem Suporte</string>
|
<string name="home_unsupported">Sem suporte</string>
|
||||||
<string name="home_unsupported_reason">Por enquanto, KernelSU suporta apenas kernels GKI</string>
|
<string name="home_unsupported_reason">KernelSU suporta apenas kernels GKI agora</string>
|
||||||
|
|
||||||
<string name="home_kernel">Kernel</string>
|
<string name="home_kernel">Kernel</string>
|
||||||
<string name="home_manager_version">Versão do gerenciador</string>
|
<string name="home_manager_version">Versão do gerenciador</string>
|
||||||
<string name="home_fingerprint">Impressão digital</string>
|
<string name="home_fingerprint">Impressão digital</string>
|
||||||
|
|
||||||
<string name="home_selinux_status">Status do SELinux</string>
|
<string name="home_selinux_status">Status do SELinux</string>
|
||||||
<string name="selinux_status_disabled">Desabilitado</string>
|
<string name="selinux_status_disabled">Desabilitado</string>
|
||||||
<string name="selinux_status_enforcing">Enforcing</string>
|
<string name="selinux_status_enforcing">Execução</string>
|
||||||
<string name="selinux_status_permissive">Permissive</string>
|
<string name="selinux_status_permissive">Permissivo</string>
|
||||||
<string name="selinux_status_unknown">Desconhecido</string>
|
<string name="selinux_status_unknown">Desconhecido</string>
|
||||||
<string name="superuser">Superusuário</string>
|
<string name="superuser">Superusuário</string>
|
||||||
<string name="module_failed_to_enable">Falha ao ativar o módulo: %s</string>
|
<string name="module_failed_to_enable">Falha ao ativar o módulo: %s</string>
|
||||||
<string name="module_failed_to_disable">Falha ao desativar o módulo: %s</string>
|
<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_empty">Nenhum módulo instalado</string>
|
||||||
|
<string name="module">Módulos</string>
|
||||||
<string name="module">Módulo</string>
|
|
||||||
<string name="uninstall">Desinstalar</string>
|
<string name="uninstall">Desinstalar</string>
|
||||||
<string name="module_install">Instalar</string>
|
<string name="module_install">Instalar</string>
|
||||||
<string name="install">Instalar</string>
|
<string name="install">Instalar</string>
|
||||||
<string name="reboot">Reiniciar</string>
|
<string name="reboot">Reiniciar</string>
|
||||||
<string name="settings">Configurações</string>
|
<string name="settings">Configurações</string>
|
||||||
<string name="reboot_userspace">Reinicialização suave</string>
|
<string name="reboot_userspace">Reinicialização suave</string>
|
||||||
<string name="reboot_recovery">Reiniciar para recuperação</string>
|
<string name="reboot_recovery">Reiniciar em modo Recovery</string>
|
||||||
<string name="reboot_bootloader">Reiniciar para bootloader</string>
|
<string name="reboot_bootloader">Reiniciar em modo Bootloader</string>
|
||||||
<string name="reboot_download">Reiniciar para download</string>
|
<string name="reboot_download">Reiniciar em modo Download</string>
|
||||||
<string name="reboot_edl">Reiniciar para EDL</string>
|
<string name="reboot_edl">Reiniciar em modo EDL</string>
|
||||||
<string name="about">Sobre</string>
|
<string name="about">Sobre</string>
|
||||||
<string name="module_uninstall_confirm">Tem certeza de que deseja desinstalar o módulo %s?</string>
|
<string name="module_uninstall_confirm">Tem certeza de que deseja desinstalar o módulo %s?</string>
|
||||||
<string name="module_uninstall_success">%s desinstalado</string>
|
<string name="module_uninstall_success">%s desinstalado</string>
|
||||||
<string name="module_uninstall_failed">Falha ao desinstalar: %s</string>
|
<string name="module_uninstall_failed">Falha ao desinstalar: %s</string>
|
||||||
<string name="module_version">Versão</string>
|
<string name="module_version">Versão</string>
|
||||||
<string name="module_author">Autor</string>
|
<string name="module_author">Autor</string>
|
||||||
<string name="module_overlay_fs_not_available">overlayfs não está disponível, o módulo não funcionará!</string>
|
<string name="module_overlay_fs_not_available">overlayfs não está disponível, o módulo não pode funcionar!</string>
|
||||||
<string name="refresh">Atualizar</string>
|
<string name="refresh">Atualizar</string>
|
||||||
<string name="show_system_apps">Mostrar aplicativos do sistema</string>
|
<string name="show_system_apps">Mostrar apps do sistema</string>
|
||||||
<string name="hide_system_apps">Ocultar aplicativos do sistema</string>
|
<string name="hide_system_apps">Ocultar apps do sistema</string>
|
||||||
<string name="send_log">Enviar log</string>
|
<string name="send_log">Enviar Log</string>
|
||||||
<string name="safe_mode">Modo de segurança</string>
|
<string name="safe_mode">Modo de segurança</string>
|
||||||
<string name="reboot_to_apply">Reinicie para entrar em vigor</string>
|
<string name="reboot_to_apply">Reinicie para entrar em vigor</string>
|
||||||
<string name="module_magisk_conflict">Os módulos estão desativados porque entraram em conflito com o Magisk\'s!</string>
|
<string name="module_magisk_conflict">Os módulos estão desativados porque estão em conflito com os do Magisk!</string>
|
||||||
<string name="home_learn_kernelsu">Leia mais sobre KernelSU</string>
|
<string name="home_learn_kernelsu">Leia mais sobre o KernelSU</string>
|
||||||
<string name="home_learn_kernelsu_url">https://kernelsu.org/guide/what-is-kernelsu.html</string>
|
<string name="home_learn_kernelsu_url">https://kernelsu.org/guide/what-is-kernelsu.html</string>
|
||||||
<string name="home_click_to_learn_kernelsu">Saiba como instalar o KernelSU e usar os módulos</string>
|
<string name="home_click_to_learn_kernelsu">Aprenda a instalar o KernelSU e usar os módulos</string>
|
||||||
<string name="home_support_title">Apoie-nos</string>
|
<string name="home_support_title">Apoie-nos</string>
|
||||||
<string name="home_support_content">O KernelSU é, e sempre será, gratuito e de código aberto. No entanto, você pode mostrar seu apoio fazendo uma doação.</string>
|
<string name="home_support_content">KernelSU sempre foi e sempre será, gratuito e de código aberto. No entanto, você pode agradecer enviando uma pequena doação.</string>
|
||||||
<string name="about_source_code"><![CDATA[Veja o código-fonte no %1$s<br/>Junte-se ao nosso canal do %2$s]]></string>
|
<string name="about_source_code"><![CDATA[Veja o código-fonte no %1$s<br/>Junte-se ao nosso canal do %2$s]]></string>
|
||||||
<string name="profile" translatable="false">Perfil do Aplicativo</string>
|
<string name="profile" translatable="false">Perfil do Aplicativo</string>
|
||||||
<string name="profile_default">Padrão</string>
|
<string name="profile_default">Padrão</string>
|
||||||
@@ -62,16 +58,27 @@
|
|||||||
<string name="profile_custom">Personalizado</string>
|
<string name="profile_custom">Personalizado</string>
|
||||||
<string name="profile_name">Nome do perfil</string>
|
<string name="profile_name">Nome do perfil</string>
|
||||||
<string name="profile_namespace">Montar namespace</string>
|
<string name="profile_namespace">Montar namespace</string>
|
||||||
<string name="profile_namespace_inherited">Padrão</string>
|
<string name="profile_namespace_inherited">Herdado</string>
|
||||||
<string name="profile_namespace_global">Global</string>
|
<string name="profile_namespace_global">Global</string>
|
||||||
<string name="profile_namespace_individual">Individual</string>
|
<string name="profile_namespace_individual">Individual</string>
|
||||||
<string name="profile_groups">Grupos</string>
|
<string name="profile_groups">Grupos</string>
|
||||||
<string name="profile_capabilities">Permissões</string>
|
<string name="profile_capabilities">Capacidades</string>
|
||||||
<string name="profile_selinux_context">Contexto do SELinux</string>
|
<string name="profile_selinux_context">Contexto do SELinux</string>
|
||||||
<string name="profile_umount_modules">Módulos não montados</string>
|
<string name="profile_umount_modules">Módulos não montados</string>
|
||||||
<string name="failed_to_update_app_profile">Falha ao atualizar o perfil do aplicativo para %s</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 kernel %d é muito baixa para o gerenciador funcionar corretamente. Atualize para a versão %d ou superior!</string>
|
|
||||||
<string name="settings_umount_modules_default">Não montar módulos por padrão</string>
|
<string name="settings_umount_modules_default">Não montar módulos por padrão</string>
|
||||||
<string name="settings_umount_modules_default_summary">O valor padrão global para \"Módulos não montados\" em perfis de aplicativos. Se ativado, removerá todas as modificações do módulo do sistema para aplicativos que não possuem um perfil definido.</string>
|
<string name="settings_umount_modules_default_summary">O valor padrão global para \"Módulos não montados\" em Perfis de Aplicativos. Se ativado, removerá todas as modificações do módulo do sistema para apps que não possuem um Perfil definido.</string>
|
||||||
<string name="profile_umount_modules_summary">Ativar esta opção permitirá que o KernelSU restaure quaisquer arquivos modificados pelos módulos para este aplicativo.</string>
|
<string name="profile_umount_modules_summary">Ativar esta opção permitirá que o KernelSU restaure quaisquer arquivos modificados pelos módulos para este app.</string>
|
||||||
</resources>
|
<string name="profile_selinux_domain">Domínio</string>
|
||||||
|
<string name="profile_selinux_rules">Regras</string>
|
||||||
|
<string name="module_update">Atualizar</string>
|
||||||
|
<string name="module_downloading">Baixando módulo: %s</string>
|
||||||
|
<string name="module_start_downloading">Iniciar o download: %s</string>
|
||||||
|
<string name="new_version_available">Nova versão: %s está disponível, clique para atualizar</string>
|
||||||
|
<string name="launch_app">Iniciar</string>
|
||||||
|
<string name="force_stop_app">Forçar parada</string>
|
||||||
|
<string name="restart_app">Reiniciar</string>
|
||||||
|
<string name="failed_to_update_sepolicy">Falha ao atualizar as regras do SELinux para: %s</string>
|
||||||
|
<string name="require_kernel_version">A versão atual do KernelSU %d é muito baixa para o gerenciador funcionar corretamente. Por favor, atualize para a versão %d ou superior!</string>
|
||||||
|
<string name="module_changelog">Registro de alterações</string>
|
||||||
|
</resources>
|
||||||
82
manager/app/src/main/res/values-pt/strings.xml
Normal file
82
manager/app/src/main/res/values-pt/strings.xml
Normal file
@@ -0,0 +1,82 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<resources>
|
||||||
|
<string name="home_not_installed">Não instalado</string>
|
||||||
|
<string name="home">Início</string>
|
||||||
|
<string name="home_click_to_install">Clique para instalar</string>
|
||||||
|
<string name="home_working">Funcionando</string>
|
||||||
|
<string name="home_superuser_count">Super Usuário: %d</string>
|
||||||
|
<string name="home_module_count">Módulos: %d</string>
|
||||||
|
<string name="home_working_version">Versão: %d</string>
|
||||||
|
<string name="home_kernel">Kernel</string>
|
||||||
|
<string name="install">Instalar</string>
|
||||||
|
<string name="home_unsupported">Sem suporte</string>
|
||||||
|
<string name="home_unsupported_reason">KernelSU suporta apenas kernels GKI agora</string>
|
||||||
|
<string name="home_selinux_status">Status do SELinux</string>
|
||||||
|
<string name="home_manager_version">Versão do aplicativo</string>
|
||||||
|
<string name="module_failed_to_disable">Falha ao desativar o módulo: %s</string>
|
||||||
|
<string name="home_fingerprint">Impressão digital</string>
|
||||||
|
<string name="selinux_status_disabled">Desabilitado</string>
|
||||||
|
<string name="selinux_status_enforcing">Impondo</string>
|
||||||
|
<string name="selinux_status_permissive">Permissivo</string>
|
||||||
|
<string name="selinux_status_unknown">Desconhecido</string>
|
||||||
|
<string name="superuser">Super Usuário</string>
|
||||||
|
<string name="module_failed_to_enable">Falha ao ativar o módulo: %s</string>
|
||||||
|
<string name="module_empty">Nenhum módulo instalado</string>
|
||||||
|
<string name="uninstall">Desinstalar</string>
|
||||||
|
<string name="module">Modulos</string>
|
||||||
|
<string name="reboot">Reiniciar</string>
|
||||||
|
<string name="module_install">Instalar</string>
|
||||||
|
<string name="reboot_userspace">Reinicialização Suave</string>
|
||||||
|
<string name="settings">Configurações</string>
|
||||||
|
<string name="reboot_bootloader">Reinicializar modo Bootloader</string>
|
||||||
|
<string name="reboot_recovery">Reiniciar modo recuperação</string>
|
||||||
|
<string name="module_uninstall_failed">Falha ao desinstalar: %s</string>
|
||||||
|
<string name="module_version">Versão</string>
|
||||||
|
<string name="module_author">Autor</string>
|
||||||
|
<string name="refresh">Atualizar</string>
|
||||||
|
<string name="hide_system_apps">Esconder apps do sistema</string>
|
||||||
|
<string name="reboot_download">Reiniciar para baixar</string>
|
||||||
|
<string name="reboot_edl">Reiniciar em EDL</string>
|
||||||
|
<string name="module_uninstall_confirm">Tem certeza de que deseja desinstalar o módulo %s\?</string>
|
||||||
|
<string name="about">Sobre</string>
|
||||||
|
<string name="module_overlay_fs_not_available">overlayfs não está disponível, o módulo não pode funcionar!</string>
|
||||||
|
<string name="send_log">Enviar log</string>
|
||||||
|
<string name="module_uninstall_success">%s desinstalado</string>
|
||||||
|
<string name="show_system_apps">Mostrar aplicativos do sistema</string>
|
||||||
|
<string name="home_click_to_learn_kernelsu">Aprenda a instalar o KernelSU e usar os módulos</string>
|
||||||
|
<string name="home_support_content">O KernelSU é, e sempre será, gratuito e de código aberto. No entanto, você pode nos mostrar que se importa fazendo uma doação.</string>
|
||||||
|
<string name="about_source_code">Veja o código-fonte em %1$s<br/>Junte-se ao nosso canal %2$s</string>
|
||||||
|
<string name="profile_namespace_individual">Individual</string>
|
||||||
|
<string name="profile_namespace_global">Global</string>
|
||||||
|
<string name="profile_namespace_inherited">Herdado</string>
|
||||||
|
<string name="profile_default">Padrão</string>
|
||||||
|
<string name="profile_template">Modelo</string>
|
||||||
|
<string name="profile_custom">Personalizado</string>
|
||||||
|
<string name="profile_name">Nome do perfil</string>
|
||||||
|
<string name="profile_namespace">Montar namespace</string>
|
||||||
|
<string name="safe_mode">Modo de segurança</string>
|
||||||
|
<string name="reboot_to_apply">Reinicie para entrar em vigor</string>
|
||||||
|
<string name="home_learn_kernelsu">Aprender KernelSU</string>
|
||||||
|
<string name="module_magisk_conflict">Os módulos estão desativados porque estão em conflito com os do Magisk!</string>
|
||||||
|
<string name="home_support_title">Apoie-nos</string>
|
||||||
|
<string name="profile_groups">Grupos</string>
|
||||||
|
<string name="profile_capabilities">Capacidades</string>
|
||||||
|
<string name="profile_selinux_context">contexto SELinux</string>
|
||||||
|
<string name="profile_selinux_domain">Domínio</string>
|
||||||
|
<string name="module_update">Atualização</string>
|
||||||
|
<string name="profile_umount_modules">Desativar modulos</string>
|
||||||
|
<string name="failed_to_update_app_profile">Falha ao atualizar o perfil do aplicativo para %s</string>
|
||||||
|
<string name="settings_umount_modules_default">Módulos desativados por padrão</string>
|
||||||
|
<string name="settings_umount_modules_default_summary">O valor padrão global para \"Módulos Umount\" em Perfis de Aplicativos. Se ativado, removerá todas as modificações de módulo do sistema para aplicativos que não possuem um Perfil definido.</string>
|
||||||
|
<string name="profile_selinux_rules">Regras</string>
|
||||||
|
<string name="profile_umount_modules_summary">Ativar esta opção permitirá que o KernelSU restaure quaisquer arquivos modificados pelos módulos para este aplicativo.</string>
|
||||||
|
<string name="module_start_downloading">Iniciar o download: %s</string>
|
||||||
|
<string name="module_downloading">Baixando módulo: %s</string>
|
||||||
|
<string name="failed_to_update_sepolicy">Falha ao atualizar as regras do SELinux para: %s</string>
|
||||||
|
<string name="home_learn_kernelsu_url">https://kernelsu.org/guide/what-is-kernelsu.html</string>
|
||||||
|
<string name="restart_app">Reiniciar</string>
|
||||||
|
<string name="launch_app">Lançar</string>
|
||||||
|
<string name="force_stop_app">Forçar parada</string>
|
||||||
|
<string name="new_version_available">Nova versão: %s está disponível, clique para baixar</string>
|
||||||
|
<string name="require_kernel_version">A versão atual do KernelSU %d é muito baixa para o gerenciador funcionar corretamente. Atualize para a versão %d ou superior!</string>
|
||||||
|
</resources>
|
||||||
@@ -5,25 +5,22 @@
|
|||||||
<string name="home_click_to_install">Click pentru a instala</string>
|
<string name="home_click_to_install">Click pentru a instala</string>
|
||||||
<string name="home_working">Funcționează</string>
|
<string name="home_working">Funcționează</string>
|
||||||
<string name="home_working_version">Versiune: %d</string>
|
<string name="home_working_version">Versiune: %d</string>
|
||||||
<string name="home_superuser_count">Superuseri: %d</string>
|
<string name="home_superuser_count">Super-utilizatori: %d</string>
|
||||||
<string name="home_module_count">Module: %d</string>
|
<string name="home_module_count">Module: %d</string>
|
||||||
<string name="home_unsupported">Necompatibil</string>
|
<string name="home_unsupported">Necompatibil</string>
|
||||||
<string name="home_unsupported_reason">KernelSU suportă doar nuclee GKI acum</string>
|
<string name="home_unsupported_reason">KernelSU suportă doar nuclee GKI acum</string>
|
||||||
|
|
||||||
<string name="home_kernel">Nucleu</string>
|
<string name="home_kernel">Nucleu</string>
|
||||||
<string name="home_manager_version">Versiune Manager</string>
|
<string name="home_manager_version">Versiune Manager</string>
|
||||||
<string name="home_fingerprint">Amprentă</string>
|
<string name="home_fingerprint">Amprentă</string>
|
||||||
|
|
||||||
<string name="home_selinux_status">Stare SELinux</string>
|
<string name="home_selinux_status">Stare SELinux</string>
|
||||||
<string name="selinux_status_disabled">Dezactivat</string>
|
<string name="selinux_status_disabled">Dezactivat</string>
|
||||||
<string name="selinux_status_enforcing">Obligatoriu</string>
|
<string name="selinux_status_enforcing">Obligatoriu</string>
|
||||||
<string name="selinux_status_permissive">Permisiv</string>
|
<string name="selinux_status_permissive">Permisiv</string>
|
||||||
<string name="selinux_status_unknown">Necunoscut</string>
|
<string name="selinux_status_unknown">Necunoscut</string>
|
||||||
<string name="superuser">Superutilizator</string>
|
<string name="superuser">Super-utilizator</string>
|
||||||
<string name="module_failed_to_enable">Activarea modulului %s a eșuat</string>
|
<string name="module_failed_to_enable">Activarea modulului %s a eșuat</string>
|
||||||
<string name="module_failed_to_disable">Dezactivarea modulului %s a eșuat</string>
|
<string name="module_failed_to_disable">Dezactivarea modulului %s a eșuat</string>
|
||||||
<string name="module_empty">Niciun modul instalat</string>
|
<string name="module_empty">Niciun modul instalat</string>
|
||||||
|
|
||||||
<string name="module">Module</string>
|
<string name="module">Module</string>
|
||||||
<string name="uninstall">Dezinstalează</string>
|
<string name="uninstall">Dezinstalează</string>
|
||||||
<string name="module_install">Instalează</string>
|
<string name="module_install">Instalează</string>
|
||||||
@@ -68,10 +65,19 @@
|
|||||||
<string name="profile_selinux_context">Context SELinux</string>
|
<string name="profile_selinux_context">Context SELinux</string>
|
||||||
<string name="profile_umount_modules">Module u-montate</string>
|
<string name="profile_umount_modules">Module u-montate</string>
|
||||||
<string name="failed_to_update_app_profile">Nu s-a putut actualiza profilul aplicației pentru %s</string>
|
<string name="failed_to_update_app_profile">Nu s-a putut actualiza profilul aplicației pentru %s</string>
|
||||||
<string name="require_kernel_version">Versiunea actuală a nucleului %d este prea mică pentru ca managerul să funcționeze corect. Actualizează la versiunea %d sau o versiune superioară!</string>
|
|
||||||
<string name="settings_umount_modules_default">U-montează modulele în mod implicit</string>
|
<string name="settings_umount_modules_default">U-montează modulele în mod implicit</string>
|
||||||
<string name="settings_umount_modules_default_summary">Valoarea implicită globală pentru „Module u-montate” în Profilurile aplicațiilor. Dacă este activat, va elimina toate modificările modulelor aduse sistemului pentru aplicațiile care nu au un profil setat.</string>
|
<string name="settings_umount_modules_default_summary">Valoarea implicită globală pentru „Module u-montate” în Profilurile aplicațiilor. Dacă este activat, va elimina toate modificările modulelor aduse sistemului pentru aplicațiile care nu au un profil setat.</string>
|
||||||
<string name="profile_umount_modules_summary">Activarea acestei opțiuni va permite KernelSU să restaureze orice fișiere modificate de către modulele pentru această aplicație.</string>
|
<string name="profile_umount_modules_summary">Activarea acestei opțiuni va permite KernelSU să restaureze orice fișiere modificate de către modulele pentru această aplicație.</string>
|
||||||
<string name="profile_selinux_domain">Domeniu</string>
|
<string name="profile_selinux_domain">Domeniu</string>
|
||||||
<string name="profile_selinux_rules">Reguli</string>
|
<string name="profile_selinux_rules">Reguli</string>
|
||||||
</resources>
|
<string name="module_update">Actualizează</string>
|
||||||
|
<string name="module_downloading">Se descarcă modulul: %s</string>
|
||||||
|
<string name="module_start_downloading">Începe descărcarea: %s</string>
|
||||||
|
<string name="new_version_available">Versiune nouă: %s este disponibilă, clic pentru a actualiza</string>
|
||||||
|
<string name="failed_to_update_sepolicy">Nu s-au reușit actualizările regulilor SELinux pentru: %s</string>
|
||||||
|
<string name="launch_app">Lansare</string>
|
||||||
|
<string name="force_stop_app">Oprire forțată</string>
|
||||||
|
<string name="restart_app">Repornește</string>
|
||||||
|
<string name="require_kernel_version">Versiunea actuală a KernelSU %d este prea mică pentru ca managerul să funcționeze corect. Actualizează la versiunea %d sau o versiune superioară!</string>
|
||||||
|
<string name="module_changelog">Jurnalul modificărilor</string>
|
||||||
|
</resources>
|
||||||
@@ -1,30 +1,28 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<resources>
|
<resources>
|
||||||
<string name="app_name" translatable="false">KernelSU</string>
|
|
||||||
|
|
||||||
<string name="home">Главная</string>
|
<string name="home">Главная</string>
|
||||||
<string name="home_not_installed">Не установлен</string>
|
<string name="home_not_installed">Не установлен</string>
|
||||||
<string name="home_click_to_install">Нажмите чтобы установить</string>
|
<string name="home_click_to_install">Нажмите, чтобы установить</string>
|
||||||
<string name="home_working">Работает</string>
|
<string name="home_working">Работает</string>
|
||||||
<string name="home_working_version">Версия: %d</string>
|
<string name="home_working_version">Версия: %d</string>
|
||||||
<string name="home_superuser_count">Superusers: %d</string> <!--Don't translate this string!-->
|
<string name="home_superuser_count">Superusers: %d</string>
|
||||||
|
<!--Don't translate this string!-->
|
||||||
<string name="home_module_count">Модули: %d</string>
|
<string name="home_module_count">Модули: %d</string>
|
||||||
<string name="home_unsupported">Не поддерживается</string>
|
<string name="home_unsupported">Не поддерживается</string>
|
||||||
<string name="home_unsupported_reason">KernelSU поддерживает только GKI ядра</string>
|
<string name="home_unsupported_reason">KernelSU поддерживает только GKI ядра</string>
|
||||||
|
|
||||||
<string name="home_kernel">Ядро</string>
|
<string name="home_kernel">Ядро</string>
|
||||||
<string name="home_manager_version">Версия менеджера</string>
|
<string name="home_manager_version">Версия менеджера</string>
|
||||||
<string name="home_fingerprint">Подпись</string>
|
<string name="home_fingerprint">Подпись</string>
|
||||||
|
|
||||||
<string name="home_selinux_status">Состояние SELinux</string>
|
<string name="home_selinux_status">Состояние SELinux</string>
|
||||||
<string name="selinux_status_disabled">Выключен</string>
|
<string name="selinux_status_disabled">Выключен</string>
|
||||||
<string name="selinux_status_enforcing">Принудительный</string>
|
<string name="selinux_status_enforcing">Принудительный</string>
|
||||||
<string name="selinux_status_permissive">Разрешающий</string>
|
<string name="selinux_status_permissive">Разрешающий</string>
|
||||||
<string name="selinux_status_unknown">Неизвестно</string>
|
<string name="selinux_status_unknown">Неизвестно</string>
|
||||||
<string name="superuser">Superuser</string> <!--Don't translate this string!-->
|
<string name="superuser">Superuser</string>
|
||||||
|
<!--Don't translate this string!-->
|
||||||
<string name="module_failed_to_enable">Не удалось включить модуль: %s</string>
|
<string name="module_failed_to_enable">Не удалось включить модуль: %s</string>
|
||||||
<string name="module_failed_to_disable">Не удалось отключить модуль: %s</string>
|
<string name="module_failed_to_disable">Не удалось отключить модуль: %s</string>
|
||||||
<string name="module_empty">Нет установленных модулей</string>
|
<string name="module_empty">Нет установленных модулей</string>
|
||||||
|
|
||||||
<string name="module">Модули</string>
|
<string name="module">Модули</string>
|
||||||
<string name="uninstall">Удалить</string>
|
<string name="uninstall">Удалить</string>
|
||||||
<string name="module_install">Установить</string>
|
<string name="module_install">Установить</string>
|
||||||
@@ -51,12 +49,13 @@
|
|||||||
<string name="reboot_to_apply">Перезагрузите, чтобы изменения вступили в силу</string>
|
<string name="reboot_to_apply">Перезагрузите, чтобы изменения вступили в силу</string>
|
||||||
<string name="module_magisk_conflict">Модули отключены, потому что они конфликтуют с Magisk!</string>
|
<string name="module_magisk_conflict">Модули отключены, потому что они конфликтуют с Magisk!</string>
|
||||||
<string name="home_learn_kernelsu">Узнайте о KernelSU</string>
|
<string name="home_learn_kernelsu">Узнайте о KernelSU</string>
|
||||||
<string name="home_learn_kernelsu_url">https://kernelsu.org/guide/what-is-kernelsu.html</string>
|
<string name="home_learn_kernelsu_url">https://kernelsu.org/ru_RU/guide/what-is-kernelsu.html</string>
|
||||||
<string name="home_click_to_learn_kernelsu">Узнайте, как установить KernelSU и использовать модули</string>
|
<string name="home_click_to_learn_kernelsu">Узнайте, как установить KernelSU и использовать модули</string>
|
||||||
<string name="home_support_title">Поддержите нас</string>
|
<string name="home_support_title">Поддержите нас</string>
|
||||||
<string name="home_support_content">KernelSU был и всегда будет бесплатным и открытым проектом. Однако Вы всегда можете поддержать нас, отправив небольшое пожертвование.</string>
|
<string name="home_support_content">KernelSU был и всегда будет бесплатным и открытым проектом. Однако Вы всегда можете поддержать нас, отправив небольшое пожертвование.</string>
|
||||||
<string name="about_source_code"><![CDATA[Посмотреть исходный код на %1$s<br/>Присоединяйтесь к нашему %2$s каналу]]></string>
|
<string name="about_source_code"><![CDATA[Посмотреть исходный код на %1$s<br/>Присоединяйтесь к нашему %2$s каналу]]></string>
|
||||||
<string name="profile" translatable="false">App Profile</string> <!--Don't translate this string!-->
|
<string name="profile" translatable="false">App Profile</string>
|
||||||
|
<!--Don't translate this string!-->
|
||||||
<string name="profile_default">По умолчанию</string>
|
<string name="profile_default">По умолчанию</string>
|
||||||
<string name="profile_template">Шаблон</string>
|
<string name="profile_template">Шаблон</string>
|
||||||
<string name="profile_custom">Пользовательский</string>
|
<string name="profile_custom">Пользовательский</string>
|
||||||
@@ -70,8 +69,19 @@
|
|||||||
<string name="profile_selinux_context">Контекст SELinux</string>
|
<string name="profile_selinux_context">Контекст SELinux</string>
|
||||||
<string name="profile_umount_modules">Размонтировать модули</string>
|
<string name="profile_umount_modules">Размонтировать модули</string>
|
||||||
<string name="failed_to_update_app_profile">Не удалось обновить App Profile для %s</string>
|
<string name="failed_to_update_app_profile">Не удалось обновить App Profile для %s</string>
|
||||||
<string name="require_kernel_version">Текущая версия ядра %d слишком низкая для правильной работы менеджера. Пожалуйста, обновитесь до версии %d или выше!</string>
|
|
||||||
<string name="settings_umount_modules_default">Размонтировать модули по умолчанию</string>
|
<string name="settings_umount_modules_default">Размонтировать модули по умолчанию</string>
|
||||||
<string name="settings_umount_modules_default_summary">Глобальное значение по умолчанию для \"Размонтировать модули\" в App Profile. При включении будут удалены все модификации модулей в системе для приложений, у которых не задан Profile.</string>
|
<string name="settings_umount_modules_default_summary">Глобальное значение по умолчанию для \"Размонтировать модули\" в App Profile. При включении будут удалены все модификации модулей в системе для приложений, у которых не задан Profile.</string>
|
||||||
<string name="profile_umount_modules_summary">Включение этой опции позволит KernelSU восстанавливать любые измененные модулями файлы для данного приложения.</string>
|
<string name="profile_umount_modules_summary">Включение этой опции позволит KernelSU восстанавливать любые измененные модулями файлы для данного приложения.</string>
|
||||||
</resources>
|
<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="force_stop_app">Принудительно остановить</string>
|
||||||
|
<string name="failed_to_update_sepolicy">Не удалось обновить правила SELinux для %s</string>
|
||||||
|
<string name="launch_app">Запустить</string>
|
||||||
|
<string name="restart_app">Перезапустить</string>
|
||||||
|
<string name="require_kernel_version">Текущая версия KernelSU %d слишком низкая для правильной работы менеджера. Пожалуйста, обновите до версии %d или выше!</string>
|
||||||
|
<string name="module_changelog">Список изменений</string>
|
||||||
|
</resources>
|
||||||
8
manager/app/src/main/res/values-sr/strings.xml
Normal file
8
manager/app/src/main/res/values-sr/strings.xml
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<resources>
|
||||||
|
<string name="home_superuser_count">Superkorisnici</string>
|
||||||
|
<string name="home_module_count">Moduli: %d</string>
|
||||||
|
<string name="home_click_to_install">Kliknite da instalirate</string>
|
||||||
|
<string name="home">дом</string>
|
||||||
|
<string name="home_not_installed">Nije instalirano</string>
|
||||||
|
</resources>
|
||||||
15
manager/app/src/main/res/values-te/strings.xml
Normal file
15
manager/app/src/main/res/values-te/strings.xml
Normal file
@@ -0,0 +1,15 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<resources>
|
||||||
|
<string name="selinux_status_unknown">తెలియదు</string>
|
||||||
|
<string name="module_failed_to_enable">మాడ్యూల్ని ప్రారంభించడంలో విఫలమైంది: %s</string>
|
||||||
|
<string name="force_stop_app">బలవంతంగా ఆపడం</string>
|
||||||
|
<string name="restart_app">పునఃప్రారంభించండి</string>
|
||||||
|
<string name="module">మాడ్యూల్</string>
|
||||||
|
<string name="about">గురించి</string>
|
||||||
|
<string name="home_selinux_status">SELinux స్థితి</string>
|
||||||
|
<string name="home">హోమ్</string>
|
||||||
|
<string name="superuser">సూపర్యూజర్</string>
|
||||||
|
<string name="module_failed_to_disable">మాడ్యూల్ని నిలిపివేయడంలో విఫలమైంది: %s</string>
|
||||||
|
<string name="module_empty">మాడ్యూల్ ఏదీ ఇన్స్టాల్ చేయబడలేదు</string>
|
||||||
|
<string name="home_not_installed">ఇన్స్టాల్ చేయలేదు</string>
|
||||||
|
</resources>
|
||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user