Compare commits

...

143 Commits

Author SHA1 Message Date
weishu
b52bf53d01 kernel: Fix compile err 2023-08-09 18:51:03 +08:00
weishu
7bdb885816 kernel: fix probe_kernel_read failed to read user addr 2023-08-09 18:37:30 +08:00
weishu
cde3e95180 kernel: Fix manager recognize err 2023-08-09 16:28:22 +08:00
Weblate (bot)
7ecb4b03ee Translations update from Hosted Weblate (#832)
Translations update from [Hosted Weblate](https://hosted.weblate.org)
for
[KernelSU/Manager](https://hosted.weblate.org/projects/kernelsu/manager/).



Current translation status:

![Weblate translation
status](https://hosted.weblate.org/widgets/kernelsu/-/manager/horizontal-auto.svg)

---------

Co-authored-by: weishu tian <twsxtd@gmail.com>
Co-authored-by: Rex_sa <rex.sa@pm.me>
Co-authored-by: cachiusa <nhat.dogpro@outlook.com>
Co-authored-by: dabao1955 <dabao1955@163.com>
2023-08-09 15:00:16 +08:00
weishu
e8a90aadb2 ci: Fix No space left on device (#833)
For android13 gki kernels, Google puts lots of unused file to kernel
source tree, while the Github Action only has 14G disk size and the ci
may fail because of "No space left on device". 

The `repo` tool will try pull all the refs and tags with depth=INT_MAX if it found the SHA1 hash doesn't exist on remote server even if you force it to fetch with `depth=1` and `--no-tags`. So we use the version `v2.16` which doesn't check it.

And also, using a fixed repo version can avoid randomly failure of building.
2023-08-09 13:32:48 +08:00
weishu
beaa048be3 kernel: don't trigger page fault when become manager. fix #836 2023-08-09 12:33:05 +08:00
Akari
936b650f12 update README_PT-BR.md (#835) 2023-08-09 11:16:56 +08:00
weishu
747c91d5c8 manager: remove require_kernel_version for re-translation. 2023-08-08 11:25:53 +08:00
Aquarius223
5023d0ab1d manager: Corrected "Kernel version" and "KernelSU version" string (#825)
* Avoid misunderstanding "The current kernel version %d is too low" Many
people misunderstand that the version of the Linux kernel is too low, so
the version of KernelSU is low and they go looking for a kernel with an
upgraded version of the Linux kernel.

 Correct the string of require_kernel_version to avoid misunderstanding,
 Now let them look for the updated KernelSU version of the kernel.

(cherry picked from commit dcc4ad10f81b1531b551b2b44a3b9cbdc0e489e9)
Change-Id: I4373b006d45ed98e02effa4556e8a9e8c0b70f14

Co-authored-by: admin <paper@localhost>
2023-08-08 11:21:40 +08:00
Weblate (bot)
5b638c876e Translations update from Hosted Weblate (#829)
Translations update from [Hosted Weblate](https://hosted.weblate.org)
for
[KernelSU/Manager](https://hosted.weblate.org/projects/kernelsu/manager/).



Current translation status:

![Weblate translation
status](https://hosted.weblate.org/widgets/kernelsu/-/manager/horizontal-auto.svg)

---------

Co-authored-by: Pierre GRASSER <piorrro33@outlook.com>
Co-authored-by: Kazuki Nakashima <flukfik41@gmail.com>
2023-08-08 10:32:34 +08:00
weishu
d6a7231fae manager: module description and name is optional. 2023-08-03 23:15:21 +08:00
weishu
06681a2490 ksud: restore selinux context for unlabeled module files on boot. fix #817 2023-08-03 12:00:28 +08:00
weishu
278cbef3ec ksud: don't follow link when restore file context 2023-08-03 12:00:28 +08:00
The_second_Tom
a83390b0ec Kernel: fix filp_open in kernel below 4.9 (#822)
Use current_cred()->session_keyring to check whether session_keyring
installed or not. close #814
2023-08-01 20:51:32 +08:00
weishu
907bcad1a7 kernel: use ordered work queue to avoid timing issues 2023-08-01 20:47:43 +08:00
Weblate (bot)
4c0a36785b Translations update from Hosted Weblate (#805)
Translations update from [Hosted Weblate](https://hosted.weblate.org)
for
[KernelSU/Manager](https://hosted.weblate.org/projects/kernelsu/manager/).



Current translation status:

![Weblate translation
status](https://hosted.weblate.org/widgets/kernelsu/-/manager/horizontal-auto.svg)

---------

Co-authored-by: Ali Beyaz <alipolatbeyaz@gmail.com>
Co-authored-by: dabao1955 <dabao1955@163.com>
Co-authored-by: Tian xiang <minepzh@outlook.com>
2023-08-01 17:02:43 +08:00
AzukiAtsui
983ad2c1fd Fix the directory pathname while moving directories (#816)
Fix the duplicate directory name error that occurs when the destination
directory already exists while moving folders.
2023-08-01 13:40:56 +08:00
hopez13
a3590b767e Docs: Fixed Word Repetition (#818) 2023-08-01 10:06:56 +08:00
DawfukFR
12e00dc717 [add device]: Oneplus8/8T/8P/9R (opkona) (#819)
Custom kernel for Oneplus SM8250 devices with support of KernelSU (using
the command : curl -LSs
"https://raw.githubusercontent.com/tiann/KernelSU/main/kernel/setup.sh"
| bash -)

Precompiled kernel can be found here : 
https://t.me/StellarisRelease (stable)
https://t.me/DawfukSpace (testing)

I have tested the KernelSU feature on this kernel, everything works
fine.
Current version used : 11165
KernelSU Manager signature size: 0x033b
KernelSU Manager signature hash: 0xb0b91415
2023-08-01 10:06:26 +08:00
weishu
e00a355fa8 website: Add docs for boot-completed stage 2023-07-31 19:58:45 +08:00
weishu
e95c5a9675 ksud: support common & module boot-completed.sh 2023-07-31 19:50:53 +08:00
weishu
d0b8144b96 manager: refresh module screen if it comes from install screen. fix #758 2023-07-31 16:15:42 +08:00
weishu
d16d3f87a6 manager: block vol up & down for module installation. fix #815 2023-07-31 15:27:53 +08:00
weishu
76decba8d9 manager: auto scroll for module installation. #815 2023-07-31 15:06:00 +08:00
dabao1955
d75678fca0 Update Custom issue temple (#811) 2023-07-28 22:27:52 +08:00
TinyHai
abe1fa471d manager: fix alignment and padding of some text in ModuleScreen (#812) 2023-07-28 22:27:03 +08:00
weishu
07a430aa5b ksud: re-enable lto 2023-07-28 22:23:03 +08:00
weishu
df9cf61575 ksud: fix su args parse error. close #736 2023-07-28 22:21:12 +08:00
TinyHai
bfe8c2eecd manager: a small fix to WarningCard (#809) 2023-07-28 17:34:57 +08:00
TinyHai
b732765811 manager: fix the text 'No module installed' is not centered (#803) 2023-07-25 18:47:09 +08:00
Weblate (bot)
a966252fa5 Translations update from Hosted Weblate (#783)
Translations update from [Hosted Weblate](https://hosted.weblate.org)
for
[KernelSU/Manager](https://hosted.weblate.org/projects/kernelsu/manager/).



Current translation status:

![Weblate translation
status](https://hosted.weblate.org/widgets/kernelsu/-/manager/horizontal-auto.svg)

---------

Co-authored-by: dabao1955 <dabao1955@163.com>
Co-authored-by: $D&fX!a&#YA6ZbJkZN$3 <mariusnnnn@gmail.com>
Co-authored-by: ia. Shovon <tecifac284@kameili.com>
Co-authored-by: Ruben Guerra <rubenguerrasr5870@gmail.com>
Co-authored-by: Fiqri Ardyansyah <fiqri0927936@gmail.com>
Co-authored-by: Kazuki Nakashima <flukfik41@gmail.com>
Co-authored-by: TheNoFace <fprhqkrtk303@naver.com>
Co-authored-by: Ali Beyaz <alipolatbeyaz@gmail.com>
Co-authored-by: Kirill Azimov <azimxv@yandex.ru>
2023-07-25 09:21:43 +08:00
weishu
3664003260 ksud: fix common post-fs-data.d may not execute if no modules are enabled 2023-07-24 13:39:51 +08:00
Flame
978178afc0 [add device]: POCO F3/Redmi K40/Mi 11X (alioth) (#799)
This pull request includes a modified LineageOS kernel with the
implementation of KernelSU for POCO F3/Redmi K40/Mi 11X (alioth), adding
them to the list of unofficially supported devices.
2023-07-23 10:44:30 +08:00
Asriadi Rahim
16f6f30eae Again add unofficial support Google Pixel 2/2XL (#797)
* i dont have any clue what i am doing...sory tian sur...hhh

Signed-off-by: Asriadi Rahim <asriadirahim03@gmail.com>
2023-07-22 00:22:11 +08:00
Akari
63851f8c88 Update README_PT-BR.md (#793)
Added information that was updated from
[README.md](https://github.com/tiann/KernelSU/blob/main/README.md) to
Brazilian Portuguese. some of this information:
- fixed some lines
- added information about Translate
- added information about the App Profile
2023-07-21 15:54:14 +08:00
Giovany
34c6765752 Support m30s (#791)
add , missing
2023-07-21 15:53:01 +08:00
Giovany
c23d1bcf58 Support Galaxy a50 (#790) 2023-07-21 10:08:23 +08:00
weishu
6ae7e1624f Merge pull request #788 from Sanju0910/patch-1
avicii: Update repository link
2023-07-21 00:10:07 +08:00
Sreeshankar K
ba4b014a99 Merge branch 'main' into patch-1 2023-07-20 19:42:16 +05:30
weishu
f192638943 Merge pull request #785 from dabao1955/main
README:Update Readme for Japanese Language
2023-07-20 22:05:23 +08:00
Sreeshankar K
0323ee7958 avicii: Update repository link 2023-07-20 19:34:30 +05:30
dabao1955
021ef521cb Update README_JP.md 2023-07-19 21:29:04 +08:00
dabao1955
34086cd445 Update README_JP.md 2023-07-19 21:26:26 +08:00
dabao1955
c306eddee8 Update README_JP.md 2023-07-19 21:21:07 +08:00
dabao1955
c72f7d750e Update README_JP.md 2023-07-19 21:19:37 +08:00
weishu
f9a91848ad Merge pull request #774 from tiann/translation
Translations update from Hosted Weblate
2023-07-19 09:40:08 +08:00
Mantas
cd8013a616 Translated using Weblate (Lithuanian)
Currently translated at 100.0% (81 of 81 strings)

Translation: KernelSU/Manager
Translate-URL: https://hosted.weblate.org/projects/kernelsu/manager/lt/
2023-07-18 15:30:09 +02:00
Rəşad Qasımlı
dc536d652a Translated using Weblate (Azerbaijani)
Currently translated at 100.0% (81 of 81 strings)

Translation: KernelSU/Manager
Translate-URL: https://hosted.weblate.org/projects/kernelsu/manager/az/
2023-07-18 15:30:08 +02:00
cachiusa
3114f6d7f6 Translated using Weblate (Vietnamese)
Currently translated at 100.0% (81 of 81 strings)

Translation: KernelSU/Manager
Translate-URL: https://hosted.weblate.org/projects/kernelsu/manager/vi/
2023-07-18 13:18:01 +02:00
Hosted Weblate
e2f5015107 Merge remote-tracking branch 'origin/main' 2023-07-18 11:46:39 +02:00
Ali Beyaz
884dd606eb Update README_TR.md (#779) 2023-07-18 17:46:33 +08:00
Hosted Weblate
8d246a6b9d Merge remote-tracking branch 'origin/main' 2023-07-18 10:08:32 +02:00
ia. Shovon
2ee3d55c88 Translated using Weblate (Bengali (Bangladesh))
Currently translated at 50.6% (41 of 81 strings)

Translation: KernelSU/Manager
Translate-URL: https://hosted.weblate.org/projects/kernelsu/manager/bn_BD/
2023-07-18 10:08:32 +02:00
dabao1955
55b540bf4c repos.json:Update repo info (#778)
Some changes to repos.json:
- Redirect android_kernel_xiaomi_surya to kernel_xiaomi_surya: Because
the original warehouse has changed android_kernel_xiaomi_surya to
kernel_xiaomi_surya, this time the original address is 404
- Removed kernel repository information maintained by AkariOficial #754
2023-07-18 16:08:26 +08:00
Hosted Weblate
c0d147dcad Merge remote-tracking branch 'origin/main' 2023-07-18 06:38:50 +02:00
セリカ・シルフィル
be413fd147 CI: Support set manager signature size and hash (#757)
close #739, close #745, close #752
2023-07-18 12:38:44 +08:00
weishu tian
786f3d6441 Added translation using Weblate (Bengali (Bangladesh)) 2023-07-18 06:34:32 +02:00
Hosted Weblate
8f50b5f6e5 Merge remote-tracking branch 'origin/main' 2023-07-18 04:16:19 +02:00
セリカ・シルフィル
90639fad6c Translated using Weblate (Russian)
Currently translated at 100.0% (81 of 81 strings)

Translation: KernelSU/Manager
Translate-URL: https://hosted.weblate.org/projects/kernelsu/manager/ru/
2023-07-18 04:16:19 +02:00
セリカ・シルフィル
2979434e2a Translated using Weblate (Indonesian)
Currently translated at 100.0% (81 of 81 strings)

Translation: KernelSU/Manager
Translate-URL: https://hosted.weblate.org/projects/kernelsu/manager/id/
2023-07-18 04:16:18 +02:00
weishu
56d145666c ksud: fix path env, close #775 2023-07-18 10:02:06 +08:00
weishu
db5f77aa96 docs: Update README 2023-07-18 09:45:42 +08:00
weishu
5fbce8ef07 docs: Add weblate to README 2023-07-18 09:39:37 +08:00
Hosted Weblate
4cc3644416 Merge remote-tracking branch 'origin/main' 2023-07-18 03:29:36 +02:00
Jen Kung-chih
01a7678a26 Translated using Weblate (Chinese (Traditional))
Currently translated at 100.0% (81 of 81 strings)

Translation: KernelSU/Manager
Translate-URL: https://hosted.weblate.org/projects/kernelsu/manager/zh_Hant/
2023-07-18 03:29:35 +02:00
Jen Kung-chih
95d22d2bb4 Translated using Weblate (Chinese (Traditional, Hong Kong))
Currently translated at 100.0% (81 of 81 strings)

Translation: KernelSU/Manager
Translate-URL: https://hosted.weblate.org/projects/kernelsu/manager/zh_Hant_HK/
2023-07-18 03:29:35 +02:00
Sreeshankar K
3efb2be456 avicii: Define Kernel Name & Update repository link (#777) 2023-07-18 09:29:28 +08:00
Rəşad Qasımlı
3b7ca2d7e8 Translated using Weblate (Azerbaijani)
Currently translated at 100.0% (81 of 81 strings)

Translation: KernelSU/Manager
Translate-URL: https://hosted.weblate.org/projects/kernelsu/manager/az/
2023-07-17 21:37:33 +02:00
cachiusa
7b45bc5aad Translated using Weblate (Vietnamese)
Currently translated at 100.0% (81 of 81 strings)

Translation: KernelSU/Manager
Translate-URL: https://hosted.weblate.org/projects/kernelsu/manager/vi/
2023-07-17 14:32:11 +02:00
ekotin
ed1e892600 Translated using Weblate (Turkish)
Currently translated at 98.7% (80 of 81 strings)

Translation: KernelSU/Manager
Translate-URL: https://hosted.weblate.org/projects/kernelsu/manager/tr/
2023-07-17 14:32:10 +02:00
Igor Sorocean
f188802044 Translated using Weblate (Romanian)
Currently translated at 100.0% (81 of 81 strings)

Translation: KernelSU/Manager
Translate-URL: https://hosted.weblate.org/projects/kernelsu/manager/ro/
2023-07-17 12:21:02 +02:00
Tian xiang
965c23867f Translated using Weblate (Japanese)
Currently translated at 86.4% (70 of 81 strings)

Translation: KernelSU/Manager
Translate-URL: https://hosted.weblate.org/projects/kernelsu/manager/ja/
2023-07-17 08:43:35 +02:00
Weblate (bot)
b271b2f587 Translations update from Hosted Weblate (#772)
Translations update from [Hosted Weblate](https://hosted.weblate.org)
for
[KernelSU/Manager](https://hosted.weblate.org/projects/kernelsu/manager/).



Current translation status:

![Weblate translation
status](https://hosted.weblate.org/widgets/kernelsu/-/manager/horizontal-auto.svg)

---------

Co-authored-by: Navin Holkar <fakeuser1693@gmail.com>
Co-authored-by: Cabrito <zrenzo81@gmail.com>
Co-authored-by: Fiqri Ardyansyah <fiqri0927936@gmail.com>
Co-authored-by: Yuttapong Paengsai <nuppyy400@gmail.com>
Co-authored-by: Rəşad Qasımlı <rashadgasimly2005@gmail.com>
Co-authored-by: Kazuki Nakashima <flukfik41@gmail.com>
Co-authored-by: Marvin Grasberger <marvingrasberger14@gmail.com>
Co-authored-by: Mantas <mantukasjolanta@gmail.com>
Co-authored-by: Sergio <sergta@live.com>
Co-authored-by: Melo Longo <melolongo87@gmail.com>
Co-authored-by: Igor Sorocean <sorocean.igor@gmail.com>
Co-authored-by: cachiusa <nhat.dogpro@outlook.com>
Co-authored-by: CakesTwix <cakestwix1@gmail.com>
Co-authored-by: SchweGELBin <abramjannikmichael06@gmail.com>
2023-07-17 08:57:39 +08:00
Weblate (bot)
0953f50e0c Translations update from Hosted Weblate (#771)
Translations update from [Hosted Weblate](https://hosted.weblate.org)
for
[KernelSU/Manager](https://hosted.weblate.org/projects/kernelsu/manager/).



Current translation status:

![Weblate translation
status](https://hosted.weblate.org/widgets/kernelsu/-/manager/horizontal-auto.svg)

---------

Co-authored-by: Karl Schrader <pokemetti@gmail.com>
Co-authored-by: weishu tian <twsxtd@gmail.com>
Co-authored-by: tcheral <lcockx@protonmail.com>
Co-authored-by: Тимур Муллаяров (Timur_23_1337) <mullaiarov2002@gmail.com>
2023-07-16 23:46:31 +08:00
Kirill
77ac974ce8 website: updated index.ts, ru_RU.ts, as well as some links (#763)
On the web page there is no link to the translation itself, I
familiarized myself with vitepress and edited the necessary configs
2023-07-13 20:59:38 +08:00
セリカ・シルフィル
d714ab0c5d CI: Add ARCVM release build (#762) 2023-07-13 20:58:45 +08:00
weishu
38eb93d5ca website: fix deploy 2023-07-13 20:11:37 +08:00
Kirill
080d5bd9e8 Translation of instructions into Russian (#761)
This project is quite extensive, decided to translate it into Russian
(further adjustments may be required)
2023-07-13 19:26:15 +08:00
weishu
d05ec41379 manager: show loading dialog when uninstall/enable/disable module. 2023-07-12 13:00:40 +08:00
weishu
d07956ead6 ksud: fix prune module 2023-07-11 22:00:50 +08:00
weishu
4e3af6dab3 ksud: refactor module iteration 2023-07-11 21:45:45 +08:00
weishu
45d96b98c5 ksud: remove update flag file before mount. if module installation is failed, the module.img will be reverted and the update flag file may exist 2023-07-11 21:28:56 +08:00
weishu
b554c66b46 ksud: uninstall module at next boot. close #740 2023-07-11 21:25:51 +08:00
Muhammed Ali
fb87d0f0f5 Support Xiaomi Redmi Note 8 and 8T (#750)
Updated

Signed-off-by: Muhammed Ali Simsek <malisimsek17@gmail.com>
2023-07-11 21:08:16 +08:00
weishu
37abe48702 manager: save stderr of installation to log file. fix #723 2023-07-11 20:10:12 +08:00
weishu
ec9babea76 ksud: Specify the block size of the ext4 image as 1K, because our subsequent size calculations are based on this; some phones such as the Samsung S23, if no default value is specified, will cause unexpected errors. close #721 2023-07-11 18:30:33 +08:00
Zackptg5
8a464ac7b2 Add boot script directory vars (#747)
Add back variable names for post-fs-data.d and service.d directories

Co-authored-by: weishu <twsxtd@gmail.com>
2023-07-11 12:39:56 +08:00
weishu
eb5a99e4b6 ci: fix rustfmt failed (#748) 2023-07-11 12:23:56 +08:00
weishu
047312e0e5 ci: fix rustfmt failed duplicated toml 2023-07-11 12:12:53 +08:00
weishu
45a25eda50 ci: fix rustfmt failed typo 2023-07-11 12:00:42 +08:00
weishu
120c2f43de ci: fix rustfmt failed 2023-07-11 11:59:58 +08:00
Gustavo Mendes
9deb820923 Update Portuguese brazilian translation (#741)
Signed-off-by: Gustavo Mendes <gusttavo.me@outlook.com>
2023-07-10 08:49:36 +08:00
Amicia De Rune
ae21d4c9fd manager: update translation Indonesian (#734)
Signed-off-by: RooGhz720 <rooghz720@gmail.com>
2023-07-09 17:02:00 +08:00
shìwēi nguyen
5381ceabae ksud: symlink by relative path when handle partitions (#737)
This allows the Magisk design-compliant module boot script to access
`$MODDIR/system/$part` while the mounted overlay still points to
`/$part`
Fix https://github.com/tiann/KernelSU/issues/726
2023-07-09 17:01:00 +08:00
Syuugo
5d07e1d392 Add WSA Kernel 5.15.104.1 (#704)
- Add `5.15.104.1`
- Delete `5.15.78.1`
2023-07-08 12:20:27 +08:00
weishu
d78f24098a Revert "manager: don't remember state when process died." close #728
This reverts commit 12761ee167.
2023-07-08 01:22:21 +08:00
dabao1955
cd952f5e45 kernel/ksu.c:Fix word mistakes when enabling CONFIG_KSU_DEBUG (#724)
According to the instructions in Kconfig, when the `CONFIG_KSU_DEBUG`
option is turned on, KernelSU will run in `debug mode` instead of the
`debug version` mentioned in kernel/ksu.c.
2023-07-08 01:22:06 +08:00
awakened
156b17f69d Support Samsung S10/N10 and Oneplus 9/9Pro (#725)
Co-authored-by: Phạm Tiên Sinh <song.long.dai.duong@gmail.com>
2023-07-06 13:25:28 +08:00
4qwerty7
f4d2b0feab Distinguish different PT_REGS_PARM4 under x86 (#711)
1. `PT_REGS_CCALL_PARM4` 表示存放C调用约定的第4个参数的寄存器
2. `PT_REGS_SYSCALL_PARM4` 表示存放linux syscall调用约定的第4个参数的寄存器
3. 将原有 `PT_REGS_PARM4` 改为上述之一
4. 将原有 `ksu_handle_execveat_ksud` 和 `ksu_handle_execveat_sucompat` 可能被
kprobe 传递错误实参、且不使用的形参标记为 never_used 并传递 `NULL`
5. 为 `ksu_handle_execveat_ksud` 提供正确的 argv 参数用以在 x86 下也能正确识别 `init
second_stage`

---------

Co-authored-by: weishu <twsxtd@gmail.com>
2023-07-06 09:01:35 +08:00
th1nhhdk
2c0a9cd64c repos.json: Updated repo link for Sony Xperia 1 II & Sony Xperia 5 II (#722)
The old one is outdated and unmaintained
2023-07-05 21:00:49 +08:00
Howard Wu
134507b928 ci: Fix checkout branch (#720)
Don't set ref branch for properly check PR
2023-07-05 08:03:27 +08:00
Howard Wu
2b42d14ef8 ci: Fix WSA build output path (#717) 2023-07-04 12:41:14 +08:00
Jakub Skorłutowski
e6071b5247 Add Polish language (#716) 2023-07-04 12:37:06 +08:00
dabao1955
f288cfccae update featrue_request issue temple (#715)
Compared with markdown, yaml may be more focused on the required
information, and will not easily destroy the content in the template.
And I think the "feature request" might not require users to upload
their logs.

It looks like this:


![Screenshot_2023-07-03-22-53-28-88_a252b927494330cdc2c8ba3b3f952e5e](https://github.com/tiann/KernelSU/assets/79307765/ef15e532-2d69-4dea-ba7a-326b7fa2e0ef)

Co-authored-by: dabao1955 <195328750@qq.com>
2023-07-03 23:05:19 +08:00
naxitoo
1cc9da5efe Update Spanish translations + Spanish README (#710) 2023-07-03 09:52:17 +08:00
longhuan1999
0aee64f339 Update app-profile.md and strings.xml (#712)
1. website: Correcting several errors in docs of App Profile
2. manager: Remove the 'app name' field except for the default
strings.xml file
2023-07-03 09:51:54 +08:00
Ali Beyaz
cbbdc665c8 Changed some Turkish translations (#707) 2023-07-02 19:42:58 +08:00
weishu
1b2635784f website: Add docs for App Profile 2023-07-02 19:07:09 +08:00
weishu
ee5d2f8c84 kernel: fix compile err in old kernel 2023-07-02 19:06:31 +08:00
weishu
dfc2a86e70 kernel: fix compile err and format code. close #706 2023-07-02 14:51:14 +08:00
4qwerty7
c0066b68f5 kernel: support the case that init_task.mnt_ns != zygote.mnt_ns(WSA) (#698)
Basic support for the case that init_task.mnt_ns != zygote.mnt_ns(WSA),
just copy nsproxy and fs pointers for solve #276.

Note the copy in `apk_sign.c` is not required but suggested for
secure(ensure the checked mnt_ns is what ns android running, not created
by user, although many distributions does not have user ns.).

Tested with latest release on Win10 19045.3086(with WSAPatch).

Further review required for:
- [x] Security of this operation (without locking).
- [x] The impact of these modifications on other Android distributions.
2023-07-02 00:20:01 +08:00
Ali Beyaz
6ef5e4ef76 Update Turkish strings.xml (#703) 2023-07-01 21:22:50 +08:00
weishu
e3e77fde78 kernel: authorize the newly type for all roles. refer: http://aospxref.com/kernel-android12-5.10-lts/xref/security/selinux/ss/policydb.c#950 2023-07-01 20:54:13 +08:00
weishu
8ea55c7f2f manager: bump minimal kernel version 2023-07-01 20:46:20 +08:00
raystef66
d2a976b3cc Update Flemish/Dutch translation (#702) 2023-07-01 20:14:51 +08:00
weishu
d675662862 kernel: add some log 2023-07-01 19:35:28 +08:00
weishu
839b318785 ksud: don't create dir when read 2023-07-01 19:01:09 +08:00
weishu
971f59c11e ksud: fix fmt 2023-07-01 18:59:41 +08:00
weishu
ab58808b64 ksud: fix compile err 2023-07-01 18:55:01 +08:00
weishu
9cbb7cb10e ksud: apply selinux rule when profile is set 2023-07-01 18:46:21 +08:00
weishu
70f2df11d1 manager: support setting selinux rules profile 2023-07-01 18:44:56 +08:00
weishu
827a2f2901 ksud: don't apply rule when check grammer 2023-07-01 17:43:40 +08:00
weishu
a9c33f6940 ksud: load profile sepolicy rules when boot 2023-07-01 16:50:10 +08:00
weishu
2bb73a2a92 ksud: support root profile's sepolicy 2023-07-01 16:34:43 +08:00
weishu
90407986be ksud: remove unused command 2023-07-01 15:31:53 +08:00
weishu
b85ece440b manager: show context menu on touch position 2023-07-01 12:13:30 +08:00
weishu
a10d2651c1 manager: Add context menu for app profile 2023-07-01 12:13:30 +08:00
SirRGB
b308a368d3 misc grammar and typo fixes (#699) 2023-06-30 23:54:15 +08:00
weishu
e6fea652de manager: only check update for enabled module 2023-06-30 23:49:11 +08:00
Aquarius223
0856b718de kernel: Modify KERNEL_SU_VERSION logic and behavior (#696)
This patch modifies the following:
- Move the version addition logic in ksu.h to Makefile processing
- Print the current version number of KernelSU during make build

build test (normal):
 buildlog:
HOSTCC scripts/basic/bin2c Using .. as source for kernel -- KernelSU
version: 11055
  CHK     include/generated/utsrelease.h
  UPD     include/generated/utsrelease.h

 KernelSU software:
  KernelSU Working Version: 11055 (v) Superusers: 0 Modules: 0


![11055](https://github.com/tiann/KernelSU/assets/47409494/10506289-04d2-41c0-bd48-bad9f0dbdec5)

build test (missing .git file):
 buildlog:
HOSTCC scripts/basic/bin2c Using .. as source for kernel
../drivers/kernelsu/Makefile:23: "KSU_GIT_VERSION not defined! It is
better to make KernelSU a git submodule!"
  CHK     include/generated/utsrelease.h
  CHK     scripts/mod/devicetable-offsets.h

 KernelSU software:
  KernelSU Working Version: 16 (v) Superusers: 0 Modules: 0

The current kernel version 16 is too low for the manager to function
properly. Please upgrade to version 10977 or higher!


![16](https://github.com/tiann/KernelSU/assets/47409494/9ea877a7-7b91-4a27-b6ab-58ce6e1b386f)

(cherry picked from commit 0c38a1614a77d80de752aba20908e3f9d21660a8)
Change-Id: I570f2ee33db224e1a36770f847137f290ba9bcfd

Co-authored-by: stic-server-open <1138705738@qq.com>
2023-06-28 21:45:36 +08:00
Zillion
6f1ccc5b3c Remove fontFamily from the Unsupported Warning (#694)
Just a small design fix, to make the Unsupported Warning text have the
same font as the Working text.

## Before

![before](https://github.com/tiann/KernelSU/assets/77107077/7e3f2382-446a-4039-8bec-d72c7e4471b3)

## After

![after](https://github.com/tiann/KernelSU/assets/77107077/31905aa3-a274-4289-b51b-0c45bbeee90e)
2023-06-27 21:17:48 +08:00
weishu
da959b4e17 kernel: fix compile err on lower kernel 2023-06-27 20:46:09 +08:00
likkai
0bfd6d9e30 Add device (lisa) (#691)
Co-authored-by: weishu <twsxtd@gmail.com>
2023-06-27 10:55:05 +08:00
weishu
980f1d09bc kernel: allow kernel to mount loop devices. close #514 2023-06-26 19:29:29 +08:00
weishu
b644c124e3 kernel: copy filename ourself instead of getname 2023-06-26 19:28:40 +08:00
weishu
65005131bd Create FUNDING.yml 2023-06-26 18:53:27 +08:00
syntaxticsugr
18aa7f2a17 Fixed Banner Art (#687)
Minor change (added spaces) to fix KSU Banner Art.
2023-06-26 18:22:56 +08:00
Zillion
cd5bc2efa9 Add Spanish Translation (#689) 2023-06-26 10:45:24 +08:00
Pegioner
477361f119 Update Russian translation (#681) 2023-06-24 20:17:51 +08:00
Gustavo Mendes
d3632e4b3b Update Portuguese brazilian translation (#682)
Signed-off-by: Gustavo Mendes <gusttavo.me@outlook.com>
2023-06-24 20:17:15 +08:00
SoDebug
0c2f90123b repos.json: Update the link of the KernelSU kernel release repo of the device I maintain (#686)
Update the link of the KernelSU kernel release repo of the device I
maintain
2023-06-24 20:16:25 +08:00
Howard Wu
09d90e1a0a ci: update gki version (#679)
Fix the version name of android13-5.15.74
Add android12-5.10.117
2023-06-23 17:48:18 +08:00
Trịnh Văn Lợi
4fe167c361 Update Vietnamese strings (#678) 2023-06-23 17:30:04 +08:00
112 changed files with 3978 additions and 729 deletions

5
.github/FUNDING.yml vendored Normal file
View File

@@ -0,0 +1,5 @@
# These are supported funding model platforms
github: tiann
patreon: weishu
custom: https://vxposed.com/donate.html

View File

@@ -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
View File

@@ -0,0 +1,11 @@
name: Custom issue template
description: Ask questions about other aspects of the project
title: '[Custom]'
body:
- type: textarea
id: description
attributes:
label: "Describe your problem."
validations:
required: true

View File

@@ -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.

View 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."

View File

@@ -22,13 +22,15 @@ jobs:
matrix:
include:
- sub_level: 66
os_patch_level: 2021-11
os_patch_level: 2022-01
- sub_level: 81
os_patch_level: 2022-03
- sub_level: 101
os_patch_level: 2022-05
- sub_level: 110
os_patch_level: 2022-07
- sub_level: 117
os_patch_level: 2022-09
- sub_level: 136
os_patch_level: 2022-11
- sub_level: 149

View File

@@ -41,7 +41,7 @@ jobs:
os_patch_level: 2022-11
- version: "5.15"
sub_level: 74
os_patch_level: 2023-02
os_patch_level: 2023-01
- version: "5.15"
sub_level: 78
os_patch_level: 2023-03

View File

@@ -62,7 +62,6 @@ jobs:
uses: actions/checkout@v3
with:
path: KernelSU
ref: main
fetch-depth: 0
- name: Setup kernel source
@@ -98,6 +97,10 @@ jobs:
run: |
set -a && . build.config.gki.x86_64; set +a
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} ${DEFCONFIG} < /dev/null

View File

@@ -18,32 +18,31 @@ jobs:
strategy:
matrix:
arch: [x86_64, arm64]
version: ["5.15.78.1", "5.15.94.4"]
version: ["5.15.94.4", "5.15.104.1"]
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.104.1"
arch: x86_64
make_config: config-wsa-x64
- version: "5.15.104.1"
arch: arm64
make_config: config-wsa-arm64
- version: "5.15.94.4"
device_code: latte-2
kernel_version: "5.15"
- version: "5.15.104.1"
device_code: latte-2
kernel_version: "5.15"
name: Build WSA-Kernel-${{ matrix.version }}-${{ matrix.arch }}
runs-on: ubuntu-20.04
@@ -76,7 +75,6 @@ jobs:
uses: actions/checkout@v3
with:
path: KernelSU
ref: main
fetch-depth: 0
- name: Setup kernel source
@@ -117,8 +115,13 @@ jobs:
run: |
cp configs/wsa/${{ matrix.make_config }} .config
make olddefconfig
if [ ! -z ${{ vars.EXPECTED_SIZE }} ] && [ ! -z ${{ vars.EXPECTED_HASH }} ]; then
export KSU_EXPECTED_SIZE=${{ vars.EXPECTED_SIZE }}
export KSU_EXPECTED_HASH=${{ vars.EXPECTED_HASH }}
fi
make -j`nproc` LLVM=1 ARCH=${{ matrix.arch }} CROSS_COMPILE=${{ matrix.cross_compile }} ${{ matrix.file_name }} CCACHE="/usr/bin/ccache"
echo "file_path=WSA-Linux-Kernel/arch/${{ matrix.arch }}/boot/${{ matrix.file_name }}" >> $GITHUB_ENV
declare -A ARCH_MAP=(["x86_64"]="x86" ["arm64"]="arm64")
echo "file_path=WSA-Linux-Kernel/arch/${ARCH_MAP[${{ matrix.arch }}]}/boot/${{ matrix.file_name }}" >> $GITHUB_ENV
- name: Upload kernel-${{ matrix.arch }}-${{ matrix.version }}
uses: actions/upload-artifact@v3

View File

@@ -86,17 +86,26 @@ jobs:
- name: Setup kernel source
run: |
echo "Free space:"
df -h
cd $GITHUB_WORKSPACE
git clone https://gerrit.googlesource.com/git-repo
sudo apt-get install repo -y
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 }})
DEFAULT_MANIFEST_PATH=.repo/manifests/default.xml
if grep -q deprecated <<< $REMOTE_BRANCH; then
echo "Found deprecated branch: ${{ inputs.tag }}"
sed -i 's/"${{ inputs.tag }}"/"deprecated\/${{ inputs.tag }}"/g' .repo/manifests/default.xml
cat .repo/manifests/default.xml
sed -i 's/"${{ inputs.tag }}"/"deprecated\/${{ inputs.tag }}"/g' $DEFAULT_MANIFEST_PATH
cat $DEFAULT_MANIFEST_PATH
fi
../git-repo/repo sync -j$(nproc --all)
repo --version
repo --trace sync -q -c -j$(nproc --all) --no-tags
if [ -d prebuilts/clang/host/linux-x86 ] && [ -f common/build.config.constants ]; then
ls -d prebuilts/clang/host/linux-x86/clang-r* | grep -v $(sed -n 's/^CLANG_VERSION=//p' common/build.config.constants)
fi
rm -rf .repo
df -h
- name: Setup KernelSU
env:
@@ -144,7 +153,12 @@ jobs:
- name: Build boot.img
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
id: prepareArtifacts

View File

@@ -15,12 +15,15 @@ jobs:
uses: ./.github/workflows/build-kernel-a13.yml
build-wsa-kernel:
uses: ./.github/workflows/build-kernel-wsa.yml
build-arcvm-kernel:
uses: ./.github/workflows/build-kernel-arcvm.yml
release:
needs:
- build-manager
- build-a12-kernel
- build-a13-kernel
- build-wsa-kernel
- build-arcvm-kernel
runs-on: ubuntu-latest
steps:
- name: Download artifacts
@@ -43,6 +46,15 @@ jobs:
fi
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
run: ls -R
@@ -54,3 +66,4 @@ jobs:
AnyKernel3-*.zip
boot-images-*/Image-*/*.img.gz
kernel-WSA*.zip
kernel-ARCVM*.zip

View File

@@ -27,7 +27,7 @@ jobs:
with:
components: rustfmt
- uses: LoliGothick/rustfmt-check@v0.3.1
- uses: LoliGothick/rustfmt-check@master
with:
token: ${{ github.token }}
options: --manifest-path userspace/ksud/Cargo.toml
working-directory: userspace/ksud

View File

@@ -1,4 +1,5 @@
**English** | [简体中文](README_CN.md) | [繁體中文](README_TW.md) | [日本語](README_JP.md) | [Portuguese-Brazil](README_PT-BR.md) | [Türkçe](README_TR.md)
**English** | [Español](README_ES.md) | [简体中文](README_CN.md) | [繁體中文](README_TW.md) | [日本語](README_JP.md) | [Polski](README_PL.md) | [Portuguese-Brazil](README_PT-BR.md) | [Türkçe](README_TR.md) | [Русский](README_RU.md)
# KernelSU
@@ -8,22 +9,25 @@ A Kernel based root solution for Android devices.
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(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.
WSA, ChromeOS and containter-based Android can also work with KernelSU integrated.
And the current supported ABIs are : `arm64-v8a` and `x86_64`
## Usage
[Installation](https://kernelsu.org/guide/installation.html)
- [Installation Instruction](https://kernelsu.org/guide/installation.html)
- [How to build?](https://kernelsu.org/guide/how-to-build.html)
- [Official Website](https://kernelsu.org/)
## Build
## Translation
[How to build?](https://kernelsu.org/guide/how-to-build.html)
To translate KernelSU into your language, or to improve an existing translation, use [Weblate](https://hosted.weblate.org/engage/kernelsu/) please.
### Discussion
@@ -37,6 +41,6 @@ And the current supported ABIs are : `arm64-v8a` and `x86_64`
## 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.
- [Magisk](https://github.com/topjohnwu/Magisk): the sepolicy implementation.

View File

@@ -1,4 +1,4 @@
[English](README.md) | **简体中文** | [繁體中文](README_TW.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_TW.md) | [日本語](README_JP.md) | [Polski](README_PL.md) | [Portuguese-Brazil](README_PT-BR.md) | [Türkçe](README_TR.md) | [Русский](README_RU.md)
# KernelSU
@@ -8,24 +8,26 @@
- 基于内核的 su 和权限管理。
- 基于 overlayfs 的模块系统。
- [App Profile](https://kernelsu.org/guide/app-profile.html): 把 Root 权限关进笼子里。
## 兼容状态
KernelSU 官方支持 GKI 2.0 的设备内核版本5.10以上旧内核也是兼容的最低4.14+),不过需要自己编译内核。
WSA 和运行在容器上的 Android 也可以与 KernelSU 一起工作。
WSA, ChromeOS 和运行在容器上的 Android 也可以与 KernelSU 一起工作。
目前支持架构 : `arm64-v8a``x86_64`
## 使用方法
[安装教程](https://kernelsu.org/zh_CN/guide/installation.html)
- [安装教程](https://kernelsu.org/zh_CN/guide/installation.html)
- [如何构建?](https://kernelsu.org/zh_CN/guide/how-to-build.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)
@@ -37,6 +39,6 @@ WSA 和运行在容器上的 Android 也可以与 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 签名验证。
- [Diamorphine](https://github.com/m0nad/Diamorphine):一些 rootkit 技巧。
- [Magisk](https://github.com/topjohnwu/Magisk)sepolicy 的实现。

47
README_ES.md Normal file
View 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)
<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)**.

View File

@@ -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)
# KernelSU
@@ -8,24 +8,28 @@ Android におけるカーネルベースの root ソリューションです。
1. カーネルベースの `su` と権限管理
2. OverlayFS に基づくモジュールシステム
3. [アプリのプロファイル](https://kernelsu.org/guide/app-profile.html): root の権限をケージ内に閉じ込めます。
## 対応状況
KernelSU は GKI 2.0 デバイス(カーネルバージョン 5.10 以上を公式にサポートしています。古いカーネル4.14以上)とも互換性がありますが、自分でカーネルをビルドする必要があります。
WSA とコンテナ上で動作する Android でも KernelSU を統合して動かせます。
WSA 、ChromeOS とコンテナ上で動作する Android でも KernelSU を統合して動かせます。
現在サポートしているアーキテクチャは `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)
@@ -37,6 +41,7 @@ WSA とコンテナ上で動作する Android でも 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 の署名検証
- [Diamorphine](https://github.com/m0nad/Diamorphine): rootkit のスキル
- [Magisk](https://github.com/topjohnwu/Magisk)sepolicy の実装

42
README_PL.md Normal file
View 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)
# 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.

View File

@@ -1,4 +1,4 @@
[English](README.md) | [简体中文](README_CN.md) | [繁體中文](README_TW.md) | [日本語](README_JP.md) | **Portuguese-Brazil** | [Türkçe](README_TR.md)
[English](README.md) | [Español](README_ES.md) | [简体中文](README_CN.md) | [繁體中文](README_TW.md) | [日本語](README_JP.md) | [Polski](README_PL.md) | **Portuguese-Brazil** | [Türkçe](README_TR.md) | [Русский](README_RU.md)
# KernelSU
@@ -10,21 +10,23 @@ Uma solução raiz baseada em Kernel para dispositivos Android.
2. Sistema modular baseado em overlayfs.
3. [App Perfil](https://kernelsu.org/guide/app-profile.html): Tranque o poder raiz em uma gaiola.
## 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.
WSA, ChromeOS e Android baseado em 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)
- [Como construir?](https://kernelsu.org/guide/how-to-build.html)
- [Site Oficial](https://kernelsu.org/)
[Instalação](https://kernelsu.org/guide/installation.html)
## Construir
[Como construir?](https://kernelsu.org/guide/how-to-build.html)
## Tradução
Para traduzir o KernelSU para o seu idioma, ou para melhorar uma tradução existente, use o [Weblate](https://hosted.weblate.org/engage/kernelsu/), por favor.
### Discussão
@@ -39,9 +41,6 @@ E os ABIs atualmente suportados são: `arm64-v8a` e `x86_64`
## 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.
- [genuine](https://github.com/brevent/genuine/): validação de assinatura apk v2.
- [Diamorphine](https://github.com/m0nad/Diamorphine): algumas habilidades de rootkit.

42
README_RU.md Normal file
View 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) | **Русский**
# 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.

View File

@@ -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)
# 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.
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
@@ -19,11 +20,13 @@ Ve desteklenen mevcut ABI'ler : `arm64-v8a` ve `x86_64`
## 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
@@ -37,6 +40,6 @@ Ve desteklenen mevcut ABI'ler : `arm64-v8a` ve `x86_64`
## Krediler
- [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.
- [Diamorphine](https://github.com/m0nad/Diamorphine): bazı rootkit becerileri.
- [Magisk](https://github.com/topjohnwu/Magisk): sepolicy uygulaması.

View File

@@ -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)
# KernelSU

View File

@@ -15,18 +15,27 @@ obj-y += selinux/
# .git is a text file while the module is imported by 'git submodule add'.
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)
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
ifndef EXPECTED_SIZE
EXPECTED_SIZE := 0x033b
ifndef KSU_EXPECTED_SIZE
KSU_EXPECTED_SIZE := 0x033b
endif
ifndef EXPECTED_HASH
EXPECTED_HASH := 0xb0b91415
ifndef KSU_EXPECTED_HASH
KSU_EXPECTED_HASH := 0xb0b91415
endif
ccflags-y += -DEXPECTED_SIZE=$(EXPECTED_SIZE)
ccflags-y += -DEXPECTED_HASH=$(EXPECTED_HASH)
$(info -- KernelSU Manager signature size: $(KSU_EXPECTED_SIZE))
$(info -- KernelSU Manager signature hash: $(KSU_EXPECTED_HASH))
ccflags-y += -DEXPECTED_SIZE=$(KSU_EXPECTED_SIZE)
ccflags-y += -DEXPECTED_HASH=$(KSU_EXPECTED_HASH)
ccflags-y += -Wno-implicit-function-declaration -Wno-strict-prototypes -Wno-int-conversion -Wno-gcc-compat
ccflags-y += -Wno-declaration-after-statement

View File

@@ -349,10 +349,9 @@ void do_save_allow_list(struct work_struct *work)
struct perm_data *p = NULL;
struct list_head *pos = NULL;
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)) {
pr_err("save_allow_list create file failed: %ld\n", PTR_ERR(fp));
return;
@@ -392,15 +391,14 @@ void do_load_allow_list(struct work_struct *work)
struct file *fp = NULL;
u32 magic;
u32 version;
KWORKER_INSTALL_KEYRING();
#ifdef CONFIG_KSU_DEBUG
// always allow adb shell by default
ksu_grant_root_to_shell();
#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)) {
pr_err("load_allow_list open file failed: %ld\n", PTR_ERR(fp));
return;

View File

@@ -16,7 +16,7 @@ check_v2_signature(char *path, unsigned expected_size, unsigned expected_hash)
int sign = -1;
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)) {
pr_err("open %s error.", path);
return PTR_ERR(fp);

View File

@@ -8,7 +8,8 @@
#define __PT_PARM1_REG regs[0]
#define __PT_PARM2_REG regs[1]
#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_PARM6_REG regs[5]
#define __PT_RET_REG regs[30]
@@ -29,8 +30,8 @@
#define __PT_PARM2_REG si
#define __PT_PARM3_REG dx
/* syscall uses r10 for PARM4 */
#define __PT_PARM4_REG r10
// #define __PT_PARM4_REG cx
#define __PT_SYSCALL_PARM4_REG r10
#define __PT_CCALL_PARM4_REG cx
#define __PT_PARM5_REG r8
#define __PT_PARM6_REG r9
#define __PT_RET_REG sp
@@ -56,7 +57,8 @@
#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_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_PARM6(x) (__PT_REGS_CAST(x)->__PT_PARM6_REG)
#define PT_REGS_RET(x) (__PT_REGS_CAST(x)->__PT_RET_REG)

View File

@@ -232,8 +232,10 @@ int ksu_handle_prctl(int option, unsigned long arg2, unsigned long arg3,
// someone wants to be root manager, just check it!
// arg3 should be `/data/user/<userId>/<manager_package_name>`
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");
#endif
return 0;
}
@@ -559,7 +561,14 @@ static int handler_pre(struct kprobe *p, struct pt_regs *regs)
int option = (int)PT_REGS_PARM1(real_regs);
unsigned long arg2 = (unsigned long)PT_REGS_PARM2(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);
return ksu_handle_prctl(option, arg2, arg3, arg4, arg5);
@@ -579,7 +588,7 @@ static int renameat_handler_pre(struct kprobe *p, struct pt_regs *regs)
struct dentry *new_entry = rd->new_dentry;
#else
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
return ksu_handle_rename(old_entry, new_entry);

View File

@@ -1,34 +1,174 @@
#include "linux/version.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"
#else
#include "linux/sched.h"
#endif
#include "klog.h" // IWYU pragma: keep
#if LINUX_VERSION_CODE < KERNEL_VERSION(4, 10, 0)
#include "linux/key.h"
#include "linux/errno.h"
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
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)
return kernel_read(p, buf, count, pos);
return kernel_read(p, buf, count, pos);
#else
loff_t offset = pos ? *pos : 0;
ssize_t result = kernel_read(p, offset, (char *)buf, count);
if (pos && result > 0)
{
*pos = offset + result;
}
return result;
loff_t offset = pos ? *pos : 0;
ssize_t result = kernel_read(p, offset, (char *)buf, count);
if (pos && result > 0) {
*pos = offset + result;
}
return result;
#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)
return kernel_write(p, buf, count, pos);
return kernel_write(p, buf, count, pos);
#else
loff_t offset = pos ? *pos : 0;
ssize_t result = kernel_write(p, buf, count, offset);
if (pos && result > 0)
{
*pos = offset + result;
}
return result;
loff_t offset = pos ? *pos : 0;
ssize_t result = kernel_write(p, buf, count, offset);
if (pos && result > 0) {
*pos = offset + result;
}
return result;
#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

View File

@@ -5,38 +5,20 @@
#include "linux/key.h"
#include "linux/version.h"
extern struct key *init_session_keyring;
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);
extern long ksu_strncpy_from_user_nofault(char *dst,
const void __user *unsafe_addr,
long count);
#if LINUX_VERSION_CODE < KERNEL_VERSION(4, 10, 0)
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);
}
#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()
extern struct key *init_session_keyring;
#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

View File

@@ -39,7 +39,7 @@ int __init kernelsu_init(void)
pr_alert("*************************************************************");
pr_alert("** NOTICE NOTICE NOTICE NOTICE NOTICE NOTICE NOTICE **");
pr_alert("** **");
pr_alert("** You are running DEBUG version of KernelSU **");
pr_alert("** You are running KernelSU in DEBUG mode **");
pr_alert("** **");
pr_alert("** NOTICE NOTICE NOTICE NOTICE NOTICE NOTICE NOTICE **");
pr_alert("*************************************************************");
@@ -47,7 +47,7 @@ int __init kernelsu_init(void)
ksu_core_init();
ksu_workqueue = alloc_workqueue("kernelsu_work_queue", 0, 0);
ksu_workqueue = alloc_ordered_workqueue("kernelsu_work_queue", 0);
ksu_allowlist_init();

View File

@@ -4,16 +4,7 @@
#include "linux/types.h"
#include "linux/workqueue.h"
#ifndef KSU_GIT_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_VERSION KSU_VERSION
#define KERNEL_SU_OPTION 0xDEADBEEF
#define CMD_GRANT_ROOT 0

View File

@@ -1,7 +1,5 @@
#include "asm/current.h"
#include "linux/string.h"
#include "linux/compat.h"
#include "linux/cred.h"
#include "linux/dcache.h"
#include "linux/err.h"
#include "linux/fs.h"
@@ -12,12 +10,12 @@
#include "linux/uaccess.h"
#include "linux/version.h"
#include "linux/workqueue.h"
#include "linux/input.h"
#include "allowlist.h"
#include "arch.h"
#include "klog.h" // IWYU pragma: keep
#include "ksud.h"
#include "kernel_compat.h"
#include "selinux/selinux.h"
static const char KERNEL_SU_RC[] =
@@ -140,8 +138,9 @@ static int __maybe_unused count(struct user_arg_ptr argv, int max)
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,
void *argv, void *envp, int *flags)
struct user_arg_ptr *argv, void *__never_use_envp, int *__never_use_flags)
{
#ifndef CONFIG_KPROBES
if (!ksu_execveat_hook) {
@@ -165,45 +164,25 @@ int ksu_handle_execveat_ksud(int *fd, struct filename **filename_ptr,
if (unlikely(!memcmp(filename->name, system_bin_init,
sizeof(system_bin_init) - 1))) {
#ifdef __aarch64__
// /system/bin/init executed
struct user_arg_ptr *ptr = (struct user_arg_ptr*) argv;
int argc = count(*ptr, MAX_ARG_STRINGS);
int argc = count(*argv, MAX_ARG_STRINGS);
pr_info("/system/bin/init argc: %d\n", argc);
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)) {
char first_arg[16];
#if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 8, 0)
strncpy_from_user_nofault(first_arg, p, sizeof(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
ksu_strncpy_from_user_nofault(first_arg, p, sizeof(first_arg));
pr_info("first arg: %s\n", first_arg);
if (!strcmp(first_arg, "second_stage")) {
pr_info("/system/bin/init second_stage executed\n");
apply_kernelsu_rules();
init_second_stage_executed = true;
ksu_android_ns_fs_check();
}
} else {
pr_err("/system/bin/init parse args err!\n");
}
}
#else
// The argument parse is incorrect becuase of the struct user_arg_ptr has 16bytes
// and it is passed by value(not pointer), in arm64, it is correct becuase the register
// is just arranged correct accidentally, but is not correct in x86_64
// i have no device to test, so revert it for x86_64
static int init_count = 0;
if (++init_count == 2) {
// 1: /system/bin/init selinux_setup
// 2: /system/bin/init second_stage
pr_info("/system/bin/init second_stage executed\n");
apply_kernelsu_rules();
}
#endif
}
if (unlikely(first_app_process &&
@@ -400,11 +379,19 @@ static int execve_handler_pre(struct kprobe *p, struct pt_regs *regs)
int *fd = (int *)&PT_REGS_PARM1(regs);
struct filename **filename_ptr =
(struct filename **)&PT_REGS_PARM2(regs);
void *argv = (void *)&PT_REGS_PARM3(regs);
void *envp = (void *)&PT_REGS_PARM4(regs);
int *flags = (int *)&PT_REGS_PARM5(regs);
struct user_arg_ptr argv;
#ifdef CONFIG_COMPAT
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)
@@ -412,7 +399,7 @@ static int read_handler_pre(struct kprobe *p, struct pt_regs *regs)
struct file **file_ptr = (struct file **)&PT_REGS_PARM1(regs);
char __user **buf_ptr = (char **)&PT_REGS_PARM2(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);
}
@@ -422,7 +409,7 @@ static int input_handle_event_handler_pre(struct kprobe *p,
{
unsigned int *type = (unsigned int *)&PT_REGS_PARM2(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);
}

View File

@@ -114,6 +114,10 @@ void apply_kernelsu_rules()
ksu_allow(db, "hwservicemanager", KERNEL_SU_DOMAIN, "process",
"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
ksu_allow(db, ALL, KERNEL_SU_DOMAIN, "binder", ALL);

View File

@@ -26,7 +26,9 @@ static int transive_to_domain(const char *domain)
}
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 (!ksu_sid)
ksu_sid = sid;

View File

@@ -73,7 +73,7 @@ static bool add_typeattribute(struct policydb *db, const char *type,
// rules
#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; \
for (i = 0; i < n_slot; ++i) \
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:
// https://elixir.bootlin.com/linux/v5.8-rc1/source/security/selinux/ss/symtab.h
#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
#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)
#endif
// symtab_search is introduced on 5.9.0:
@@ -95,8 +96,7 @@ static bool add_typeattribute(struct policydb *db, const char *type,
#endif
#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,
struct avtab_key *key,
@@ -693,7 +693,7 @@ static bool add_type(struct policydb *db, const char *type_name, bool attr)
int i;
for (i = 0; i < db->p_roles.nprim; ++i) {
ebitmap_set_bit(&db->role_val_to_struct[i]->types, value - 1,
0);
1);
}
return true;
@@ -743,7 +743,7 @@ static bool add_type(struct policydb *db, const char *type_name, bool attr)
int i;
for (i = 0; i < db->p_roles.nprim; ++i) {
ebitmap_set_bit(&db->role_val_to_struct[i]->types, value - 1,
0);
1);
}
return true;
@@ -854,7 +854,7 @@ static bool add_type(struct policydb *db, const char *type_name, bool attr)
int i;
for (i = 0; i < db->p_roles.nprim; ++i) {
ebitmap_set_bit(&db->role_val_to_struct[i]->types, value - 1,
0);
1);
}
return true;
#endif

View File

@@ -16,6 +16,7 @@
#include "arch.h"
#include "klog.h" // IWYU pragma: keep
#include "ksud.h"
#include "kernel_compat.h"
#define SU_PATH "/system/bin/su"
#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 *flags)
{
struct filename *filename;
const char su[] = SU_PATH;
if (!ksu_is_allow_uid(current_uid().val)) {
return 0;
}
filename = getname(*filename_user);
char path[sizeof(su)];
memset(path, 0, sizeof(path));
ksu_strncpy_from_user_nofault(path, *filename_user, sizeof(path));
if (IS_ERR(filename)) {
return 0;
}
if (unlikely(!memcmp(filename->name, su, sizeof(su)))) {
if (unlikely(!memcmp(path, su, sizeof(su)))) {
pr_info("faccessat su->sh!\n");
*filename_user = sh_user_path();
}
putname(filename);
return 0;
}
int ksu_handle_stat(int *dfd, const char __user **filename_user, int *flags)
{
// const char sh[] = SH_PATH;
struct filename *filename;
const char su[] = SU_PATH;
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;
}
filename = getname(*filename_user);
char path[sizeof(su)];
memset(path, 0, sizeof(path));
ksu_strncpy_from_user_nofault(path, *filename_user, sizeof(path));
if (IS_ERR(filename)) {
return 0;
}
if (unlikely(!memcmp(filename->name, su, sizeof(su)))) {
if (unlikely(!memcmp(path, su, sizeof(su)))) {
pr_info("newfstatat su->sh!\n");
*filename_user = sh_user_path();
}
putname(filename);
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,
void *argv, void *envp, int *flags)
void *__never_use_argv, void *__never_use_envp, int *__never_use_flags)
{
struct filename *filename;
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);
const char __user **filename_user = (const char **)&PT_REGS_PARM2(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);
}
@@ -142,7 +137,7 @@ static int newfstatat_handler_pre(struct kprobe *p, struct pt_regs *regs)
int *flags = (int *)&PT_REGS_PARM3(regs);
#else
// int vfs_fstatat(int dfd, const char __user *filename, struct kstat *stat,int flag)
int *flags = (int *)&PT_REGS_PARM4(regs);
int *flags = (int *)&PT_REGS_CCALL_PARM4(regs);
#endif
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);
struct filename **filename_ptr =
(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,
flags);
return ksu_handle_execveat_sucompat(fd, filename_ptr, NULL, NULL, NULL);
}
static struct kprobe faccessat_kp = {

View File

@@ -39,8 +39,7 @@ static bool is_uid_exist(uid_t uid, void *data)
static void do_update_uid(struct work_struct *work)
{
KWORKER_INSTALL_KEYRING();
struct file *fp = filp_open(SYSTEM_PACKAGES_LIST_PATH, O_RDONLY, 0);
struct file *fp = ksu_filp_open_compat(SYSTEM_PACKAGES_LIST_PATH, O_RDONLY, 0);
if (IS_ERR(fp)) {
pr_err("do_update_uid, open " SYSTEM_PACKAGES_LIST_PATH
" failed: %d\n",

View File

@@ -15,7 +15,8 @@ object Natives {
// 10931: app profile struct add 'version' field
// 10946: add capabilities
// 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 {
System.loadLibrary("kernelsu")
@@ -93,6 +94,7 @@ object Natives {
val nonRootUseDefault: Boolean = true,
val umountModules: Boolean = true,
var rules: String = "", // this field is save in ksud!!
) : Parcelable {
enum class Namespace {
Inherited,

View File

@@ -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()
}
}

View File

@@ -175,6 +175,7 @@ fun RootProfileConfig(
onProfileChange(
profile.copy(
context = domain,
rules = rules,
rootUseDefault = false
)
)
@@ -357,11 +358,14 @@ private fun UidPanel(uid: Int, label: String, onUidChange: (Int) -> Unit) {
}
@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) }
if (showDialog) {
var domain by remember { mutableStateOf(profile.context) }
var rules by remember { mutableStateOf("") }
var rules by remember { mutableStateOf(profile.rules) }
val inputOptions = listOf(
InputTextField(
@@ -382,7 +386,7 @@ private fun SELinuxPanel(profile: Natives.Profile, onSELinuxChange: (domain: Str
// value can be a-zA-Z0-9_
val regex = Regex("^[a-z_]+:[a-z0-9_]+:[a-z0-9_]+(:[a-z0-9_]+)?$")
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(
@@ -393,7 +397,6 @@ private fun SELinuxPanel(profile: Natives.Profile, onSELinuxChange: (domain: Str
type = InputTextFieldType.OUTLINED,
keyboardOptions = KeyboardOptions(
keyboardType = KeyboardType.Ascii,
imeAction = ImeAction.Done
),
singleLine = false,
resultListener = {
@@ -401,8 +404,8 @@ private fun SELinuxPanel(profile: Natives.Profile, onSELinuxChange: (domain: Str
},
validationListener = { value ->
if (isSepolicyValid(value)) ValidationResult.Valid
else ValidationResult.Invalid("Rules must be valid sepolicy")
},
else ValidationResult.Invalid("SELinux rules is invalid!")
}
)
)

View File

@@ -1,11 +1,13 @@
package me.weishu.kernelsu.ui.screen
import android.util.Log
import androidx.annotation.StringRes
import androidx.compose.animation.Crossfade
import androidx.compose.foundation.gestures.detectTapGestures
import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.BoxWithConstraints
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.height
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.Security
import androidx.compose.material3.Divider
import androidx.compose.material3.DropdownMenu
import androidx.compose.material3.DropdownMenuItem
import androidx.compose.material3.ExperimentalMaterial3Api
import androidx.compose.material3.ExposedDropdownMenuBox
import androidx.compose.material3.FilterChip
@@ -38,10 +42,14 @@ import androidx.compose.runtime.rememberCoroutineScope
import androidx.compose.runtime.saveable.rememberSaveable
import androidx.compose.runtime.setValue
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.LocalDensity
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.Dp
import androidx.compose.ui.unit.DpOffset
import androidx.compose.ui.unit.dp
import coil.compose.AsyncImage
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.RootProfileConfig
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
/**
@@ -71,16 +84,20 @@ fun AppProfileScreen(
val scope = rememberCoroutineScope()
val failToUpdateAppProfile =
stringResource(R.string.failed_to_update_app_profile).format(appInfo.label)
val failToUpdateSepolicy =
stringResource(R.string.failed_to_update_sepolicy).format(appInfo.label)
val packageName = appInfo.packageName
val initialProfile = Natives.getAppProfile(packageName, appInfo.uid)
if (initialProfile.allowSu) {
initialProfile.rules = getSepolicy(packageName)
}
var profile by rememberSaveable {
mutableStateOf(Natives.getAppProfile(packageName, appInfo.uid))
mutableStateOf(initialProfile)
}
Log.i("mylog", "profile: $profile")
Scaffold(
topBar = { TopBar { navigator.popBackStack() } }
topBar = { TopBar { navigator.popBackStack() } },
) { paddingValues ->
AppProfileInner(
modifier = Modifier
@@ -104,6 +121,12 @@ fun AppProfileScreen(
profile = profile,
onProfileChange = {
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)) {
snackbarHost.showSnackbar(failToUpdateAppProfile.format(appInfo.uid))
} else {
@@ -128,11 +151,13 @@ private fun AppProfileInner(
val isRootGranted = profile.allowSu
Column(modifier = modifier) {
ListItem(
headlineContent = { Text(appLabel) },
supportingContent = { Text(packageName) },
leadingContent = appIcon,
)
AppMenuBox(packageName) {
ListItem(
headlineContent = { Text(appLabel) },
supportingContent = { Text(packageName) },
leadingContent = appIcon,
)
}
SwitchItem(
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
@Composable
private fun AppProfilePreview() {

View File

@@ -23,7 +23,6 @@ import androidx.compose.ui.graphics.Color
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.platform.LocalUriHandler
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.text.font.FontFamily
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp
import com.ramcosta.composedestinations.annotation.Destination
@@ -216,7 +215,6 @@ private fun StatusCard(kernelVersion: KernelVersion, ksuVersion: Int?) {
Column(Modifier.padding(start = 20.dp)) {
Text(
text = stringResource(R.string.home_unsupported),
fontFamily = FontFamily.Serif,
style = MaterialTheme.typography.titleMedium
)
Spacer(Modifier.height(4.dp))
@@ -233,7 +231,7 @@ private fun StatusCard(kernelVersion: KernelVersion, ksuVersion: Int?) {
@Composable
fun WarningCard(
message: String, color: Color = MaterialTheme.colorScheme.error, onClick: () -> Unit = {}
message: String, color: Color = MaterialTheme.colorScheme.error, onClick: (() -> Unit)? = null
) {
ElevatedCard(
colors = CardDefaults.elevatedCardColors(
@@ -243,16 +241,12 @@ fun WarningCard(
Row(
modifier = Modifier
.fillMaxWidth()
.then(onClick?.let { Modifier.clickable { it() } } ?: Modifier)
.padding(24.dp)
.clickable {
onClick()
}, verticalAlignment = Alignment.CenterVertically
) {
Column() {
Text(
text = message, style = MaterialTheme.typography.bodyMedium
)
}
Text(
text = message, style = MaterialTheme.typography.bodyMedium
)
}
}
}
@@ -364,3 +358,12 @@ private fun StatusCardPreview() {
StatusCard(KernelVersion(4, 10, 101), null)
}
}
@Preview
@Composable
private fun WarningCardPreview() {
Column {
WarningCard(message = "Warning message")
WarningCard(message = "Warning message ", MaterialTheme.colorScheme.outlineVariant, onClick = {})
}
}

View File

@@ -13,7 +13,11 @@ import androidx.compose.material.icons.filled.Refresh
import androidx.compose.material.icons.filled.Save
import androidx.compose.material3.*
import androidx.compose.runtime.*
import androidx.compose.runtime.saveable.rememberSaveable
import androidx.compose.ui.ExperimentalComposeUiApi
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.tooling.preview.Preview
import androidx.compose.ui.unit.dp
@@ -23,6 +27,7 @@ import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext
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.installModule
import me.weishu.kernelsu.ui.util.reboot
@@ -34,15 +39,18 @@ import java.util.*
* @author weishu
* @date 2023/1/1.
*/
@OptIn(ExperimentalComposeUiApi::class)
@Composable
@Destination
fun InstallScreen(navigator: DestinationsNavigator, uri: Uri) {
var text by remember { mutableStateOf("") }
var showFloatAction by remember { mutableStateOf(false) }
var text by rememberSaveable { mutableStateOf("") }
val logContent = StringBuilder()
var showFloatAction by rememberSaveable { mutableStateOf(false) }
val snackBarHost = LocalSnackbarHost.current
val scope = rememberCoroutineScope()
val scrollState = rememberScrollState()
LaunchedEffect(Unit) {
if (text.isNotEmpty()) {
@@ -53,9 +61,15 @@ fun InstallScreen(navigator: DestinationsNavigator, uri: Uri) {
if (success) {
showFloatAction = true
}
}) {
}, onStdout = {
text += "$it\n"
}
scope.launch {
scrollState.animateScrollTo(scrollState.maxValue)
}
logContent.append(it).append("\n")
}, onStderr = {
logContent.append(it).append("\n")
});
}
}
@@ -73,7 +87,7 @@ fun InstallScreen(navigator: DestinationsNavigator, uri: Uri) {
Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS),
"KernelSU_install_log_${date}.log"
)
file.writeText(text)
file.writeText(logContent.toString())
snackBarHost.showSnackbar("Log saved to ${file.absolutePath}")
}
}
@@ -97,11 +111,14 @@ fun InstallScreen(navigator: DestinationsNavigator, uri: Uri) {
}
) { innerPadding ->
KeyEventBlocker {
it.key == Key.VolumeDown || it.key == Key.VolumeUp
}
Column(
modifier = Modifier
.fillMaxSize(1f)
.padding(innerPadding)
.verticalScroll(rememberScrollState()),
.verticalScroll(scrollState),
) {
Text(
modifier = Modifier.padding(8.dp),

View File

@@ -19,6 +19,7 @@ import androidx.compose.material.pullrefresh.pullRefresh
import androidx.compose.material.pullrefresh.rememberPullRefreshState
import androidx.compose.material3.*
import androidx.compose.runtime.*
import androidx.compose.runtime.saveable.rememberSaveable
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.platform.LocalContext
@@ -33,11 +34,14 @@ import androidx.compose.ui.unit.dp
import androidx.lifecycle.viewmodel.compose.viewModel
import com.ramcosta.composedestinations.annotation.Destination
import com.ramcosta.composedestinations.navigation.DestinationsNavigator
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext
import me.weishu.kernelsu.Natives
import me.weishu.kernelsu.R
import me.weishu.kernelsu.ui.component.ConfirmDialog
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.util.*
import me.weishu.kernelsu.ui.viewmodel.ModuleViewModel
@@ -48,7 +52,7 @@ fun ModuleScreen(navigator: DestinationsNavigator) {
val viewModel = viewModel<ModuleViewModel>()
LaunchedEffect(Unit) {
if (viewModel.moduleList.isEmpty()) {
if (viewModel.moduleList.isEmpty() || viewModel.isNeedRefresh) {
viewModel.fetchModuleList()
}
}
@@ -76,6 +80,8 @@ fun ModuleScreen(navigator: DestinationsNavigator) {
navigator.navigate(InstallScreenDestination(uri))
viewModel.markNeedRefresh()
Log.i("ModuleScreen", "select zip result: ${it.data}")
}
@@ -94,6 +100,8 @@ fun ModuleScreen(navigator: DestinationsNavigator) {
ConfirmDialog()
LoadingDialog()
when {
hasMagisk -> {
Box(
@@ -152,7 +160,12 @@ private fun ModuleList(
return
}
val success = uninstallModule(module.id)
val success = dialogHost.withLoading {
withContext(Dispatchers.IO) {
uninstallModule(module.id)
}
}
if (success) {
viewModel.fetchModuleList()
}
@@ -175,33 +188,44 @@ private fun ModuleList(
val refreshState = rememberPullRefreshState(refreshing = viewModel.isRefreshing,
onRefresh = { viewModel.fetchModuleList() })
Box(modifier.pullRefresh(refreshState)) {
if (viewModel.isOverlayAvailable) {
val context = LocalContext.current
val context = LocalContext.current
LazyColumn(
modifier = Modifier.fillMaxSize(),
verticalArrangement = Arrangement.spacedBy(16.dp),
contentPadding = remember {
PaddingValues(
start = 16.dp,
top = 16.dp,
end = 16.dp,
bottom = 16.dp + 16.dp + 56.dp /* Scaffold Fab Spacing + Fab container height */
)
},
) {
val isEmpty = viewModel.moduleList.isEmpty()
if (isEmpty) {
LazyColumn(
modifier = Modifier.fillMaxSize(),
verticalArrangement = Arrangement.spacedBy(16.dp),
contentPadding = remember {
PaddingValues(
start = 16.dp,
top = 16.dp,
end = 16.dp,
bottom = 16.dp + 16.dp + 56.dp /* Scaffold Fab Spacing + Fab container height */
)
},
) {
when {
!viewModel.isOverlayAvailable -> {
item {
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 ->
var isChecked by remember(module) { mutableStateOf(module.enabled) }
var isChecked by rememberSaveable(module) { mutableStateOf(module.enabled) }
val scope = rememberCoroutineScope()
val updateUrl by produceState(initialValue = "") {
viewModel.checkUpdate(module) { value = it.orEmpty() }
@@ -213,10 +237,14 @@ private fun ModuleList(
ModuleItem(module, isChecked, updateUrl, onUninstall = {
scope.launch { onModuleUninstall(module) }
}, onCheckChanged = {
val success = toggleModule(module.id, !isChecked)
if (success) {
isChecked = it
scope.launch {
scope.launch {
val success = dialogHost.withLoading {
withContext(Dispatchers.IO) {
toggleModule(module.id, !isChecked)
}
}
if (success) {
isChecked = it
viewModel.fetchModuleList()
val result = snackBarHost.showSnackbar(
@@ -225,10 +253,10 @@ private fun ModuleList(
if (result == SnackbarResult.ActionPerformed) {
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 = {
@@ -258,15 +286,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(
refreshing = viewModel.isRefreshing, state = refreshState, modifier = Modifier.align(
Alignment.TopCenter

View File

@@ -9,7 +9,6 @@ import com.topjohnwu.superuser.ShellUtils
import me.weishu.kernelsu.BuildConfig
import me.weishu.kernelsu.Natives
import me.weishu.kernelsu.ksuApp
import me.weishu.kernelsu.ui.viewmodel.ModuleViewModel
import org.json.JSONArray
import java.io.File
@@ -92,7 +91,7 @@ fun uninstallModule(id: String): Boolean {
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
with(resolver.openInputStream(uri)) {
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 callbackList: CallbackList<String?> = object : CallbackList<String?>() {
val stdoutCallback: CallbackList<String?> = object : CallbackList<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 =
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")
file.delete()
@@ -148,6 +153,40 @@ fun isSepolicyValid(rules: String?): Boolean {
}
val shell = getRootShell()
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
}
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)
}

View File

@@ -58,6 +58,13 @@ class ModuleViewModel : ViewModel() {
}
}
var isNeedRefresh by mutableStateOf(false)
private set
fun markNeedRefresh() {
isNeedRefresh = true
}
fun fetchModuleList() {
viewModelScope.launch(Dispatchers.IO) {
isRefreshing = true
@@ -80,17 +87,19 @@ class ModuleViewModel : ViewModel() {
.map { obj ->
ModuleInfo(
obj.getString("id"),
obj.getString("name"),
obj.optString("name"),
obj.optString("author", "Unknown"),
obj.optString("version", "Unknown"),
obj.optInt("versionCode", 0),
obj.getString("description"),
obj.optString("description"),
obj.getBoolean("enabled"),
obj.getBoolean("update"),
obj.getBoolean("remove"),
obj.optString("updateJson", "")
obj.optString("updateJson")
)
}.toList()
isNeedRefresh = false
}.onFailure { e ->
Log.e(TAG, "fetchModuleList: ", e)
isRefreshing = false
@@ -107,7 +116,7 @@ class ModuleViewModel : ViewModel() {
}
fun checkUpdate(m: ModuleInfo, callback: (String?) -> Unit) {
if (m.updateJson.isEmpty()) {
if (m.updateJson.isEmpty() || m.remove || m.update || !m.enabled) {
callback(null)
return
}

View File

@@ -1,6 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="app_name" translatable="false">KernelSU</string>
<string name="home">الرئيسية</string>
<string name="home_not_installed">غير مثبت</string>
<string name="home_click_to_install">إضغط للتثبيت</string>
@@ -10,11 +9,9 @@
<string name="home_module_count">الوحدات: %d</string>
<string name="home_unsupported">غير مدعوم</string>
<string name="home_unsupported_reason">KernelSU يدعم GKI kernels فقط</string>
<string name="home_kernel">إصدار النواة</string>
<string name="home_manager_version">إصدار المدير</string>
<string name="home_fingerprint">البصمة</string>
<string name="home_selinux_status">وضع SELinux</string>
<string name="selinux_status_disabled">غير مفعل</string>
<string name="selinux_status_enforcing">مفروض</string>
@@ -24,7 +21,6 @@
<string name="module_failed_to_enable">فشل في تمكين الوحدة: %s</string>
<string name="module_failed_to_disable">فشل تعطيل الوحدة : %s</string>
<string name="module_empty">لا توجد وحدة مثبتة</string>
<string name="module">وحدة</string>
<string name="uninstall">إلغاء التثبيت</string>
<string name="module_install">تثبيت الوحدة</string>
@@ -49,13 +45,38 @@
<string name="send_log">إرسال السجلات</string>
<string name="safe_mode">الوضع الآمن</string>
<string name="reboot_to_apply">إعادة التشغيل لتطبيق التغييرات</string>
<string name="module_magisk_conflict">تم تعطيل الوحدة لأنها تتعارض مع وحدات Magisk</string>
<string name="module_magisk_conflict">تم تعطيل الوحدات النمطية لأنها تتعارض مع Magisk!</string>
<string name="home_learn_kernelsu">تعلم KernelSU</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_support_title">إدعمنا</string>
<string name="home_support_content">KernelSU سيظل دائماً مجانياً ومفتوح المصدر. مع ذلك، يمكنك أن تظهر لنا أنك تهتم بالتبرع.</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>
</resources>

View 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"></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>

View 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>

View File

@@ -1,7 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="app_name" translatable="false">কার্নেলএসইউ</string>
<string name="home">হোম</string>
<string name="home_not_installed">ইনস্টল করা হয়নি</string>
<string name="home_click_to_install">ইনস্টল করার জন্য ক্লিক করুন</string>

View 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>

View File

@@ -0,0 +1,81 @@
<?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">Klicken Sie zum Installieren</string>
<string name="home_superuser_count">Superusers: %d</string>
<string name="selinux_status_unknown">Unbekannt</string>
<string name="selinux_status_enforcing">erzwingen</string>
<string name="reboot_bootloader">Zum Bootloader-Modus neustarten</string>
<string name="reboot_download">Zum Download-Modus neustarten</string>
<string name="reboot_edl">Zum EDL-Modus neustarten</string>
<string name="module_author">Autor</string>
<string name="module_overlay_fs_not_available">overlayfs ist nicht verfügbar, Modul kann nicht funktionieren!</string>
<string name="about">Über</string>
<string name="module_magisk_conflict">Module sind deaktiviert, weil es einen Konflikt mit Magisks gibt!</string>
<string name="home_learn_kernelsu_url">https://kernelsu.org/guide/what-is-kernelsu.html</string>
<string name="home_click_to_learn_kernelsu">Erfahren Sie, wie Sie KernelSU installieren und Module verwenden</string>
<string name="home_support_title">Unterstütze uns</string>
<string name="home_support_content">"KernelSU ist und bleibt kostenlos und Open Source. Sie können uns jedoch zeigen, dass Sie sich für uns interessieren, indem Sie eine Spende tätigen."</string>
<string name="profile_selinux_context">SELinux-Kontext</string>
<string name="settings_umount_modules_default">Demontiere Module als Standard</string>
<string name="settings_umount_modules_default_summary">Der globale Standard-Wert für „Demontiere Module“ in App-Profilen. Falls aktiviert, werden alle Modul-Modifikationen zu dem System deaktiviert; für Applikationen, welche kein Profil gesetzt haben.</string>
<string name="profile_default">Standard</string>
<string name="profile_template">Vorlage</string>
<string name="profile_custom">Benutzerdefiniert</string>
<string name="failed_to_update_app_profile">Aktualisierung des App-Profils fehlgeschlagen für %s</string>
<string name="profile_namespace_inherited">Übernommen</string>
<string name="profile_namespace_global">Global</string>
<string name="profile_namespace_individual">Individuell</string>
<string name="profile_selinux_domain">Domain</string>
<string name="module_update">Aktualisierung</string>
<string name="profile_umount_modules_summary">Aktivierung dieser Option erlaubt KernelSU, alle modifizierten Dateien von den Modulen dieser Applikation wiederherstellen.</string>
<string name="profile_selinux_rules">Regeln</string>
<string name="module_start_downloading">Starte herunterladen: %s</string>
<string name="failed_to_update_sepolicy">Aktualisierung der SELinux-Regeln fehlgeschlagen für: %s</string>
<string name="launch_app">Start</string>
<string name="new_version_available">Neue Version: %s ist verfügbar, klicke zum herunterladen</string>
<string name="force_stop_app">Erzwinge Stopp</string>
<string name="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 zur Recovery</string>
<string name="module_uninstall_success">%s deinstalliert</string>
<string name="module_version">Version</string>
<string name="refresh">Neu laden</string>
<string name="show_system_apps">Zeige System-Apps</string>
<string name="hide_system_apps">Verstecke System-Apps</string>
<string name="send_log">Sende Verlauf</string>
<string name="home_learn_kernelsu">Lerne KernelSU</string>
<string name="safe_mode">Sicherer Modus</string>
<string name="reboot_to_apply">Starte neu, damit die Effekte auftreten</string>
<string name="about_source_code">Sehe den Quellcode bei %1$s<br/>Trete unserem %2$s Kanal bei</string>
<string name="profile_name">Profilname</string>
<string name="profile_namespace">Montiere Namensraum</string>
<string name="profile_groups">Gruppen</string>
<string name="profile_capabilities">Fähigkeiten</string>
<string name="profile_umount_modules">Demontiere Module</string>
<string name="module_downloading">Lädt Modul herunter: %s</string>
<string name="home_unsupported">Nicht unterstützt</string>
<string name="home_unsupported_reason">KernelSU unterstützt nun nur GKI kernels</string>
<string name="home_kernel">Kernel</string>
<string name="home_fingerprint">Fingerabdruck</string>
<string name="module_install">Installieren</string>
<string name="reboot_userspace">Leichter Neustart</string>
<string name="module_uninstall_confirm">Bist du dir sicher, dass du das Modul %s deinstallieren möchtest\?</string>
<string name="module_uninstall_failed">Deinstallation fehlgeschlagen: %s</string>
</resources>

View File

@@ -0,0 +1,82 @@
<?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">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">Descargar</string>
<string name="new_version_available">Hay una nueva versión disponible (%s). Toca para descargar</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>
</resources>

View File

@@ -1,5 +1,4 @@
<resources>
<string name="app_name" translatable="false">KernelSU</string>
<string name="home">خانه</string>
<string name="home_not_installed">نصب نشده است</string>
<string name="home_click_to_install">برای نصب ضربه بزنید</string>

View File

@@ -0,0 +1,81 @@
<?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">Superutilisateurs : %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">Fingerprint</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">Superutilisateur</string>
<string name="module_empty">Aucun module installé</string>
<string name="home">Accueil</string>
<string name="home_click_to_install">Cliquez 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">Module</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 sécurisé</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 gratuit et open-source et le restera toujours. Vous pouvez néanmoins montrer votre soutien en faisant un don.</string>
<string name="about_source_code">Voir le code source sur %1$s<br/>Rejoindre notre chaîne %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">Capabilities</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 pour cette application.</string>
<string name="settings_umount_modules_default">Démonter par défaut les modules</string>
<string name="settings_umount_modules_default_summary">Valeur globale par défaut de « Démonter les modules » dans les App Profiles. Si l\'option est activée, toutes les modifications des modules apportées au système seront enlevé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, cliquez 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 SELinux pour : %s</string>
</resources>

View File

@@ -1,77 +1,82 @@
<resources>
<string name="app_name" translatable="false">KernelSU</string>
<string name="home">Beranda</string>
<string name="home_not_installed">Tidak terpasang</string>
<string name="home_click_to_install">Klik untuk memasang</string>
<string name="home_working">Bekerja</string>
<string name="home_working_version">Versi: %d</string>
<string name="home_superuser_count">Superusers: %d</string>
<string name="home_module_count">Modul: %d</string>
<string name="home_unsupported">Tidak didukung</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_fingerprint">Sidik jari</string>
<string name="home_selinux_status">status SELinux</string>
<string name="selinux_status_disabled">Dinonaktifkan</string>
<string name="selinux_status_enforcing">Enforcing</string>
<string name="selinux_status_permissive">Permissive</string>
<string name="selinux_status_unknown">Tidak dikenal</string>
<string name="superuser">Superuser</string>
<string name="module_failed_to_enable">Gagal mengaktifkan modul: %s</string>
<string name="module_failed_to_disable">Gagal menonaktifkan modul: %s</string>
<string name="module_empty">Tidak ada modul terpasang</string>
<string name="module">Modul</string>
<string name="uninstall">Copot</string>
<string name="module_install">Pasang</string>
<string name="install">Pasang</string>
<string name="reboot">Reboot</string>
<string name="settings">Pengaturan</string>
<string name="reboot_userspace">Reboot Lembut</string>
<string name="reboot_recovery">Reboot ke Recovery</string>
<string name="reboot_bootloader">Reboot ke Bootloader</string>
<string name="reboot_download">Reboot ke Download</string>
<string name="reboot_edl">Reboot ke EDL</string>
<string name="about">Tentang</string>
<string name="module_uninstall_confirm">Apakah Anda yakin ingin mencopot modul %s?</string>
<string name="module_uninstall_success">%s Tercopot</string>
<string name="module_uninstall_failed">Gagal untuk mencopot: %s</string>
<string name="module_version">Versi</string>
<string name="module_author">Pembuat</string>
<string name="module_overlay_fs_not_available">overlayfs tidak tersedia, modul tidak dapat bekerja!</string>
<string name="refresh">Segarkan</string>
<string name="show_system_apps">Tampilkan apl sistem</string>
<string name="hide_system_apps">Sembunyikan apl sistem</string>
<string name="send_log">Kirim Log</string>
<string name="safe_mode">Mode aman</string>
<string name="reboot_to_apply">Reboot untuk menerapkan</string>
<string name="module_magisk_conflict">Modul dinonaktifkan karena bertentangan dengan Magisk!</string>
<string name="home_learn_kernelsu">Pelajari KernelSU</string>
<string name="home_learn_kernelsu_url">https://kernelsu.org/guide/what-is-kernelsu.html</string>
<string name="home_click_to_learn_kernelsu">Pelajari cara memasang KernelSU dan menggunakan modul</string>
<string name="home_support_title">Dukung Kami</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="about_source_code"><![CDATA[Lihat sumber code di %1$s<br/>Gabung kanal %2$s kami]]></string>
<string name="profile">Profil Apl</string>
<string name="profile_default">Bawaan</string>
<string name="profile_template">Templat</string>
<string name="profile_custom">Khusus</string>
<string name="profile_name">Nama profil</string>
<string name="profile_namespace">Ikat ruang-nama</string>
<string name="profile_namespace_inherited">Diwariskan</string>
<string name="profile_namespace_global">Universal</string>
<string name="profile_namespace_individual">Personal</string>
<string name="profile_groups">Kelompok</string>
<string name="profile_capabilities">Kemampuan</string>
<string name="profile_selinux_context">Konteks SELinux</string>
<string name="profile_umount_modules">Lepas modul</string>
<string name="failed_to_update_app_profile">Gagal memperbarui Profil Apl untuk %s</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="settings_umount_modules_default">Lepas modul secara bawaan</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_summary">Mengaktifkan opsi ini akan mengizinkan KernelSU memulihkan file-file yang dimodifikasi oleh modul untuk aplikasi ini.</string>
</resources>
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="home">Beranda</string>
<string name="home_not_installed">Tidak terpasang</string>
<string name="home_click_to_install">Klik untuk memasang</string>
<string name="home_working">Bekerja</string>
<string name="home_working_version">Versi: %d</string>
<string name="home_superuser_count">Superusers: %d</string>
<string name="home_module_count">Modul: %d</string>
<string name="home_unsupported">Tidak didukung</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_fingerprint">Sidik jari</string>
<string name="home_selinux_status">Status SELinux</string>
<string name="selinux_status_disabled">Dinonaktifkan</string>
<string name="selinux_status_enforcing">Enforcing</string>
<string name="selinux_status_permissive">Permissive</string>
<string name="selinux_status_unknown">Tidak dikenal</string>
<string name="superuser">Superuser</string>
<string name="module_failed_to_enable">Gagal mengaktifkan modul: %s</string>
<string name="module_failed_to_disable">Gagal menonaktifkan modul: %s</string>
<string name="module_empty">Tidak ada modul terpasang</string>
<string name="module">Modul</string>
<string name="uninstall">Copot</string>
<string name="module_install">Pasang</string>
<string name="install">Pasang</string>
<string name="reboot">Mulai ulang</string>
<string name="settings">Pengaturan</string>
<string name="reboot_userspace">Soft Reboot</string>
<string name="reboot_recovery">Mulai ulang ke Pemulihan</string>
<string name="reboot_bootloader">Mulai ulang ke Bootloader</string>
<string name="reboot_download">Mulai ulang ke Download</string>
<string name="reboot_edl">Mulai ulang ke EDL</string>
<string name="about">Tentang</string>
<string name="module_uninstall_confirm">Apakah Anda yakin ingin mencopot modul %s?</string>
<string name="module_uninstall_success">%s Tercopot</string>
<string name="module_uninstall_failed">Gagal untuk mencopot: %s</string>
<string name="module_version">Versi</string>
<string name="module_author">Pembuat</string>
<string name="module_overlay_fs_not_available">overlayfs tidak tersedia, modul tidak dapat bekerja!</string>
<string name="refresh">Segarkan</string>
<string name="show_system_apps">Tampilkan apl sistem</string>
<string name="hide_system_apps">Sembunyikan apl sistem</string>
<string name="send_log">Kirim Log</string>
<string name="safe_mode">Mode aman</string>
<string name="reboot_to_apply">Mulai ulang untuk menerapkan</string>
<string name="module_magisk_conflict">Modul dinonaktifkan karena bertentangan dengan Magisk!</string>
<string name="home_learn_kernelsu">Pelajari KernelSU</string>
<string name="home_learn_kernelsu_url">https://kernelsu.org/id_ID/guide/what-is-kernelsu.html</string>
<string name="home_click_to_learn_kernelsu">Pelajari cara memasang KernelSU dan menggunakan modul</string>
<string name="home_support_title">Dukung Kami</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="about_source_code"><![CDATA[Lihat sumber code di %1$s<br/>Gabung kanal %2$s kami]]></string>
<string name="profile">Profil Apl</string>
<string name="profile_default">Bawaan</string>
<string name="profile_template">Templat</string>
<string name="profile_custom">Khusus</string>
<string name="profile_name">Nama profil</string>
<string name="profile_namespace">Ikat ruang-nama</string>
<string name="profile_namespace_inherited">Diwariskan</string>
<string name="profile_namespace_global">Universal</string>
<string name="profile_namespace_individual">Personal</string>
<string name="profile_groups">Kelompok</string>
<string name="profile_capabilities">Kemampuan</string>
<string name="profile_selinux_context">Konteks SELinux</string>
<string name="profile_umount_modules">Lepas modul</string>
<string name="failed_to_update_app_profile">Gagal memperbarui Profil Apl untuk %s</string>
<string name="settings_umount_modules_default">Lepas modul secara bawaan</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_summary">Mengaktifkan opsi ini akan mengizinkan KernelSU memulihkan file-file yang dimodifikasi oleh modul untuk aplikasi ini.</string>
<string name="profile_selinux_domain">Domain</string>
<string name="profile_selinux_rules">Aturan</string>
<string name="module_update">Perbarui</string>
<string name="module_downloading">Mengunduh module: %s</string>
<string name="module_start_downloading">Mulai mengunduh: %s</string>
<string name="new_version_available">Versi baru: %s telah 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>
</resources>

View File

@@ -1,3 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="home">Home</string>
<string name="home_not_installed">Non installato</string>
@@ -8,11 +9,9 @@
<string name="home_module_count">Moduli: %d</string>
<string name="home_unsupported">Non supportato</string>
<string name="home_unsupported_reason">KernelSU ora supporta solo i kernel GKI</string>
<string name="home_kernel">Kernel</string>
<string name="home_manager_version">Versione del manager</string>
<string name="home_fingerprint">Fingerprint</string>
<string name="home_selinux_status">Stato SELinux</string>
<string name="selinux_status_disabled">Disabilitato</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_disable">Impossibile disabilitare il modulo: %s</string>
<string name="module_empty">Nessun modulo installato</string>
<string name="module">Moduli</string>
<string name="uninstall">Disinstalla</string>
<string name="module_install">Installa</string>
@@ -54,4 +52,30 @@
<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="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>
</resources>

View File

@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="home">ホーム</string>
<string name="home_not_installed">未インストール</string>
<string name="home_click_to_install">タップでインストール</string>
@@ -9,21 +9,18 @@
<string name="home_module_count">モジュール: %d</string>
<string name="home_unsupported">非対応</string>
<string name="home_unsupported_reason">KernelSU は現在、GKI カーネルにのみ対応しています</string>
<string name="home_kernel">カーネル</string>
<string name="home_manager_version">バージョン</string>
<string name="home_fingerprint">フィンガープリント</string>
<string name="home_selinux_status">SELinux の状態</string>
<string name="selinux_status_disabled">無効</string>
<string name="selinux_status_enforcing">Enforcing</string>
<string name="selinux_status_permissive">Permissive</string>
<string name="selinux_status_enforcing">強制実施</string>
<string name="selinux_status_permissive">寛容</string>
<string name="selinux_status_unknown">不明</string>
<string name="superuser">スーパーユーザー</string>
<string name="module_failed_to_enable">モジュールの有効化に失敗: %s</string>
<string name="module_failed_to_disable">モジュールの無効化に失敗: %s</string>
<string name="module_empty">モジュールをインストールしていません</string>
<string name="module">モジュール</string>
<string name="uninstall">アンインストール</string>
<string name="module_install">インストール</string>
@@ -41,7 +38,7 @@
<string name="module_uninstall_failed">アンインストールに失敗: %s</string>
<string name="module_version">バージョン</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="show_system_apps">システムアプリを表示</string>
<string name="hide_system_apps">システムアプリを非表示</string>
@@ -53,7 +50,7 @@
<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_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="profile">アプリのプロファイル</string>
<string name="profile_default">デフォルト</string>
@@ -65,4 +62,22 @@
<string name="profile_namespace_global">グローバル</string>
<string name="profile_namespace_individual">分離</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>
</resources>

View File

@@ -1,3 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="home"></string>
<string name="home_not_installed">설치되지 않음</string>
@@ -8,11 +9,9 @@
<string name="home_module_count">설치된 모듈: %d개</string>
<string name="home_unsupported">지원되지 않음</string>
<string name="home_unsupported_reason">KernelSU는 현재 GKI 커널만 지원합니다</string>
<string name="home_kernel">커널</string>
<string name="home_manager_version">매니저 버전</string>
<string name="home_fingerprint">빌드 정보</string>
<string name="home_selinux_status">SELinux 상태</string>
<string name="selinux_status_disabled">비활성화됨</string>
<string name="selinux_status_enforcing">적용</string>
@@ -22,7 +21,6 @@
<string name="module_failed_to_enable">모듈 활성화 실패: %s</string>
<string name="module_failed_to_disable">모듈 비활성화 실패: %s</string>
<string name="module_empty">설치된 모듈 없음</string>
<string name="module">모듈</string>
<string name="uninstall">삭제</string>
<string name="module_install">설치</string>
@@ -49,8 +47,35 @@
<string name="reboot_to_apply">다시 시작하여 변경 사항 적용</string>
<string name="module_magisk_conflict">Magisk와의 충돌로 인해 모듈을 사용할 수 없습니다!</string>
<string name="home_learn_kernelsu">KernelSU 알아보기</string>
<string name="home_click_to_learn_kernelsu">KernelSU 설치 방법과 모듈 사용 방법을 확인합니다.</string>
<string name="home_support_title">지원이 필요해요!</string>
<string name="home_click_to_learn_kernelsu">KernelSU 설치 방법과 모듈 사용 방법을 확인합니다</string>
<string name="home_support_title">지원이 필요합니다</string>
<string name="home_support_content">KernelSU는 지금도, 앞으로도 항상 무료이며 오픈 소스로 유지됩니다. 기부를 통해 여러분의 관심을 보여주세요.</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>

View File

@@ -0,0 +1,81 @@
<?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">Enforcing</string>
<string name="selinux_status_unknown">Nežinomas</string>
<string name="superuser">Supernaudotojai</string>
<string name="module_failed_to_enable">Nepavyko įjungti modulio: %s</string>
<string name="module_failed_to_disable">Nepavyko išjungti modulio: %s</string>
<string name="selinux_status_permissive">Permissive</string>
<string name="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 atsisiųsti</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>
</resources>

View 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>

View File

@@ -1,30 +1,26 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="app_name" translatable="false">KernelSU</string>
<string name="home">Home</string>
<string name="home_not_installed">Niet geïnstalleerd</string>
<string name="home_click_to_install">Klik om te installeren</string>
<string name="home_working">Werkend</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_unsupported">Niet ondersteund</string>
<string name="home_unsupported_reason">KernelSU ondersteunt alleen GKI kernels</string>
<string name="home_kernel">Kernel</string>
<string name="home_manager_version">Manager Versie</string>
<string name="home_fingerprint">Fingerprint</string>
<string name="home_selinux_status">SELinux status</string>
<string name="selinux_status_disabled">Uitgeschakeld</string>
<string name="selinux_status_enforcing">Afgedwongen</string>
<string name="selinux_status_permissive">Permissief</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_disable">Mislukt om module uit te schakelen: %s</string>
<string name="module_empty">Geen module geïnstalleerd</string>
<string name="module">Module</string>
<string name="uninstall">Verwijderen</string>
<string name="module_install">Installeren</string>
@@ -70,7 +66,6 @@
<string name="profile_selinux_context">SELinux context</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="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_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>
@@ -79,4 +74,10 @@
<string name="module_update">Update</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>
</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>

View File

@@ -0,0 +1,86 @@
<resources>
<string name="app_name" translatable="false">KernelSU</string>
<string name="home">Menu</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ł</string>
<string name="uninstall">Odinstaluj</string>
<string name="module_install">Instaluj</string>
<string name="install">Instaluj</string>
<string name="reboot">Restartuj</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 pobrać</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>
</resources>

View File

@@ -1,6 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="app_name" translatable="false">KernelSU</string>
<string name="home">Início</string>
<string name="home_not_installed">Não instalado</string>
<string name="home_click_to_install">Clique para instalar</string>
@@ -10,22 +9,19 @@
<string name="home_module_count">Módulos: %d</string>
<string name="home_unsupported">Sem Suporte</string>
<string name="home_unsupported_reason">Por enquanto, KernelSU suporta apenas kernels GKI</string>
<string name="home_kernel">Kernel</string>
<string name="home_manager_version">Versão do gerenciador</string>
<string name="home_fingerprint">Impressão digital</string>
<string name="home_selinux_status">Status do SELinux</string>
<string name="selinux_status_disabled">Desabilitado</string>
<string name="selinux_status_enforcing">Enforcing</string>
<string name="selinux_status_permissive">Permissive</string>
<string name="selinux_status_permissive">Permissivo</string>
<string name="selinux_status_unknown">Desconhecido</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_disable">Falha ao desativar o módulo: %s</string>
<string name="module_empty">Nenhum módulo instalado</string>
<string name="module">Módulo</string>
<string name="module">Módulos</string>
<string name="uninstall">Desinstalar</string>
<string name="module_install">Instalar</string>
<string name="install">Instalar</string>
@@ -62,7 +58,7 @@
<string name="profile_custom">Personalizado</string>
<string name="profile_name">Nome do perfil</string>
<string name="profile_namespace">Montar namespace</string>
<string name="profile_namespace_inherited">Padrão</string>
<string name="profile_namespace_inherited">Herdada</string>
<string name="profile_namespace_global">Global</string>
<string name="profile_namespace_individual">Individual</string>
<string name="profile_groups">Grupos</string>
@@ -70,8 +66,17 @@
<string name="profile_selinux_context">Contexto do SELinux</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="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_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="profile_umount_modules_summary">Ativar esta opção permitirá que o KernelSU restaure quaisquer arquivos modificados pelos módulos para este aplicativo.</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">Comece a baixar: %s</string>
<string name="new_version_available">Nova versão: %s está disponível, clique para baixar</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>
</resources>

View File

@@ -0,0 +1,81 @@
<?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>
</resources>

View File

@@ -9,11 +9,9 @@
<string name="home_module_count">Module: %d</string>
<string name="home_unsupported">Necompatibil</string>
<string name="home_unsupported_reason">KernelSU suportă doar nuclee GKI acum</string>
<string name="home_kernel">Nucleu</string>
<string name="home_manager_version">Versiune Manager</string>
<string name="home_fingerprint">Amprentă</string>
<string name="home_selinux_status">Stare SELinux</string>
<string name="selinux_status_disabled">Dezactivat</string>
<string name="selinux_status_enforcing">Obligatoriu</string>
@@ -23,7 +21,6 @@
<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_empty">Niciun modul instalat</string>
<string name="module">Module</string>
<string name="uninstall">Dezinstalează</string>
<string name="module_install">Instalează</string>
@@ -68,10 +65,17 @@
<string name="profile_selinux_context">Context SELinux</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="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_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_selinux_domain">Domeniu</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 disponibilă, clic pentru a descărca</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>
</resources>

View File

@@ -1,30 +1,28 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="app_name" translatable="false">KernelSU</string>
<string name="home">Главная</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_version">Версия: %d</string>
<string name="home_superuser_count">Superusers: %d</string> <!--Don't translate this string!-->
<string name="home_superuser_count">Суперпользователи: %d</string>
<!--Don't translate this string!-->
<string name="home_module_count">Модули: %d</string>
<string name="home_unsupported">Не поддерживается</string>
<string name="home_unsupported_reason">KernelSU поддерживает только GKI ядра</string>
<string name="home_kernel">Ядро</string>
<string name="home_manager_version">Версия менеджера</string>
<string name="home_fingerprint">Подпись</string>
<string name="home_selinux_status">Состояние SELinux</string>
<string name="selinux_status_disabled">Выключен</string>
<string name="selinux_status_enforcing">Принудительный</string>
<string name="selinux_status_permissive">Разрешающий</string>
<string name="selinux_status_unknown">Неизвестно</string>
<string name="superuser">Superuser</string> <!--Don't translate this string!-->
<string name="superuser">Суперпользователь</string>
<!--Don't translate this string!-->
<string name="module_failed_to_enable">Не удалось включить модуль: %s</string>
<string name="module_failed_to_disable">Не удалось отключить модуль: %s</string>
<string name="module_empty">Нет установленных модулей</string>
<string name="module">Модули</string>
<string name="uninstall">Удалить</string>
<string name="module_install">Установить</string>
@@ -51,12 +49,13 @@
<string name="reboot_to_apply">Перезагрузите, чтобы изменения вступили в силу</string>
<string name="module_magisk_conflict">Модули отключены, потому что они конфликтуют с Magisk!</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_support_title">Поддержите нас</string>
<string name="home_support_content">KernelSU был и всегда будет бесплатным и открытым проектом. Однако Вы всегда можете поддержать нас, отправив небольшое пожертвование.</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_template">Шаблон</string>
<string name="profile_custom">Пользовательский</string>
@@ -70,8 +69,17 @@
<string name="profile_selinux_context">Контекст SELinux</string>
<string name="profile_umount_modules">Размонтировать модули</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_summary">Глобальное значение по умолчанию для \"Размонтировать модули\" в App Profile. При включении будут удалены все модификации модулей в системе для приложений, у которых не задан Profile.</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>
</resources>

View File

@@ -0,0 +1,81 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="home">หน้าหลัก</string>
<string name="home_not_installed">ยังไม่ได้ติดตั้ง</string>
<string name="home_click_to_install">กดเพื่อติดตั้ง</string>
<string name="home_working">กำลังทำงาน</string>
<string name="home_working_version">เวอร์ชั่น: %d</string>
<string name="home_manager_version">เวอร์ชั่นตัวจัดการ</string>
<string name="home_superuser_count">สิทธิ์ผู้ใช้ขั้นสูง: %d</string>
<string name="home_module_count">โมดูล: %d</string>
<string name="home_unsupported">ไม่รองรับ</string>
<string name="selinux_status_enforcing">Enforcing</string>
<string name="reboot_recovery">รีบูตเข้าสู่โหมดกู้คืน</string>
<string name="reboot_userspace">ซอฟต์รีบูต</string>
<string name="home_unsupported_reason">ตอนนี้ KernelSU รองรับเคอร์เนลประเภท GKI เท่านั้น</string>
<string name="home_kernel">เคอร์เนล</string>
<string name="selinux_status_disabled">ปิดใช้งาน</string>
<string name="home_fingerprint">ลายนิ้วมือ</string>
<string name="home_selinux_status">สถานะ SELinux</string>
<string name="selinux_status_permissive">Permissive</string>
<string name="selinux_status_unknown">ไม่ทราบ</string>
<string name="superuser">สิทธิ์ผู้ใช้ขั้นสูง</string>
<string name="module_failed_to_enable">ล้มเหลวในการเปิดใช้งานโมดูล: %s</string>
<string name="module_failed_to_disable">ล้มเหลวในการปิดใช้งานโมดูล: %s</string>
<string name="module_empty">ไม่มีโมดูลที่ติดตั้ง</string>
<string name="module">โมดูล</string>
<string name="uninstall">ถอนการติดตั้ง</string>
<string name="settings">ตั้งค่า</string>
<string name="module_install">ติดตั้ง</string>
<string name="install">ติดตั้ง</string>
<string name="reboot">รีบูต</string>
<string name="reboot_bootloader">รีบูตเข้าสู่โหมด Bootloader</string>
<string name="about">เกี่ยวกับ</string>
<string name="reboot_download">รีบูตเข้าสู่โหมด Download</string>
<string name="reboot_edl">รีบูตเข้าสู่โหมด EDL</string>
<string name="module_uninstall_success">%s ถอนการติดตั้งสำเร็จ</string>
<string name="module_uninstall_failed">ล้มเหลวในการถอนการติดตั้ง: %s</string>
<string name="module_overlay_fs_not_available">overlayfs ไม่สามารถใช้งานได้ โมดูลหยุดทำงาน!</string>
<string name="module_uninstall_confirm">คุณแน่ใจว่าจะถอนการติดตั้งโมดูล %s หรือไม่\?</string>
<string name="module_author">ผู้สร้าง</string>
<string name="module_version">เวอร์ชั่น</string>
<string name="show_system_apps">แสดงแอประบบ</string>
<string name="hide_system_apps">ซ่อนแอประบบ</string>
<string name="refresh">รีเฟรช</string>
<string name="send_log">ส่ง Log</string>
<string name="safe_mode">โหมดปลอดภัย</string>
<string name="reboot_to_apply">รีบูตเพื่อให้มีผล</string>
<string name="module_magisk_conflict">โมดูลถูกปิดใช้งานเนื่องจากขัดแย้งกับ Magisk!</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_click_to_learn_kernelsu">เรียนรู้วิธีการติดตั้ง KernelSU และวิธีใช้งานโมดูลต่าง ๆ</string>
<string name="home_support_title">สนับสนุนพวกเรา</string>
<string name="home_support_content">KernelSU เป็นโอเพ่นซอร์สฟรีและจะเป็นตลอดไป อย่างไรก็ตาม คุณสามารถแสดงความห่วงใยได้ด้วยการบริจาค</string>
<string name="about_source_code">ดูซอร์สโค้ดที่ %1$s<br/> และเข้าร่วมช่อง %2$s ของเรา</string>
<string name="profile_custom">กำหนดเอง</string>
<string name="profile_default">ค่าเริ่มต้น</string>
<string name="profile_template">เทมเพลต</string>
<string name="profile_name">ชื่อโปรไฟล์</string>
<string name="profile_namespace">Mount เนมสเปซ</string>
<string name="profile_namespace_global">ทั่วไป</string>
<string name="profile_namespace_inherited">การสืบทอด</string>
<string name="profile_namespace_individual">ส่วนบุคคล</string>
<string name="profile_groups">หมวดหมู่</string>
<string name="profile_capabilities">ความสามารถของแอป</string>
<string name="profile_umount_modules_summary">การเปิดใช้งานตัวเลือกนี้จะทำให้ KernelSU สามารถกู้คืนไฟล์ที่แก้ไขโดยโมดูลสำหรับแอปพลิเคชั่นนี้ได้</string>
<string name="profile_selinux_context">บริบท SELinux</string>
<string name="profile_umount_modules">Umount โมดูล</string>
<string name="failed_to_update_app_profile">ไม่สามารถอัปเดตโปรไฟล์แอปสำหรับ %s ได้</string>
<string name="settings_umount_modules_default">Umount โมดูลตามค่าเริ่มต้น</string>
<string name="profile_selinux_domain">โดเมน</string>
<string name="module_update">อัปเดต</string>
<string name="profile_selinux_rules">กฎ</string>
<string name="module_downloading">กำลังดาวน์โหลดโมดูล: %s</string>
<string name="module_start_downloading">กำลังเริ่มดาวน์โหลด: %s</string>
<string name="new_version_available">เวอร์ชั่นใหม่: %s พร้อมใช้งาน คลิกเพื่อดาวน์โหลด</string>
<string name="force_stop_app">บังคับหยุด</string>
<string name="restart_app">รีสตาร์ท</string>
<string name="settings_umount_modules_default_summary">หากเปิดใช้งานค่าเริ่มต้นโดยทั่วไปสำหรับ \"Umount โมดูล\" ในโปรไฟล์แอป จะเป็นการลบการแก้ไขโมดูลทั้งหมดในระบบสำหรับแอปพลิเคชั่นที่ไม่มีการตั้งค่าโปรไฟล์</string>
<string name="launch_app">เปิด</string>
<string name="failed_to_update_sepolicy">ไม่สามารถอัปเดตกฎ SElinux สำหรับ: %s ได้</string>
</resources>

View File

@@ -1,18 +1,17 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="home">Ana menü</string>
<string name="home_not_installed">Yüklü değil</string>
<string name="home_click_to_install">Yüklemek için dokun</string>
<string name="home_click_to_install">Yüklemek için tıkla</string>
<string name="home_working">Çalışıyor</string>
<string name="home_working_version">Sürüm: %d</string>
<string name="home_superuser_count">Süper kullanıcılar: %d</string>
<string name="home_module_count">Modüller: %d</string>
<string name="home_unsupported">Desteklenmiyor</string>
<string name="home_unsupported_reason">KernelSU artık yalnızca GKI çekirdeklerini destekliyor</string>
<string name="home_unsupported_reason">KernelSU şu an yalnızca GKI çekirdeklerini destekliyor</string>
<string name="home_kernel">Kernel</string>
<string name="home_manager_version">Yönetici Sürümü</string>
<string name="home_fingerprint">Parmak İzi</string>
<string name="home_selinux_status">SELinux Durumu</string>
<string name="selinux_status_disabled">Devre dışı</string>
<string name="selinux_status_enforcing">Enforcing</string>
@@ -22,33 +21,32 @@
<string name="module_failed_to_enable">Modül etkinleştirilemedi: %s</string>
<string name="module_failed_to_disable">Modül devre dışı bırakılamadı: %s</string>
<string name="module_empty">Yüklü modül yok</string>
<string name="module">Modül</string>
<string name="uninstall">Kaldır</string>
<string name="module_install">Yükle</string>
<string name="install">Yükle</string>
<string name="reboot">Yeniden başlat</string>
<string name="reboot">Cihazı yeniden başlat</string>
<string name="settings">Ayarlar</string>
<string name="reboot_userspace">Hızlı yeniden Başlat</string>
<string name="reboot_recovery">Kurtarma modunda Başlat</string>
<string name="reboot_bootloader">Bootloader modunda Başlat</string>
<string name="reboot_download">İndirme modunda Başlat</string>
<string name="reboot_edl">EDL modunda Başlat</string>
<string name="reboot_userspace">Hızlı yeniden başlat</string>
<string name="reboot_recovery">Kurtarma modunda başlat</string>
<string name="reboot_bootloader">Bootloader modunda başlat</string>
<string name="reboot_download">İndirme modunda başlat</string>
<string name="reboot_edl">EDL modunda başlat</string>
<string name="about">Hakkında</string>
<string name="module_uninstall_confirm">%s modülünü kaldırmak istediğinizden emin misiniz?</string>
<string name="module_uninstall_success">%s kaldırıldı</string>
<string name="module_uninstall_failed">Kaldırılamadı: %s</string>
<string name="module_uninstall_failed">%s kaldırılamadı</string>
<string name="module_version">Sürüm</string>
<string name="module_author">Yazar</string>
<string name="module_overlay_fs_not_available">overlayfs mevcut değil, modül çalışamıyor!</string>
<string name="module_author">Geliştirici</string>
<string name="module_overlay_fs_not_available">overlayfs mevcut değil, modül çalışamaz!</string>
<string name="refresh">Yenile</string>
<string name="show_system_apps">Sistem uygulamalarını göster</string>
<string name="hide_system_apps">Sistem uygulamalarını gizle</string>
<string name="send_log">Log gönder</string>
<string name="safe_mode">Güvenli mod</string>
<string name="reboot_to_apply">Etkili olması için yeniden başlat</string>
<string name="reboot_to_apply">Değişiklilerin kaydedilmesi için cihazı yeniden başlat</string>
<string name="module_magisk_conflict">Modüller Magisk ile çakıştığı için devre dışı bırakıldı!</string>
<string name="home_learn_kernelsu">KernelSU\'yu Öğrenin</string>
<string name="home_learn_kernelsu">KernelSU\'yu öğren</string>
<string name="home_learn_kernelsu_url">https://kernelsu.org/guide/what-is-kernelsu.html</string>
<string name="home_click_to_learn_kernelsu">KernelSU\'yu nasıl kuracağınızı ve modülleri nasıl kullanacağınızı öğrenin</string>
<string name="home_support_title">Bizi destekle</string>
@@ -68,14 +66,17 @@
<string name="profile_selinux_context">SELinux içeriği</string>
<string name="profile_umount_modules">Modüllerin bağlantısını kes</string>
<string name="failed_to_update_app_profile">%s için uygulama profili güncellenemedi.</string>
<string name="require_kernel_version">Mevcut kernel versiyonu %d yöneticinin düzgün çalışabilmesi için çok düşük. Lütfen %d veya yukarısına yükseltin!</string>
<string name="settings_umount_modules_default">Varsayılan olarak modüllerin bağlantısını kesin</string>
<string name="settings_umount_modules_default_summary">Uygulama profillerindeki \"Modüllerin bağlantısını kesme\" seçeneği için varsayılan değer. Etkinleştirilirse, profil ayarı yapılmamış uygulamalar için modüllerin sistemde yaptığı tüm değişiklikler kaldırılacaktır.</string>
<string name="settings_umount_modules_default_summary">Uygulama profillerindeki \"Modüllerin bağlantısını kes\" seçeneği için varsayılan değer. Etkinleştirilirse, profil ayarı yapılmamış uygulamalar için modüllerin sistemde yaptığı tüm değişiklikler kaldırılacaktır.</string>
<string name="profile_umount_modules_summary">Bu seçeneğin etkinleştirilmesi ile, bu uygulama için modüller tarafından değiştirilen tüm dosyaların KernelSU tarafından geri alınmasına izin verilecektir.</string>
<string name="profile_selinux_domain">Etki alanı</string>
<string name="profile_selinux_domain">Ad alanı</string>
<string name="profile_selinux_rules">Kurallar</string>
<string name="module_update">Güncelle</string>
<string name="module_downloading">Modül indiriliyor: %s</string>
<string name="module_start_downloading">İndirme başladı: %s</string>
<string name="new_version_available">Yeni versiyon: %s mevcut, indirmek için tıklayın</string>
</resources>
<string name="new_version_available">Yeni sürüm: %s mevcut, indirmek için tıklayın</string>
<string name="launch_app">Uygulamayı çalıştır</string>
<string name="force_stop_app">Uygulamayı durmaya zorla</string>
<string name="restart_app">Uygulamayı yeniden başlat</string>
<string name="failed_to_update_sepolicy">%s için SELinux kuralları güncellenemedi</string>
</resources>

View File

@@ -1,6 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="app_name" translatable="false">KernelSU</string>
<string name="home">Головна</string>
<string name="home_not_installed">Не встановлено</string>
<string name="home_click_to_install">Натисніть щоб встановити</string>
@@ -10,11 +9,9 @@
<string name="home_module_count">Модулі: %d</string>
<string name="home_unsupported">Не підтримується</string>
<string name="home_unsupported_reason">KernelSU підтримує лише ядра GKI</string>
<string name="home_kernel">Ядро</string>
<string name="home_manager_version">Версія менеджера</string>
<string name="home_fingerprint">Відбиток</string>
<string name="home_selinux_status">Статус SELinux</string>
<string name="selinux_status_disabled">Вимкнено</string>
<string name="selinux_status_enforcing">Примусовий</string>
@@ -24,7 +21,6 @@
<string name="module_failed_to_enable">Не вдалося ввімкнути модуль: %s</string>
<string name="module_failed_to_disable">Не вдалося вимкнути модуль: %s</string>
<string name="module_empty">Немає встановлених модулів</string>
<string name="module">Модулі</string>
<string name="uninstall">Видалити</string>
<string name="module_install">Встановити</string>
@@ -70,8 +66,17 @@
<string name="profile_selinux_context">Контекст SELinux</string>
<string name="profile_umount_modules">Розмонтувати модулі</string>
<string name="failed_to_update_app_profile">Не вдалося оновити профіль додатка для %s</string>
<string name="require_kernel_version">Поточна версія ядра %d занизька для належної роботи менджера. Будь ласка, оновіть до версії %d або вище!</string>
<string name="settings_umount_modules_default">Розмонтувати модулі за замовчуванням</string>
<string name="settings_umount_modules_default_summary">Загальне значення за замовчуванням для \"Розмонтувати модулі\" у профілях додатків. Якщо ввімкнено, буде видалено всі модифікації модулів у системі для додатків, які не мають встановленого профілю.</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="launch_app">Запустити</string>
<string name="force_stop_app">Примусово зупинити</string>
<string name="restart_app">Перезапустити</string>
<string name="new_version_available">Нова версія: %s доступна, натисніть, щоб завантажити</string>
<string name="failed_to_update_sepolicy">Не вдалося оновити правила SELinux для: %s</string>
</resources>

View File

@@ -1,52 +1,83 @@
<resources>
<string name="home_learn_kernelsu">Tìm hiểu về KernelSU</string>
<string name="home_click_to_learn_kernelsu">Cách cài đặt KernelSU và sử dụng mô-đun</string>
<string name="home_support_title">Hỗ trợ chúng tôi</string>
<string name="home_support_content">KernelSU sẽ luôn luôn miễn phi và mã nguồn mở. Tuy nhiên, bạn có thể cho chúng tôi thấy rằng bạn quan tâm bằng cách gửi một khoản đóng góp nhỏ.</string>
<string name="about_source_code"><![CDATA[Xem mã nguồn tại %1$s<br/>Tham gia kênh %2$s của chúng tôi]]></string>
<string name="module_magisk_conflict">"Các mô-đun bị vô hiệu hóa vì nó xung đột với Magisk!"</string>
<string name="module_uninstall_confirm">Bạn có chắc chắn muốn gỡ cài đặt mô-đun %s?</string>
<string name="send_log">Gửi nhật ký</string>
<string name="home">Trang chủ</string>
<string name="home_not_installed">Chưa được cài đặt</string>
<string name="home_click_to_install">Nhấn đề cài dặt</string>
<string name="home_working">Đang chạy</string>
<string name="home_working_version">Phiên bản: %d</string>
<string name="home_unsupported">Không hỗ trợ</string>
<string name="home_unsupported_reason">KernelSU hiện tại chỉ hỗ trợ kernel GKI</string>
<string name="home_kernel">Kernel</string>
<string name="home_manager_version">Phiên bản</string>
<string name="home_fingerprint">Fingerprint</string>
<string name="home_selinux_status">Trạng thái SELinux</string>
<string name="selinux_status_disabled">Vô hiệu hóa</string>
<string name="selinux_status_enforcing">Thực thi</string>
<string name="selinux_status_permissive">Cho phép</string>
<string name="selinux_status_unknown">Không rõ</string>
<string name="superuser">Superuser</string>
<string name="module_failed_to_enable">Không thể kích hoạt mô-đun: %s</string>
<string name="module_failed_to_disable">Không thể vô hiệu hóa mô-đun: %s</string>
<string name="module_empty">Chưa có mô-đun nào được cài đặt</string>
<string name="module">Mô-đun</string>
<string name="uninstall">Gỡ cài đặt</string>
<string name="module_install">Cài đặt</string>
<string name="install">Cài đặt</string>
<string name="reboot">Khởi động lại</string>
<string name="settings">Thiết lập</string>
<string name="reboot_userspace">Khởi động mềm</string>
<string name="reboot_recovery">Khởi động lại vào Recovery</string>
<string name="reboot_bootloader">Khởi động lại vào Bootloader</string>
<string name="reboot_download">Khởi động lại vào Download Mode</string>
<string name="reboot_edl">Khởi động vào EDL</string>
<string name="about">Thông tin</string>
<string name="module_uninstall_success">%s đã được gỡ cài đặt</string>
<string name="module_uninstall_failed">Lỗi khi gỡ cài đặt: %s</string>
<string name="module_version">Phiên bản</string>
<string name="module_author">Tác giả</string>
<string name="module_overlay_fs_not_available">Không tìm thấy overlayfs, mô-đun sẽ không thể hoạt động!</string>
<string name="refresh">Làm mới</string>
<string name="show_system_apps">Hiển thị ứng dụng hệ thống</string>
<string name="hide_system_apps">Ẩn ứng dụng hệ thống</string>
<string name="safe_mode">Chế độ an toàn</string>
<string name="reboot_to_apply">Khởi động lại để có hiệu lực</string>
<string name="home_learn_kernelsu_url">https://kernelsu.org/vi_VN/guide/what-is-kernelsu.html</string>
</resources>
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="profile">Hồ sơ ứng dụng</string>
<string name="profile_default">Mặc định</string>
<string name="profile_template">Mẫu</string>
<string name="profile_custom">Tuỳ chỉnh</string>
<string name="profile_name">Tên hồ sơ</string>
<string name="profile_groups">Nhóm</string>
<string name="failed_to_update_app_profile">Không thể cập nhật Hồ sơ ứng dụng cho %s</string>
<string name="settings_umount_modules_default">Ngắt mô-đun theo mặc định</string>
<string name="settings_umount_modules_default_summary">Giá trị mặc định của \"Ngắt mô-đun\" trong Cấu hình ứng dụng. Nếu bật, KernelSU sẽ khôi phục mọi tệp hệ thống đã sửa đổi bởi mô-đun cho các ứng dụng chưa thiết lập Cấu hình.</string>
<string name="profile_umount_modules_summary">Bật tùy chọn này sẽ khôi phục mọi tệp đã sửa đổi bởi các mô-đun cho ứng dụng này.</string>
<string name="module_update">Cập nhật</string>
<string name="module_downloading">Đang tải xuống mô-đun: %s</string>
<string name="module_start_downloading">Bắt đầu tải xuống: %s</string>
<string name="new_version_available">Đã có phiên bản mới: %s, nhấn để tải xuống</string>
<string name="home_learn_kernelsu">Tìm hiểu KernelSU</string>
<string name="home_click_to_learn_kernelsu">Tìm hiểu cách cài đặt KernelSU và sử dụng các mô-đun</string>
<string name="home_support_title">Hỗ trợ chúng tôi</string>
<string name="home_support_content">KernelSU sẽ luôn luôn miễn phí và mã nguồn mở. Tuy nhiên bạn có thể ủng hộ chúng tôi bằng một khoản đóng góp nhỏ.</string>
<string name="about_source_code"><![CDATA[Xem mã nguồn tại %1$s<br/>Tham gia kênh %2$s của chúng tôi]]></string>
<string name="module_magisk_conflict">Các mô-đun bị vô hiệu hóa vì chúng xung đột với Magisk!</string>
<string name="module_uninstall_confirm">Bạn có muốn gỡ cài đặt mô-đun %s không\?</string>
<string name="send_log">Gửi nhật ký</string>
<string name="home">Trang chủ</string>
<string name="home_not_installed">Chưa cài đặt</string>
<string name="home_click_to_install">Nhấn để cài dặt</string>
<string name="home_working">Đang hoạt động</string>
<string name="home_working_version">Phiên bản: %d</string>
<string name="home_unsupported">Không được hỗ trợ</string>
<string name="home_unsupported_reason">KernelSU hiện tại chỉ hỗ trợ kernel GKI</string>
<string name="home_kernel">Kernel</string>
<string name="home_manager_version">Phiên bản Manager</string>
<string name="home_fingerprint">Fingerprint</string>
<string name="home_selinux_status">Trạng thái SELinux</string>
<string name="selinux_status_disabled">Vô hiệu hóa</string>
<string name="selinux_status_enforcing">Thực thi</string>
<string name="selinux_status_permissive">Cho phép</string>
<string name="selinux_status_unknown">Không rõ</string>
<string name="superuser">Superuser</string>
<string name="module_failed_to_enable">Không thể kích hoạt mô-đun: %s</string>
<string name="module_failed_to_disable">Không thể vô hiệu hóa mô-đun: %s</string>
<string name="module_empty">Chưa có mô-đun nào được cài đặt</string>
<string name="module">Mô-đun</string>
<string name="uninstall">Gỡ cài đặt</string>
<string name="module_install">Cài đặt</string>
<string name="install">Cài đặt</string>
<string name="reboot">Khởi động lại</string>
<string name="settings">Cài đặt</string>
<string name="reboot_userspace">Khởi động mềm</string>
<string name="reboot_recovery">Khởi động lại vào Recovery</string>
<string name="reboot_bootloader">Khởi động lại vào Bootloader</string>
<string name="reboot_download">Khởi động lại vào Download Mode</string>
<string name="reboot_edl">Khởi động lại vào EDL</string>
<string name="about">Về ứng dụng</string>
<string name="module_uninstall_success">%s đã được gỡ cài đặt</string>
<string name="module_uninstall_failed">Lỗi khi gỡ cài đặt: %s</string>
<string name="module_version">Phiên bản</string>
<string name="module_author">Tác giả</string>
<string name="module_overlay_fs_not_available">overlayfs hiện không khả dụng, mô-đun không thể hoạt động!</string>
<string name="refresh">Làm mới</string>
<string name="show_system_apps">Hiển thị ứng dụng hệ thống</string>
<string name="hide_system_apps">Ẩn ứng dụng hệ thống</string>
<string name="safe_mode">Chế độ an toàn</string>
<string name="reboot_to_apply">Khởi động lại để có hiệu lực</string>
<string name="home_learn_kernelsu_url">https://kernelsu.org/vi_VN/guide/what-is-kernelsu.html</string>
<string name="home_superuser_count">Số superuser: %d</string>
<string name="home_module_count">Số mô-đun: %d</string>
<string name="profile_selinux_domain">Phạm vi</string>
<string name="profile_selinux_rules">Quy định</string>
<string name="launch_app">Mở</string>
<string name="restart_app">Khởi động lại</string>
<string name="profile_namespace">Danh sách mount</string>
<string name="profile_capabilities">Quyền</string>
<string name="failed_to_update_sepolicy">Không thể cập nhật quy định SELinux cho: %s</string>
<string name="force_stop_app">Buộc dừng</string>
<string name="profile_namespace_inherited">Thừa hưởng</string>
<string name="profile_namespace_global">Chung</string>
<string name="profile_namespace_individual">Riêng</string>
<string name="profile_selinux_context">SELinux context</string>
<string name="profile_umount_modules">Ngắt mô-đun</string>
<string name="require_kernel_version">KernelSU phiên bản %d quá thấp để trình quản lý hoạt động, hãy cập nhật lên %d hoặc mới hơn!</string>
</resources>

View File

@@ -65,14 +65,18 @@
<string name="profile_selinux_context">SELinux</string>
<string name="profile_umount_modules">卸载模块</string>
<string name="failed_to_update_app_profile">为 %s 更新 App Profile 失败</string>
<string name="require_kernel_version">当前内核版本 %d 过低,管理器无法正常工作,请升级内核版本至 %d 或以上!</string>
<string name="require_kernel_version">当前 KernelSU 版本 %d 过低,管理器无法正常工作,请升级内核 KernelSU 版本至 %d 或以上!</string>
<string name="settings_umount_modules_default">默认卸载模块</string>
<string name="settings_umount_modules_default_summary">App Profile 中\"卸载模块\"的全局默认值,如果启用,将会为没有设置 Profile 的应用移除所有模块针对系统的修改</string>
<string name="profile_umount_modules_summary">启用后将允许 KernelSU 为本应用还原被模块修改过的文件</string>
<string name="settings_umount_modules_default_summary">App Profile 中\"卸载模块\"的全局默认值,如果启用,将会为没有设置 Profile 的应用移除所有模块针对系统的修改</string>
<string name="profile_umount_modules_summary">启用后将允许 KernelSU 为本应用还原被模块修改过的文件</string>
<string name="profile_selinux_domain"></string>
<string name="profile_selinux_rules">规则</string>
<string name="module_update">更新</string>
<string name="module_downloading">正在下载模块:%s</string>
<string name="module_start_downloading">开始下载:%s</string>
<string name="new_version_available">发现新版本:%d,点击下载</string>
<string name="new_version_available">发现新版本:%s,点击下载</string>
<string name="launch_app">启动</string>
<string name="force_stop_app">强制停止</string>
<string name="restart_app">重新启动</string>
<string name="failed_to_update_sepolicy">为:%s 更新翻译失败</string>
</resources>

View File

@@ -9,11 +9,9 @@
<string name="home_module_count">模組:%d 個</string>
<string name="home_unsupported">不支援</string>
<string name="home_unsupported_reason">KernelSU 現在僅支援 GKI 核心</string>
<string name="home_kernel">核心</string>
<string name="home_manager_version">管理員版本</string>
<string name="home_fingerprint">指紋</string>
<string name="home_selinux_status">SELinux 狀態</string>
<string name="selinux_status_disabled">已停用</string>
<string name="selinux_status_enforcing">強制</string>
@@ -23,7 +21,6 @@
<string name="module_failed_to_enable">無法啟用模組:%s</string>
<string name="module_failed_to_disable">無法停用模組:%s</string>
<string name="module_empty">尚未安裝模組</string>
<string name="module">模組</string>
<string name="uninstall">解除安裝</string>
<string name="module_install">安裝</string>
@@ -55,4 +52,31 @@
<string name="home_support_title">支持我們</string>
<string name="home_support_content">KernelSU 是免費且開源的,您可以透過捐贈來向我們展示您對我們的關心。</string>
<string name="about_source_code"><![CDATA[在 %1$s 中檢視原始碼<br/>加入我們的 %2$s 頻道]]></string>
<string name="profile_default">預設</string>
<string name="profile_name">設定檔名稱</string>
<string name="profile_template">範本</string>
<string name="profile_namespace_inherited">繼承</string>
<string name="profile_namespace_global">全域</string>
<string name="profile_capabilities">功能</string>
<string name="profile_umount_modules">卸載模組</string>
<string name="failed_to_update_app_profile">無法更新 %s 應用程式設定檔</string>
<string name="profile_selinux_rules">規則</string>
<string name="require_kernel_version">目前 KernelSU 版本 %d 過低,管理員無法正常運作。請升級至 %d 或更高版本!</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="module_update">更新</string>
<string name="profile_custom">自訂</string>
<string name="profile_namespace">掛載命名空間</string>
<string name="profile_namespace_individual">個人</string>
<string name="profile_groups">群組</string>
<string name="profile_selinux_context">SELinux 內容</string>
<string name="settings_umount_modules_default">預設卸載模組</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="force_stop_app">強制停止</string>
<string name="restart_app">重新啟動</string>
<string name="failed_to_update_sepolicy">無法為 %s 更新 SELinux 規則</string>
</resources>

View File

@@ -8,11 +8,9 @@
<string name="home_superuser_count">已授權 Root%d 個</string>
<string name="home_unsupported">不支援</string>
<string name="home_unsupported_reason">KernelSU 現在僅支援 GKI 核心</string>
<string name="home_kernel">核心</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="selinux_status_disabled">已停用</string>
<string name="selinux_status_enforcing">強制</string>
@@ -22,14 +20,13 @@
<string name="module_failed_to_enable">無法啟用模組:%s</string>
<string name="module_failed_to_disable">無法停用模組:%s</string>
<string name="module_empty">尚未安裝模組</string>
<string name="module">模組</string>
<string name="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="reboot_userspace">重新啟動</string>
<string name="reboot_recovery">重新啟動至 Recovery</string>
<string name="reboot_bootloader">重新啟動至 Bootloader</string>
<string name="reboot_download">重新啟動至 Download</string>
@@ -56,9 +53,30 @@
<string name="home_support_content">KernelSU 將保持免費和開源,您可以考慮向開發人員捐贈以表示支持。</string>
<string name="about_source_code"><![CDATA[在 %1$s 中檢視原始碼<br/>加入我們的 %2$s 頻道]]></string>
<string name="profile_umount_modules">解除安裝模組</string>
<string name="failed_to_update_app_profile">為 %s 更新 App Profile 失敗</string>
<string name="require_kernel_version">目前安裝的核心版本 %d 過低,管理器無法正常工作,請升級核心版本至 %d 或以上!</string>
<string name="failed_to_update_app_profile">無法更新 %s 應用程式設定檔</string>
<string name="require_kernel_version">目前安裝的 KernelSU 版本 %d 過低,管理器無法正常工作,請升級核心 KernelSU 版本至 %d 或以上!</string>
<string name="settings_umount_modules_default">預設解除安裝模組</string>
<string name="settings_umount_modules_default_summary">App Profile 中\"解除安裝模組\"的全域預設值,如果啟用,將會為沒有設定 Profile 的應用移除所有模組針對系統的修改</string>
<string name="profile_umount_modules_summary">啟用後將允許 KernelSU 為本應用還原被模組修改過的檔案</string>
<string name="settings_umount_modules_default_summary">應用程式設定檔中「解除安裝模組的全域預設值,如果啟用,將會為沒有設定的應用程式移除所有模組針對系統的修改</string>
<string name="profile_umount_modules_summary">啟用後將允許 KernelSU 為本應用程式還原被模組修改過的檔案</string>
<string name="profile_default">預設</string>
<string name="profile_custom">自訂</string>
<string name="profile_capabilities">功能</string>
<string name="profile_selinux_rules">規則</string>
<string name="module_downloading">正在下載模組:%s</string>
<string name="restart_app">重新啟動</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_selinux_context">SELinux 環境</string>
<string name="profile_selinux_domain">網域</string>
<string name="module_update">更新</string>
<string name="module_start_downloading">開始下載:%s</string>
<string name="new_version_available">發現新版本:%s 已可供使用,按一下即可下載</string>
<string name="launch_app">啟動</string>
<string name="force_stop_app">強制停止</string>
<string name="failed_to_update_sepolicy">無法為 %s 更新 SELinux</string>
</resources>

View File

@@ -70,7 +70,7 @@
<string name="profile_selinux_context">SELinux context</string>
<string name="profile_umount_modules">Umount modules</string>
<string name="failed_to_update_app_profile">Failed to update App Profile for %s</string>
<string name="require_kernel_version">The current kernel version %d is too low for the manager to function properly. Please upgrade to version %d or higher!</string>
<string name="require_kernel_version">The current KernelSU version %d is too low for the manager to function properly. Please upgrade to version %d or higher!</string>
<string name="settings_umount_modules_default">Umount modules by default</string>
<string name="settings_umount_modules_default_summary">The global default value for \"Umount modules\" in App Profiles. If enabled, it will remove all module modifications to the system for applications that do not have a Profile set.</string>
<string name="profile_umount_modules_summary">Enabling this option will allow KernelSU to restore any modified files by the modules for this application.</string>
@@ -80,4 +80,8 @@
<string name="module_downloading">Downloading module: %s</string>
<string name="module_start_downloading">Start downloading: %s</string>
<string name="new_version_available">New version: %s is available, click to download</string>
<string name="launch_app">Launch</string>
<string name="force_stop_app">Force Stop</string>
<string name="restart_app">Restart</string>
<string name="failed_to_update_sepolicy">Failed to update SELinux rules for: %s</string>
</resources>

View File

@@ -1,5 +1,5 @@
_ __
/\ /\___ _ __ _ __ ___| / _\/\ /\
/ //_/ _ \ '__| '_ \ / _ \ \ \/ / \ \
_ __
/\ /\___ _ __ _ __ ___| / _\/\ /\
/ //_/ _ \ '__| '_ \ / _ \ \ \/ / \ \
/ __ \ __/ | | | | | __/ |\ \ \_/ /
\/ \/\___|_| |_| |_|\___|_\__/\___/

View File

@@ -18,9 +18,6 @@ struct Args {
#[derive(clap::Subcommand, Debug)]
enum Commands {
/// Start KernelSU userspace daemon
Daemon,
/// Manage KernelSU modules
Module {
#[command(subcommand)]
@@ -45,6 +42,12 @@ enum Commands {
command: Sepolicy,
},
/// Manage App Profiles
Profile {
#[command(subcommand)]
command: Profile,
},
/// For developers
Debug {
#[command(subcommand)]
@@ -129,6 +132,40 @@ enum Module {
List,
}
#[derive(clap::Subcommand, Debug)]
enum Profile {
/// get root profile's selinux policy of <package-name>
GetSepolicy {
/// package name
package: String,
},
/// set root profile's selinux policy of <package-name> to <profile>
SetSepolicy {
/// package name
package: String,
/// policy statements
policy: String,
},
/// get template of <package-name>
GetTemplate {
/// package name
package: String,
},
/// set template of <package-name> to <template>
SetTemplate {
/// package name
package: String,
/// template
template: String,
},
/// list all templates
ListTemplates,
}
pub fn run() -> Result<()> {
#[cfg(target_os = "android")]
android_logger::init_once(
@@ -151,7 +188,6 @@ pub fn run() -> Result<()> {
log::info!("command: {:?}", cli.command);
let result = match cli.command {
Commands::Daemon => event::daemon(),
Commands::PostFsData => event::on_post_data_fs(),
Commands::BootCompleted => event::on_boot_completed(),
@@ -176,6 +212,17 @@ pub fn run() -> Result<()> {
Sepolicy::Check { sepolicy } => crate::sepolicy::check_rule(&sepolicy),
},
Commands::Services => event::on_services(),
Commands::Profile { command } => match command {
Profile::GetSepolicy { package } => crate::profile::get_sepolicy(package),
Profile::SetSepolicy { package, policy } => {
crate::profile::set_sepolicy(package, policy)
}
Profile::GetTemplate { package } => crate::profile::get_template(package),
Profile::SetTemplate { package, template } => {
crate::profile::set_template(package, template)
}
Profile::ListTemplates => crate::profile::list_templates(),
},
Commands::Debug { command } => match command {
Debug::SetManager { apk } => debug::set_manager(&apk),

View File

@@ -5,6 +5,10 @@ pub const WORKING_DIR: &str = concatcp!(ADB_DIR, "ksu/");
pub const BINARY_DIR: &str = concatcp!(WORKING_DIR, "bin/");
pub const LOG_DIR: &str = concatcp!(WORKING_DIR, "log/");
pub const PROFILE_DIR: &str = concatcp!(WORKING_DIR, "profile/");
pub const PROFILE_SELINUX_DIR: &str = concatcp!(PROFILE_DIR, "selinux/");
pub const PROFILE_TEMPLATE_DIR: &str = concatcp!(PROFILE_DIR, "templates/");
pub const KSURC_PATH: &str = concatcp!(WORKING_DIR, ".ksurc");
pub const KSU_OVERLAY_SOURCE: &str = "KSU";
pub const DAEMON_PATH: &str = concatcp!(ADB_DIR, "ksud");

View File

@@ -3,6 +3,7 @@ use log::{info, warn};
use std::path::PathBuf;
use std::{collections::HashMap, path::Path};
use crate::module::prune_modules;
use crate::{
assets, defs, mount, restorecon,
utils::{self, ensure_clean_dir, ensure_dir_exists},
@@ -29,8 +30,8 @@ pub fn mount_systemlessly(module_dir: &str) -> Result<()> {
// construct overlay mount params
let dir = std::fs::read_dir(module_dir);
let Ok(dir) = dir else {
bail!("open {} failed", defs::MODULE_DIR);
};
bail!("open {} failed", defs::MODULE_DIR);
};
let mut system_lowerdir: Vec<String> = Vec::new();
@@ -91,6 +92,8 @@ pub fn mount_systemlessly(module_dir: &str) -> Result<()> {
pub fn on_post_data_fs() -> Result<()> {
crate::ksu::report_post_fs_data();
utils::umask(0);
#[cfg(unix)]
let _ = catch_bootlog();
@@ -99,7 +102,18 @@ pub fn on_post_data_fs() -> Result<()> {
return Ok(());
}
utils::umask(0);
let safe_mode = crate::utils::is_safe_mode();
if safe_mode {
// we should still mount modules.img to `/data/adb/modules` in safe mode
// becuase we may need to operate the module dir in safe mode
warn!("safe mode, skip common post-fs-data.d scripts");
} else {
// Then exec common post-fs-data scripts
if let Err(e) = crate::module::exec_common_scripts("post-fs-data.d", true) {
warn!("exec common post-fs-data scripts failed: {}", e);
}
}
let module_update_img = defs::MODULE_UPDATE_IMG;
let module_img = defs::MODULE_IMG;
@@ -128,7 +142,6 @@ pub fn on_post_data_fs() -> Result<()> {
}
}
// If there isn't any image exist, do nothing for module!
if !Path::new(target_update_img).exists() {
return Ok(());
}
@@ -139,8 +152,8 @@ pub fn on_post_data_fs() -> Result<()> {
mount::AutoMountExt4::try_new(target_update_img, module_dir, false)
.with_context(|| "mount module image failed".to_string())?;
// check safe mode first.
if crate::utils::is_safe_mode() {
// if we are in safe mode, we should disable all modules
if safe_mode {
warn!("safe mode, skip post-fs-data scripts and disable all modules!");
if let Err(e) = crate::module::disable_all_modules() {
warn!("disable all modules failed: {}", e);
@@ -148,9 +161,12 @@ pub fn on_post_data_fs() -> Result<()> {
return Ok(());
}
// Then exec common post-fs-data scripts
if let Err(e) = crate::module::exec_common_scripts("post-fs-data.d", true) {
warn!("exec common post-fs-data scripts failed: {}", e);
if let Err(e) = prune_modules() {
warn!("prune modules failed: {}", e);
}
if let Err(e) = restorecon::restorecon() {
warn!("restorecon failed: {}", e);
}
// load sepolicy.rule
@@ -158,6 +174,10 @@ pub fn on_post_data_fs() -> Result<()> {
warn!("load sepolicy.rule failed");
}
if let Err(e) = crate::profile::apply_sepolies() {
warn!("apply root profile sepolicy failed: {}", e);
}
// exec modules post-fs-data scripts
// TODO: Add timeout
if let Err(e) = crate::module::exec_post_fs_data() {
@@ -179,25 +199,29 @@ pub fn on_post_data_fs() -> Result<()> {
Ok(())
}
pub fn on_services() -> Result<()> {
fn run_stage(stage: &str) {
utils::umask(0);
if utils::has_magisk() {
warn!("Magisk detected, skip services!");
return Ok(());
warn!("Magisk detected, skip {stage}");
return;
}
if crate::utils::is_safe_mode() {
warn!("safe mode, skip module service scripts");
return Ok(());
warn!("safe mode, skip {stage} scripts");
return;
}
if let Err(e) = crate::module::exec_common_scripts("service.d", false) {
warn!("Failed to exec common service scripts: {}", e);
if let Err(e) = crate::module::exec_common_scripts(&format!("{stage}.d"), false) {
warn!("Failed to exec common {stage} scripts: {e}");
}
if let Err(e) = crate::module::exec_services() {
warn!("Failed to exec service scripts: {}", e);
if let Err(e) = crate::module::exec_stage_scripts(stage) {
warn!("Failed to exec {stage} scripts: {e}");
}
}
pub fn on_services() -> Result<()> {
run_stage("service");
Ok(())
}
@@ -216,17 +240,16 @@ pub fn on_boot_completed() -> Result<()> {
std::fs::remove_file(module_update_img).with_context(|| "Failed to remove image!")?;
}
}
Ok(())
}
pub fn daemon() -> Result<()> {
run_stage("boot-completed");
Ok(())
}
pub fn install() -> Result<()> {
ensure_dir_exists(defs::ADB_DIR)?;
std::fs::copy("/proc/self/exe", defs::DAEMON_PATH)?;
restorecon::setcon(defs::DAEMON_PATH, restorecon::ADB_CON)?;
restorecon::lsetfilecon(defs::DAEMON_PATH, restorecon::ADB_CON)?;
// install binary assets
assets::ensure_binaries().with_context(|| "Failed to extract assets")?;

View File

@@ -301,6 +301,20 @@ is_legacy_script() {
return $?
}
# find_mv [source_directory] [destination_directory]
find_mv() {
for file in $(find "$1" -type f); do
# Get the sub directory of the file.
sub_dir=$(echo "${file%/*}" | sed "s|$1||")
# Create the new directory, if it doesn't already exist.
mkdir -p "$2$sub_dir"
# Move the file to the new directory.
mv -f "$file" "$2$sub_dir"
done
# Clean old directory.
rm -r "$1"
}
handle_partition() {
# if /system/vendor is a symlink, we need to move it out of $MODPATH/system, otherwise it will be overlayed
# if /system/vendor is a normal directory, it is ok to overlay it and we don't need to overlay it separately.
@@ -313,7 +327,7 @@ handle_partition() {
ui_print "- Handle partition /$1"
# we create a symlink if module want to access $MODPATH/system/$1
# but it doesn't always work(ie. write it in post-fs-data.sh would fail because it is readonly)
mv -f $MODPATH/system/$1 $MODPATH/$1 && ln -sf /$1 $MODPATH/system/$1
find_mv $MODPATH/system/$1 $MODPATH/$1 && ln -sf ../$1 $MODPATH/system/$1
fi
}
@@ -438,6 +452,8 @@ install_module() {
NVBASE=/data/adb
TMPDIR=/dev/tmp
POSTFSDATAD=$NVBASE/post-fs-data.d
SERVICED=$NVBASE/service.d
# Some modules dependents on this
export MAGISK_VER=25.2

View File

@@ -161,22 +161,14 @@ pub fn root_shell() -> Result<()> {
let preserve_env = matches.opt_present("p");
let mount_master = matches.opt_present("M");
// we've make sure that -c is the last option and it already contains the whole command, no need to construct it again
let args = matches
.opt_str("c")
.map(|cmd| vec!["-c".to_string(), cmd])
.unwrap_or_default();
let mut free_idx = 0;
let command = matches.opt_str("c").map(|cmd| {
free_idx = matches.free.len();
let mut cmds = vec![];
cmds.push(cmd);
cmds.extend(matches.free.clone());
cmds
});
let mut args = vec![];
if let Some(cmd) = command {
args.push("-c".to_string());
args.push(cmd.join(" "));
};
if free_idx < matches.free.len() && matches.free[free_idx] == "-" {
if !matches.free.is_empty() && matches.free[free_idx] == "-" {
is_login = true;
free_idx += 1;
}
@@ -262,7 +254,7 @@ pub fn root_shell() -> Result<()> {
fn add_path_to_env(path: &str) -> Result<()> {
let mut paths =
env::var_os("PATH").map_or(Vec::new(), |val| env::split_paths(&val).collect::<Vec<_>>());
let new_path = PathBuf::from(path);
let new_path = PathBuf::from(path.trim_end_matches('/'));
paths.push(new_path);
let new_path_env = env::join_paths(paths)?;
env::set_var("PATH", new_path_env);

View File

@@ -7,6 +7,7 @@ mod event;
mod ksu;
mod module;
mod mount;
mod profile;
mod restorecon;
mod sepolicy;
mod utils;

View File

@@ -14,7 +14,7 @@ use log::{info, warn};
use std::{
collections::HashMap,
env::var as env_var,
fs::{remove_dir_all, set_permissions, File, Permissions},
fs::{remove_dir_all, remove_file, set_permissions, File, Permissions},
io::Cursor,
path::{Path, PathBuf},
process::{Command, Stdio},
@@ -56,7 +56,6 @@ fn exec_install_script(module_file: &str) -> Result<()> {
.env("KSU_VER_CODE", defs::VERSION_CODE)
.env("OUTFD", "1")
.env("ZIPFILE", realpath)
.stderr(Stdio::null())
.status()?;
ensure!(result.success(), "Failed to install module script");
Ok(())
@@ -90,6 +89,35 @@ fn mark_module_state(module: &str, flag_file: &str, create_or_delete: bool) -> R
}
}
fn foreach_module(active_only: bool, mut f: impl FnMut(&Path) -> Result<()>) -> Result<()> {
let modules_dir = Path::new(defs::MODULE_DIR);
let dir = std::fs::read_dir(modules_dir)?;
for entry in dir.flatten() {
let path = entry.path();
if !path.is_dir() {
warn!("{} is not a directory, skip", path.display());
continue;
}
if active_only && path.join(defs::DISABLE_FILE_NAME).exists() {
info!("{} is disabled, skip", path.display());
continue;
}
if active_only && path.join(defs::REMOVE_FILE_NAME).exists() {
warn!("{} is removed, skip", path.display());
continue;
}
f(&path)?;
}
Ok(())
}
fn foreach_active_module(f: impl FnMut(&Path) -> Result<()>) -> Result<()> {
foreach_module(true, f)
}
fn get_minimal_image_size(img: &str) -> Result<u64> {
check_image(img)?;
@@ -141,7 +169,7 @@ fn grow_image_size(img: &str, extra_size: u64) -> Result<()> {
humansize::format_size(target_size, humansize::DECIMAL)
);
let target_size = target_size / 1024 + 1024;
info!("resize image to {target_size}K, minimal size is {minimal_size}K");
let result = Command::new("resize2fs")
.args([img, &format!("{target_size}K")])
.stdout(Stdio::null())
@@ -155,26 +183,18 @@ fn grow_image_size(img: &str, extra_size: u64) -> Result<()> {
}
pub fn load_sepolicy_rule() -> Result<()> {
let modules_dir = Path::new(defs::MODULE_DIR);
let dir = std::fs::read_dir(modules_dir)?;
for entry in dir.flatten() {
let path = entry.path();
let disabled = path.join(defs::DISABLE_FILE_NAME);
if disabled.exists() {
info!("{} is disabled, skip", path.display());
continue;
}
foreach_active_module(|path| {
let rule_file = path.join("sepolicy.rule");
if !rule_file.exists() {
continue;
return Ok(());
}
info!("load policy: {}", &rule_file.display());
if sepolicy::apply_file(&rule_file).is_err() {
warn!("Failed to load sepolicy.rule for {}", &rule_file.display());
}
}
Ok(())
})?;
Ok(())
}
@@ -222,23 +242,14 @@ fn exec_script<T: AsRef<Path>>(path: T, wait: bool) -> Result<()> {
/// execute every modules' post-fs-data.sh
pub fn exec_post_fs_data() -> Result<()> {
let modules_dir = Path::new(defs::MODULE_DIR);
let dir = std::fs::read_dir(modules_dir)?;
for entry in dir.flatten() {
let path = entry.path();
let disabled = path.join(defs::DISABLE_FILE_NAME);
if disabled.exists() {
warn!("{} is disabled, skip", path.display());
continue;
}
let post_fs_data = path.join("post-fs-data.sh");
foreach_active_module(|module| {
let post_fs_data = module.join("post-fs-data.sh");
if !post_fs_data.exists() {
continue;
return Ok(());
}
exec_script(&post_fs_data, true)?;
}
exec_script(&post_fs_data, true)
})?;
Ok(())
}
@@ -265,45 +276,27 @@ pub fn exec_common_scripts(dir: &str, wait: bool) -> Result<()> {
Ok(())
}
/// execute every modules' service.sh
pub fn exec_services() -> Result<()> {
let modules_dir = Path::new(defs::MODULE_DIR);
let dir = std::fs::read_dir(modules_dir)?;
for entry in dir.flatten() {
let path = entry.path();
let disabled = path.join(defs::DISABLE_FILE_NAME);
if disabled.exists() {
warn!("{} is disabled, skip", path.display());
continue;
}
let service = path.join("service.sh");
/// execute every modules' [stage].sh (service.sh, boot-completed.sh)
pub fn exec_stage_scripts(stage: &str) -> Result<()> {
foreach_active_module(|module| {
let service = module.join(format!("{stage}.sh"));
if !service.exists() {
continue;
return Ok(());
}
exec_script(&service, false)?;
}
exec_script(&service, false)
})?;
Ok(())
}
pub fn load_system_prop() -> Result<()> {
let modules_dir = Path::new(defs::MODULE_DIR);
let dir = std::fs::read_dir(modules_dir)?;
for entry in dir.flatten() {
let path = entry.path();
let disabled = path.join(defs::DISABLE_FILE_NAME);
if disabled.exists() {
info!("{} is disabled, skip", path.display());
continue;
}
let system_prop = path.join("system.prop");
foreach_active_module(|module| {
let system_prop = module.join("system.prop");
if !system_prop.exists() {
continue;
return Ok(());
}
info!("load {} system.prop", path.display());
info!("load {} system.prop", module.display());
// resetprop -n --file system.prop
Command::new(assets::RESETPROP_PATH)
@@ -312,7 +305,36 @@ pub fn load_system_prop() -> Result<()> {
.arg(&system_prop)
.status()
.with_context(|| format!("Failed to exec {}", system_prop.display()))?;
}
Ok(())
})?;
Ok(())
}
pub fn prune_modules() -> Result<()> {
foreach_module(false, |module| {
remove_file(module.join(defs::UPDATE_FILE_NAME)).ok();
if !module.join(defs::REMOVE_FILE_NAME).exists() {
return Ok(());
}
info!("remove module: {}", module.display());
let uninstaller = module.join("uninstall.sh");
if uninstaller.exists() {
if let Err(e) = exec_script(uninstaller, true) {
warn!("Failed to exec uninstaller: {}", e);
}
}
if let Err(e) = remove_dir_all(module) {
warn!("Failed to remove {}: {}", module.display(), e);
}
Ok(())
})?;
Ok(())
}
@@ -392,6 +414,8 @@ fn _install_module(zip: &str) -> Result<()> {
// format the img to ext4 filesystem
let result = Command::new("mkfs.ext4")
.arg("-b")
.arg("1024")
.arg(tmp_module_img)
.stdout(Stdio::null())
.output()?;
@@ -556,11 +580,8 @@ pub fn uninstall_module(id: &str) -> Result<()> {
}
})?;
if module_id.eq(mid) {
let uninstall_script = path.join("uninstall.sh");
if uninstall_script.exists() {
exec_script(uninstall_script, true)?;
}
remove_dir_all(path)?;
let remove_file = path.join(defs::REMOVE_FILE_NAME);
File::create(remove_file).with_context(|| "Failed to create remove file.")?;
break;
}
}
@@ -569,7 +590,10 @@ pub fn uninstall_module(id: &str) -> Result<()> {
let target_module_path = format!("{update_dir}/{mid}");
let target_module = Path::new(&target_module_path);
if target_module.exists() {
remove_dir_all(target_module)?;
let remove_file = target_module.join(defs::REMOVE_FILE_NAME);
if !remove_file.exists() {
File::create(remove_file).with_context(|| "Failed to create remove file.")?;
}
}
let _ = mark_module_state(id, defs::REMOVE_FILE_NAME, true);

View File

@@ -0,0 +1,69 @@
use crate::utils::ensure_dir_exists;
use crate::{defs, sepolicy};
use anyhow::{Context, Result};
use std::path::Path;
pub fn set_sepolicy(pkg: String, policy: String) -> Result<()> {
ensure_dir_exists(defs::PROFILE_SELINUX_DIR)?;
let policy_file = Path::new(defs::PROFILE_SELINUX_DIR).join(pkg);
std::fs::write(&policy_file, policy)?;
sepolicy::apply_file(&policy_file)?;
Ok(())
}
pub fn get_sepolicy(pkg: String) -> Result<()> {
let policy_file = Path::new(defs::PROFILE_SELINUX_DIR).join(pkg);
let policy = std::fs::read_to_string(policy_file)?;
println!("{policy}");
Ok(())
}
pub fn set_template(name: String, template: String) -> Result<()> {
ensure_dir_exists(defs::PROFILE_TEMPLATE_DIR)?;
let template_file = Path::new(defs::PROFILE_TEMPLATE_DIR).join(name);
std::fs::write(template_file, template)?;
Ok(())
}
pub fn get_template(name: String) -> Result<()> {
let template_file = Path::new(defs::PROFILE_TEMPLATE_DIR).join(name);
let template = std::fs::read_to_string(template_file)?;
println!("{template}");
Ok(())
}
pub fn list_templates() -> Result<()> {
let templates = std::fs::read_dir(defs::PROFILE_TEMPLATE_DIR)?;
for template in templates {
let template = template?;
let template = template.file_name();
if let Some(template) = template.to_str() {
println!("{template}");
};
}
Ok(())
}
pub fn apply_sepolies() -> Result<()> {
let path = Path::new(defs::PROFILE_SELINUX_DIR);
if !path.exists() {
log::info!("profile sepolicy dir not exists.");
return Ok(());
}
let sepolicies =
std::fs::read_dir(path).with_context(|| "profile sepolicy dir open failed.".to_string())?;
for sepolicy in sepolicies {
let Ok(sepolicy) = sepolicy else {
log::info!("profile sepolicy dir read failed.");
continue;
};
let sepolicy = sepolicy.path();
if sepolicy::apply_file(&sepolicy).is_ok() {
log::info!("profile sepolicy applied: {:?}", sepolicy);
} else {
log::info!("profile sepolicy apply failed: {:?}", sepolicy);
}
}
Ok(())
}

View File

@@ -1,3 +1,4 @@
use crate::defs;
use anyhow::Result;
use jwalk::{Parallelism::Serial, WalkDir};
use std::path::Path;
@@ -5,15 +6,17 @@ use std::path::Path;
#[cfg(any(target_os = "linux", target_os = "android"))]
use anyhow::{Context, Ok};
#[cfg(any(target_os = "linux", target_os = "android"))]
use extattr::{setxattr, Flags as XattrFlags};
use extattr::{lsetxattr, Flags as XattrFlags};
pub const SYSTEM_CON: &str = "u:object_r:system_file:s0";
pub const ADB_CON: &str = "u:object_r:adb_data_file:s0";
pub const UNLABEL_CON: &str = "u:object_r:unlabeled:s0";
const SELINUX_XATTR: &str = "security.selinux";
pub fn setcon<P: AsRef<Path>>(path: P, con: &str) -> Result<()> {
pub fn lsetfilecon<P: AsRef<Path>>(path: P, con: &str) -> Result<()> {
#[cfg(any(target_os = "linux", target_os = "android"))]
setxattr(&path, SELINUX_XATTR, con, XattrFlags::empty()).with_context(|| {
lsetxattr(&path, SELINUX_XATTR, con, XattrFlags::empty()).with_context(|| {
format!(
"Failed to change SELinux context for {}",
path.as_ref().display()
@@ -22,9 +25,21 @@ pub fn setcon<P: AsRef<Path>>(path: P, con: &str) -> Result<()> {
Ok(())
}
#[cfg(any(target_os = "linux", target_os = "android"))]
pub fn lgetfilecon<P: AsRef<Path>>(path: P) -> Result<String> {
let con = extattr::lgetxattr(&path, SELINUX_XATTR).with_context(|| {
format!(
"Failed to get SELinux context for {}",
path.as_ref().display()
)
})?;
let con = String::from_utf8_lossy(&con);
Ok(con.to_string())
}
#[cfg(any(target_os = "linux", target_os = "android"))]
pub fn setsyscon<P: AsRef<Path>>(path: P) -> Result<()> {
setcon(path, SYSTEM_CON)
lsetfilecon(path, SYSTEM_CON)
}
#[cfg(not(any(target_os = "linux", target_os = "android")))]
@@ -32,14 +47,35 @@ pub fn setsyscon<P: AsRef<Path>>(path: P) -> Result<()> {
unimplemented!()
}
#[cfg(not(any(target_os = "linux", target_os = "android")))]
pub fn lgetfilecon<P: AsRef<Path>>(path: P) -> Result<String> {
unimplemented!()
}
pub fn restore_syscon<P: AsRef<Path>>(dir: P) -> Result<()> {
for dir_entry in WalkDir::new(dir).parallelism(Serial) {
if let Some(path) = dir_entry.ok().map(|dir_entry| dir_entry.path()) {
#[cfg(any(target_os = "linux", target_os = "android"))]
setxattr(&path, SELINUX_XATTR, SYSTEM_CON, XattrFlags::empty()).with_context(|| {
format!("Failed to change SELinux context for {}", path.display())
})?;
setsyscon(&path)?;
}
}
Ok(())
}
fn restore_syscon_if_unlabeled<P: AsRef<Path>>(dir: P) -> Result<()> {
for dir_entry in WalkDir::new(dir).parallelism(Serial) {
if let Some(path) = dir_entry.ok().map(|dir_entry| dir_entry.path()) {
if let anyhow::Result::Ok(con) = lgetfilecon(&path) {
if con == UNLABEL_CON || con.is_empty() {
lsetfilecon(&path, SYSTEM_CON)?;
}
}
}
}
Ok(())
}
pub fn restorecon() -> Result<()> {
lsetfilecon(defs::DAEMON_PATH, ADB_CON)?;
restore_syscon_if_unlabeled(defs::MODULE_DIR)?;
Ok(())
}

View File

@@ -746,9 +746,6 @@ pub fn check_rule(policy: &str) -> Result<()> {
} else {
policy.to_string()
};
let result = parse_sepolicy(policy.trim(), true)?;
for statement in result {
apply_one_rule(&statement, true)?;
}
parse_sepolicy(policy.trim(), true)?;
Ok(())
}

View File

@@ -51,6 +51,7 @@ function sidebarGuide() {
{ text: 'Intergrate for non-GKI devices', link: '/guide/how-to-integrate-for-non-gki'},
{ text: 'Unofficially supported devices', link: '/guide/unofficially-support-devices.md' },
{ text: 'Module Guide', link: '/guide/module.md' },
{ text: 'App Profile', link: '/guide/app-profile.md' },
{ text: 'Rescue from bootloop', link: '/guide/rescue-from-bootloop.md' },
{ text: 'FAQ', link: '/guide/faq' },
{ text: 'Hidden features', link: '/guide/hidden-features' },

View File

@@ -5,6 +5,7 @@ import zh_TW from './zh_TW'
import vi_VN from './vi_VN'
import id_ID from './id_ID'
import ja_JP from './ja_JP'
import ru_RU from './ru_RU'
export default defineConfig({
locales: {
@@ -43,6 +44,12 @@ export default defineConfig({
lang: id_ID.lang,
themeConfig: id_ID.themeConfig,
description: id_ID.description
},
ru_RU: {
label: 'Русский',
lang: ru_RU.lang,
themeConfig: ru_RU.themeConfig,
description: ru_RU.description
}
}
})

View File

@@ -0,0 +1,61 @@
import { createRequire } from 'module'
import { defineConfig } from 'vitepress'
const require = createRequire(import.meta.url)
const pkg = require('vitepress/package.json')
export default defineConfig({
lang: 'ru-RU',
description: 'Решение на основе ядра root для устройств Android GKI.',
themeConfig: {
nav: nav(),
lastUpdatedText: 'последнее обновление',
sidebar: {
'/ru_RU/guide/': sidebarGuide()
},
socialLinks: [
{ icon: 'github', link: 'https://github.com/tiann/KernelSU' }
],
footer: {
message: 'Выпускается под лицензией GPL3.',
copyright: 'Авторские права © 2022-текущее Разработчики KernelSU'
},
editLink: {
pattern: 'https://github.com/tiann/KernelSU/edit/main/website/docs/:path',
text: 'Редактировать эту страницу на GitHub'
}
}
})
function nav() {
return [
{ text: 'Руководство', link: '/ru_RU/guide/what-is-kernelsu' },
{ text: 'Github', link: 'https://github.com/tiann/KernelSU' }
]
}
function sidebarGuide() {
return [
{
text: 'Руководство',
items: [
{ text: 'Что такое KernelSU?', link: '/ru_RU/guide/what-is-kernelsu' },
{ text: 'Установка', link: '/ru_RU/guide/installation' },
{ text: 'Как собрать?', link: '/ru_RU/guide/how-to-build' },
{ text: 'Реализация в устройствах, не относящихся к GKI', link: '/ru_RU/guide/how-to-integrate-for-non-gki'},
{ text: 'Неофициально поддерживаемые устройства', link: '/ru_RU/guide/unofficially-support-devices.md' },
{ text: 'Руководство по разработке модулей', link: '/ru_RU/guide/module.md' },
{ text: 'Профиль приложений', link: '/ru_RU/guide/app-profile.md' },
{ text: 'Выход из циклической загрузки', link: '/ru_RU/guide/rescue-from-bootloop.md' },
{ text: 'FAQ', link: '/ru_RU/guide/faq' },
{ text: 'Скрытые возможности', link: '/ru_RU/guide/hidden-features' },
]
}
]
}

View File

@@ -51,6 +51,7 @@ function sidebarGuide() {
{ text: '如何为非GKI设备集成 KernelSU', link: '/zh_CN/guide/how-to-integrate-for-non-gki'},
{ text: '非官方支持设备', link: '/zh_CN/guide/unofficially-support-devices.md' },
{ text: '模块开发指南', link: '/zh_CN/guide/module.md' },
{ text: 'App Profile', link: '/zh_CN/guide/app-profile.md' },
{ text: '救砖', link: '/zh_CN/guide/rescue-from-bootloop.md' },
{ text: '常见问题', link: '/zh_CN/guide/faq' },
{ text: '隐藏功能', link: '/zh_CN/guide/hidden-features' },

View File

@@ -0,0 +1,118 @@
# App Profile
The App Profile is a mechanism provided by KernelSU for customizing the configuration of various applications.
For applications granted root permissions (i.e., able to use `su`), the App Profile can also be referred to as the Root Profile. It allows customization of the `uid`, `gid`, `groups`, `capabilities`, and `SELinux` rules of the `su` command, thereby restricting the privileges of the root user. For example, it can grant network permissions only to firewall applications while denying file access permissions, or it can grant shell permissions instead of full root access for freeze applications: **keeping the power confined with the principle of least privilege.**
For ordinary applications without root permissions, the App Profile can control the behavior of the kernel and module system towards these applications. For instance, it can determine whether modifications resulting from modules should be addressed. The kernel and module system can make decisions based on this configuration, such as performing operations akin to "hiding"
## Root Profile
### UID, GID, and Groups
Linux systems have two concepts: users and groups. Each user has a user ID (UID), and a user can belong to multiple groups, each with its own group ID (GID). These IDs are used to identify users in the system and determine which system resources they can access.
Users with a UID of 0 are known as root users, and groups with a GID of 0 are known as root groups. The root user group typically holds the highest system privileges.
In the case of the Android system, each app is a separate user (excluding shared UID scenarios) with a unique UID. For example, `0` represents the root user, `1000` represents `system`, `2000` represents the ADB shell, and UIDs ranging from 10000 to 19999 represent ordinary apps.
:::info
Here, the UID mentioned is not the same as the concept of multiple users or work profiles in the Android system. Work profiles are actually implemented by partitioning the UID range. For example, 10000-19999 represents the main user, while 110000-119999 represents a work profile. Each ordinary app among them has its own unique UID.
:::
Each app can have several groups, with the GID representing the primary group, which usually matches the UID. Other groups are known as supplementary groups. Certain permissions are controlled through groups, such as network access permissions or Bluetooth access.
For example, if we execute the `id` command in ADB shell, the output might look like this:
```sh
oriole:/ $ id
uid=2000(shell) gid=2000(shell) groups=2000(shell),1004(input),1007(log),1011(adb),1015(sdcard_rw),1028(sdcard_r),1078(ext_data_rw),1079(ext_obb_rw),3001(net_bt_admin),3002(net_bt),3003(inet),3006(net_bw_stats),3009(readproc),3011(uhid),3012(readtracefs) context=u:r:shell:s0
```
Here, the UID is `2000`, and the GID (primary group ID) is also `2000`. Additionally, it belongs to several supplementary groups, such as `inet` (indicating the ability to create `AF_INET` and `AF_INET6` sockets) and `sdcard_rw` (indicating read/write permissions for the SD card).
KernelSU's Root Profile allows customization of the UID, GID, and groups for the root process after executing `su`. For example, the Root Profile of a root app can set its UID to `2000`, which means that when using `su`, the app's actual permissions are at the ADB shell level. The `inet` group can be removed, preventing the `su` command from accessing the network.
:::tip Note
The App Profile only controls the permissions of the root process after using `su`; it does not control the permissions of the app itself. If an app has requested network access permission, it can still access the network even without using `su`. Removing the `inet` group from `su` only prevents `su` from accessing the network.
:::
Root Profile is enforced in the kernel and does not rely on the voluntary behavior of root applications, unlike switching users or groups through `su`, the granting of `su` permission is entirely up to the user rather than the developer.
### Capabilities
Capabilities are a mechanism for privilege separation in Linux.
For the purpose of performing permission checks, traditional UNIX implementations distinguish two categories of processes: privileged processes (whose effective user ID is 0, referred to as superuser or root), and unprivileged processes (whose effective UID is nonzero). Privileged processes bypass all kernel permission checks, while unprivileged processes are subject to full permission checking based on the process's credentials (usually: effective UID, effective GID, and supplementary group list).
Starting with Linux 2.2, Linux divides the privileges traditionally associated with superuser into distinct units, known as capabilities, which can be independently enabled and disabled.
Each Capability represents one or more privileges. For example, `CAP_DAC_READ_SEARCH` represents the ability to bypass permission checks for file reading, as well as directory reading and execution permissions. If a user with an effective UID of `0` (root user) lacks `CAP_DAC_READ_SEARCH` or higher capabilities, this means that even though they are root, they cannot read files at will.
KernelSU's Root Profile allows customization of the Capabilities of the root process after executing `su`, thereby achieving partially granting "root permissions." Unlike the aforementioned UID and GID, certain root apps require a UID of `0` after using `su`. In such cases, limiting the Capabilities of this root user with UID `0` can restrict their allowed operations.
:::tip Strong Recommendation
Linux's Capability [official documentation](https://man7.org/linux/man-pages/man7/capabilities.7.html) provides detailed explanations of the abilities represented by each Capability. If you intend to customize Capabilities, it is strongly recommended that you read this document first.
:::
### SELinux
SELinux is a powerful Mandatory Access Control (MAC) mechanism. It operates on the principle of **default deny**: any action not explicitly allowed is denied.
SELinux can run in two global modes:
1. Permissive mode: Denial events are logged but not enforced.
2. Enforcing mode: Denial events are logged and enforced.
:::warning Warning
Modern Android systems heavily rely on SELinux to ensure overall system security. It is highly recommended not to use any custom systems running in "permissive mode" since it provides no significant advantages over a completely open system.
:::
Explaining the full concept of SELinux is complex and beyond the scope of this document. It is recommended to first understand its workings through the following resources:
1. [Wikipedia](https://en.wikipedia.org/wiki/Security-Enhanced_Linux)
2. [Red Hat: What Is SELinux?](https://www.redhat.com/en/topics/linux/what-is-selinux)
3. [ArchLinux: SELinux](https://wiki.archlinux.org/title/SELinux)
KernelSU's Root Profile allows customization of the SELinux context of the root process after executing `su`. Specific access control rules can be set for this context to enable fine-grained control over root permissions.
In typical scenarios, when an app executes `su`, it switches the process to a SELinux domain with **unrestricted access**, such as `u:r:su:s0`. Through the Root Profile, this domain can be switched to a custom domain, such as `u:r:app1:s0`, and a series of rules can be defined for this domain:
```sh
type app1
enforce app1
typeattribute app1 mlstrustedsubject
allow app1 * * *
```
Note that the `allow app1 * * *` rule is used for demonstration purposes only. In practice, this rule should not be used extensively since it doesn't differ much from permissive mode.
### Escalation
If the configuration of the Root Profile is not set properly, an escalation scenario may occur: the restrictions imposed by the Root Profile can unintentionally fail.
For example, if you grant root permission to an ADB shell user (which is a common case), and then you grant root permission to a regular application but configure its root profile with UID 2000 (which is the UID of the ADB shell user), the application can obtain full root access by executing the `su` command twice:
1. The first `su` execution is subject to the enforcement of the App Profile and will switch to UID `2000` (adb shell) instead of `0` (root).
2. The second `su` execution, since the UID is `2000`, and you have granted root access to the UID `2000` (adb shell) in the configuration, the application will gain full root privileges.
:::warning Note
This behavior is entirely expected and not a bug. Therefore, we recommend the following:
If you genuinely need to grant root permissions to ADB (e.g., as a developer), it is not advisable to change the UID to `2000` when configuring the Root Profile. Using `1000` (system) would be a better choice.
:::
## Non-Root Profile
### Umount Modules
KernelSU provides a systemless mechanism for modifying system partitions, achieved through overlayfs mounting. However, some apps may be sensitive to such behavior. Thus, we can unload modules mounted on these apps by setting the "umount modules" option.
Additionally, the settings interface of the KernelSU manager provides a switch for "umount modules by default". By default, this switch is **enabled**, which means that KernelSU or some modules will unload modules for this app unless additional settings are applied. If you do not prefer this setting or if it affects certain apps, you have the following options:
1. Keep the switch for "umount modules by default" and individually disable the "umount modules" option in the App Profile for apps requiring module loading (acting as a "whitelist").
2. Disable the switch for "umount modules by default" and individually enable the "umount modules" option in the App Profile for apps requiring module unloading (acting as a "blacklist").
:::info
In devices using kernel version 5.10 and above, the kernel performs the unloading of modules. However, for devices running kernel versions below 5.10, this switch is merely a configuration option, and KernelSU itself does not take any action. Some modules, such as Zygisksu, may use this switch to determine whether module unloading is necessary.
:::

View File

@@ -24,3 +24,4 @@ Here are some differences:
- The method for replacing or deleting files in KernelSU modules is completely different from Magisk. KernelSU does not support the `.replace` method. Instead, you need to create a same-named file with `mknod filename c 0 0` to delete the corresponding file.
- The directories for BusyBox are different. The built-in BusyBox in KernelSU is located in `/data/adb/ksu/bin/busybox`, while in Magisk it is in `/data/adb/magisk/busybox`. **Note that this is an internal behavior of KernelSU and may change in the future!**
- KernelSU does not support `.replace` files; however, KernelSU supports the `REMOVE` and `REPLACE` variable to remove or replace files and folders.
- KernelSU adds `boot-completed` stage to run some scripts on boot completed.

View File

@@ -1,19 +1,19 @@
# How to integrate KernelSU for non GKI kernel?
# How to integrate KernelSU for non GKI kernels?
KernelSU can be integrate to non GKI kernel, and it is backported to 4.14 now, it is also possible to run on kernel below 4.14.
KernelSU can be integrated into non GKI kernels, and was backported to 4.14 and below.
Since the fragmentization of non GKI kernels, we don't have a uniform way to build it, so we can not provide non GKI boot images. But you can build the kernel yourself with KernelSU integrated.
Due to the fragmentization of non GKI kernels, we do not have a uniform way to build it, so we can not provide non GKI boot images. But you can build the kernel yourself with KernelSU integrated.
First, you should be able to build a bootable kernel from kernel source code, if the kernel is not open sourced, then it is difficult to run KernelSU for your device.
First, you should be able to build a bootable kernel from kernel source code. If the kernel is not open source, then it is difficult to run KernelSU for your device.
If you can build a bootable kernel, there are two ways to integrate KernelSU to the kernel source code:
1. Automatically with `kprobe`
2. Manully
2. Manually
## Integrate with kprobe
KernelSU use kprobe to do kernel hooks, if the *kprobe* runs well in your kernel, it is recommended to use this way.
KernelSU uses kprobe to do kernel hooks, if the *kprobe* runs well in your kernel, it is recommended to use this way.
First, add KernelSU to your kernel source tree:
@@ -40,9 +40,9 @@ But if you encounter a boot loop when integrated KernelSU, it is maybe *kprobe i
comment out `ksu_enable_sucompat()` and `ksu_enable_ksud()` in `KernelSU/kernel/ksu.c`, if the device boots normally, then kprobe may be broken.
:::
## Manully modify the kernel source
## Manually modify the kernel source
If kprobe can not work in your kernel (maybe a upstream bug or kernel below 4.8), then you can try this way:
If kprobe does not work in your kernel (may be an upstream or kernel bug below 4.8), then you can try this way:
First, add KernelSU to your kernel source tree:
@@ -157,7 +157,7 @@ index 376543199b5a..82adcef03ecc 100644
return -EINVAL;
```
You should found the four functions in kernel source:
You should find the four functions in kernel source:
1. do_faccessat, usually in `fs/open.c`
2. do_execveat_common, usually in `fs/exec.c`
@@ -221,7 +221,7 @@ index 2ff887661237..e758d7db7663 100644
To enable KernelSU's builtin SafeMode, You should also modify `input_handle_event` in `drivers/input/input.c`:
:::tip
It is strongly recommended to enable this feature, it is very helpful for recusing from bootloop!
It is strongly recommended to enable this feature, it is very helpful to prevent bootloops!
:::
```diff
@@ -248,4 +248,4 @@ index 45306f9ef247..815091ebfca4 100755
add_input_randomness(type, code, value);
```
Finally, build your kernel again, KernelSU should works well.
Finally, build your kernel again, KernelSU should work well.

View File

@@ -95,7 +95,7 @@ This method does not require you to have TWRP, nor does it require your phone to
KernelSU provides a generic boot.img for GKI devices and you should flush the boot.img to the boot partition of the device.
You can download boot.img from [GitHub Release](https://github.com/tiann/KernelSU/releases), please note that you should use the correct version of boot.img. For example, if your device displays the kernel `android12-5.10.101` , you need to download `android-5.10.101_yyyy-MM.boot-<format>.img`. , you need to download `android-5.10.101_yyyy-MM.boot-<format>.img`.(Keep KMI consistent!)
You can download boot.img from [GitHub Release](https://github.com/tiann/KernelSU/releases), please note that you should use the correct version of boot.img. For example, if your device displays the kernel `android12-5.10.101` , you need to download `android-5.10.101_yyyy-MM.boot-<format>.img`. (Keep KMI consistent!)
Where `<format>` refers to the kernel compression format of your official boot.img, please check the kernel compression format of your original boot.img, you should use the correct format, e.g. `lz4`, `gz`; if you use an incorrect compression format, you may encounter bootloop.

View File

@@ -54,6 +54,7 @@ A KernelSU module is a folder placed in `/data/adb/modules` with the structure b
│ │
│ ├── post-fs-data.sh <--- This script will be executed in post-fs-data
│ ├── service.sh <--- This script will be executed in late_start service
│ ├── boot-completed.sh <--- This script will be executed on boot completed
| ├── uninstall.sh <--- This script will be executed when KernelSU removes your module
│ ├── system.prop <--- Properties in this file will be loaded as system properties by resetprop
│ ├── sepolicy.rule <--- Additional custom sepolicy rules
@@ -102,7 +103,7 @@ description=<string>
### Shell scripts
Please read the [Boot Scripts](#boot-scripts) section to understand the difference between `post-fs-data.sh` and `service.sh`. For most module developers, `service.sh` should be good enough if you just need to run a boot script.
Please read the [Boot Scripts](#boot-scripts) section to understand the difference between `post-fs-data.sh` and `service.sh`. For most module developers, `service.sh` should be good enough if you just need to run a boot script, if you need to run the script after boot completed, please use `boot-completed.sh`.
In all scripts of your module, please use `MODDIR=${0%/*}` to get your module's base directory path; do **NOT** hardcode your module path in scripts.
@@ -243,13 +244,13 @@ In KernelSU, scripts are divided into two types based on their running mode: pos
In KernelSU, startup scripts are divided into two types based on their storage location: general scripts and module scripts:
- General Scripts
- Placed in `/data/adb/post-fs-data.d` or `/data/adb/service.d`
- Placed in `/data/adb/post-fs-data.d`, `/data/adb/service.d` or `/data/adb/boot-completed.d`
- Only executed if the script is set as executable (`chmod +x script.sh`)
- Scripts in `post-fs-data.d` runs in post-fs-data mode, and scripts in `service.d` runs in late_start service mode.
- Modules should **NOT** add general scripts during installation
- Module Scripts
- Placed in the module's own folder
- Only executed if the module is enabled
- `post-fs-data.sh` runs in post-fs-data mode, and `service.sh` runs in late_start service mode.
- `post-fs-data.sh` runs in post-fs-data mode, `service.sh` runs in late_start service mode, `boot-completed.sh` runs on boot completed.
All boot scripts will run in KernelSU's BusyBox `ash` shell with "Standalone Mode" enabled.

View File

@@ -22,8 +22,8 @@ features:
details: KernelSU is working in Linux kernel mode, it has more control over userspace applications.
- title: Whitelist access control
details: Only App that is granted root permission can access `su`, other apps cannot perceive su.
- title: Module support
details: KernelSU supports modify /system systemlessly by overlayfs, it can even make system writable.
- title: Open source
details: KernelSU is a open source project under GPL-3 License.
- title: Restricted root permission
details: KernelSU allows you to customize the uid, gid, groups, capabilities and SELinux rules of su. Lock up the root power in a cage.
- title: Module & Open source
details: KernelSU supports modify /system systemlessly by overlayfs and it is open-sourced under GPL-3.

View File

@@ -21,11 +21,11 @@
"devices": "Poco F1 | MI8 | MiMix2S"
},
{
"maintainer": "SpectreDev-007",
"maintainer_link": "https://github.com/SpectreDev-007",
"kernel_name": "kernel_sony_sm8250",
"kernel_link": "https://github.com/XperiaBrickers/kernel_sony_sm8250",
"devices": "Sony sm8250 device"
"maintainer": "th1nhhdk",
"maintainer_link": "https://github.com/th1nhhdk",
"kernel_name": "android_kernel_sony_sm8250-kernelsu",
"kernel_link": "https://github.com/th1nhhdk/android_kernel_sony_sm8250-kernelsu",
"devices": "Sony Xperia 1 II | Sony Xperia 5 II"
},
{
"maintainer": "akash07k",
@@ -121,7 +121,7 @@
{
"maintainer": "Sreeshankar K",
"maintainer_link": "https://github.com/Sanju0910",
"kernel_name": "android_kernel_oneplus_avicii",
"kernel_name": "NeverSettle Kernel",
"kernel_link": "https://github.com/Sanju0910/android_kernel_oneplus_avicii",
"devices": "OnePlus Nord (avicii)"
},
@@ -171,14 +171,14 @@
"maintainer": "SoDebug",
"maintainer_link": "https://github.com/SoDebug",
"kernel_name": "kernel_xiaomi_raphael",
"kernel_link": "https://github.com/SoDebug/kernel_xiaomi_raphael",
"kernel_link": "https://github.com/SoDebug/KernelSU_Kernel_Raphael",
"devices": "Xiaomi Redmi K20 Pro / Mi 9T Pro (raphael)"
},
{
"maintainer": "rxuglr",
"maintainer_link": "https://github.com/rxuglr",
"kernel_name": "android_kernel_xiaomi_surya",
"kernel_link": "https://github.com/rxuglr/android_kernel_xiaomi_surya",
"kernel_name": "kernel_xiaomi_surya",
"kernel_link": "https://github.com/rxuglr/kernel_xiaomi_surya",
"devices": "Xiaomi POCO X3 / NFC (surya)"
},
{
@@ -279,13 +279,6 @@
"kernel_link": "https://github.com/SOVIET-ANDROID/kernel_xiaomi_raphael",
"devices": "XK20 Pro Raphael DSP & A only SAR support "
},
{
"maintainer": "AkariOficial",
"maintainer_link": "https://github.com/AkariOficial",
"kernel_name": "kernel_Moe_ginkgo",
"kernel_link": "https://github.com/AkariOficial/kernel_Moe_ginkgo",
"devices": "Xiaomi Redmi Note 8 (Ginkgo)"
},
{
"maintainer": "Coconutat",
"maintainer_link": "https://github.com/Coconutat",
@@ -355,5 +348,68 @@
"kernel_name": "Miyo Toku",
"kernel_link": "https://github.com/Miiyo/android_kernel_sony_sdm845/tree/KSU/Toku",
"devices": "Sony Tama (akari, apollo, aurora, akatsuki) (Linux 4.9)"
},
{
"maintainer": "likkai",
"maintainer_link": "https://github.com/likkai",
"kernel_name": "Quicksilver Kernel",
"kernel_link": "https://github.com/likkai/ksu_kernel_xiaomi_lisa",
"devices": "Xiaomi 11 Lite 5G NE (lisa)"
},
{
"maintainer": "awakened1712",
"maintainer_link": "https://github.com/awakened1712",
"kernel_name": "android_kernel_samsung_exynos9820",
"kernel_link": "https://github.com/awakened1712/android_kernel_samsung_exynos9820",
"devices": "Samsung S10/N10"
},
{
"maintainer": "awakened1712",
"maintainer_link": "https://github.com/awakened1712",
"kernel_name": "android_kernel_oneplus_sm8350",
"kernel_link": "https://github.com/awakened1712/android_kernel_oneplus_sm8350",
"devices": "Oneplus 9/9Pro"
},
{
"maintainer": "siimsek",
"maintainer_link": "https://github.com/siimsek",
"kernel_name": "Lightning Kernel",
"kernel_link": "https://github.com/siimsek/Lightning-Kernel",
"devices": "Xiaomi Redmi Note 8/8T (ginkgo/willow)"
},
{
"maintainer": "GiovanYCringe",
"maintainer_link": "https://github.com/GiovanYCringe",
"kernel_name": "kernel_a50",
"kernel_link": "https://github.com/GiovanYCringe-Experiments/kernel_a50",
"devices": "Galaxy A50 (A505f,fn,g,gn,gt)"
},
{
"maintainer": "GiovanYCringe",
"maintainer_link": "https://github.com/GiovanYCringe",
"kernel_name": "kernel_m30s",
"kernel_link": "https://github.com/GiovanYCringe-Experime/Kernel_m30s",
"devices": "Galaxy M30s"
},
{
"maintainer": "Asriadi Rahim",
"maintainer_link": "https://github.com/asriadirahim",
"kernel_name": "android_kernel_google_wahoo",
"kernel_link": "https://github.com/Google-Pixel2-2XL/kernel_google_wahoo",
"devices": "Google Pixel 2/2XL"
},
{
"maintainer": "Flame",
"maintainer_link": "https://github.com/flame-0",
"kernel_name": "android_kernel_xiaomi_sm8250",
"kernel_link": "https://github.com/vyrine/android_kernel_xiaomi_sm8250/tree/lineage-20-kernelsu",
"devices": "POCO F3/Redmi K40/Mi 11X (alioth)"
},
{
"maintainer": "DawfukFR",
"maintainer_link": "https://github.com/DawfukFR",
"kernel_name": "kernel_oneplus_sm8250 (Stellaris-Kernel)",
"kernel_link": "https://github.com/DawfukFR/kernel_oneplus_sm8250",
"devices": "Oneplus 8 (Instantnoodle), Oneplus 8T (Kebab), Oneplus 8 Pro (Instantnoodlep), Oneplus 9R (lemonades) [msm-4.19]"
}
]

View File

@@ -0,0 +1,118 @@
# Профиль приложений
Профиль приложений - это механизм, предоставляемый KernelSU для настройки конфигурации различных приложений.
Для приложений, получивших права root (т.е. имеющих возможность использовать `su`), App Profile может также называться Root Profile. Он позволяет настраивать правила `uid`, `gid`, `groups`, `capabilities` и `SELinux` команды `su`, тем самым ограничивая привилегии пользователя root. Например, она может предоставлять сетевые права только приложениям межсетевого экрана, отказывая в праве доступа к файлам, или предоставлять права shell вместо полного root-доступа для приложений freeze: **сохранение власти в рамках принципа наименьших привилегий*.
Для обычных приложений, не имеющих прав root, App Profile может управлять поведением ядра и системы модулей по отношению к этим приложениям. Например, он может определять, следует ли обращать внимание на модификации, возникающие в результате работы модулей. На основе этой конфигурации ядро и система модулей могут принимать решения, например, выполнять операции, аналогичные "скрытию".
## Корневой профиль
### UID, GID и группы
В системах Linux существуют два понятия: пользователи и группы. Каждый пользователь имеет идентификатор пользователя (UID), а пользователь может принадлежать к нескольким группам, каждая из которых имеет свой идентификатор группы (GID). Эти идентификаторы используются для идентификации пользователей в системе и определяют, к каким системным ресурсам они могут получить доступ.
Пользователи с UID, равным 0, называются корневыми пользователями, а группы с GID, равным 0, - корневыми группами. Группа пользователей root, как правило, обладает самыми высокими системными привилегиями.
В случае системы Android каждое приложение является отдельным пользователем (исключая сценарии с общим UID) с уникальным UID. Например, `0` представляет пользователя root, `1000` - `system`, `2000` - ADB shell, а UID в диапазоне от 10000 до 19999 - обычные приложения.
:::info
Здесь упомянутый UID не совпадает с концепцией нескольких пользователей или рабочих профилей в системе Android. На самом деле рабочие профили реализуются путем разделения диапазона UID. Например, 10000-19999 представляет собой основного пользователя, а 110000-119999 - рабочий профиль. Каждое обычное приложение среди них имеет свой уникальный UID.
:::
Каждое приложение может иметь несколько групп, причем GID представляет собой основную группу, которая обычно совпадает с UID. Другие группы называются дополнительными. Определенные разрешения контролируются через группы, например, разрешения на доступ к сети или доступ к Bluetooth.
Например, если мы выполним команду `id` в оболочке ADB, то результат может выглядеть следующим образом:
```sh
oriole:/ $ id
uid=2000(shell) gid=2000(shell) groups=2000(shell),1004(input),1007(log),1011(adb),1015(sdcard_rw),1028(sdcard_r),1078(ext_data_rw),1079(ext_obb_rw),3001(net_bt_admin),3002(net_bt),3003(inet),3006(net_bw_stats),3009(readproc),3011(uhid),3012(readtracefs) context=u:r:shell:s0
```
Здесь UID равен `2000`, а GID (идентификатор основной группы) также равен `2000`. Кроме того, он входит в несколько дополнительных групп, таких как `inet` (указывает на возможность создания сокетов `AF_INET` и `AF_INET6`) и `sdcard_rw` (указывает на права чтения/записи на SD-карту).
Корневой профиль KernelSU позволяет настраивать UID, GID и группы для корневого процесса после выполнения команды `su`. Например, в корневом профиле корневого приложения можно установить его UID на `2000`, что означает, что при использовании `su` фактические разрешения приложения будут находиться на уровне оболочки ADB. Группа `inet` может быть удалена, что не позволит команде `su` получить доступ к сети.
:::tip Примечание
Профиль приложений контролирует только разрешения корневого процесса после использования `su`; он не контролирует разрешения самого приложения. Если приложение запросило разрешение на доступ к сети, оно может получить доступ к сети даже без использования `su`. Удаление группы `inet` из `su` только предотвращает доступ `su` к сети.
:::
Корневой профиль реализуется в ядре и не зависит от добровольного поведения root-приложений, в отличие от переключения пользователей или групп через `su`, предоставление прав `su` полностью зависит от пользователя, а не от разработчика.
### Привилегии
Привилегии - это механизм разделения привилегий в Linux.
В традиционных реализациях UNIX для проверки прав доступа выделяются две категории процессов: привилегированные процессы (эффективный идентификатор пользователя равен 0 и называется суперпользователем или root) и непривилегированные процессы (эффективный UID которых не равен нулю). Привилегированные процессы обходят все проверки прав ядра, в то время как непривилегированные процессы подвергаются полной проверке прав на основе учетных данных процесса (обычно: эффективный UID, эффективный GID и список дополнительных групп).
Начиная с версии Linux 2.2, в Linux привилегии, традиционно ассоциируемые с суперпользователем, разделены на отдельные единицы, называемые возможностями, которые могут быть независимо включены и выключены.
Каждая способность представляет собой одну или несколько привилегий. Например, `CAP_DAC_READ_SEARCH` представляет собой возможность обхода проверок прав на чтение файлов, а также прав на чтение и выполнение каталогов. Если пользователь с эффективным UID `0` (пользователь root) не имеет возможности `CAP_DAC_READ_SEARCH` или более высоких возможностей, это означает, что, хотя он и является пользователем root, он не может читать файлы по своему усмотрению.
Корневой профиль KernelSU позволяет настраивать возможности корневого процесса после выполнения `su`, тем самым добиваясь частичного предоставления "прав root". В отличие от вышеупомянутых UID и GID, некоторые root-приложения после использования `su` требуют UID, равный `0`. В таких случаях ограничение возможностей данного root-пользователя с UID `0` может ограничить их разрешенные операции.
:::tip Настоятельная рекомендация
В документе привелегий Linux [официальной документации](https://man7.org/linux/man-pages/man7/capabilities.7.html) дается подробное объяснение возможностей, представленных каждой привелегией. Если вы собираетесь настраивать привелегии, настоятельно рекомендуется сначала прочитать этот документ.
:::
### SELinux
SELinux - это мощный механизм обязательного контроля доступа (MAC). Он работает по принципу **запрет по умолчанию**: любое действие, не разрешенное в явном виде, запрещается.
SELinux может работать в двух глобальных режимах:
1. Разрешительный режим: События запрета регистрируются, но не выполняются.
2. Принудительный режим: События запрета регистрируются и выполняются.
:::warning Предупреждение
Современные системы Android в значительной степени опираются на SELinux для обеспечения общей безопасности системы. Настоятельно не рекомендуется использовать пользовательские системы, работающие в "разрешительном режиме", поскольку это не дает существенных преимуществ перед полностью открытой системой.
:::
Объяснение полной концепции SELinux является сложным и выходит за рамки данного документа. Рекомендуется сначала разобраться в его работе с помощью следующих ресурсов:
1. [Wikipedia](https://en.wikipedia.org/wiki/Security-Enhanced_Linux)
2. [Red Hat: Что такое SELinux?](https://www.redhat.com/en/topics/linux/what-is-selinux)
3. [ArchLinux: SELinux](https://wiki.archlinux.org/title/SELinux)
Корневой профиль KernelSU позволяет настраивать SELinux-контекст корневого процесса после выполнения команды `su`. Для этого контекста могут быть заданы специальные правила управления доступом, позволяющие осуществлять тонкий контроль над правами root.
В типичных сценариях, когда приложение выполняет команду `su`, оно переключает процесс на домен SELinux с **неограниченным доступом**, например `u:r:su:s0`. С помощью профиля Root Profile этот домен может быть переключен на пользовательский домен, например `u:r:app1:s0`, и для него может быть определен ряд правил:
```sh
type app1
enforce app1
typeattribute app1 mlstrustedsubject
allow app1 * * *
```
Обратите внимание, что правило `allow app1 * * *` используется только в демонстрационных целях. На практике это правило не должно широко использоваться, поскольку оно мало чем отличается от разрешительного режима.
### Эскалация
При неправильной настройке корневого профиля может возникнуть сценарий эскалации: ограничения, накладываемые корневым профилем, могут непреднамеренно не сработать.
Например, если предоставить права root пользователю ADB shell (что является обычным случаем), а затем предоставить права root обычному приложению, но настроить его профиль root с UID 2000 (это UID пользователя ADB shell), то приложение может получить полный доступ root, выполнив команду `su` дважды:
1. При первом выполнении команды `su` будет применен профиль App Profile и произойдет переход на UID `2000` (adb shell) вместо `0` (root).
2. При втором выполнении команды `su`, поскольку UID равен `2000`, а в конфигурации вы предоставили доступ root к UID `2000` (adb shell), приложение получит полные привилегии root.
:::warning Примечание
Такое поведение вполне ожидаемо и не является ошибкой. Поэтому мы рекомендуем следующее:
Если вам действительно необходимо предоставить права root в ADB (например, как разработчику), не рекомендуется изменять UID на `2000` при настройке корневого профиля. Лучше использовать `1000` (система).
:::
## Некорневой профиль
### Размонтирование модулей
KernelSU предоставляет бессистемный механизм модификации системных разделов, реализуемый через монтирование overlayfs. Однако некоторые приложения могут быть чувствительны к такому поведению. Поэтому мы можем выгрузить модули, смонтированные в этих приложениях, установив опцию "размонтирование модулей".
Кроме того, в интерфейсе настроек менеджера KernelSU имеется переключатель "размонтирование модулей по умолчанию". По умолчанию этот переключатель **включен**, что означает, что KernelSU или некоторые модули будут выгружать модули для данного приложения, если не будут применены дополнительные настройки. Если вам не нравится эта настройка или если она влияет на определенные приложения, у вас есть следующие возможности:
1. Оставить переключатель "размонтирование модулей по умолчанию" и индивидуально отключить опцию "размонтирование модулей" в профиле приложений для приложений, требующих загрузки модулей (действует как "белый список").
2. Отключить переключатель "размонтирование модулей по умолчанию" и индивидуально включить опцию "размонтирование модулей" в App Profile для приложений, требующих выгрузки модулей (действует как "черный список").
:::info
В устройствах, использующих ядро версии 5.10 и выше, выгрузку модулей выполняет само ядро. Однако для устройств с ядром версии ниже 5.10 этот переключатель является лишь опцией конфигурации, и KernelSU сам по себе не предпринимает никаких действий. Некоторые модули, например, Zygisksu, могут использовать этот переключатель для определения необходимости выгрузки модулей.
:::

View File

@@ -0,0 +1,26 @@
# Различия с Magisk {#title}
Несмотря на большое количество сходств между модулями KernelSU и модулями Magisk, неизбежно возникают и различия, обусловленные совершенно разными механизмами их реализации. Если вы хотите, чтобы ваш модуль работал как на Magisk, так и на KernelSU, вы должны понимать эти различия.
## Сходства {#similarities}
- Формат файлов модулей: оба используют формат zip для организации модулей, и формат модулей практически одинаков
- Каталог установки модулей: оба расположены в `/data/adb/modules`.
- Бессистемность: оба поддерживают модификацию /system бессистемным способом через модули
- post-fs-data.sh: время выполнения и семантика полностью совпадают
- service.sh: время выполнения и семантика полностью совпадают
- system.prop: полностью совпадает
- sepolicy.rule: полностью совпадает
- BusyBox: скрипты запускаются в BusyBox с включенным "автономным режимом" в обоих случаях
## Различия {#differences}
Прежде чем разбираться в различиях, необходимо знать, как отличить, в каком режиме работает ваш модуль - KernelSU или Magisk. Для этого можно использовать переменную окружения `KSU` во всех местах, где можно запустить скрипты модуля (`customize.sh`, `post-fs-data.sh`, `service.sh`). В KernelSU эта переменная окружения будет установлена в значение `true`.
Вот некоторые отличия:
- Модули KernelSU не могут быть установлены в режиме Recovery.
- Модули KernelSU не имеют встроенной поддержки Zygisk (но вы можете использовать модули Zygisk через [ZygiskOnKernelSU](https://github.com/Dr-TSNG/ZygiskOnKernelSU).
- Метод замены или удаления файлов в модулях KernelSU полностью отличается от Magisk. KernelSU не поддерживает метод `.replace`. Вместо этого необходимо создать одноименный файл с помощью команды `mknod filename c 0 0` для удаления соответствующего файла.
- Каталоги для BusyBox отличаются. Встроенный BusyBox в KernelSU находится в каталоге `/data/adb/ksu/bin/busybox`, а в Magisk - в каталоге `/data/adb/magisk/busybox`. **Обратите внимание, что это внутреннее поведение KernelSU и в будущем оно может измениться!**
- KernelSU не поддерживает файлы `.replace`; однако KernelSU поддерживает переменные `REMOVE` и `REPLACE` для удаления или замены файлов и папок.

View File

@@ -0,0 +1,67 @@
# FAQ
## Поддерживает ли KernelSU мое устройство?
Во-первых, ваше устройство должно быть способно разблокировать загрузчик. Если не может, значит, устройство не поддерживается.
Затем установите на устройство приложение KernelSU manager App и откройте его, если оно покажет `Unsupported`, то ваше устройство не поддерживается из коробки, но вы можете собрать исходный код ядра и интегрировать KernelSU, чтобы заставить его работать, или использовать [неофициально-поддерживаемые-устройства](unofficially-support-devices).
## Нужно ли для KernelSU разблокировать загрузчик?
Безусловно, да.
## Поддерживает ли KernelSU модули?
Да, но это ранняя версия, она может быть глючной. Пожалуйста, подождите, пока она станет стабильной :)
## Поддерживает ли KernelSU Xposed?
Да, [Dreamland](https://github.com/canyie/Dreamland) и [TaiChi](https://taichi.cool) работают. Что касается LSPosed, то его можно заставить работать с помощью [Zygisk на KernelSU](https://github.com/Dr-TSNG/ZygiskOnKernelSU)
## Поддерживает ли KernelSU Zygisk?
KernelSU не имеет встроенной поддержки Zygisk, но вы можете использовать [Zygisk на KernelSU](https://github.com/Dr-TSNG/ZygiskOnKernelSU).
## Совместим ли KernelSU с Magisk?
Система модулей KernelSU конфликтует с магическим монтированием Magisk, если в KernelSU включен какой-либо модуль, то весь Magisk не будет работать.
Но если вы используете только `su` из KernelSU, то он будет хорошо работать с Magisk: KernelSU модифицирует `kernel`, а Magisk - `ramdisk`, они могут работать вместе.
## Заменит ли KernelSU Magisk?
Мы так не считаем, и это не является нашей целью. Magisk достаточно хорош для решения проблемы root в пользовательском пространстве и будет жить долго. Цель KernelSU - предоставить пользователям интерфейс ядра, а не заменить Magisk.
## Может ли KernelSU поддерживать устройства, не относящиеся к GKI?
Это возможно. Но для этого необходимо скачать исходный текст ядра, подключить KernelSU к дереву исходных текстов и скомпилировать ядро самостоятельно.
## Может ли KernelSU поддерживать устройства под управлением Android 12?
На совместимость KernelSU влияет ядро устройства, и версия Android здесь ни при чем. Единственное ограничение - устройства, запускаемые с Android 12, должны иметь ядро 5.10+ (устройства GKI). Итак:
1. Устройства, выпущенные под управлением Android 12, должны поддерживаться.
2. Устройства со старым ядром (некоторые устройства с Android 12 также имеют старое ядро) совместимы (Вы должны собрать ядро самостоятельно).
## Может ли KernelSU поддерживать старое ядро?
Это возможно, KernelSU бэкпортирован на ядро 4.14, для более старых ядер, вам нужно сделать бэкпорт вручную, и PR приветствуются!
## Как интегрировать KernelSU в старое ядро?
Пожалуйста, обратитесь к [руководству](how-to-integrate-for-non-gki)
## Почему моя версия Android - 13, а ядро показывает "android12-5.10"?
Версия ядра не имеет никакого отношения к версии Android, если вам нужно прошить ядро, всегда используйте версию ядра, версия Android не так важна.
## Есть ли в KernelSU пространство имен --mount-master/global mount?
Сейчас нет (возможно, в будущем), но есть много способов переключиться на глобальное пространство имен монтирования вручную, например:
1. `nsenter -t 1 -m sh` для получения оболочки в глобальном пространстве имен монтирования.
2. Добавить `nsenter --mount=/proc/1/ns/mnt` к команде, которую вы хотите выполнить, тогда команда будет выполнена в глобальном пространстве имен монтирования. KernelSU также [использует этот способ](https://github.com/tiann/KernelSU/blob/77056a710073d7a5f7ee38f9e77c9fd0b3256576/manager/app/src/main/java/me/weishu/kernelsu/ui/util/KsuCli.kt#L115)
## Я GKI1.0, могу ли я использовать это?
GKI1 полностью отличается от GKI2, вы должны скомпилировать ядро самостоятельно.

View File

@@ -0,0 +1,7 @@
# Скрытые возможности
## .ksurc
По умолчанию `/system/bin/sh` загружает `/system/etc/mkshrc`.
Вы можете заставить su загружать пользовательский rc-файл, создав файл `/data/adb/ksu/.ksurc`.

Some files were not shown because too many files have changed in this diff Show More