Compare commits

..

156 Commits

Author SHA1 Message Date
weishu
0617c4440b Docs update (#1143) 2023-11-14 13:56:21 +08:00
igor
9223558197 Website: Fix the GitHub name and improve the grammar in Brazilian Portuguese (#1138) 2023-11-14 11:08:41 +08:00
github-actions[bot]
c13040a0ea [add device]: (#1140)
has been added to the website.
Related issue: https://github.com/tiann/KernelSU/issues/1139

Co-authored-by: GitHub Actions <41898282+github-actions[bot]@users.noreply.github.com>
2023-11-14 11:07:09 +08:00
Aquarius223
b45c4f57c5 website: Optimize the non-GKI page format and repair errors (#1141)
1. Divide the patches into a separate file segment
2. Fix the ISO C90 grammar warning in fs/open.c

Conflict: JA_JP Folder does not do how-to-integrate-for-non-gki.md
Change-Id: I23a611eb937d9cb3da7a2d97046e0b57f1efc4d6

Co-authored-by: admin <paper@localhost>
2023-11-14 11:06:44 +08:00
Weblate (bot)
8196243478 Translations update from Hosted Weblate (#1125)
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/widget/kernelsu/manager/horizontal-auto.svg)

---------

Co-authored-by: Ali Beyaz <alipolatbeyaz@gmail.com>
Co-authored-by: Skallr2 <pm563838@gmail.com>
Co-authored-by: hoanghuy309 <hoanghuy309@gmail.com>
Co-authored-by: La prière <lapriere@users.noreply.hosted.weblate.org>
Co-authored-by: Rex_sa <rex.sa@pm.me>
Co-authored-by: Wisnu Gunawan <rem01gaming@gmail.com>
2023-11-13 18:50:20 +08:00
weishu
b7f937b7f9 kernel: fix su not working in shell for 6.1 kernel 2023-11-13 15:06:25 +08:00
Rem01Gaming
8fdff569d6 templates: Update templates and try to get rid with CAP_SYS_ADMIN (#1134)
- The use of CAP_SYS_ADMIN can be avoided in Kernel Manager, but cannot
be avoided in Root Explorer because it's needed for mounting RW/RO.
- Capabilities adjustment
- Fix template typo

---------

Signed-off-by: Rem01Gaming <Rem01_Gaming@proton.me>
2023-11-13 13:24:54 +08:00
Howard Wu
b658d820a1 Fix sitemap hostname (#1135) 2023-11-13 13:09:44 +08:00
weishu
ce56c19ad9 website: enable sitemap 2023-11-13 12:17:01 +08:00
weishu
d27561c505 website: fix vitepress ci 2023-11-13 12:08:22 +08:00
weishu
57898f13c1 website: fix vitepress ci 2023-11-13 12:04:37 +08:00
weishu
5da1767ff8 website: update vitepress ci 2023-11-13 11:58:59 +08:00
weishu
aa21385a36 Upgrade vitepress 2023-11-13 11:46:01 +08:00
dabao1955
697e06125a docs: Update translation instructions in README: Japanese (#1131)
ref:  #1123
2023-11-13 11:03:40 +08:00
95c383ea18 docs: Update translation instructions in docs/README_PT-BR.md (#1127)
To improve collaboration and avoid conflicts, contributors are
encouraged to use Weblate for KernelSU translations. Additionally,
clarify that pull requests for Manager's translation are no longer
accepted.
Issue https://github.com/tiann/KernelSU/pull/1123

---------

Signed-off-by: 明 <akariondev@gmail.com>
Signed-off-by: akari <akariondev@gmail.com>
2023-11-13 11:03:08 +08:00
weishu
048e94ba69 ci: allow manually dispatch website deploy 2023-11-13 10:45:09 +08:00
Rem01Gaming
4a9f1de7a0 templates: Create template for Kernel manager and Root exploler (#1133)
Signed-off-by: Rem01Gaming <Rem01_Gaming@proton.me>
2023-11-13 09:23:45 +08:00
Howard Wu
00438a6d6e Fix ksubot global value (#1130) 2023-11-12 13:34:59 +08:00
Howard Wu
88d4eca8ff Check if contain module id (#1128) 2023-11-12 12:34:18 +08:00
Howard Wu
8a298bb867 [skip ci] Check if the value is null before toInt (#1129) 2023-11-12 12:17:06 +08:00
Ylarod
5526fa2468 Update README.md about translation pr (#1123) 2023-11-10 12:48:17 +08:00
Weblate (bot)
c26a26b92d Translations update from Hosted Weblate (#1115)
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/widget/kernelsu/manager/horizontal-auto.svg)

---------

Co-authored-by: Ali Beyaz <alipolatbeyaz@gmail.com>
Co-authored-by: hoanghuy309 <hoanghuy309@gmail.com>
Co-authored-by: nottellingya <jorjoraguilar10@gmail.com>
Co-authored-by: weishu <twsxtd@gmail.com>
2023-11-08 12:29:07 +08:00
Ylarod
75e64eafd2 update tr translate (#1108)
Co-authored-by: Deniz Kalma <75412448+mdksec@users.noreply.github.com>
Co-authored-by: Ali Beyaz <symbuzzer@users.noreply.github.com>
2023-11-07 17:52:46 +08:00
Coconut
961478fa23 Remove non-GKI kernel(Huawei P10) that are no longer maintained (#1119)
Due to job changes, I no longer maintain this kernel. Therefore, I will
delete this repo website link.
2023-11-07 16:04:17 +08:00
Brian
a903b0fa4e docs: Rename mentions of ZygiskOnKernelSU to ZygiskNext (#1114) 2023-11-06 10:26:58 +08:00
Weblate (bot)
0f09b90f5b Translations update from Hosted Weblate (#1088)
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/widget/kernelsu/manager/horizontal-auto.svg)

---------

Co-authored-by: Kazuki Nakashima <flukfik41@gmail.com>
Co-authored-by: dabao1955 <dabao1955@163.com>
Co-authored-by: Ali Beyaz <alipolatbeyaz@gmail.com>
Co-authored-by: I g o r <igormczampola1@gmail.com>
Co-authored-by: tit4nnub <vaoaal@gmail.com>
Co-authored-by: Adiemi Azmi <budaknoob7@gmail.com>
Co-authored-by: 李逍遥 <a3327997820@gmail.com>
Co-authored-by: Igor Sorocean <sorocean.igor@gmail.com>
2023-11-02 17:22:27 +08:00
weishu
8b81aeaf70 ci: remove protected symbols 2023-11-02 12:06:08 +08:00
weishu
b4a52f89cc ksud: bump dependencies 2023-11-02 12:05:21 +08:00
weishu
e9df5105b3 Rename bug_report.md to bug_report.yml 2023-10-27 16:56:55 +08:00
weishu
cd2711395a Update bug_report.md 2023-10-27 16:56:10 +08:00
officialputuid
83a8d77018 [add device]: Realme 6 / 7 (RM6785) (#1097)
Change-Id: I7227a2afd01fda5684cdb28a9c4c1b2dc8ef8b65

Signed-off-by: officialputuid <officialputuid@hack.id>
2023-10-27 11:10:59 +08:00
426fde58fd [add device]: Xiaomi Redmi 6 - 6A (#1094) 2023-10-26 12:13:21 +08:00
weishu
59040c3aea website: fix repos.json 2023-10-25 16:45:31 +08:00
Js0n
f4b53daddf fix(bot): prevent flood wait by caching bot session (#1082)
This stop bot from re-login every run.
2023-10-25 11:32:46 +08:00
weishu
4c79ad7a81 manager: Fix module changelog fetch failed. close #1084 2023-10-25 11:11:44 +08:00
weishu
fb6565bd19 ci: fix build for protectd symbols 2023-10-25 09:13:11 +08:00
github-actions[bot]
a3e939ab90 [add device]: (#1091)
has been added to the website.
Related issue: https://github.com/tiann/KernelSU/issues/1090

Co-authored-by: GitHub Actions <41898282+github-actions[bot]@users.noreply.github.com>
Co-authored-by: weishu <twsxtd@gmail.com>
2023-10-25 08:38:07 +08:00
github-actions[bot]
80797548b5 [add device]: non-GKI ginkgo (#1086)
non-GKI ginkgo has been added to the website.
Related issue: https://github.com/tiann/KernelSU/issues/1085

Co-authored-by: GitHub Actions <41898282+github-actions[bot]@users.noreply.github.com>
2023-10-25 08:36:52 +08:00
weishu
f86fce6e16 ci: remove dirty postfix for a14 kernel 2023-10-24 22:59:52 +08:00
weishu
318be535a8 manager: Add missing groups 2023-10-24 22:56:27 +08:00
weishu
92d4de3a73 ci: remove su local cache 2023-10-24 18:03:03 +08:00
weishu
3cf5fc4c51 ci: ignore ksubot error 2023-10-24 18:00:45 +08:00
weishu
4e3cbf627a ci: fix secrets for release ci 2023-10-24 17:35:53 +08:00
weishu
72febb34c0 ci: Add Android 14 kernel build to release 2023-10-24 17:01:17 +08:00
weishu
03068f279d manager: fix clipboard toast 2023-10-24 15:59:30 +08:00
weishu
7371eae382 manager: template import/export 2023-10-24 15:24:32 +08:00
weishu
fae1fd9826 manager: make system and shell group conspicuously 2023-10-24 10:57:03 +08:00
weishu
ec5d9e6368 manager: sort groups and capabilities 2023-10-24 10:39:25 +08:00
weishu
64f849dc10 ci: fix build userspace su (#1079) 2023-10-24 10:19:08 +08:00
Js0n
d68fa5aed5 fix(ci): cast chat id and thread id into int (#1078) 2023-10-24 09:27:13 +08:00
4qwerty7
1b67c1b153 kernel: fix null pointer dereference for some case (#1075)
#973 __never_use_envp 被改名为 envp 并使用。

这导致 GKI 版本一旦代码运行到
[213](344c08bb79/kernel/ksud.c (L213))
行(或许只有 WSA 等类似情况会跑到这?),就会触发一个空指针解引用。

此PR意在修复此问题,且已在WSA上测试。
2023-10-24 07:00:52 +08:00
Js0n
f349507232 ci: replace python-telegram-bot with telethon (#1076) 2023-10-24 07:00:23 +08:00
weishu
bf823a29e8 kernel: fix incorrect strcmp 2023-10-23 22:22:47 +08:00
weishu
55f712d1b2 kernel: dirty fix for pixel8 wlan/bluetooth. close #1074
The wlan and bluetooth driver bcmdhd4398 cannot be loaded because cfg80211.ko has been converted to a vendor module. You can find more information about this conversion at: ee1e4b7c5e.

The reason why cfg80211.ko cannot be loaded is because the rfkill.ko module in system_dlkm has protected symbols. To fix this issue, we simply need to delete the protected symbol.

"There is no ABI stability between GKI and GKI modules. In order for modules to load correctly during runtime, GKI and GKI modules must be built and updated together."

We need to find a better solution to address this problem.

Co-authored-by: aviraxp <wanghan1995315@gmail.com>
2023-10-23 22:20:43 +08:00
weishu
ca10d7bcb9 manager: Add more info for logs 2023-10-23 17:25:39 +08:00
weishu
d24813b2c3 Merge pull request from GHSA-86cp-3prf-pwqq
* kernel: deny v2 signature blocks with incorrect number

* kernel: reject v1 signature

* kernel: enforce manager package name at compile time

* kernel: don't specific package name in source code, use it in ci
2023-10-23 12:59:30 +08:00
ZHANtech™
a6325193cf [CI] Update Android 13 sublevel and patch level (#1071)
android13-5.10-2023-10 :
https://android.googlesource.com/kernel/common/+/refs/heads/android13-5.10-2023-10

android13-5.15-2023-10 :
https://android.googlesource.com/kernel/common/+/refs/heads/android13-5.15-2023-10
2023-10-23 08:17:10 +08:00
kevios12
7a1767b4c9 kernel: fix Modules install stuck on kernel 4.4 (#1059) 2023-10-22 23:40:53 +08:00
github-actions[bot]
2d4d26c68e [add device]: (#1070)
has been added to the website.
Related issue: https://github.com/tiann/KernelSU/issues/1069

Co-authored-by: GitHub Actions <41898282+github-actions[bot]@users.noreply.github.com>
2023-10-22 23:39:11 +08:00
weishu
3f98493bb3 Add android14-6.1 (#1065) 2023-10-22 17:55:02 +08:00
sus
927f2a26bd 讓artifact可以正確導出 (#1064)
修正artifact無法被導出的問題
[action](https://github.com/tiann/KernelSU/actions/runs/6597355879)
Annotations
1 warning
upload-artifacts
No files were found with the provided path: Image-android13*/*.img.gz.
No artifacts will be uploaded.
2023-10-22 08:31:15 +08:00
weishu
344c08bb79 kernel: make compiler happy 2023-10-21 22:43:58 +08:00
weishu
84f16e4c82 assets: remove unused fields 2023-10-21 22:07:26 +08:00
weishu
4ff9dcaa17 assets: allow to use default uid, gid, groups, capabilities and context 2023-10-21 22:05:19 +08:00
weishu
34b64b8310 assets: remove CAP_DAC_READ_SEARCH 2023-10-21 20:41:30 +08:00
weishu
8f4e7f8a79 manager: remove default CAP_DAC_READ_SEARCH cap because we've processed it in kernel. 2023-10-21 20:39:30 +08:00
weishu
75b5fdfb9d kernel: make su without any capabilities possible 2023-10-21 20:32:28 +08:00
weishu
d4e19bb8fc manager: refresh template screen if needed. 2023-10-21 17:13:23 +08:00
weishu
571f89fac3 manager: Prioritize display of local templates 2023-10-21 16:52:37 +08:00
weishu
9e058c48a6 manager: support locales for online template(2) 2023-10-21 16:28:08 +08:00
weishu
e828053439 manager: support locales for online template 2023-10-21 16:23:33 +08:00
weishu
8a7d153b02 profile: Add incompetent.root profile template 2023-10-21 15:50:06 +08:00
weishu
06fdae18d2 manager: Fix missing template author 2023-10-21 15:38:17 +08:00
weishu
df8c91b306 profile: Add adb,system profile template 2023-10-21 15:33:10 +08:00
weishu
10b31bd09a manager: Fix remote template fetch error. 2023-10-21 15:29:26 +08:00
weishu
54a705d8dc profile: Add adb profile template 2023-10-21 14:25:08 +08:00
weishu
294caf3deb manager: show App Profile manage screen when empty 2023-10-21 14:02:00 +08:00
Weblate (bot)
a1f7d474f9 Translations update from Hosted Weblate (#1029)
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/widget/kernelsu/manager/horizontal-auto.svg)

---------

Co-authored-by: Ian Perdiansah <ianperdiansah05@gmail.com>
Co-authored-by: I g o r <igormczampola1@gmail.com>
Co-authored-by: Ali Beyaz <alipolatbeyaz@gmail.com>
Co-authored-by: Mix <3xh096xz4@mozmail.com>
Co-authored-by: Frankie McEyes <mceyes@protonmail.com>
Co-authored-by: wxt1221 <3264117476@qq.com>
Co-authored-by: Rex_sa <rex.sa@pm.me>
Co-authored-by: weishu tian <twsxtd@gmail.com>
2023-10-21 14:00:22 +08:00
weishu
1df5fec49b manager: use production template url 2023-10-21 13:24:20 +08:00
weishu
fd03626362 ksud: make cargo fmt happy 2023-10-21 13:21:33 +08:00
weishu
9b294682b0 manager: support App Profile template 2023-10-21 13:19:59 +08:00
weishu
a4fb9e4031 website: ensure templates dir exists 2023-10-21 10:33:39 +08:00
weishu
3ebee74efc website: Fix template index.json generate error 2023-10-21 10:28:23 +08:00
weishu
433627c82b website: Add placeholer for templates 2023-10-21 10:11:52 +08:00
weishu
6cce322107 website: Add profile template api 2023-10-21 10:01:02 +08:00
starmoe
906007a7b3 add ksu kernel for oneplus 5/5t (#1058) 2023-10-20 08:53:32 +08:00
weishu
583426ecc5 Add Android 14 kernel ci (#1057) 2023-10-20 08:53:08 +08:00
weishu
ce892bc439 kernel: don't umount for non zygote child process. fixes #1054,#1049,#1045 2023-10-19 17:29:10 +08:00
github-actions[bot]
1f1d4d454e [add device]: (#1047)
has been added to the website.
Related issue: https://github.com/tiann/KernelSU/issues/1046

Co-authored-by: GitHub Actions <41898282+github-actions[bot]@users.noreply.github.com>
2023-10-16 14:04:01 +08:00
wxt1221
4695b41f53 其他开发者适配的非GKI内核 (#1043)
[PR](https://github.com/tiann/KernelSU/pull/1024)
中删除了两个,实际上还在只是换名字了,希望加上:

https://github.com/Vincent4440/noxious_kernel_xiaomi_sm8250 ->
https://github.com/Vincent4440/android_kernel_xiaomi_sm8250

https://github.com/zharzinhoo/Kernel-Oriente-Cebu ->
https://github.com/zharzinhoo/android_kernel_motorola_cebu
2023-10-15 22:42:18 +08:00
Syuugo
52f17cde40 Optimize for build WSA kernels (#1025)
`5.15.104.4` will not be released, so commit internal changes first.
2023-10-13 19:51:25 +08:00
weishu
3408f944e6 kernel: use strncpy and strncmp 2023-10-12 15:52:10 +08:00
weishu
b1830049f1 kernel: prune allowlist with package name and uid 2023-10-12 15:44:43 +08:00
weishu
79951f06ed kernel: ignore path that's not mountpoint 2023-10-12 14:24:41 +08:00
weishu
8828939994 kernel: reject v3 and v3.1 signature scheme for manager verification 2023-10-11 17:06:14 +08:00
weishu
a3b92d6fee ksud: reject v3 and v3.1 signature scheme 2023-10-11 16:50:32 +08:00
weishu
a22959beae kernel: harden the signature check (#1027) 2023-10-11 02:53:11 -05:00
dabao1955
7753dc0987 repos.json: update source repo link (#1024)
https://github.com/Vincent4440/noxious_kernel_xiaomi_sm8250  404

https://github.com/SakuraNotStupid  301 > https://github.com/SakuraKyuo

https://github.com/Sanju0910  301 > https://github.com/sreeshankark

https://github.com/zharzinhoo/Kernel-Oriente-Cebu  404
2023-10-10 16:37:17 +08:00
igor
960c40129b fix typos in website (#1023) 2023-10-10 10:21:41 +08:00
weishu
f371d784ea Create SECURITY.md 2023-10-09 22:53:21 +08:00
github-actions[bot]
59b45ce822 [add device]: (#1021)
has been added to the website.
Related issue: https://github.com/tiann/KernelSU/issues/1020

Co-authored-by: GitHub Actions <41898282+github-actions[bot]@users.noreply.github.com>
2023-10-09 20:52:34 +08:00
weishu
340595276f kernel: Add selinux rules for module umount 2023-10-09 18:09:54 +08:00
Yu
72d756c9f2 fix typo in zh_CN guide (#1015) 2023-10-09 16:43:42 +08:00
github-actions[bot]
3d59071571 [add device]: a lineage kernel forked from LineageOS official repository, version 4.4.302, added ksu. (#1014)
a lineage kernel forked from LineageOS official repository, version
4.4.302, added ksu. has been added to the website.
Related issue: https://github.com/tiann/KernelSU/issues/1013

Co-authored-by: GitHub Actions <41898282+github-actions[bot]@users.noreply.github.com>
2023-10-09 14:35:59 +08:00
Yogesh
394cfe7516 Added Hindi translation to readme (#1009)
Co-authored-by: vibrantifix <92950980+vibrantifix@users.noreply.github.com>
2023-10-08 23:32:08 +08:00
weishu
0810db101e ci: Add android13-5.10-2023-09 2023-10-08 17:17:16 +08:00
weishu
ab0ae9d196 ci: Fix sublevel incorrect 2023-10-08 17:11:13 +08:00
weishu
13748300eb manager: update dependencies 2023-10-08 15:57:49 +08:00
weishu
c4db2bab4f manager: Fix changelog dialog, close #1005 2023-10-08 15:56:27 +08:00
weishu
e352ccc470 manager: Upgrade AGP to 8.1.0 2023-10-08 15:07:10 +08:00
weishu
7747c0e211 kernel: umount modules mnt when needed. fix #991 2023-10-08 14:17:33 +08:00
Weblate (bot)
2661a36375 Translations update from Hosted Weblate (#1000)
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/widget/kernelsu/manager/horizontal-auto.svg)

---------

Co-authored-by: I g o r <igormczampola1@gmail.com>
Co-authored-by: عَرَبَّآوٌىْ <arabawyc3@gmail.com>
Co-authored-by: Jen Kung-chih <Kaitul@outlook.com>
Co-authored-by: Rex_sa <rex.sa@pm.me>
Co-authored-by: HenRy <helge1o1o1@gmail.com>
Co-authored-by: zhar <cristofercamargo339@gmail.com>
Co-authored-by: Jakub Skorłutowski <jakub.skorlutowski@gmail.com>
Co-authored-by: Yogesh <ys76543210@gmail.com>
Co-authored-by: Szabolcs Hubai <szab.hu@gmail.com>
Co-authored-by: a0533057932 <a0533057932@gmail.com>
2023-10-08 12:15:10 +08:00
igor
1bdddb13ce fix website translations and improve grammar (#1004) 2023-10-07 11:56:15 +08:00
a0533057932
7d3c50ef0a Added Hebrew translation for readme (#1008) 2023-10-07 11:55:45 +08:00
orvit
2ee7696d67 enhance grammar and language in landing pages (en) (#1003)
Makes the project look considerably more professional and less like
you've just stumbled upon a phishing page.
2023-10-03 00:15:18 +08:00
longhuan1999
54ee400dc5 kernel: Adapt to low version Android init process (#973)
1. Adapt to low version Android init process
2. Add stop hook output
3. Fix output with missing line breaks
2023-10-02 12:00:24 +08:00
Weblate (bot)
945e2c3209 Translations update from Hosted Weblate (#980)
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/widget/kernelsu/manager/horizontal-auto.svg)

---------

Co-authored-by: I g o r <igormczampola1@gmail.com>
Co-authored-by: عَرَبَّآوٌىْ <arabawyc3@gmail.com>
Co-authored-by: Jen Kung-chih <Kaitul@outlook.com>
Co-authored-by: Rex_sa <rex.sa@pm.me>
Co-authored-by: HenRy <helge1o1o1@gmail.com>
Co-authored-by: zhar <cristofercamargo339@gmail.com>
Co-authored-by: Jakub Skorłutowski <jakub.skorlutowski@gmail.com>
2023-10-02 01:17:06 +08:00
github-actions[bot]
298e42cb42 [add device]: Moto g9 play (#995)
Moto g9 play has been added to the website.
Related issue: https://github.com/tiann/KernelSU/issues/994

Co-authored-by: GitHub Actions <41898282+github-actions[bot]@users.noreply.github.com>
2023-10-02 01:05:36 +08:00
Tuan Anh
3a657a9dbb Adding support for Nokia 8/8 Sirocco (#999)
... seems so. This include:
* Adding KernelSU support for Nokia 8/8 Sirocco (NB1/NLA/A1N)
2023-10-02 01:04:52 +08:00
huangsijun17
55aa54ca85 add a13-5.15.131 (#988)
add 131
2023-09-27 09:40:15 +08:00
igor
0b8359a2e2 fix translations from website (#989) 2023-09-26 10:45:51 +08:00
igor
afb04126f6 fix warning cards, tips and translation (#979) 2023-09-24 22:25:24 +08:00
Syuugo
98fae23864 Optimize for WSA (#975)
- Restore kernels
  - 5.15.**94.2**: WSA: **2305**.40000.(4~6).0
  - 5.15.**104.1**: WSA: **2306**.40000.4.0
  - 5.15.**104.2**: WSA: **2307**.40000.6.0
  
  This is because it is still being distributed by MS official.

- Optimize workflow
Unless there is a destructive update, all settings are the same, so
there are many unnecessary descriptions.
Therefore, the next time the device code is changed or the kernel
version is updated to higher than 5.15, the current configuration will
be restored again.
2023-09-22 10:12:42 +08:00
igor
23805d4784 update translation from website (#974) 2023-09-22 10:11:10 +08:00
github-actions[bot]
01bf24fa7b [add device]: Moto g9 play (#969)
Moto g9 play has been added to the website.
Related issue: https://github.com/tiann/KernelSU/issues/968

Co-authored-by: GitHub Actions <41898282+github-actions[bot]@users.noreply.github.com>
Co-authored-by: weishu <twsxtd@gmail.com>
2023-09-21 15:23:39 +08:00
Weblate (bot)
47f05a139d Translations update from Hosted Weblate (#960)
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/widget/kernelsu/manager/horizontal-auto.svg)

---------

Co-authored-by: Rex_sa <rex.sa@pm.me>
Co-authored-by: Julian Wu <juliancandra666@gmail.com>
Co-authored-by: Ali Beyaz <alipolatbeyaz@gmail.com>
Co-authored-by: weishu tian <twsxtd@gmail.com>
Co-authored-by: dabao1955 <dabao1955@163.com>
Co-authored-by: Igor Sorocean <sorocean.igor@gmail.com>
Co-authored-by: Syuugo <pub@s1204.me>
Co-authored-by: Jakub Skorłutowski <jakub.skorlutowski@gmail.com>
Co-authored-by: ANAND GOPAL YADAV <lsuwtlaq@telegmail.com>
Co-authored-by: I g o r <igormczampola1@gmail.com>
Co-authored-by: Kazuki Nakashima <flukfik41@gmail.com>
Co-authored-by: Justas <justasbaltiejus@gmail.com>
Co-authored-by: Artyom <akulasaur@yandex.ru>
2023-09-21 15:21:06 +08:00
github-actions[bot]
3c0c70ba7f [add device]: Moto g9 power (#971)
Moto g9 power has been added to the website.
Related issue: https://github.com/tiann/KernelSU/issues/970

Co-authored-by: GitHub Actions <41898282+github-actions[bot]@users.noreply.github.com>
2023-09-18 21:23:15 +08:00
igor
c19ba7fab0 Add Brazilian Portuguese language to the website (#965) 2023-09-18 17:22:17 +08:00
Weblate (bot)
1f42bbac5e Translations update from Hosted Weblate (#948)
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/widget/kernelsu/manager/horizontal-auto.svg)

---------

Co-authored-by: Rex_sa <rex.sa@pm.me>
Co-authored-by: Julian Wu <juliancandra666@gmail.com>
Co-authored-by: Ali Beyaz <alipolatbeyaz@gmail.com>
Co-authored-by: weishu tian <twsxtd@gmail.com>
Co-authored-by: dabao1955 <dabao1955@163.com>
Co-authored-by: Igor Sorocean <sorocean.igor@gmail.com>
Co-authored-by: Syuugo <pub@s1204.me>
Co-authored-by: Jakub Skorłutowski <jakub.skorlutowski@gmail.com>
2023-09-16 13:12:36 +08:00
Levi Zim
cbb98a1de9 Copy one extra byte from userspace filename (#958)
Otherwise we will rewrite paths for filenames that begins with
`/system/bin/su`.

This fix copies one extra byte from userspace filename so that when we
encounter filenames like `/system/bin/suasf`,
`/system/bin/su\0` gets compared with `/system/bin/sua`, which correctly
prevents the `su -> sh` path rewriting.

Close #957
2023-09-16 12:23:04 +08:00
weishu
08745664a6 manager: fix ascii art text of KernelSU. close #930 2023-09-16 12:22:44 +08:00
weishu
eac6fd0484 manager: show changelog when upgrade manager 2023-09-11 00:44:33 +08:00
Syuugo Mizoguchi
ad1dbf77a1 Move READMEs to docs (#940) 2023-09-11 00:06:35 +08:00
weishu
81bbb31098 manager: show changelog before update module 2023-09-11 00:03:21 +08:00
weishu
52234d040f manager: Fix incorrect version of downloaded module. 2023-09-10 18:16:44 +08:00
Weblate (bot)
1fb2aad893 Translations update from Hosted Weblate (#938)
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/widget/kernelsu/manager/horizontal-auto.svg)

Co-authored-by: Skallr2 <pm563838@gmail.com>
2023-09-09 23:40:01 +08:00
weishu
64744bb31d Revert "Fix the directory pathname while moving directories (#816)"
This reverts commit 983ad2c1fd.
2023-09-09 23:38:27 +08:00
Syuugo Mizoguchi
b9747fbe69 Upgrade Gradle (#937)
`8.1.1` -> `8.3`
2023-09-08 15:22:31 +08:00
ZHANtech™
85922946b7 [CI] Update Check Build Kernel (#936) 2023-09-07 23:33:55 +08:00
Syuugo Mizoguchi
40fc6d2163 Bump actions/checkout from 3 to 4 (#935)
Bumps [actions/checkout](https://github.com/actions/checkout) from 3 to
4.
- [Release notes](https://github.com/actions/checkout/releases)
-
[Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md)
- [Commits](actions/checkout@v3...v4)
2023-09-07 21:24:01 +08:00
Weblate (bot)
da662133ae Translations update from Hosted Weblate (#898)
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/widget/kernelsu/manager/horizontal-auto.svg)

---------

Co-authored-by: Reza Almanda <rezaalmanda27@gmail.com>
Co-authored-by: I g o r <igormczampola1@gmail.com>
Co-authored-by: Igor Sorocean <sorocean.igor@gmail.com>
Co-authored-by: Skallr2 <pm563838@gmail.com>
Co-authored-by: Szabolcs Hubai <szab.hu@gmail.com>
Co-authored-by: Pegioner <pegioner@yandex.ru>
Co-authored-by: Kazuki Nakashima <flukfik41@gmail.com>
Co-authored-by: Tushar Kumar <tushar8133@gmail.com>
Co-authored-by: Iksan Adi <iksanadisubekti@gmail.com>
Co-authored-by: Eryk Michalak <gnu.ewm@protonmail.com>
Co-authored-by: Kyle Brandon Sioson <siosonkylebrandon@gmail.com>
Co-authored-by: M4RZ3R0 <m4rz3r0.development@gmail.com>
2023-09-07 10:43:40 +08:00
Syuugo Mizoguchi
25592a0614 Fix WSA kernels (#925)
- WSA latest version: `2307.40000.6.0`
  -> Kernel version: `5.15.104.2`

- Next kernel version: `5.15.104.3`
  -> We haven't yet confirmed the release of this kernel.
2023-09-06 00:56:26 +08:00
weishu
2d96aaa28f ksud: don't clean update dir, only ensure it exists 2023-09-02 10:39:40 +08:00
Pa1NarK
64cf6eb8b9 feat(kernel): Add Kernel 5.10.187 (#866)
- Bluejay running GrapheneOS is on Kernel version `5.10.187`.  
- Tried to flash other versions `5.10.xxx` and all went into bootloop.
Unsure how this version would go
2023-09-01 23:30:16 +08:00
weishu
7e44765074 Fix build (#927) 2023-09-01 22:27:25 +08:00
hopez13
d84fdada31 workflow: update build tools branch (#926) 2023-09-01 14:30:12 +08:00
Nguyễn Viết Thắng
71c14d96ab Language Update (#924)
Update Vietnamese language for kernelsu.org and README_VI.md
2023-09-01 14:23:45 +08:00
ZHANtech™
5d988002c7 [CI] Update Android 13 5.15 sublevel and patch level (#921) 2023-09-01 06:49:10 +08:00
Azusachan
15ff9fbf41 [CI] Update Android 12 5.10 sublevel and patch level (#911)
For patch level 2023-07, sublevel is 177
https://android.googlesource.com/kernel/common/+/refs/heads/android12-5.10-2023-07/Makefile

For patch level 2023-09, sublevel is 185
https://android.googlesource.com/kernel/common/+/refs/heads/android12-5.10-2023-09/Makefile

Co-authored-by: weishu <twsxtd@gmail.com>
2023-08-31 22:23:52 +08:00
ISNing
542d3e40af manager: fix dependency version reference (#919)
This typo causes gradle sync failed
2023-08-31 21:39:16 +08:00
github-actions[bot]
7c4fb51b5c [add device]: (#908)
has been added to the website.
Related issue: https://github.com/tiann/KernelSU/issues/907

Co-authored-by: GitHub Actions <41898282+github-actions[bot]@users.noreply.github.com>
2023-08-31 20:46:52 +08:00
dabao1955
5b10d10b82 update repo kernel source link (#917)
https://github.com/GiovanYCringe-Experime/Kernel_m30s HTTP/2 404

https://github.com/Sr-Han/kernel_xiaomi_mojito.git HTTP/2 301 >
https://github.com/Sr-Han/kernel_xiaomi_mojito

https://github.com/SonalSingh18/android_kernel_xiaomi_sm6250.git HTTP/2
301 > https://github.com/SonalSingh18/android_kernel_xiaomi_sm6250

https://github.com/rxuglr/kernel_xiaomi_surya HTTP/2 404

https://github.com/LeviMarvin/kernel_xiaomi_alioth HTTP/2 301 >
https://github.com/LeviMarvin/android_kernel_xiaomi_alioth


https://github.com/Vincent4440/android_kernel_xiaomi_sm8250/tree/thirteen
HTTP/2 404 > https://github.com/Vincent4440/android_kernel_xiaomi_sm8250
2023-08-31 20:45:22 +08:00
Ali Beyaz
677d3357b9 Fixed "Discussion" titles on several languages (#900) 2023-08-28 01:15:02 +08:00
weishu
5e893e3d04 kernel: avoding select OVERLAY_FS becuase it may break GKI checks. fix 2023-08-28 01:06:44 +08:00
Fakhri
685cd75c99 Add Indonesian translation for README (#893) 2023-08-23 14:18:30 +08:00
github-actions[bot]
8354204c32 [add device]: (#895)
has been added to the website.
Related issue: https://github.com/tiann/KernelSU/issues/894

Co-authored-by: GitHub Actions <41898282+github-actions[bot]@users.noreply.github.com>
2023-08-23 14:17:48 +08:00
182 changed files with 6956 additions and 2378 deletions

View File

@@ -1,32 +0,0 @@
---
name: Bug report
about: Create a report to help us improve
title: ''
labels: ''
assignees: ''
---
**Describe the bug**
A clear and concise description of what the bug is.
**To Reproduce**
Steps to reproduce the behaviour:
1. Go to '...'
2. Click on '....'
3. Scroll down to '....'
4. See the error
**Expected behaviour**
A clear and concise description of what you expected to happen.
**Screenshots**
If applicable, add screenshots to help explain your problem.
**Smartphone (please complete the following information):**
- Device: [e.g. iPhone6]
- OS: [e.g. iOS8.1]
- Version [e.g. 22]
**Additional context**
Add any other context about the problem here.

72
.github/ISSUE_TEMPLATE/bug_report.yml vendored Normal file
View File

@@ -0,0 +1,72 @@
name: Bug report
description: Create a report to help us improve KernelSU
labels: [Bug]
body:
- type: checkboxes
attributes:
label: Please check before submitting an issue
options:
- label: I have searched the issues and haven't found anything relevant
required: true
- label: I will upload bugreport file in KernelSU Manager - Settings - Report log
required: true
- label: I know how to reproduce the issue which may not be specific to my device
required: false
- type: textarea
attributes:
label: Describe the bug
description: A clear and concise description of what the bug is
validations:
required: true
- type: textarea
attributes:
label: To Reproduce
description: Steps to reproduce the behaviour
placeholder: |
- 1. Go to '...'
- 2. Click on '....'
- 3. Scroll down to '....'
- 4. See error
- type: textarea
attributes:
label: Expected behavior
description: A clear and concise description of what you expected to happen.
- type: textarea
attributes:
label: Screenshots
description: If applicable, add screenshots to help explain your problem.
- type: textarea
attributes:
label: Logs
description: If applicable, add crash or any other logs to help us figure out the problem.
- type: textarea
attributes:
label: Device info
value: |
- Device:
- OS Version:
- KernelSU Version:
- Kernel Version:
validations:
required: true
- type: textarea
attributes:
label: Additional context
description: Add any other context about the problem here.

View File

@@ -11,7 +11,7 @@ jobs:
env:
ISSUE_CONTENT: ${{ github.event.issue.body }}
steps:
- uses: actions/checkout@v3
- uses: actions/checkout@v4
- name: Parse issue body
id: handle-add-device
run: |

View File

@@ -7,9 +7,9 @@ jobs:
uses: ./.github/workflows/gki-kernel.yml
with:
version: android12-5.10
version_name: android12-5.10.177
tag: android12-5.10-2023-06
os_patch_level: 2023-06
version_name: android12-5.10.185
tag: android12-5.10-2023-09
os_patch_level: 2023-09
patch_path: "5.10"
debug: true
build-debug-kernel-a13:
@@ -17,11 +17,11 @@ jobs:
matrix:
include:
- version: "5.10"
sub_level: 177
os_patch_level: 2023-06
sub_level: 187
os_patch_level: 2023-08
- version: "5.15"
sub_level: 119
os_patch_level: 2023-07
os_patch_level: 2023-09
uses: ./.github/workflows/gki-kernel.yml
with:
version: android13-${{ matrix.version }}

View File

@@ -40,7 +40,9 @@ jobs:
- sub_level: 168
os_patch_level: 2023-05
- sub_level: 177
os_patch_level: 2023-06
os_patch_level: 2023-07
- sub_level: 185
os_patch_level: 2023-09
uses: ./.github/workflows/gki-kernel.yml
secrets: inherit
with:
@@ -55,7 +57,6 @@ jobs:
if: ${{ ( github.event_name != 'pull_request' && github.ref == 'refs/heads/main' ) || github.ref_type == 'tag' || github.ref == 'refs/heads/ci' }}
env:
CHAT_ID: ${{ secrets.CHAT_ID }}
CACHE_CHAT_ID: ${{ secrets.CACHE_CHAT_ID }}
BOT_TOKEN: ${{ secrets.BOT_TOKEN }}
MESSAGE_THREAD_ID: ${{ secrets.MESSAGE_THREAD_ID }}
COMMIT_MESSAGE: ${{ github.event.head_commit.message }}
@@ -65,7 +66,7 @@ jobs:
- name: Download artifacts
uses: actions/download-artifact@v3
- uses: actions/checkout@v3
- uses: actions/checkout@v4
with:
path: KernelSU
fetch-depth: 0
@@ -77,11 +78,11 @@ jobs:
- name: Download prebuilt toolchain
run: |
AOSP_MIRROR=https://android.googlesource.com
BRANCH=master-kernel-build-2022
BRANCH=main-kernel-build-2023
git clone $AOSP_MIRROR/platform/prebuilts/build-tools -b $BRANCH --depth 1 build-tools
git clone $AOSP_MIRROR/kernel/prebuilts/build-tools -b $BRANCH --depth 1 kernel-build-tools
git clone $AOSP_MIRROR/platform/system/tools/mkbootimg -b $BRANCH --depth 1
pip3 install python-telegram-bot
pip3 install telethon==1.31.1
- name: Set boot sign key
env:
@@ -91,8 +92,12 @@ jobs:
echo "$BOOT_SIGN_KEY" > ./kernel-build-tools/linux-x86/share/avb/testkey_rsa2048.pem
fi
- name: Setup mutex for uploading
uses: ben-z/gh-action-mutex@v1.0-alpha-7
- name: Bot session cache
id: bot_session_cache
uses: actions/cache@v3
with:
path: scripts/ksubot.session
key: ${{ runner.os }}-bot-session
- name: Build boot images
run: |

View File

@@ -36,6 +36,15 @@ jobs:
- version: "5.10"
sub_level: 177
os_patch_level: 2023-06
- version: "5.10"
sub_level: 186
os_patch_level: 2023-08
- version: "5.10"
sub_level: 186
os_patch_level: 2023-09
- version: "5.10"
sub_level: 189
os_patch_level: 2023-10
- version: "5.15"
sub_level: 41
os_patch_level: 2022-11
@@ -50,10 +59,13 @@ jobs:
os_patch_level: 2023-05
- version: "5.15"
sub_level: 104
os_patch_level: 2023-06
os_patch_level: 2023-07
- version: "5.15"
sub_level: 119
os_patch_level: 2023-07
os_patch_level: 2023-09
- version: "5.15"
sub_level: 123
os_patch_level: 2023-10
uses: ./.github/workflows/gki-kernel.yml
secrets: inherit
with:
@@ -68,7 +80,6 @@ jobs:
if: ${{ ( github.event_name != 'pull_request' && github.ref == 'refs/heads/main' ) || github.ref_type == 'tag' || github.ref == 'refs/heads/ci' }}
env:
CHAT_ID: ${{ secrets.CHAT_ID }}
CACHE_CHAT_ID: ${{ secrets.CACHE_CHAT_ID }}
BOT_TOKEN: ${{ secrets.BOT_TOKEN }}
MESSAGE_THREAD_ID: ${{ secrets.MESSAGE_THREAD_ID }}
COMMIT_MESSAGE: ${{ github.event.head_commit.message }}
@@ -78,7 +89,7 @@ jobs:
- name: Download artifacts
uses: actions/download-artifact@v3
- uses: actions/checkout@v3
- uses: actions/checkout@v4
with:
path: KernelSU
fetch-depth: 0
@@ -90,11 +101,11 @@ jobs:
- name: Download prebuilt toolchain
run: |
AOSP_MIRROR=https://android.googlesource.com
BRANCH=master-kernel-build-2022
BRANCH=main-kernel-build-2023
git clone $AOSP_MIRROR/platform/prebuilts/build-tools -b $BRANCH --depth 1 build-tools
git clone $AOSP_MIRROR/kernel/prebuilts/build-tools -b $BRANCH --depth 1 kernel-build-tools
git clone $AOSP_MIRROR/platform/system/tools/mkbootimg -b $BRANCH --depth 1
pip3 install python-telegram-bot
pip3 install telethon==1.31.1
- name: Set boot sign key
env:
@@ -104,8 +115,12 @@ jobs:
echo "$BOOT_SIGN_KEY" > ./kernel-build-tools/linux-x86/share/avb/testkey_rsa2048.pem
fi
- name: Setup mutex for uploading
uses: ben-z/gh-action-mutex@v1.0-alpha-7
- name: Bot session cache
id: bot_session_cache
uses: actions/cache@v3
with:
path: scripts/ksubot.session
key: ${{ runner.os }}-bot-session
- name: Build boot images
run: |
@@ -135,14 +150,15 @@ jobs:
matrix:
include:
- version: "5.10"
sub_level: 177
os_patch_level: 2023-06
sub_level: 189
os_patch_level: 2023-10
- version: "5.15"
sub_level: 119
os_patch_level: 2023-07
sub_level: 123
os_patch_level: 2023-10
uses: ./.github/workflows/gki-kernel.yml
with:
version: android13-${{ matrix.version }}
version_name: android13-${{ matrix.version }}.${{ matrix.sub_level }}
tag: android13-${{ matrix.version }}-${{ matrix.os_patch_level }}
os_patch_level: ${{ matrix.os_patch_level }}
patch_path: ${{ matrix.version }}

122
.github/workflows/build-kernel-a14.yml vendored Normal file
View File

@@ -0,0 +1,122 @@
name: Build Kernel - Android 14
on:
push:
branches: ["main", "ci"]
paths:
- ".github/workflows/build-kernel-a14.yml"
- ".github/workflows/gki-kernel.yml"
- ".github/scripts/build_a13.sh"
- "kernel/**"
pull_request:
branches: ["main"]
paths:
- ".github/workflows/build-kernel-a14.yml"
- ".github/workflows/gki-kernel.yml"
- ".github/scripts/build-a13.sh"
- "kernel/**"
workflow_call:
jobs:
build-kernel:
if: github.event_name != 'pull_request'
strategy:
matrix:
include:
- version: "5.15"
sub_level: 110
os_patch_level: 2023-09
- version: "6.1"
sub_level: 25
os_patch_level: 2023-10
uses: ./.github/workflows/gki-kernel.yml
secrets: inherit
with:
version: android14-${{ matrix.version }}
version_name: android14-${{ matrix.version }}.${{ matrix.sub_level }}
tag: android14-${{ matrix.version }}-${{ matrix.os_patch_level }}
os_patch_level: ${{ matrix.os_patch_level }}
patch_path: ${{ matrix.version }}
upload-artifacts:
needs: build-kernel
runs-on: ubuntu-latest
if: ${{ ( github.event_name != 'pull_request' && github.ref == 'refs/heads/main' ) || github.ref_type == 'tag' || github.ref == 'refs/heads/ci' }}
env:
CHAT_ID: ${{ secrets.CHAT_ID }}
BOT_TOKEN: ${{ secrets.BOT_TOKEN }}
MESSAGE_THREAD_ID: ${{ secrets.MESSAGE_THREAD_ID }}
COMMIT_MESSAGE: ${{ github.event.head_commit.message }}
COMMIT_URL: ${{ github.event.head_commit.url }}
RUN_URL: ${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}
steps:
- name: Download artifacts
uses: actions/download-artifact@v3
- uses: actions/checkout@v4
with:
path: KernelSU
fetch-depth: 0
- name: List artifacts
run: |
tree
- name: Download prebuilt toolchain
run: |
AOSP_MIRROR=https://android.googlesource.com
BRANCH=main-kernel-build-2023
git clone $AOSP_MIRROR/platform/prebuilts/build-tools -b $BRANCH --depth 1 build-tools
git clone $AOSP_MIRROR/kernel/prebuilts/build-tools -b $BRANCH --depth 1 kernel-build-tools
git clone $AOSP_MIRROR/platform/system/tools/mkbootimg -b $BRANCH --depth 1
pip3 install telethon==1.31.1
- name: Set boot sign key
env:
BOOT_SIGN_KEY: ${{ secrets.BOOT_SIGN_KEY }}
run: |
if [ ! -z "$BOOT_SIGN_KEY" ]; then
echo "$BOOT_SIGN_KEY" > ./kernel-build-tools/linux-x86/share/avb/testkey_rsa2048.pem
fi
- name: Bot session cache
id: bot_session_cache
uses: actions/cache@v3
with:
path: scripts/ksubot.session
key: ${{ runner.os }}-bot-session
- name: Build boot images
run: |
export AVBTOOL=$GITHUB_WORKSPACE/kernel-build-tools/linux-x86/bin/avbtool
export GZIP=$GITHUB_WORKSPACE/build-tools/path/linux-x86/gzip
export LZ4=$GITHUB_WORKSPACE/build-tools/path/linux-x86/lz4
export MKBOOTIMG=$GITHUB_WORKSPACE/mkbootimg/mkbootimg.py
export UNPACK_BOOTIMG=$GITHUB_WORKSPACE/mkbootimg/unpack_bootimg.py
cd $GITHUB_WORKSPACE/KernelSU
export VERSION=$(($(git rev-list --count HEAD) + 10200))
echo "VERSION: $VERSION"
cd -
bash $GITHUB_WORKSPACE/KernelSU/.github/scripts/build_a13.sh
- name: Display structure of boot files
run: ls -R
- name: Upload images artifact
uses: actions/upload-artifact@v3
with:
name: boot-images-android14
path: Image-android14*/*.img.gz
check-build-kernel:
if: github.event_name == 'pull_request'
strategy:
matrix:
include:
- version: "5.15"
sub_level: 110
os_patch_level: 2023-09
uses: ./.github/workflows/gki-kernel.yml
with:
version: android14-${{ matrix.version }}
version_name: android14-${{ matrix.version }}.${{ matrix.sub_level }}
tag: android14-${{ matrix.version }}-${{ matrix.os_patch_level }}
os_patch_level: ${{ matrix.os_patch_level }}
patch_path: ${{ matrix.version }}

View File

@@ -59,7 +59,7 @@ jobs:
sudo ln -s --force /usr/bin/clang++-$LLVM_VERSION /usr/bin/clang++
- name: Checkout KernelSU
uses: actions/checkout@v3
uses: actions/checkout@v4
with:
path: KernelSU
fetch-depth: 0
@@ -115,11 +115,18 @@ jobs:
name: kernel-ARCVM-${{ matrix.arch }}-${{ matrix.version }}
path: "${{ env.file_path }}"
- name: Bot session cache
if: ${{ ( github.event_name == 'push' && github.ref == 'refs/heads/main' ) || github.ref_type == 'tag' }}
id: bot_session_cache
uses: actions/cache@v3
with:
path: scripts/ksubot.session
key: ${{ runner.os }}-bot-session
- name: Post to Telegram
if: ${{ ( github.event_name == 'push' && github.ref == 'refs/heads/main' ) || github.ref_type == 'tag' }}
env:
CHAT_ID: ${{ secrets.CHAT_ID }}
CACHE_CHAT_ID: ${{ secrets.CACHE_CHAT_ID }}
BOT_TOKEN: ${{ secrets.BOT_TOKEN }}
MESSAGE_THREAD_ID: ${{ secrets.MESSAGE_THREAD_ID }}
COMMIT_MESSAGE: ${{ github.event.head_commit.message }}
@@ -135,6 +142,6 @@ jobs:
echo "[+] Image to upload"
ls -l "${{ env.file_path }}.gz"
if [ -n "${{ secrets.BOT_TOKEN }}" ]; then
pip3 install python-telegram-bot
pip3 install telethon==1.31.1
python3 "$GITHUB_WORKSPACE/KernelSU/scripts/ksubot.py" "${{ env.file_path }}.gz"
fi

View File

@@ -18,40 +18,7 @@ jobs:
strategy:
matrix:
arch: [x86_64, arm64]
version: ["5.15.94.4", "5.15.104.1", "5.15.104.2"]
include:
- arch: x86_64
file_name: "bzImage"
- arch: arm64
file_name: "Image"
cross_compile: "aarch64-linux-gnu"
- 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.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.104.2"
arch: x86_64
make_config: config-wsa-x64
- version: "5.15.104.2"
arch: arm64
make_config: config-wsa-arm64
- version: "5.15.94.4"
device_code: latte-2
kernel_version: "5.15"
- version: "5.15.104.1"
device_code: latte-2
kernel_version: "5.15"
- version: "5.15.104.2"
device_code: latte-2
kernel_version: "5.15"
version: ["5.15.94.2", "5.15.104.1", "5.15.104.2", "5.15.104.3", "5.15.104.4"]
name: Build WSA-Kernel-${{ matrix.version }}-${{ matrix.arch }}
runs-on: ubuntu-20.04
@@ -62,35 +29,37 @@ jobs:
steps:
- name: Install Build Tools
run: |
sudo apt-get update
sudo apt-get install -y --no-install-recommends bc bison build-essential ca-certificates flex git gnupg libelf-dev libssl-dev lsb-release software-properties-common wget libncurses-dev binutils-aarch64-linux-gnu gcc-aarch64-linux-gnu nuget gzip
export LLVM_VERSION=12
wget https://apt.llvm.org/llvm.sh
chmod +x llvm.sh
sudo ./llvm.sh $LLVM_VERSION
rm ./llvm.sh
sudo ln -s --force /usr/bin/clang-$LLVM_VERSION /usr/bin/clang
sudo ln -s --force /usr/bin/ld.lld-$LLVM_VERSION /usr/bin/ld.lld
sudo ln -s --force /usr/bin/llvm-objdump-$LLVM_VERSION /usr/bin/llvm-objdump
sudo ln -s --force /usr/bin/llvm-ar-$LLVM_VERSION /usr/bin/llvm-ar
sudo ln -s --force /usr/bin/llvm-nm-$LLVM_VERSION /usr/bin/llvm-nm
sudo ln -s --force /usr/bin/llvm-strip-$LLVM_VERSION /usr/bin/llvm-strip
sudo ln -s --force /usr/bin/llvm-objcopy-$LLVM_VERSION /usr/bin/llvm-objcopy
sudo ln -s --force /usr/bin/llvm-readelf-$LLVM_VERSION /usr/bin/llvm-readelf
sudo ln -s --force /usr/bin/clang++-$LLVM_VERSION /usr/bin/clang++
uses: awalsh128/cache-apt-pkgs-action@v1
with:
packages: bc bison build-essential flex libelf-dev binutils-aarch64-linux-gnu gcc-aarch64-linux-gnu gzip ccache
version: 1.0
- name: Cache LLVM
id: cache-llvm
uses: actions/cache@v3
with:
path: ./llvm
key: llvm-12.0.1
- name: Setup LLVM
uses: KyleMayes/install-llvm-action@v1
with:
version: "12.0.1"
force-version: true
ubuntu-version: "16.04"
cached: ${{ steps.cache-llvm.outputs.cache-hit }}
- name: Checkout KernelSU
uses: actions/checkout@v3
uses: actions/checkout@v4
with:
path: KernelSU
fetch-depth: 0
- name: Setup kernel source
uses: actions/checkout@v3
uses: actions/checkout@v4
with:
repository: microsoft/WSA-Linux-Kernel
ref: android-lts/${{ matrix.device_code }}/${{ matrix.version }}
ref: android-lts/latte-2/${{ matrix.version }}
path: WSA-Linux-Kernel
- name: Setup Ccache
@@ -112,7 +81,7 @@ jobs:
DRIVER_MAKEFILE=$KERNEL_ROOT/drivers/Makefile
grep -q "kernelsu" $DRIVER_MAKEFILE || echo "obj-y += kernelsu/" >> $DRIVER_MAKEFILE
echo "[+] Apply KernelSU patches"
cd $KERNEL_ROOT && git apply $GITHUB_WORKSPACE/KernelSU/.github/patches/${{ matrix.kernel_version }}/*.patch
cd $KERNEL_ROOT && git apply $GITHUB_WORKSPACE/KernelSU/.github/patches/5.15/*.patch
echo "[+] KernelSU setup done."
cd $GITHUB_WORKSPACE/KernelSU
VERSION=$(($(git rev-list --count HEAD) + 10200))
@@ -122,15 +91,17 @@ jobs:
- name: Build Kernel
working-directory: WSA-Linux-Kernel
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"
declare -A ARCH_MAP=(["x86_64"]="x86" ["arm64"]="arm64")
echo "file_path=WSA-Linux-Kernel/arch/${ARCH_MAP[${{ matrix.arch }}]}/boot/${{ matrix.file_name }}" >> $GITHUB_ENV
declare -A ARCH_MAP=(["x86_64"]="x64" ["arm64"]="arm64")
cp configs/wsa/config-wsa-${ARCH_MAP[${{ matrix.arch }}]} .config
make olddefconfig
declare -A FILE_NAME=(["x86_64"]="bzImage" ["arm64"]="Image")
make -j`nproc` LLVM=1 ARCH=${{ matrix.arch }} $(if [ "${{ matrix.arch }}" == "arm64" ]; then echo CROSS_COMPILE=aarch64-linux-gnu; fi) ${FILE_NAME[${{ matrix.arch }}]} CCACHE="/usr/bin/ccache"
declare -A ARCH_MAP_FILE=(["x86_64"]="x86" ["arm64"]="arm64")
echo "file_path=WSA-Linux-Kernel/arch/${ARCH_MAP_FILE[${{ matrix.arch }}]}/boot/${FILE_NAME[${{ matrix.arch }}]}" >> $GITHUB_ENV
- name: Upload kernel-${{ matrix.arch }}-${{ matrix.version }}
uses: actions/upload-artifact@v3
@@ -138,11 +109,18 @@ jobs:
name: kernel-WSA-${{ matrix.arch }}-${{ matrix.version }}
path: "${{ env.file_path }}"
- name: Bot session cache
if: github.event_name == 'push' && github.ref == 'refs/heads/main' || github.ref_type == 'tag'
id: bot_session_cache
uses: actions/cache@v3
with:
path: scripts/ksubot.session
key: ${{ runner.os }}-bot-session
- name: Post to Telegram
if: ${{ ( github.event_name == 'push' && github.ref == 'refs/heads/main' ) || github.ref_type == 'tag' }}
if: github.event_name == 'push' && github.ref == 'refs/heads/main' || github.ref_type == 'tag'
env:
CHAT_ID: ${{ secrets.CHAT_ID }}
CACHE_CHAT_ID: ${{ secrets.CACHE_CHAT_ID }}
BOT_TOKEN: ${{ secrets.BOT_TOKEN }}
MESSAGE_THREAD_ID: ${{ secrets.MESSAGE_THREAD_ID }}
COMMIT_MESSAGE: ${{ github.event.head_commit.message }}
@@ -158,6 +136,6 @@ jobs:
echo "[+] Image to upload"
ls -l "${{ env.file_path }}.gz"
if [ -n "${{ secrets.BOT_TOKEN }}" ]; then
pip3 install python-telegram-bot
pip3 install telethon==1.31.1
python3 "$GITHUB_WORKSPACE/KernelSU/scripts/ksubot.py" "${{ env.file_path }}.gz"
fi

View File

@@ -2,13 +2,13 @@ name: Build KSUD
on:
push:
branches: [ "main", "ci" ]
paths:
paths:
- '.github/workflows/build-ksud.yml'
- '.github/workflows/ksud.yml'
- 'userspace/ksud/**'
pull_request:
branches: [ "main" ]
paths:
paths:
- '.github/workflows/build-ksud.yml'
- '.github/workflows/ksud.yml'
- 'userspace/ksud/**'

View File

@@ -33,7 +33,7 @@ jobs:
steps:
- name: Checkout
uses: actions/checkout@v3
uses: actions/checkout@v4
with:
fetch-depth: 0
@@ -102,15 +102,18 @@ jobs:
name: manager
path: manager/app/build/outputs/apk/release/*.apk
- name: Setup mutex for uploading
uses: ben-z/gh-action-mutex@v1.0-alpha-7
- name: Bot session cache
if: github.event_name != 'pull_request' && steps.need_upload.outputs.UPLOAD == 'true'
id: bot_session_cache
uses: actions/cache@v3
with:
path: scripts/ksubot.session
key: ${{ runner.os }}-bot-session
- name: Upload to telegram
if: github.event_name != 'pull_request' && steps.need_upload.outputs.UPLOAD == 'true'
env:
CHAT_ID: ${{ secrets.CHAT_ID }}
CACHE_CHAT_ID: ${{ secrets.CACHE_CHAT_ID }}
BOT_TOKEN: ${{ secrets.BOT_TOKEN }}
MESSAGE_THREAD_ID: ${{ secrets.MESSAGE_THREAD_ID }}
COMMIT_MESSAGE: ${{ github.event.head_commit.message }}
@@ -121,6 +124,6 @@ jobs:
if [ ! -z "${{ secrets.BOT_TOKEN }}" ]; then
export VERSION=$(git rev-list --count HEAD)
APK=$(find ./app/build/outputs/apk/release -name "*.apk")
pip3 install python-telegram-bot
pip3 install telethon==1.31.1
python3 $GITHUB_WORKSPACE/scripts/ksubot.py $APK
fi

View File

@@ -1,21 +1,21 @@
name: Build SU
on:
push:
branches: [ "main" ]
paths:
branches: [ "main", "ci" ]
paths:
- '.github/workflows/build-su.yml'
- 'userspace/su/**'
- 'scripts/ksubot.py'
pull_request:
branches: [ "main" ]
paths:
paths:
- 'userspace/su/**'
jobs:
build-su:
name: Build userspace su
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Setup need_upload
@@ -28,8 +28,7 @@ jobs:
fi
- uses: nttld/setup-ndk@v1
with:
ndk-version: r25b
local-cache: true
ndk-version: r25c
- name: Build su
working-directory: ./userspace/su
run: ndk-build
@@ -38,14 +37,17 @@ jobs:
with:
name: su
path: ./userspace/su/libs
- name: Setup mutex for uploading
uses: ben-z/gh-action-mutex@v1.0-alpha-7
- name: Bot session cache
if: github.event_name != 'pull_request' && steps.need_upload.outputs.UPLOAD == 'true'
id: bot_session_cache
uses: actions/cache@v3
with:
path: scripts/ksubot.session
key: ${{ runner.os }}-bot-session
- name: Upload to telegram
if: github.event_name != 'pull_request' && steps.need_upload.outputs.UPLOAD == 'true'
env:
CHAT_ID: ${{ secrets.CHAT_ID }}
CACHE_CHAT_ID: ${{ secrets.CACHE_CHAT_ID }}
BOT_TOKEN: ${{ secrets.BOT_TOKEN }}
MESSAGE_THREAD_ID: ${{ secrets.MESSAGE_THREAD_ID }}
COMMIT_MESSAGE: ${{ github.event.head_commit.message }}
@@ -55,7 +57,7 @@ jobs:
run: |
if [ ! -z "${{ secrets.BOT_TOKEN }}" ]; then
export VERSION=$(git rev-list --count HEAD)
pip3 install python-telegram-bot
pip3 install telethon==1.31.1
mv ./userspace/su/libs/arm64-v8a/su su-arm64
mv ./userspace/su/libs/x86_64/su su-x86_64
python3 scripts/ksubot.py su-arm64 su-x86_64

View File

@@ -21,7 +21,7 @@ jobs:
clippy:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- uses: actions/checkout@v4
# cross build failed after Rust 1.68, see https://github.com/cross-rs/cross/issues/1222
- run: rustup default 1.67.0
- uses: Swatinem/rust-cache@v2

View File

@@ -8,30 +8,60 @@ on:
paths:
- '.github/workflows/deploy-website.yml'
- 'website/**'
workflow_dispatch:
# Sets permissions of the GITHUB_TOKEN to allow deployment to GitHub Pages
permissions:
contents: read
pages: write
id-token: write
# Allow only one concurrent deployment, skipping runs queued between the run in-progress and latest queued.
# However, do NOT cancel in-progress runs as we want to allow these production deployments to complete.
concurrency:
group: pages
cancel-in-progress: false
jobs:
deploy:
# Build job
build:
runs-on: ubuntu-latest
defaults:
run:
working-directory: ./website
steps:
- uses: actions/checkout@v3
- name: Checkout
uses: actions/checkout@v4
with:
fetch-depth: 0
- uses: actions/setup-node@v3
fetch-depth: 0 # Not needed if lastUpdated is not enabled
- name: Setup Node
uses: actions/setup-node@v3
with:
node-version: 16
cache: yarn
node-version: 18
cache: yarn # or pnpm / yarn
cache-dependency-path: website/yarn.lock
- run: yarn install --frozen-lockfile
- name: Build
run: yarn docs:build
- name: Deploy
uses: peaceiris/actions-gh-pages@v3
- name: Setup Pages
uses: actions/configure-pages@v3
- name: Install dependencies
run: yarn install --frozen-lockfile
- name: Build with VitePress
run: |
yarn docs:build
touch docs/.vitepress/dist/.nojekyll
- name: Upload artifact
uses: actions/upload-pages-artifact@v2
with:
github_token: ${{ secrets.GITHUB_TOKEN }}
publish_dir: website/docs/.vitepress/dist
cname: kernelsu.org # if wanna deploy to custom domain
path: website/docs/.vitepress/dist
# Deployment job
deploy:
environment:
name: github-pages
url: ${{ steps.deployment.outputs.page_url }}
needs: build
runs-on: ubuntu-latest
name: Deploy
steps:
- name: Deploy to GitHub Pages
id: deployment
uses: actions/deploy-pages@v2

View File

@@ -54,8 +54,6 @@ on:
required: false
CHAT_ID:
required: false
CACHE_CHAT_ID:
required: false
BOT_TOKEN:
required: false
MESSAGE_THREAD_ID:
@@ -73,12 +71,14 @@ jobs:
- name: Maximize build space
uses: easimon/maximize-build-space@master
with:
root-reserve-mb: 8192
temp-reserve-mb: 2048
remove-dotnet: 'true'
remove-android: 'true'
remove-haskell: 'true'
remove-codeql: 'true'
- uses: actions/checkout@v3
- uses: actions/checkout@v4
with:
path: KernelSU
fetch-depth: 0
@@ -108,10 +108,7 @@ jobs:
cat $DEFAULT_MANIFEST_PATH
fi
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
repo --trace sync -c -j$(nproc --all) --no-tags
df -h
- name: Setup KernelSU
@@ -129,14 +126,13 @@ jobs:
DRIVER_MAKEFILE=$GKI_ROOT/common/drivers/Makefile
grep -q "kernelsu" $DRIVER_MAKEFILE || echo "obj-y += kernelsu/" >> $DRIVER_MAKEFILE
echo "[+] Apply KernelSU patches"
cd $GKI_ROOT/common/ && git apply $GITHUB_WORKSPACE/KernelSU/.github/patches/$PATCH_PATH/*.patch
echo "[+] Patch script/setlocalversion"
sed -i 's/-dirty//g' $GKI_ROOT/common/scripts/setlocalversion
cd $GKI_ROOT/common/ && git apply $GITHUB_WORKSPACE/KernelSU/.github/patches/$PATCH_PATH/*.patch || echo "[-] No patch found"
if [ "$IS_DEBUG_KERNEL" = "true" ]; then
echo "[+] Enable debug features for kernel"
echo "ccflags-y += -DCONFIG_KSU_DEBUG" >> $GITHUB_WORKSPACE/KernelSU/kernel/Makefile
fi
repo status
echo "[+] KernelSU setup done."
- name: Symbol magic
@@ -158,6 +154,15 @@ jobs:
max-size: 2G
save: ${{ github.event_name == 'push' && github.ref == 'refs/heads/main' }}
- name: Make working directory clean to avoid dirty
working-directory: android-kernel
run: |
rm common/android/abi_gki_protected_exports_* || echo "No protected exports!"
git config --global user.email "bot@kernelsu.org"
git config --global user.name "KernelSUBot"
cd common/ && git add -A && git commit -a -m "Add KernelSU"
repo status
- name: Build boot.img
working-directory: android-kernel
run: |
@@ -165,12 +170,19 @@ jobs:
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
if [ -e build/build.sh ]; then
CCACHE="/usr/bin/ccache" LTO=thin BUILD_CONFIG=common/build.config.gki.aarch64 build/build.sh
else
tools/bazel run --disk_cache=/home/runner/.cache/bazel --config=fast --config=stamp --lto=thin //common:kernel_aarch64_dist -- --dist_dir=dist
fi
- name: Prepare artifacts
id: prepareArtifacts
run: |
OUTDIR=android-kernel/out/${{ inputs.version }}/dist
if [ ! -e $OUTDIR ]; then
OUTDIR=android-kernel/dist
fi
mkdir output
cp $OUTDIR/Image ./output/
cp $OUTDIR/Image.lz4 ./output/

View File

@@ -13,7 +13,7 @@ jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- uses: actions/checkout@v4
with:
fetch-depth: 0
# cross build failed after Rust 1.68, see https://github.com/cross-rs/cross/issues/1222

View File

@@ -11,17 +11,25 @@ jobs:
secrets: inherit
build-a12-kernel:
uses: ./.github/workflows/build-kernel-a12.yml
secrets: inherit
build-a13-kernel:
uses: ./.github/workflows/build-kernel-a13.yml
secrets: inherit
build-a14-kernel:
uses: ./.github/workflows/build-kernel-a14.yml
secrets: inherit
build-wsa-kernel:
uses: ./.github/workflows/build-kernel-wsa.yml
secrets: inherit
build-arcvm-kernel:
uses: ./.github/workflows/build-kernel-arcvm.yml
secrets: inherit
release:
needs:
needs:
- build-manager
- build-a12-kernel
- build-a13-kernel
- build-a14-kernel
- build-wsa-kernel
- build-arcvm-kernel
runs-on: ubuntu-latest
@@ -66,4 +74,4 @@ jobs:
AnyKernel3-*.zip
boot-images-*/Image-*/*.img.gz
kernel-WSA*.zip
kernel-ARCVM*.zip
kernel-ARCVM*.zip

View File

@@ -21,7 +21,7 @@ jobs:
format:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- uses: actions/checkout@v4
- uses: dtolnay/rust-toolchain@nightly
with:
@@ -30,4 +30,4 @@ jobs:
- uses: LoliGothick/rustfmt-check@master
with:
token: ${{ github.token }}
working-directory: userspace/ksud
working-directory: userspace/ksud

View File

@@ -18,7 +18,7 @@ jobs:
shellcheck:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- uses: actions/checkout@v4
- name: Run ShellCheck
uses: ludeeus/action-shellcheck@2.0.0

View File

@@ -1,46 +0,0 @@
[English](README.md) | [Español](README_ES.md) | [简体中文](README_CN.md) | [繁體中文](README_TW.md) | [日本語](README_JP.md) | [Polski](README_PL.md) | **Portuguese-Brazil** | [Türkçe](README_TR.md) | [Русский](README_RU.md) | [Tiếng Việt](README_VI.md)
# KernelSU
Uma solução raiz baseada em Kernel para dispositivos Android.
## Características
1. `su` baseado em kernel e gerenciamento de acesso root.
2. Sistema modular baseado em overlayfs.
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.
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/)
## 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
- Telegram: [@KernelSU](https://t.me/KernelSU)
## Licença
- Os arquivos no diretório `kernel` são [GPL-2](https://www.gnu.org/licenses/old-licenses/gpl-2.0.en.html)
- Todas as outras partes, exceto o diretório `kernel`, são [GPL-3](https://www.gnu.org/licenses/gpl-3.0.html)
## Créditos
- [kernel-assisted-superuser](https://git.zx2c4.com/kernel-assisted-superuser/about/): a ideia do KernelSU.
- [Magisk](https://github.com/topjohnwu/Magisk): a 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.

View File

@@ -1,45 +0,0 @@
**English** | [Español](README_ES.md) | [简体中文](README_CN.md) | [繁體中文](README_TW.md) | [日本語](README_JP.md) | [Polski](README_PL.md) | [Portuguese-Brazil](README_PT-BR.md) | [Türkçe](README_TR.md) | [Русский](README_RU.md) | [Tiếng Việt](README_VI.md)
# KernelSU
Giải pháp root thông qua thay đổi trên nhân hệ điều hành cho các thiết bị Android.
## Tính năng
1. Hỗ trợ gói thực thi `su` và quản lý quyền root.
2. Hệ thống mô-đun thông qua overlayfs.
3. [Hồ sơ ứng dụng](https://kernelsu.org/guide/app-profile.html): Hạn chế quyền root của ứng dụng.
## Tình trạng tương thích
KernelSU chính thức hỗ trợ các thiết bị Android với nhân GKI 2.0(phiên bản nhân 5.10+), các phiên bản nhân cũ hơn(4.14+) cũng tương thích, nhưng bạn cần phải tự biên dịch.
WSA, ChromeOS và Android dựa trên container(container-based) cũng được hỗ trợ bởi KernelSU.
Hiên tại Giao diện nhị phân của ứng dụng (ABI) được hỗ trợ bao gồm `arm64-v8a``x86_64`
## Sử dụng
- [Hướng dẫn cài đặt](https://kernelsu.org/vi_VN/guide/installation.html)
- [Cách để build?](https://kernelsu.org/vi_VN/guide/how-to-build.html)
- [Website chính thức](https://kernelsu.org/)
## Hỗ trợ dịch
Nếu bạn muốn hỗ trợ dịch KernelSU sang một ngôn ngữ khác hoặc cải thiện bản dịch trước, vui lòng sử dụng [Weblate](https://hosted.weblate.org/engage/kernelsu/).
### Thảo luận
- Telegram: [@KernelSU](https://t.me/KernelSU)
## Giấy phép
- Tất cả các file trong thư mục `kernel` dùng giấy phép [GPL-2](https://www.gnu.org/licenses/old-licenses/gpl-2.0.en.html)
- Tất cả các thành phần khác ngoại trừ thư mục `kernel` dùng giấy phép [GPL-3](https://www.gnu.org/licenses/gpl-3.0.html)
## Lời cảm ơn
- [kernel-assisted-superuser](https://git.zx2c4.com/kernel-assisted-superuser/about/): vì ý tưởng cho KernelSU.
- [Magisk](https://github.com/topjohnwu/Magisk): một công cụ root mạnh mẽ.
- [genuine](https://github.com/brevent/genuine/): vì phương pháp xác thực apk v2.
- [Diamorphine](https://github.com/m0nad/Diamorphine): vì các phương pháp che giấu của rootkit .

7
SECURITY.md Normal file
View File

@@ -0,0 +1,7 @@
# Reporting Security Issues
The KernelSU team and community take security bugs in KernelSU seriously. We appreciate your efforts to responsibly disclose your findings, and will make every effort to acknowledge your contributions.
To report a security issue, please use the GitHub Security Advisory ["Report a Vulnerability"](https://github.com/tiann/KernelSU/security/advisories/new) tab, or you can mailto [weishu](mailto:twsxtd@gmail.com) directly.
The KernelSU team will send a response indicating the next steps in handling your report. After the initial reply to your report, the security team will keep you informed of the progress towards a fix and full announcement, and may ask for additional information or guidance.

View File

@@ -1,5 +1,5 @@
**English** | [Español](README_ES.md) | [简体中文](README_CN.md) | [繁體中文](README_TW.md) | [日本語](README_JP.md) | [Polski](README_PL.md) | [Portuguese-Brazil](README_PT-BR.md) | [Türkçe](README_TR.md) | [Русский](README_RU.md) | [Tiếng Việt](README_VI.md)
**English** | [Español](README_ES.md) | [简体中文](README_CN.md) | [繁體中文](README_TW.md) | [日本語](README_JP.md) | [Polski](README_PL.md) | [Portuguese-Brazil](README_PT-BR.md) | [Türkçe](README_TR.md) | [Русский](README_RU.md) | [Tiếng Việt](README_VI.md) | [Indonesia](README_ID.md) | [עברית](README_iw.md) | [हिंदी](README_IN.md)
# KernelSU
@@ -13,11 +13,11 @@ A Kernel-based root solution for Android devices.
## Compatibility State
KernelSU officially supports Android GKI 2.0 devices(with kernel 5.10+), old kernels(4.14+) are also compatible, but you need to build the kernel yourself.
KernelSU officially supports Android GKI 2.0 devices (kernel 5.10+). Older kernels (4.14+) are also compatible, but the kernel will have to be built manually.
WSA, ChromeOS and container-based Android can also work with KernelSU integrated.
With this, WSA, ChromeOS, and container-based Android are all supported.
And the current supported ABIs are: `arm64-v8a` and `x86_64`
Currently, only `arm64-v8a` and `x86_64` are supported.
## Usage
@@ -27,9 +27,9 @@ And the current supported ABIs are: `arm64-v8a` and `x86_64`
## Translation
To translate KernelSU into your language or improve an existing translation, please use [Weblate](https://hosted.weblate.org/engage/kernelsu/).
To help translate KernelSU or improve existing translations, please use [Weblate](https://hosted.weblate.org/engage/kernelsu/). PR of Manager's translation is no longer accepted, because it will conflict with Weblate.
### Discussion
## Discussion
- Telegram: [@KernelSU](https://t.me/KernelSU)

View File

@@ -1,4 +1,4 @@
[English](README.md) | [Español](README_ES.md) | **简体中文** | [繁體中文](README_TW.md) | [日本語](README_JP.md) | [Polski](README_PL.md) | [Portuguese-Brazil](README_PT-BR.md) | [Türkçe](README_TR.md) | [Русский](README_RU.md) | [Tiếng Việt](README_VI.md)
[English](README.md) | [Español](README_ES.md) | **简体中文** | [繁體中文](README_TW.md) | [日本語](README_JP.md) | [Polski](README_PL.md) | [Portuguese-Brazil](README_PT-BR.md) | [Türkçe](README_TR.md) | [Русский](README_RU.md) | [Tiếng Việt](README_VI.md) | [Indonesia](README_ID.md) | [עברית](README_iw.md) | [हिंदी](README_IN.md)
# KernelSU

View File

@@ -1,4 +1,4 @@
[ 🇬🇧 English](README.md) | 🇪🇸 **Español** | [🇨🇳 简体中文](README_CN.md) | [🇹🇼 繁體中文](README_TW.md) | [ 🇯🇵 日本語](README_JP.md) | [🇵🇱 Polski](README_PL.md) | [🇧🇷 Portuguese-Brazil](README_PT-BR.md) | [🇹🇷 Türkçe](README_TR.md) | [🇷🇺Русский](README_RU.md) | [🇻🇳Tiếng Việt](README_VI.md)
[ 🇬🇧 English](README.md) | 🇪🇸 **Español** | [🇨🇳 简体中文](README_CN.md) | [🇹🇼 繁體中文](README_TW.md) | [ 🇯🇵 日本語](README_JP.md) | [🇵🇱 Polski](README_PL.md) | [🇧🇷 Portuguese-Brazil](README_PT-BR.md) | [🇹🇷 Türkçe](README_TR.md) | [🇷🇺Русский](README_RU.md) | [🇻🇳Tiếng Việt](README_VI.md) | [ɪᴅ indonesia](README_ID.md) | [עברית](README_iw.md) | [🇮🇳हिंदी](README_IN.md)
<div style="display: flex; align-items: center;">
<img src="https://kernelsu.org/logo.png" style="width: 96px;" alt="">

45
docs/README_ID.md Normal file
View File

@@ -0,0 +1,45 @@
[English](README.md) | [Español](README_ES.md) | [简体中文](README_CN.md) | [繁體中文](README_TW.md) | [日本語](README_JP.md) | [Polski](README_PL.md) | [Portugis-Brasil](README_PT-BR.md) | [Türkçe](README_TR.md) | [Русский](README_RU.md) | [Tiếng Việt](README_VI.md) | **Indonesia** | [עברית](README_iw.md) | [हिंदी](README_IN.md)
# KernelSU
Solusi root berbasis Kernel untuk perangkat Android.
## Fitur
1. Manajemen akses root dan `su` berbasis kernel.
2. Sistem modul berdasarkan overlayfs.
3. [Profil Aplikasi](https://kernelsu.org/guide/app-profile.html): Kunci daya root di dalam sangkar.
## Status Kompatibilitas
KernelSU secara resmi mendukung perangkat Android GKI 2.0 (dengan kernel 5.10+), kernel lama (4.14+) juga kompatibel, tetapi Anda perlu membuat kernel sendiri.
WSA, ChromeOS, dan Android berbasis wadah juga dapat bekerja dengan KernelSU terintegrasi.
Dan ABI yang didukung saat ini adalah: `arm64-v8a` dan `x86_64`
## Penggunaan
- [Petunjuk Instalasi](https://kernelsu.org/guide/installation.html)
- [Bagaimana cara membuat?](https://kernelsu.org/guide/how-to-build.html)
- [Situs Web Resmi](https://kernelsu.org/)
## Terjemahan
Untuk menerjemahkan KernelSU ke dalam bahasa Anda atau menyempurnakan terjemahan yang sudah ada, harap gunakan [Weblat](https://hosted.weblate.org/engage/kernelsu/).
## Diskusi
- Telegram: [@KernelSU](https://t.me/KernelSU)
## Lisensi
- File di bawah direktori `kernel` adalah [GPL-2](https://www.gnu.org/licenses/old-licenses/gpl-2.0.en.html)
- Semua bagian lain kecuali direktori `kernel` adalah [GPL-3](https://www.gnu.org/licenses/gpl-3.0.html)
## Kredit
- [kernel-assisted-superuser](https://git.zx2c4.com/kernel-assisted-superuser/about/): ide KernelSU.
- [Magisk](https://github.com/topjohnwu/Magisk): alat root yang ampuh.
- [genuine](https://github.com/brevent/genuine/): validasi tanda tangan apk v2.
- [Diamorphine](https://github.com/m0nad/Diamorphine): beberapa keterampilan rootkit.

51
docs/README_IN.md Normal file
View File

@@ -0,0 +1,51 @@
[English](README.md) | [Español](README_ES.md) | [简体中文](README_CN.md) | [繁體中文](README_TW.md) | [日本語](README_JP.md) | [Polski](README_PL.md) | [Portuguese-Brazil](README_PT-BR.md) | [Türkçe](README_TR.md) | [Русский](README_RU.md) | [Tiếng Việt](README_VI.md) | [Indonesia](README_ID.md) | [עברית](README_iw.md) | **हिंदी**
<div style="display: flex; align-items: center;">
<img src="https://kernelsu.org/logo.png" style="width: 96px;" alt="">
<div style="margin-left: 20px;">
<span style="font-size: large; "><b>KernelSU</b></span>
<br>
<span style="font-size: medium; "><i>Android उपकरणों के लिए कर्नेल-आधारित रूट समाधान।</i></span>
</div>
</div>
## विशेषताएँ
1. कर्नेल-आधारित `su` और रूट एक्सेस प्रबंधन।
2. Overlayfs पर आधारित मॉड्यूल प्रणाली।
3. [App Profile](https://kernelsu.org/guide/app-profile.html): Root शक्ति को पिंजरे में बंद कर दो।
## अनुकूलता अवस्था
KernelSU आधिकारिक तौर पर Android GKI 2.0 डिवाइस (कर्नेल 5.10+) का समर्थन करता है। पुराने कर्नेल (4.14+) भी संगत हैं, लेकिन कर्नेल को मैन्युअल रूप से बनाना होगा।
इसके साथ, WSA, ChromeOS और कंटेनर-आधारित Android सभी समर्थित हैं।
वर्तमान में, केवल `arm64-v8a` और `x86_64` समर्थित हैं।
## प्रयोग
- [स्थापना निर्देश](https://kernelsu.org/guide/installation.html)
- [कैसे बनाना है ?](https://kernelsu.org/guide/how-to-build.html)
- [आधिकारिक वेबसाइट](https://kernelsu.org/)
## अनुवाद करना
KernelSU का अनुवाद करने या मौजूदा अनुवादों को बेहतर बनाने में सहायता के लिए, कृपया इसका उपयोग करें [Weblate](https://hosted.weblate.org/engage/kernelsu/).
## बहस
- Telegram: [@KernelSU](https://t.me/KernelSU)
## लाइसेंस
- `Kernel` निर्देशिका के अंतर्गत फ़ाइलें हैं [GPL-2](https://www.gnu.org/licenses/old-licenses/gpl-2.0.en.html)
- `Kernel` निर्देशिका को छोड़कर अन्य सभी भाग हैं [GPL-3](https://www.gnu.org/licenses/gpl-3.0.html)
## आभार सूची
- [kernel-assisted-superuser](https://git.zx2c4.com/kernel-assisted-superuser/about/): KernelSU विचार।
- [Magisk](https://github.com/topjohnwu/Magisk): शक्तिशाली root उपकरण।
- [genuine](https://github.com/brevent/genuine/): apk v2 हस्ताक्षर सत्यापन।
- [Diamorphine](https://github.com/m0nad/Diamorphine): कुछ रूटकिट कौशल।

View File

@@ -1,4 +1,4 @@
[English](README.md) | [Español](README_ES.md) | [简体中文](README_CN.md) | [繁體中文](README_TW.md) | **日本語** | [Polski](README_PL.md) | [Portuguese-Brazil](README_PT-BR.md) | [Türkçe](README_TR.md) | [Русский](README_RU.md) | | [Tiếng Việt](README_VI.md)
[English](README.md) | [Español](README_ES.md) | [简体中文](README_CN.md) | [繁體中文](README_TW.md) | **日本語** | [Polski](README_PL.md) | [Portuguese-Brazil](README_PT-BR.md) | [Türkçe](README_TR.md) | [Русский](README_RU.md) | | [Tiếng Việt](README_VI.md) | [Indonesia](README_ID.md) | [עברית](README_iw.md) | [हिंदी](README_IN.md)
# KernelSU
@@ -27,7 +27,7 @@ WSA 、ChromeOS とコンテナ上で動作する Android でも KernelSU を統
## 翻訳
KernelSU をあなたの言語に翻訳するか、既存の翻訳を改善するには、[Weblate](https://hosted.weblate.org/engage/kernelsu/) を使用してください。
KernelSU をあなたの言語に翻訳するか、既存の翻訳を改善するには、[Weblate](https://hosted.weblate.org/engage/kernelsu/) を使用してください。Manager翻訳した PR は、Weblate と競合するため受け入れられなくなりました。
## ディスカッション

View File

@@ -1,4 +1,4 @@
[English](README.md) | [Español](README_ES.md) | [简体中文](README_CN.md) | [繁體中文](README_TW.md) | [日本語](README_JP.md) | **Polski** | [Portuguese-Brazil](README_PT-BR.md) | [Türkçe](README_TR.md) | [Русский](README_RU.md) | [Tiếng Việt](README_VI.md)
[English](README.md) | [Español](README_ES.md) | [简体中文](README_CN.md) | [繁體中文](README_TW.md) | [日本語](README_JP.md) | **Polski** | [Portuguese-Brazil](README_PT-BR.md) | [Türkçe](README_TR.md) | [Русский](README_RU.md) | [Tiếng Việt](README_VI.md) | [Indonesia](README_ID.md) | [עברית](README_iw.md) | [हिंदी](README_IN.md)
# KernelSU
@@ -25,7 +25,7 @@ Aktualnie obsługiwane ABI to : `arm64-v8a` i `x86_64`.
[Jak skompilować?](https://kernelsu.org/guide/how-to-build.html)
### Dyskusja
## Dyskusja
- Telegram: [@KernelSU](https://t.me/KernelSU)

46
docs/README_PT-BR.md Normal file
View File

@@ -0,0 +1,46 @@
[English](README.md) | [Español](README_ES.md) | [简体中文](README_CN.md) | [繁體中文](README_TW.md) | [日本語](README_JP.md) | [Polski](README_PL.md) | **Português (Brasil)** | [Türkçe](README_TR.md) | [Русский](README_RU.md) | [Tiếng Việt](README_VI.md) | [Indonesia](README_ID.md) | [עברית](README_iw.md) | [हिंदी](README_IN.md)
# KernelSU
Uma solução root baseada em kernel para dispositivos Android.
## Características
1. `su` e gerenciamento de acesso root baseado em kernel.
2. Sistema modular baseado em overlayfs.
3. [Perfil do Aplicativo](https://kernelsu.org/pt_BR/guide/app-profile.html): Tranque o poder root em uma gaiola.
## Estado de Compatibilidade
O KernelSU oferece suporte oficial a dispositivos Android GKI 2.0 (kernel 5.10+). Kernels mais antigos (4.14+) também são compatíveis, mas o kernel terá que ser construído manualmente.
Com isso, WSA, ChromeOS e Android baseado em contêiner são todos suportados.
Atualmente, apenas `arm64-v8a` e `x86_64` são suportados.
## Uso
- [Instalação](https://kernelsu.org/pt_BR/guide/installation.html)
- [Como construir o KernelSU?](https://kernelsu.org/pt_BR/guide/how-to-build.html)
- [Site oficial](https://kernelsu.org/pt_BR/)
## Tradução
Para contribuir com a tradução do KernelSU ou aprimorar traduções existentes, por favor, utilize o [Weblate](https://hosted.weblate.org/engage/kernelsu/). PR para a tradução do Gerenciador não são mais aceitos, pois podem entrar em conflito com o Weblate.
## Discussão
- Telegram: [@KernelSU](https://t.me/KernelSU)
## Licença
- Os arquivos no diretório `kernel` são [GPL-2](https://www.gnu.org/licenses/old-licenses/gpl-2.0.en.html)
- Todas as outras partes, exceto o diretório `kernel` são [GPL-3](https://www.gnu.org/licenses/gpl-3.0.html)
## Créditos
- [kernel-assisted-superuser](https://git.zx2c4.com/kernel-assisted-superuser/about/): a ideia do KernelSU.
- [Magisk](https://github.com/topjohnwu/Magisk): a poderosa ferramenta root.
- [genuine](https://github.com/brevent/genuine/): validação de assinatura apk v2.
- [Diamorphine](https://github.com/m0nad/Diamorphine): algumas habilidades de rootkit.

View File

@@ -1,4 +1,4 @@
[English](README.md) | [Español](README_ES.md) | [简体中文](README_CN.md) | [繁體中文](README_TW.md) | [日本語](README_JP.md) | [Polski](README_PL.md) | [Portuguese-Brazil](README_PT-BR.md) | [Türkçe](README_TR.md) | **Русский** | [Tiếng Việt](README_VI.md)
[English](README.md) | [Español](README_ES.md) | [简体中文](README_CN.md) | [繁體中文](README_TW.md) | [日本語](README_JP.md) | [Polski](README_PL.md) | [Portuguese-Brazil](README_PT-BR.md) | [Türkçe](README_TR.md) | **Русский** | [Tiếng Việt](README_VI.md) | [Indonesia](README_ID.md) | [עברית](README_iw.md) | [हिंदी](README_IN.md)
# KernelSU

View File

@@ -1,4 +1,4 @@
[English](README.md) | [Español](README_ES.md) | [简体中文](README_CN.md) | [繁體中文](README_TW.md) | [日本語](README_JP.md) | [Polski](README_PL.md) | [Portuguese-Brazil](README_PT-BR.md) | **Türkçe** | [Русский](README_RU.md) | [Tiếng Việt](README_VI.md)
[English](README.md) | [Español](README_ES.md) | [简体中文](README_CN.md) | [繁體中文](README_TW.md) | [日本語](README_JP.md) | [Polski](README_PL.md) | [Portuguese-Brazil](README_PT-BR.md) | **Türkçe** | [Русский](README_RU.md) | [Tiếng Việt](README_VI.md) | [Indonesia](README_ID.md) | [עברית](README_iw.md) | [हिंदी](README_IN.md)
# KernelSU
@@ -28,7 +28,7 @@ Ve desteklenen mevcut ABI'ler : `arm64-v8a` ve `x86_64`
KernelSU'yu kendi dilinize çevirmek veya varolan bir çeviriyi geliştirmek istiyorsanız, lütfen [Weblate](https://hosted.weblate.org/engage/kernelsu/)'i kullanın.
### Tartışma
## Tartışma
- Telegram: [@KernelSU](https://t.me/KernelSU)

View File

@@ -1,4 +1,4 @@
[English](README.md) | [Español](README_ES.md) | [简体中文](README_CN.md) | **繁體中文** | [日本語](README_JP.md) | [Polski](README_PL.md) | [Portuguese-Brazil](README_PT-BR.md) | [Türkçe](README_TR.md) | [Русский](README_RU.md) | [Tiếng Việt](README_VI.md)
[English](README.md) | [Español](README_ES.md) | [简体中文](README_CN.md) | **繁體中文** | [日本語](README_JP.md) | [Polski](README_PL.md) | [Portuguese-Brazil](README_PT-BR.md) | [Türkçe](README_TR.md) | [Русский](README_RU.md) | [Tiếng Việt](README_VI.md) | [Indonesia](README_ID.md) | [עברית](README_iw.md) | [हिंदी](README_IN.md)
# KernelSU

45
docs/README_VI.md Normal file
View File

@@ -0,0 +1,45 @@
[English](README.md) | [Español](README_ES.md) | [简体中文](README_CN.md) | [繁體中文](README_TW.md) | [日本語](README_JP.md) | [Polski](README_PL.md) | [Portuguese-Brazil](README_PT-BR.md) | [Türkçe](README_TR.md) | [Русский](README_RU.md) | **Tiếng Việt** | [Indonesia](README_ID.md) | [עברית](README_iw.md) | [हिंदी](README_IN.md)
# KernelSU
Giải pháp root thông qua thay đổi trên Kernel hệ điều hành cho các thiết bị Android.
## Tính năng
1. Hỗ trợ gói thực thi `su` và quản lý quyền root.
2. Hệ thống mô-đun thông qua overlayfs.
3. [App Profile](https://kernelsu.org/guide/app-profile.html): Hạn chế quyền root của ứng dụng.
## Tình trạng tương thích
KernelSU chính thức hỗ trợ các thiết bị Android với kernel GKI 2.0 (phiên bản kernel 5.10+), các phiên bản kernel cũ hơn (4.14+) cũng tương thích, nhưng bạn cần phải tự biên dịch.
WSA, ChromeOS và Android dựa trên container(container-based) cũng được hỗ trợ bởi KernelSU.
Hiên tại Giao diện nhị phân của ứng dụng (ABI) được hỗ trợ bao gồm `arm64-v8a``x86_64`
## Sử dụng
- [Hướng dẫn cài đặt](https://kernelsu.org/vi_VN/guide/installation.html)
- [Cách để build?](https://kernelsu.org/vi_VN/guide/how-to-build.html)
- [Website Chính Thức](https://kernelsu.org/vi_VN/)
## Hỗ trợ dịch
Nếu bạn muốn hỗ trợ dịch KernelSU sang một ngôn ngữ khác hoặc cải thiện các bản dịch trước, vui lòng sử dụng [Weblate](https://hosted.weblate.org/engage/kernelsu/).
## Thảo luận
- Telegram: [@KernelSU](https://t.me/KernelSU)
## Giấy phép
- Tất cả các file trong thư mục `kernel` dùng giấy phép [GPL-2](https://www.gnu.org/licenses/old-licenses/gpl-2.0.en.html)
- Tất cả các thành phần khác ngoại trừ thư mục `kernel` dùng giấy phép [GPL-3](https://www.gnu.org/licenses/gpl-3.0.html)
## Lời cảm ơn
- [kernel-assisted-superuser](https://git.zx2c4.com/kernel-assisted-superuser/about/): ý tưởng cho KernelSU.
- [Magisk](https://github.com/topjohnwu/Magisk): công cụ root mạnh mẽ.
- [genuine](https://github.com/brevent/genuine/): phương pháp xác thực apk v2.
- [Diamorphine](https://github.com/m0nad/Diamorphine): các phương pháp ẩn của rootkit .

45
docs/README_iw.md Normal file
View File

@@ -0,0 +1,45 @@
[English](README.md) | [Español](README_ES.md) | [简体中文](README_CN.md) | [繁體中文](README_TW.md) | [日本語](README_JP.md) | [Polski](README_PL.md) | [Portuguese-Brazil](README_PT-BR.md) | [Türkçe](README_TR.md) | [Русский](README_RU.md) | [Tiếng Việt](README_VI.md) | [Indonesia](README_ID.md) | **עברית** | [हिंदी](README_IN.md)
# KernelSU
פתרון לניהול root מבוסס על Kernel עבור מכשירי Android.
## תכונות
1. ניהול root ו־`su` מבוססים על Kernel.
2. מערכת מודולים מבוססת overlayfs.
3. [פרופיל אפליקציה](https://kernelsu.org/guide/app-profile.html): נעילת גישת root בכלוב.
## מצב תאימות
KernelSU תומך במכשירי Android GKI 2.0 (kernel 5.10+) באופן רשמי. לליבות ישנות (4.14+) יש גם תאימות, אך יידרש לבנות את הליבה באופן ידני.
באמצעות זה, תמיכה זמינה גם ל-WSA, ChromeOS ומכשירי Android המבוססים על מיכלים.
כרגע, רק `arm64-v8a` ו־`x86_64` נתמכים.
## שימוש
- [הוראות התקנה](https://kernelsu.org/guide/installation.html)
- [איך לבנות?](https://kernelsu.org/guide/how-to-build.html)
- [האתר רשמי](https://kernelsu.org/)
## תרגום
כדי לעזור בתרגום של KernelSU או לשפר תרגומים קיימים, יש להשתמש ב-[Weblate](https://hosted.weblate.org/engage/kernelsu/).
## דיון
- Telegram: [@KernelSU](https://t.me/KernelSU)
## רשיון
- קבצים תחת הספרייה `kernel` מוגנים על פי [GPL-2](https://www.gnu.org/licenses/old-licenses/gpl-2.0.en.html)
- כל החלקים האחרים, למעט הספרייה `kernel`, מוגנים על פי [GPL-3](https://www.gnu.org/licenses/gpl-3.0.html)
## קרדיטים
- [kernel-assisted-superuser](https://git.zx2c4.com/kernel-assisted-superuser/about/): הרעיון של KernelSU.
- [Magisk](https://github.com/topjohnwu/Magisk): הכלי הסופר חזק לניהול root.
- [genuine](https://github.com/brevent/genuine/): אימות חתימת apk v2.
- [Diamorphine](https://github.com/m0nad/Diamorphine): כמה יכולות רוט.

View File

@@ -2,7 +2,7 @@ menu "KernelSU"
config KSU
tristate "KernelSU function support"
select OVERLAY_FS
depends on OVERLAY_FS
default y
help
Enable kernel-level root privileges on Android System.

View File

@@ -29,13 +29,18 @@ KSU_EXPECTED_SIZE := 0x033b
endif
ifndef KSU_EXPECTED_HASH
KSU_EXPECTED_HASH := 0xb0b91415
KSU_EXPECTED_HASH := c371061b19d8c7d7d6133c6a9bafe198fa944e50c1b31c9d8daa8d7f1fc2d2d6
endif
ifdef KSU_MANAGER_PACKAGE
ccflags-y += -DKSU_MANAGER_PACKAGE=\"$(KSU_MANAGER_PACKAGE)\"
$(info -- KernelSU Manager package name: $(KSU_MANAGER_PACKAGE))
endif
$(info -- KernelSU Manager signature size: $(KSU_EXPECTED_SIZE))
$(info -- KernelSU Manager signature hash: $(KSU_EXPECTED_HASH))
ccflags-y += -DEXPECTED_SIZE=$(KSU_EXPECTED_SIZE)
ccflags-y += -DEXPECTED_HASH=$(KSU_EXPECTED_HASH)
ccflags-y += -DEXPECTED_HASH=\"$(KSU_EXPECTED_HASH)\"
ccflags-y += -Wno-implicit-function-declaration -Wno-strict-prototypes -Wno-int-conversion -Wno-gcc-compat
ccflags-y += -Wno-declaration-after-statement

View File

@@ -97,7 +97,7 @@ void ksu_show_allow_list(void)
{
struct perm_data *p = NULL;
struct list_head *pos = NULL;
pr_info("ksu_show_allow_list");
pr_info("ksu_show_allow_list\n");
list_for_each (pos, &allow_list) {
p = list_entry(pos, struct perm_data, list);
pr_info("uid :%d, allow: %d\n", p->profile.current_uid,
@@ -441,7 +441,7 @@ exit:
filp_close(fp, 0);
}
void ksu_prune_allowlist(bool (*is_uid_exist)(uid_t, void *), void *data)
void ksu_prune_allowlist(bool (*is_uid_valid)(uid_t, char *, void *), void *data)
{
struct perm_data *np = NULL;
struct perm_data *n = NULL;
@@ -451,11 +451,12 @@ void ksu_prune_allowlist(bool (*is_uid_exist)(uid_t, void *), void *data)
mutex_lock(&allowlist_mutex);
list_for_each_entry_safe (np, n, &allow_list, list) {
uid_t uid = np->profile.current_uid;
char *package = np->profile.key;
// we use this uid for special cases, don't prune it!
bool is_preserved_uid = uid == KSU_APP_PROFILE_PRESERVE_UID;
if (!is_preserved_uid && !is_uid_exist(uid, data)) {
if (!is_preserved_uid && !is_uid_valid(uid, package, data)) {
modified = true;
pr_info("prune uid: %d\n", uid);
pr_info("prune uid: %d, package: %s\n", uid, package);
list_del(&np->list);
allow_list_bitmap[uid / BITS_PER_BYTE] &= ~(1 << (uid % BITS_PER_BYTE));
remove_uid_from_arr(uid);

View File

@@ -17,7 +17,7 @@ bool __ksu_is_allow_uid(uid_t uid);
bool ksu_get_allow_list(int *array, int *length, bool allow);
void ksu_prune_allowlist(bool (*is_uid_exist)(uid_t, void *), void *data);
void ksu_prune_allowlist(bool (*is_uid_exist)(uid_t, char *, void *), void *data);
bool ksu_get_app_profile(struct app_profile *);
bool ksu_set_app_profile(struct app_profile *, bool persist);

View File

@@ -1,12 +1,177 @@
#include "linux/err.h"
#include "linux/fs.h"
#include "linux/gfp.h"
#include "linux/kernel.h"
#include "linux/moduleparam.h"
#include "apk_sign.h"
#include "klog.h" // IWYU pragma: keep
#include "kernel_compat.h"
#include "crypto/hash.h"
#include "linux/slab.h"
#include "linux/version.h"
static __always_inline int
check_v2_signature(char *path, unsigned expected_size, unsigned expected_hash)
#if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 11, 0)
#include "crypto/sha2.h"
#else
#include "crypto/sha.h"
#endif
struct sdesc {
struct shash_desc shash;
char ctx[];
};
static struct sdesc *init_sdesc(struct crypto_shash *alg)
{
struct sdesc *sdesc;
int size;
size = sizeof(struct shash_desc) + crypto_shash_descsize(alg);
sdesc = kmalloc(size, GFP_KERNEL);
if (!sdesc)
return ERR_PTR(-ENOMEM);
sdesc->shash.tfm = alg;
return sdesc;
}
static int calc_hash(struct crypto_shash *alg, const unsigned char *data,
unsigned int datalen, unsigned char *digest)
{
struct sdesc *sdesc;
int ret;
sdesc = init_sdesc(alg);
if (IS_ERR(sdesc)) {
pr_info("can't alloc sdesc\n");
return PTR_ERR(sdesc);
}
ret = crypto_shash_digest(&sdesc->shash, data, datalen, digest);
kfree(sdesc);
return ret;
}
static int ksu_sha256(const unsigned char *data, unsigned int datalen,
unsigned char *digest)
{
struct crypto_shash *alg;
char *hash_alg_name = "sha256";
int ret;
alg = crypto_alloc_shash(hash_alg_name, 0, 0);
if (IS_ERR(alg)) {
pr_info("can't alloc alg %s\n", hash_alg_name);
return PTR_ERR(alg);
}
ret = calc_hash(alg, data, datalen, digest);
crypto_free_shash(alg);
return ret;
}
static bool check_block(struct file *fp, u32 *size4, loff_t *pos, u32 *offset,
unsigned expected_size, const char *expected_sha256)
{
ksu_kernel_read_compat(fp, size4, 0x4, pos); // signer-sequence length
ksu_kernel_read_compat(fp, size4, 0x4, pos); // signer length
ksu_kernel_read_compat(fp, size4, 0x4, pos); // signed data length
*offset += 0x4 * 3;
ksu_kernel_read_compat(fp, size4, 0x4, pos); // digests-sequence length
*pos += *size4;
*offset += 0x4 + *size4;
ksu_kernel_read_compat(fp, size4, 0x4, pos); // certificates length
ksu_kernel_read_compat(fp, size4, 0x4, pos); // certificate length
*offset += 0x4 * 2;
if (*size4 == expected_size) {
*offset += *size4;
#define CERT_MAX_LENGTH 1024
char cert[CERT_MAX_LENGTH];
if (*size4 > CERT_MAX_LENGTH) {
pr_info("cert length overlimit\n");
return false;
}
ksu_kernel_read_compat(fp, cert, *size4, pos);
unsigned char digest[SHA256_DIGEST_SIZE];
if (IS_ERR(ksu_sha256(cert, *size4, digest))) {
pr_info("sha256 error\n");
return false;
}
char hash_str[SHA256_DIGEST_SIZE * 2 + 1];
hash_str[SHA256_DIGEST_SIZE * 2] = '\0';
bin2hex(hash_str, digest, SHA256_DIGEST_SIZE);
pr_info("sha256: %s, expected: %s\n", hash_str,
expected_sha256);
if (strcmp(expected_sha256, hash_str) == 0) {
return true;
}
}
return false;
}
struct zip_entry_header {
uint32_t signature;
uint16_t version;
uint16_t flags;
uint16_t compression;
uint16_t mod_time;
uint16_t mod_date;
uint32_t crc32;
uint32_t compressed_size;
uint32_t uncompressed_size;
uint16_t file_name_length;
uint16_t extra_field_length;
} __attribute__((packed));
// This is a necessary but not sufficient condition, but it is enough for us
static bool has_v1_signature_file(struct file *fp)
{
struct zip_entry_header header;
const char MANIFEST[] = "META-INF/MANIFEST.MF";
loff_t pos = 0;
while (ksu_kernel_read_compat(fp, &header,
sizeof(struct zip_entry_header), &pos) ==
sizeof(struct zip_entry_header)) {
if (header.signature != 0x04034b50) {
// ZIP magic: 'PK'
return false;
}
// Read the entry file name
if (header.file_name_length == sizeof(MANIFEST) - 1) {
char fileName[sizeof(MANIFEST)];
ksu_kernel_read_compat(fp, fileName,
header.file_name_length, &pos);
fileName[header.file_name_length] = '\0';
// Check if the entry matches META-INF/MANIFEST.MF
if (strncmp(MANIFEST, fileName, sizeof(MANIFEST) - 1) ==
0) {
return true;
}
} else {
// Skip the entry file name
pos += header.file_name_length;
}
// Skip to the next entry
pos += header.extra_field_length + header.compressed_size;
}
return false;
}
static __always_inline bool check_v2_signature(char *path,
unsigned expected_size,
const char *expected_sha256)
{
unsigned char buffer[0x11] = { 0 };
u32 size4;
@@ -14,18 +179,21 @@ check_v2_signature(char *path, unsigned expected_size, unsigned expected_hash)
loff_t pos;
int sign = -1;
bool v2_signing_valid = false;
int v2_signing_blocks = 0;
bool v3_signing_exist = false;
bool v3_1_signing_exist = false;
int i;
struct file *fp = ksu_filp_open_compat(path, O_RDONLY, 0);
if (IS_ERR(fp)) {
pr_err("open %s error.", path);
pr_err("open %s error.\n", path);
return PTR_ERR(fp);
}
// disable inotify for this file
fp->f_mode |= FMODE_NONOTIFY;
sign = 1;
// https://en.wikipedia.org/wiki/Zip_(file_format)#End_of_central_directory_record_(EOCD)
for (i = 0;; ++i) {
unsigned short n;
@@ -64,73 +232,58 @@ check_v2_signature(char *path, unsigned expected_size, unsigned expected_hash)
for (;;) {
uint32_t id;
uint32_t offset;
ksu_kernel_read_compat(fp, &size8, 0x8, &pos); // sequence length
ksu_kernel_read_compat(fp, &size8, 0x8,
&pos); // sequence length
if (size8 == size_of_block) {
break;
}
ksu_kernel_read_compat(fp, &id, 0x4, &pos); // id
offset = 4;
pr_info("id: 0x%08x\n", id);
if ((id ^ 0xdeadbeefu) == 0xafa439f5u ||
(id ^ 0xdeadbeefu) == 0x2efed62f) {
ksu_kernel_read_compat(fp, &size4, 0x4,
&pos); // signer-sequence length
ksu_kernel_read_compat(fp, &size4, 0x4, &pos); // signer length
ksu_kernel_read_compat(fp, &size4, 0x4,
&pos); // signed data length
offset += 0x4 * 3;
ksu_kernel_read_compat(fp, &size4, 0x4,
&pos); // digests-sequence length
pos += size4;
offset += 0x4 + size4;
ksu_kernel_read_compat(fp, &size4, 0x4,
&pos); // certificates length
ksu_kernel_read_compat(fp, &size4, 0x4,
&pos); // certificate length
offset += 0x4 * 2;
#if 0
int hash = 1;
signed char c;
for (i = 0; i < size4; ++i) {
ksu_kernel_read_compat(fp, &c, 0x1, &pos);
hash = 31 * hash + c;
}
offset += size4;
pr_info(" size: 0x%04x, hash: 0x%08x\n", size4, ((unsigned) hash) ^ 0x14131211u);
#else
if (size4 == expected_size) {
int hash = 1;
signed char c;
for (i = 0; i < size4; ++i) {
ksu_kernel_read_compat(fp, &c, 0x1, &pos);
hash = 31 * hash + c;
}
offset += size4;
if ((((unsigned)hash) ^ 0x14131211u) ==
expected_hash) {
sign = 0;
break;
}
}
// don't try again.
break;
#endif
if (id == 0x7109871au) {
v2_signing_blocks++;
v2_signing_valid =
check_block(fp, &size4, &pos, &offset,
expected_size, expected_sha256);
} else if (id == 0xf05368c0u) {
// http://aospxref.com/android-14.0.0_r2/xref/frameworks/base/core/java/android/util/apk/ApkSignatureSchemeV3Verifier.java#73
v3_signing_exist = true;
} else if (id == 0x1b93ad61u) {
// http://aospxref.com/android-14.0.0_r2/xref/frameworks/base/core/java/android/util/apk/ApkSignatureSchemeV3Verifier.java#74
v3_1_signing_exist = true;
}
pos += (size8 - offset);
}
if (v2_signing_blocks != 1) {
pr_err("Unexpected v2 signature count: %d\n",
v2_signing_blocks);
v2_signing_valid = false;
}
if (v2_signing_valid) {
int has_v1_signing = has_v1_signature_file(fp);
if (has_v1_signing) {
pr_err("Unexpected v1 signature scheme found!\n");
filp_close(fp, 0);
return false;
}
}
clean:
filp_close(fp, 0);
return sign;
if (v3_signing_exist || v3_1_signing_exist) {
pr_err("Unexpected v3 signature scheme found!\n");
return false;
}
return v2_signing_valid;
}
#ifdef CONFIG_KSU_DEBUG
unsigned ksu_expected_size = EXPECTED_SIZE;
unsigned ksu_expected_hash = EXPECTED_HASH;
const char *ksu_expected_hash = EXPECTED_HASH;
#include "manager.h"
@@ -138,15 +291,16 @@ static int set_expected_size(const char *val, const struct kernel_param *kp)
{
int rv = param_set_uint(val, kp);
ksu_invalidate_manager_uid();
pr_info("ksu_expected_size set to %x", ksu_expected_size);
pr_info("ksu_expected_size set to %x\n", ksu_expected_size);
return rv;
}
static int set_expected_hash(const char *val, const struct kernel_param *kp)
{
int rv = param_set_uint(val, kp);
pr_info("set_expected_hash: %s\n", val);
int rv = param_set_charp(val, kp);
ksu_invalidate_manager_uid();
pr_info("ksu_expected_hash set to %x", ksu_expected_hash);
pr_info("ksu_expected_hash set to %s\n", ksu_expected_hash);
return rv;
}
@@ -157,7 +311,8 @@ static struct kernel_param_ops expected_size_ops = {
static struct kernel_param_ops expected_hash_ops = {
.set = set_expected_hash,
.get = param_get_uint,
.get = param_get_charp,
.free = param_free_charp,
};
module_param_cb(ksu_expected_size, &expected_size_ops, &ksu_expected_size,
@@ -165,14 +320,14 @@ module_param_cb(ksu_expected_size, &expected_size_ops, &ksu_expected_size,
module_param_cb(ksu_expected_hash, &expected_hash_ops, &ksu_expected_hash,
S_IRUSR | S_IWUSR);
int is_manager_apk(char *path)
bool is_manager_apk(char *path)
{
return check_v2_signature(path, ksu_expected_size, ksu_expected_hash);
}
#else
int is_manager_apk(char *path)
bool is_manager_apk(char *path)
{
return check_v2_signature(path, EXPECTED_SIZE, EXPECTED_HASH);
}

View File

@@ -1,7 +1,8 @@
#ifndef __KSU_H_APK_V2_SIGN
#define __KSU_H_APK_V2_SIGN
// return 0 if signature match
int is_manager_apk(char *path);
#include "linux/types.h"
bool is_manager_apk(char *path);
#endif

View File

@@ -3,6 +3,7 @@
#include "linux/dcache.h"
#include "linux/err.h"
#include "linux/init.h"
#include "linux/init_task.h"
#include "linux/kernel.h"
#include "linux/kprobes.h"
#include "linux/lsm_hooks.h"
@@ -122,8 +123,11 @@ void escape_to_root(void)
BUILD_BUG_ON(sizeof(profile->capabilities.effective) !=
sizeof(kernel_cap_t));
// capabilities
memcpy(&cred->cap_effective, &profile->capabilities.effective,
// setup capabilities
// we need CAP_DAC_READ_SEARCH becuase `/data/adb/ksud` is not accessible for non root process
// we add it here but don't add it to cap_inhertiable, it would be dropped automaticly after exec!
u64 cap_for_ksud = profile->capabilities.effective | CAP_DAC_READ_SEARCH;
memcpy(&cred->cap_effective, &cap_for_ksud,
sizeof(cred->cap_effective));
memcpy(&cred->cap_inheritable, &profile->capabilities.effective,
sizeof(cred->cap_inheritable));
@@ -184,7 +188,7 @@ int ksu_handle_rename(struct dentry *old_dentry, struct dentry *new_dentry)
if (strcmp(buf, "/system/packages.list")) {
return 0;
}
pr_info("renameat: %s -> %s, new path: %s", old_dentry->d_iname,
pr_info("renameat: %s -> %s, new path: %s\n", old_dentry->d_iname,
new_dentry->d_iname, buf);
update_uid();
@@ -232,7 +236,8 @@ 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 (ksu_strncpy_from_user_nofault(param, arg3, sizeof(param)) == -EFAULT) {
if (ksu_strncpy_from_user_nofault(param, arg3, sizeof(param)) ==
-EFAULT) {
#ifdef CONFIG_KSU_DEBUG
pr_err("become_manager: copy param err\n");
#endif
@@ -284,7 +289,7 @@ int ksu_handle_prctl(int option, unsigned long arg2, unsigned long arg3,
if (arg2 == CMD_GRANT_ROOT) {
if (is_allow_su()) {
pr_info("allow root for: %d\n", current_uid());
pr_info("allow root for: %d\n", current_uid().val);
escape_to_root();
if (copy_to_user(result, &reply_ok, sizeof(reply_ok))) {
pr_err("grant_root: prctl reply error\n");
@@ -298,7 +303,7 @@ int ksu_handle_prctl(int option, unsigned long arg2, unsigned long arg3,
if (is_manager() || 0 == current_uid().val) {
u32 version = KERNEL_SU_VERSION;
if (copy_to_user(arg3, &version, sizeof(version))) {
pr_err("prctl reply error, cmd: %d\n", arg2);
pr_err("prctl reply error, cmd: %lu\n", arg2);
}
}
return 0;
@@ -313,7 +318,7 @@ int ksu_handle_prctl(int option, unsigned long arg2, unsigned long arg3,
static bool post_fs_data_lock = false;
if (!post_fs_data_lock) {
post_fs_data_lock = true;
pr_info("post-fs-data triggered");
pr_info("post-fs-data triggered\n");
on_post_fs_data();
}
break;
@@ -322,7 +327,7 @@ int ksu_handle_prctl(int option, unsigned long arg2, unsigned long arg3,
static bool boot_complete_lock = false;
if (!boot_complete_lock) {
boot_complete_lock = true;
pr_info("boot_complete triggered");
pr_info("boot_complete triggered\n");
}
break;
}
@@ -372,7 +377,7 @@ int ksu_handle_prctl(int option, unsigned long arg2, unsigned long arg3,
sizeof(u32) * array_length)) {
if (copy_to_user(result, &reply_ok,
sizeof(reply_ok))) {
pr_err("prctl reply error, cmd: %d\n",
pr_err("prctl reply error, cmd: %lu\n",
arg2);
}
} else {
@@ -392,16 +397,16 @@ int ksu_handle_prctl(int option, unsigned long arg2, unsigned long arg3,
} else if (arg2 == CMD_UID_SHOULD_UMOUNT) {
allow = ksu_uid_should_umount(target_uid);
} else {
pr_err("unknown cmd: %d\n", arg2);
pr_err("unknown cmd: %lu\n", arg2);
}
if (!copy_to_user(arg4, &allow, sizeof(allow))) {
if (copy_to_user(result, &reply_ok,
sizeof(reply_ok))) {
pr_err("prctl reply error, cmd: %d\n",
pr_err("prctl reply error, cmd: %lu\n",
arg2);
}
} else {
pr_err("prctl copy err, cmd: %d\n", arg2);
pr_err("prctl copy err, cmd: %lu\n", arg2);
}
}
return 0;
@@ -428,7 +433,7 @@ int ksu_handle_prctl(int option, unsigned long arg2, unsigned long arg3,
return 0;
}
if (copy_to_user(result, &reply_ok, sizeof(reply_ok))) {
pr_err("prctl reply error, cmd: %d\n", arg2);
pr_err("prctl reply error, cmd: %lu\n", arg2);
}
}
return 0;
@@ -444,7 +449,7 @@ int ksu_handle_prctl(int option, unsigned long arg2, unsigned long arg3,
// todo: validate the params
if (ksu_set_app_profile(&profile, true)) {
if (copy_to_user(result, &reply_ok, sizeof(reply_ok))) {
pr_err("prctl reply error, cmd: %d\n", arg2);
pr_err("prctl reply error, cmd: %lu\n", arg2);
}
}
return 0;
@@ -482,7 +487,19 @@ static bool should_umount(struct path *path)
return false;
}
static void try_umount(const char *mnt)
static void ksu_umount_mnt(struct path *path, int flags)
{
#if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 9, 0)
int err = path_umount(path, flags);
if (err) {
pr_info("umount %s failed: %d\n", path->dentry->d_iname, err);
}
#else
// TODO: umount for non GKI kernel
#endif
}
static void try_umount(const char *mnt, bool check_mnt, int flags)
{
struct path path;
int err = kern_path(mnt, 0, &path);
@@ -490,17 +507,17 @@ static void try_umount(const char *mnt)
return;
}
// we are only interest in some specific mounts
if (!should_umount(&path)) {
if (path.dentry != path.mnt->mnt_root) {
// it is not root mountpoint, maybe umounted by others already.
return;
}
#if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 9, 0)
err = path_umount(&path, 0);
if (err) {
pr_info("umount %s failed: %d\n", mnt, err);
// we are only interest in some specific mounts
if (check_mnt && !should_umount(&path)) {
return;
}
#endif
ksu_umount_mnt(&path, flags);
}
int ksu_handle_setuid(struct cred *new, const struct cred *old)
@@ -517,10 +534,8 @@ int ksu_handle_setuid(struct cred *new, const struct cred *old)
return 0;
}
// todo: check old process's selinux context, if it is not zygote, ignore it!
if (!is_appuid(new_uid)) {
// pr_info("handle setuid ignore non application uid: %d\n", new_uid.val);
if (!is_appuid(new_uid) || is_isolated_uid(new_uid.val)) {
// pr_info("handle setuid ignore non application or isolated uid: %d\n", new_uid.val);
return 0;
}
@@ -537,14 +552,23 @@ int ksu_handle_setuid(struct cred *new, const struct cred *old)
#endif
}
// check old process's selinux context, if it is not zygote, ignore it!
// because some su apps may setuid to untrusted_app but they are in global mount namespace
// when we umount for such process, that is a disaster!
bool is_zygote_child = is_zygote(old->security);
if (!is_zygote_child) {
pr_info("handle umount ignore non zygote child: %d\n", current->pid);
return 0;
}
// umount the target mnt
pr_info("handle umount for uid: %d\n", new_uid.val);
pr_info("handle umount for uid: %d, pid: %d\n", new_uid.val, current->pid);
// fixme: use `collect_mounts` and `iterate_mount` to iterate all mountpoint and
// filter the mountpoint whose target is `/data/adb`
try_umount("/system");
try_umount("/vendor");
try_umount("/product");
try_umount("/system", true, 0);
try_umount("/vendor", true, 0);
try_umount("/product", true, 0);
try_umount("/data/adb/modules", false, MNT_DETACH);
return 0;
}
@@ -641,7 +665,7 @@ static int ksu_key_permission(key_ref_t key_ref, const struct cred *cred,
return 0;
}
init_session_keyring = cred->session_keyring;
pr_info("kernel_compat: got init_session_keyring");
pr_info("kernel_compat: got init_session_keyring\n");
return 0;
}
#endif

View File

@@ -59,11 +59,11 @@ void on_post_fs_data(void)
{
static bool done = false;
if (done) {
pr_info("on_post_fs_data already done");
pr_info("on_post_fs_data already done\n");
return;
}
done = true;
pr_info("on_post_fs_data!");
pr_info("on_post_fs_data!\n");
ksu_load_allow_list();
// sanity check, this may influence the performance
stop_input_hook();
@@ -138,9 +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
// IMPORTANT NOTE: the call from execve_handler_pre WON'T provided correct value for envp and flags in GKI version
int ksu_handle_execveat_ksud(int *fd, struct filename **filename_ptr,
struct user_arg_ptr *argv, void *__never_use_envp, int *__never_use_flags)
struct user_arg_ptr *argv, struct user_arg_ptr *envp, int *flags)
{
#ifndef CONFIG_KPROBES
if (!ksu_execveat_hook) {
@@ -151,7 +151,11 @@ int ksu_handle_execveat_ksud(int *fd, struct filename **filename_ptr,
static const char app_process[] = "/system/bin/app_process";
static bool first_app_process = true;
/* This applies to versions Android 10+ */
static const char system_bin_init[] = "/system/bin/init";
/* This applies to versions between Android 6 ~ 9 */
static const char old_system_init[] = "/init";
static bool init_second_stage_executed = false;
if (!filename_ptr)
@@ -162,8 +166,8 @@ int ksu_handle_execveat_ksud(int *fd, struct filename **filename_ptr,
return 0;
}
if (unlikely(!memcmp(filename->name, system_bin_init,
sizeof(system_bin_init) - 1))) {
if (unlikely(!memcmp(filename->name, system_bin_init,
sizeof(system_bin_init) - 1) && argv)) {
// /system/bin/init executed
int argc = count(*argv, MAX_ARG_STRINGS);
pr_info("/system/bin/init argc: %d\n", argc);
@@ -171,8 +175,8 @@ int ksu_handle_execveat_ksud(int *fd, struct filename **filename_ptr,
const char __user *p = get_user_arg_ptr(*argv, 1);
if (p && !IS_ERR(p)) {
char first_arg[16];
ksu_strncpy_from_user_nofault(first_arg, p, sizeof(first_arg));
pr_info("first arg: %s\n", first_arg);
ksu_strncpy_from_user_nofault(first_arg, p, sizeof(first_arg));
pr_info("/system/bin/init first arg: %s\n", first_arg);
if (!strcmp(first_arg, "second_stage")) {
pr_info("/system/bin/init second_stage executed\n");
apply_kernelsu_rules();
@@ -183,10 +187,63 @@ int ksu_handle_execveat_ksud(int *fd, struct filename **filename_ptr,
pr_err("/system/bin/init parse args err!\n");
}
}
} else if (unlikely(!memcmp(filename->name, old_system_init,
sizeof(old_system_init) - 1) && argv)) {
// /init executed
int argc = count(*argv, MAX_ARG_STRINGS);
pr_info("/init argc: %d\n", argc);
if (argc > 1 && !init_second_stage_executed) {
/* This applies to versions between Android 6 ~ 7 */
const char __user *p = get_user_arg_ptr(*argv, 1);
if (p && !IS_ERR(p)) {
char first_arg[16];
ksu_strncpy_from_user_nofault(first_arg, p, sizeof(first_arg));
pr_info("/init first arg: %s\n", first_arg);
if (!strcmp(first_arg, "--second-stage")) {
pr_info("/init second_stage executed\n");
apply_kernelsu_rules();
init_second_stage_executed = true;
ksu_android_ns_fs_check();
}
} else {
pr_err("/init parse args err!\n");
}
} else if (argc == 1 && !init_second_stage_executed && envp) {
/* This applies to versions between Android 8 ~ 9 */
int envc = count(*envp, MAX_ARG_STRINGS);
if (envc > 0) {
int n;
for (n = 1; n <= envc; n++) {
const char __user *p = get_user_arg_ptr(*envp, n);
if (!p || IS_ERR(p)) {
continue;
}
char env[256];
// Reading environment variable strings from user space
if (ksu_strncpy_from_user_nofault(env, p, sizeof(env)) < 0)
continue;
// Parsing environment variable names and values
char *env_name = env;
char *env_value = strchr(env, '=');
if (env_value == NULL)
continue;
// Replace equal sign with string terminator
*env_value = '\0';
env_value++;
// Check if the environment variable name and value are matching
if (!strcmp(env_name, "INIT_SECOND_STAGE") && (!strcmp(env_value, "1") || !strcmp(env_value, "true"))) {
pr_info("/init second_stage executed\n");
apply_kernelsu_rules();
init_second_stage_executed = true;
ksu_android_ns_fs_check();
}
}
}
}
}
if (unlikely(first_app_process &&
!memcmp(filename->name, app_process, sizeof(app_process) - 1))) {
!memcmp(filename->name, app_process, sizeof(app_process) - 1))) {
first_app_process = false;
pr_info("exec app_process, /data prepared, second_stage: %d\n", init_second_stage_executed);
on_post_fs_data(); // we keep this for old ksud
@@ -207,7 +264,7 @@ static ssize_t read_proxy(struct file *file, char __user *buf, size_t count,
bool first_read = file->f_pos == 0;
ssize_t ret = orig_read(file, buf, count, pos);
if (first_read) {
pr_info("read_proxy append %ld + %ld", ret, read_count_append);
pr_info("read_proxy append %ld + %ld\n", ret, read_count_append);
ret += read_count_append;
}
return ret;
@@ -218,7 +275,7 @@ static ssize_t read_iter_proxy(struct kiocb *iocb, struct iov_iter *to)
bool first_read = iocb->ki_pos == 0;
ssize_t ret = orig_read_iter(iocb, to);
if (first_read) {
pr_info("read_iter_proxy append %ld + %ld", ret,
pr_info("read_iter_proxy append %ld + %ld\n", ret,
read_count_append);
ret += read_count_append;
}
@@ -283,17 +340,17 @@ int ksu_handle_vfs_read(struct file **file_ptr, char __user **buf_ptr,
size_t rc_count = strlen(KERNEL_SU_RC);
pr_info("vfs_read: %s, comm: %s, count: %d, rc_count: %d\n", dpath,
pr_info("vfs_read: %s, comm: %s, count: %zu, rc_count: %zu\n", dpath,
current->comm, count, rc_count);
if (count < rc_count) {
pr_err("count: %d < rc_count: %d", count, rc_count);
pr_err("count: %zu < rc_count: %zu\n", count, rc_count);
return 0;
}
size_t ret = copy_to_user(buf, KERNEL_SU_RC, rc_count);
if (ret) {
pr_err("copy ksud.rc failed: %d\n", ret);
pr_err("copy ksud.rc failed: %zu\n", ret);
return 0;
}
@@ -457,6 +514,7 @@ static void stop_vfs_read_hook()
pr_info("unregister vfs_read kprobe: %d!\n", ret);
#else
ksu_vfs_read_hook = false;
pr_info("stop vfs_read_hook\n");
#endif
}
@@ -467,6 +525,7 @@ static void stop_execve_hook()
pr_info("unregister execve kprobe: %d!\n", ret);
#else
ksu_execveat_hook = false;
pr_info("stop execve_hook\n");
#endif
}
@@ -482,6 +541,7 @@ static void stop_input_hook()
pr_info("unregister input kprobe: %d!\n", ret);
#else
ksu_input_hook = false;
pr_info("stop input_hook\n");
#endif
}

View File

@@ -24,6 +24,15 @@ bool become_manager(char *pkg)
char *buf;
bool result = false;
#ifdef KSU_MANAGER_PACKAGE
// pkg is `/<real package>`
if (strncmp(pkg + 1, KSU_MANAGER_PACKAGE,
sizeof(KSU_MANAGER_PACKAGE)) != 0) {
pr_info("manager package is inconsistent with kernel build: %s\n",
KSU_MANAGER_PACKAGE);
return false;
}
#endif
// must be zygote's direct child, otherwise any app can fork a new process and
// open manager's apk
if (task_uid(current->real_parent).val != 0) {
@@ -52,7 +61,7 @@ bool become_manager(char *pkg)
continue;
}
// we have found the apk!
pr_info("found apk: %s", cwd);
pr_info("found apk: %s\n", cwd);
char *pkg_index = strstr(cwd, pkg);
if (!pkg_index) {
pr_info("apk path not match package name!\n");
@@ -70,7 +79,7 @@ bool become_manager(char *pkg)
pr_info("invalid pkg: %s\n", pkg);
continue;
}
if (is_manager_apk(cwd) == 0) {
if (is_manager_apk(cwd)) {
// check passed
uid_t uid = current_uid().val;
pr_info("manager uid: %d\n", uid);
@@ -80,7 +89,7 @@ bool become_manager(char *pkg)
result = true;
goto clean;
} else {
pr_info("manager signature invalid!");
pr_info("manager signature invalid!\n");
}
break;

View File

@@ -39,7 +39,7 @@ static struct policydb *get_policydb(void)
void apply_kernelsu_rules()
{
if (!getenforce()) {
pr_info("SELinux permissive or disabled, apply rules!");
pr_info("SELinux permissive or disabled, apply rules!\n");
}
rcu_read_lock();
@@ -63,6 +63,7 @@ void apply_kernelsu_rules()
ksu_allowxperm(db, KERNEL_SU_DOMAIN, ALL, "blk_file", ALL);
ksu_allowxperm(db, KERNEL_SU_DOMAIN, ALL, "fifo_file", ALL);
ksu_allowxperm(db, KERNEL_SU_DOMAIN, ALL, "chr_file", ALL);
ksu_allowxperm(db, KERNEL_SU_DOMAIN, ALL, "file", ALL);
}
// we need to save allowlist in /data/adb/ksu
@@ -84,6 +85,8 @@ void apply_kernelsu_rules()
// our ksud triggered by init
ksu_allow(db, "init", "adb_data_file", "file", ALL);
ksu_allow(db, "init", KERNEL_SU_DOMAIN, ALL, ALL);
// we need to umount modules in zygote
ksu_allow(db, "zygote", "adb_data_file", "dir", "search");
// copied from Magisk rules
// suRights
@@ -249,7 +252,7 @@ int handle_sepolicy(unsigned long arg3, void __user *arg4)
} else if (subcmd == 4) {
success = ksu_dontaudit(db, s, t, c, p);
} else {
pr_err("sepol: unknown subcmd: %d", subcmd);
pr_err("sepol: unknown subcmd: %d\n", subcmd);
}
ret = success ? 0 : -1;
@@ -294,7 +297,7 @@ int handle_sepolicy(unsigned long arg3, void __user *arg4)
} else if (subcmd == 3) {
success = ksu_dontauditxperm(db, s, t, c, perm_set);
} else {
pr_err("sepol: unknown subcmd: %d", subcmd);
pr_err("sepol: unknown subcmd: %d\n", subcmd);
}
ret = success ? 0 : -1;
} else if (cmd == CMD_TYPE_STATE) {
@@ -311,7 +314,7 @@ int handle_sepolicy(unsigned long arg3, void __user *arg4)
} else if (subcmd == 2) {
success = ksu_enforce(db, src);
} else {
pr_err("sepol: unknown subcmd: %d", subcmd);
pr_err("sepol: unknown subcmd: %d\n", subcmd);
}
if (success)
ret = 0;
@@ -426,7 +429,7 @@ int handle_sepolicy(unsigned long arg3, void __user *arg4)
success = ksu_type_member(db, src, tgt, cls,
default_type);
} else {
pr_err("sepol: unknown subcmd: %d", subcmd);
pr_err("sepol: unknown subcmd: %d\n", subcmd);
}
if (success)
ret = 0;

View File

@@ -27,7 +27,8 @@ static int transive_to_domain(const char *domain)
error = security_secctx_to_secid(domain, strlen(domain), &sid);
if (error) {
pr_info("security_secctx_to_secid %s -> sid: %d, error: %d\n", domain, sid, error);
pr_info("security_secctx_to_secid %s -> sid: %d, error: %d\n",
domain, sid, error);
}
if (!error) {
if (!ksu_sid)
@@ -44,7 +45,7 @@ static int transive_to_domain(const char *domain)
void setup_selinux(const char *domain)
{
if (transive_to_domain(domain)) {
pr_err("transive domain failed.");
pr_err("transive domain failed.\n");
return;
}
@@ -107,3 +108,18 @@ bool is_ksu_domain()
{
return ksu_sid && current_sid() == ksu_sid;
}
bool is_zygote(void *sec)
{
struct task_security_struct *tsec = (struct task_security_struct *)sec;
if (!tsec) {
return false;
}
char *domain;
u32 seclen;
int err = security_secid_to_secctx(tsec->sid, &domain, &seclen);
if (err) {
return false;
}
return strncmp("u:r:zygote:s0", domain, seclen) == 0;
}

View File

@@ -16,6 +16,8 @@ bool getenforce();
bool is_ksu_domain();
bool is_zygote(void *cred);
void apply_kernelsu_rules();
#endif

View File

@@ -592,14 +592,14 @@ static bool add_filename_trans(struct policydb *db, const char *s,
trans = (struct filename_trans_datum *)kcalloc(sizeof(*trans),
1, GFP_ATOMIC);
if (!trans) {
pr_err("add_filename_trans: Failed to alloc datum");
pr_err("add_filename_trans: Failed to alloc datum\n");
return false;
}
struct filename_trans *new_key =
(struct filename_trans *)kmalloc(sizeof(*new_key),
GFP_ATOMIC);
if (!new_key) {
pr_err("add_filename_trans: Failed to alloc new_key");
pr_err("add_filename_trans: Failed to alloc new_key\n");
return false;
}
*new_key = key;

View File

@@ -48,7 +48,7 @@ int ksu_handle_faccessat(int *dfd, const char __user **filename_user, int *mode,
return 0;
}
char path[sizeof(su)];
char path[sizeof(su) + 1];
memset(path, 0, sizeof(path));
ksu_strncpy_from_user_nofault(path, *filename_user, sizeof(path));
@@ -73,14 +73,28 @@ int ksu_handle_stat(int *dfd, const char __user **filename_user, int *flags)
return 0;
}
char path[sizeof(su)];
char path[sizeof(su) + 1];
memset(path, 0, sizeof(path));
#if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 18, 0)
// it becomes a `struct filename *` after 5.18
// https://elixir.bootlin.com/linux/v5.18/source/fs/stat.c#L216
const char sh[] = SH_PATH;
struct filename *filename = * ((struct filename **) filename_user);
if (IS_ERR(filename)) {
return 0;
}
if (likely(memcmp(filename->name, su, sizeof(su))))
return 0;
pr_info("vfs_statx su->sh!\n");
memcpy((void *)filename->name, sh, sizeof(sh));
#else
ksu_strncpy_from_user_nofault(path, *filename_user, sizeof(path));
if (unlikely(!memcmp(path, su, sizeof(su)))) {
pr_info("newfstatat su->sh!\n");
*filename_user = sh_user_path();
}
#endif
return 0;
}

View File

@@ -20,16 +20,18 @@ static struct work_struct ksu_update_uid_work;
struct uid_data {
struct list_head list;
u32 uid;
char package[KSU_MAX_PACKAGE_NAME];
};
static bool is_uid_exist(uid_t uid, void *data)
static bool is_uid_exist(uid_t uid, char *package, void *data)
{
struct list_head *list = (struct list_head *)data;
struct uid_data *np;
bool exist = false;
list_for_each_entry (np, list, list) {
if (np->uid == uid % 100000) {
if (np->uid == uid % 100000 &&
strncmp(np->package, package, KSU_MAX_PACKAGE_NAME) == 0) {
exist = true;
break;
}
@@ -39,10 +41,11 @@ static bool is_uid_exist(uid_t uid, void *data)
static void do_update_uid(struct work_struct *work)
{
struct file *fp = ksu_filp_open_compat(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",
" failed: %ld\n",
PTR_ERR(fp));
return;
}
@@ -73,10 +76,10 @@ static void do_update_uid(struct work_struct *work)
char *tmp = buf;
const char *delim = " ";
strsep(&tmp, delim); // skip package
char *package = strsep(&tmp, delim);
char *uid = strsep(&tmp, delim);
if (!uid) {
pr_err("update_uid: uid is NULL!\n");
if (!uid || !package) {
pr_err("update_uid: package or uid is NULL!\n");
continue;
}
@@ -86,6 +89,7 @@ static void do_update_uid(struct work_struct *work)
continue;
}
data->uid = res;
strncpy(data->package, package, KSU_MAX_PACKAGE_NAME);
list_add_tail(&data->list, &uid_list);
// reset line start
line_start = pos;

View File

@@ -111,4 +111,6 @@ dependencies {
implementation(libs.sheet.compose.dialogs.core)
implementation(libs.sheet.compose.dialogs.list)
implementation(libs.sheet.compose.dialogs.input)
implementation(libs.markdown)
}

View File

@@ -156,13 +156,6 @@ Java_me_weishu_kernelsu_Natives_getAppProfile(JNIEnv *env, jobject, jstring pkg,
env->SetBooleanField(obj, allowSuField, false);
env->SetBooleanField(obj, nonRootUseDefaultField, true);
jobject capList = env->GetObjectField(obj, capabilitiesField);
int DEFAULT_CAPS[] = {CAP_DAC_READ_SEARCH};
for (auto i: DEFAULT_CAPS) {
addIntToList(env, capList, i);
}
return obj;
}

View File

@@ -18,6 +18,11 @@ object Natives {
// 11071: Fix the issue of failing to set a custom SELinux type.
const val MINIMAL_SUPPORTED_KERNEL = 11071
const val KERNEL_SU_DOMAIN = "u:r:su:s0"
const val ROOT_UID = 0
const val ROOT_GID = 0
init {
System.loadLibrary("kernelsu")
}
@@ -45,7 +50,6 @@ object Natives {
external fun setAppProfile(profile: Profile?): Boolean
private const val NON_ROOT_DEFAULT_PROFILE_KEY = "$"
private const val ROOT_DEFAULT_PROFILE_KEY = "#"
private const val NOBODY_UID = 9999
fun setDefaultUmountModules(umountModules: Boolean): Boolean {
@@ -85,21 +89,21 @@ object Natives {
// these are used for root profile
val rootUseDefault: Boolean = true,
val rootTemplate: String? = null,
val uid: Int = 0,
val gid: Int = 0,
val uid: Int = ROOT_UID,
val gid: Int = ROOT_GID,
val groups: List<Int> = mutableListOf(),
val capabilities: List<Int> = mutableListOf(),
val context: String = "u:r:su:s0",
val namespace: Int = Namespace.Inherited.ordinal,
val context: String = KERNEL_SU_DOMAIN,
val namespace: Int = Namespace.INHERITED.ordinal,
val nonRootUseDefault: Boolean = true,
val umountModules: Boolean = true,
var rules: String = "", // this field is save in ksud!!
) : Parcelable {
enum class Namespace {
Inherited,
Global,
Individual,
INHERITED,
GLOBAL,
INDIVIDUAL,
}
constructor() : this("")

View File

@@ -1,6 +1,7 @@
package me.weishu.kernelsu.profile
/**
* https://cs.android.com/android/platform/superproject/main/+/main:system/core/libcutils/include/private/android_filesystem_config.h
* @author weishu
* @date 2023/6/3.
*/
@@ -60,17 +61,55 @@ enum class Groups(val gid: Int, val display: String, val desc: String) {
FIREWALL(1048, "firewall", "firewall process"),
TRUNKS(1049, "trunks", "trunksd process"),
NVRAM(1050, "nvram", "nvram daemon"),
DNS_TETHER(1051, "dns_tether", "dns_tether device"),
DNS_TETHER_RESERVED(1052, "dns_tether_reserved", "Reserved range for dns_tether"),
WEBVIEW_ZYGOTE(1053, "webview_zygote", "zygote process"),
WEBVIEW_USER(1054, "webview_user", "webview chromium user"),
ETHERNET(1055, "ethernet", "Ethernet"),
TOMBSTONED(1056, "tombstoned", "tombstoned process"),
GRAPHICS_RW(1057, "graphics_rw", "graphics devices"),
DNS(1051, "dns", "DNS resolution daemon (system: netd)"),
DNS_TETHER(1052, "dns_tether", "DNS resolution daemon (tether: dnsmasq)"),
WEBVIEW_ZYGOTE(1053, "webview_zygote", "WebView zygote process"),
VEHICLE_NETWORK(1054, "vehicle_network", "Vehicle network service"),
MEDIA_AUDIO(1055, "media_audio", "GID for audio files on internal media storage"),
MEDIA_VIDEO(1056, "media_video", "GID for video files on internal media storage"),
MEDIA_IMAGE(1057, "media_image", "GID for image files on internal media storage"),
TOMBSTONED(1058, "tombstoned", "tombstoned user"),
MEDIA_OBB(1059, "media_obb", "GID for OBB files on internal media storage"),
ESE(1060, "ese", "embedded secure element (eSE) subsystem"),
OTA_UPDATE(1061, "ota_update", "resource tracking UID for OTA updates"),
AUTOMOTIVE_EVS(1062, "automotive_evs", "Automotive rear and surround view system"),
LOWPAN(1063, "lowpan", "LoWPAN subsystem"),
HSM(1064, "lowpan", "hardware security module subsystem"),
RESERVED_DISK(1065, "reserved_disk", "GID that has access to reserved disk space"),
STATSD(1066, "statsd", "statsd daemon"),
INCIDENTD(1067, "incidentd", "incidentd daemon"),
SECURE_ELEMENT(1068, "secure_element", "secure element subsystem"),
LMKD(1069, "lmkd", "low memory killer daemon"),
LLKD(1070, "llkd", "live lock daemon"),
IORAPD(1071, "iorapd", "input/output readahead and pin daemon"),
GPU_SERVICE(1072, "gpu_service", "GPU service daemon"),
NETWORK_STACK(1073, "network_stack", "network stack service"),
GSID(1074, "GSID", "GSI service daemon"),
FSVERITY_CERT(1075, "fsverity_cert", "fs-verity key ownership in keystore"),
CREDSTORE(1076, "credstore", "identity credential manager service"),
EXTERNAL_STORAGE(1077, "external_storage", "Full external storage access including USB OTG volumes"),
EXT_DATA_RW(1078, "ext_data_rw", "GID for app-private data directories on external storage"),
EXT_OBB_RW(1079, "ext_obb_rw", "GID for OBB directories on external storage"),
CONTEXT_HUB(1080, "context_hub", "GID for access to the Context Hub"),
VIRTUALIZATIONSERVICE(1081, "virtualizationservice", "VirtualizationService daemon"),
ARTD(1082, "artd", "ART Service daemon"),
UWB(1083, "uwb", "UWB subsystem"),
THREAD_NETWORK(1084, "thread_network", "Thread Network subsystem"),
DICED(1085, "diced", "Android's DICE daemon"),
DMESGD(1086, "dmesgd", "dmesg parsing daemon for kernel report collection"),
JC_WEAVER(1087, "jc_weaver", "Javacard Weaver HAL - to manage omapi ARA rules"),
JC_STRONGBOX(1088, "jc_strongbox", "Javacard Strongbox HAL - to manage omapi ARA rules"),
JC_IDENTITYCRED(1089, "jc_identitycred", "Javacard Identity Cred HAL - to manage omapi ARA rules"),
SDK_SANDBOX(1090, "sdk_sandbox", "SDK sandbox virtual UID"),
SECURITY_LOG_WRITER(1091, "security_log_writer", "write to security log"),
PRNG_SEEDER(1092, "prng_seeder", "PRNG seeder daemon"),
SHELL(2000, "shell", "adb and debug shell user"),
CACHE(2001, "cache", "cache access"),
DIAG(2002, "diag", "diagnostics"),
DIAG(2002, "diag", "access to diagnostic resources"),
/* The 3000 series are intended for use as supplemental group id's only.
* They indicate special Android capabilities that the kernel is aware of. */
NET_BT_ADMIN(3001, "net_bt_admin", "bluetooth: create any socket"),
NET_BT(3002, "net_bt", "bluetooth: create sco, rfcomm or l2cap sockets"),
INET(3003, "inet", "can create AF_INET and AF_INET6 sockets"),
@@ -79,7 +118,11 @@ enum class Groups(val gid: Int, val display: String, val desc: String) {
NET_BW_STATS(3006, "net_bw_stats", "read bandwidth statistics"),
NET_BW_ACCT(3007, "net_bw_acct", "change bandwidth statistics accounting"),
NET_BT_STACK(3008, "net_bt_stack", "access to various bluetooth management functions"),
QCOM_DIAG(3009, "qcom_diag", "allow msm specific diag commands"),
READPROC(3009, "readproc", "Allow /proc read access"),
WAKELOCK(3010, "wakelock", "Allow system wakelock read/write access"),
UHID(3011, "uhid", "Allow read/write to /dev/uhid node"),
READTRACEFS(3012, "readtracefs", "Allow tracefs read"),
EVERYBODY(9997, "everybody", "Shared external storage read/write"),
MISC(9998, "misc", "Access to misc storage"),
NOBODY(9999, "nobody", "Reserved"),

View File

@@ -1,20 +1,33 @@
package me.weishu.kernelsu.ui.component
import android.graphics.text.LineBreaker
import android.text.Layout
import android.text.method.LinkMovementMethod
import android.view.ViewGroup
import android.widget.TextView
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.size
import androidx.compose.foundation.layout.wrapContentHeight
import androidx.compose.foundation.shape.RoundedCornerShape
import androidx.compose.material3.AlertDialog
import androidx.compose.material3.CircularProgressIndicator
import androidx.compose.material3.ExperimentalMaterial3Api
import androidx.compose.material3.LocalContentColor
import androidx.compose.material3.Surface
import androidx.compose.material3.Text
import androidx.compose.material3.TextButton
import androidx.compose.runtime.*
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.toArgb
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.unit.dp
import androidx.compose.ui.viewinterop.AndroidView
import androidx.compose.ui.window.Dialog
import androidx.compose.ui.window.DialogProperties
import io.noties.markwon.Markwon
import io.noties.markwon.utils.NoCopySpannableFactory
import kotlinx.coroutines.CancellableContinuation
import kotlinx.coroutines.coroutineScope
import kotlinx.coroutines.launch
@@ -36,6 +49,7 @@ interface PromptDialogVisuals : DialogVisuals {
interface ConfirmDialogVisuals : PromptDialogVisuals {
val confirm: String?
val dismiss: String?
val isMarkdown: Boolean
}
@@ -68,15 +82,15 @@ class DialogHostState {
private object LoadingDialogVisualsImpl : LoadingDialogVisuals
private data class PromptDialogVisualsImpl(
override val title: String,
override val content: String
override val title: String, override val content: String
) : PromptDialogVisuals
private data class ConfirmDialogVisualsImpl(
override val title: String,
override val content: String,
override val confirm: String?,
override val dismiss: String?
override val dismiss: String?,
override val isMarkdown: Boolean,
) : ConfirmDialogVisuals
private data class LoadingDialogDataImpl(
@@ -121,8 +135,7 @@ class DialogHostState {
mutex.withLock {
suspendCancellableCoroutine { continuation ->
currentDialogData = LoadingDialogDataImpl(
visuals = LoadingDialogVisualsImpl,
continuation = continuation
visuals = LoadingDialogVisualsImpl, continuation = continuation
)
}
}
@@ -161,13 +174,14 @@ class DialogHostState {
suspend fun showConfirm(
title: String,
content: String,
markdown: Boolean = false,
confirm: String? = null,
dismiss: String? = null
): ConfirmResult = mutex.withLock {
try {
return@withLock suspendCancellableCoroutine { continuation ->
currentDialogData = ConfirmDialogDataImpl(
visuals = ConfirmDialogVisualsImpl(title, content, confirm, dismiss),
visuals = ConfirmDialogVisualsImpl(title, content, confirm, dismiss, markdown),
continuation = continuation
)
}
@@ -201,9 +215,7 @@ fun LoadingDialog(
}
Dialog(onDismissRequest = {}, properties = dialogProperties) {
Surface(
modifier = Modifier
.size(100.dp),
shape = RoundedCornerShape(8.dp)
modifier = Modifier.size(100.dp), shape = RoundedCornerShape(8.dp)
) {
Box(
contentAlignment = Alignment.Center,
@@ -240,11 +252,13 @@ fun PromptDialog(
)
}
@OptIn(ExperimentalMaterial3Api::class)
@Composable
fun ConfirmDialog(state: DialogHostState = LocalDialogHost.current) {
val confirmDialogData = state.currentDialogData.tryInto<ConfirmDialogData>() ?: return
val visuals = confirmDialogData.visuals
AlertDialog(
onDismissRequest = {
confirmDialogData.dismiss()
@@ -253,7 +267,11 @@ fun ConfirmDialog(state: DialogHostState = LocalDialogHost.current) {
Text(text = visuals.title)
},
text = {
Text(text = visuals.content)
if (visuals.isMarkdown) {
MarkdownContent(content = visuals.content)
} else {
Text(text = visuals.content)
}
},
confirmButton = {
TextButton(onClick = { confirmDialogData.confirm() }) {
@@ -266,4 +284,28 @@ fun ConfirmDialog(state: DialogHostState = LocalDialogHost.current) {
}
},
)
}
@Composable
private fun MarkdownContent(content: String) {
val contentColor = LocalContentColor.current
AndroidView(
factory = { context ->
TextView(context).apply {
movementMethod = LinkMovementMethod.getInstance()
setSpannableFactory(NoCopySpannableFactory.getInstance())
breakStrategy = LineBreaker.BREAK_STRATEGY_SIMPLE
hyphenationFrequency = Layout.HYPHENATION_FREQUENCY_NONE
layoutParams = ViewGroup.LayoutParams(
ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT
)
}
},
modifier = Modifier
.fillMaxWidth()
.wrapContentHeight(),
update = {
Markwon.create(it.context).setMarkdown(it, content)
it.setTextColor(contentColor.toArgb())
})
}

View File

@@ -74,9 +74,9 @@ fun RootProfileConfig(
var expanded by remember { mutableStateOf(false) }
val currentNamespace = when (profile.namespace) {
Natives.Profile.Namespace.Inherited.ordinal -> stringResource(R.string.profile_namespace_inherited)
Natives.Profile.Namespace.Global.ordinal -> stringResource(R.string.profile_namespace_global)
Natives.Profile.Namespace.Individual.ordinal -> stringResource(R.string.profile_namespace_individual)
Natives.Profile.Namespace.INHERITED.ordinal -> stringResource(R.string.profile_namespace_inherited)
Natives.Profile.Namespace.GLOBAL.ordinal -> stringResource(R.string.profile_namespace_global)
Natives.Profile.Namespace.INDIVIDUAL.ordinal -> stringResource(R.string.profile_namespace_individual)
else -> stringResource(R.string.profile_namespace_inherited)
}
ListItem(headlineContent = {
@@ -104,21 +104,21 @@ fun RootProfileConfig(
DropdownMenuItem(
text = { Text(stringResource(R.string.profile_namespace_inherited)) },
onClick = {
onProfileChange(profile.copy(namespace = Natives.Profile.Namespace.Inherited.ordinal))
onProfileChange(profile.copy(namespace = Natives.Profile.Namespace.INHERITED.ordinal))
expanded = false
},
)
DropdownMenuItem(
text = { Text(stringResource(R.string.profile_namespace_global)) },
onClick = {
onProfileChange(profile.copy(namespace = Natives.Profile.Namespace.Global.ordinal))
onProfileChange(profile.copy(namespace = Natives.Profile.Namespace.GLOBAL.ordinal))
expanded = false
},
)
DropdownMenuItem(
text = { Text(stringResource(R.string.profile_namespace_individual)) },
onClick = {
onProfileChange(profile.copy(namespace = Natives.Profile.Namespace.Individual.ordinal))
onProfileChange(profile.copy(namespace = Natives.Profile.Namespace.INDIVIDUAL.ordinal))
expanded = false
},
)
@@ -191,7 +191,14 @@ fun GroupsPanel(selected: List<Groups>, closeSelection: (selection: Set<Groups>)
var showDialog by remember { mutableStateOf(false) }
if (showDialog) {
val groups = Groups.values()
val groups = Groups.values().sortedWith(compareBy<Groups> {
when (it) {
Groups.ROOT -> 0
Groups.SYSTEM -> 1
Groups.SHELL -> 2
else -> Int.MAX_VALUE
}
}.then(compareBy { it.name }))
val options = groups.map { value ->
ListOption(
titleText = value.display,
@@ -257,7 +264,7 @@ fun CapsPanel(
var showDialog by remember { mutableStateOf(false) }
if (showDialog) {
val caps = Capabilities.values()
val caps = Capabilities.values().sortedBy { it.name }
val options = caps.map { value ->
ListOption(
titleText = value.display,

View File

@@ -0,0 +1,116 @@
package me.weishu.kernelsu.ui.component.profile
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.filled.ArrowDropDown
import androidx.compose.material.icons.filled.ArrowDropUp
import androidx.compose.material.icons.filled.Create
import androidx.compose.material.icons.filled.ReadMore
import androidx.compose.material3.DropdownMenuItem
import androidx.compose.material3.ExperimentalMaterial3Api
import androidx.compose.material3.ExposedDropdownMenuBox
import androidx.compose.material3.Icon
import androidx.compose.material3.IconButton
import androidx.compose.material3.ListItem
import androidx.compose.material3.OutlinedTextField
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import androidx.compose.runtime.saveable.rememberSaveable
import androidx.compose.runtime.setValue
import androidx.compose.ui.Modifier
import androidx.compose.ui.res.stringResource
import me.weishu.kernelsu.Natives
import me.weishu.kernelsu.R
import me.weishu.kernelsu.ui.util.listAppProfileTemplates
import me.weishu.kernelsu.ui.util.setSepolicy
import me.weishu.kernelsu.ui.viewmodel.getTemplateInfoById
/**
* @author weishu
* @date 2023/10/21.
*/
@OptIn(ExperimentalMaterial3Api::class)
@Composable
fun TemplateConfig(
profile: Natives.Profile,
onViewTemplate: (id: String) -> Unit = {},
onManageTemplate: () -> Unit = {},
onProfileChange: (Natives.Profile) -> Unit
) {
var expanded by remember { mutableStateOf(false) }
var template by rememberSaveable {
mutableStateOf(profile.rootTemplate ?: "")
}
val profileTemplates = listAppProfileTemplates()
val noTemplates = profileTemplates.isEmpty()
ListItem(headlineContent = {
ExposedDropdownMenuBox(
expanded = expanded,
onExpandedChange = { expanded = it },
) {
OutlinedTextField(
modifier = Modifier
.menuAnchor()
.fillMaxWidth(),
readOnly = true,
label = { Text(stringResource(R.string.profile_template)) },
value = template.ifEmpty { "None" },
onValueChange = {},
trailingIcon = {
if (noTemplates) {
IconButton(
onClick = onManageTemplate
) {
Icon(Icons.Filled.Create, null)
}
} else if (expanded) Icon(Icons.Filled.ArrowDropUp, null)
else Icon(Icons.Filled.ArrowDropDown, null)
},
)
if (profileTemplates.isEmpty()) {
return@ExposedDropdownMenuBox
}
ExposedDropdownMenu(
expanded = expanded,
onDismissRequest = { expanded = false }
) {
profileTemplates.forEach { tid ->
val templateInfo =
getTemplateInfoById(tid) ?: return@forEach
DropdownMenuItem(
text = { Text(tid) },
onClick = {
template = tid
if (setSepolicy(tid, templateInfo.rules.joinToString("\n"))) {
onProfileChange(
profile.copy(
rootTemplate = tid,
rootUseDefault = false,
uid = templateInfo.uid,
gid = templateInfo.gid,
groups = templateInfo.groups,
capabilities = templateInfo.capabilities,
context = templateInfo.context,
namespace = templateInfo.namespace,
)
)
}
expanded = false
},
trailingIcon = {
IconButton(onClick = {
onViewTemplate(tid)
}) {
Icon(Icons.Filled.ReadMore, null)
}
}
)
}
}
}
})
}

View File

@@ -18,19 +18,15 @@ import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.filled.AccountCircle
import androidx.compose.material.icons.filled.Android
import androidx.compose.material.icons.filled.ArrowBack
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
import androidx.compose.material3.Icon
import androidx.compose.material3.IconButton
import androidx.compose.material3.ListItem
import androidx.compose.material3.OutlinedTextField
import androidx.compose.material3.Scaffold
import androidx.compose.material3.Text
import androidx.compose.material3.TopAppBar
@@ -61,6 +57,9 @@ import me.weishu.kernelsu.R
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.component.profile.TemplateConfig
import me.weishu.kernelsu.ui.screen.destinations.AppProfileTemplateScreenDestination
import me.weishu.kernelsu.ui.screen.destinations.TemplateEditorScreenDestination
import me.weishu.kernelsu.ui.util.LocalSnackbarHost
import me.weishu.kernelsu.ui.util.forceStopApp
import me.weishu.kernelsu.ui.util.getSepolicy
@@ -68,6 +67,7 @@ import me.weishu.kernelsu.ui.util.launchApp
import me.weishu.kernelsu.ui.util.restartApp
import me.weishu.kernelsu.ui.util.setSepolicy
import me.weishu.kernelsu.ui.viewmodel.SuperUserViewModel
import me.weishu.kernelsu.ui.viewmodel.getTemplateInfoById
/**
* @author weishu
@@ -107,9 +107,7 @@ fun AppProfileScreen(
appLabel = appInfo.label,
appIcon = {
AsyncImage(
model = ImageRequest.Builder(context)
.data(appInfo.packageInfo)
.crossfade(true)
model = ImageRequest.Builder(context).data(appInfo.packageInfo).crossfade(true)
.build(),
contentDescription = appInfo.label,
modifier = Modifier
@@ -119,6 +117,14 @@ fun AppProfileScreen(
)
},
profile = profile,
onViewTemplate = {
getTemplateInfoById(it)?.let { info ->
navigator.navigate(TemplateEditorScreenDestination(info))
}
},
onManageTemplate = {
navigator.navigate(AppProfileTemplateScreenDestination())
},
onProfileChange = {
scope.launch {
if (it.allowSu && !it.rootUseDefault && it.rules.isNotEmpty()) {
@@ -138,7 +144,6 @@ fun AppProfileScreen(
}
}
@OptIn(ExperimentalMaterial3Api::class)
@Composable
private fun AppProfileInner(
modifier: Modifier = Modifier,
@@ -146,6 +151,8 @@ private fun AppProfileInner(
appLabel: String,
appIcon: @Composable () -> Unit,
profile: Natives.Profile,
onViewTemplate: (id: String) -> Unit = {},
onManageTemplate: () -> Unit = {},
onProfileChange: (Natives.Profile) -> Unit,
) {
val isRootGranted = profile.allowSu
@@ -179,7 +186,7 @@ private fun AppProfileInner(
var mode by remember {
mutableStateOf(initialMode)
}
ProfileBox(mode, false) {
ProfileBox(mode, true) {
// template mode shouldn't change profile here!
if (it == Mode.Default || it == Mode.Custom) {
onProfileChange(profile.copy(rootUseDefault = it == Mode.Default))
@@ -188,43 +195,12 @@ private fun AppProfileInner(
}
Crossfade(targetState = mode, label = "") { currentMode ->
if (currentMode == Mode.Template) {
var expanded by remember { mutableStateOf(false) }
val templateNone = "None"
var template by rememberSaveable {
mutableStateOf(
profile.rootTemplate
?: templateNone
)
}
ListItem(headlineContent = {
ExposedDropdownMenuBox(
expanded = expanded,
onExpandedChange = { expanded = it },
) {
OutlinedTextField(
modifier = Modifier.menuAnchor(),
readOnly = true,
label = { Text(stringResource(R.string.profile_template)) },
value = template,
onValueChange = {
if (template != templateNone) {
onProfileChange(
profile.copy(
rootTemplate = it,
rootUseDefault = false
)
)
template = it
}
},
trailingIcon = {
if (expanded) Icon(Icons.Filled.ArrowDropUp, null)
else Icon(Icons.Filled.ArrowDropDown, null)
},
)
// TODO: Template
}
})
TemplateConfig(
profile = profile,
onViewTemplate = onViewTemplate,
onManageTemplate = onManageTemplate,
onProfileChange = onProfileChange
)
} else if (mode == Mode.Custom) {
RootProfileConfig(
fixedName = true,
@@ -254,9 +230,7 @@ private fun AppProfileInner(
}
private enum class Mode(@StringRes private val res: Int) {
Default(R.string.profile_default),
Template(R.string.profile_template),
Custom(R.string.profile_custom);
Default(R.string.profile_default), Template(R.string.profile_template), Custom(R.string.profile_custom);
val text: String
@Composable get() = stringResource(res)
@@ -292,8 +266,7 @@ private fun ProfileBox(
Divider(thickness = Dp.Hairline)
ListItem(headlineContent = {
Row(
modifier = Modifier.fillMaxWidth(),
horizontalArrangement = Arrangement.SpaceEvenly
modifier = Modifier.fillMaxWidth(), horizontalArrangement = Arrangement.SpaceEvenly
) {
FilterChip(
selected = mode == Mode.Default,
@@ -331,8 +304,7 @@ private fun AppMenuBox(packageName: String, content: @Composable () -> Unit) {
touchPoint = it
expanded = true
}
}
) {
}) {
content()

View File

@@ -29,9 +29,12 @@ import com.ramcosta.composedestinations.annotation.Destination
import com.ramcosta.composedestinations.annotation.RootNavGraph
import com.ramcosta.composedestinations.navigation.DestinationsNavigator
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext
import me.weishu.kernelsu.*
import me.weishu.kernelsu.R
import me.weishu.kernelsu.ui.component.ConfirmDialog
import me.weishu.kernelsu.ui.component.ConfirmResult
import me.weishu.kernelsu.ui.screen.destinations.SettingScreenDestination
import me.weishu.kernelsu.ui.util.*
@@ -71,6 +74,7 @@ fun HomeScreen(navigator: DestinationsNavigator) {
DonateCard()
LearnMoreCard()
Spacer(Modifier)
ConfirmDialog()
}
}
}
@@ -78,22 +82,37 @@ fun HomeScreen(navigator: DestinationsNavigator) {
@Composable
fun UpdateCard() {
val context = LocalContext.current
val newVersion by produceState(initialValue = 0 to "") {
val newVersion by produceState(initialValue = Triple(0, "", "")) {
value = withContext(Dispatchers.IO) { checkNewVersion() }
}
val currentVersionCode = getManagerVersion(context).second
val newVersionCode = newVersion.first
val newVersionUrl = newVersion.second
val changelog = newVersion.third
if (newVersionCode <= currentVersionCode) {
return
}
val uriHandler = LocalUriHandler.current
val dialogHost = LocalDialogHost.current
val title = stringResource(id = R.string.module_changelog)
val updateText = stringResource(id = R.string.module_update)
val scope = rememberCoroutineScope()
WarningCard(
message = stringResource(id = R.string.new_version_available).format(newVersionCode),
MaterialTheme.colorScheme.outlineVariant
) {
uriHandler.openUri(newVersionUrl)
scope.launch {
if (changelog.isEmpty() || dialogHost.showConfirm(
title = title,
content = changelog,
markdown = true,
confirm = updateText,
) == ConfirmResult.Confirmed
) {
uriHandler.openUri(newVersionUrl)
}
}
}
}
@@ -364,6 +383,9 @@ private fun StatusCardPreview() {
private fun WarningCardPreview() {
Column {
WarningCard(message = "Warning message")
WarningCard(message = "Warning message ", MaterialTheme.colorScheme.outlineVariant, onClick = {})
WarningCard(
message = "Warning message ",
MaterialTheme.colorScheme.outlineVariant,
onClick = {})
}
}

View File

@@ -19,6 +19,7 @@ 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.text.font.FontFamily
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp
import com.ramcosta.composedestinations.annotation.Destination
@@ -124,7 +125,7 @@ fun InstallScreen(navigator: DestinationsNavigator, uri: Uri) {
modifier = Modifier.padding(8.dp),
text = text,
fontSize = MaterialTheme.typography.bodySmall.fontSize,
fontFamily = MaterialTheme.typography.bodySmall.fontFamily,
fontFamily = FontFamily.Monospace,
lineHeight = MaterialTheme.typography.bodySmall.lineHeight,
)
}

View File

@@ -45,6 +45,7 @@ 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
import okhttp3.OkHttpClient
@Destination
@Composable
@@ -145,9 +146,80 @@ private fun ModuleList(
val uninstall = stringResource(id = R.string.uninstall)
val cancel = stringResource(id = android.R.string.cancel)
val moduleUninstallConfirm = stringResource(id = R.string.module_uninstall_confirm)
val updateText = stringResource(R.string.module_update)
val changelogText = stringResource(R.string.module_changelog)
val downloadingText = stringResource(R.string.module_downloading)
val startDownloadingText = stringResource(R.string.module_start_downloading)
val fetchChangeLogFailed = stringResource(R.string.module_changelog_failed)
val dialogHost = LocalDialogHost.current
val snackBarHost = LocalSnackbarHost.current
val context = LocalContext.current
suspend fun onModuleUpdate(
module: ModuleViewModel.ModuleInfo,
changelogUrl: String,
downloadUrl: String,
fileName: String
) {
val changelogResult = dialogHost.withLoading {
withContext(Dispatchers.IO) {
runCatching {
OkHttpClient().newCall(
okhttp3.Request.Builder().url(changelogUrl).build()
).execute().body!!.string()
}
}
}
val showToast: suspend (String) -> Unit = {msg->
withContext(Dispatchers.Main) {
Toast.makeText(
context,
msg,
Toast.LENGTH_SHORT
).show()
}
}
val changelog = changelogResult.getOrElse {
showToast(fetchChangeLogFailed.format(it.message))
return
}.ifBlank {
showToast(fetchChangeLogFailed.format(module.name))
return
}
// changelog is not empty, show it and wait for confirm
val confirmResult = dialogHost.showConfirm(
changelogText,
content = changelog,
markdown = true,
confirm = updateText,
)
if (confirmResult != ConfirmResult.Confirmed) {
return
}
showToast(startDownloadingText.format(module.name))
val downloading = downloadingText.format(module.name)
withContext(Dispatchers.IO) {
download(
context,
downloadUrl,
fileName,
downloading,
onDownloaded = onInstallModule,
onDownloading = {
launch(Dispatchers.Main) {
Toast.makeText(context, downloading, Toast.LENGTH_SHORT).show()
}
}
)
}
}
suspend fun onModuleUninstall(module: ModuleViewModel.ModuleInfo) {
val confirmResult = dialogHost.showConfirm(
@@ -209,32 +281,39 @@ private fun ModuleList(
modifier = Modifier.fillParentMaxSize(),
contentAlignment = Alignment.Center
) {
Text(stringResource(R.string.module_overlay_fs_not_available), textAlign = TextAlign.Center)
Text(
stringResource(R.string.module_overlay_fs_not_available),
textAlign = TextAlign.Center
)
}
}
}
viewModel.moduleList.isEmpty() -> {
item {
Box(
modifier = Modifier.fillParentMaxSize(),
contentAlignment = Alignment.Center
) {
Text(stringResource(R.string.module_empty), textAlign = TextAlign.Center)
Text(
stringResource(R.string.module_empty),
textAlign = TextAlign.Center
)
}
}
}
else -> {
items(viewModel.moduleList) { module ->
var isChecked by rememberSaveable(module) { mutableStateOf(module.enabled) }
val scope = rememberCoroutineScope()
val updateUrl by produceState(initialValue = "") {
viewModel.checkUpdate(module) { value = it.orEmpty() }
val updatedModule by produceState(initialValue = Triple("", "", "")) {
scope.launch(Dispatchers.IO) {
value = viewModel.checkUpdate(module)
}
}
val downloadingText = stringResource(R.string.module_downloading)
val startDownloadingText = stringResource(R.string.module_start_downloading)
ModuleItem(module, isChecked, updateUrl, onUninstall = {
ModuleItem(module, isChecked, updatedModule.first, onUninstall = {
scope.launch { onModuleUninstall(module) }
}, onCheckChanged = {
scope.launch {
@@ -259,26 +338,14 @@ private fun ModuleList(
}
}
}, onUpdate = {
scope.launch {
Toast.makeText(
context,
startDownloadingText.format(module.name),
Toast.LENGTH_SHORT
).show()
onModuleUpdate(
module,
updatedModule.third,
updatedModule.first,
"${module.name}-${updatedModule.second}.zip"
)
}
val downloading = downloadingText.format(module.name)
download(
context,
updateUrl,
"${module.name}-${module.version}.zip",
downloading,
onDownloaded = onInstallModule,
onDownloading = {
Toast.makeText(context, downloading, Toast.LENGTH_SHORT).show()
}
)
})
// fix last item shadow incomplete in LazyColumn

View File

@@ -8,6 +8,7 @@ import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.filled.ArrowBack
import androidx.compose.material.icons.filled.BugReport
import androidx.compose.material.icons.filled.ContactPage
import androidx.compose.material.icons.filled.Fence
import androidx.compose.material.icons.filled.RemoveModerator
import androidx.compose.material3.*
import androidx.compose.runtime.*
@@ -27,6 +28,7 @@ import me.weishu.kernelsu.R
import me.weishu.kernelsu.ui.component.AboutDialog
import me.weishu.kernelsu.ui.component.LoadingDialog
import me.weishu.kernelsu.ui.component.SwitchItem
import me.weishu.kernelsu.ui.screen.destinations.AppProfileTemplateScreenDestination
import me.weishu.kernelsu.ui.util.LocalDialogHost
import me.weishu.kernelsu.ui.util.getBugreportFile
@@ -56,6 +58,16 @@ fun SettingScreen(navigator: DestinationsNavigator) {
val scope = rememberCoroutineScope()
val dialogHost = LocalDialogHost.current
val profileTemplate = stringResource(id = R.string.settings_profile_template)
ListItem(
leadingContent = { Icon(Icons.Filled.Fence, profileTemplate) },
headlineContent = { Text(profileTemplate) },
supportingContent = { Text(stringResource(id = R.string.settings_profile_template_summary))},
modifier = Modifier.clickable {
navigator.navigate(AppProfileTemplateScreenDestination)
}
)
var umountChecked by rememberSaveable {
mutableStateOf(Natives.isDefaultUmountModules())
}

View File

@@ -0,0 +1,255 @@
package me.weishu.kernelsu.ui.screen
import android.widget.Toast
import androidx.compose.foundation.clickable
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.ExperimentalLayoutApi
import androidx.compose.foundation.layout.FlowRow
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.lazy.LazyColumn
import androidx.compose.foundation.lazy.items
import androidx.compose.material.ExperimentalMaterialApi
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.filled.Add
import androidx.compose.material.icons.filled.ArrowBack
import androidx.compose.material.icons.filled.ImportExport
import androidx.compose.material.icons.filled.Sync
import androidx.compose.material.pullrefresh.PullRefreshIndicator
import androidx.compose.material.pullrefresh.pullRefresh
import androidx.compose.material.pullrefresh.rememberPullRefreshState
import androidx.compose.material3.DropdownMenu
import androidx.compose.material3.DropdownMenuItem
import androidx.compose.material3.ExperimentalMaterial3Api
import androidx.compose.material3.ExtendedFloatingActionButton
import androidx.compose.material3.Icon
import androidx.compose.material3.IconButton
import androidx.compose.material3.ListItem
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Scaffold
import androidx.compose.material3.Text
import androidx.compose.material3.TopAppBar
import androidx.compose.runtime.Composable
import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import androidx.compose.runtime.rememberCoroutineScope
import androidx.compose.runtime.setValue
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.platform.LocalClipboardManager
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.text.AnnotatedString
import androidx.lifecycle.viewmodel.compose.viewModel
import com.ramcosta.composedestinations.annotation.Destination
import com.ramcosta.composedestinations.navigation.DestinationsNavigator
import com.ramcosta.composedestinations.result.ResultRecipient
import com.ramcosta.composedestinations.result.getOr
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch
import me.weishu.kernelsu.R
import me.weishu.kernelsu.ui.screen.destinations.TemplateEditorScreenDestination
import me.weishu.kernelsu.ui.viewmodel.TemplateViewModel
/**
* @author weishu
* @date 2023/10/20.
*/
@OptIn(ExperimentalMaterialApi::class)
@Destination
@Composable
fun AppProfileTemplateScreen(
navigator: DestinationsNavigator,
resultRecipient: ResultRecipient<TemplateEditorScreenDestination, Boolean>
) {
val viewModel = viewModel<TemplateViewModel>()
val scope = rememberCoroutineScope()
LaunchedEffect(Unit) {
if (viewModel.templateList.isEmpty()) {
viewModel.fetchTemplates()
}
}
// handle result from TemplateEditorScreen, refresh if needed
resultRecipient.onNavResult { result ->
if (result.getOr { false }) {
scope.launch { viewModel.fetchTemplates() }
}
}
Scaffold(
topBar = {
val clipboardManager = LocalClipboardManager.current
val context = LocalContext.current
val showToast = fun(msg: String) {
scope.launch(Dispatchers.Main) {
Toast.makeText(context, msg, Toast.LENGTH_SHORT).show()
}
}
TopBar(onBack = { navigator.popBackStack() },
onSync = {
scope.launch { viewModel.fetchTemplates(true) }
},
onImport = {
clipboardManager.getText()?.text?.let {
if (it.isEmpty()) {
showToast(context.getString(R.string.app_profile_template_import_empty))
return@let
}
scope.launch {
viewModel.importTemplates(
it, {
showToast(context.getString(R.string.app_profile_template_import_success))
viewModel.fetchTemplates(false)
},
showToast
)
}
}
},
onExport = {
scope.launch {
viewModel.exportTemplates(
{
showToast(context.getString(R.string.app_profile_template_export_empty))
}
) {
clipboardManager.setText(AnnotatedString(it))
}
}
}
)
},
floatingActionButton = {
ExtendedFloatingActionButton(
onClick = {
navigator.navigate(
TemplateEditorScreenDestination(
TemplateViewModel.TemplateInfo(),
false
)
)
},
icon = { Icon(Icons.Filled.Add, null) },
text = { Text(stringResource(id = R.string.app_profile_template_create)) },
)
},
) { innerPadding ->
val refreshState = rememberPullRefreshState(
refreshing = viewModel.isRefreshing,
onRefresh = { scope.launch { viewModel.fetchTemplates() } },
)
Box(
modifier = Modifier
.padding(innerPadding)
.pullRefresh(refreshState)
) {
LazyColumn(Modifier.fillMaxSize()) {
items(viewModel.templateList, key = { it.id }) { app ->
TemplateItem(navigator, app)
}
}
PullRefreshIndicator(
refreshing = viewModel.isRefreshing,
state = refreshState,
modifier = Modifier.align(Alignment.TopCenter)
)
}
}
}
@OptIn(ExperimentalLayoutApi::class)
@Composable
private fun TemplateItem(
navigator: DestinationsNavigator,
template: TemplateViewModel.TemplateInfo
) {
ListItem(
modifier = Modifier
.clickable {
navigator.navigate(TemplateEditorScreenDestination(template, !template.local))
},
headlineContent = { Text(template.name) },
supportingContent = {
Column {
Text(
text = "${template.id}${if (template.author.isEmpty()) "" else "@${template.author}"}",
style = MaterialTheme.typography.bodySmall,
fontSize = MaterialTheme.typography.bodySmall.fontSize,
)
Text(template.description)
FlowRow {
LabelText(label = "UID: ${template.uid}")
LabelText(label = "GID: ${template.gid}")
LabelText(label = template.context)
if (template.local) {
LabelText(label = "local")
} else {
LabelText(label = "remote")
}
}
}
},
)
}
@OptIn(ExperimentalMaterial3Api::class)
@Composable
private fun TopBar(
onBack: () -> Unit,
onSync: () -> Unit = {},
onImport: () -> Unit = {},
onExport: () -> Unit = {}
) {
TopAppBar(
title = {
Text(stringResource(R.string.settings_profile_template))
},
navigationIcon = {
IconButton(
onClick = onBack
) { Icon(Icons.Filled.ArrowBack, contentDescription = null) }
},
actions = {
IconButton(onClick = onSync) {
Icon(
Icons.Filled.Sync,
contentDescription = stringResource(id = R.string.app_profile_template_sync)
)
}
var showDropdown by remember { mutableStateOf(false) }
IconButton(onClick = {
showDropdown = true
}) {
Icon(
imageVector = Icons.Filled.ImportExport,
contentDescription = stringResource(id = R.string.app_profile_import_export)
)
DropdownMenu(expanded = showDropdown, onDismissRequest = {
showDropdown = false
}) {
DropdownMenuItem(text = {
Text(stringResource(id = R.string.app_profile_import_from_clipboard))
}, onClick = {
onImport()
showDropdown = false
})
DropdownMenuItem(text = {
Text(stringResource(id = R.string.app_profile_export_to_clipboard))
}, onClick = {
onExport()
showDropdown = false
})
}
}
}
)
}

View File

@@ -0,0 +1,327 @@
package me.weishu.kernelsu.ui.screen
import android.widget.Toast
import androidx.activity.compose.BackHandler
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.rememberScrollState
import androidx.compose.foundation.text.KeyboardActions
import androidx.compose.foundation.text.KeyboardOptions
import androidx.compose.foundation.verticalScroll
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.filled.ArrowBack
import androidx.compose.material.icons.filled.DeleteForever
import androidx.compose.material.icons.filled.Save
import androidx.compose.material3.ExperimentalMaterial3Api
import androidx.compose.material3.Icon
import androidx.compose.material3.IconButton
import androidx.compose.material3.ListItem
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.OutlinedTextField
import androidx.compose.material3.Scaffold
import androidx.compose.material3.Text
import androidx.compose.material3.TopAppBar
import androidx.compose.runtime.Composable
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import androidx.compose.runtime.saveable.rememberSaveable
import androidx.compose.runtime.setValue
import androidx.compose.ui.ExperimentalComposeUiApi
import androidx.compose.ui.Modifier
import androidx.compose.ui.input.pointer.pointerInteropFilter
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.platform.LocalSoftwareKeyboardController
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.text.input.ImeAction
import androidx.compose.ui.text.input.KeyboardType
import com.ramcosta.composedestinations.annotation.Destination
import com.ramcosta.composedestinations.result.ResultBackNavigator
import me.weishu.kernelsu.Natives
import me.weishu.kernelsu.R
import me.weishu.kernelsu.profile.Capabilities
import me.weishu.kernelsu.profile.Groups
import me.weishu.kernelsu.ui.component.profile.RootProfileConfig
import me.weishu.kernelsu.ui.util.deleteAppProfileTemplate
import me.weishu.kernelsu.ui.util.getAppProfileTemplate
import me.weishu.kernelsu.ui.util.setAppProfileTemplate
import me.weishu.kernelsu.ui.viewmodel.TemplateViewModel
import me.weishu.kernelsu.ui.viewmodel.toJSON
import org.json.JSONArray
import org.json.JSONObject
/**
* @author weishu
* @date 2023/10/20.
*/
@OptIn(ExperimentalComposeUiApi::class)
@Destination
@Composable
fun TemplateEditorScreen(
navigator: ResultBackNavigator<Boolean>,
initialTemplate: TemplateViewModel.TemplateInfo,
readOnly: Boolean = true,
) {
val isCreation = initialTemplate.id.isBlank()
val autoSave = !isCreation
var template by rememberSaveable {
mutableStateOf(initialTemplate)
}
BackHandler {
navigator.navigateBack(result = !readOnly)
}
Scaffold(
topBar = {
val author =
if (initialTemplate.author.isNotEmpty()) "@${initialTemplate.author}" else ""
val readOnlyHint = if (readOnly) {
" - ${stringResource(id = R.string.app_profile_template_readonly)}"
} else {
""
}
val titleSummary = "${initialTemplate.id}$author$readOnlyHint"
val saveTemplateFailed = stringResource(id = R.string.app_profile_template_save_failed)
val context = LocalContext.current
TopBar(
title = if (isCreation) {
stringResource(R.string.app_profile_template_create)
} else if (readOnly) {
stringResource(R.string.app_profile_template_view)
} else {
stringResource(R.string.app_profile_template_edit)
},
readOnly = readOnly,
summary = titleSummary,
onBack = { navigator.navigateBack(result = !readOnly) },
onDelete = {
if (deleteAppProfileTemplate(template.id)) {
navigator.navigateBack(result = true)
}
},
onSave = {
if (saveTemplate(template, isCreation)) {
navigator.navigateBack(result = true)
} else {
Toast.makeText(context, saveTemplateFailed, Toast.LENGTH_SHORT).show()
}
})
},
) { innerPadding ->
Column(
modifier = Modifier
.padding(innerPadding)
.verticalScroll(rememberScrollState())
.pointerInteropFilter {
// disable click and ripple if readOnly
readOnly
}
) {
if (isCreation) {
var errorHint by remember {
mutableStateOf("")
}
val idConflictError = stringResource(id = R.string.app_profile_template_id_exist)
val idInvalidError = stringResource(id = R.string.app_profile_template_id_invalid)
TextEdit(
label = stringResource(id = R.string.app_profile_template_id),
text = template.id,
errorHint = errorHint,
isError = errorHint.isNotEmpty()
) { value ->
errorHint = if (isTemplateExist(value)) {
idConflictError
} else if (!isValidTemplateId(value)) {
idInvalidError
} else {
""
}
template = template.copy(id = value)
}
}
TextEdit(
label = stringResource(id = R.string.app_profile_template_name),
text = template.name
) { value ->
template.copy(name = value).run {
if (autoSave) {
if (!saveTemplate(this)) {
// failed
return@run
}
}
template = this
}
}
TextEdit(
label = stringResource(id = R.string.app_profile_template_description),
text = template.description
) { value ->
template.copy(description = value).run {
if (autoSave) {
if (!saveTemplate(this)) {
// failed
return@run
}
}
template = this
}
}
RootProfileConfig(fixedName = true,
profile = toNativeProfile(template),
onProfileChange = {
template.copy(
uid = it.uid,
gid = it.gid,
groups = it.groups,
capabilities = it.capabilities,
context = it.context,
namespace = it.namespace,
rules = it.rules.split("\n")
).run {
if (autoSave) {
if (!saveTemplate(this)) {
// failed
return@run
}
}
template = this
}
})
}
}
}
fun toNativeProfile(templateInfo: TemplateViewModel.TemplateInfo): Natives.Profile {
return Natives.Profile().copy(rootTemplate = templateInfo.id,
uid = templateInfo.uid,
gid = templateInfo.gid,
groups = templateInfo.groups,
capabilities = templateInfo.capabilities,
context = templateInfo.context,
namespace = templateInfo.namespace,
rules = templateInfo.rules.joinToString("\n").ifBlank { "" })
}
fun isTemplateValid(template: TemplateViewModel.TemplateInfo): Boolean {
if (template.id.isBlank()) {
return false
}
if (!isValidTemplateId(template.id)) {
return false
}
return true
}
fun saveTemplate(template: TemplateViewModel.TemplateInfo, isCreation: Boolean = false): Boolean {
if (!isTemplateValid(template)) {
return false
}
if (isCreation && isTemplateExist(template.id)) {
return false
}
val json = template.toJSON()
json.put("local", true)
return setAppProfileTemplate(template.id, json.toString())
}
@OptIn(ExperimentalMaterial3Api::class)
@Composable
private fun TopBar(
title: String,
readOnly: Boolean,
summary: String = "",
onBack: () -> Unit,
onDelete: () -> Unit = {},
onSave: () -> Unit = {}
) {
TopAppBar(title = {
Column {
Text(title)
if (summary.isNotBlank()) {
Text(
text = summary,
style = MaterialTheme.typography.bodyMedium,
)
}
}
}, navigationIcon = {
IconButton(
onClick = onBack
) { Icon(Icons.Filled.ArrowBack, contentDescription = null) }
}, actions = {
if (readOnly) {
return@TopAppBar
}
IconButton(onClick = onDelete) {
Icon(
Icons.Filled.DeleteForever,
contentDescription = stringResource(id = R.string.app_profile_template_delete)
)
}
IconButton(onClick = onSave) {
Icon(
imageVector = Icons.Filled.Save,
contentDescription = stringResource(id = R.string.app_profile_template_save)
)
}
})
}
@OptIn(ExperimentalComposeUiApi::class)
@Composable
private fun TextEdit(
label: String,
text: String,
errorHint: String = "",
isError: Boolean = false,
onValueChange: (String) -> Unit = {}
) {
ListItem(headlineContent = {
val keyboardController = LocalSoftwareKeyboardController.current
OutlinedTextField(
value = text,
modifier = Modifier.fillMaxWidth(),
label = { Text(label) },
suffix =
if (errorHint.isNotBlank()) {
{
Text(
text = if (isError) errorHint else "",
style = MaterialTheme.typography.bodySmall,
color = MaterialTheme.colorScheme.error
)
}
} else {
null
},
isError = isError,
keyboardOptions = KeyboardOptions(
keyboardType = KeyboardType.Ascii, imeAction = ImeAction.Next
),
keyboardActions = KeyboardActions(onDone = {
keyboardController?.hide()
}),
onValueChange = onValueChange
)
})
}
private fun isValidTemplateId(id: String): Boolean {
return Regex("""^([A-Za-z]{1}[A-Za-z\d_]*\.)*[A-Za-z][A-Za-z\d_]*$""").matches(id)
}
private fun isTemplateExist(id: String): Boolean {
return getAppProfileTemplate(id).isNotBlank()
}

View File

@@ -60,9 +60,9 @@ fun download(
downloadManager.enqueue(request)
}
fun checkNewVersion(): Pair<Int, String> {
fun checkNewVersion(): Triple<Int, String, String> {
val url = "https://api.github.com/repos/tiann/KernelSU/releases/latest"
val defaultValue = 0 to ""
val defaultValue = Triple(0, "", "")
runCatching {
okhttp3.OkHttpClient().newCall(okhttp3.Request.Builder().url(url).build()).execute()
.use { response ->
@@ -71,6 +71,7 @@ fun checkNewVersion(): Pair<Int, String> {
}
val body = response.body?.string() ?: return defaultValue
val json = org.json.JSONObject(body)
val changelog = json.optString("body")
val assets = json.getJSONArray("assets")
for (i in 0 until assets.length()) {
@@ -86,7 +87,7 @@ fun checkNewVersion(): Pair<Int, String> {
val versionCode = matchResult.groupValues[2].toInt()
val downloadUrl = asset.getString("browser_download_url")
return versionCode to downloadUrl
return Triple(versionCode, downloadUrl, changelog)
}
}

View File

@@ -91,7 +91,12 @@ fun uninstallModule(id: String): Boolean {
return result
}
fun installModule(uri: Uri, onFinish: (Boolean) -> Unit, onStdout: (String) -> Unit, onStderr: (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")
@@ -115,7 +120,8 @@ fun installModule(uri: Uri, onFinish: (Boolean) -> Unit, onStdout: (String) -> U
}
val result =
shell.newJob().add("${getKsuDaemonPath()} $cmd").to(stdoutCallback, stderrCallback).exec()
shell.newJob().add("${getKsuDaemonPath()} $cmd").to(stdoutCallback, stderrCallback)
.exec()
Log.i("KernelSU", "install module $uri result: $result")
file.delete()
@@ -153,14 +159,16 @@ fun isSepolicyValid(rules: String?): Boolean {
}
val shell = getRootShell()
val result =
shell.newJob().add("${getKsuDaemonPath()} 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()
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")
}
@@ -168,11 +176,39 @@ fun getSepolicy(pkg: String): String {
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()
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 listAppProfileTemplates(): List<String> {
val shell = getRootShell()
return shell.newJob().add("${getKsuDaemonPath()} profile list-templates").to(ArrayList(), null)
.exec().out
}
fun getAppProfileTemplate(id: String): String {
val shell = getRootShell()
return shell.newJob().add("${getKsuDaemonPath()} profile get-template '${id}'")
.to(ArrayList(), null)
.exec().out.joinToString("\n")
}
fun setAppProfileTemplate(id: String, template: String): Boolean {
val shell = getRootShell()
return shell.newJob().add("${getKsuDaemonPath()} profile set-template '${id}' '${template}'")
.to(ArrayList(), null)
.exec().isSuccess
}
fun deleteAppProfileTemplate(id: String): Boolean {
val shell = getRootShell()
return shell.newJob().add("${getKsuDaemonPath()} profile delete-template '${id}'")
.to(ArrayList(), null)
.exec().isSuccess
}
fun forceStopApp(packageName: String) {
val shell = getRootShell()
val result = shell.newJob().add("am force-stop $packageName").exec()
@@ -182,7 +218,8 @@ fun forceStopApp(packageName: String) {
fun launchApp(packageName: String) {
val shell = getRootShell()
val result = shell.newJob().add("monkey -p $packageName -c android.intent.category.LAUNCHER 1").exec()
val result =
shell.newJob().add("monkey -p $packageName -c android.intent.category.LAUNCHER 1").exec()
Log.i(TAG, "launch $packageName result: $result")
}

View File

@@ -30,6 +30,9 @@ fun getBugreportFile(context: Context): File {
val appListFile = File(bugreportDir, "packages.txt")
val propFile = File(bugreportDir, "props.txt")
val allowListFile = File(bugreportDir, "allowlist.bin")
val procModules = File(bugreportDir, "proc_modules.txt")
val bootConfig = File(bugreportDir, "boot_config.txt")
val kernelConfig = File(bugreportDir, "defconfig.gz")
val shell = getRootShell()
@@ -47,8 +50,11 @@ fun getBugreportFile(context: Context): File {
shell.newJob().add("cp /data/system/packages.list ${appListFile.absolutePath}").exec()
shell.newJob().add("getprop > ${propFile.absolutePath}").exec()
shell.newJob().add("cp /data/adb/ksu/.allowlist ${allowListFile.absolutePath}").exec()
shell.newJob().add("cp /proc/modules ${procModules.absolutePath}").exec()
shell.newJob().add("cp /proc/bootconfig ${bootConfig.absolutePath}").exec()
shell.newJob().add("cp /proc/config.gz ${kernelConfig.absolutePath}").exec()
val selinux = ShellUtils.fastCmd(shell, "getenforce");
val selinux = ShellUtils.fastCmd(shell, "getenforce")
// basic information
val buildInfo = File(bugreportDir, "basic.txt")

View File

@@ -115,56 +115,46 @@ class ModuleViewModel : ViewModel() {
}
}
fun checkUpdate(m: ModuleInfo, callback: (String?) -> Unit) {
fun checkUpdate(m: ModuleInfo): Triple<String, String, String> {
val empty = Triple("", "", "")
if (m.updateJson.isEmpty() || m.remove || m.update || !m.enabled) {
callback(null)
return
return empty
}
viewModelScope.launch(Dispatchers.IO) {
// download updateJson
val result = kotlin.runCatching {
val url = m.updateJson
Log.i(TAG, "checkUpdate url: $url")
val response = okhttp3.OkHttpClient()
.newCall(
// download updateJson
val result = kotlin.runCatching {
val url = m.updateJson
Log.i(TAG, "checkUpdate url: $url")
val response = okhttp3.OkHttpClient()
.newCall(
okhttp3.Request.Builder()
.url(url)
.build()
).execute()
Log.d(TAG, "checkUpdate code: ${response.code}")
if (response.isSuccessful) {
response.body?.string() ?: ""
} else {
""
}
}.getOrDefault("")
Log.i(TAG, "checkUpdate result: $result")
if (result.isEmpty()) {
callback(null)
return@launch
Log.d(TAG, "checkUpdate code: ${response.code}")
if (response.isSuccessful) {
response.body?.string() ?: ""
} else {
""
}
}.getOrDefault("")
Log.i(TAG, "checkUpdate result: $result")
val updateJson = kotlin.runCatching {
JSONObject(result)
}.getOrNull()
if (updateJson == null) {
callback(null)
return@launch
}
val version = updateJson.optString("version", "")
val versionCode = updateJson.optInt("versionCode", 0)
val zipUrl = updateJson.optString("zipUrl", "")
val changelog = updateJson.optString("changelog", "")
if (versionCode <= m.versionCode || zipUrl.isEmpty()) {
callback(null)
return@launch
}
callback(zipUrl)
if (result.isEmpty()) {
return empty
}
}
val updateJson = kotlin.runCatching {
JSONObject(result)
}.getOrNull() ?: return empty
val version = updateJson.optString("version", "")
val versionCode = updateJson.optInt("versionCode", 0)
val zipUrl = updateJson.optString("zipUrl", "")
val changelog = updateJson.optString("changelog", "")
if (versionCode <= m.versionCode || zipUrl.isEmpty()) {
return empty
}
return Triple(zipUrl, version, changelog)
}
}

View File

@@ -0,0 +1,314 @@
package me.weishu.kernelsu.ui.viewmodel
import android.os.Parcelable
import android.util.Log
import androidx.compose.runtime.derivedStateOf
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.setValue
import androidx.lifecycle.ViewModel
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.withContext
import kotlinx.parcelize.Parcelize
import me.weishu.kernelsu.Natives
import me.weishu.kernelsu.profile.Capabilities
import me.weishu.kernelsu.profile.Groups
import me.weishu.kernelsu.ui.util.getAppProfileTemplate
import me.weishu.kernelsu.ui.util.listAppProfileTemplates
import me.weishu.kernelsu.ui.util.setAppProfileTemplate
import okhttp3.OkHttpClient
import okhttp3.Request
import org.json.JSONArray
import org.json.JSONObject
import java.text.Collator
import java.util.Locale
/**
* @author weishu
* @date 2023/10/20.
*/
const val TEMPLATE_INDEX_URL = "https://kernelsu.org/templates/index.json"
const val TEMPLATE_URL = "https://kernelsu.org/templates/%s"
const val TAG = "TemplateViewModel"
class TemplateViewModel : ViewModel() {
companion object {
private var templates by mutableStateOf<List<TemplateInfo>>(emptyList())
}
@Parcelize
data class TemplateInfo(
val id: String = "",
val name: String = "",
val description: String = "",
val author: String = "",
val local: Boolean = true,
val namespace: Int = Natives.Profile.Namespace.INHERITED.ordinal,
val uid: Int = Natives.ROOT_UID,
val gid: Int = Natives.ROOT_GID,
val groups: List<Int> = mutableListOf(),
val capabilities: List<Int> = mutableListOf(),
val context: String = Natives.KERNEL_SU_DOMAIN,
val rules: List<String> = mutableListOf(),
) : Parcelable
var isRefreshing by mutableStateOf(false)
private set
val templateList by derivedStateOf {
val comparator = compareBy(TemplateInfo::local).reversed().then(
compareBy(
Collator.getInstance(Locale.getDefault()), TemplateInfo::id
)
)
templates.sortedWith(comparator).apply {
isRefreshing = false
}
}
suspend fun fetchTemplates(sync: Boolean = false) {
isRefreshing = true
withContext(Dispatchers.IO) {
val localTemplateIds = listAppProfileTemplates()
Log.i(TAG, "localTemplateIds: $localTemplateIds")
if (localTemplateIds.isEmpty() || sync) {
// if no templates, fetch remote templates
fetchRemoteTemplates()
}
// fetch templates again
templates = listAppProfileTemplates().mapNotNull(::getTemplateInfoById)
isRefreshing = false
}
}
suspend fun importTemplates(
templates: String,
onSuccess: suspend () -> Unit,
onFailure: suspend (String) -> Unit
) {
withContext(Dispatchers.IO) {
runCatching {
JSONArray(templates)
}.getOrElse {
runCatching {
val json = JSONObject(templates)
JSONArray().apply { put(json) }
}.getOrElse {
onFailure("invalid templates: $templates")
return@withContext
}
}.let {
0.until(it.length()).forEach { i ->
runCatching {
val template = it.getJSONObject(i)
val id = template.getString("id")
template.put("local", true)
setAppProfileTemplate(id, template.toString())
}.onFailure { e ->
Log.e(TAG, "ignore invalid template: $it", e)
}
}
onSuccess()
}
}
}
suspend fun exportTemplates(onTemplateEmpty: () -> Unit, callback: (String) -> Unit) {
withContext(Dispatchers.IO) {
val templates = listAppProfileTemplates().mapNotNull(::getTemplateInfoById).filter {
it.local
}
templates.ifEmpty {
onTemplateEmpty()
return@withContext
}
JSONArray(templates.map {
it.toJSON()
}).toString().let(callback)
}
}
}
private fun fetchRemoteTemplates() {
runCatching {
OkHttpClient().newCall(
Request.Builder().url(TEMPLATE_INDEX_URL).build()
).execute().use { response ->
if (!response.isSuccessful) {
return
}
val remoteTemplateIds = JSONArray(response.body!!.string())
Log.i(TAG, "fetchRemoteTemplates: $remoteTemplateIds")
0.until(remoteTemplateIds.length()).forEach { i ->
val id = remoteTemplateIds.getString(i)
val templateJson = OkHttpClient().newCall(
Request.Builder().url(TEMPLATE_URL.format(id)).build()
).runCatching {
execute().use { response ->
if (!response.isSuccessful) {
return@forEach
}
response.body!!.string()
}
}.getOrNull() ?: return@forEach
Log.i(TAG, "template: $templateJson")
// validate remote template
runCatching {
val json = JSONObject(templateJson)
fromJSON(json)?.let {
// force local template
json.put("local", false)
setAppProfileTemplate(id, json.toString())
}
}.onFailure {
Log.e(TAG, "ignore invalid template: $it", it)
return@forEach
}
}
}
}.onFailure { Log.e(TAG, "fetchRemoteTemplates: $it", it) }
}
@Suppress("UNCHECKED_CAST")
private fun <T, R> JSONArray.mapCatching(
transform: (T) -> R, onFail: (Throwable) -> Unit
): List<R> {
return List(length()) { i -> get(i) as T }.mapNotNull { element ->
runCatching {
transform(element)
}.onFailure(onFail).getOrNull()
}
}
private inline fun <reified T : Enum<T>> getEnumOrdinals(
jsonArray: JSONArray?, enumClass: Class<T>
): List<T> {
return jsonArray?.mapCatching<String, T>({ name ->
enumValueOf(name.uppercase())
}, {
Log.e(TAG, "ignore invalid enum ${enumClass.simpleName}: $it", it)
}).orEmpty()
}
fun getTemplateInfoById(id: String): TemplateViewModel.TemplateInfo? {
return runCatching {
fromJSON(JSONObject(getAppProfileTemplate(id)))
}.onFailure {
Log.e(TAG, "ignore invalid template: $it", it)
}.getOrNull()
}
private fun getLocaleString(json: JSONObject, key: String): String {
val fallback = json.getString(key)
val locale = Locale.getDefault()
val localeKey = "${locale.language}_${locale.country}"
json.optJSONObject("locales")?.let {
it.optJSONObject(localeKey)?.let { json->
return json.optString(key, fallback)
}
}
return fallback
}
private fun fromJSON(templateJson: JSONObject): TemplateViewModel.TemplateInfo? {
return runCatching {
val groupsJsonArray = templateJson.optJSONArray("groups")
val capabilitiesJsonArray = templateJson.optJSONArray("capabilities")
val context = templateJson.optString("context").takeIf { it.isNotEmpty() }
?: Natives.KERNEL_SU_DOMAIN;
val namespace = templateJson.optString("namespace").takeIf { it.isNotEmpty() }
?: Natives.Profile.Namespace.INHERITED.name
val rulesJsonArray = templateJson.optJSONArray("rules")
val templateInfo = TemplateViewModel.TemplateInfo(
id = templateJson.getString("id"),
name = getLocaleString(templateJson, "name"),
description = getLocaleString(templateJson, "description"),
author = templateJson.optString("author"),
local = templateJson.optBoolean("local"),
namespace = Natives.Profile.Namespace.valueOf(
namespace.uppercase()
).ordinal,
uid = templateJson.optInt("uid", Natives.ROOT_UID),
gid = templateJson.optInt("gid", Natives.ROOT_GID),
groups = getEnumOrdinals(groupsJsonArray, Groups::class.java).map { it.gid },
capabilities = getEnumOrdinals(
capabilitiesJsonArray, Capabilities::class.java
).map { it.cap },
context = context,
rules = rulesJsonArray?.mapCatching<String, String>({ it }, {
Log.e(TAG, "ignore invalid rule: $it", it)
}).orEmpty()
)
templateInfo
}.onFailure {
Log.e(TAG, "ignore invalid template: $it", it)
}.getOrNull()
}
fun TemplateViewModel.TemplateInfo.toJSON(): JSONObject {
val template = this
return JSONObject().apply {
put("id", template.id)
put("name", template.name.ifBlank { template.id })
put("description", template.description.ifBlank { template.id })
if (template.author.isNotEmpty()) {
put("author", template.author)
}
put("namespace", Natives.Profile.Namespace.values()[template.namespace].name)
put("uid", template.uid)
put("gid", template.gid)
if (template.groups.isNotEmpty()) {
put("groups", JSONArray(
Groups.values().filter {
template.groups.contains(it.gid)
}.map {
it.name
}
))
}
if (template.capabilities.isNotEmpty()) {
put("capabilities", JSONArray(
Capabilities.values().filter {
template.capabilities.contains(it.cap)
}.map {
it.name
}
))
}
if (template.context.isNotEmpty()) {
put("context", template.context)
}
if (template.rules.isNotEmpty()) {
put("rules", JSONArray(template.rules))
}
}
}
@Suppress("unused")
fun generateTemplates() {
val templateJson = JSONObject()
templateJson.put("id", "com.example")
templateJson.put("name", "Example")
templateJson.put("description", "This is an example template")
templateJson.put("local", true)
templateJson.put("namespace", Natives.Profile.Namespace.INHERITED.name)
templateJson.put("uid", 0)
templateJson.put("gid", 0)
templateJson.put("groups", JSONArray().apply { put(Groups.INET.name) })
templateJson.put("capabilities", JSONArray().apply { put(Capabilities.CAP_NET_RAW.name) })
templateJson.put("context", "u:r:su:s0")
Log.i(TAG, "$templateJson")
}

View File

@@ -13,15 +13,15 @@
<string name="home_manager_version">إصدار المدير</string>
<string name="home_fingerprint">البصمة</string>
<string name="home_selinux_status">وضع SELinux</string>
<string name="selinux_status_disabled">غير مفعل</string>
<string name="selinux_status_disabled">معطل</string>
<string name="selinux_status_enforcing">مفروض</string>
<string name="selinux_status_permissive">متساهل</string>
<string name="selinux_status_unknown">مجهول</string>
<string name="superuser">مستخدم خارق</string>
<string name="module_failed_to_enable">فشل في تمكين الوحدة: %s</string>
<string name="module_failed_to_disable">فشل تعطيل الوحدة : %s</string>
<string name="module_empty">لا توجد وحدة مثبتة</string>
<string name="module">وحدة</string>
<string name="module_empty">لا توجد وحدات مثبتة</string>
<string name="module">الوحدات</string>
<string name="uninstall">إلغاء التثبيت</string>
<string name="module_install">تثبيت الوحدة</string>
<string name="install">تثبيت</string>
@@ -34,7 +34,7 @@
<string name="reboot_edl">إعادة تشغيل إلى وضع EDL</string>
<string name="about">من نحن</string>
<string name="module_uninstall_confirm">هل أنت متأكد أنك تريد إلغاء تثبيت الوحدة %s ?</string>
<string name="module_uninstall_success">تم إلغاء التثبيت %s</string>
<string name="module_uninstall_success">تم إلغاء تثبيتها %s</string>
<string name="module_uninstall_failed">فشل إلغاء التثبيت: %s</string>
<string name="module_version">الإصدار</string>
<string name="module_author">المطور</string>
@@ -56,7 +56,7 @@
<string name="module_update">تحديث</string>
<string name="module_downloading">تحمبل الوحدة : %s</string>
<string name="module_start_downloading">ابدأ التنزيل: %s</string>
<string name="new_version_available">الإصدار الجديد: %s متاح ، انقر للتنزيل</string>
<string name="new_version_available">الإصدار الجديد: %s متاح ، انقر للتحديث</string>
<string name="launch_app">تشغيل</string>
<string name="profile_default">الإفتراضي</string>
<string name="profile_template">نموذج</string>
@@ -79,4 +79,27 @@
<string name="failed_to_update_sepolicy">فشل تحديث قواعد SELinux لما يلي: %s</string>
<string name="profile_name">اسم الملف الشخصي</string>
<string name="require_kernel_version">إصدار KernelSU الحالي %d منخفض جدًا بحيث لا يعمل المدير بشكل صحيح. الرجاء الترقية إلى الإصدار %d أو أعلى!</string>
<string name="module_changelog">سجل التغييرات</string>
<string name="app_profile_template_import_success">تم الاستيراد بنجاح</string>
<string name="app_profile_export_to_clipboard">تصدير إلى الحافظة</string>
<string name="app_profile_template_export_empty">لا يمكن العثور على القالب المحلي للتصدير!</string>
<string name="app_profile_template_id_exist">معرف القالب موجود بالفعل!</string>
<string name="app_profile_import_from_clipboard">استيراد من الحافظة</string>
<string name="module_changelog_failed">فشل في جلب سجل التغيير: %s</string>
<string name="app_profile_template_name">الاسم</string>
<string name="app_profile_template_id_invalid">معرف القالب غير صالح</string>
<string name="app_profile_template_sync">مزامنة القوالب عبر الإنترنت</string>
<string name="app_profile_template_create">إنشاء قالب</string>
<string name="app_profile_template_readonly">للقراءة فقط</string>
<string name="app_profile_import_export">استيراد / تصدير</string>
<string name="app_profile_template_save_failed">فشل في حفظ القالب</string>
<string name="app_profile_template_edit">تحرير القالب</string>
<string name="app_profile_template_id">المعرف</string>
<string name="settings_profile_template">قالب ملف تعريف التطبيق</string>
<string name="app_profile_template_description">الوصف</string>
<string name="app_profile_template_save">حفظ</string>
<string name="settings_profile_template_summary">إدارة القالب المحلي وعبر الإنترنت لملف تعريف التطبيق</string>
<string name="app_profile_template_delete">حذف</string>
<string name="app_profile_template_import_empty">الحافظة فارغة!</string>
<string name="app_profile_template_view">عرض القالب</string>
</resources>

View File

@@ -6,40 +6,40 @@
<string name="home_working">Funktioniert</string>
<string name="home_working_version">Version: %d</string>
<string name="superuser">Superuser</string>
<string name="home_click_to_install">Klicken Sie zum Installieren</string>
<string name="home_superuser_count">Superusers: %d</string>
<string name="home_click_to_install">Tippen zum Installieren</string>
<string name="home_superuser_count">Superuser: %d</string>
<string name="selinux_status_unknown">Unbekannt</string>
<string name="selinux_status_enforcing">erzwingen</string>
<string name="reboot_bootloader">Zum Bootloader-Modus neustarten</string>
<string name="reboot_download">Zum Download-Modus neustarten</string>
<string name="reboot_edl">Zum EDL-Modus neustarten</string>
<string name="selinux_status_enforcing">Erzwingen</string>
<string name="reboot_bootloader">Neustart mit Bootloader</string>
<string name="reboot_download">Neustart mit Download-Modus</string>
<string name="reboot_edl">Neustart mit EDL-Modus</string>
<string name="module_author">Autor</string>
<string name="module_overlay_fs_not_available">overlayfs ist nicht verfügbar, Modul kann nicht funktionieren!</string>
<string name="module_overlay_fs_not_available">overlayfs nicht verfügbar, Modul kann nicht funktionieren!</string>
<string name="about">Über</string>
<string name="module_magisk_conflict">Module sind deaktiviert, weil es einen Konflikt mit Magisks gibt!</string>
<string name="module_magisk_conflict">Module sind deaktiviert, weil es einen Konflikt mit Magisk gibt!</string>
<string name="home_learn_kernelsu_url">https://kernelsu.org/guide/what-is-kernelsu.html</string>
<string name="home_click_to_learn_kernelsu">Erfahren Sie, wie Sie KernelSU installieren und Module verwenden</string>
<string name="home_click_to_learn_kernelsu">Verstehe, wie du KernelSU installieren und Module verwendest</string>
<string name="home_support_title">Unterstütze uns</string>
<string name="home_support_content">"KernelSU ist und bleibt kostenlos und Open Source. Sie können uns jedoch zeigen, dass Sie sich für uns interessieren, indem Sie eine Spende tätigen."</string>
<string name="home_support_content">KernelSU ist und wird immer frei und quelloffen sein. Du kannst uns jedoch zeigen, dass du dich für uns interessierst, indem du eine Spende tätigst.</string>
<string name="profile_selinux_context">SELinux-Kontext</string>
<string name="settings_umount_modules_default">Demontiere Module als Standard</string>
<string name="settings_umount_modules_default_summary">Der globale Standard-Wert für „Demontiere Module“ in App-Profilen. Falls aktiviert, werden alle Modul-Modifikationen zu dem System deaktiviert; für Applikationen, welche kein Profil gesetzt haben.</string>
<string name="settings_umount_modules_default">Module standardmäßig aushängen</string>
<string name="settings_umount_modules_default_summary">Globaler Standardwert für \'Module aushängen\' in App-Profilen. Wenn er aktiviert ist, werden alle Moduländerungen im App-System entfernt, für die kein Profil festgelegt ist.</string>
<string name="profile_default">Standard</string>
<string name="profile_template">Vorlage</string>
<string name="profile_custom">Benutzerdefiniert</string>
<string name="failed_to_update_app_profile">Aktualisierung des App-Profils fehlgeschlagen für %s</string>
<string name="profile_namespace_inherited">Übernommen</string>
<string name="failed_to_update_app_profile">App-Profilaktualisierung für %s fehlgeschlagen</string>
<string name="profile_namespace_inherited">Vererbt</string>
<string name="profile_namespace_global">Global</string>
<string name="profile_namespace_individual">Individuell</string>
<string name="profile_selinux_domain">Domain</string>
<string name="module_update">Aktualisierung</string>
<string name="profile_umount_modules_summary">Aktivierung dieser Option erlaubt KernelSU, alle modifizierten Dateien von den Modulen dieser Applikation wiederherstellen.</string>
<string name="module_update">Aktualisieren</string>
<string name="profile_umount_modules_summary">Wenn du diese Option aktivierst, kann KernelSU alle von den Modulen für diese App geänderten Dateien wiederherstellen.</string>
<string name="profile_selinux_rules">Regeln</string>
<string name="module_start_downloading">Starte herunterladen: %s</string>
<string name="failed_to_update_sepolicy">Aktualisierung der SELinux-Regeln fehlgeschlagen für: %s</string>
<string name="launch_app">Start</string>
<string name="new_version_available">Neue Version: %s ist verfügbar, klicke zum herunterladen</string>
<string name="force_stop_app">Erzwinge Stopp</string>
<string name="module_start_downloading">Herunterladen starten: %s</string>
<string name="failed_to_update_sepolicy">Fehler beim Aktualisieren der SELinux-Regeln für: %s</string>
<string name="launch_app">Starten</string>
<string name="new_version_available">Neue Version: %s verfügbar, tippen zum Aktualisieren</string>
<string name="force_stop_app">Stopp erzwingen</string>
<string name="restart_app">Neustart</string>
<string name="home_module_count">Module: %d</string>
<string name="home_manager_version">Verwalter-Version</string>
@@ -53,30 +53,31 @@
<string name="install">Installieren</string>
<string name="reboot">Neustart</string>
<string name="settings">Einstellungen</string>
<string name="reboot_recovery">Neustart zur Recovery</string>
<string name="reboot_recovery">Neustart mit Recovery</string>
<string name="module_uninstall_success">%s deinstalliert</string>
<string name="module_version">Version</string>
<string name="refresh">Neu laden</string>
<string name="show_system_apps">Zeige System-Apps</string>
<string name="hide_system_apps">Verstecke System-Apps</string>
<string name="send_log">Sende Verlauf</string>
<string name="home_learn_kernelsu">Lerne KernelSU</string>
<string name="show_system_apps">System-Apps anzeigen</string>
<string name="hide_system_apps">System-Apps ausblenden</string>
<string name="send_log">Protokoll senden</string>
<string name="home_learn_kernelsu">KernelSU verstehen</string>
<string name="safe_mode">Sicherer Modus</string>
<string name="reboot_to_apply">Starte neu, damit die Effekte auftreten</string>
<string name="about_source_code">Sehe den Quellcode bei %1$s<br/>Trete unserem %2$s Kanal bei</string>
<string name="reboot_to_apply">Neu starten, damit die Effekte auftreten</string>
<string name="about_source_code">Quellcode unter %1$s ansehen<br/>Unserem %2$s-Kanal beitreten</string>
<string name="profile_name">Profilname</string>
<string name="profile_namespace">Montiere Namensraum</string>
<string name="profile_namespace">Namespace einhängen</string>
<string name="profile_groups">Gruppen</string>
<string name="profile_capabilities">Fähigkeiten</string>
<string name="profile_umount_modules">Demontiere Module</string>
<string name="module_downloading">Lädt Modul herunter: %s</string>
<string name="profile_umount_modules">Module aushängen</string>
<string name="module_downloading">Modul herunterladen: %s</string>
<string name="home_unsupported">Nicht unterstützt</string>
<string name="home_unsupported_reason">KernelSU unterstützt nun nur GKI kernels</string>
<string name="home_unsupported_reason">KernelSU unterstützt derzeit nur GKI-Kernel</string>
<string name="home_kernel">Kernel</string>
<string name="home_fingerprint">Fingerabdruck</string>
<string name="module_install">Installieren</string>
<string name="reboot_userspace">Leichter Neustart</string>
<string name="module_uninstall_confirm">Bist du dir sicher, dass du das Modul %s deinstallieren möchtest\?</string>
<string name="module_uninstall_confirm">Sicher, dass du das Modul %s deinstallieren möchtest\?</string>
<string name="module_uninstall_failed">Deinstallation fehlgeschlagen: %s</string>
<string name="require_kernel_version">Die jetzige Kernel-Version %d ist zu alt für diese Manager-Version. Bitte upgrade auf Version %d oder höher!</string>
<string name="require_kernel_version">Die aktuelle Kernel-Version %d ist zu alt für diese Manager-Version. Bitte auf Version %d oder höher upgraden!</string>
<string name="module_changelog">Änderungsprotokoll</string>
</resources>

View File

@@ -2,22 +2,22 @@
<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_click_to_install">Toca para instalar</string>
<string name="home_working">Funcionando</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_manager_version">Versión del gestor</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="selinux_status_disabled">Desactivado</string>
<string name="selinux_status_enforcing">Enforcing de SELinux</string>
<string name="selinux_status_permissive">Permisivo</string>
<string name="selinux_status_unknown">Desconocido</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>
@@ -28,36 +28,36 @@
<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_userspace">Reinicio minimo</string>
<string name="reboot_recovery">Reiniciar en modo de recuperación</string>
<string name="reboot_bootloader">Reiniciar en modo de arranque</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_uninstall_success">\"%s\" esta desinstalado</string>
<string name="module_uninstall_failed">No se pudo desinstalar \"%s\"</string>
<string name="module_version">Versión</string>
<string name="module_author">Autor</string>
<string name="module_overlay_fs_not_available">El módulo no puede funcionar ya que OverlayFS no está disponible</string>
<string name="module_overlay_fs_not_available">El módulo no puede funcionar ya que OverlayFS no está disponible!</string>
<string name="refresh">Recargar</string>
<string name="show_system_apps">Mostrar apps del sistema</string>
<string name="hide_system_apps">Ocultar apps del sistema</string>
<string name="send_log">Enviar registro</string>
<string name="show_system_apps">Mostrar applicaciones del sistema</string>
<string name="hide_system_apps">Ocultar applicaciones del sistema</string>
<string name="send_log">Enviar registro de informe</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="reboot_to_apply">Reinicia para aplicar cambios</string>
<string name="module_magisk_conflict">Se deshabilitaron los módulos ya que entran en conflicto con los de Magisk!</string>
<string name="home_learn_kernelsu">Aprende 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="about_source_code">Mirar el código 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">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>
@@ -65,18 +65,42 @@
<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="failed_to_update_app_profile">No se pudo actualizar el perfil de la applicación 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="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 applicaciones 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="module_start_downloading">Iniciar descarga: %s</string>
<string name="new_version_available">Nueva versión: %s está disponible, toque para actualizar</string>
<string name="launch_app">Abrir Aplicacion</string>
<string name="force_stop_app">Forzar cierre de la aplicacion</string>
<string name="restart_app">Reiniciar aplicacion</string>
<string name="failed_to_update_sepolicy">Falló al actualizar reglas de SEpolicy por: %s</string>
<string name="require_kernel_version">La versión actual de KernelSU %d es demasiado baja para que el gestor funcione correctamente. ¡Por favor actualiza a la versión %d o superior!</string>
<string name="module_changelog">Registro de cambios</string>
<string name="app_profile_template_import_success">Importado con exíto</string>
<string name="app_profile_export_to_clipboard">Exportar a portapapeles</string>
<string name="app_profile_template_export_empty">No se puede encontrar plantilla local para exportar!</string>
<string name="app_profile_template_id_exist">Ya existe un ID de la plantilla!</string>
<string name="app_profile_import_from_clipboard">Importar desde portapapeles</string>
<string name="module_changelog_failed">Error en obtener los registros de cambios: %s</string>
<string name="app_profile_template_name">Nombre</string>
<string name="app_profile_template_id_invalid">ID de la plantilla es invalido</string>
<string name="app_profile_template_sync">Sincronizar plantillas en linea</string>
<string name="app_profile_template_create">Crear plantilla</string>
<string name="app_profile_template_readonly">sololectura</string>
<string name="app_profile_import_export">Importar/Exportar</string>
<string name="app_profile_template_save_failed">Fallo en guardar plantilla</string>
<string name="app_profile_template_edit">Editar plantilla</string>
<string name="app_profile_template_id">id</string>
<string name="settings_profile_template">Plantilla del perfil de la aplicacion</string>
<string name="app_profile_template_description">Descripción</string>
<string name="app_profile_template_save">Guardar</string>
<string name="settings_profile_template_summary">Administrar las plantillas locales y de en linea del perfil de la aplicacion</string>
<string name="app_profile_template_delete">Eliminar</string>
<string name="app_profile_template_import_empty">El portapapeles esta vacio!</string>
<string name="app_profile_template_view">Ver plantilla</string>
</resources>

View File

@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="home_selinux_status">Status ng SELinux</string>
<string name="selinux_status_disabled">Hindi gumagana</string>
<string name="home_selinux_status">Katayuan ng SELinux</string>
<string name="selinux_status_disabled">Hindi pinagana</string>
<string name="selinux_status_enforcing">Enforcing</string>
<string name="selinux_status_permissive">Permissive</string>
<string name="home_not_installed">Hindi naka-install</string>
@@ -10,4 +10,60 @@
<string name="home_working">Gumagana</string>
<string name="home_working_version">Bersyon: %d</string>
<string name="selinux_status_unknown">Hindi matukoy</string>
<string name="home_module_count">Mga Modyul: %d</string>
<string name="home_unsupported">Hindi Suportado</string>
<string name="home_unsupported_reason">Sinusuportahan lang ng KernelSU ang mga kernel ng GKI ngayon</string>
<string name="module_failed_to_enable">Nabigong paganahin ang modyul: %s</string>
<string name="module_failed_to_disable">Nabigong i-disable ang modyul: %s</string>
<string name="module_empty">Walang naka-install na modyul</string>
<string name="module">Modyul</string>
<string name="module_install">I-install</string>
<string name="install">I-install</string>
<string name="reboot">I-reboot</string>
<string name="reboot_userspace">I-soft Reboot</string>
<string name="reboot_download">I-reboot sa Download</string>
<string name="reboot_edl">I-reboot sa EDL</string>
<string name="about">Tungkol</string>
<string name="module_uninstall_confirm">Sigurado ka bang gusto mong i-uninstall ang modyul %s\?</string>
<string name="module_uninstall_success">Na-uninstall ang %s</string>
<string name="module_uninstall_failed">Nabigong i-uninstall: %s</string>
<string name="module_author">May-akda</string>
<string name="module_overlay_fs_not_available">Ang overlayfs ay hindi magagamit, ang modyul ay hindi gagana!</string>
<string name="refresh">I-refresh</string>
<string name="show_system_apps">Ipakita ang mga application ng system</string>
<string name="send_log">Magpadala ng Log</string>
<string name="reboot_to_apply">I-reboot para umepekto</string>
<string name="module_magisk_conflict">Hindi pinagana ang mga modyul dahil salungat ito sa Magisk!</string>
<string name="home_learn_kernelsu">Alamin ang KernelSU</string>
<string name="home_click_to_learn_kernelsu">Matutunan kung paano mag-install ng KernelSU at gumamit ng mga modyul</string>
<string name="home_support_title">Suportahan Kami</string>
<string name="home_support_content">Ang KernelSU ay, at palaging magiging, libre, at open source. Gayunpaman, maaari mong ipakita sa amin na nagmamalasakit ka sa pamamagitan ng pagbibigay ng donasyon.</string>
<string name="about_source_code">Tingnan ang source code sa %1$s<br/>Sumali sa aming %2$s channel</string>
<string name="profile_namespace">I-mount ang namespace</string>
<string name="profile_namespace_individual">Indibidwal</string>
<string name="profile_groups">Mga Grupo</string>
<string name="profile_capabilities">Mga Kakayanan</string>
<string name="profile_selinux_context">Konteksto ng SELinux</string>
<string name="profile_umount_modules">I-unmount ang mga modyul</string>
<string name="failed_to_update_app_profile">Nabigong i-update ang App Profile para sa %s</string>
<string name="require_kernel_version">Ang kasalukuyang bersyon ng KernelSU %d ay masyadong mababa para gumana nang maayos ang manager. Mangyaring mag-upgrade sa bersyon %d o mas mataas!</string>
<string name="profile_umount_modules_summary">Ang pagpapagana sa opsyong ito ay magbibigay-daan sa KernelSU na ibalik ang anumang binagong file ng mga modyul para sa aplikasyon na ito.</string>
<string name="profile_selinux_rules">Mga Tuntunin</string>
<string name="module_downloading">Nagda-download ng modyul: %s</string>
<string name="module_start_downloading">Simulan ang pag-download: %s</string>
<string name="new_version_available">Bagong bersyon: Available ang %s, i-click upang i-download</string>
<string name="launch_app">Ilunsad</string>
<string name="force_stop_app">Pilit na I-hinto</string>
<string name="restart_app">I-restart</string>
<string name="failed_to_update_sepolicy">Nabigong i-update ang mga panuntunan ng SELinux para sa: %s</string>
<string name="home_manager_version">Bersyon ng Manager</string>
<string name="settings">Mga setting</string>
<string name="reboot_recovery">I-reboot sa Recovery</string>
<string name="reboot_bootloader">I-reboot sa Bootloader</string>
<string name="module_version">Bersyon</string>
<string name="uninstall">I-uninstall</string>
<string name="hide_system_apps">Itago ang mga application ng system</string>
<string name="profile_name">Pangalan ng profile</string>
<string name="profile_namespace_inherited">Minana</string>
<string name="settings_umount_modules_default_summary">Ang pangkalahatang default na halaga para sa \"Umount modules\" sa Mga Profile ng App. Kung pinagana, aalisin nito ang lahat ng mga pagbabago sa modyul sa system para sa mga aplikasyon na walang hanay ng Profile.</string>
</resources>

View File

@@ -3,7 +3,7 @@
<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_superuser_count">Super-utilisateurs : %d</string>
<string name="home_module_count">Modules: %d</string>
<string name="home_unsupported_reason">Actuellement, KernelSU ne supporte que les noyaux GKI</string>
<string name="home_kernel">Noyau</string>
@@ -12,7 +12,7 @@
<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="superuser">Super-utilisateur</string>
<string name="module_empty">Aucun module installé</string>
<string name="home">Accueil</string>
<string name="home_click_to_install">Appuyez ici pour installer</string>
@@ -22,7 +22,7 @@
<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="module">Modules</string>
<string name="uninstall">Désinstaller</string>
<string name="module_install">Installer</string>
<string name="module_failed_to_disable">Échec de la désactivation du module: %s</string>
@@ -34,7 +34,7 @@
<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="module_uninstall_success">%s est 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>
@@ -44,14 +44,15 @@
<string name="show_system_apps">Afficher les applications système</string>
<string name="hide_system_apps">Masquer les applications système</string>
<string name="safe_mode">Mode sans échec</string>
<string name="send_log">Envoyer les logs</string>
<string name="send_log">Rapport de journal</string>
<string name="reboot_to_apply">Redémarrez pour appliquer les modifications</string>
<string name="module_magisk_conflict">Les modules sont désactivés car ils sont en conflit avec ceux de Magisk !</string>
<string name="home_learn_kernelsu_url">https://kernelsu.org/guide/what-is-kernelsu.html</string>
<string name="home_support_title">Soutenez-nous</string>
<string name="home_click_to_learn_kernelsu">Découvrez comment installer KernelSU et utiliser les modules</string>
<string name="home_support_content">KernelSU est et restera toujours gratuit et open source. Vous pouvez cependant nous témoigner de votre soutien en nous faisant un don.</string>
<string name="about_source_code">Voir le code source sur %1$s<br/>Rejoindre notre canal %2$s</string>
<string name="about_source_code">Voir le code source sur %1$s<br/>
\nRejoindre notre canal %2$s</string>
<string name="profile_template">Modèle</string>
<string name="profile_default">Par défaut</string>
<string name="profile_custom">Personnalisé</string>
@@ -67,16 +68,39 @@
<string name="failed_to_update_app_profile">Échec de la modification du profil d\'application de %s</string>
<string name="profile_umount_modules_summary">L\'activation de cette option permettra à KernelSU de restaurer tous les fichiers modifiés par les modules de cette application.</string>
<string name="settings_umount_modules_default">Démonter les modules par défaut</string>
<string name="settings_umount_modules_default_summary">Valeur globale par défaut pour « Démonter les modules » dans les profils d\'application. Si l\'option est activée, les modifications apportées au système par les modules seront supprimées pour les applications qui n\'ont pas de profil défini.</string>
<string name="settings_umount_modules_default_summary">Valeur globale par défaut pour « Démonter les modules » dans les profils d\'application. Si l\'option est activée, les modifications apportées au système par les modules seront supprimées pour les applications qui n\'ont pas de profil défini.</string>
<string name="profile_selinux_domain">Domaine</string>
<string name="profile_selinux_rules">Règles</string>
<string name="module_update">Mettre à jour</string>
<string name="module_downloading">Téléchargement du module : %s</string>
<string name="launch_app">Lancer</string>
<string name="new_version_available">Nouvelle version : la %s est disponible, appuyez ici pour la télécharger</string>
<string name="new_version_available">La version %s est disponible, appuyez ici pour mettre à jour</string>
<string name="module_start_downloading">Début du téléchargement de : %s</string>
<string name="force_stop_app">Forcer l\'arrêt</string>
<string name="restart_app">Relancer l\'application</string>
<string name="failed_to_update_sepolicy">Échec de la mise à jour des règles de SELinux pour : %s</string>
<string name="require_kernel_version">La version actuelle (%d) de KernelSU est trop ancienne pour que le gestionnaire fonctionne correctement. Veuillez passer à la version %d ou à une version supérieure !</string>
<string name="app_profile_template_import_success">Importation réussie</string>
<string name="app_profile_export_to_clipboard">Exporter vers le presse-papiers</string>
<string name="app_profile_template_export_empty">Impossible de trouver un modèle local à exporter !</string>
<string name="app_profile_template_id_exist">L\'id du modèle existe déjà !</string>
<string name="module_changelog">Journal des modifications</string>
<string name="app_profile_import_from_clipboard">Importer à partir presse-papiers</string>
<string name="module_changelog_failed">Échec de récupération du journal des modifications : %s</string>
<string name="app_profile_template_name">Nom</string>
<string name="app_profile_template_id_invalid">id de modèle invalide</string>
<string name="app_profile_template_sync">Synchroniser les modèles en ligne</string>
<string name="app_profile_template_create">Créer un modèle</string>
<string name="app_profile_template_readonly">en lecture seule</string>
<string name="app_profile_import_export">Importer/exporter</string>
<string name="app_profile_template_save_failed">Échec de l\'enregistrement du modèle</string>
<string name="app_profile_template_edit">Modifier le modèle</string>
<string name="app_profile_template_id">id</string>
<string name="settings_profile_template">Modèles de profils d\'application</string>
<string name="app_profile_template_description">Description</string>
<string name="app_profile_template_save">Enregistrer</string>
<string name="settings_profile_template_summary">Gérer les modèles de profils d\'application locaux et en ligne</string>
<string name="app_profile_template_delete">Supprimer</string>
<string name="app_profile_template_import_empty">Le presse-papiers est vide !</string>
<string name="app_profile_template_view">Voir le modèle</string>
</resources>

View File

@@ -0,0 +1,83 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="reboot_to_apply">प्रभाव में होने के लिए रीबूट करें</string>
<string name="home_click_to_learn_kernelsu">जानें कि KernelSU कैसे स्थापित करें और मॉड्यूल का उपयोग कैसे करें</string>
<string name="selinux_status_unknown">अज्ञात</string>
<string name="show_system_apps">सिस्टम एप्प दिखाए</string>
<string name="module_uninstall_success">%s अनइंस्टॉल सफल हुआ</string>
<string name="profile_umount_modules">मॉड्यूल्स अनमाउंट करें</string>
<string name="send_log">लॉग भेजे</string>
<string name="selinux_status_disabled">डिसेबल्ड (बंद)</string>
<string name="home_support_title">हमें प्रोत्साहन दें</string>
<string name="profile_namespace_inherited">Inherited</string>
<string name="module_magisk_conflict">मॉड्यूल बंद कर दिए गए हैं क्योंकि यह मैजिक के साथ टकरा रहे है!</string>
<string name="module_changelog">क्या बदलाव हुए है</string>
<string name="selinux_status_permissive">पर्मिसिव</string>
<string name="reboot_download">डाउनलोड में रिबूट करें</string>
<string name="settings_umount_modules_default">डिफ़ॉल्ट रूप से मॉड्यूल अनमाउन्ट करें</string>
<string name="profile_umount_modules_summary">इस विकल्प को चालू करने से KernelSU को इस एप्लिकेशन के लिए मॉड्यूल द्वारा किसी भी मोडिफाइड फ़ाइल को रिस्टोर करें।</string>
<string name="profile_namespace_individual">Individual</string>
<string name="module_failed_to_enable">%s मॉड्यूल चालू करने में विफल</string>
<string name="force_stop_app">जबर्दस्ती बंद करें</string>
<string name="reboot_edl">EDL मोड में रिबूट करें</string>
<string name="restart_app">फिर से चालू करें</string>
<string name="profile_capabilities">क्षमताएं</string>
<string name="home_superuser_count">सुपरयूजर : %d</string>
<string name="module_start_downloading">%s की डाउनलोडिंग स्टार्ट करें</string>
<string name="profile_namespace_global">Global</string>
<string name="settings_umount_modules_default_summary">ऐप प्रोफाइल में \"अनमाउंट मॉड्यूल\" के लिए ग्लोबल डिफ़ॉल्ट वैल्यू। यदि चालू किया गया है, तो यह एप्लीकेशंस के लिऐ सिस्टम के सभी मॉड्यूल मोडिफिकेशन को हटा देगा जिनकी प्रोफ़ाइल सेट नहीं है।</string>
<string name="home_module_count">मॉड्यूल्स : %d</string>
<string name="selinux_status_enforcing">एनफोर्सिंग</string>
<string name="profile_selinux_context">SELinux context</string>
<string name="home_fingerprint">फिंगरप्रिंट</string>
<string name="profile_default">डिफॉल्ट</string>
<string name="launch_app">लॉन्च करें</string>
<string name="safe_mode">सेफ मोड</string>
<string name="require_kernel_version">मैनेजर के ठीक से काम करने के लिए वर्तमान KernelSU वर्जन %d बहुत कम है। कृपया वर्जन %d या उच्चतर में अपग्रेड करें!</string>
<string name="reboot_recovery">रिकवरी में रिबूट करें</string>
<string name="reboot_userspace">सॉफ्ट रिबूट</string>
<string name="profile_name">प्रोफाइल का नाम</string>
<string name="home_support_content">KernelSU मुफ़्त और ओपन सोर्स और हमेशा रहेगा। हालाँकि आप दान देकर हमें दिखा सकते हैं कि आप संरक्षण करते हैं।</string>
<string name="uninstall">अनइंस्टॉल करें</string>
<string name="profile_namespace">Namspace माउंट करें</string>
<string name="module_install">इंस्टाल करें</string>
<string name="home_click_to_install">इंस्टाल करने के लिए क्लिक करें</string>
<string name="profile_selinux_rules">नियम</string>
<string name="profile_groups">समूह</string>
<string name="module_overlay_fs_not_available">Overlayfs उपलब्ध नहीं है, मॉड्यूल काम नहीं कर सकता !</string>
<string name="module">मॉड्यूल</string>
<string name="module_author">निर्माता</string>
<string name="about">हमारे बारे में</string>
<string name="home_working_version">वर्जन: %d</string>
<string name="reboot">रीबूट करें</string>
<string name="home_unsupported_reason">KernelSU अभी केवल GKI कर्नल्स को सपोर्ट करता है</string>
<string name="home_selinux_status">SELinux स्थिति</string>
<string name="hide_system_apps">सिस्टम एप्प छिपाए</string>
<string name="module_version">वर्जन</string>
<string name="home_unsupported">सपोर्ट नहीं करता है</string>
<string name="profile_selinux_domain">डोमेन</string>
<string name="home">होम</string>
<string name="profile_custom">कस्टम</string>
<string name="profile_template">टेम्पलेट</string>
<string name="refresh">रिफ्रेश</string>
<string name="module_downloading">%s मॉड्यूल डाउनलोड हो रहा है</string>
<string name="module_update">अपडेट</string>
<string name="home_learn_kernelsu">KernelSU सीखें</string>
<string name="module_uninstall_confirm">क्या आप सच में मॉड्यूल %s को अनइंस्टॉल करना चाहते हैं\?</string>
<string name="module_uninstall_failed">%s अनइंस्टल करने में असफल</string>
<string name="superuser">सुपरयूजर</string>
<string name="settings">सेटिंग</string>
<string name="home_working">काम कर रहा है</string>
<string name="module_failed_to_disable">%s मॉड्यूल बंद करने में विफल</string>
<string name="module_empty">कोई मॉड्यूल इंस्टाल नहीं हुआ</string>
<string name="install">इंस्टाल करें</string>
<string name="home_kernel">कर्नल</string>
<string name="home_not_installed">इंस्टाल नहीं हुआ</string>
<string name="failed_to_update_app_profile">%s के लिए ऐप प्रोफ़ाइल अपडेट करने में विफल</string>
<string name="home_learn_kernelsu_url">https://kernelsu.org/guide/what-is-kernelsu.html</string>
<string name="failed_to_update_sepolicy">%s के लिए SELinux नियमों को अपटेड करने में विफल</string>
<string name="reboot_bootloader">बुटलोडर में रिबूट करें</string>
<string name="about_source_code">%1$s पर स्रोत कोड देखें<br/>हमारे %2$s चैनल से जुड़ें</string>
<string name="home_manager_version">मैनेजर वर्जन</string>
<string name="new_version_available">नया वर्जन: %s उपलब्ध है,अपग्रेड के लिए क्लिक करें</string>
</resources>

View File

@@ -1,17 +1,17 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="home_working">Dolgozik</string>
<string name="home_working">Működik</string>
<string name="home_working_version">Verzió: %d</string>
<string name="home_module_count">Modulok: %d</string>
<string name="home_unsupported_reason">KernelSU csak GKI kerneleket támogat jelenleg</string>
<string name="home_kernel">Kernel</string>
<string name="home_manager_version">Kezelő app verziója</string>
<string name="home_fingerprint">Fingerprint</string>
<string name="home_manager_version">App verziója</string>
<string name="home_fingerprint">Build Fingerprint</string>
<string name="selinux_status_disabled">Kikapcsolt</string>
<string name="reboot_download">Újraindítás letöltő módba</string>
<string name="reboot_edl">Újraindítás EDL-be</string>
<string name="about">Róla</string>
<string name="module_uninstall_confirm">Biztos vagy benne hogy eltávolítod a következő modult a %s-t\?</string>
<string name="about">Névjegy</string>
<string name="module_uninstall_confirm">Biztos vagy benne hogy eltávolítod a következő modult: %s\?</string>
<string name="module_uninstall_failed">Nem sikerült eltávolítani: %s</string>
<string name="module_author">Készítő</string>
<string name="module_overlay_fs_not_available">Overlayfs nem elérhető, a modul nem tud enélkül működni!</string>
@@ -20,10 +20,10 @@
<string name="hide_system_apps">Rejtsd el a rendszer alkalmazásokat</string>
<string name="safe_mode">Biztonságos mód</string>
<string name="module_magisk_conflict">A modul letiltva mert ütközik a Magisk verziójával!</string>
<string name="home_learn_kernelsu">Tudd többet a KernelSU-ról</string>
<string name="home_learn_kernelsu">Tudj meg többet a KernelSU-ról</string>
<string name="home_click_to_learn_kernelsu">Tudd meg hogyan telepítsd a KernelSU-t és használd moduljait</string>
<string name="home_support_title">Támogass minket</string>
<string name="about_source_code">Tekintsd meg a forráskódot ezen a helyen %1$s<br/> Csatlakozz a %2$s csatornánkhoz</string>
<string name="about_source_code">Tekintsd meg a forráskódot a %1$s-n<br/>Csatlakozz a %2$s csatornánkhoz</string>
<string name="profile_default">Alapértelmezett</string>
<string name="profile_template">Sablon</string>
<string name="profile_custom">Egyedi</string>
@@ -33,7 +33,7 @@
<string name="home_learn_kernelsu_url">https://kernelsu.org/guide/what-is-kernelsu.html</string>
<string name="profile_namespace_individual">Különálló</string>
<string name="profile_groups">Csoportok</string>
<string name="profile_capabilities">Képességek</string>
<string name="profile_capabilities">Jogosultságok</string>
<string name="profile_selinux_context">SElinux kontextus</string>
<string name="settings_umount_modules_default">Umountold a modulokat alpértelmezés szerint</string>
<string name="profile_umount_modules_summary">Ennek az opciónak az engedélyezése lehetővé teszi, hogy a KernelSU visszaállítsa az alkalmazás moduljai által módosított fájlokat.</string>
@@ -45,38 +45,38 @@
<string name="launch_app">Indítás</string>
<string name="force_stop_app">Kényszerített leállítás</string>
<string name="restart_app">újraindítás</string>
<string name="home">Otthon</string>
<string name="home">Kezdőlap</string>
<string name="home_not_installed">Nincs telepítve</string>
<string name="home_click_to_install">Kattints a telepítéshez</string>
<string name="home_superuser_count">Szuper Felhasználók: %d</string>
<string name="home_superuser_count">Engedélyezett alkalmazások: %d</string>
<string name="home_unsupported">Nem támogatott</string>
<string name="home_selinux_status">SELinux státusz</string>
<string name="selinux_status_enforcing">Érvényesítés</string>
<string name="selinux_status_permissive">Megengedő</string>
<string name="selinux_status_unknown">Ismeretlen</string>
<string name="superuser">Szuper felhasználó</string>
<string name="superuser">Superuser</string>
<string name="module_failed_to_enable">Nem sikerült engedélyezni a következő modult: %s</string>
<string name="module_failed_to_disable">Nem sikerült letiltani a következő modulokat: %s</string>
<string name="module_empty">Nincs modul telepítve</string>
<string name="module">Modul</string>
<string name="module">Modulok</string>
<string name="uninstall">Eltávolítás</string>
<string name="module_install">Telepítés</string>
<string name="install">Telepítés</string>
<string name="reboot">Újraindítás</string>
<string name="settings">Beállítások</string>
<string name="reboot_userspace">Enyhe újraindítás</string>
<string name="reboot_recovery">Újraindítás a helyreállítóba</string>
<string name="reboot_bootloader">Újraindítás a Boot betöltőbe</string>
<string name="reboot_userspace">Android felület újraindítása</string>
<string name="reboot_recovery">Újraindítás recovery-módba</string>
<string name="reboot_bootloader">Újraindítás bootloader-módba</string>
<string name="module_uninstall_success">%s eltávolítva</string>
<string name="module_version">Verzió</string>
<string name="send_log">Küld el a naplót</string>
<string name="reboot_to_apply">Indíts újra hogy érvényesítsd a változást</string>
<string name="home_support_content">A KernelSU ingyenes és nyílt forráskódú és mindig is az lesz. Te viszont megtudod mutatni azt hogy törődsz ennek a projektnek a sorsával egy adomány formájában.</string>
<string name="send_log">Fejlesztői napló küldése</string>
<string name="reboot_to_apply">Indítsd újra a készüléket hogy érvényesítsd a változást</string>
<string name="home_support_content">A KernelSU ingyenes és nyílt forráskódú és mindig is az lesz. Te viszont meg tudod mutatni azt, hogy törődsz ennek a projektnek a sorsával egy adomány formájában.</string>
<string name="profile_namespace_global">Globális</string>
<string name="profile_umount_modules">Unmountold a modulokat</string>
<string name="failed_to_update_app_profile">Nem sikerült frissíteni az App Profilt ehez %s</string>
<string name="failed_to_update_app_profile">Nem sikerült frissíteni az App Profilt ehhez %s</string>
<string name="settings_umount_modules_default_summary">A „Modulok csatlakoztatása” globális alapértelmezett értéke az alkalmazásprofilokban. Ha engedélyezve van, eltávolítja a rendszer összes modul-módosítását azoknál az alkalmazásoknál, amelyeknek nincs beállított profilja.</string>
<string name="new_version_available">Új verzió: %s elérhető, kattints a letöltéséhez</string>
<string name="failed_to_update_sepolicy">Nem sikerült frissíteni a SELinux szabályait a következőhöz: %s</string>
<string name="require_kernel_version">A jelenlegi KernelSU verzió %d túlságosan elavult ahoz hogy a menedzser tovább tudjon működni. Kérlek frissíts a %d verzióra vagy újabbra!</string>
<string name="require_kernel_version">A jelenlegi KernelSU verzió %d túlságosan elavult. Kérlek frissíts a %d verzióra vagy újabbra!</string>
</resources>

View File

@@ -8,19 +8,19 @@
<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_unsupported_reason">KernelSU saat ini hanya mendukung kernel GKI</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_permissive">Permasif</string>
<string name="selinux_status_unknown">Tidak dikenal</string>
<string name="superuser">Superuser</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_empty">Tidak ada modul yang terpasang</string>
<string name="module">Modul</string>
<string name="uninstall">Copot</string>
<string name="module_install">Pasang</string>
@@ -28,13 +28,13 @@
<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_recovery">Mulai ulang ke Recovery</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_success">%s Telah dicopot</string>
<string name="module_uninstall_failed">Gagal untuk mencopot: %s</string>
<string name="module_version">Versi</string>
<string name="module_author">Pembuat</string>
@@ -42,7 +42,7 @@
<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="send_log">Laporkan 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>
@@ -74,9 +74,32 @@
<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="new_version_available">Versi baru: %s sudah tersedia, tap untuk mengunduh</string>
<string name="launch_app">Jalankan</string>
<string name="force_stop_app">Paksa Berhenti</string>
<string name="restart_app">Mulai ulang</string>
<string name="failed_to_update_sepolicy">Gagal memperbarui aturan SELinux untuk: %s</string>
<string name="require_kernel_version">Versi KernelSU saat ini %d terlalu rendah bagi manajer untuk dapat berfungsi dengan baik. Harap tingkatkan ke versi %d atau yang lebih tinggi!</string>
<string name="module_changelog">Catatan Perubahan</string>
<string name="app_profile_template_import_success">Berhasil diimpor</string>
<string name="app_profile_export_to_clipboard">Expor ke clipboard</string>
<string name="app_profile_template_export_empty">Tidak dapat menemukan template lokal untuk di expor!</string>
<string name="app_profile_template_id_exist">Id template telah ada sebelumnya!</string>
<string name="app_profile_import_from_clipboard">Impor dari clipboard</string>
<string name="module_changelog_failed">Gagal mengambil Changelog: %s</string>
<string name="app_profile_template_name">Nama</string>
<string name="app_profile_template_id_invalid">Id template tidak valid</string>
<string name="app_profile_template_sync">Sinkronkan template online</string>
<string name="app_profile_template_create">Buat Template</string>
<string name="app_profile_import_export">Impor/Expor</string>
<string name="app_profile_template_save_failed">Gagal untuk menyimpan template</string>
<string name="app_profile_template_edit">Edit Template</string>
<string name="app_profile_template_id">id</string>
<string name="settings_profile_template">Template Profil Aplikasi</string>
<string name="app_profile_template_description">Deskripsi</string>
<string name="app_profile_template_save">Simpan</string>
<string name="settings_profile_template_summary">Atur template lokal dan online Profil Aplikasi</string>
<string name="app_profile_template_delete">Hapus</string>
<string name="app_profile_template_import_empty">Clipboard kosong!</string>
<string name="app_profile_template_view">Lihat Template</string>
</resources>

View File

@@ -39,7 +39,7 @@
<string name="module_version">Versione</string>
<string name="module_author">Autore</string>
<string name="module_overlay_fs_not_available">overlayfs non è disponibile, il modulo non può funzionare!</string>
<string name="refresh">Aggiorna</string>
<string name="refresh">Ricarica</string>
<string name="show_system_apps">Mostra app di sistema</string>
<string name="hide_system_apps">Nascondi app di sistema</string>
<string name="send_log">Invia log</string>
@@ -71,7 +71,7 @@
<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="new_version_available">Nuova versione: %s disponibile, tocca per aggiornare</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>
@@ -79,4 +79,5 @@
<string name="profile_selinux_domain">Dominio</string>
<string name="settings_umount_modules_default_summary">Il valore predefinito per \"Scollega moduli\" in Profili App. Se attivato, rimuoverà tutte le modifiche al sistema da parte dei moduli per le applicazioni che non hanno un profilo impostato.</string>
<string name="require_kernel_version">La versione attualmente installata di KernelSU (%d) è troppo vecchia ed il gestore non può funzionare correttamente. Si prega di aggiornare alla versione %d o successiva!</string>
<string name="module_changelog">Registro aggiornamenti</string>
</resources>

View File

@@ -0,0 +1,83 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="reboot_to_apply">הפעל מחדש כדי להכניס לתוקף</string>
<string name="home_click_to_learn_kernelsu">למד כיצד להתקין את KernelSU ולהשתמש במודולים</string>
<string name="selinux_status_unknown">לא ידוע</string>
<string name="show_system_apps">הצג אפליקציות מערכת</string>
<string name="module_uninstall_success">%s הוסר</string>
<string name="profile_umount_modules">הסרת טעינת מודולים</string>
<string name="send_log">שלח לוג</string>
<string name="selinux_status_disabled">מושבת</string>
<string name="home_support_title">תמכו בנו</string>
<string name="profile_namespace_inherited">ירושה</string>
<string name="module_magisk_conflict">מודולים מושבתים מכיוון שהם מתנגשים עם זה של Magisk!</string>
<string name="module_changelog">יומן שינויים</string>
<string name="selinux_status_permissive">התרים</string>
<string name="reboot_download">הפעלה מחדש למצב הורדה</string>
<string name="settings_umount_modules_default">טעינת מודולים כברירת מחדל</string>
<string name="profile_umount_modules_summary">הפעלת אפשרות זו תאפשר ל-KernelSU לשחזר קבצים שהשתנו על ידי המודולים עבור יישום זה.</string>
<string name="profile_namespace_individual">אישי</string>
<string name="module_failed_to_enable">הפעלת המודל נכשלה: %s</string>
<string name="force_stop_app">עצירה בכח</string>
<string name="reboot_edl">הפעלה מחדש למצב EDL</string>
<string name="restart_app">איתחול</string>
<string name="profile_capabilities">יכולת</string>
<string name="home_superuser_count">משתמשי על: %d</string>
<string name="module_start_downloading">מפעיל מודל: %s</string>
<string name="profile_namespace_global">גלובלי</string>
<string name="settings_umount_modules_default_summary">ערך ברירת המחדל הגלובלי עבור \"טעינת מודולים\" בפרופילי אפליקציה. אם מופעל, זה יסיר את כל שינויי המודול למערכת עבור יישומים שאין להם ערכת פרופיל.</string>
<string name="home_module_count">מודלים:%d</string>
<string name="selinux_status_enforcing">אכיפה</string>
<string name="profile_selinux_context">הקשר SELinux</string>
<string name="home_fingerprint">טביעת אצבע</string>
<string name="profile_default">ברירת מחדל</string>
<string name="launch_app">להשיק</string>
<string name="safe_mode">מצב בטוח</string>
<string name="require_kernel_version">גרסת KernelSU הנוכחית %d נמוכה מדי כדי שהמנהל יפעל כראוי. אנא שדרג לגרסה %d ומעלה!</string>
<string name="reboot_recovery">הפעלה מחדש לריקברי</string>
<string name="reboot_userspace">רך Reboot</string>
<string name="profile_name">שם פרופיל</string>
<string name="home_support_content">KernelSU הוא, ותמיד יהיה, חינמי וקוד פתוח. עם זאת, תוכל להראות לנו שאכפת לך על ידי תרומה.</string>
<string name="uninstall">הסרה</string>
<string name="profile_namespace">טעינת מרחב שמות</string>
<string name="module_install">התקנה</string>
<string name="home_click_to_install">לחץ להתקנה</string>
<string name="profile_selinux_rules">כללים</string>
<string name="profile_groups">קבוצה</string>
<string name="module_overlay_fs_not_available">שכבות-על לא זמינות, המודול לא יכול לעבוד!</string>
<string name="module">מודולים</string>
<string name="module_author">יוצר</string>
<string name="about">אודות</string>
<string name="home_working_version">גרסה: %d</string>
<string name="reboot">הפעלה מחדש</string>
<string name="home_unsupported_reason">KernelSU תומך רק בליבת GKI כעת</string>
<string name="home_selinux_status">סטטוס SELinux</string>
<string name="hide_system_apps">הסתר אפליקציות מערכת</string>
<string name="module_version">גרסה</string>
<string name="home_unsupported">אינו נתמך</string>
<string name="profile_selinux_domain">תחום</string>
<string name="home">בית</string>
<string name="profile_custom">מותאם אישית</string>
<string name="profile_template">תבנית</string>
<string name="refresh">רענון</string>
<string name="module_downloading">מוריד מודל: %s</string>
<string name="module_update">עדכון</string>
<string name="home_learn_kernelsu">למד אודות KernelSU</string>
<string name="module_uninstall_confirm">האם אתה בטוח שברצונך להסיר את התקנת המודל %s\?</string>
<string name="module_uninstall_failed">הסרת התקנת %s נכשלה:</string>
<string name="superuser">משתמש על</string>
<string name="settings">הגדרות</string>
<string name="home_working">עובד</string>
<string name="module_failed_to_disable">השבתת מודל %s נכשלה:</string>
<string name="module_empty">אין מודלים מותקנים</string>
<string name="install">להתקין</string>
<string name="home_kernel">Kernel</string>
<string name="home_not_installed">לא מותקן</string>
<string name="failed_to_update_app_profile">נכשל עדכון פרופיל האפליקציה עבור %s</string>
<string name="home_learn_kernelsu_url">https://kernelsu.org/guide/what-is-kernelsu.html</string>
<string name="failed_to_update_sepolicy">נכשל עדכון כללי SELinux עבור: %s</string>
<string name="reboot_bootloader">הפעלה מחדש לבוטלאודר</string>
<string name="about_source_code">ראה את קוד המקור ב%1$s<br/>הצטרף אלינו %2$s בערוץ</string>
<string name="home_manager_version">גרסת מנהל</string>
<string name="new_version_available">גרסה חדשה עבור: %s זמינה, לחץ כדי לשדרג</string>
</resources>

View File

@@ -8,7 +8,7 @@
<string name="home_superuser_count">スーパーユーザー: %d</string>
<string name="home_module_count">モジュール: %d</string>
<string name="home_unsupported">非対応</string>
<string name="home_unsupported_reason">KernelSU は現在、GKI カーネルにのみ対応しています</string>
<string name="home_unsupported_reason">現在、 KernelSU は GKI カーネルにのみ対応しています</string>
<string name="home_kernel">カーネル</string>
<string name="home_manager_version">バージョン</string>
<string name="home_fingerprint">Fingerprint</string>
@@ -27,14 +27,14 @@
<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">リカバリーへ再起動</string>
<string name="reboot_bootloader">Bootloader へ再起動</string>
<string name="reboot_bootloader">ブートローダー へ再起動</string>
<string name="reboot_download">ダウンロードモードへ再起動</string>
<string name="reboot_edl">EDLへ再起動</string>
<string name="reboot_edl">EDL へ再起動</string>
<string name="about">アプリについて</string>
<string name="module_uninstall_confirm">モジュール %s をアンインストールしますか?</string>
<string name="module_uninstall_success">%sアンインストールました</string>
<string name="module_uninstall_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>
@@ -45,7 +45,7 @@
<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/ja_JP/guide/what-is-kernelsu.html</string>
<string name="home_click_to_learn_kernelsu">KernelSU のインストール方法やモジュールの使い方はこちら</string>
@@ -53,31 +53,54 @@
<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>
<string name="profile_default">既定</string>
<string name="profile_template">テンプレート</string>
<string name="profile_custom">カスタム</string>
<string name="profile_name">プロファイル名</string>
<string name="profile_namespace">マウント名前空間</string>
<string name="profile_namespace">名前空間のマウント</string>
<string name="profile_namespace_inherited">継承</string>
<string name="profile_namespace_global">グローバル</string>
<string name="profile_namespace_global">共通</string>
<string name="profile_namespace_individual">分離</string>
<string name="profile_umount_modules">モジュールのアンマウント</string>
<string name="profile_groups">グループ</string>
<string name="profile_selinux_context">SELinux コンテキスト</string>
<string name="failed_to_update_app_profile">%sのアプリのプロファイルの更新をできませでした</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="new_version_available">新しいバージョン: %s が利用可能です。タップしてダウンロード</string>
<string name="module_update">アップデート</string>
<string name="module_start_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="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="profile_umount_modules_summary">このオプションを有効にすると、KernelSU はこのアプリのモジュールによって変更されたファイルを復元できるようになります。</string>
<string name="settings_umount_modules_default">既定でモジュールマウント解除</string>
<string name="settings_umount_modules_default_summary">アプリプロファイルの「モジュールのマウント解除」の共通既定値です。 有効にすると、プロファイル セットを持たないアプリでのシステムに対するすべてのモジュール変更が削除されます。</string>
<string name="require_kernel_version">現在の KernelSU バージョン %d はマネージャーが適切に機能するには低すぎます。 バージョン %d 以降にアップグレードしてください!</string>
<string name="module_changelog">変更履歴</string>
<string name="app_profile_template_import_success">インポート成功</string>
<string name="app_profile_export_to_clipboard">クリップボードからエクスポート</string>
<string name="app_profile_template_export_empty">エクスポートするローカル テンプレートが見つかりません!</string>
<string name="app_profile_template_id_exist">テンプレート id はすでに存在します!</string>
<string name="app_profile_import_from_clipboard">クリップボードからインポート</string>
<string name="module_changelog_failed">変更ログの取得に失敗しました: %s</string>
<string name="app_profile_template_name">名前</string>
<string name="app_profile_template_id_invalid">無効なテンプレート id</string>
<string name="app_profile_template_sync">オンラインテンプレートの同期</string>
<string name="app_profile_template_create">テンプレートの作成</string>
<string name="app_profile_template_readonly">読み取り専用</string>
<string name="app_profile_import_export">インポート/エクスポート</string>
<string name="app_profile_template_save_failed">テンプレートの保存に失敗しました</string>
<string name="app_profile_template_edit">テンプレートの編集</string>
<string name="app_profile_template_id">id</string>
<string name="settings_profile_template">アプリプロファイルのテンプレート</string>
<string name="app_profile_template_description">説明</string>
<string name="app_profile_template_save">保存</string>
<string name="settings_profile_template_summary">アプリプロファイルのローカルおよびオンラインテンプレートを管理する</string>
<string name="app_profile_template_delete">消去</string>
<string name="app_profile_template_import_empty">クリップボードは空です!</string>
<string name="app_profile_template_view">テンプレートを表示</string>
</resources>

View File

@@ -0,0 +1,69 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="reboot_to_apply">ಪರಿಣಾಮ ಬೀರಲು ರೀಬೂಟ್ ಮಾಡಿ</string>
<string name="home_click_to_learn_kernelsu">KernelSU ಅನ್ನು ಹೇಗೆ ಸ್ಥಾಪಿಸಬೇಕು ಮತ್ತು ಮಾಡ್ಯೂಲ್‌ಗಳನ್ನು ಬಳಸುವುದು ಹೇಗೆ ಎಂದು ತಿಳಿಯಿರಿ</string>
<string name="selinux_status_unknown">ತಿಳಿಯದ</string>
<string name="show_system_apps">ಸಿಸ್ಟಮ್ ಅಪ್ಲಿಕೇಶನ್‌ಗಳನ್ನು ತೋರಿಸಿ</string>
<string name="module_uninstall_success">%s ಅನ್‌ಇನ್‌ಸ್ಟಾಲ್ ಮಾಡಲಾಗಿದೆ</string>
<string name="profile_umount_modules">Umount ಮಾಡ್ಯೂಲ್‌ಗಳು</string>
<string name="send_log">ಲಾಗ್ ಕಳುಹಿಸಿ</string>
<string name="home_support_title">ನಮ್ಮನ್ನು ಬೆಂಬಲಿಸಿ</string>
<string name="profile_namespace_inherited">ಪಿತ್ರಾರ್ಜಿತ</string>
<string name="module_magisk_conflict">ಮಾಡ್ಯೂಲ್‌ಗಳನ್ನು ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಲಾಗಿದೆ ಏಕೆಂದರೆ ಇದು ಮ್ಯಾಜಿಸ್ಕ್‌ನೊಂದಿಗೆ ಸಂಘರ್ಷವಾಗಿದೆ!</string>
<string name="module_changelog">ಚೇಂಜ್ಲಾಗ್</string>
<string name="selinux_status_permissive">Permissive</string>
<string name="settings_umount_modules_default">ಡೀಫಾಲ್ಟ್ ಆಗಿ Umount ಮಾಡ್ಯೂಲ್</string>
<string name="profile_umount_modules_summary">ಈ ಆಯ್ಕೆಯನ್ನು ಸಕ್ರಿಯಗೊಳಿಸುವುದರಿಂದ ಈ ಅಪ್ಲಿಕೇಶನ್‌ಗಾಗಿ ಮಾಡ್ಯೂಲ್‌ಗಳ ಮೂಲಕ ಯಾವುದೇ ಮಾರ್ಪಡಿಸಿದ ಫೈಲ್‌ಗಳನ್ನು ಮರುಸ್ಥಾಪಿಸಲು KernelSU ಗೆ ಅನುಮತಿಸುತ್ತದೆ.</string>
<string name="profile_namespace_individual">ವೈಯಕ್ತಿಕ</string>
<string name="module_failed_to_enable">ಮಾಡ್ಯೂಲ್ ಅನ್ನು ಸಕ್ರಿಯಗೊಳಿಸಲು ವಿಫಲವಾಗಿದೆ: %s</string>
<string name="force_stop_app">ಫೋರ್ಸ್ ಸ್ಟಾಪ್</string>
<string name="reboot_edl">EDL ಗೆ ರೀಬೂಟ್</string>
<string name="profile_capabilities">ಸಾಮರ್ಥ್ಯಗಳು</string>
<string name="home_superuser_count">ಸೂಪರ್‌ಯೂಸರ್‌ಗಳು: %d</string>
<string name="module_start_downloading">ಡೌನ್‌ಲೋಡ್ ಮಾಡುವುದನ್ನು ಪ್ರಾರಂಭಿಸಿ: %s</string>
<string name="profile_namespace_global">ಜಾಗತಿಕ</string>
<string name="settings_umount_modules_default_summary">ಅಪ್ಲಿಕೇಶನ್ ಪ್ರೊಫೈಲ್‌ಗಳಲ್ಲಿ \"Umount ಮಾಡ್ಯೂಲ್\" ಗಾಗಿ ಜಾಗತಿಕ ಡೀಫಾಲ್ಟ್ ಮೌಲ್ಯ. ಸಕ್ರಿಯಗೊಳಿಸಿದರೆ, ಪ್ರೊಫೈಲ್ ಸೆಟ್ ಅನ್ನು ಹೊಂದಿರದ ಅಪ್ಲಿಕೇಶನ್‌ಗಳಿಗಾಗಿ ಸಿಸ್ಟಮ್‌ಗೆ ಎಲ್ಲಾ ಮಾಡ್ಯೂಲ್ ಮಾರ್ಪಾಡುಗಳನ್ನು ಇದು ತೆಗೆದುಹಾಕುತ್ತದೆ.</string>
<string name="home_module_count">ಮಾಡ್ಯೂಲ್‌ಗಳು: %d</string>
<string name="profile_selinux_context">SELinux ಸಂದರ್ಭ</string>
<string name="profile_default">ಡೀಫಾಲ್ಟ್</string>
<string name="launch_app">ಲಾಂಚ್</string>
<string name="safe_mode">ಸುರಕ್ಷಿತ ಮೋಡ್</string>
<string name="require_kernel_version">ಪ್ರಸ್ತುತ KernelSU ಆವೃತ್ತಿ %d ಮ್ಯಾನೇಜರ್ ಸರಿಯಾಗಿ ಕಾರ್ಯನಿರ್ವಹಿಸಲು ತುಂಬಾ ಕಡಿಮೆಯಾಗಿದೆ. ದಯವಿಟ್ಟು ಆವೃತ್ತಿ %d ಅಥವಾ ಹೆಚ್ಚಿನದಕ್ಕೆ ಅಪ್‌ಗ್ರೇಡ್ ಮಾಡಿ!</string>
<string name="reboot_userspace">ಸಾಫ್ಟ್ ರೀಬೂಟ್</string>
<string name="profile_name">ಪ್ರೊಫೈಲ್ ಹೆಸರು</string>
<string name="home_support_content">KernelSU ಉಚಿತ ಮತ್ತು ಮುಕ್ತ ಮೂಲವಾಗಿದೆ ಮತ್ತು ಯಾವಾಗಲೂ ಇರುತ್ತದೆ. ಆದಾಗ್ಯೂ ನೀವು ದೇಣಿಗೆ ನೀಡುವ ಮೂಲಕ ನೀವು ಕಾಳಜಿ ವಹಿಸುತ್ತೀರಿ ಎಂದು ನಮಗೆ ತೋರಿಸಬಹುದು.</string>
<string name="uninstall">ಅನ್‌ಇನ್‌ಸ್ಟಾಲ್</string>
<string name="profile_namespace">ಮೌಂಟ್ ನೇಮ್‌ಸ್ಪೇಸ್</string>
<string name="profile_selinux_rules">ನಿಯಮಗಳು</string>
<string name="profile_groups">ಗುಂಪುಗಳು</string>
<string name="module_overlay_fs_not_available">ಓವರ್‌ಲೇಫ್‌ಗಳು ಲಭ್ಯವಿಲ್ಲ, ಮಾಡ್ಯೂಲ್ ಕಾರ್ಯನಿರ್ವಹಿಸುವುದಿಲ್ಲ!</string>
<string name="module">ಮಾಡ್ಯೂಲ್</string>
<string name="module_author">ಲೇಖಕ</string>
<string name="about">ಬಗ್ಗೆ</string>
<string name="home_working_version">ವರ್ಷನ್: %d</string>
<string name="reboot">ರೀಬೂಟ್</string>
<string name="home_unsupported_reason">KernelSU ಈಗ GKI ಕರ್ನಲ್‌ಗಳನ್ನು ಮಾತ್ರ ಬೆಂಬಲಿಸುತ್ತದೆ</string>
<string name="home_selinux_status">SELinux ಸ್ಥಿತಿ</string>
<string name="hide_system_apps">ಸಿಸ್ಟಮ್ ಅಪ್ಲಿಕೇಶನ್‌ಗಳನ್ನು ಮರೆಮಾಡಿ</string>
<string name="module_version">ವರ್ಷನ್</string>
<string name="home_unsupported">ಬೆಂಬಲಿತವಾಗಿಲ್ಲ</string>
<string name="profile_selinux_domain">ಡೊಮೇನ್</string>
<string name="home">ಮನೆ</string>
<string name="profile_custom">ಕಸ್ಟಮ್</string>
<string name="profile_template">ಟೆಂಪ್ಲೇಟ್</string>
<string name="refresh">ರಿಫ್ರೆಶ್</string>
<string name="module_downloading">ಮಾಡ್ಯೂಲ್ ಅನ್ನು ಡೌನ್‌ಲೋಡ್ ಮಾಡಲಾಗುತ್ತಿದೆ: %s</string>
<string name="home_learn_kernelsu">KernelSU ಕಲಿಯಿರಿ</string>
<string name="module_uninstall_confirm">%s ಮಾಡ್ಯೂಲ್ ಅನ್ನು ಅಸ್ಥಾಪಿಸಲು ನೀವು ಖಚಿತವಾಗಿ ಬಯಸುವಿರಾ\?</string>
<string name="module_uninstall_failed">ಅನ್‌ಇನ್‌ಸ್ಟಾಲ್ ಮಾಡಲು ವಿಫಲವಾಗಿದೆ: %s</string>
<string name="superuser">ಸೂಪರ್ಯೂಸರ್</string>
<string name="home_working">ಕೆಲಸ ಮಾಡುತ್ತಿದೆ</string>
<string name="module_failed_to_disable">ಮಾಡ್ಯೂಲ್ ಅನ್ನು ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಲು ವಿಫಲವಾಗಿದೆ: %s</string>
<string name="module_empty">ಮಾಡ್ಯೂಲ್ ಅನ್ನು ಸ್ಥಾಪಿಸಲಾಗಿಲ್ಲ</string>
<string name="home_kernel">ಕರ್ನಲ್</string>
<string name="failed_to_update_app_profile">%s ಗಾಗಿ ಅಪ್ಲಿಕೇಶನ್ ಪ್ರೊಫೈಲ್ ಅನ್ನು ನವೀಕರಿಸಲು ವಿಫಲವಾಗಿದೆ</string>
<string name="home_learn_kernelsu_url">https://kernelsu.org/guide/what-is-kernelsu.html</string>
<string name="about_source_code">%1$s ನಲ್ಲಿ ಮೂಲ ಕೋಡ್ ಅನ್ನು ವೀಕ್ಷಿಸಿ<br/>ನಮ್ಮ %2$s ಚಾನಲ್‌ಗೆ ಸೇರಿ</string>
<string name="home_manager_version">ಮ್ಯಾನೇಜರ್ ವರ್ಷನ್</string>
<string name="new_version_available">ಹೊಸ ಆವೃತ್ತಿ: %s ಲಭ್ಯವಿದೆ, ಅಪ್‌ಗ್ರೇಡ್ ಮಾಡಲು ಕ್ಲಿಕ್ ಮಾಡಿ</string>
</resources>

View File

@@ -2,12 +2,12 @@
<resources>
<string name="home_fingerprint">Pirštų atspaudas</string>
<string name="selinux_status_disabled">Išjungta</string>
<string name="selinux_status_enforcing">Enforcing</string>
<string name="selinux_status_enforcing">Priverstinas</string>
<string name="selinux_status_unknown">Nežinomas</string>
<string name="superuser">Supernaudotojai</string>
<string name="module_failed_to_enable">Nepavyko įjungti modulio: %s</string>
<string name="module_failed_to_disable">Nepavyko išjungti modulio: %s</string>
<string name="selinux_status_permissive">Permissive</string>
<string name="selinux_status_permissive">Leistinas</string>
<string name="module_empty">Nėra įdiegtų modulių</string>
<string name="module">Moduliai</string>
<string name="reboot_userspace">Perkrovimas neišjungus</string>
@@ -51,7 +51,7 @@
<string name="module_update">Atnaujinti</string>
<string name="module_downloading">Atsisiunčiamas modulis: %s</string>
<string name="module_start_downloading">Pradedamas atsisiuntimas: %s</string>
<string name="new_version_available">Nauja versija: %s pasiekiama, spustelėkite norėdami atsisiųsti</string>
<string name="new_version_available">Nauja versija: %s pasiekiama, spustelėkite norėdami atsinaujinti</string>
<string name="launch_app">Paleisti</string>
<string name="force_stop_app">Priversti sustoti</string>
<string name="restart_app">Perkrauti</string>
@@ -78,4 +78,6 @@
<string name="home_support_content">KernelSU yra ir visada bus nemokamas ir atvirojo kodo. Tačiau galite parodyti, kad jums rūpi, paaukodami mums.</string>
<string name="failed_to_update_app_profile">Nepavyko atnaujinti programos profilio %s</string>
<string name="settings_umount_modules_default_summary">Visuotinė numatytoji „Modulių atjungimo“ reikšmė programų profiliuose. Jei įjungta, ji pašalins visus sistemos modulio pakeitimus programoms, kurios neturi profilio.</string>
<string name="module_changelog">Keitimų žurnalas</string>
<string name="require_kernel_version">Ši KernelSU versija %d yra per žema, kad šis vadybininkas galėtų tinkamai funkcionuoti. Prašome atsinaujinti į versiją %d ar aukščiau!</string>
</resources>

View File

@@ -0,0 +1,37 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="selinux_status_unknown">Tidak Diketahui</string>
<string name="selinux_status_disabled">Lumpuhkan</string>
<string name="selinux_status_permissive">Permisif</string>
<string name="reboot_download">Mulakan semula ke Download</string>
<string name="module_failed_to_enable">Modul tidak berjaya Diaktifkan:%s</string>
<string name="reboot_edl">Mulakan semula ke EDL</string>
<string name="home_superuser_count">Superusers%d</string>
<string name="home_module_count">Modul%d</string>
<string name="selinux_status_enforcing">Enforcing</string>
<string name="home_fingerprint">Cap Jari</string>
<string name="reboot_recovery">Mulakan semula ke Recovery</string>
<string name="reboot_userspace">Soft reboot</string>
<string name="uninstall">Padam</string>
<string name="module_install">Pasang</string>
<string name="home_click_to_install">Tekan untuk memasang</string>
<string name="module">Modul</string>
<string name="about">Tentang</string>
<string name="home_working_version">Versi%d</string>
<string name="reboot">Mulakan semula</string>
<string name="home_unsupported_reason">KernelSU ketika ini hanya menyokong kernel GKI</string>
<string name="home_selinux_status">Status SELinux</string>
<string name="home_unsupported">Tidak Disokong</string>
<string name="home">Layar Utama</string>
<string name="module_uninstall_confirm">Apakah anda pasti ingin membuang modul %s\?</string>
<string name="superuser">SuperUser</string>
<string name="settings">Tetapan</string>
<string name="home_working">Berjalan</string>
<string name="module_failed_to_disable">Gagal mematikan modul:%s</string>
<string name="module_empty">Tiada modul dipasang</string>
<string name="install">Pasang</string>
<string name="home_kernel">Kernel</string>
<string name="home_not_installed">Tidak terpasang</string>
<string name="reboot_bootloader">Mulakan semula ke bootloader</string>
<string name="home_manager_version">Versi Manager</string>
</resources>

View File

@@ -1,86 +1,85 @@
<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>
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="app_name" translatable="false">KernelSU</string>
<string name="home">Strona główna</string>
<string name="home_not_installed">Nie zainstalowano</string>
<string name="home_click_to_install">Kliknij, aby zainstalować</string>
<string name="home_working">Działa</string>
<string name="home_working_version">Wersja: %d</string>
<string name="home_superuser_count">Superużytkowników: %d</string>
<string name="home_module_count">Modułów: %d</string>
<string name="home_unsupported">Nieobsługiwany</string>
<string name="home_unsupported_reason">KernelSU obsługuje obecnie tylko jądra GKI</string>
<string name="home_kernel">Jądro</string>
<string name="home_manager_version">Wersja menedżera</string>
<string name="home_fingerprint">Odcisk</string>
<string name="home_selinux_status">Status SELinux</string>
<string name="selinux_status_disabled">Wyłączony</string>
<string name="selinux_status_enforcing">Enforcing</string>
<string name="selinux_status_permissive">Permissive</string>
<string name="selinux_status_unknown">Nieznany</string>
<string name="superuser">Superużytkownik</string>
<string name="module_failed_to_enable">Nie udało się włączyć modułu: %s</string>
<string name="module_failed_to_disable">Nie udało się wyłączyć modułu: %s</string>
<string name="module_empty">Brak zainstalowanych modułów</string>
<string name="module">Moduły</string>
<string name="uninstall">Odinstaluj</string>
<string name="module_install">Instaluj</string>
<string name="install">Instaluj</string>
<string name="reboot">Uruchom ponownie</string>
<string name="settings">Ustawienia</string>
<string name="reboot_userspace">Miękki restart</string>
<string name="reboot_recovery">Restart do trybu Recovery</string>
<string name="reboot_bootloader">Restart do trybu Bootloader</string>
<string name="reboot_download">Restart do trybu Download</string>
<string name="reboot_edl">Restart do trybu EDL</string>
<string name="about">Informacje</string>
<string name="module_uninstall_confirm">Czy na pewno chcesz odinstalować moduł %s?</string>
<string name="module_uninstall_success">Odinstalowano %s</string>
<string name="module_uninstall_failed">Nie udało się odinstalować:: %s</string>
<string name="module_version">Wersja</string>
<string name="module_author">Autor</string>
<string name="module_overlay_fs_not_available">overlayfs jest niedostępny, moduł nie zadziała!</string>
<string name="refresh">Odśwież</string>
<string name="show_system_apps">Pokaż aplikacje systemowe</string>
<string name="hide_system_apps">Ukryj aplikacje systemowe</string>
<string name="send_log">Wyślij log</string>
<string name="safe_mode">Tryb bezpieczny</string>
<string name="reboot_to_apply">Uruchom ponownie, aby zastosować zmiany</string>
<string name="module_magisk_conflict">Moduły są wyłączone, ponieważ są w konflikcie z modułami Magiska!</string>
<string name="home_learn_kernelsu">Poznaj KernelSU</string>
<string name="home_learn_kernelsu_url">https://kernelsu.org/guide/what-is-kernelsu.html</string>
<string name="home_click_to_learn_kernelsu">Dowiedz się jak zainstalować KernelSU i jak korzystać z modułów.</string>
<string name="home_support_title">Wesprzyj nas</string>
<string name="home_support_content">KernelSU jest i zawsze będzie darmowy oraz otwarty. Niemniej jednak możesz nam pokazać, że Ci zależy, wysyłając darowiznę.</string>
<string name="about_source_code"><![CDATA[Przejrzyj kod źródłowy na %1$s<br/>Dołącz do kanału %2$s]]></string>
<string name="profile" translatable="false">Profil aplikacji</string>
<string name="profile_default">Domyślny</string>
<string name="profile_template">Szablon</string>
<string name="profile_custom">Własny</string>
<string name="profile_name">Nazwa profilu</string>
<string name="profile_namespace">Przestrzeń nazw montowania</string>
<string name="profile_namespace_inherited">Odziedziczona</string>
<string name="profile_namespace_global">Globalna</string>
<string name="profile_namespace_individual">Indywidualna</string>
<string name="profile_groups">Grupy</string>
<string name="profile_capabilities">Uprawnienia</string>
<string name="profile_selinux_context">Kontekst SELinux</string>
<string name="profile_umount_modules">Odmontuj moduły</string>
<string name="failed_to_update_app_profile">Nie udało się zaktualizować profilu aplikacji dla %s</string>
<string name="settings_umount_modules_default">Domyślnie odmontuj moduły</string>
<string name="settings_umount_modules_default_summary">Globalna wartość domyślna opcji \"Odmontuj moduły\" w profilach aplikacji. Jeśli jest włączona, odwraca wszystkie modyfikacje dokonane przez moduły dla aplikacji, które nie mają ustawionego profilu.</string>
<string name="profile_umount_modules_summary">Włączenie tej opcji umożliwi KernelSU przywrócenie wszelkich zmodyfikowanych plików przez moduły dla tej aplikacji.</string>
<string name="profile_selinux_domain">Domena</string>
<string name="profile_selinux_rules">Reguły</string>
<string name="module_update">Zaktualizuj</string>
<string name="module_downloading">Pobieranie modułu: %s</string>
<string name="module_start_downloading">Rozpocznij pobieranie: %s</string>
<string name="new_version_available">Nowa wersja: %s jest dostępna, kliknij, aby zaktualizować</string>
<string name="launch_app">Uruchom</string>
<string name="force_stop_app">Wymuś zatrzymanie</string>
<string name="restart_app">Restartuj</string>
<string name="failed_to_update_sepolicy">Nie udało się zaktualizować reguł SELinux dla: %s</string>
<string name="require_kernel_version">Obecna wersja KernelSU %d jest zbyt stara, aby menedżer działał poprawnie. Prosimy o aktualizację do wersji %d lub nowszej!</string>
<string name="module_changelog">Dziennik zmian</string>
</resources>

View File

@@ -3,11 +3,11 @@
<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>
<string name="home_working">Em Execução</string>
<string name="home_working">Em execução</string>
<string name="home_working_version">Versão: %d</string>
<string name="home_superuser_count">Superusuários: %d</string>
<string name="home_module_count">Módulos: %d</string>
<string name="home_unsupported">Sem Suporte</string>
<string name="home_unsupported">Sem suporte</string>
<string name="home_unsupported_reason">KernelSU suporta apenas kernels GKI agora</string>
<string name="home_kernel">Kernel</string>
<string name="home_manager_version">Versão do gerenciador</string>
@@ -17,24 +17,24 @@
<string name="selinux_status_enforcing">Execução</string>
<string name="selinux_status_permissive">Permissivo</string>
<string name="selinux_status_unknown">Desconhecido</string>
<string name="superuser">Superusuário</string>
<string name="superuser">SuperUsuário</string>
<string name="module_failed_to_enable">Falha ao ativar o módulo: %s</string>
<string name="module_failed_to_disable">Falha ao desativar o módulo: %s</string>
<string name="module_empty">Nenhum módulo instalado</string>
<string name="module">Módulos</string>
<string name="module">Módulo</string>
<string name="uninstall">Desinstalar</string>
<string name="module_install">Instalar</string>
<string name="install">Instalar</string>
<string name="reboot">Reiniciar</string>
<string name="settings">Configurações</string>
<string name="reboot_userspace">Reinicialização Suave</string>
<string name="reboot_recovery">Reiniciar para Recuperação</string>
<string name="reboot_bootloader">Reiniciar para Bootloader</string>
<string name="reboot_download">Reiniciar para Download</string>
<string name="reboot_edl">Reiniciar para EDL</string>
<string name="reboot_userspace">Reinicialização suave</string>
<string name="reboot_recovery">Reiniciar em modo Recovery</string>
<string name="reboot_bootloader">Reiniciar em modo Bootloader</string>
<string name="reboot_download">Reiniciar em modo Download</string>
<string name="reboot_edl">Reiniciar em modo EDL</string>
<string name="about">Sobre</string>
<string name="module_uninstall_confirm">Tem certeza de que deseja desinstalar o módulo %s?</string>
<string name="module_uninstall_success">%s desinstalado</string>
<string name="module_uninstall_success">%s foi desinstalado</string>
<string name="module_uninstall_failed">Falha ao desinstalar: %s</string>
<string name="module_version">Versão</string>
<string name="module_author">Autor</string>
@@ -42,15 +42,15 @@
<string name="refresh">Atualizar</string>
<string name="show_system_apps">Mostrar apps do sistema</string>
<string name="hide_system_apps">Ocultar apps do sistema</string>
<string name="send_log">Enviar Log</string>
<string name="send_log">Reportar registrto</string>
<string name="safe_mode">Modo de segurança</string>
<string name="reboot_to_apply">Reinicie para entrar em vigor</string>
<string name="module_magisk_conflict">Os módulos estão desativados porque estão em conflito com os do Magisk!</string>
<string name="home_learn_kernelsu">Leia mais sobre o KernelSU</string>
<string name="home_learn_kernelsu_url">https://kernelsu.org/guide/what-is-kernelsu.html</string>
<string name="home_click_to_learn_kernelsu">Aprenda a instalar o KernelSU e usar os módulos</string>
<string name="home_learn_kernelsu_url">https://kernelsu.org/pt_BR/guide/what-is-kernelsu.html</string>
<string name="home_click_to_learn_kernelsu">Aprenda como instalar o KernelSU e usar módulos</string>
<string name="home_support_title">Apoie-nos</string>
<string name="home_support_content">O KernelSU é, e sempre será, gratuito e de código aberto. No entanto, você pode mostrar seu apoio fazendo uma doação.</string>
<string name="home_support_content">KernelSU sempre foi e sempre será, gratuito e de código aberto. No entanto, você pode agradecer enviando uma pequena doação.</string>
<string name="about_source_code"><![CDATA[Veja o código-fonte no %1$s<br/>Junte-se ao nosso canal do %2$s]]></string>
<string name="profile" translatable="false">Perfil do Aplicativo</string>
<string name="profile_default">Padrão</string>
@@ -64,20 +64,43 @@
<string name="profile_groups">Grupos</string>
<string name="profile_capabilities">Capacidades</string>
<string name="profile_selinux_context">Contexto do SELinux</string>
<string name="profile_umount_modules">Módulos não montados</string>
<string name="profile_umount_modules">Desmontar módulos</string>
<string name="failed_to_update_app_profile">Falha ao atualizar o Perfil do Aplicativo para %s</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 apps que não possuem um Perfil definido.</string>
<string name="settings_umount_modules_default">Desmontar módulos por padrão</string>
<string name="settings_umount_modules_default_summary">O valor padrão global para \"Desmontar módulos\" em Perfis de Aplicativos. Se ativado, ele removerá todas as modificações do módulo no sistema para apps que não possuem um Perfil definido.</string>
<string name="profile_umount_modules_summary">Ativar esta opção permitirá que o KernelSU restaure quaisquer arquivos modificados pelos módulos para este app.</string>
<string name="profile_selinux_domain">Domínio</string>
<string name="profile_selinux_rules">Regras</string>
<string name="module_update">Atualizar</string>
<string name="module_downloading">Baixando módulo: %s</string>
<string name="module_start_downloading">Iniciar o download: %s</string>
<string name="new_version_available">Nova versão: %s está disponível, clique para baixar</string>
<string name="new_version_available">Nova versão: %s está disponível, clique para atualizar</string>
<string name="launch_app">Iniciar</string>
<string name="force_stop_app">Forçar parada</string>
<string name="restart_app">Reiniciar</string>
<string name="failed_to_update_sepolicy">Falha ao atualizar as regras do SELinux para: %s</string>
<string name="require_kernel_version">A versão atual do KernelSU %d é muito baixa para o gerenciador funcionar corretamente. Por favor, atualize para a versão %d ou superior!</string>
<string name="module_changelog">Registro de alterações</string>
<string name="app_profile_template_import_success">Importado com sucesso</string>
<string name="app_profile_export_to_clipboard">Exportar para a área de transferência</string>
<string name="app_profile_template_export_empty">Não foi possível encontrar o modelo local para exportar!</string>
<string name="app_profile_template_id_exist">o ID do modelo já existe!</string>
<string name="app_profile_import_from_clipboard">Importar da área de transferência</string>
<string name="module_changelog_failed">Falha ao buscar o registro de alterações: %s</string>
<string name="app_profile_template_name">Nome</string>
<string name="app_profile_template_id_invalid">ID do modelo inválido</string>
<string name="app_profile_template_sync">Sincronizar modelos online</string>
<string name="app_profile_template_create">Criar modelo</string>
<string name="app_profile_template_readonly">somente leitura</string>
<string name="app_profile_import_export">Importar/Exportar</string>
<string name="app_profile_template_save_failed">Falha ao salvar o modelo</string>
<string name="app_profile_template_edit">Editar modelo</string>
<string name="app_profile_template_id">ID</string>
<string name="settings_profile_template">Modelo do Perfil do Aplicativo</string>
<string name="app_profile_template_description">Descrição</string>
<string name="app_profile_template_save">Salvar</string>
<string name="settings_profile_template_summary">Gerenciar modelo local e online do Perfil do Aplicativo</string>
<string name="app_profile_template_delete">Excluir</string>
<string name="app_profile_template_import_empty">A área de transferência está vazia!</string>
<string name="app_profile_template_view">Ver modelo</string>
</resources>

View File

@@ -5,7 +5,7 @@
<string name="home_click_to_install">Click pentru a instala</string>
<string name="home_working">Funcționează</string>
<string name="home_working_version">Versiune: %d</string>
<string name="home_superuser_count">Superuseri: %d</string>
<string name="home_superuser_count">Super-utilizatori: %d</string>
<string name="home_module_count">Module: %d</string>
<string name="home_unsupported">Necompatibil</string>
<string name="home_unsupported_reason">KernelSU suportă doar nuclee GKI acum</string>
@@ -17,7 +17,7 @@
<string name="selinux_status_enforcing">Obligatoriu</string>
<string name="selinux_status_permissive">Permisiv</string>
<string name="selinux_status_unknown">Necunoscut</string>
<string name="superuser">Superutilizator</string>
<string name="superuser">Super-Utilizator</string>
<string name="module_failed_to_enable">Activarea modulului %s a eșuat</string>
<string name="module_failed_to_disable">Dezactivarea modulului %s a eșuat</string>
<string name="module_empty">Niciun modul instalat</string>
@@ -42,7 +42,7 @@
<string name="refresh">Reîmprospătează</string>
<string name="show_system_apps">Arată aplicațiile de sistem</string>
<string name="hide_system_apps">Ascunde aplicațiile de sistem</string>
<string name="send_log">Trimite jurnal</string>
<string name="send_log">Raportează jurnal</string>
<string name="safe_mode">Mod sigur</string>
<string name="reboot_to_apply">Repornește pentru ca modificările să intre în vigoare</string>
<string name="module_magisk_conflict">Modulele sunt dezactivate deoarece sunt în conflict cu cele ale Magisk-ului!</string>
@@ -73,10 +73,33 @@
<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="new_version_available">Versiune nouă: %s este disponibilă, clic pentru a actualiza</string>
<string name="failed_to_update_sepolicy">Nu s-au reușit actualizările regulilor SELinux pentru: %s</string>
<string name="launch_app">Lansare</string>
<string name="force_stop_app">Oprire forțată</string>
<string name="restart_app">Repornește</string>
<string name="require_kernel_version">Versiunea actuală a KernelSU %d este prea mică pentru ca managerul să funcționeze corect. Actualizează la versiunea %d sau o versiune superioară!</string>
<string name="module_changelog">Jurnalul modificărilor</string>
<string name="app_profile_template_import_success">Importat cu succes</string>
<string name="app_profile_export_to_clipboard">Export în clipboard</string>
<string name="app_profile_template_export_empty">Nu există șabloane locale de exportat!</string>
<string name="app_profile_template_id_exist">ID-ul șablonului există deja!</string>
<string name="app_profile_import_from_clipboard">Import din clipboard</string>
<string name="module_changelog_failed">Preluarea jurnalului de modificări a eșuat: %s</string>
<string name="app_profile_template_name">Nume</string>
<string name="app_profile_template_id_invalid">ID șablon nevalid</string>
<string name="app_profile_template_sync">Sincronizează șabloanele online</string>
<string name="app_profile_template_create">Creează un șablon</string>
<string name="app_profile_template_readonly">doar citire</string>
<string name="app_profile_import_export">Import/Export</string>
<string name="app_profile_template_save_failed">Nu s-a salvat șablonul</string>
<string name="app_profile_template_edit">Editează șablonul</string>
<string name="app_profile_template_id">ID</string>
<string name="settings_profile_template">Șablon de profil al aplicației</string>
<string name="app_profile_template_description">Descriere</string>
<string name="app_profile_template_save">Salvează</string>
<string name="settings_profile_template_summary">Gestionează șablonul local și online al Profilului aplicației</string>
<string name="app_profile_template_delete">Șterge</string>
<string name="app_profile_template_import_empty">Clipboard-ul este gol!</string>
<string name="app_profile_template_view">Vizualizare șablon</string>
</resources>

View File

@@ -41,7 +41,7 @@
<string name="module_version">Версия</string>
<string name="module_author">Автор</string>
<string name="module_overlay_fs_not_available">overlayfs недоступен, модуль не может работать!</string>
<string name="refresh">Обновить</string>
<string name="refresh">Обновить страницу</string>
<string name="show_system_apps">Показать системные приложения</string>
<string name="hide_system_apps">Скрыть системные приложения</string>
<string name="send_log">Отправить лог</string>
@@ -82,4 +82,28 @@
<string name="failed_to_update_sepolicy">Не удалось обновить правила SELinux для %s</string>
<string name="launch_app">Запустить</string>
<string name="restart_app">Перезапустить</string>
<string name="require_kernel_version">Текущая версия KernelSU %d слишком низкая для правильной работы менеджера. Пожалуйста, обновите до версии %d или выше!</string>
<string name="module_changelog">Список изменений</string>
<string name="app_profile_template_import_success">Успешный импорт</string>
<string name="app_profile_export_to_clipboard">Экспортировать в буфер обмена</string>
<string name="app_profile_template_export_empty">Нет локальных шаблонов для экспорта!</string>
<string name="app_profile_template_id_exist">Шаблон с таким id уже существует!</string>
<string name="app_profile_import_from_clipboard">Импортировать из буфера обмена</string>
<string name="module_changelog_failed">Не удалось получить список изменений: %s</string>
<string name="app_profile_template_name">Название</string>
<string name="app_profile_template_id_invalid">Неверный id шаблона</string>
<string name="app_profile_template_sync">Синхронизировать онлайн-шаблоны</string>
<string name="app_profile_template_create">Создать шаблон</string>
<string name="app_profile_template_readonly">только чтение</string>
<string name="app_profile_import_export">Импорт/Экспорт</string>
<string name="app_profile_template_save_failed">Не удалось сохранить шаблон</string>
<string name="app_profile_template_edit">Редактирование шаблона</string>
<string name="app_profile_template_id">Идентификационный номер</string>
<string name="settings_profile_template">Шаблон профиля приложения</string>
<string name="app_profile_template_description">Описание</string>
<string name="app_profile_template_save">Сохранить</string>
<string name="settings_profile_template_summary">Управление локальным и онлайн-шаблоном профиля приложения</string>
<string name="app_profile_template_delete">Удалить</string>
<string name="app_profile_template_import_empty">Буфер обмена пуст!</string>
<string name="app_profile_template_view">Просмотр шаблона</string>
</resources>

View File

@@ -1,2 +1,10 @@
<?xml version="1.0" encoding="utf-8"?>
<resources></resources>
<resources>
<string name="home_superuser_count">Superkorisnici</string>
<string name="home_module_count">Moduli: %d</string>
<string name="home_click_to_install">Kliknite da instalirate</string>
<string name="home">дом</string>
<string name="home_not_installed">Nije instalirano</string>
<string name="home_working_version">Верзија: %д</string>
<string name="home_working">рад</string>
</resources>

View File

@@ -0,0 +1,15 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="selinux_status_unknown">తెలియదు</string>
<string name="module_failed_to_enable">మాడ్యూల్‌ని ప్రారంభించడంలో విఫలమైంది: %s</string>
<string name="force_stop_app">బలవంతంగా ఆపడం</string>
<string name="restart_app">పునఃప్రారంభించండి</string>
<string name="module">మాడ్యూల్</string>
<string name="about">గురించి</string>
<string name="home_selinux_status">SELinux స్థితి</string>
<string name="home">హోమ్</string>
<string name="superuser">సూపర్యూజర్</string>
<string name="module_failed_to_disable">మాడ్యూల్‌ని నిలిపివేయడంలో విఫలమైంది: %s</string>
<string name="module_empty">మాడ్యూల్ ఏదీ ఇన్‌స్టాల్ చేయబడలేదు</string>
<string name="home_not_installed">ఇన్‌స్టాల్ చేయలేదు</string>
</resources>

View File

@@ -42,7 +42,7 @@
<string name="show_system_apps">แสดงแอประบบ</string>
<string name="hide_system_apps">ซ่อนแอประบบ</string>
<string name="refresh">รีเฟรช</string>
<string name="send_log">ส่ง Log</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>
@@ -50,7 +50,7 @@
<string name="home_learn_kernelsu_url">https://kernelsu.org/guide/what-is-kernelsu.html</string>
<string name="home_click_to_learn_kernelsu">เรียนรู้วิธีการติดตั้ง 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">ดูซอร์สโค้ดที่ %1$s<br/> และเข้าร่วมช่อง %2$s ของเรา</string>
<string name="profile_custom">กำหนดเอง</string>
<string name="profile_default">ค่าเริ่มต้น</string>
@@ -72,11 +72,34 @@
<string name="profile_selinux_rules">กฎ</string>
<string name="module_downloading">กำลังดาวน์โหลดโมดูล: %s</string>
<string name="module_start_downloading">กำลังเริ่มดาวน์โหลด: %s</string>
<string name="new_version_available">เวอร์ชั่นใหม่: %s พร้อมใช้งาน คลิกเพื่อดาวน์โหล</string>
<string name="new_version_available">เวอร์ชั่นใหม่: %s พร้อมใช้งาน โปรดคลิกเพื่ออัปเกร</string>
<string name="force_stop_app">บังคับหยุด</string>
<string name="restart_app">รีสตาร์ท</string>
<string name="settings_umount_modules_default_summary">หากเปิดใช้งานค่าเริ่มต้นโดยทั่วไปสำหรับ \"Umount โมดูล\" ในโปรไฟล์แอป จะเป็นการลบการแก้ไขโมดูลทั้งหมดในระบบสำหรับแอปพลิเคชั่นที่ไม่มีการตั้งค่าโปรไฟล์</string>
<string name="launch_app">เปิด</string>
<string name="failed_to_update_sepolicy">ไม่สามารถอัปเดตกฎ SElinux สำหรับ: %s ได้</string>
<string name="require_kernel_version">KernelSU เวอร์ชั่น %d ต่ำเกินไป จะทำงานได้อย่างถูกต้อง โปรดอัปเกรดเป็นเวอร์ชัน %d หรือสูงกว่า</string>
<string name="require_kernel_version">KernelSU เวอร์ชั่น %d ต่ำเกินไป ทำให้ตัวจัดการไม่สามารถใช้งานได้อย่างถูกต้อง โปรดอัปเกรดเป็นเวอร์ชัน %d หรือที่สูงกว่า!</string>
<string name="module_changelog">บันทึกการเปลี่ยนแปลง</string>
<string name="app_profile_template_import_success">นำเข้าเสร็จสิ้น</string>
<string name="app_profile_export_to_clipboard">ส่งออกไปยังคลิปบอร์ด</string>
<string name="app_profile_template_export_empty">ไม่พบเทมเพลตในเครื่องที่จะส่งออก!</string>
<string name="app_profile_template_id_exist">มีไอดีเทมเพลตนี้อยู่แล้ว!</string>
<string name="app_profile_import_from_clipboard">นำเข้าจากคลิปบอร์ด</string>
<string name="app_profile_template_name">ชื่อ</string>
<string name="app_profile_template_id_invalid">ไอดีเทมเพลตไม่ถูกต้อง</string>
<string name="app_profile_template_sync">ซิงค์เทมเพลตออนไลน์</string>
<string name="app_profile_template_create">สร้างเทมเพลต</string>
<string name="app_profile_template_readonly">อ่านเท่านั้น</string>
<string name="app_profile_import_export">นำเข้า/ส่งออก</string>
<string name="app_profile_template_save_failed">ไม่สามารถบันทึกเทมเพลต</string>
<string name="app_profile_template_edit">แก้ไขเทมเพลต</string>
<string name="app_profile_template_id">ไอดี</string>
<string name="settings_profile_template">เทมเพลตโปรไฟล์แอป</string>
<string name="app_profile_template_description">คำอธิบาย</string>
<string name="app_profile_template_save">บันทึก</string>
<string name="settings_profile_template_summary">จัดการเทมเพลตโปรไฟล์แอปในเครื่องและเทมเพลตออนไลน์</string>
<string name="app_profile_template_delete">ลบ</string>
<string name="app_profile_template_import_empty">คลิปบอร์ดว่างเปล่า!</string>
<string name="app_profile_template_view">ดูเทมเพลต</string>
<string name="module_changelog_failed">ดึงข้อมูลบันทึกการเปลี่ยนแปลงล้มเหลว: %s</string>
</resources>

View File

@@ -1,21 +1,22 @@
<?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="app_name" translatable="false">KernelSU</string>
<string name="home">Ana Sayfa</string>
<string name="home_not_installed">Yüklenmedi</string>
<string name="home_click_to_install">Yüklemek için tı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_superuser_count">Süper kullanıcı: %d</string>
<string name="home_module_count">Modüller: %d</string>
<string name="home_unsupported">Desteklenmiyor</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="home_unsupported_reason">KernelSU şu an sadece GKI çekirdeklerini destekliyor</string>
<string name="home_kernel">Çekirdek</string>
<string name="home_manager_version">Uygulama sürümü</string>
<string name="home_fingerprint">Parmak izi</string>
<string name="home_selinux_status">SELinux durumu</string>
<string name="selinux_status_disabled">Devre dışı</string>
<string name="selinux_status_enforcing">Enforcing</string>
<string name="selinux_status_permissive">Permissive</string>
<string name="selinux_status_enforcing">Etkin(Enforcing)</string>
<string name="selinux_status_permissive">Boşta(Permissive)</string>
<string name="selinux_status_unknown">Bilinmiyor</string>
<string name="superuser">Süper kullanıcı</string>
<string name="module_failed_to_enable">Modül etkinleştirilemedi: %s</string>
@@ -28,33 +29,33 @@
<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_recovery">Kurtarma modunda yeniden başlat</string>
<string name="reboot_bootloader">Önyükleyici modunda yeniden başlat</string>
<string name="reboot_download">İndirme modunda yeniden başlat</string>
<string name="reboot_edl">EDL modunda yeniden başlat</string>
<string name="about">Hakkında</string>
<string name="module_uninstall_confirm">%s modülünü kaldırmak istediğinizden emin misiniz?</string>
<string name="module_uninstall_success">%s kaldırıldı</string>
<string name="module_uninstall_failed">%s kaldırılamadı</string>
<string name="module_uninstall_failed">Kaldırma başarısız: %s</string>
<string name="module_version">Sürüm</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="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="send_log">Günlük raporu gönder</string>
<string name="safe_mode">Güvenli mod</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 öğren</string>
<string name="reboot_to_apply">Değişikliklerin uygulanması 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_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>
<string name="home_support_content">KernelSU ücretsiz ve açık kaynaktır ve her zaman öyle kalacaktır. Ancak bağış yaparak bize değer verdiğinizi gösterebilirsiniz.</string>
<string name="about_source_code"><![CDATA[%1$s kaynak kodunu görüntüle<br/>%2$s kanalımıza katılın]]></string>
<string name="profile">Uygulama profili</string>
<string name="home_click_to_learn_kernelsu">KernelSU\'nun nasıl kurulacağını ve modüllerin nasıl kullanılacağını öğrenin</string>
<string name="home_support_title">Bizi destekleyin</string>
<string name="home_support_content">KernelSU ücretsiz ve açık kaynaklı bir yazılımdır ve her zaman öyle kalacaktır. Ancak, bize bağış yaparak destek olduğunuzu gösterebilirsiniz.</string>
<string name="about_source_code"><![CDATA[Kaynak kodunu görüntüle: %1$s<br/>%2$s kanalımıza katılın]]></string>
<string name="profile" translatable="false">Uygulama profili</string>
<string name="profile_default">Varsayılan</string>
<string name="profile_template">Örnek</string>
<string name="profile_template">Şablon</string>
<string name="profile_custom">Özel</string>
<string name="profile_name">Profil adı</string>
<string name="profile_namespace">Ad alanını bağla</string>
@@ -62,22 +63,45 @@
<string name="profile_namespace_global">Küresel</string>
<string name="profile_namespace_individual">Bireysel</string>
<string name="profile_groups">Gruplar</string>
<string name="profile_capabilities">Yetkiler</string>
<string name="profile_capabilities">Yetkinlikler</string>
<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="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ı 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">Ad alanı</string>
<string name="require_kernel_version">Mevcut KernelSU sürümü %d, yöneticinin düzgün çalışabilmesi için çok düşük. Lütfen %d veya daha yüksek bir sürüme güncelleyin!</string>
<string name="settings_umount_modules_default">Varsayılan olarak modüllerin bağlantısını kes</string>
<string name="settings_umount_modules_default_summary">Uygulamalar için "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ği etkinleştirmek, KernelSU\'nun bu uygulama için modüller tarafından değiştirilen dosyaları geri yüklemesine izin verir.</string>
<string name="profile_selinux_domain">İsim alanı</string>
<string name="profile_selinux_rules">Kurallar</string>
<string name="module_update">Güncelle</string>
<string name="module_downloading">Modül indiriliyor: %s</string>
<string name="module_start_downloading">İndirme başladı: %s</string>
<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="new_version_available">Yeni sürüm: %s mevcut, güncellemek için tıklayın</string>
<string name="launch_app">Uygulamayı başlat</string>
<string name="force_stop_app">Uygulamayı durmaya zorla</string>
<string name="restart_app">Uygulamayı yeniden başlat</string>
<string name="failed_to_update_sepolicy">%s için SELinux kuralları güncellenemedi</string>
<string name="require_kernel_version">Mevcut KernelSU sürümü %d, yöneticinin düzgün çalışması için çok düşük. Lütfen %d veya daha yüksek bir sürüme yükseltin!</string>
<string name="failed_to_update_sepolicy">Kuralların güncellenmesi başarısız oldu: %s</string>
<string name="module_changelog">Değişiklik geçmişi</string>
<string name="settings_profile_template">Uygulama profili şablonu</string>
<string name="settings_profile_template_summary">Yerel ve çevrimiçi uygulama profil şablonlarını yönetin</string>
<string name="app_profile_template_create">Şablon oluştur</string>
<string name="app_profile_template_edit">Şablonu düzenle</string>
<string name="app_profile_template_id">Kimlik</string>
<string name="app_profile_template_id_invalid">Geçersiz şablon kimliği</string>
<string name="app_profile_template_name">Şablon adı</string>
<string name="app_profile_template_description">ıklama</string>
<string name="app_profile_template_save">Kaydet</string>
<string name="app_profile_template_delete">Sil</string>
<string name="app_profile_template_view">Şablonu görüntüle</string>
<string name="app_profile_template_readonly">Salt okunur</string>
<string name="app_profile_template_id_exist">Şablon kimliği zaten var!</string>
<string name="app_profile_import_export">İçe aktar/Dışa aktar</string>
<string name="app_profile_import_from_clipboard">Panodan içe aktar</string>
<string name="app_profile_export_to_clipboard">Panodan dışa aktar</string>
<string name="app_profile_template_export_empty">Yerel şablon bulunamadı, dışa aktarılamıyor!</string>
<string name="app_profile_template_import_success">Başarıyla içe aktarıldı</string>
<string name="app_profile_template_sync">Çevrimiçi şablonları senkronize et</string>
<string name="app_profile_template_save_failed">Şablon kaydetme başarısız oldu</string>
<string name="app_profile_template_import_empty">Panolar boş!</string>
<string name="module_changelog_failed">Değişiklik geçmişi alınamadı: %s</string>
</resources>

View File

@@ -39,7 +39,7 @@
<string name="module_version">Версія</string>
<string name="module_author">Автор</string>
<string name="module_overlay_fs_not_available">overlayfs не доступний, модуль не може працювати!</string>
<string name="refresh">Оновити</string>
<string name="refresh">освіжати(Оновити)</string>
<string name="show_system_apps">Показати системні додатки</string>
<string name="hide_system_apps">Сховати системні додатки</string>
<string name="send_log">Надіслати лог</string>
@@ -79,4 +79,6 @@
<string name="restart_app">Перезапустити</string>
<string name="new_version_available">Нова версія: %s доступна, натисніть, щоб завантажити</string>
<string name="failed_to_update_sepolicy">Не вдалося оновити правила SELinux для: %s</string>
<string name="module_changelog">Журнал змін</string>
<string name="require_kernel_version">Поточна версія KernelSU %d занадто низька, щоб менеджер міг працювати належним чином. Будь ласка, оновіть до версії %d або вище!</string>
</resources>

View File

@@ -13,7 +13,7 @@
<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="new_version_available">Phiên bản mới: %s đã có, bấm để nâng cấp</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>
@@ -37,7 +37,7 @@
<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="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>
@@ -53,7 +53,7 @@
<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_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>
@@ -80,4 +80,25 @@
<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>
<string name="app_profile_template_import_success">Đã nhập thành công</string>
<string name="app_profile_export_to_clipboard">Xuất từ khay nhớ tạm</string>
<string name="app_profile_template_export_empty">Không thể tìm thấy mẫu cục bộ để xuất!</string>
<string name="app_profile_template_id_exist">id bản mẫu đã tồn tại!</string>
<string name="module_changelog">Nhật ký thay đổi</string>
<string name="app_profile_import_from_clipboard">Nhập từ khay nhớ tạm</string>
<string name="module_changelog_failed">Tìm nạp nhật ký thay đổi không thành công: %s</string>
<string name="app_profile_template_name">Tên</string>
<string name="app_profile_template_id_invalid">Id mẫu không hợp lệ</string>
<string name="app_profile_template_sync">Đồng bộ hóa các mẫu trực tuyến</string>
<string name="app_profile_template_create">Tạo Bản Mẫu</string>
<string name="app_profile_import_export">Nhập/Xuất</string>
<string name="app_profile_template_save_failed">Không lưu được mẫu</string>
<string name="app_profile_template_edit">Sửa Bản Mẫu</string>
<string name="settings_profile_template">Mẫu Hồ Sơ Ứng Dụng</string>
<string name="app_profile_template_description">Mô tả</string>
<string name="app_profile_template_save">Lưu</string>
<string name="settings_profile_template_summary">Quản lý mẫu Hồ sơ Ứng dụng cục bộ và trực tuyến</string>
<string name="app_profile_template_delete">Xóa</string>
<string name="app_profile_template_import_empty">Bảng tạm trống!</string>
<string name="app_profile_template_view">Xem Bản Mẫu</string>
</resources>

View File

@@ -74,9 +74,32 @@
<string name="module_update">更新</string>
<string name="module_downloading">正在下载模块:%s</string>
<string name="module_start_downloading">开始下载:%s</string>
<string name="new_version_available">发现新版本:%s点击下载</string>
<string name="new_version_available">发现新版本:%s点击升级</string>
<string name="launch_app">启动</string>
<string name="force_stop_app">强制停止</string>
<string name="restart_app">重新启动</string>
<string name="failed_to_update_sepolicy">为:%s 更新翻译失败</string>
</resources>
<string name="module_changelog">更新日志</string>
<string name="settings_profile_template">App Profile 模版</string>
<string name="settings_profile_template_summary">管理本地和在线的 App Profile 模版</string>
<string name="app_profile_template_create">创建模版</string>
<string name="app_profile_template_edit">编辑模版</string>
<string name="app_profile_template_id">模版 id</string>
<string name="app_profile_template_id_invalid">模版 id 不合法!</string>
<string name="app_profile_template_name">名字</string>
<string name="app_profile_template_description">描述</string>
<string name="app_profile_template_save">保存</string>
<string name="app_profile_template_delete">删除</string>
<string name="app_profile_template_view">查看模版</string>
<string name="app_profile_template_readonly">只读</string>
<string name="app_profile_template_id_exist">模版 id 已存在!</string>
<string name="app_profile_import_export">导入/导出</string>
<string name="app_profile_import_from_clipboard">从剪切板导入</string>
<string name="app_profile_export_to_clipboard">导出到剪切板</string>
<string name="app_profile_template_export_empty">没有本地模版可以导出!</string>
<string name="app_profile_template_import_success">导入成功!</string>
<string name="app_profile_template_sync">同步在线规则</string>
<string name="app_profile_template_save_failed">模版保存失败!</string>
<string name="app_profile_template_import_empty">剪切板为空!</string>
<string name="module_changelog_failed">获取更新日志失败:%s</string>
</resources>

View File

@@ -74,9 +74,10 @@
<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="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>
<string name="module_changelog">日志</string>
</resources>

View File

@@ -75,8 +75,9 @@
<string name="profile_selinux_domain">網域</string>
<string name="module_update">更新</string>
<string name="module_start_downloading">開始下載:%s</string>
<string name="new_version_available">發現新版本:%s 已可供使用,按一下即可下載</string>
<string name="new_version_available">發現新版本:%s 已可供使用,按一下即可升級</string>
<string name="launch_app">啟動</string>
<string name="force_stop_app">強制停止</string>
<string name="failed_to_update_sepolicy">無法為 %s 更新 SELinux</string>
</resources>
<string name="module_changelog">變更記錄</string>
</resources>

View File

@@ -1,6 +1,6 @@
<?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">Not installed</string>
<string name="home_click_to_install">Click to install</string>
@@ -10,21 +10,18 @@
<string name="home_module_count">Modules: %d</string>
<string name="home_unsupported">Unsupported</string>
<string name="home_unsupported_reason">KernelSU only supports GKI kernels now</string>
<string name="home_kernel">Kernel</string>
<string name="home_manager_version">Manager Version</string>
<string name="home_fingerprint">Fingerprint</string>
<string name="home_selinux_status">SELinux status</string>
<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">Superuser</string>
<string name="superuser">SuperUser</string>
<string name="module_failed_to_enable">Failed to enable module: %s</string>
<string name="module_failed_to_disable">Failed to disable module: %s</string>
<string name="module_empty">No module installed</string>
<string name="module_empty">No installed modules</string>
<string name="module">Module</string>
<string name="uninstall">Uninstall</string>
<string name="module_install">Install</string>
@@ -38,7 +35,7 @@
<string name="reboot_edl">Reboot to EDL</string>
<string name="about">About</string>
<string name="module_uninstall_confirm">Are you sure you want to uninstall module %s?</string>
<string name="module_uninstall_success">%s uninstalled</string>
<string name="module_uninstall_success">%s is uninstalled</string>
<string name="module_uninstall_failed">Failed to uninstall: %s</string>
<string name="module_version">Version</string>
<string name="module_author">Author</string>
@@ -46,7 +43,7 @@
<string name="refresh">Refresh</string>
<string name="show_system_apps">Show system apps</string>
<string name="hide_system_apps">Hide system apps</string>
<string name="send_log">Send Log</string>
<string name="send_log">Report Log</string>
<string name="safe_mode">Safe mode</string>
<string name="reboot_to_apply">Reboot to take effect</string>
<string name="module_magisk_conflict">Modules are disabled because it is conflict with Magisk\'s!</string>
@@ -79,9 +76,32 @@
<string name="module_update">Update</string>
<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="new_version_available">New version: %s is available, click to upgrade</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>
<string name="module_changelog">Changelog</string>
<string name="settings_profile_template">App Profile Template</string>
<string name="settings_profile_template_summary">Manage local and online template of App Profile</string>
<string name="app_profile_template_create">Create Template</string>
<string name="app_profile_template_edit">Edit Template</string>
<string name="app_profile_template_id">id</string>
<string name="app_profile_template_id_invalid">Invalid template id</string>
<string name="app_profile_template_name">Name</string>
<string name="app_profile_template_description">Description</string>
<string name="app_profile_template_save">Save</string>
<string name="app_profile_template_delete">Delete</string>
<string name="app_profile_template_view">View Template</string>
<string name="app_profile_template_readonly">readonly</string>
<string name="app_profile_template_id_exist">template id already exists!</string>
<string name="app_profile_import_export">Import/Export</string>
<string name="app_profile_import_from_clipboard">Import from clipboard</string>
<string name="app_profile_export_to_clipboard">Export to clipboard</string>
<string name="app_profile_template_export_empty">Can not find local template to export!</string>
<string name="app_profile_template_import_success">Imported successfully</string>
<string name="app_profile_template_sync">Sync online templates</string>
<string name="app_profile_template_save_failed">Failed to save template</string>
<string name="app_profile_template_import_empty">Clipboard is empty!</string>
<string name="module_changelog_failed">Fetch changelog failed: %s</string>
</resources>

View File

@@ -1,14 +1,15 @@
[versions]
agp = "8.0.1"
agp = "8.1.0"
kotlin = "1.8.10"
ksp = "1.8.10-1.0.9"
compose-bom = "2023.05.01"
compose-bom = "2023.06.01"
lifecycle = "2.6.1"
accompanist = "0.30.0"
navigation = "2.5.3"
accompanist = "0.30.1"
navigation = "2.6.0"
compose-destination = "1.9.42-beta"
libsu = "5.0.5"
sheets-compose-dialogs = "1.2.0"
markdown = "4.6.2"
[plugins]
agp-app = { id = "com.android.application", version.ref = "agp" }
@@ -33,7 +34,7 @@ androidx-compose-ui-tooling-preview = { group = "androidx.compose.ui", name = "u
androidx-lifecycle-runtime-ktx = { group = "androidx.lifecycle", name = "lifecycle-runtime-ktx", version.ref = "lifecycle" }
androidx-lifecycle-runtime-compose = { group = "androidx.lifecycle", name = "lifecycle-runtime-compose", version.ref = "lifecycle" }
androidx-lifecycle-viewmodel-compose = { group = "androidx.lifecycle", name = "lifecycle-viewmodel-compose", version = "lifecycle" }
androidx-lifecycle-viewmodel-compose = { group = "androidx.lifecycle", name = "lifecycle-viewmodel-compose", version.ref = "lifecycle" }
com-google-accompanist-drawablepainter = { group = "com.google.accompanist", name = "accompanist-drawablepainter", version.ref = "accompanist" }
com-google-accompanist-navigation-animation = { group = "com.google.accompanist", name = "accompanist-navigation-animation", version.ref = "accompanist" }
@@ -56,3 +57,5 @@ compose-destinations-ksp = { group = "io.github.raamcosta.compose-destinations",
sheet-compose-dialogs-core = { group = "com.maxkeppeler.sheets-compose-dialogs", name = "core", version.ref = "sheets-compose-dialogs"}
sheet-compose-dialogs-list = { group = "com.maxkeppeler.sheets-compose-dialogs", name = "list", version.ref = "sheets-compose-dialogs"}
sheet-compose-dialogs-input = { group = "com.maxkeppeler.sheets-compose-dialogs", name = "input", version.ref = "sheets-compose-dialogs"}
markdown = { group = "io.noties.markwon", name = "core", version.ref = "markdown" }

Binary file not shown.

View File

@@ -1,5 +1,7 @@
distributionBase=GRADLE_USER_HOME
distributionUrl=https\://services.gradle.org/distributions/gradle-8.1.1-bin.zip
distributionPath=wrapper/dists
zipStorePath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-8.3-bin.zip
networkTimeout=10000
validateDistributionUrl=true
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists

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