Compare commits

...

95 Commits

Author SHA1 Message Date
rifsxd
7a08683c74 kernel: remove unnecessary umount calls for configuration directories (evil modifications) 2025-02-25 19:48:20 +06:00
rifsxd
2f3f444905 ksud_magic: use unsafe block for setting PATH environment variable 2025-02-25 17:51:04 +06:00
rifsxd
7746569fe9 manager: guard isOverlayAvailable only if useOverlayFs is not used 2025-02-25 17:12:36 +06:00
dependabot[bot]
3a601f86a5 build(deps): bump the crates group (#193)
Bumps the crates group in /userspace/ksud_overlayfs with 2 updates: [clap](https://github.com/clap-rs/clap) and [clap_builder](https://github.com/clap-rs/clap).


Updates `clap` from 4.5.30 to 4.5.31
- [Release notes](https://github.com/clap-rs/clap/releases)
- [Changelog](https://github.com/clap-rs/clap/blob/master/CHANGELOG.md)
- [Commits](https://github.com/clap-rs/clap/compare/clap_complete-v4.5.30...v4.5.31)

Updates `clap_builder` from 4.5.30 to 4.5.31
- [Release notes](https://github.com/clap-rs/clap/releases)
- [Changelog](https://github.com/clap-rs/clap/blob/master/CHANGELOG.md)
- [Commits](https://github.com/clap-rs/clap/compare/v4.5.30...v4.5.31)

---
updated-dependencies:
- dependency-name: clap
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: crates
- dependency-name: clap_builder
  dependency-type: indirect
  update-type: version-update:semver-patch
  dependency-group: crates
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-02-25 15:40:24 +06:00
rifsxd
e7dab63837 manager: remove beta label from OverlayFS usage strings 2025-02-25 15:38:53 +06:00
rifsxd
487e7d0012 kernel: simplify umount calls for configuration files 2025-02-25 15:37:12 +06:00
Tiann
ee71a992a3 ksud: migrate to Rust 2024 edition 2025-02-25 15:34:27 +06:00
Tiann
195e1ba494 ksud: upgrade nom to 8.0 2025-02-25 14:11:26 +06:00
dependabot[bot]
a0e4d01269 build(deps): bump the crates group across 1 directory with 15 updates (#191)
Bumps the crates group with 13 updates in the /userspace/ksud_magic directory:

| Package | From | To |
| --- | --- | --- |
| [anyhow](https://github.com/dtolnay/anyhow) | `1.0.95` | `1.0.96` |
| [clap](https://github.com/clap-rs/clap) | `4.5.29` | `4.5.30` |
| [log](https://github.com/rust-lang/log) | `0.4.25` | `0.4.26` |
| [serde_json](https://github.com/serde-rs/json) | `1.0.138` | `1.0.139` |
| [libc](https://github.com/rust-lang/libc) | `0.2.169` | `0.2.170` |
| [tempfile](https://github.com/Stebalien/tempfile) | `3.16.0` | `3.17.1` |
| [cc](https://github.com/rust-lang/cc-rs) | `1.2.14` | `1.2.15` |
| [either](https://github.com/rayon-rs/either) | `1.13.0` | `1.14.0` |
| [flate2](https://github.com/rust-lang/flate2-rs) | `1.0.35` | `1.1.0` |
| [miniz_oxide](https://github.com/Frommi/miniz_oxide) | `0.8.4` | `0.8.5` |
| [serde](https://github.com/serde-rs/serde) | `1.0.217` | `1.0.218` |
| [typenum](https://github.com/paholg/typenum) | `1.17.0` | `1.18.0` |
| [unicode-ident](https://github.com/dtolnay/unicode-ident) | `1.0.16` | `1.0.17` |



Updates `anyhow` from 1.0.95 to 1.0.96
- [Release notes](https://github.com/dtolnay/anyhow/releases)
- [Commits](https://github.com/dtolnay/anyhow/compare/1.0.95...1.0.96)

Updates `clap` from 4.5.29 to 4.5.30
- [Release notes](https://github.com/clap-rs/clap/releases)
- [Changelog](https://github.com/clap-rs/clap/blob/master/CHANGELOG.md)
- [Commits](https://github.com/clap-rs/clap/compare/clap_complete-v4.5.29...clap_complete-v4.5.30)

Updates `log` from 0.4.25 to 0.4.26
- [Release notes](https://github.com/rust-lang/log/releases)
- [Changelog](https://github.com/rust-lang/log/blob/master/CHANGELOG.md)
- [Commits](https://github.com/rust-lang/log/compare/0.4.25...0.4.26)

Updates `serde_json` from 1.0.138 to 1.0.139
- [Release notes](https://github.com/serde-rs/json/releases)
- [Commits](https://github.com/serde-rs/json/compare/v1.0.138...v1.0.139)

Updates `libc` from 0.2.169 to 0.2.170
- [Release notes](https://github.com/rust-lang/libc/releases)
- [Changelog](https://github.com/rust-lang/libc/blob/0.2.170/CHANGELOG.md)
- [Commits](https://github.com/rust-lang/libc/compare/0.2.169...0.2.170)

Updates `tempfile` from 3.16.0 to 3.17.1
- [Changelog](https://github.com/Stebalien/tempfile/blob/master/CHANGELOG.md)
- [Commits](https://github.com/Stebalien/tempfile/compare/v3.16.0...v3.17.1)

Updates `cc` from 1.2.14 to 1.2.15
- [Release notes](https://github.com/rust-lang/cc-rs/releases)
- [Changelog](https://github.com/rust-lang/cc-rs/blob/main/CHANGELOG.md)
- [Commits](https://github.com/rust-lang/cc-rs/compare/cc-v1.2.14...cc-v1.2.15)

Updates `clap_builder` from 4.5.29 to 4.5.30
- [Release notes](https://github.com/clap-rs/clap/releases)
- [Changelog](https://github.com/clap-rs/clap/blob/master/CHANGELOG.md)
- [Commits](https://github.com/clap-rs/clap/compare/v4.5.29...v4.5.30)

Updates `either` from 1.13.0 to 1.14.0
- [Commits](https://github.com/rayon-rs/either/compare/1.13.0...1.14.0)

Updates `flate2` from 1.0.35 to 1.1.0
- [Release notes](https://github.com/rust-lang/flate2-rs/releases)
- [Changelog](https://github.com/rust-lang/flate2-rs/blob/main/CHANGELOG.md)
- [Commits](https://github.com/rust-lang/flate2-rs/compare/1.0.35...1.1.0)

Updates `miniz_oxide` from 0.8.4 to 0.8.5
- [Changelog](https://github.com/Frommi/miniz_oxide/blob/master/CHANGELOG.md)
- [Commits](https://github.com/Frommi/miniz_oxide/compare/0.8.4...0.8.5)

Updates `serde` from 1.0.217 to 1.0.218
- [Release notes](https://github.com/serde-rs/serde/releases)
- [Commits](https://github.com/serde-rs/serde/compare/v1.0.217...v1.0.218)

Updates `serde_derive` from 1.0.217 to 1.0.218
- [Release notes](https://github.com/serde-rs/serde/releases)
- [Commits](https://github.com/serde-rs/serde/compare/v1.0.217...v1.0.218)

Updates `typenum` from 1.17.0 to 1.18.0
- [Release notes](https://github.com/paholg/typenum/releases)
- [Changelog](https://github.com/paholg/typenum/blob/main/CHANGELOG.md)
- [Commits](https://github.com/paholg/typenum/compare/v1.17.0...v1.18.0)

Updates `unicode-ident` from 1.0.16 to 1.0.17
- [Release notes](https://github.com/dtolnay/unicode-ident/releases)
- [Commits](https://github.com/dtolnay/unicode-ident/compare/1.0.16...1.0.17)

---
updated-dependencies:
- dependency-name: anyhow
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: crates
- dependency-name: clap
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: crates
- dependency-name: log
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: crates
- dependency-name: serde_json
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: crates
- dependency-name: libc
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: crates
- dependency-name: tempfile
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: crates
- dependency-name: cc
  dependency-type: indirect
  update-type: version-update:semver-patch
  dependency-group: crates
- dependency-name: clap_builder
  dependency-type: indirect
  update-type: version-update:semver-patch
  dependency-group: crates
- dependency-name: either
  dependency-type: indirect
  update-type: version-update:semver-minor
  dependency-group: crates
- dependency-name: flate2
  dependency-type: indirect
  update-type: version-update:semver-minor
  dependency-group: crates
- dependency-name: miniz_oxide
  dependency-type: indirect
  update-type: version-update:semver-patch
  dependency-group: crates
- dependency-name: serde
  dependency-type: indirect
  update-type: version-update:semver-patch
  dependency-group: crates
- dependency-name: serde_derive
  dependency-type: indirect
  update-type: version-update:semver-patch
  dependency-group: crates
- dependency-name: typenum
  dependency-type: indirect
  update-type: version-update:semver-minor
  dependency-group: crates
- dependency-name: unicode-ident
  dependency-type: indirect
  update-type: version-update:semver-patch
  dependency-group: crates
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-02-25 05:09:07 +06:00
dependabot[bot]
b8b0dc724a build(deps): bump the crates group across 1 directory with 16 updates (#192)
Bumps the crates group with 14 updates in the /userspace/ksud_overlayfs directory:

| Package | From | To |
| --- | --- | --- |
| [anyhow](https://github.com/dtolnay/anyhow) | `1.0.95` | `1.0.96` |
| [clap](https://github.com/clap-rs/clap) | `4.5.29` | `4.5.30` |
| [log](https://github.com/rust-lang/log) | `0.4.25` | `0.4.26` |
| [serde_json](https://github.com/serde-rs/json) | `1.0.138` | `1.0.139` |
| [libc](https://github.com/rust-lang/libc) | `0.2.169` | `0.2.170` |
| [tempfile](https://github.com/Stebalien/tempfile) | `3.16.0` | `3.17.1` |
| [fs4](https://github.com/al8n/fs4-rs) | `0.12.0` | `0.13.0` |
| [cc](https://github.com/rust-lang/cc-rs) | `1.2.14` | `1.2.15` |
| [either](https://github.com/rayon-rs/either) | `1.13.0` | `1.14.0` |
| [flate2](https://github.com/rust-lang/flate2-rs) | `1.0.35` | `1.1.0` |
| [miniz_oxide](https://github.com/Frommi/miniz_oxide) | `0.8.4` | `0.8.5` |
| [serde](https://github.com/serde-rs/serde) | `1.0.217` | `1.0.218` |
| [typenum](https://github.com/paholg/typenum) | `1.17.0` | `1.18.0` |
| [unicode-ident](https://github.com/dtolnay/unicode-ident) | `1.0.16` | `1.0.17` |



Updates `anyhow` from 1.0.95 to 1.0.96
- [Release notes](https://github.com/dtolnay/anyhow/releases)
- [Commits](https://github.com/dtolnay/anyhow/compare/1.0.95...1.0.96)

Updates `clap` from 4.5.29 to 4.5.30
- [Release notes](https://github.com/clap-rs/clap/releases)
- [Changelog](https://github.com/clap-rs/clap/blob/master/CHANGELOG.md)
- [Commits](https://github.com/clap-rs/clap/compare/clap_complete-v4.5.29...clap_complete-v4.5.30)

Updates `log` from 0.4.25 to 0.4.26
- [Release notes](https://github.com/rust-lang/log/releases)
- [Changelog](https://github.com/rust-lang/log/blob/master/CHANGELOG.md)
- [Commits](https://github.com/rust-lang/log/compare/0.4.25...0.4.26)

Updates `serde_json` from 1.0.138 to 1.0.139
- [Release notes](https://github.com/serde-rs/json/releases)
- [Commits](https://github.com/serde-rs/json/compare/v1.0.138...v1.0.139)

Updates `libc` from 0.2.169 to 0.2.170
- [Release notes](https://github.com/rust-lang/libc/releases)
- [Changelog](https://github.com/rust-lang/libc/blob/0.2.170/CHANGELOG.md)
- [Commits](https://github.com/rust-lang/libc/compare/0.2.169...0.2.170)

Updates `tempfile` from 3.16.0 to 3.17.1
- [Changelog](https://github.com/Stebalien/tempfile/blob/master/CHANGELOG.md)
- [Commits](https://github.com/Stebalien/tempfile/compare/v3.16.0...v3.17.1)

Updates `fs4` from 0.12.0 to 0.13.0
- [Release notes](https://github.com/al8n/fs4-rs/releases)
- [Changelog](https://github.com/al8n/fs4-rs/blob/main/CHANGELOG.md)
- [Commits](https://github.com/al8n/fs4-rs/commits)

Updates `cc` from 1.2.14 to 1.2.15
- [Release notes](https://github.com/rust-lang/cc-rs/releases)
- [Changelog](https://github.com/rust-lang/cc-rs/blob/main/CHANGELOG.md)
- [Commits](https://github.com/rust-lang/cc-rs/compare/cc-v1.2.14...cc-v1.2.15)

Updates `clap_builder` from 4.5.29 to 4.5.30
- [Release notes](https://github.com/clap-rs/clap/releases)
- [Changelog](https://github.com/clap-rs/clap/blob/master/CHANGELOG.md)
- [Commits](https://github.com/clap-rs/clap/compare/v4.5.29...v4.5.30)

Updates `either` from 1.13.0 to 1.14.0
- [Commits](https://github.com/rayon-rs/either/compare/1.13.0...1.14.0)

Updates `flate2` from 1.0.35 to 1.1.0
- [Release notes](https://github.com/rust-lang/flate2-rs/releases)
- [Changelog](https://github.com/rust-lang/flate2-rs/blob/main/CHANGELOG.md)
- [Commits](https://github.com/rust-lang/flate2-rs/compare/1.0.35...1.1.0)

Updates `miniz_oxide` from 0.8.4 to 0.8.5
- [Changelog](https://github.com/Frommi/miniz_oxide/blob/master/CHANGELOG.md)
- [Commits](https://github.com/Frommi/miniz_oxide/compare/0.8.4...0.8.5)

Updates `serde` from 1.0.217 to 1.0.218
- [Release notes](https://github.com/serde-rs/serde/releases)
- [Commits](https://github.com/serde-rs/serde/compare/v1.0.217...v1.0.218)

Updates `serde_derive` from 1.0.217 to 1.0.218
- [Release notes](https://github.com/serde-rs/serde/releases)
- [Commits](https://github.com/serde-rs/serde/compare/v1.0.217...v1.0.218)

Updates `typenum` from 1.17.0 to 1.18.0
- [Release notes](https://github.com/paholg/typenum/releases)
- [Changelog](https://github.com/paholg/typenum/blob/main/CHANGELOG.md)
- [Commits](https://github.com/paholg/typenum/compare/v1.17.0...v1.18.0)

Updates `unicode-ident` from 1.0.16 to 1.0.17
- [Release notes](https://github.com/dtolnay/unicode-ident/releases)
- [Commits](https://github.com/dtolnay/unicode-ident/compare/1.0.16...1.0.17)

---
updated-dependencies:
- dependency-name: anyhow
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: crates
- dependency-name: clap
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: crates
- dependency-name: log
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: crates
- dependency-name: serde_json
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: crates
- dependency-name: libc
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: crates
- dependency-name: tempfile
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: crates
- dependency-name: fs4
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: crates
- dependency-name: cc
  dependency-type: indirect
  update-type: version-update:semver-patch
  dependency-group: crates
- dependency-name: clap_builder
  dependency-type: indirect
  update-type: version-update:semver-patch
  dependency-group: crates
- dependency-name: either
  dependency-type: indirect
  update-type: version-update:semver-minor
  dependency-group: crates
- dependency-name: flate2
  dependency-type: indirect
  update-type: version-update:semver-minor
  dependency-group: crates
- dependency-name: miniz_oxide
  dependency-type: indirect
  update-type: version-update:semver-patch
  dependency-group: crates
- dependency-name: serde
  dependency-type: indirect
  update-type: version-update:semver-patch
  dependency-group: crates
- dependency-name: serde_derive
  dependency-type: indirect
  update-type: version-update:semver-patch
  dependency-group: crates
- dependency-name: typenum
  dependency-type: indirect
  update-type: version-update:semver-minor
  dependency-group: crates
- dependency-name: unicode-ident
  dependency-type: indirect
  update-type: version-update:semver-patch
  dependency-group: crates
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-02-25 05:08:51 +06:00
Vndkbopp77
39777f301d Create strings.xml (#189)
Add german translation
2025-02-25 00:42:22 +06:00
Azyr Ruthless
f20662c6b6 manager: update Indonesian translations (#188)
Signed-off-by: AzyrRuthless <132790292+AzyrRuthless@users.noreply.github.com>
2025-02-24 20:45:23 +06:00
Kangmin Kim
3532f20b2f Update Korean strings.xml (#187)
Make strings more formal
Add new strings
2025-02-24 20:44:10 +06:00
Anaël
14218e81be Update french translations (#184)
* Update french translations

* update french translation

* fix french translation typo

* add french translations

* Update french translations and fix typos
2025-02-24 20:40:59 +06:00
igor
d104250770 manager: update translations (#183) 2025-02-24 20:38:15 +06:00
rifsxd
6100df6f8c manager: remove redundant enabled state check in SettingScreen 2025-02-24 20:33:25 +06:00
rifsxd
e597bd1c66 manager: MINIMAL_SUPPORTED_SU_COMPAT set to 12402 to support disable sucompat mode in settings 2025-02-24 04:26:56 +06:00
Wang Han
0038ba6566 Fix reference count leak in nuke_ext4_sysfs() (#2467)
We need to call path_put() to decrease the refcount.
2025-02-24 02:48:39 +06:00
Js0n
7bebb2a461 fix: crash #2463 (#2465)
my bad
2025-02-24 02:48:21 +06:00
Js0n
f3fee49f8c feat: properly set OkHttp header (#2463)
properly send `User-Agent` and `Accept-Language` to `updateJson` server,
module developers can check `User-Agent` whether to send update to user
and set user preferred language for changelog.

also added cache to reduce update server load
2025-02-24 02:48:01 +06:00
rifsxd
e8c080ba09 src: adapt git links to KernelSU-Next org 2025-02-24 02:18:02 +06:00
Rifat Azad
785d8143fb kernel: remove KSU_WITH_KPROBES definition since it's already defined by Kconfig 2025-02-24 01:29:28 +06:00
backslashxx
cd0031e8a5 kernel: expose variables used by manual hooks always 2025-02-23 22:58:00 +06:00
rifsxd
c1273d35f4 manager: fix native jni calls and minor change to strings 2025-02-23 22:42:30 +06:00
backslashxx
15371bb1d6 kernel: add non-kprobe support for sucompat disable/enable
I have no idea if this is needed or any useful for manual fs hooks users.
Upstream, this is likely to, well, simply disable hooking of those functions,
to remove and mitigate timing issues as some detection methods can actually
differentiate these.

This is done like how vfs_read_hook, input_hook and execve_hook is disabled.
While this is not exactly the same thing, this *CAN* achieve the same results.
The complete disabling of all KernelSU hooks.

While this is probably not so useful for us, honestly, I have no idea for shit
what I am doing, but lets still port it for the sake of feature parity.

cherry pick from:
	kernel: backport support for sucompat disable/enable
	https://github.com/backslashxx/KernelSU/commit/20ffabb

Signed-off-by: backslashxx <118538522+backslashxx@users.noreply.github.com>
2025-02-23 22:11:50 +06:00
backslashxx
097451d578 kernel: guard functionality that requires kprobes
Since upstream is now making kprobes a requirement, we adapt this tree to still allow
building with manual hooks in an easier way. Furthermore, this also allows a user to
build with manual hooks even with kprobes enabled.

Offending commit:
	kernel: remove unused CONFIG guard becuase GKI kernel enable kprobe by default
	upstream: https://github.com/tiann/KernelSU/commit/500ff9b

Other changes:
	ksud.c, stop_input_hook(), short-circuit redundant logic left by this change.
	cherry pick from: https://github.com/backslashxx/KernelSU/commit/a3d3e93

Signed-off-by: backslashxx <118538522+backslashxx@users.noreply.github.com>
2025-02-23 21:00:59 +06:00
weishu
85866848ea kernel: Allow to re-enable sucompat 2025-02-23 20:37:34 +06:00
weishu
d05d16c15d manager: Add support to disable sucompat mode. 2025-02-23 20:06:09 +06:00
weishu
bb6c20339c kernel: add support for disable sucompat 2025-02-23 20:05:55 +06:00
igor
af012ce349 Update portuguese translation (#182) 2025-02-23 00:07:55 +06:00
Wang Han
43d30c8f2b Drop module image if no module remaining (#2447)
This fixes the issue that module image will always exist even if there
is no module to be loaded. Sadly we need to boot twice because we can
only know module status after image is mounted.
2025-02-22 04:50:51 +06:00
Wang Han
a89985f33e Allow toggling unmount setting for all apps (#2450)
This fixes https://github.com/tiann/KernelSU/issues/2416.
2025-02-22 04:48:44 +06:00
rifsxd
42896dfab1 kernel: add umount calls for pixelify gphotos spoof configs and lsposed dex2oat bin 2025-02-22 04:40:28 +06:00
Wang Han
36111f4b89 Provide TMPDIR for boot image repacking (#2458)
/data/local/tmp is never writable for normal apps, why previously it
works is that Rust's temp_dir() gets path from env, and since A13,
TMPDIR is set to app's cache dir. This is not the case for A12, so it
breaks. Fix it by set TMPDIR ourselves.
2025-02-21 17:33:21 +06:00
weishu
74171a2930 kernel: unregister sysfs for module's ext4 image 2025-02-21 17:02:33 +06:00
weishu
c40bfd694c ksud: determine modules's size by checking partion size 2025-02-21 17:02:03 +06:00
rifsxd
aa22fd880d ksud_overlayfs: better hide modules.img (create a sparse image without journaling) and run e2fsck for eliminating possible data corruption after umount 2025-02-21 16:57:24 +06:00
rifsxd
fe9578433c manager: update module installation prompt string 2025-02-21 16:49:11 +06:00
rifsxd
a0278b1e45 manager: refactor: remove FlashModule and update navigation to FlashModules 2025-02-21 16:38:00 +06:00
rifsxd
0c7ba4dc6e manager: fix syntax and unresolved function 2025-02-21 00:27:57 +06:00
Tiann
b98c531ff8 manager: refine flashing module confirm dialog 2025-02-21 00:16:21 +06:00
Tiann
373025248d manager: refine flash utilities 2025-02-20 23:45:04 +06:00
Kangmin Kim
60d2ad39d6 Update Korean Translation & Add Vietnamese README link (#173)
* Update allowlist-related Korean Strings

* Add Vietnamease README Link to other READMEs
2025-02-20 19:41:56 +06:00
HiN
b807b38892 add strings translate indonesia (#174) 2025-02-20 19:41:35 +06:00
Nhật Minh
5ca5e2b027 update vietnamese (#170)
* Create strings.xml

added vietnamese (fix smt
)

* Update strings.xml

* update vietnamese

* added vietnamese for readme
2025-02-17 18:15:54 +06:00
dependabot[bot]
608e949e23 build(deps): bump the crates group across 1 directory with 2 updates (#167)
Bumps the crates group with 2 updates in the /userspace/ksud_overlayfs directory: [cc](https://github.com/rust-lang/cc-rs) and [equivalent](https://github.com/indexmap-rs/equivalent).


Updates `cc` from 1.2.13 to 1.2.14
- [Release notes](https://github.com/rust-lang/cc-rs/releases)
- [Changelog](https://github.com/rust-lang/cc-rs/blob/main/CHANGELOG.md)
- [Commits](https://github.com/rust-lang/cc-rs/compare/cc-v1.2.13...cc-v1.2.14)

Updates `equivalent` from 1.0.1 to 1.0.2
- [Commits](https://github.com/indexmap-rs/equivalent/compare/v1.0.1...v1.0.2)

---
updated-dependencies:
- dependency-name: cc
  dependency-type: indirect
  update-type: version-update:semver-patch
  dependency-group: crates
- dependency-name: equivalent
  dependency-type: indirect
  update-type: version-update:semver-patch
  dependency-group: crates
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-02-16 21:57:41 +06:00
dependabot[bot]
c9dd12d50b build(deps): bump the maven group across 1 directory with 5 updates (#160)
Bumps the maven group with 5 updates in the /manager directory:

| Package | From | To |
| --- | --- | --- |
| androidx.navigation:navigation-compose | `2.8.6` | `2.8.7` |
| androidx.compose:compose-bom | `2025.01.01` | `2025.02.00` |
| com.android.application | `8.8.0` | `8.8.1` |
| com.android.library | `8.8.0` | `8.8.1` |
| [com.google.devtools.ksp](https://github.com/google/ksp) | `2.1.10-1.0.29` | `2.1.10-1.0.30` |



Updates `androidx.navigation:navigation-compose` from 2.8.6 to 2.8.7

Updates `androidx.compose:compose-bom` from 2025.01.01 to 2025.02.00

Updates `com.android.application` from 8.8.0 to 8.8.1

Updates `com.android.library` from 8.8.0 to 8.8.1

Updates `com.android.library` from 8.8.0 to 8.8.1

Updates `com.google.devtools.ksp` from 2.1.10-1.0.29 to 2.1.10-1.0.30
- [Release notes](https://github.com/google/ksp/releases)
- [Commits](https://github.com/google/ksp/compare/2.1.10-1.0.29...2.1.10-1.0.30)

---
updated-dependencies:
- dependency-name: androidx.navigation:navigation-compose
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: maven
- dependency-name: androidx.compose:compose-bom
  dependency-type: direct:production
  dependency-group: maven
- dependency-name: com.android.application
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: maven
- dependency-name: com.android.library
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: maven
- dependency-name: com.android.library
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: maven
- dependency-name: com.google.devtools.ksp
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: maven
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-02-16 21:57:29 +06:00
dependabot[bot]
7319dd25a3 build(deps): bump the crates group across 1 directory with 2 updates (#168)
Bumps the crates group with 2 updates in the /userspace/ksud_magic directory: [cc](https://github.com/rust-lang/cc-rs) and [equivalent](https://github.com/indexmap-rs/equivalent).


Updates `cc` from 1.2.13 to 1.2.14
- [Release notes](https://github.com/rust-lang/cc-rs/releases)
- [Changelog](https://github.com/rust-lang/cc-rs/blob/main/CHANGELOG.md)
- [Commits](https://github.com/rust-lang/cc-rs/compare/cc-v1.2.13...cc-v1.2.14)

Updates `equivalent` from 1.0.1 to 1.0.2
- [Commits](https://github.com/indexmap-rs/equivalent/compare/v1.0.1...v1.0.2)

---
updated-dependencies:
- dependency-name: cc
  dependency-type: indirect
  update-type: version-update:semver-patch
  dependency-group: crates
- dependency-name: equivalent
  dependency-type: indirect
  update-type: version-update:semver-patch
  dependency-group: crates
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-02-16 21:57:12 +06:00
rifsxd
fdd307fe8b ksud_overlayfs: bring back journaling for sparse image (futile for hiding so reverting until a possible better way is discovered) 2025-02-16 20:36:03 +06:00
igor
b6c8203a97 Update translations (#165) 2025-02-16 16:02:05 +06:00
rifsxd
b2a8fb66d3 ksud_overlayfs: reduce sparse image size to 6GB 2025-02-16 03:10:30 +06:00
rifsxd
74f55dd807 manager: disable restore module button on overlayfs mount mode (since the restore module code for overlayfs mount never got out of internal testing, wull be implemented in the future) 2025-02-16 03:07:36 +06:00
rifsxd
8560f35c8b manager: added divider for backup and restore screen catagories 2025-02-15 19:51:39 +06:00
rifsxd
b0f01cf7ff docs: fix nightly manager link (#164) 2025-02-15 19:51:39 +06:00
rifsxd
8ae0192b47 manager: update Chinese translations (@Xiaomichael) 2025-02-15 19:51:38 +06:00
rifsxd
f247a6d5d8 ksud_overlayfs: better hide modules.img (create a sparse image without journaling) and run e2fsck for eliminating possible data corruption after umount 2025-02-15 19:51:30 +06:00
rifsxd
d85bff2943 manager: added allowlist backup and restore (#9)
manager: create separate module & restore screen
2025-02-15 02:00:24 +06:00
rifsxd
f5ac0f3589 manager: renamed log files output 2025-02-14 21:54:12 +06:00
rifsxd
a2fcd157a2 Revert "kernel: do not umount modules by default"
This reverts commit bbb05b292a.
2025-02-14 21:32:43 +06:00
rifsxd
70ce97660e manager: fix syntax for strings of zh-CN 2025-02-14 21:17:51 +06:00
Kangmin Kim
67967a8251 Update Korean strings.xml (#158) 2025-02-14 20:16:33 +06:00
rifsxd
b25a21770d manager: updated Chinese translations (by @Xiaomichael) 2025-02-14 20:13:55 +06:00
rifsxd
bbb05b292a kernel: do not umount modules by default 2025-02-14 19:45:19 +06:00
rifsxd
8696ed8f36 Revert "manager: fix umountModule toggle not showing as enabled after manager restart"
This reverts commit 682f93667b.
2025-02-14 19:34:46 +06:00
rifsxd
682f93667b manager: fix umountModule toggle not showing as enabled after manager restart 2025-02-14 12:52:44 +06:00
rifsxd
00cab2209e manager: added developer options toggle
manager: removed module card onClick open webui
manager: diabled umount modules by default
2025-02-13 23:17:48 +06:00
Wang Han
b6fcea9277 Hide namespace config in app profiles (#2426)
This is never implemented in kernel (and likely never will be), so let's
remove it from UI for now to avoid misleading users.
2025-02-13 20:09:44 +06:00
rifsxd
623f5e3f64 manager: avoid factory data reset popup when rebooting into recovery 2025-02-13 20:08:32 +06:00
Caner Karaca
b18f89b434 Updates (#151)
* Update

* Fix
2025-02-13 05:54:36 +06:00
Kangmin Kim
2a152fdb22 Fix Nightly Release Download Link (#152)
* Update README.md

Fix Nightly Release Download Link

* Update every other READMEs
2025-02-13 04:05:05 +06:00
Nhật Minh
dbadad1027 Create strings.xml (#139)
added vietnamese (fix smt
)
2025-02-10 14:03:13 +06:00
rifsxd
fcc4f0d206 ksud_overlayfs: fix sparse image journal size being 0 block and cause error to format into ext4 with mke2fs 2025-02-07 14:23:56 +06:00
rifsxd
c20fe6c886 ksud_overlayfs: changed sparse image journal size to 64MB for good balance of performance and efficiency 2025-02-06 19:22:48 +06:00
5ec1cff
19a15a71eb ksud: fix stat 2025-02-06 18:56:29 +06:00
rifsxd
c446ee76f5 github: fix outdated link in issue_templete 2025-02-06 18:05:33 +06:00
rifsxd
5435992911 kernel: KernelSU-Next version fallback set to 11998 2025-02-06 17:58:00 +06:00
weishu
c2ae844f65 manager: Create a new root shell for action.sh to avoid blocking the global root shell. 2025-02-06 17:49:36 +06:00
weishu
8832532f09 ksud: make clippy happy 2025-02-06 17:46:14 +06:00
Furkan
cba275cde2 Small Fix Turkish strings.xml (#113)
Trying to fix Superuser text spacing problem on Turkish translate with deleting blank space, changing module section to Modules section (Moduller) to be able to add plural meaning.
2025-02-02 23:34:51 +06:00
rifsxd
4401e28f57 Revert "build(deps): bump the crates group across 1 directory with 9 updates (#103)"
This reverts commit d4db74f0fb.
2025-02-02 22:55:41 +06:00
rifsxd
ece6e3f694 Revert "build(deps): bump the crates group across 1 directory with 9 updates (#104)"
This reverts commit e931792a4f.
2025-02-02 22:54:42 +06:00
dependabot[bot]
d4db74f0fb build(deps): bump the crates group across 1 directory with 9 updates (#103)
Bumps the crates group with 7 updates in the /userspace/ksud_overlayfs directory:

| Package | From | To |
| --- | --- | --- |
| [serde_json](https://github.com/serde-rs/json) | `1.0.137` | `1.0.138` |
| [nom](https://github.com/rust-bakery/nom) | `7.1.3` | `8.0.0` |
| [tempfile](https://github.com/Stebalien/tempfile) | `3.15.0` | `3.16.0` |
| [bumpalo](https://github.com/fitzgen/bumpalo) | `3.16.0` | `3.17.0` |
| [cpufeatures](https://github.com/RustCrypto/utils) | `0.2.16` | `0.2.17` |
| [ryu](https://github.com/dtolnay/ryu) | `1.0.18` | `1.0.19` |
| [unicode-ident](https://github.com/dtolnay/unicode-ident) | `1.0.15` | `1.0.16` |



Updates `serde_json` from 1.0.137 to 1.0.138
- [Release notes](https://github.com/serde-rs/json/releases)
- [Commits](https://github.com/serde-rs/json/compare/v1.0.137...v1.0.138)

Updates `nom` from 7.1.3 to 8.0.0
- [Changelog](https://github.com/rust-bakery/nom/blob/main/CHANGELOG.md)
- [Commits](https://github.com/rust-bakery/nom/compare/7.1.3...8.0.0)

Updates `tempfile` from 3.15.0 to 3.16.0
- [Changelog](https://github.com/Stebalien/tempfile/blob/master/CHANGELOG.md)
- [Commits](https://github.com/Stebalien/tempfile/compare/v3.15.0...v3.16.0)

Updates `bumpalo` from 3.16.0 to 3.17.0
- [Changelog](https://github.com/fitzgen/bumpalo/blob/main/CHANGELOG.md)
- [Commits](https://github.com/fitzgen/bumpalo/compare/3.16.0...3.17.0)

Updates `cpufeatures` from 0.2.16 to 0.2.17
- [Commits](https://github.com/RustCrypto/utils/compare/cpufeatures-v0.2.16...cpufeatures-v0.2.17)

Updates `getrandom` from 0.2.15 to 0.3.1
- [Changelog](https://github.com/rust-random/getrandom/blob/master/CHANGELOG.md)
- [Commits](https://github.com/rust-random/getrandom/compare/v0.2.15...v0.3.1)

Updates `ryu` from 1.0.18 to 1.0.19
- [Release notes](https://github.com/dtolnay/ryu/releases)
- [Commits](https://github.com/dtolnay/ryu/compare/1.0.18...1.0.19)

Updates `unicode-ident` from 1.0.15 to 1.0.16
- [Release notes](https://github.com/dtolnay/unicode-ident/releases)
- [Commits](https://github.com/dtolnay/unicode-ident/compare/1.0.15...1.0.16)

Updates `wasi` from 0.11.0+wasi-snapshot-preview1 to 0.13.3+wasi-0.2.2
- [Commits](https://github.com/bytecodealliance/wasi-rs/compare/0.11.0...0.13.3)

---
updated-dependencies:
- dependency-name: serde_json
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: crates
- dependency-name: nom
  dependency-type: direct:production
  update-type: version-update:semver-major
  dependency-group: crates
- dependency-name: tempfile
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: crates
- dependency-name: bumpalo
  dependency-type: indirect
  update-type: version-update:semver-minor
  dependency-group: crates
- dependency-name: cpufeatures
  dependency-type: indirect
  update-type: version-update:semver-patch
  dependency-group: crates
- dependency-name: getrandom
  dependency-type: indirect
  update-type: version-update:semver-minor
  dependency-group: crates
- dependency-name: ryu
  dependency-type: indirect
  update-type: version-update:semver-patch
  dependency-group: crates
- dependency-name: unicode-ident
  dependency-type: indirect
  update-type: version-update:semver-patch
  dependency-group: crates
- dependency-name: wasi
  dependency-type: indirect
  update-type: version-update:semver-minor
  dependency-group: crates
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-02-02 22:28:52 +06:00
dependabot[bot]
e931792a4f build(deps): bump the crates group across 1 directory with 9 updates (#104)
Bumps the crates group with 7 updates in the /userspace/ksud_magic directory:

| Package | From | To |
| --- | --- | --- |
| [serde_json](https://github.com/serde-rs/json) | `1.0.137` | `1.0.138` |
| [nom](https://github.com/rust-bakery/nom) | `7.1.3` | `8.0.0` |
| [tempfile](https://github.com/Stebalien/tempfile) | `3.15.0` | `3.16.0` |
| [bumpalo](https://github.com/fitzgen/bumpalo) | `3.16.0` | `3.17.0` |
| [cpufeatures](https://github.com/RustCrypto/utils) | `0.2.16` | `0.2.17` |
| [ryu](https://github.com/dtolnay/ryu) | `1.0.18` | `1.0.19` |
| [unicode-ident](https://github.com/dtolnay/unicode-ident) | `1.0.15` | `1.0.16` |



Updates `serde_json` from 1.0.137 to 1.0.138
- [Release notes](https://github.com/serde-rs/json/releases)
- [Commits](https://github.com/serde-rs/json/compare/v1.0.137...v1.0.138)

Updates `nom` from 7.1.3 to 8.0.0
- [Changelog](https://github.com/rust-bakery/nom/blob/main/CHANGELOG.md)
- [Commits](https://github.com/rust-bakery/nom/compare/7.1.3...8.0.0)

Updates `tempfile` from 3.15.0 to 3.16.0
- [Changelog](https://github.com/Stebalien/tempfile/blob/master/CHANGELOG.md)
- [Commits](https://github.com/Stebalien/tempfile/compare/v3.15.0...v3.16.0)

Updates `bumpalo` from 3.16.0 to 3.17.0
- [Changelog](https://github.com/fitzgen/bumpalo/blob/main/CHANGELOG.md)
- [Commits](https://github.com/fitzgen/bumpalo/compare/3.16.0...3.17.0)

Updates `cpufeatures` from 0.2.16 to 0.2.17
- [Commits](https://github.com/RustCrypto/utils/compare/cpufeatures-v0.2.16...cpufeatures-v0.2.17)

Updates `getrandom` from 0.2.15 to 0.3.1
- [Changelog](https://github.com/rust-random/getrandom/blob/master/CHANGELOG.md)
- [Commits](https://github.com/rust-random/getrandom/compare/v0.2.15...v0.3.1)

Updates `ryu` from 1.0.18 to 1.0.19
- [Release notes](https://github.com/dtolnay/ryu/releases)
- [Commits](https://github.com/dtolnay/ryu/compare/1.0.18...1.0.19)

Updates `unicode-ident` from 1.0.15 to 1.0.16
- [Release notes](https://github.com/dtolnay/unicode-ident/releases)
- [Commits](https://github.com/dtolnay/unicode-ident/compare/1.0.15...1.0.16)

Updates `wasi` from 0.11.0+wasi-snapshot-preview1 to 0.13.3+wasi-0.2.2
- [Commits](https://github.com/bytecodealliance/wasi-rs/compare/0.11.0...0.13.3)

---
updated-dependencies:
- dependency-name: serde_json
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: crates
- dependency-name: nom
  dependency-type: direct:production
  update-type: version-update:semver-major
  dependency-group: crates
- dependency-name: tempfile
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: crates
- dependency-name: bumpalo
  dependency-type: indirect
  update-type: version-update:semver-minor
  dependency-group: crates
- dependency-name: cpufeatures
  dependency-type: indirect
  update-type: version-update:semver-patch
  dependency-group: crates
- dependency-name: getrandom
  dependency-type: indirect
  update-type: version-update:semver-minor
  dependency-group: crates
- dependency-name: ryu
  dependency-type: indirect
  update-type: version-update:semver-patch
  dependency-group: crates
- dependency-name: unicode-ident
  dependency-type: indirect
  update-type: version-update:semver-patch
  dependency-group: crates
- dependency-name: wasi
  dependency-type: indirect
  update-type: version-update:semver-minor
  dependency-group: crates
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-02-02 22:27:41 +06:00
dependabot[bot]
3876b6b474 build(deps): bump the maven group across 1 directory with 7 updates (#111)
Bumps the maven group with 7 updates in the /manager directory:

| Package | From | To |
| --- | --- | --- |
| androidx.navigation:navigation-compose | `2.8.5` | `2.8.6` |
| androidx.compose:compose-bom | `2025.01.00` | `2025.01.01` |
| [io.github.raamcosta.compose-destinations:core](https://github.com/raamcosta/compose-destinations) | `2.1.0-beta15` | `2.1.0-beta16` |
| [io.github.raamcosta.compose-destinations:ksp](https://github.com/raamcosta/compose-destinations) | `2.1.0-beta15` | `2.1.0-beta16` |
| [org.jetbrains.kotlin.android](https://github.com/JetBrains/kotlin) | `2.1.0` | `2.1.10` |
| [org.jetbrains.kotlin.plugin.compose](https://github.com/JetBrains/kotlin) | `2.1.0` | `2.1.10` |
| [com.google.devtools.ksp](https://github.com/google/ksp) | `2.1.0-1.0.29` | `2.1.10-1.0.29` |



Updates `androidx.navigation:navigation-compose` from 2.8.5 to 2.8.6

Updates `androidx.compose:compose-bom` from 2025.01.00 to 2025.01.01

Updates `io.github.raamcosta.compose-destinations:core` from 2.1.0-beta15 to 2.1.0-beta16
- [Release notes](https://github.com/raamcosta/compose-destinations/releases)
- [Commits](https://github.com/raamcosta/compose-destinations/compare/2.1.0-beta15...2.1.0-beta16)

Updates `io.github.raamcosta.compose-destinations:ksp` from 2.1.0-beta15 to 2.1.0-beta16
- [Release notes](https://github.com/raamcosta/compose-destinations/releases)
- [Commits](https://github.com/raamcosta/compose-destinations/compare/2.1.0-beta15...2.1.0-beta16)

Updates `io.github.raamcosta.compose-destinations:ksp` from 2.1.0-beta15 to 2.1.0-beta16
- [Release notes](https://github.com/raamcosta/compose-destinations/releases)
- [Commits](https://github.com/raamcosta/compose-destinations/compare/2.1.0-beta15...2.1.0-beta16)

Updates `org.jetbrains.kotlin.android` from 2.1.0 to 2.1.10
- [Release notes](https://github.com/JetBrains/kotlin/releases)
- [Changelog](https://github.com/JetBrains/kotlin/blob/master/ChangeLog.md)
- [Commits](https://github.com/JetBrains/kotlin/compare/v2.1.0...v2.1.10)

Updates `org.jetbrains.kotlin.plugin.compose` from 2.1.0 to 2.1.10
- [Release notes](https://github.com/JetBrains/kotlin/releases)
- [Changelog](https://github.com/JetBrains/kotlin/blob/master/ChangeLog.md)
- [Commits](https://github.com/JetBrains/kotlin/compare/v2.1.0...v2.1.10)

Updates `org.jetbrains.kotlin.plugin.compose` from 2.1.0 to 2.1.10
- [Release notes](https://github.com/JetBrains/kotlin/releases)
- [Changelog](https://github.com/JetBrains/kotlin/blob/master/ChangeLog.md)
- [Commits](https://github.com/JetBrains/kotlin/compare/v2.1.0...v2.1.10)

Updates `com.google.devtools.ksp` from 2.1.0-1.0.29 to 2.1.10-1.0.29
- [Release notes](https://github.com/google/ksp/releases)
- [Commits](https://github.com/google/ksp/compare/2.1.0-1.0.29...2.1.10-1.0.29)

---
updated-dependencies:
- dependency-name: androidx.navigation:navigation-compose
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: maven
- dependency-name: androidx.compose:compose-bom
  dependency-type: direct:production
  dependency-group: maven
- dependency-name: io.github.raamcosta.compose-destinations:core
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: maven
- dependency-name: io.github.raamcosta.compose-destinations:ksp
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: maven
- dependency-name: io.github.raamcosta.compose-destinations:ksp
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: maven
- dependency-name: org.jetbrains.kotlin.android
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: maven
- dependency-name: org.jetbrains.kotlin.plugin.compose
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: maven
- dependency-name: org.jetbrains.kotlin.plugin.compose
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: maven
- dependency-name: com.google.devtools.ksp
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: maven
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-02-02 22:24:56 +06:00
backslashxx
ae36e2085c kernel: handle optional backports (#99)
Cherry pick from 8bb9518060 a4a7db7f40

Backporting is cool, but not everyone has the skills for it.
This commit does NOT make it required, but it will allow compiler
to use whats in-kernel if it exists.

The following are backportable:
 - kernel_read / kernel_write
 	< 4.14, backport chain, tested on 4.9
 	e13ec939e9
	bdd1d2d3d2
	c41fbad015
	ac452acae1

 - strncpy_from_user_nofault
 	for 5.4, apply: bd88bb5d40
 	for 4.x, apply: 424e21f3b0
 	for any failures, just SKIP THIS or check dependency chain of, 3d7081822f
 		this got backported to v4.4.236, v4.9.236, v4.14.197, v4.19.144

- hint, `curl $url.patch | git am`

Signed-off-by: backslashxx <118538522+backslashxx@users.noreply.github.com>
2025-01-28 14:53:35 +06:00
Caner Karaca
3a8f4a2596 manager: update gradle (#85) 2025-01-28 01:41:47 +06:00
5ec1cff
87fc6b2784 kernel: clear securebits
fix adb shell cannot escape to root after https://github.com/tiann/KernelSU/pull/2381
2025-01-27 20:05:54 +06:00
Caner Karaca
25b57204ef ci: update workflows (#83)
* ci: update workflows

* Revert
2025-01-27 15:13:18 +06:00
Mateusz Chrząszcz
4ed362bea4 Add Polish Translation (#91)
* Create colors.xml

* Create themes.xml

* Create strings.xml and 1/2 translate

* Delete manager/app/src/main/res/values-pl/colors.xml

* Delete manager/app/src/main/res/values-pl/themes.xml

* Update strings.xml 2/2 translate

* Update strings.xml fix
2025-01-27 15:10:42 +06:00
MONE FIERA
a2976fd926 Add Japanese Translation (#90)
* Add Japanese Translation

* Update strings.xml
2025-01-27 15:10:23 +06:00
igor
b2bcc93f9a update translation (#93) 2025-01-27 13:24:53 +06:00
Rifat Azad
57b8dd54c5 docs: add donation crypto addresses 2025-01-26 11:29:52 +06:00
changhuapeng
ef32f3f9d2 manager: Disable interactions for uninstalled & disabled module (#2380)
Uninstalled module has no enabled interactions (e.g. run action script,
open webui, update).
Disabled module cannot run action script or open webui.
2025-01-25 21:01:53 +06:00
Caner Karaca
4ac264135d ksud: updates (#84) 2025-01-25 20:57:03 +06:00
Wang Han
a05b790da6 Avoid unnecessarily overriding capabilities (#2381)
Previously all capabilities were overridden with 0xffffffffffffffff,
which is
not what normal processes have. This causes PR_CAPBSET_DROP prctl
fail because it is dropping invalid caps. Fix it.

This fixes
https://gitlab.com/kalilinux/nethunter/apps/kali-nethunter-app/-/issues/378.

Co-Authored-By: 5ec1cff <56485584+5ec1cff@users.noreply.github.com>

Co-authored-by: 5ec1cff <56485584+5ec1cff@users.noreply.github.com>
2025-01-25 20:54:06 +06:00
97 changed files with 2453 additions and 1202 deletions

View File

@@ -1,5 +1,5 @@
blank_issues_enabled: false blank_issues_enabled: false
contact_links: contact_links:
- name: Feature Request - name: Feature Request
url: https://t.me/ksunext_discussions url: https://t.me/ksunext_group
about: "We accept external Feature Requests, see this link for more details." about: "We accept external Feature Requests, see this link for more details."

View File

@@ -17,11 +17,11 @@ jobs:
matrix: matrix:
include: include:
- version: "5.10" - version: "5.10"
sub_level: 223 sub_level: 228
os_patch_level: 2024-11 os_patch_level: 2025-01
- version: "5.15" - version: "5.15"
sub_level: 167 sub_level: 170
os_patch_level: 2024-11 os_patch_level: 2025-01
uses: ./.github/workflows/gki-kernel.yml uses: ./.github/workflows/gki-kernel.yml
with: with:
version: android13-${{ matrix.version }} version: android13-${{ matrix.version }}
@@ -34,11 +34,11 @@ jobs:
matrix: matrix:
include: include:
- version: "5.15" - version: "5.15"
sub_level: 167 sub_level: 170
os_patch_level: 2024-11 os_patch_level: 2025-01
- version: "6.1" - version: "6.1"
sub_level: 115 sub_level: 118
os_patch_level: 2024-12 os_patch_level: 2025-01
uses: ./.github/workflows/gki-kernel.yml uses: ./.github/workflows/gki-kernel.yml
with: with:
version: android14-${{ matrix.version }} version: android14-${{ matrix.version }}
@@ -51,8 +51,8 @@ jobs:
matrix: matrix:
include: include:
- version: "6.6" - version: "6.6"
sub_level: 57 sub_level: 58
os_patch_level: 2024-12 os_patch_level: 2025-01
uses: ./.github/workflows/gki-kernel.yml uses: ./.github/workflows/gki-kernel.yml
with: with:
version: android15-${{ matrix.version }} version: android15-${{ matrix.version }}

View File

@@ -27,6 +27,8 @@ jobs:
os_patch_level: 2024-08 os_patch_level: 2024-08
- sub_level: 226 - sub_level: 226
os_patch_level: 2024-11 os_patch_level: 2024-11
- sub_level: 233
os_patch_level: 2025-02
uses: ./.github/workflows/gki-kernel.yml uses: ./.github/workflows/gki-kernel.yml
secrets: inherit secrets: inherit
with: with:

View File

@@ -36,6 +36,9 @@ jobs:
- version: "5.10" - version: "5.10"
sub_level: 223 sub_level: 223
os_patch_level: 2024-11 os_patch_level: 2024-11
- version: "5.10"
sub_level: 228
os_patch_level: 2025-01
- version: "5.15" - version: "5.15"
sub_level: 148 sub_level: 148
os_patch_level: 2024-05 os_patch_level: 2024-05
@@ -51,6 +54,9 @@ jobs:
- version: "5.15" - version: "5.15"
sub_level: 167 sub_level: 167
os_patch_level: 2024-11 os_patch_level: 2024-11
- version: "5.15"
sub_level: 170
os_patch_level: 2025-01
uses: ./.github/workflows/gki-kernel.yml uses: ./.github/workflows/gki-kernel.yml
secrets: inherit secrets: inherit
with: with:
@@ -137,11 +143,11 @@ jobs:
matrix: matrix:
include: include:
- version: "5.10" - version: "5.10"
sub_level: 223 sub_level: 228
os_patch_level: 2024-11 os_patch_level: 2025-01
- version: "5.15" - version: "5.15"
sub_level: 167 sub_level: 170
os_patch_level: 2024-11 os_patch_level: 2025-01
uses: ./.github/workflows/gki-kernel.yml uses: ./.github/workflows/gki-kernel.yml
with: with:
version: android13-${{ matrix.version }} version: android13-${{ matrix.version }}

View File

@@ -39,6 +39,9 @@ jobs:
- version: "5.15" - version: "5.15"
sub_level: 167 sub_level: 167
os_patch_level: 2024-11 os_patch_level: 2024-11
- version: "5.15"
sub_level: 170
os_patch_level: 2025-01
- version: "6.1" - version: "6.1"
sub_level: 75 sub_level: 75
os_patch_level: 2024-05 os_patch_level: 2024-05
@@ -63,6 +66,12 @@ jobs:
- version: "6.1" - version: "6.1"
sub_level: 115 sub_level: 115
os_patch_level: 2024-12 os_patch_level: 2024-12
- version: "6.1"
sub_level: 118
os_patch_level: 2025-01
- version: "6.1"
sub_level: 124
os_patch_level: 2025-02
uses: ./.github/workflows/gki-kernel.yml uses: ./.github/workflows/gki-kernel.yml
secrets: inherit secrets: inherit
with: with:
@@ -149,11 +158,11 @@ jobs:
matrix: matrix:
include: include:
- version: "5.15" - version: "5.15"
sub_level: 167 sub_level: 170
os_patch_level: 2024-11 os_patch_level: 2025-01
- version: "6.1" - version: "6.1"
sub_level: 115 sub_level: 118
os_patch_level: 2024-12 os_patch_level: 2025-01
uses: ./.github/workflows/gki-kernel.yml uses: ./.github/workflows/gki-kernel.yml
with: with:
version: android14-${{ matrix.version }} version: android14-${{ matrix.version }}

View File

@@ -36,6 +36,12 @@ jobs:
- version: "6.6" - version: "6.6"
sub_level: 57 sub_level: 57
os_patch_level: 2024-12 os_patch_level: 2024-12
- version: "6.6"
sub_level: 58
os_patch_level: 2025-01
- version: "6.6"
sub_level: 66
os_patch_level: 2025-02
uses: ./.github/workflows/gki-kernel.yml uses: ./.github/workflows/gki-kernel.yml
secrets: inherit secrets: inherit
with: with:
@@ -122,8 +128,8 @@ jobs:
matrix: matrix:
include: include:
- version: "6.6" - version: "6.6"
sub_level: 57 sub_level: 58
os_patch_level: 2024-12 os_patch_level: 2025-01
uses: ./.github/workflows/gki-kernel.yml uses: ./.github/workflows/gki-kernel.yml
with: with:
version: android15-${{ matrix.version }} version: android15-${{ matrix.version }}

View File

@@ -15,23 +15,23 @@ jobs:
matrix: matrix:
include: include:
- version: "android12-5.10" - version: "android12-5.10"
sub_level: 226 sub_level: 233
os_patch_level: 2024-11 os_patch_level: 2025-02
- version: "android13-5.10" - version: "android13-5.10"
sub_level: 223 sub_level: 228
os_patch_level: 2024-11 os_patch_level: 2025-01
- version: "android13-5.15" - version: "android13-5.15"
sub_level: 167 sub_level: 170
os_patch_level: 2024-11 os_patch_level: 2025-01
- version: "android14-5.15" - version: "android14-5.15"
sub_level: 167 sub_level: 170
os_patch_level: 2024-11 os_patch_level: 2025-01
- version: "android14-6.1" - version: "android14-6.1"
sub_level: 115 sub_level: 124
os_patch_level: 2024-12 os_patch_level: 2025-02
- version: "android15-6.6" - version: "android15-6.6"
sub_level: 57 sub_level: 66
os_patch_level: 2024-12 os_patch_level: 2025-02
uses: ./.github/workflows/gki-kernel.yml uses: ./.github/workflows/gki-kernel.yml
with: with:
version: ${{ matrix.version }} version: ${{ matrix.version }}

View File

@@ -13,6 +13,7 @@ on:
pull_request: pull_request:
branches: [ "next" ] branches: [ "next" ]
paths: paths:
- '.github/workflows/build-manager-ci.yml'
- 'manager/**' - 'manager/**'
workflow_call: workflow_call:
workflow_dispatch: workflow_dispatch:
@@ -34,39 +35,27 @@ jobs:
target: ${{ matrix.target }} target: ${{ matrix.target }}
os: ${{ matrix.os }} os: ${{ matrix.os }}
build-ksud_overlayfs: build-ksud:
needs: build-susfsd needs: build-susfsd
strategy: strategy:
matrix: matrix:
include: include:
- target: aarch64-linux-android - target: aarch64-linux-android
os: ubuntu-latest os: ubuntu-latest
uses: ./.github/workflows/ksud_overlayfs.yml uses: ./.github/workflows/ksud.yml
with:
target: ${{ matrix.target }}
os: ${{ matrix.os }}
build-ksud_magic:
needs: build-ksud_overlayfs
strategy:
matrix:
include:
- target: aarch64-linux-android
os: ubuntu-latest
uses: ./.github/workflows/ksud_magic.yml
with: with:
target: ${{ matrix.target }} target: ${{ matrix.target }}
os: ${{ matrix.os }} os: ${{ matrix.os }}
build-manager: build-manager:
needs: build-ksud_magic needs: build-ksud
runs-on: ubuntu-latest runs-on: ubuntu-latest
defaults: defaults:
run: run:
working-directory: ./manager working-directory: ./manager
steps: steps:
- name: Checkout - name: Checkout Repository
uses: actions/checkout@v4 uses: actions/checkout@v4
with: with:
fetch-depth: 0 fetch-depth: 0
@@ -80,7 +69,7 @@ jobs:
echo "UPLOAD=false" >> $GITHUB_OUTPUT echo "UPLOAD=false" >> $GITHUB_OUTPUT
fi fi
- name: Write key - name: Write Key
run: | run: |
if [ ! -z "${{ secrets.KEYSTORE }}" ]; then if [ ! -z "${{ secrets.KEYSTORE }}" ]; then
{ {
@@ -101,9 +90,6 @@ jobs:
- name: Setup Gradle - name: Setup Gradle
uses: gradle/actions/setup-gradle@v4 uses: gradle/actions/setup-gradle@v4
- name: Setup Android SDK
uses: android-actions/setup-android@v3
- name: Download arm64 susfsd - name: Download arm64 susfsd
uses: actions/download-artifact@v4 uses: actions/download-artifact@v4
with: with:
@@ -120,21 +106,20 @@ jobs:
with: with:
name: ksud_overlayfs-aarch64-linux-android name: ksud_overlayfs-aarch64-linux-android
path: ksud_overlayfs path: ksud_overlayfs
- name: Copy ksud_overlayfs to app jniLibs - name: Copy ksud_overlayfs to app jniLibs
run: | run: |
cp -f ../ksud_overlayfs/aarch64-linux-android/release/ksud ../manager/app/src/main/jniLibs/arm64-v8a/libksud_overlayfs.so cp -f ../ksud_overlayfs/aarch64-linux-android/release/ksud ../manager/app/src/main/jniLibs/arm64-v8a/libksud_overlayfs.so
- name: Download arm64 ksud_magic - name: Download arm64 ksud_magic
uses: actions/download-artifact@v4 uses: actions/download-artifact@v4
with: with:
name: ksud_magic-aarch64-linux-android name: ksud_magic-aarch64-linux-android
path: ksud_magic path: ksud_magic
- name: Copy ksud_magic to app jniLibs - name: Copy ksud_magic to app jniLibs
run: | run: |
cp -f ../ksud_magic/aarch64-linux-android/release/ksud ../manager/app/src/main/jniLibs/arm64-v8a/libksud_magic.so cp -f ../ksud_magic/aarch64-linux-android/release/ksud ../manager/app/src/main/jniLibs/arm64-v8a/libksud_magic.so
- name: Build with Gradle - name: Build with Gradle
run: | run: |
@@ -148,19 +133,19 @@ jobs:
chmod +x gradlew chmod +x gradlew
./gradlew clean assembleRelease ./gradlew clean assembleRelease
- name: Upload build artifact - name: Upload Build Artifact
uses: actions/upload-artifact@v4 uses: actions/upload-artifact@v4
with: with:
name: manager name: Manager
path: manager/app/build/outputs/apk/release/*.apk path: manager/app/build/outputs/apk/release/*.apk
- name: Upload mappings - name: Upload Mappings
uses: actions/upload-artifact@v4 uses: actions/upload-artifact@v4
with: with:
name: "mappings" name: Mappings
path: "manager/app/build/outputs/mapping/release/" path: manager/app/build/outputs/mapping/release/
- name: Bot session cache - name: Bot Session Cache
if: steps.need_upload.outputs.UPLOAD == 'true' if: steps.need_upload.outputs.UPLOAD == 'true'
id: bot_session_cache id: bot_session_cache
uses: actions/cache@v4 uses: actions/cache@v4
@@ -168,7 +153,7 @@ jobs:
path: scripts/ksunextbot.session path: scripts/ksunextbot.session
key: ${{ runner.os }}-bot-session key: ${{ runner.os }}-bot-session
- name: Upload to telegram - name: Upload to Telegram
if: steps.need_upload.outputs.UPLOAD == 'true' if: steps.need_upload.outputs.UPLOAD == 'true'
env: env:
API_ID: ${{ secrets.API_ID }} API_ID: ${{ secrets.API_ID }}
@@ -186,5 +171,4 @@ jobs:
APK=$(find ./app/build/outputs/apk/release -name "*.apk") APK=$(find ./app/build/outputs/apk/release -name "*.apk")
pip3 install telethon pip3 install telethon
python3 $GITHUB_WORKSPACE/scripts/ksunextbot.py $APK python3 $GITHUB_WORKSPACE/scripts/ksunextbot.py $APK
fi fi

View File

@@ -13,6 +13,7 @@ on:
# pull_request: # pull_request:
# branches: [ "next" ] # branches: [ "next" ]
# paths: # paths:
# - '.github/workflows/build-manager-ci.yml'
# - 'manager/**' # - 'manager/**'
workflow_call: workflow_call:
workflow_dispatch: workflow_dispatch:
@@ -34,39 +35,27 @@ jobs:
target: ${{ matrix.target }} target: ${{ matrix.target }}
os: ${{ matrix.os }} os: ${{ matrix.os }}
build-ksud_overlayfs: build-ksud:
needs: build-susfsd needs: build-susfsd
strategy: strategy:
matrix: matrix:
include: include:
- target: aarch64-linux-android - target: aarch64-linux-android
os: ubuntu-latest os: ubuntu-latest
uses: ./.github/workflows/ksud_overlayfs.yml uses: ./.github/workflows/ksud.yml
with:
target: ${{ matrix.target }}
os: ${{ matrix.os }}
build-ksud_magic:
needs: build-ksud_overlayfs
strategy:
matrix:
include:
- target: aarch64-linux-android
os: ubuntu-latest
uses: ./.github/workflows/ksud_magic.yml
with: with:
target: ${{ matrix.target }} target: ${{ matrix.target }}
os: ${{ matrix.os }} os: ${{ matrix.os }}
build-manager: build-manager:
needs: build-ksud_magic needs: build-ksud
runs-on: ubuntu-latest runs-on: ubuntu-latest
defaults: defaults:
run: run:
working-directory: ./manager working-directory: ./manager
steps: steps:
- name: Checkout - name: Checkout Repository
uses: actions/checkout@v4 uses: actions/checkout@v4
with: with:
fetch-depth: 0 fetch-depth: 0
@@ -80,7 +69,7 @@ jobs:
echo "UPLOAD=false" >> $GITHUB_OUTPUT echo "UPLOAD=false" >> $GITHUB_OUTPUT
fi fi
- name: Write key - name: Write Key
run: | run: |
if [ ! -z "${{ secrets.KEYSTORE }}" ]; then if [ ! -z "${{ secrets.KEYSTORE }}" ]; then
{ {
@@ -101,9 +90,6 @@ jobs:
- name: Setup Gradle - name: Setup Gradle
uses: gradle/actions/setup-gradle@v4 uses: gradle/actions/setup-gradle@v4
- name: Setup Android SDK
uses: android-actions/setup-android@v3
- name: Download arm64 susfsd - name: Download arm64 susfsd
uses: actions/download-artifact@v4 uses: actions/download-artifact@v4
with: with:
@@ -120,21 +106,20 @@ jobs:
with: with:
name: ksud_overlayfs-aarch64-linux-android name: ksud_overlayfs-aarch64-linux-android
path: ksud_overlayfs path: ksud_overlayfs
- name: Copy ksud_overlayfs to app jniLibs - name: Copy ksud_overlayfs to app jniLibs
run: | run: |
cp -f ../ksud_overlayfs/aarch64-linux-android/release/ksud ../manager/app/src/main/jniLibs/arm64-v8a/libksud_overlayfs.so cp -f ../ksud_overlayfs/aarch64-linux-android/release/ksud ../manager/app/src/main/jniLibs/arm64-v8a/libksud_overlayfs.so
- name: Download arm64 ksud_magic - name: Download arm64 ksud_magic
uses: actions/download-artifact@v4 uses: actions/download-artifact@v4
with: with:
name: ksud_magic-aarch64-linux-android name: ksud_magic-aarch64-linux-android
path: ksud_magic path: ksud_magic
- name: Copy ksud_magic to app jniLibs - name: Copy ksud_magic to app jniLibs
run: | run: |
cp -f ../ksud_magic/aarch64-linux-android/release/ksud ../manager/app/src/main/jniLibs/arm64-v8a/libksud_magic.so cp -f ../ksud_magic/aarch64-linux-android/release/ksud ../manager/app/src/main/jniLibs/arm64-v8a/libksud_magic.so
- name: Build with Gradle - name: Build with Gradle
run: | run: |
@@ -148,19 +133,19 @@ jobs:
chmod +x gradlew chmod +x gradlew
./gradlew clean assembleRelease ./gradlew clean assembleRelease
- name: Upload build artifact - name: Upload Build Artifact
uses: actions/upload-artifact@v4 uses: actions/upload-artifact@v4
with: with:
name: manager name: Manager
path: manager/app/build/outputs/apk/release/*.apk path: manager/app/build/outputs/apk/release/*.apk
- name: Upload mappings - name: Upload Mappings
uses: actions/upload-artifact@v4 uses: actions/upload-artifact@v4
with: with:
name: "mappings" name: Mappings
path: "manager/app/build/outputs/mapping/release/" path: manager/app/build/outputs/mapping/release/
- name: Bot session cache - name: Bot Session Cache
if: steps.need_upload.outputs.UPLOAD == 'true' if: steps.need_upload.outputs.UPLOAD == 'true'
id: bot_session_cache id: bot_session_cache
uses: actions/cache@v4 uses: actions/cache@v4
@@ -168,7 +153,7 @@ jobs:
path: scripts/ksunextbot.session path: scripts/ksunextbot.session
key: ${{ runner.os }}-bot-session key: ${{ runner.os }}-bot-session
- name: Upload to telegram - name: Upload to Telegram
if: steps.need_upload.outputs.UPLOAD == 'true' if: steps.need_upload.outputs.UPLOAD == 'true'
env: env:
API_ID: ${{ secrets.API_ID }} API_ID: ${{ secrets.API_ID }}
@@ -186,5 +171,4 @@ jobs:
APK=$(find ./app/build/outputs/apk/release -name "*.apk") APK=$(find ./app/build/outputs/apk/release -name "*.apk")
pip3 install telethon pip3 install telethon
python3 $GITHUB_WORKSPACE/scripts/ksunextbot.py $APK python3 $GITHUB_WORKSPACE/scripts/ksunextbot.py $APK
fi fi

View File

@@ -6,13 +6,15 @@ on:
- next - next
paths: paths:
- '.github/workflows/clippy.yml' - '.github/workflows/clippy.yml'
- 'userspace/ksud/**' - 'userspace/ksud_magic/**'
- 'userspace/ksud_overlayfs/**'
pull_request: pull_request:
branches: branches:
- main - next
paths: paths:
- '.github/workflows/clippy.yml' - '.github/workflows/clippy.yml'
- 'userspace/ksud/**' - 'userspace/ksud_magic/**'
- 'userspace/ksud_overlayfs/**'
env: env:
RUSTFLAGS: '-Dwarnings' RUSTFLAGS: '-Dwarnings'
@@ -21,17 +23,26 @@ jobs:
clippy: clippy:
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- uses: actions/checkout@v4 - name: Checkout Repository
- run: rustup update --force-non-host stable-x86_64-unknown-linux-gnu uses: actions/checkout@v4
- uses: Swatinem/rust-cache@v2
- name: Setup Rust
run: rustup update stable
- name: Setup Cross
run: RUSTFLAGS="" cargo install cross
- name: Cache ksud_overlayfs
uses: Swatinem/rust-cache@v2
with: with:
workspaces: userspace/ksud workspaces: userspace/ksud_overlayfs
- name: Install cross - name: Cache ksud_magic
run: | uses: Swatinem/rust-cache@v2
cargo install cross --git https://github.com/cross-rs/cross --rev 66845c1 with:
workspaces: userspace/ksud_magic
- name: Run clippy - name: Run Clippy
run: | run: |
cross clippy --manifest-path userspace/ksud/Cargo.toml --target aarch64-linux-android --release cross clippy --manifest-path userspace/ksud_magic/Cargo.toml --target aarch64-linux-android --release
cross clippy --manifest-path userspace/ksud/Cargo.toml --target x86_64-linux-android --release cross clippy --manifest-path userspace/ksud_overlayfs/Cargo.toml --target aarch64-linux-android --release

79
.github/workflows/ksud.yml vendored Normal file
View File

@@ -0,0 +1,79 @@
name: Build ksud
on:
workflow_call:
inputs:
target:
required: true
type: string
os:
required: false
type: string
default: ubuntu-latest
pack_lkm:
required: false
type: boolean
default: true
use_cache:
required: false
type: boolean
default: true
jobs:
build:
runs-on: ${{ inputs.os }}
steps:
- name: Checkout Repository
uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Download Artifacts
uses: actions/download-artifact@v4
- name: Prepare LKM Files
if: ${{ inputs.pack_lkm }}
run: |
cp android*-lkm/*_kernelsu.ko ./userspace/ksud_overlayfs/bin/aarch64/
cp android*-lkm/*_kernelsu.ko ./userspace/ksud_magic/bin/aarch64/
- name: Import susfsd Libraries
run: |
cp susfsd-aarch64-linux-android/arm64-v8a/susfsd ./userspace/ksud_overlayfs/bin/aarch64/
cp susfsd-aarch64-linux-android/arm64-v8a/susfsd ./userspace/ksud_magic/bin/aarch64/
- name: Setup Rust
run: |
rustup update stable
rustup target add aarch64-apple-darwin
- name: Cache ksud_overlayfs
uses: Swatinem/rust-cache@v2
with:
workspaces: userspace/ksud_overlayfs
cache-targets: false
- name: Cache ksud_magic
uses: Swatinem/rust-cache@v2
with:
workspaces: userspace/ksud_magic
cache-targets: false
- name: Setup Cross
run: |
RUSTFLAGS="" cargo install cross --git https://github.com/cross-rs/cross --rev 66845c1 --force
- name: Build ksud
run: |
CROSS_NO_WARNINGS=0 cross build --target ${{ inputs.target }} --release --manifest-path ./userspace/ksud_overlayfs/Cargo.toml
CROSS_NO_WARNINGS=0 cross build --target ${{ inputs.target }} --release --manifest-path ./userspace/ksud_magic/Cargo.toml
- name: Upload ksud_overlayfs artifact
uses: actions/upload-artifact@v4
with:
name: ksud_overlayfs-${{ inputs.target }}
path: userspace/ksud_overlayfs/target/**/release/ksud*
- name: Upload ksud_magic artifact
uses: actions/upload-artifact@v4
with:
name: ksud_magic-${{ inputs.target }}
path: userspace/ksud_magic/target/**/release/ksud*

View File

@@ -1,61 +0,0 @@
name: Build ksud_magic
on:
workflow_call:
inputs:
target:
required: true
type: string
os:
required: false
type: string
default: ubuntu-latest
pack_lkm:
required: false
type: boolean
default: true
use_cache:
required: false
type: boolean
default: true
jobs:
build:
runs-on: ${{ inputs.os }}
steps:
- uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Download artifacts
uses: actions/download-artifact@v4
- name: Prepare LKM fies
if: ${{ inputs.pack_lkm }}
run: |
cp android*-lkm/*_kernelsu.ko ./userspace/ksud_magic/bin/aarch64/
- name: Import susfsd lib
run: |
cp susfsd-aarch64-linux-android/arm64-v8a/susfsd ./userspace/ksud_magic/bin/aarch64/
- name: Setup rustup
run: |
rustup update stable
rustup target add x86_64-apple-darwin
rustup target add aarch64-apple-darwin
- uses: Swatinem/rust-cache@v2
with:
workspaces: userspace/ksud_magic
cache-targets: false
- name: Install cross
run: |
cargo install cross --git https://github.com/cross-rs/cross --rev 66845c1 --force
- name: Build ksud_magic
run: CROSS_NO_WARNINGS=0 cross build --target ${{ inputs.target }} --release --manifest-path ./userspace/ksud_magic/Cargo.toml
- name: Upload ksud_magic artifact
uses: actions/upload-artifact@v4
with:
name: ksud_magic-${{ inputs.target }}
path: userspace/ksud_magic/target/**/release/ksud*

View File

@@ -1,61 +0,0 @@
name: Build ksud_overlayfs
on:
workflow_call:
inputs:
target:
required: true
type: string
os:
required: false
type: string
default: ubuntu-latest
pack_lkm:
required: false
type: boolean
default: true
use_cache:
required: false
type: boolean
default: true
jobs:
build:
runs-on: ${{ inputs.os }}
steps:
- uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Download artifacts
uses: actions/download-artifact@v4
- name: Prepare LKM fies
if: ${{ inputs.pack_lkm }}
run: |
cp android*-lkm/*_kernelsu.ko ./userspace/ksud_overlayfs/bin/aarch64/
- name: Import susfsd lib
run: |
cp susfsd-aarch64-linux-android/arm64-v8a/susfsd ./userspace/ksud_overlayfs/bin/aarch64/
- name: Setup rustup
run: |
rustup update stable
rustup target add x86_64-apple-darwin
rustup target add aarch64-apple-darwin
- uses: Swatinem/rust-cache@v2
with:
workspaces: userspace/ksud_overlayfs
cache-targets: false
- name: Install cross
run: |
cargo install cross --git https://github.com/cross-rs/cross --rev 66845c1 --force
- name: Build ksud_overlayfs
run: CROSS_NO_WARNINGS=0 cross build --target ${{ inputs.target }} --release --manifest-path ./userspace/ksud_overlayfs/Cargo.toml
- name: Upload ksud_overlayfs artifact
uses: actions/upload-artifact@v4
with:
name: ksud_overlayfs-${{ inputs.target }}
path: userspace/ksud_overlayfs/target/**/release/ksud*

View File

@@ -27,6 +27,7 @@ jobs:
- build-a12-kernel - build-a12-kernel
- build-a13-kernel - build-a13-kernel
- build-a14-kernel - build-a14-kernel
- build-a15-kernel
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- name: Download artifacts - name: Download artifacts
@@ -53,4 +54,4 @@ jobs:
boot-images-*/Image-*/*.img.gz boot-images-*/Image-*/*.img.gz
ksud_magic-* ksud_magic-*
ksud_overlayfs-* ksud_overlayfs-*
susfsd-* susfsd-*

View File

@@ -6,13 +6,15 @@ on:
- 'next' - 'next'
paths: paths:
- '.github/workflows/rustfmt.yml' - '.github/workflows/rustfmt.yml'
- 'userspace/ksud/**' - 'userspace/ksud_magic/**'
- 'userspace/ksud_overlayfs/**'
pull_request: pull_request:
branches: branches:
- 'next' - 'next'
paths: paths:
- '.github/workflows/rustfmt.yml' - '.github/workflows/rustfmt.yml'
- 'userspace/ksud/**' - 'userspace/ksud_magic/**'
- 'userspace/ksud_overlayfs/**'
permissions: permissions:
checks: write checks: write
@@ -30,4 +32,9 @@ jobs:
- uses: LoliGothick/rustfmt-check@master - uses: LoliGothick/rustfmt-check@master
with: with:
token: ${{ github.token }} token: ${{ github.token }}
working-directory: userspace/ksud working-directory: userspace/ksud_magic
- uses: LoliGothick/rustfmt-check@master
with:
token: ${{ github.token }}
working-directory: userspace/ksud_overlayfs

View File

@@ -24,4 +24,4 @@ jobs:
uses: ludeeus/action-shellcheck@2.0.0 uses: ludeeus/action-shellcheck@2.0.0
with: with:
ignore_names: gradlew ignore_names: gradlew
ignore_paths: ./userspace/ksud/src/installer.sh ignore_paths: ./userspace/ksud_magic/src/installer.sh ./userspace/ksud_overlayfs/src/installer.sh

View File

@@ -1,15 +1,15 @@
**English** | [简体中文](README_CN.md) | [繁體中文](README_TW.md) | [Türkçe](README_TR.md) | [Português (Brasil)](README_PT-BR.md) | [한국어](README_KO.md) | [Français](README_FR.md) | [Bahasa Indonesia](README_ID.md) | [Русский](README_RU.md) | [ภาษาไทย](README_TH.md) **English** | [简体中文](README_CN.md) | [繁體中文](README_TW.md) | [Türkçe](README_TR.md) | [Português (Brasil)](README_PT-BR.md) | [한국어](README_KO.md) | [Français](README_FR.md) | [Bahasa Indonesia](README_ID.md) | [Русский](README_RU.md) | [ภาษาไทย](README_TH.md) | [Tiếng Việt](README_VI.md)
# KernelSU Next # KernelSU Next
<img src="/assets/kernelsu_next.png" style="width: 96px;" alt="logo"> <img src="/assets/kernelsu_next.png" style="width: 96px;" alt="logo">
A Kernel-based root solution for Android devices. A kernel-based root solution for Android devices.
[![Latest Release](https://img.shields.io/github/v/release/rifsxd/KernelSU-Next?label=Release&logo=github)](https://github.com/rifsxd/KernelSU-Next/releases/latest) [![Latest Release](https://img.shields.io/github/v/release/KernelSU-Next/KernelSU-Next?label=Release&logo=github)](https://github.com/KernelSU-Next/KernelSU-Next/releases/latest)
[![Nightly Release](https://img.shields.io/badge/Nightly%20Release-gray?logo=hackthebox&logoColor=fff)](https://nightly.link/rifsxd/KernelSU-Next/workflows/build-manager/next/manager) [![Nightly Release](https://img.shields.io/badge/Nightly%20Release-gray?logo=hackthebox&logoColor=fff)](https://nightly.link/KernelSU-Next/KernelSU-Next/workflows/build-manager-ci/next/Manager)
[![License: GPL v2](https://img.shields.io/badge/License-GPL%20v2-orange.svg?logo=gnu)](https://www.gnu.org/licenses/old-licenses/gpl-2.0.en.html) [![License: GPL v2](https://img.shields.io/badge/License-GPL%20v2-orange.svg?logo=gnu)](https://www.gnu.org/licenses/old-licenses/gpl-2.0.en.html)
[![GitHub License](https://img.shields.io/github/license/rifsxd/KernelSU-Next?logo=gnu)](/LICENSE) [![GitHub License](https://img.shields.io/github/license/KernelSU-Next/KernelSU-Next?logo=gnu)](/LICENSE)
## Features ## Features
@@ -17,18 +17,18 @@ A Kernel-based root solution for Android devices.
2. Module system based on dynamic mount system [Magic Mount](https://topjohnwu.github.io/Magisk/details.html#magic-mount) / [OverlayFS](https://en.wikipedia.org/wiki/OverlayFS). 2. Module system based on dynamic mount system [Magic Mount](https://topjohnwu.github.io/Magisk/details.html#magic-mount) / [OverlayFS](https://en.wikipedia.org/wiki/OverlayFS).
3. [App Profile](https://kernelsu.org/guide/app-profile.html): Lock up the root power in a cage. 3. [App Profile](https://kernelsu.org/guide/app-profile.html): Lock up the root power in a cage.
## Compatibility State ## Compatibility state
KernelSU Next officially supports most Android kernels starting from 4.4 up to 6.6. KernelSU Next officially supports most Android kernels starting from 4.4 up to 6.6.
- GKI 2.0 (5.10+) kernels can run pre-built images and LKM/KMI. - GKI 2.0 (5.10+) kernels can run pre-built images and LKM/KMI.
- GKI 1.0 (4.19 - 5.4) kernels need to rebuilt with KernelSU driver. - GKI 1.0 (4.19 - 5.4) kernels need to rebuilt with KernelSU driver.
- EOL (<4.14) kernels also need to be rebuilt with KernelSU driver (3.18+ is experimental and may need some function backports). - EOL (<4.14) kernels also need to be rebuilt with KernelSU driver (3.18+ is experimental and may need some function backports).
Currently, only `arm64-v8a` is supported. Currently, only the `arm64-v8a` architecture is supported.
## Usage ## Usage
- [Installation instruction](https://rifsxd.github.io/KernelSU-Next/) - [Installation instruction](https://KernelSU-Next.github.io/KernelSU-Next/)
## Security ## Security
@@ -39,11 +39,25 @@ For information on reporting security vulnerabilities in KernelSU, see [SECURITY
- Files under the `kernel` directory are [GPL-2.0-only](https://www.gnu.org/licenses/old-licenses/gpl-2.0.en.html). - Files under the `kernel` directory are [GPL-2.0-only](https://www.gnu.org/licenses/old-licenses/gpl-2.0.en.html).
- All other parts except the `kernel` directory are [GPL-3.0-or-later](https://www.gnu.org/licenses/gpl-3.0.html). - All other parts except the `kernel` directory are [GPL-3.0-or-later](https://www.gnu.org/licenses/gpl-3.0.html).
## Donations
- 0x12b5224b7aca0121c2f003240a901e1d064371c1 [ USDT BEP20 ]
- TYUVMWGTcnR5svnDoX85DWHyqUAeyQcdjh [ USDT TRC20 ]
- 0x12b5224b7aca0121c2f003240a901e1d064371c1 [ USDT ERC20 ]
- 0x12b5224b7aca0121c2f003240a901e1d064371c1 [ ETH ERC20 ]
- Ld238uYBuRQdZB5YwdbkuU6ektBAAUByoL [ LTC ]
- 19QgifcjMjSr1wB2DJcea5cxitvWVcXMT6 [ BTC ]
## Credits ## Credits
- [kernel-assisted-superuser](https://git.zx2c4.com/kernel-assisted-superuser/about/): the KernelSU idea. - [Kernel-Assisted Superuser](https://git.zx2c4.com/kernel-assisted-superuser/about/): The KernelSU idea.
- [Magisk](https://github.com/topjohnwu/Magisk): the powerful root tool. - [Magisk](https://github.com/topjohnwu/Magisk): The powerful root tool.
- [genuine](https://github.com/brevent/genuine/): apk v2 signature validation. - [genuine](https://github.com/brevent/genuine/): APK v2 signature validation.
- [Diamorphine](https://github.com/m0nad/Diamorphine): some rootkit skills. - [Diamorphine](https://github.com/m0nad/Diamorphine): Some rootkit skills.
- [KernelSU](https://github.com/tiann/KernelSU): thanks to tiann, or else KernelSU Next wouldn't even exist. - [KernelSU](https://github.com/tiann/KernelSU): Thanks to tiann, or else KernelSU Next wouldn't even exist.
- [Magic Mount Port](https://github.com/5ec1cff/KernelSU/blob/main/userspace/ksud/src/magic_mount.rs): 💜 5ec1cff for saving KernelSU! - [Magic Mount Port](https://github.com/5ec1cff/KernelSU/blob/main/userspace/ksud/src/magic_mount.rs): 💜 5ec1cff for saving KernelSU!

View File

@@ -1,4 +1,4 @@
[English](README.md) | **简体中文** | [繁體中文](README_TW.md) | [Türkçe](README_TR.md) | [Português (Brasil)](README_PT-BR.md) | [한국어](README_KO.md) | [Français](README_FR.md) | [Bahasa Indonesia](README_ID.md) | [Русский](README_RU.md) | [ภาษาไทย](README_TH.md) [English](README.md) | **简体中文** | [繁體中文](README_TW.md) | [Türkçe](README_TR.md) | [Português (Brasil)](README_PT-BR.md) | [한국어](README_KO.md) | [Français](README_FR.md) | [Bahasa Indonesia](README_ID.md) | [Русский](README_RU.md) | [ภาษาไทย](README_TH.md) | [Tiếng Việt](README_VI.md)
# KernelSU Next # KernelSU Next
@@ -6,10 +6,10 @@
安卓基于内核的 Root 方案 安卓基于内核的 Root 方案
[![Latest Release](https://img.shields.io/github/v/release/rifsxd/KernelSU-Next?label=Release&logo=github)](https://github.com/rifsxd/KernelSU-Next/releases/latest) [![Latest Release](https://img.shields.io/github/v/release/KernelSU-Next/KernelSU-Next?label=Release&logo=github)](https://github.com/KernelSU-Next/KernelSU-Next/releases/latest)
[![Nightly Release](https://img.shields.io/badge/Nightly%20Release-gray?logo=hackthebox&logoColor=fff)](https://nightly.link/rifsxd/KernelSU-Next/workflows/build-manager/next/manager) [![Nightly Release](https://img.shields.io/badge/Nightly%20Release-gray?logo=hackthebox&logoColor=fff)](https://nightly.link/KernelSU-Next/KernelSU-Next/workflows/build-manager-ci/next/Manager)
[![License: GPL v2](https://img.shields.io/badge/License-GPL%20v2-orange.svg?logo=gnu)](https://www.gnu.org/licenses/old-licenses/gpl-2.0.en.html) [![License: GPL v2](https://img.shields.io/badge/License-GPL%20v2-orange.svg?logo=gnu)](https://www.gnu.org/licenses/old-licenses/gpl-2.0.en.html)
[![GitHub License](https://img.shields.io/github/license/rifsxd/KernelSU-Next?logo=gnu)](/LICENSE) [![GitHub License](https://img.shields.io/github/license/KernelSU-Next/KernelSU-Next?logo=gnu)](/LICENSE)
## 特性 ## 特性
@@ -28,7 +28,7 @@ KernelSU Next 支持从 4.4 到 6.6 的大多数安卓内核
## 用法 ## 用法
- [安装说明](https://rifsxd.github.io/KernelSU-Next/) - [安装说明](https://KernelSU-Next.github.io/KernelSU-Next/)
## 安全性 ## 安全性
@@ -41,9 +41,9 @@ KernelSU Next 支持从 4.4 到 6.6 的大多数安卓内核
## 鸣谢 ## 鸣谢
- [kernel-assisted-superuser](https://git.zx2c4.com/kernel-assisted-superuser/about/): KernelSU 的灵感. - [Kernel-Assisted Superuser](https://git.zx2c4.com/kernel-assisted-superuser/about/): KernelSU 的灵感.
- [Magisk](https://github.com/topjohnwu/Magisk): 强大的 Root 工具. - [Magisk](https://github.com/topjohnwu/Magisk): 强大的 Root 工具.
- [genuine](https://github.com/brevent/genuine/): apk v2 签名验证。 - [genuine](https://github.com/brevent/genuine/): APK v2 签名验证。
- [Diamorphine](https://github.com/m0nad/Diamorphine): 一些 Rootkit 技巧。 - [Diamorphine](https://github.com/m0nad/Diamorphine): 一些 Rootkit 技巧。
- [KernelSU](https://github.com/tiann/KernelSU): 感谢 tiann否则 KernelSU Next 根本不会存在。 - [KernelSU](https://github.com/tiann/KernelSU): 感谢 tiann否则 KernelSU Next 根本不会存在。
- [Magic Mount Port](https://github.com/5ec1cff/KernelSU/blob/main/userspace/ksud/src/magic_mount.rs): 💜 5ec1cff 為了拯救 KernelSU - [Magic Mount Port](https://github.com/5ec1cff/KernelSU/blob/main/userspace/ksud/src/magic_mount.rs): 💜 5ec1cff 為了拯救 KernelSU

View File

@@ -1,4 +1,4 @@
[English](README.md) | [简体中文](README_CN.md) | [繁體中文](README_TW.md) | [Türkçe](README_TR.md) | [Português (Brasil)](README_PT-BR.md) | [한국어](README_KO.md) | **Français** | [Bahasa Indonesia](README_ID.md) | [Русский](README_RU.md) | [ภาษาไทย](README_TH.md) [English](README.md) | [简体中文](README_CN.md) | [繁體中文](README_TW.md) | [Türkçe](README_TR.md) | [Português (Brasil)](README_PT-BR.md) | [한국어](README_KO.md) | **Français** | [Bahasa Indonesia](README_ID.md) | [Русский](README_RU.md) | [ภาษาไทย](README_TH.md) | [Tiếng Việt](README_VI.md)
# KernelSU Next # KernelSU Next
@@ -6,10 +6,10 @@
Une solution root basée sur le noyau pour les appareils Android. Une solution root basée sur le noyau pour les appareils Android.
[![Dernière version](https://img.shields.io/github/v/release/rifsxd/KernelSU-Next?label=Release&logo=github)](https://github.com/rifsxd/KernelSU-Next/releases/latest) [![Latest Release](https://img.shields.io/github/v/release/KernelSU-Next/KernelSU-Next?label=Release&logo=github)](https://github.com/KernelSU-Next/KernelSU-Next/releases/latest)
[![Version Nightly](https://img.shields.io/badge/Nightly%20Release-gray?logo=hackthebox&logoColor=fff)](https://nightly.link/rifsxd/KernelSU-Next/workflows/build-manager/next/manager) [![Nightly Release](https://img.shields.io/badge/Nightly%20Release-gray?logo=hackthebox&logoColor=fff)](https://nightly.link/KernelSU-Next/KernelSU-Next/workflows/build-manager-ci/next/Manager)
[![Licence : GPL v2](https://img.shields.io/badge/License-GPL%20v2-orange.svg?logo=gnu)](https://www.gnu.org/licenses/old-licenses/gpl-2.0.en.html) [![License: GPL v2](https://img.shields.io/badge/License-GPL%20v2-orange.svg?logo=gnu)](https://www.gnu.org/licenses/old-licenses/gpl-2.0.en.html)
[![Licence GitHub](https://img.shields.io/github/license/rifsxd/KernelSU-Next?logo=gnu)](/LICENSE) [![GitHub License](https://img.shields.io/github/license/KernelSU-Next/KernelSU-Next?logo=gnu)](/LICENSE)
## Fonctionnalités ## Fonctionnalités
@@ -28,7 +28,7 @@ Actuellement, seul `arm64-v8a` est pris en charge.
## Utilisation ## Utilisation
- [Instructions d'installation](https://rifsxd.github.io/KernelSU-Next/) - [Instructions d'installation](https://KernelSU-Next.github.io/KernelSU-Next/)
## Sécurité ## Sécurité
@@ -41,9 +41,9 @@ Pour signaler des vulnérabilités de sécurité dans KernelSU, consultez [SECUR
## Crédits ## Crédits
- [kernel-assisted-superuser](https://git.zx2c4.com/kernel-assisted-superuser/about/) : l'idée de KernelSU. - [Kernel-Assisted Superuser](https://git.zx2c4.com/kernel-assisted-superuser/about/) : L'idée de KernelSU.
- [Magisk](https://github.com/topjohnwu/Magisk) : l'outil root puissant. - [Magisk](https://github.com/topjohnwu/Magisk) : L'outil root puissant.
- [genuine](https://github.com/brevent/genuine/) : validation de signature apk v2. - [genuine](https://github.com/brevent/genuine/) : Validation de signature APK v2.
- [Diamorphine](https://github.com/m0nad/Diamorphine) : quelques techniques de rootkit. - [Diamorphine](https://github.com/m0nad/Diamorphine) : Quelques techniques de rootkit.
- [KernelSU](https://github.com/tiann/KernelSU) : merci à tiann, sans qui KernelSU Next n'existerait même pas. - [KernelSU](https://github.com/tiann/KernelSU) : Merci à tiann, sans qui KernelSU Next n'existerait même pas.
- [Magic Mount Port](https://github.com/5ec1cff/KernelSU/blob/main/userspace/ksud/src/magic_mount.rs) : 💜 5ec1cff pour avoir sauvé KernelSU ! - [Magic Mount Port](https://github.com/5ec1cff/KernelSU/blob/main/userspace/ksud/src/magic_mount.rs) : 💜 5ec1cff pour avoir sauvé KernelSU !

View File

@@ -1,4 +1,4 @@
[English](README.md) | [简体中文](README_CN.md) | [繁體中文](README_TW.md) | [Türkçe](README_TR.md) | [Português (Brasil)](README_PT-BR.md) | [한국어](README_KO.md) | [Français](README_FR.md) | **Bahasa Indonesia** | [Русский](README_RU.md) | [ภาษาไทย](README_TH.md) [English](README.md) | [简体中文](README_CN.md) | [繁體中文](README_TW.md) | [Türkçe](README_TR.md) | [Português (Brasil)](README_PT-BR.md) | [한국어](README_KO.md) | [Français](README_FR.md) | **Bahasa Indonesia** | [Русский](README_RU.md) | [ภาษาไทย](README_TH.md) | [Tiếng Việt](README_VI.md)
# KernelSU Next # KernelSU Next
@@ -6,10 +6,10 @@
Sebuah solusi root berbasis Kernel untuk perangkat Android. Sebuah solusi root berbasis Kernel untuk perangkat Android.
[![Latest Release](https://img.shields.io/github/v/release/rifsxd/KernelSU-Next?label=Release&logo=github)](https://github.com/rifsxd/KernelSU-Next/releases/latest) [![Latest Release](https://img.shields.io/github/v/release/KernelSU-Next/KernelSU-Next?label=Release&logo=github)](https://github.com/KernelSU-Next/KernelSU-Next/releases/latest)
[![Nightly Release](https://img.shields.io/badge/Nightly%20Release-gray?logo=hackthebox&logoColor=fff)](https://nightly.link/rifsxd/KernelSU-Next/workflows/build-manager/next/manager) [![Nightly Release](https://img.shields.io/badge/Nightly%20Release-gray?logo=hackthebox&logoColor=fff)](https://nightly.link/KernelSU-Next/KernelSU-Next/workflows/build-manager-ci/next/Manager)
[![License: GPL v2](https://img.shields.io/badge/License-GPL%20v2-orange.svg?logo=gnu)](https://www.gnu.org/licenses/old-licenses/gpl-2.0.en.html) [![License: GPL v2](https://img.shields.io/badge/License-GPL%20v2-orange.svg?logo=gnu)](https://www.gnu.org/licenses/old-licenses/gpl-2.0.en.html)
[![GitHub License](https://img.shields.io/github/license/rifsxd/KernelSU-Next?logo=gnu)](/LICENSE) [![GitHub License](https://img.shields.io/github/license/KernelSU-Next/KernelSU-Next?logo=gnu)](/LICENSE)
## Fitur ## Fitur
@@ -28,7 +28,7 @@ Saat ini, hanya `arm64-v8a` yang didukung.
## Penggunaan ## Penggunaan
- [Petunjuk instalasi](https://rifsxd.github.io/KernelSU-Next/) - [Petunjuk instalasi](https://KernelSU-Next.github.io/KernelSU-Next/)
## Keamanan ## Keamanan
@@ -41,9 +41,9 @@ Untuk informasi tentang melaporkan kerentanannya di KernelSU, lihat [SECURITY.md
## Kredit ## Kredit
- [kernel-assisted-superuser](https://git.zx2c4.com/kernel-assisted-superuser/about/): ide KernelSU. - [Kernel-Assisted Superuser](https://git.zx2c4.com/kernel-assisted-superuser/about/): Ide KernelSU.
- [Magisk](https://github.com/topjohnwu/Magisk): alat root yang kuat. - [Magisk](https://github.com/topjohnwu/Magisk): Alat root yang kuat.
- [genuine](https://github.com/brevent/genuine/): validasi tanda tangan apk v2. - [genuine](https://github.com/brevent/genuine/): Validasi tanda tangan APK v2.
- [Diamorphine](https://github.com/m0nad/Diamorphine): beberapa keterampilan rootkit. - [Diamorphine](https://github.com/m0nad/Diamorphine): Beberapa keterampilan rootkit.
- [KernelSU](https://github.com/tiann/KernelSU): terima kasih kepada tiann, jika tidak, KernelSU Next bahkan tidak akan ada. - [KernelSU](https://github.com/tiann/KernelSU): Terima kasih kepada tiann, jika tidak, KernelSU Next bahkan tidak akan ada.
- [Magic Mount Port](https://github.com/5ec1cff/KernelSU/blob/main/userspace/ksud/src/magic_mount.rs): 💜 5ec1cff karena menyelamatkan KernelSU! - [Magic Mount Port](https://github.com/5ec1cff/KernelSU/blob/main/userspace/ksud/src/magic_mount.rs): 💜 5ec1cff karena menyelamatkan KernelSU!

View File

@@ -1,4 +1,4 @@
[English](README.md) | [简体中文](README_CN.md) | [繁體中文](README_TW.md) | [Türkçe](README_TR.md) | [Português (Brasil)](README_PT-BR.md) | **한국어** | [Français](README_FR.md) | [Bahasa Indonesia](README_ID.md) | [Русский](README_RU.md) | [ภาษาไทย](README_TH.md) [English](README.md) | [简体中文](README_CN.md) | [繁體中文](README_TW.md) | [Türkçe](README_TR.md) | [Português (Brasil)](README_PT-BR.md) | **한국어** | [Français](README_FR.md) | [Bahasa Indonesia](README_ID.md) | [Русский](README_RU.md) | [ภาษาไทย](README_TH.md) | [Tiếng Việt](README_VI.md)
# KernelSU Next # KernelSU Next
@@ -6,10 +6,10 @@
안드로이드 기기들을 위한 커널 기반 루팅 솔루션입니다. 안드로이드 기기들을 위한 커널 기반 루팅 솔루션입니다.
[![Latest Release](https://img.shields.io/github/v/release/rifsxd/KernelSU-Next?label=Release&logo=github)](https://github.com/rifsxd/KernelSU-Next/releases/latest) [![Latest Release](https://img.shields.io/github/v/release/KernelSU-Next/KernelSU-Next?label=Release&logo=github)](https://github.com/KernelSU-Next/KernelSU-Next/releases/latest)
[![Nightly Release](https://img.shields.io/badge/Nightly%20Release-gray?logo=hackthebox&logoColor=fff)](https://nightly.link/rifsxd/KernelSU-Next/workflows/build-manager/next/manager) [![Nightly Release](https://img.shields.io/badge/Nightly%20Release-gray?logo=hackthebox&logoColor=fff)](https://nightly.link/KernelSU-Next/KernelSU-Next/workflows/build-manager-ci/next/Manager)
[![License: GPL v2](https://img.shields.io/badge/License-GPL%20v2-orange.svg?logo=gnu)](https://www.gnu.org/licenses/old-licenses/gpl-2.0.en.html) [![License: GPL v2](https://img.shields.io/badge/License-GPL%20v2-orange.svg?logo=gnu)](https://www.gnu.org/licenses/old-licenses/gpl-2.0.en.html)
[![GitHub License](https://img.shields.io/github/license/rifsxd/KernelSU-Next?logo=gnu)](/LICENSE) [![GitHub License](https://img.shields.io/github/license/KernelSU-Next/KernelSU-Next?logo=gnu)](/LICENSE)
## 기능 ## 기능
@@ -28,7 +28,7 @@ KernelSU Next는 공식적으로 대부분의 4.4부터 6.6의 안드로이드
## 사용 방법 ## 사용 방법
- [설치 방법](https://rifsxd.github.io/KernelSU-Next/) - [설치 방법](https://KernelSU-Next.github.io/KernelSU-Next/)
## 보안 ## 보안
@@ -41,9 +41,9 @@ KernelSU의 보안 취약점 보고에 대한 자세한 내용은 [SECURITY.md](
## 크레딧 ## 크레딧
- [kernel-assisted-superuser](https://git.zx2c4.com/kernel-assisted-superuser/about/): KernelSU의 아이디어 - [Kernel-Assisted Superuser](https://git.zx2c4.com/kernel-assisted-superuser/about/): KernelSU의 아이디어
- [Magisk](https://github.com/topjohnwu/Magisk): 강력한 루팅 도구 - [Magisk](https://github.com/topjohnwu/Magisk): 강력한 루팅 도구
- [genuine](https://github.com/brevent/genuine/): apk v2 서명 검사 - [genuine](https://github.com/brevent/genuine/): APK v2 서명 검사
- [Diamorphine](https://github.com/m0nad/Diamorphine): 일부 rootkit 기술 - [Diamorphine](https://github.com/m0nad/Diamorphine): 일부 rootkit 기술
- [KernelSU](https://github.com/tiann/KernelSU): KernelSU Next가 존재할 수 있게 해 준 tiann에게 감사드립니다. - [KernelSU](https://github.com/tiann/KernelSU): KernelSU Next가 존재할 수 있게 해 준 tiann에게 감사드립니다.
- [Magic Mount Port](https://github.com/5ec1cff/KernelSU/blob/main/userspace/ksud/src/magic_mount.rs): KernelSU를 구해준 5ec1cff에게 감사드립니다! - [Magic Mount Port](https://github.com/5ec1cff/KernelSU/blob/main/userspace/ksud/src/magic_mount.rs): KernelSU를 구해준 5ec1cff에게 감사드립니다!

View File

@@ -1,4 +1,4 @@
[English](README.md) | [简体中文](README_CN.md) | [繁體中文](README_TW.md) | [Türkçe](README_TR.md) | **Português (Brasil)** | [한국어](README_KO.md) | [Français](README_FR.md) | [Bahasa Indonesia](README_ID.md) | [Русский](README_RU.md) | [ภาษาไทย](README_TH.md) [English](README.md) | [简体中文](README_CN.md) | [繁體中文](README_TW.md) | [Türkçe](README_TR.md) | **Português (Brasil)** | [한국어](README_KO.md) | [Français](README_FR.md) | [Bahasa Indonesia](README_ID.md) | [Русский](README_RU.md) | [ภาษาไทย](README_TH.md) | [Tiếng Việt](README_VI.md)
# KernelSU Next # KernelSU Next
@@ -6,10 +6,10 @@
Uma solução root baseada em kernel para dispositivos Android. Uma solução root baseada em kernel para dispositivos Android.
[![Latest Release](https://img.shields.io/github/v/release/rifsxd/KernelSU-Next?label=Release&logo=github)](https://github.com/rifsxd/KernelSU-Next/releases/latest) [![Latest Release](https://img.shields.io/github/v/release/KernelSU-Next/KernelSU-Next?label=Release&logo=github)](https://github.com/KernelSU-Next/KernelSU-Next/releases/latest)
[![Nightly Release](https://img.shields.io/badge/Nightly%20Release-gray?logo=hackthebox&logoColor=fff)](https://nightly.link/rifsxd/KernelSU-Next/workflows/build-manager/next/manager) [![Nightly Release](https://img.shields.io/badge/Nightly%20Release-gray?logo=hackthebox&logoColor=fff)](https://nightly.link/KernelSU-Next/KernelSU-Next/workflows/build-manager-ci/next/Manager)
[![License: GPL v2](https://img.shields.io/badge/License-GPL%20v2-orange.svg?logo=gnu)](https://www.gnu.org/licenses/old-licenses/gpl-2.0.en.html) [![License: GPL v2](https://img.shields.io/badge/License-GPL%20v2-orange.svg?logo=gnu)](https://www.gnu.org/licenses/old-licenses/gpl-2.0.en.html)
[![GitHub License](https://img.shields.io/github/license/rifsxd/KernelSU-Next?logo=gnu)](/LICENSE) [![GitHub License](https://img.shields.io/github/license/KernelSU-Next/KernelSU-Next?logo=gnu)](/LICENSE)
## Características ## Características
@@ -24,11 +24,11 @@ KernelSU Next suporta oficialmente a maioria dos kernels Android a partir de 4.4
- Os kernels GKI 1.0 (4.19 - 5.4) precisam ser reconstruídos com o driver KernelSU. - Os kernels GKI 1.0 (4.19 - 5.4) precisam ser reconstruídos com o driver KernelSU.
- Os kernels EOL (<4.14) também precisam ser reconstruídos com o driver KernelSU (3.18+ é experimental e pode precisar portar algumas funções). - Os kernels EOL (<4.14) também precisam ser reconstruídos com o driver KernelSU (3.18+ é experimental e pode precisar portar algumas funções).
Atualmente, apenas `arm64-v8a` é suportado. Atualmente, apenas a arquitetura `arm64-v8a` é compatível.
## Uso ## Uso
- [Instruções de instalação](https://rifsxd.github.io/KernelSU-Next/) - [Instruções de instalação](https://KernelSU-Next.github.io/KernelSU-Next/)
## Segurança ## Segurança
@@ -39,11 +39,25 @@ Para obter informações sobre como relatar vulnerabilidades de segurança do Ke
- Os arquivos no diretório `kernel` são [GPL-2.0-only](https://www.gnu.org/licenses/old-licenses/gpl-2.0.en.html). - Os arquivos no diretório `kernel` são [GPL-2.0-only](https://www.gnu.org/licenses/old-licenses/gpl-2.0.en.html).
- Todas as outras partes, exceto o diretório `kernel` são [GPL-3.0-or-later](https://www.gnu.org/licenses/gpl-3.0.html). - Todas as outras partes, exceto o diretório `kernel` são [GPL-3.0-or-later](https://www.gnu.org/licenses/gpl-3.0.html).
## Doações
- 0x12b5224b7aca0121c2f003240a901e1d064371c1 [ USDT BEP20 ]
- TYUVMWGTcnR5svnDoX85DWHyqUAeyQcdjh [ USDT TRC20 ]
- 0x12b5224b7aca0121c2f003240a901e1d064371c1 [ USDT ERC20 ]
- 0x12b5224b7aca0121c2f003240a901e1d064371c1 [ ETH ERC20 ]
- Ld238uYBuRQdZB5YwdbkuU6ektBAAUByoL [ LTC ]
- 19QgifcjMjSr1wB2DJcea5cxitvWVcXMT6 [ BTC ]
## Créditos ## Créditos
- [kernel-assisted-superuser](https://git.zx2c4.com/kernel-assisted-superuser/about/): a ideia do KernelSU. - [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. - [Magisk](https://github.com/topjohnwu/Magisk): A poderosa ferramenta root.
- [genuine](https://github.com/brevent/genuine/): validação de assinatura apk v2. - [genuine](https://github.com/brevent/genuine/): Validação de assinatura APK v2.
- [Diamorphine](https://github.com/m0nad/Diamorphine): algumas habilidades de rootkit. - [Diamorphine](https://github.com/m0nad/Diamorphine): Algumas habilidades de rootkit.
- [KernelSU](https://github.com/tiann/KernelSU): obrigado a tiann, ou então o KernelSU Next nem existiria. - [KernelSU](https://github.com/tiann/KernelSU): Obrigado ao tiann, ou então o KernelSU Next nem existiria.
- [Magic Mount Port](https://github.com/5ec1cff/KernelSU/blob/main/userspace/ksud/src/magic_mount.rs): 💜 5ec1cff por salvar o KernelSU! - [Magic Mount Port](https://github.com/5ec1cff/KernelSU/blob/main/userspace/ksud/src/magic_mount.rs): 💜 5ec1cff por salvar o KernelSU!

View File

@@ -1,4 +1,4 @@
[English](README.md) | [简体中文](README_CN.md) | [繁體中文](README_TW.md) | [Türkçe](README_TR.md) | [Português (Brasil)](README_PT-BR.md) | [한국어](README_KO.md) | [Français](README_FR.md) | [Bahasa Indonesia](README_ID.md) | **Русский** | [ภาษาไทย](README_TH.md) [English](README.md) | [简体中文](README_CN.md) | [繁體中文](README_TW.md) | [Türkçe](README_TR.md) | [Português (Brasil)](README_PT-BR.md) | [한국어](README_KO.md) | [Français](README_FR.md) | [Bahasa Indonesia](README_ID.md) | **Русский** | [ภาษาไทย](README_TH.md) | [Tiếng Việt](README_VI.md)
# KernelSU Next # KernelSU Next
@@ -6,10 +6,10 @@
Root-решение для Android на базе ядра. Root-решение для Android на базе ядра.
[![Последний релиз](https://img.shields.io/github/v/release/rifsxd/KernelSU-Next?label=Release&logo=github)](https://github.com/rifsxd/KernelSU-Next/releases/latest) [![Latest Release](https://img.shields.io/github/v/release/KernelSU-Next/KernelSU-Next?label=Release&logo=github)](https://github.com/KernelSU-Next/KernelSU-Next/releases/latest)
[![Ночные сборки](https://img.shields.io/badge/Nightly%20Release-gray?logo=hackthebox&logoColor=fff)](https://nightly.link/rifsxd/KernelSU-Next/workflows/build-manager/next/manager) [![Nightly Release](https://img.shields.io/badge/Nightly%20Release-gray?logo=hackthebox&logoColor=fff)](https://nightly.link/KernelSU-Next/KernelSU-Next/workflows/build-manager-ci/next/Manager)
[![Лицензия: GPL v2](https://img.shields.io/badge/License-GPL%20v2-orange.svg?logo=gnu)](https://www.gnu.org/licenses/old-licenses/gpl-2.0.en.html) [![License: GPL v2](https://img.shields.io/badge/License-GPL%20v2-orange.svg?logo=gnu)](https://www.gnu.org/licenses/old-licenses/gpl-2.0.en.html)
[![Лицензия GitHub](https://img.shields.io/github/license/rifsxd/KernelSU-Next?logo=gnu)](/LICENSE) [![GitHub License](https://img.shields.io/github/license/KernelSU-Next/KernelSU-Next?logo=gnu)](/LICENSE)
## Функции ## Функции
@@ -28,7 +28,7 @@ KernelSU Next работает с большинством ядер Android (4.4
## Использование ## Использование
- [Инструкция по установке](https://rifsxd.github.io/KernelSU-Next/) - [Инструкция по установке](https://KernelSU-Next.github.io/KernelSU-Next/)
## Безопасность ## Безопасность
@@ -41,9 +41,9 @@ KernelSU Next работает с большинством ядер Android (4.4
## Благодарность ## Благодарность
- [kernel-assisted-superuser](https://git.zx2c4.com/kernel-assisted-superuser/about/): идея KernelSU. - [Kernel-Assisted Superuser](https://git.zx2c4.com/kernel-assisted-superuser/about/): Идея KernelSU.
- [Magisk](https://github.com/topjohnwu/Magisk): топовый инструмент для root. - [Magisk](https://github.com/topjohnwu/Magisk): Топовый инструмент для root.
- [genuine](https://github.com/brevent/genuine/): валидация подписи APK v2. - [genuine](https://github.com/brevent/genuine/): Валидация подписи APK v2.
- [Diamorphine](https://github.com/m0nad/Diamorphine): некоторые навыки rootkit. - [Diamorphine](https://github.com/m0nad/Diamorphine): Некоторые навыки rootkit.
- [KernelSU](https://github.com/tiann/KernelSU): спасибо tiann, без него KernelSU Next не релизнулся бы. - [KernelSU](https://github.com/tiann/KernelSU): Спасибо tiann, без него KernelSU Next не релизнулся бы.
- [Magic Mount Port](https://github.com/5ec1cff/KernelSU/blob/main/userspace/ksud/src/magic_mount.rs): 💜 5ec1cff за сохранение KernelSU! - [Magic Mount Port](https://github.com/5ec1cff/KernelSU/blob/main/userspace/ksud/src/magic_mount.rs): 💜 5ec1cff за сохранение KernelSU!

View File

@@ -1,4 +1,4 @@
[English](README.md) | [简体中文](README_CN.md) | [繁體中文](README_TW.md) | [Türkçe](README_TR.md) | [Português (Brasil)](README_PT-BR.md) | [한국어](README_KO.md) | [Français](README_FR.md) | [Bahasa Indonesia](README_ID.md) | [Русский](README_RU.md) | **ภาษาไทย** [English](README.md) | [简体中文](README_CN.md) | [繁體中文](README_TW.md) | [Türkçe](README_TR.md) | [Português (Brasil)](README_PT-BR.md) | [한국어](README_KO.md) | [Français](README_FR.md) | [Bahasa Indonesia](README_ID.md) | [Русский](README_RU.md) | **ภาษาไทย** | [Tiếng Việt](README_VI.md)
# KernelSU Next # KernelSU Next
@@ -6,10 +6,10 @@
โซลูชันรูทบนพื้นฐานเคอร์เนลสำหรับอุปกรณ์ Android โซลูชันรูทบนพื้นฐานเคอร์เนลสำหรับอุปกรณ์ Android
[![Latest Release](https://img.shields.io/github/v/release/rifsxd/KernelSU-Next?label=Release&logo=github)](https://github.com/rifsxd/KernelSU-Next/releases/latest) [![Latest Release](https://img.shields.io/github/v/release/KernelSU-Next/KernelSU-Next?label=Release&logo=github)](https://github.com/KernelSU-Next/KernelSU-Next/releases/latest)
[![Nightly Release](https://img.shields.io/badge/Nightly%20Release-gray?logo=hackthebox&logoColor=fff)](https://nightly.link/rifsxd/KernelSU-Next/workflows/build-manager/next/manager) [![Nightly Release](https://img.shields.io/badge/Nightly%20Release-gray?logo=hackthebox&logoColor=fff)](https://nightly.link/KernelSU-Next/KernelSU-Next/workflows/build-manager-ci/next/Manager)
[![License: GPL v2](https://img.shields.io/badge/License-GPL%20v2-orange.svg?logo=gnu)](https://www.gnu.org/licenses/old-licenses/gpl-2.0.en.html) [![License: GPL v2](https://img.shields.io/badge/License-GPL%20v2-orange.svg?logo=gnu)](https://www.gnu.org/licenses/old-licenses/gpl-2.0.en.html)
[![GitHub License](https://img.shields.io/github/license/rifsxd/KernelSU-Next?logo=gnu)](/LICENSE) [![GitHub License](https://img.shields.io/github/license/KernelSU-Next/KernelSU-Next?logo=gnu)](/LICENSE)
## คุณสมบัติ ## คุณสมบัติ
@@ -28,7 +28,7 @@ KernelSU Next รองรับแบบเป็นทางการตั้
## การใช้งาน ## การใช้งาน
- [คำแนะนำในการติดตั้ง](https://rifsxd.github.io/KernelSU-Next/) - [คำแนะนำในการติดตั้ง](https://KernelSU-Next.github.io/KernelSU-Next/)
## ความปลอดภัย ## ความปลอดภัย
@@ -41,9 +41,9 @@ KernelSU Next รองรับแบบเป็นทางการตั้
## เครดิต ## เครดิต
- [kernel-assisted-superuser](https://git.zx2c4.com/kernel-assisted-superuser/about/): ที่เป็นคนริเริ่มไอเดียเกี่ยวกับ KernelSU - [Kernel-Assisted Superuser](https://git.zx2c4.com/kernel-assisted-superuser/about/): ที่เป็นคนริเริ่มไอเดียเกี่ยวกับ KernelSU
- [Magisk](https://github.com/topjohnwu/Magisk): อุปกรณ์มือเกี่ยวกับรูทที่ทรงพลัง - [Magisk](https://github.com/topjohnwu/Magisk): อุปกรณ์มือเกี่ยวกับรูทที่ทรงพลัง
- [genuine](https://github.com/brevent/genuine/): การออกลายเซ็นให้กับไฟล์ apk v2 - [genuine](https://github.com/brevent/genuine/): การออกลายเซ็นให้กับไฟล์ APK v2
- [Diamorphine](https://github.com/m0nad/Diamorphine): ความรู้ความสามารถเกี่ยวกับ rootkit - [Diamorphine](https://github.com/m0nad/Diamorphine): ความรู้ความสามารถเกี่ยวกับ rootkit
- [KernelSU](https://github.com/tiann/KernelSU): ต้องขอบคุณ tiann ถ้าไม่มีคนนั้นก็ไม่มีสิ่งที่เรียกว่า KernelSU เกิดขึ้น - [KernelSU](https://github.com/tiann/KernelSU): ต้องขอบคุณ tiann ถ้าไม่มีคนนั้นก็ไม่มีสิ่งที่เรียกว่า KernelSU เกิดขึ้น
- [Magic Mount Port](https://github.com/5ec1cff/KernelSU/blob/main/userspace/ksud/src/magic_mount.rs): 💜 5ec1cff ที่ช่วย KernelSU ไว้ - [Magic Mount Port](https://github.com/5ec1cff/KernelSU/blob/main/userspace/ksud/src/magic_mount.rs): 💜 5ec1cff ที่ช่วย KernelSU ไว้

View File

@@ -1,4 +1,4 @@
[English](README.md) | [简体中文](README_CN.md) | [繁體中文](README_TW.md) | **Türkçe** | [Português (Brasil)](README_PT-BR.md) | [한국어](README_KO.md) | [Français](README_FR.md) | [Bahasa Indonesia](README_ID.md) | [Русский](README_RU.md) | [ภาษาไทย](README_TH.md) [English](README.md) | [简体中文](README_CN.md) | [繁體中文](README_TW.md) | **Türkçe** | [Português (Brasil)](README_PT-BR.md) | [한국어](README_KO.md) | [Français](README_FR.md) | [Bahasa Indonesia](README_ID.md) | [Русский](README_RU.md) | [ภาษาไทย](README_TH.md) | [Tiếng Việt](README_VI.md)
# KernelSU Next # KernelSU Next
@@ -6,10 +6,10 @@
Android cihazlar için Kernel tabanlı bir root çözümü. Android cihazlar için Kernel tabanlı bir root çözümü.
[![Latest Release](https://img.shields.io/github/v/release/rifsxd/KernelSU-Next?label=Release&logo=github)](https://github.com/rifsxd/KernelSU-Next/releases/latest) [![Latest Release](https://img.shields.io/github/v/release/KernelSU-Next/KernelSU-Next?label=Release&logo=github)](https://github.com/KernelSU-Next/KernelSU-Next/releases/latest)
[![Nightly Release](https://img.shields.io/badge/Nightly%20Release-gray?logo=hackthebox&logoColor=fff)](https://nightly.link/rifsxd/KernelSU-Next/workflows/build-manager/next/manager) [![Nightly Release](https://img.shields.io/badge/Nightly%20Release-gray?logo=hackthebox&logoColor=fff)](https://nightly.link/KernelSU-Next/KernelSU-Next/workflows/build-manager-ci/next/Manager)
[![License: GPL v2](https://img.shields.io/badge/License-GPL%20v2-orange.svg?logo=gnu)](https://www.gnu.org/licenses/old-licenses/gpl-2.0.en.html) [![License: GPL v2](https://img.shields.io/badge/License-GPL%20v2-orange.svg?logo=gnu)](https://www.gnu.org/licenses/old-licenses/gpl-2.0.en.html)
[![GitHub License](https://img.shields.io/github/license/rifsxd/KernelSU-Next?logo=gnu)](/LICENSE) [![GitHub License](https://img.shields.io/github/license/KernelSU-Next/KernelSU-Next?logo=gnu)](/LICENSE)
## Özellikler ## Özellikler
@@ -28,7 +28,7 @@ KernelSU Next, 4.4'dan başlayarak 6.6'ya kadar çoğu Android çekirdeğini res
## Kullanım ## Kullanım
- [Kurulum Talimatı](https://rifsxd.github.io/KernelSU-Next/) - [Kurulum Talimatı](https://KernelSU-Next.github.io/KernelSU-Next/)
## Güvenlik ## Güvenlik
@@ -41,9 +41,9 @@ KernelSU'daki güvenlik açıklarını bildirme hakkında bilgi için [SECURITY.
## Krediler ## Krediler
- [kernel-assisted-superuser](https://git.zx2c4.com/kernel-assisted-superuser/about/): KernelSU fikri. - [Kernel-Assisted Superuser](https://git.zx2c4.com/kernel-assisted-superuser/about/): KernelSU fikri.
- [Magisk](https://github.com/topjohnwu/Magisk): güçlü kök aracı. - [Magisk](https://github.com/topjohnwu/Magisk): Güçlü kök aracı.
- [genuine](https://github.com/brevent/genuine/): apk v2 imza doğrulama. - [genuine](https://github.com/brevent/genuine/): APK v2 imza doğrulama.
- [Diamorphine](https://github.com/m0nad/Diamorphine): bazı rootkit becerileri. - [Diamorphine](https://github.com/m0nad/Diamorphine): Bazı rootkit becerileri.
- [KernelSU](https://github.com/tiann/KernelSU): tiann'a teşekkürler, yoksa KernelSU Next var olamazdı bile. - [KernelSU](https://github.com/tiann/KernelSU): tiann'a teşekkürler, yoksa KernelSU Next var olamazdı bile.
- [Magic Mount Port](https://github.com/5ec1cff/KernelSU/blob/main/userspace/ksud/src/magic_mount.rs): 💜 5ec1cff KernelSU'yu kurtardığınız için! - [Magic Mount Port](https://github.com/5ec1cff/KernelSU/blob/main/userspace/ksud/src/magic_mount.rs): 💜 5ec1cff KernelSU'yu kurtardığınız için!

View File

@@ -1,19 +1,19 @@
[English](README.md) | [简体中文](README_CN.md) | **繁體中文** | [Türkçe](README_TR.md) | [Português (Brasil)](README_PT-BR.md) | [한국어](README_KO.md) | [Français](README_FR.md) | [Bahasa Indonesia](README_ID.md) | [Русский](README_RU.md) | [ภาษาไทย](README_TH.md) [English](README.md) | [简体中文](README_CN.md) | **繁體中文** | [Türkçe](README_TR.md) | [Português (Brasil)](README_PT-BR.md) | [한국어](README_KO.md) | [Français](README_FR.md) | [Bahasa Indonesia](README_ID.md) | [Русский](README_RU.md) | [ภาษาไทย](README_TH.md) | [Tiếng Việt](README_VI.md)
# KernelSU Next # KernelSU Next
<img src="/assets/kernelsu_next.png" style="width: 96px;" alt="logo"> <img src="/assets/kernelsu_next.png" style="width: 96px;" alt="logo">
基於內核的 Android 設備 root 解決方案 基於內核的 Android 設備 Root 解決方案
[![Latest Release](https://img.shields.io/github/v/release/rifsxd/KernelSU-Next?label=Release&logo=github)](https://github.com/rifsxd/KernelSU-Next/releases/latest) [![Latest Release](https://img.shields.io/github/v/release/KernelSU-Next/KernelSU-Next?label=Release&logo=github)](https://github.com/KernelSU-Next/KernelSU-Next/releases/latest)
[![Nightly Release](https://img.shields.io/badge/Nightly%20Release-gray?logo=hackthebox&logoColor=fff)](https://nightly.link/rifsxd/KernelSU-Next/workflows/build-manager/next/manager) [![Nightly Release](https://img.shields.io/badge/Nightly%20Release-gray?logo=hackthebox&logoColor=fff)](https://nightly.link/KernelSU-Next/KernelSU-Next/workflows/build-manager-ci/next/Manager)
[![License: GPL v2](https://img.shields.io/badge/License-GPL%20v2-orange.svg?logo=gnu)](https://www.gnu.org/licenses/old-licenses/gpl-2.0.en.html) [![License: GPL v2](https://img.shields.io/badge/License-GPL%20v2-orange.svg?logo=gnu)](https://www.gnu.org/licenses/old-licenses/gpl-2.0.en.html)
[![GitHub License](https://img.shields.io/github/license/rifsxd/KernelSU-Next?logo=gnu)](/LICENSE) [![GitHub License](https://img.shields.io/github/license/KernelSU-Next/KernelSU-Next?logo=gnu)](/LICENSE)
## 特性 ## 特性
1. 基於內核的 `su`root 權限管理 1. 基於內核的 `su`Root 權限管理
2. 基於動態掛載系統 [Magic Mount](https://topjohnwu.github.io/Magisk/details.html#magic-mount) / [OverlayFS](https://en.wikipedia.org/wiki/OverlayFS) 的模塊系統。 2. 基於動態掛載系統 [Magic Mount](https://topjohnwu.github.io/Magisk/details.html#magic-mount) / [OverlayFS](https://en.wikipedia.org/wiki/OverlayFS) 的模塊系統。
3. [App Profile](https://kernelsu.org/zh_CN/guide/app-profile.html):把 Root 權限關進籠子裡 3. [App Profile](https://kernelsu.org/zh_CN/guide/app-profile.html):把 Root 權限關進籠子裡
@@ -28,7 +28,7 @@ KernelSU Next 正式支持大多數從 4.4 到 6.6 的 Android 內核
## 用法 ## 用法
- [安裝說明](https://rifsxd.github.io/KernelSU-Next/) - [安裝說明](https://KernelSU-Next.github.io/KernelSU-Next/)
## 安全性 ## 安全性
@@ -41,9 +41,9 @@ KernelSU Next 正式支持大多數從 4.4 到 6.6 的 Android 內核
## 鳴謝 ## 鳴謝
- [kernel-assisted-superuser](https://git.zx2c4.com/kernel-assisted-superuser/about/): KernelSU 的靈感. - [Kernel-Assisted Superuser](https://git.zx2c4.com/kernel-assisted-superuser/about/): KernelSU 的靈感.
- [Magisk](https://github.com/topjohnwu/Magisk): 強大的 Root 工具. - [Magisk](https://github.com/topjohnwu/Magisk): 強大的 Root 工具.
- [genuine](https://github.com/brevent/genuine/): apk v2 簽名驗證。 - [genuine](https://github.com/brevent/genuine/): APK v2 簽名驗證。
- [Diamorphine](https://github.com/m0nad/Diamorphine): 一些 Rootkit 技巧。 - [Diamorphine](https://github.com/m0nad/Diamorphine): 一些 Rootkit 技巧。
- [KernelSU](https://github.com/tiann/KernelSU): 感謝 tiann否則 KernelSU Next 根本不會存在。 - [KernelSU](https://github.com/tiann/KernelSU): 感謝 tiann否則 KernelSU Next 根本不會存在。
- [Magic Mount Port](https://github.com/5ec1cff/KernelSU/blob/main/userspace/ksud/src/magic_mount.rs): 💜 5ec1cff 為了拯救 KernelSU - [Magic Mount Port](https://github.com/5ec1cff/KernelSU/blob/main/userspace/ksud/src/magic_mount.rs): 💜 5ec1cff 為了拯救 KernelSU

63
docs/README_VI.md Normal file
View File

@@ -0,0 +1,63 @@
[English](README.md) | [简体中文](README_CN.md) | [繁體中文](README_TW.md) | [Türkçe](README_TR.md) | [Português (Brasil)](README_PT-BR.md) | [한국어](README_KO.md) | [Français](README_FR.md) | [Bahasa Indonesia](README_ID.md) | [Русский](README_RU.md) | [ภาษาไทย](README_TH.md) | **Tiếng Việt**
# KernelSU Next
<img src="/assets/kernelsu_next.png" style="width: 96px;" alt="logo">
Một giải pháp root từ nhân linux dành cho các thiết bị chạy Android
[![Phiên bản mới nhất](https://img.shields.io/github/v/release/KernelSU-Next/KernelSU-Next?label=Release&logo=github)](https://github.com/KernelSU-Next/KernelSU-Next/releases/latest)
[![CI build mới nhất](https://img.shields.io/badge/Nightly%20Release-gray?logo=hackthebox&logoColor=fff)](https://nightly.link/KernelSU-Next/KernelSU-Next/workflows/build-manager-ci/next/Manager)
[![Gíây pháp: GPL v2](https://img.shields.io/badge/License-GPL%20v2-orange.svg?logo=gnu)](https://www.gnu.org/licenses/old-licenses/gpl-2.0.en.html)
[![Gíây phép GITHUB](https://img.shields.io/github/license/KernelSU-Next/KernelSU-Next?logo=gnu)](/LICENSE)
## Tính năng
1. Quản lý quyền truy cập SU dựa trên kernel android.
2. Hệ thống mount module dựa trên 1 trong 2 cơ chế mount [Magic Mount](https://topjohnwu.github.io/Magisk/details.html#magic-mount) / [OverlayFS](https://en.wikipedia.org/wiki/OverlayFS).
3. [App Profile](https://kernelsu.org/guide/app-profile.html): Quản lý quyền truy cập root 1 cách chặt chẽ
## Danh sách tương thích
KernelSU Next hỗ trợ chính thức các kernel Android từ phiên bản 4.4 đến 6.6
- GKI 2.0 (5.10+) kernels có thể cài đặt qua những .img/.zip đã được build sẵn và LKM/KMI hoặc tự vá qua manager (nếu được)
- GKI 1.0 (4.19 - 5.4) kernels cần dược build lại với các nhân KernelSU Next
- EOL (<4.14) kernels cần dược build lại với các nhân KernelSU Next (các kernels 3.18+ đang dược thử nghiệm và có thể cần backports 1 vài thứ ).
Hiện tại kernelSU Next chỉ hỗ trợ những cpu có `arm64-v8a`
## Sử dụng
- [Hướng dẫn vá KernelSU Next vào Kernel của bạn (yêu cầu kernel source)](https://KernelSU-Next.github.io/KernelSU-Next/)
## Bảo mật
Để biết thêm thông tin về việc báo cáo lỗ hổng bảo mật trong KernelSU Next vui lòng đọc (Thông tin sẽ dược gửi về KernelSU)[SECURITY.md](/SECURITY.md).
## Gíây phép
- Những thư mục/tập tin trong `kernel` là giấy phép [GPL-2.0-only](https://www.gnu.org/licenses/old-licenses/gpl-2.0.en.html).
- Những thư mục/tập tin ngoài `kernel` là giấy phép [GPL-3.0-or-later](https://www.gnu.org/licenses/gpl-3.0.html).
## Quyên góp/Hỗ trợ
- 0x12b5224b7aca0121c2f003240a901e1d064371c1 [ USDT BEP20 ]
- TYUVMWGTcnR5svnDoX85DWHyqUAeyQcdjh [ USDT TRC20 ]
- 0x12b5224b7aca0121c2f003240a901e1d064371c1 [ USDT ERC20 ]
- 0x12b5224b7aca0121c2f003240a901e1d064371c1 [ ETH ERC20 ]
- Ld238uYBuRQdZB5YwdbkuU6ektBAAUByoL [ LTC ]
- 19QgifcjMjSr1wB2DJcea5cxitvWVcXMT6 [ BTC ]
## Lời cảm ơn tới...
- [Kernel-Assisted Superuser](https://git.zx2c4.com/kernel-assisted-superuser/about/): Ý tưởng cho sự ra đời của KernelSU.
- [Magisk](https://github.com/topjohnwu/Magisk): Công cụ root mạnh mẽ, quen thuộc và tương thích cao cho các thiết bị chạy Android.
- [genuine](https://github.com/brevent/genuine/): Chữ kí apk v2.
- [Diamorphine](https://github.com/m0nad/Diamorphine): Một vài kỹ năng rootkit.
- [KernelSU](https://github.com/tiann/KernelSU): Nguồn gốc của KernelSU Next, thanks to tiann.
- [Magic Mount Port](https://github.com/5ec1cff/KernelSU/blob/main/userspace/ksud/src/magic_mount.rs): 5ec1cff - người đã cứu lấy KernelSU💜 !

View File

@@ -9,6 +9,14 @@ config KSU
To compile as a module, choose M here: the To compile as a module, choose M here: the
module will be called kernelsu. module will be called kernelsu.
config KSU_WITH_KPROBES
bool "Use kprobes for kernelsu"
depends on KSU
depends on KPROBES
default y
help
Disable if you use manual hooks.
config KSU_DEBUG config KSU_DEBUG
bool "KernelSU debug mode" bool "KernelSU debug mode"
depends on KSU depends on KSU

View File

@@ -26,7 +26,7 @@ $(info -- KernelSU-Next version: $(KSU_VERSION))
ccflags-y += -DKSU_VERSION=$(KSU_VERSION) ccflags-y += -DKSU_VERSION=$(KSU_VERSION)
else # If there is no .git file, the default version will be passed. else # If there is no .git file, the default version will be passed.
$(warning "KSU_GIT_VERSION not defined! It is better to make KernelSU-Next a git submodule!") $(warning "KSU_GIT_VERSION not defined! It is better to make KernelSU-Next a git submodule!")
ccflags-y += -DKSU_VERSION=16 ccflags-y += -DKSU_VERSION=11998
endif endif
ifeq ($(shell grep -q " current_sid(void)" $(srctree)/security/selinux/include/objsec.h; echo $$?),0) ifeq ($(shell grep -q " current_sid(void)" $(srctree)/security/selinux/include/objsec.h; echo $$?),0)
@@ -37,6 +37,18 @@ ifeq ($(shell grep -q "struct selinux_state " $(srctree)/security/selinux/includ
ccflags-y += -DKSU_COMPAT_HAS_SELINUX_STATE ccflags-y += -DKSU_COMPAT_HAS_SELINUX_STATE
endif endif
ifeq ($(shell grep -q "strncpy_from_user_nofault" $(srctree)/include/linux/uaccess.h; echo $$?),0)
ccflags-y += -DKSU_STRNCPY_FROM_USER_NOFAULT
endif
ifeq ($(shell grep -q "ssize_t kernel_read" $(srctree)/fs/read_write.c; echo $$?),0)
ccflags-y += -DKSU_KERNEL_READ
endif
ifeq ($(shell grep "ssize_t kernel_write" $(srctree)/fs/read_write.c | grep -q "const void" ; echo $$?),0)
ccflags-y += -DKSU_KERNEL_WRITE
endif
ifndef KSU_NEXT_EXPECTED_SIZE ifndef KSU_NEXT_EXPECTED_SIZE
KSU_NEXT_EXPECTED_SIZE := 0x3e6 KSU_NEXT_EXPECTED_SIZE := 0x3e6
endif endif

View File

@@ -1,3 +1,4 @@
#include <linux/capability.h>
#include <linux/compiler.h> #include <linux/compiler.h>
#include <linux/fs.h> #include <linux/fs.h>
#include <linux/gfp.h> #include <linux/gfp.h>
@@ -64,12 +65,14 @@ static void remove_uid_from_arr(uid_t uid)
static void init_default_profiles() static void init_default_profiles()
{ {
kernel_cap_t full_cap = CAP_FULL_SET;
default_root_profile.uid = 0; default_root_profile.uid = 0;
default_root_profile.gid = 0; default_root_profile.gid = 0;
default_root_profile.groups_count = 1; default_root_profile.groups_count = 1;
default_root_profile.groups[0] = 0; default_root_profile.groups[0] = 0;
memset(&default_root_profile.capabilities, 0xff, memcpy(&default_root_profile.capabilities.effective, &full_cap,
sizeof(default_root_profile.capabilities)); sizeof(default_root_profile.capabilities.effective));
default_root_profile.namespaces = 0; default_root_profile.namespaces = 0;
strcpy(default_root_profile.selinux_domain, KSU_DEFAULT_SELINUX_DOMAIN); strcpy(default_root_profile.selinux_domain, KSU_DEFAULT_SELINUX_DOMAIN);
@@ -152,11 +155,6 @@ static bool profile_valid(struct app_profile *profile)
return false; return false;
} }
if (forbid_system_uid(profile->current_uid)) {
pr_err("uid lower than 2000 is unsupported: %d\n", profile->current_uid);
return false;
}
if (profile->version < KSU_APP_PROFILE_VER) { if (profile->version < KSU_APP_PROFILE_VER) {
pr_info("Unsupported profile version: %d\n", profile->version); pr_info("Unsupported profile version: %d\n", profile->version);
return false; return false;

View File

@@ -53,6 +53,10 @@ static bool ksu_module_mounted = false;
extern int handle_sepolicy(unsigned long arg3, void __user *arg4); extern int handle_sepolicy(unsigned long arg3, void __user *arg4);
static bool ksu_su_compat_enabled = true;
extern void ksu_sucompat_init();
extern void ksu_sucompat_exit();
static inline bool is_allow_su() static inline bool is_allow_su()
{ {
if (is_manager()) { if (is_manager()) {
@@ -169,6 +173,7 @@ void escape_to_root(void)
cred->fsgid.val = profile->gid; cred->fsgid.val = profile->gid;
cred->sgid.val = profile->gid; cred->sgid.val = profile->gid;
cred->egid.val = profile->gid; cred->egid.val = profile->gid;
cred->securebits = 0;
BUILD_BUG_ON(sizeof(profile->capabilities.effective) != BUILD_BUG_ON(sizeof(profile->capabilities.effective) !=
sizeof(kernel_cap_t)); sizeof(kernel_cap_t));
@@ -180,14 +185,10 @@ void escape_to_root(void)
profile->capabilities.effective | CAP_DAC_READ_SEARCH; profile->capabilities.effective | CAP_DAC_READ_SEARCH;
memcpy(&cred->cap_effective, &cap_for_ksud, memcpy(&cred->cap_effective, &cap_for_ksud,
sizeof(cred->cap_effective)); sizeof(cred->cap_effective));
memcpy(&cred->cap_inheritable, &profile->capabilities.effective,
sizeof(cred->cap_inheritable));
memcpy(&cred->cap_permitted, &profile->capabilities.effective, memcpy(&cred->cap_permitted, &profile->capabilities.effective,
sizeof(cred->cap_permitted)); sizeof(cred->cap_permitted));
memcpy(&cred->cap_bset, &profile->capabilities.effective, memcpy(&cred->cap_bset, &profile->capabilities.effective,
sizeof(cred->cap_bset)); sizeof(cred->cap_bset));
memcpy(&cred->cap_ambient, &profile->capabilities.effective,
sizeof(cred->cap_ambient));
// set ambient caps to all-zero // set ambient caps to all-zero
// fixes "operation not permitted" on dbus cap dropping // fixes "operation not permitted" on dbus cap dropping
memset(&cred->cap_ambient, 0, memset(&cred->cap_ambient, 0,
@@ -247,6 +248,26 @@ int ksu_handle_rename(struct dentry *old_dentry, struct dentry *new_dentry)
return 0; return 0;
} }
static void nuke_ext4_sysfs() {
struct path path;
int err = kern_path("/data/adb/modules", 0, &path);
if (err) {
pr_err("nuke path err: %d\n", err);
return;
}
struct super_block* sb = path.dentry->d_inode->i_sb;
const char* name = sb->s_type->name;
if (strcmp(name, "ext4") != 0) {
pr_info("nuke but module aren't mounted\n");
path_put(&path);
return;
}
ext4_unregister_sysfs(sb);
path_put(&path);
}
int ksu_handle_prctl(int option, unsigned long arg2, unsigned long arg3, int ksu_handle_prctl(int option, unsigned long arg2, unsigned long arg3,
unsigned long arg4, unsigned long arg5) unsigned long arg4, unsigned long arg5)
{ {
@@ -305,12 +326,12 @@ int ksu_handle_prctl(int option, unsigned long arg2, unsigned long arg3,
if (copy_to_user(arg3, &version, sizeof(version))) { if (copy_to_user(arg3, &version, sizeof(version))) {
pr_err("prctl reply error, cmd: %lu\n", arg2); pr_err("prctl reply error, cmd: %lu\n", arg2);
} }
u32 version_flags = 0;
#ifdef MODULE #ifdef MODULE
u32 is_lkm = 0x1; version_flags |= 0x1;
#else
u32 is_lkm = 0x0;
#endif #endif
if (arg4 && copy_to_user(arg4, &is_lkm, sizeof(is_lkm))) { if (arg4 &&
copy_to_user(arg4, &version_flags, sizeof(version_flags))) {
pr_err("prctl reply error, cmd: %lu\n", arg2); pr_err("prctl reply error, cmd: %lu\n", arg2);
} }
return 0; return 0;
@@ -341,6 +362,7 @@ int ksu_handle_prctl(int option, unsigned long arg2, unsigned long arg3,
case EVENT_MODULE_MOUNTED: { case EVENT_MODULE_MOUNTED: {
ksu_module_mounted = true; ksu_module_mounted = true;
pr_info("module mounted!\n"); pr_info("module mounted!\n");
nuke_ext4_sysfs();
break; break;
} }
default: default:
@@ -456,6 +478,39 @@ int ksu_handle_prctl(int option, unsigned long arg2, unsigned long arg3,
return 0; return 0;
} }
if (arg2 == CMD_IS_SU_ENABLED) {
if (copy_to_user(arg3, &ksu_su_compat_enabled,
sizeof(ksu_su_compat_enabled))) {
pr_err("copy su compat failed\n");
return 0;
}
if (copy_to_user(result, &reply_ok, sizeof(reply_ok))) {
pr_err("prctl reply error, cmd: %lu\n", arg2);
}
return 0;
}
if (arg2 == CMD_ENABLE_SU) {
bool enabled = (arg3 != 0);
if (enabled == ksu_su_compat_enabled) {
pr_info("cmd enable su but no need to change.\n");
return 0;
}
if (enabled) {
ksu_sucompat_init();
} else {
ksu_sucompat_exit();
}
ksu_su_compat_enabled = enabled;
if (copy_to_user(result, &reply_ok, sizeof(reply_ok))) {
pr_err("prctl reply error, cmd: %lu\n", arg2);
}
return 0;
}
return 0; return 0;
} }
@@ -589,6 +644,10 @@ int ksu_handle_setuid(struct cred *new, const struct cred *old)
// try umount hosts file // try umount hosts file
try_umount("/system/etc/hosts", false, MNT_DETACH); try_umount("/system/etc/hosts", false, MNT_DETACH);
// try umount lsposed dex2oat bins
try_umount("/apex/com.android.art/bin/dex2oat64", false, MNT_DETACH);
try_umount("/apex/com.android.art/bin/dex2oat32", false, MNT_DETACH);
return 0; return 0;
} }
@@ -891,7 +950,7 @@ void __init ksu_core_init(void)
void ksu_core_exit(void) void ksu_core_exit(void)
{ {
#ifdef CONFIG_KPROBES #ifdef CONFIG_KSU_WITH_KPROBES
pr_info("ksu_core_kprobe_exit\n"); pr_info("ksu_core_kprobe_exit\n");
// we dont use this now // we dont use this now
// ksu_kprobe_exit(); // ksu_kprobe_exit();

View File

@@ -107,7 +107,7 @@ struct file *ksu_filp_open_compat(const char *filename, int flags, umode_t mode)
ssize_t ksu_kernel_read_compat(struct file *p, void *buf, size_t count, ssize_t ksu_kernel_read_compat(struct file *p, void *buf, size_t count,
loff_t *pos) loff_t *pos)
{ {
#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 14, 0) #if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 14, 0) || defined(KSU_KERNEL_READ)
return kernel_read(p, buf, count, pos); return kernel_read(p, buf, count, pos);
#else #else
loff_t offset = pos ? *pos : 0; loff_t offset = pos ? *pos : 0;
@@ -122,7 +122,7 @@ ssize_t ksu_kernel_read_compat(struct file *p, void *buf, size_t count,
ssize_t ksu_kernel_write_compat(struct file *p, const void *buf, size_t count, ssize_t ksu_kernel_write_compat(struct file *p, const void *buf, size_t count,
loff_t *pos) loff_t *pos)
{ {
#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 14, 0) #if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 14, 0) || defined(KSU_KERNEL_WRITE)
return kernel_write(p, buf, count, pos); return kernel_write(p, buf, count, pos);
#else #else
loff_t offset = pos ? *pos : 0; loff_t offset = pos ? *pos : 0;
@@ -134,7 +134,7 @@ ssize_t ksu_kernel_write_compat(struct file *p, const void *buf, size_t count,
#endif #endif
} }
#if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 8, 0) #if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 8, 0) || defined(KSU_STRNCPY_FROM_USER_NOFAULT)
long ksu_strncpy_from_user_nofault(char *dst, const void __user *unsafe_addr, long ksu_strncpy_from_user_nofault(char *dst, const void __user *unsafe_addr,
long count) long count)
{ {

View File

@@ -57,7 +57,7 @@ int __init kernelsu_init(void)
ksu_throne_tracker_init(); ksu_throne_tracker_init();
#ifdef CONFIG_KPROBES #ifdef CONFIG_KSU_WITH_KPROBES
ksu_sucompat_init(); ksu_sucompat_init();
ksu_ksud_init(); ksu_ksud_init();
#else #else
@@ -80,7 +80,7 @@ void kernelsu_exit(void)
destroy_workqueue(ksu_workqueue); destroy_workqueue(ksu_workqueue);
#ifdef CONFIG_KPROBES #ifdef CONFIG_KSU_WITH_KPROBES
ksu_ksud_exit(); ksu_ksud_exit();
ksu_sucompat_exit(); ksu_sucompat_exit();
#endif #endif

View File

@@ -21,6 +21,8 @@
#define CMD_SET_APP_PROFILE 11 #define CMD_SET_APP_PROFILE 11
#define CMD_UID_GRANTED_ROOT 12 #define CMD_UID_GRANTED_ROOT 12
#define CMD_UID_SHOULD_UMOUNT 13 #define CMD_UID_SHOULD_UMOUNT 13
#define CMD_IS_SU_ENABLED 14
#define CMD_ENABLE_SU 15
#define EVENT_POST_FS_DATA 1 #define EVENT_POST_FS_DATA 1
#define EVENT_BOOT_COMPLETED 2 #define EVENT_BOOT_COMPLETED 2

View File

@@ -54,15 +54,16 @@ static void stop_vfs_read_hook();
static void stop_execve_hook(); static void stop_execve_hook();
static void stop_input_hook(); static void stop_input_hook();
#ifdef CONFIG_KPROBES #ifdef CONFIG_KSU_WITH_KPROBES
static struct work_struct stop_vfs_read_work; static struct work_struct stop_vfs_read_work;
static struct work_struct stop_execve_hook_work; static struct work_struct stop_execve_hook_work;
static struct work_struct stop_input_hook_work; static struct work_struct stop_input_hook_work;
#else #endif
bool ksu_vfs_read_hook __read_mostly = true; bool ksu_vfs_read_hook __read_mostly = true;
bool ksu_execveat_hook __read_mostly = true; bool ksu_execveat_hook __read_mostly = true;
bool ksu_input_hook __read_mostly = true; bool ksu_input_hook __read_mostly = true;
#endif
u32 ksu_devpts_sid; u32 ksu_devpts_sid;
@@ -157,7 +158,7 @@ int ksu_handle_execveat_ksud(int *fd, struct filename **filename_ptr,
struct user_arg_ptr *argv, struct user_arg_ptr *argv,
struct user_arg_ptr *envp, int *flags) struct user_arg_ptr *envp, int *flags)
{ {
#ifndef CONFIG_KPROBES #ifndef CONFIG_KSU_WITH_KPROBES
if (!ksu_execveat_hook) { if (!ksu_execveat_hook) {
return 0; return 0;
} }
@@ -313,7 +314,7 @@ static ssize_t read_iter_proxy(struct kiocb *iocb, struct iov_iter *to)
int ksu_handle_vfs_read(struct file **file_ptr, char __user **buf_ptr, int ksu_handle_vfs_read(struct file **file_ptr, char __user **buf_ptr,
size_t *count_ptr, loff_t **pos) size_t *count_ptr, loff_t **pos)
{ {
#ifndef CONFIG_KPROBES #ifndef CONFIG_KSU_WITH_KPROBES
if (!ksu_vfs_read_hook) { if (!ksu_vfs_read_hook) {
return 0; return 0;
} }
@@ -426,7 +427,7 @@ static bool is_volumedown_enough(unsigned int count)
int ksu_handle_input_handle_event(unsigned int *type, unsigned int *code, int ksu_handle_input_handle_event(unsigned int *type, unsigned int *code,
int *value) int *value)
{ {
#ifndef CONFIG_KPROBES #ifndef CONFIG_KSU_WITH_KPROBES
if (!ksu_input_hook) { if (!ksu_input_hook) {
return 0; return 0;
} }
@@ -468,7 +469,7 @@ bool ksu_is_safe_mode()
return false; return false;
} }
#ifdef CONFIG_KPROBES #ifdef CONFIG_KSU_WITH_KPROBES
// https://elixir.bootlin.com/linux/v5.10.158/source/fs/exec.c#L1864 // https://elixir.bootlin.com/linux/v5.10.158/source/fs/exec.c#L1864
static int execve_handler_pre(struct kprobe *p, struct pt_regs *regs) static int execve_handler_pre(struct kprobe *p, struct pt_regs *regs)
@@ -598,7 +599,7 @@ static void do_stop_input_hook(struct work_struct *work)
static void stop_vfs_read_hook() static void stop_vfs_read_hook()
{ {
#ifdef CONFIG_KPROBES #ifdef CONFIG_KSU_WITH_KPROBES
bool ret = schedule_work(&stop_vfs_read_work); bool ret = schedule_work(&stop_vfs_read_work);
pr_info("unregister vfs_read kprobe: %d!\n", ret); pr_info("unregister vfs_read kprobe: %d!\n", ret);
#else #else
@@ -609,7 +610,7 @@ static void stop_vfs_read_hook()
static void stop_execve_hook() static void stop_execve_hook()
{ {
#ifdef CONFIG_KPROBES #ifdef CONFIG_KSU_WITH_KPROBES
bool ret = schedule_work(&stop_execve_hook_work); bool ret = schedule_work(&stop_execve_hook_work);
pr_info("unregister execve kprobe: %d!\n", ret); pr_info("unregister execve kprobe: %d!\n", ret);
#else #else
@@ -620,15 +621,16 @@ static void stop_execve_hook()
static void stop_input_hook() static void stop_input_hook()
{ {
#ifdef CONFIG_KSU_WITH_KPROBES
static bool input_hook_stopped = false; static bool input_hook_stopped = false;
if (input_hook_stopped) { if (input_hook_stopped) {
return; return;
} }
input_hook_stopped = true; input_hook_stopped = true;
#ifdef CONFIG_KPROBES
bool ret = schedule_work(&stop_input_hook_work); bool ret = schedule_work(&stop_input_hook_work);
pr_info("unregister input kprobe: %d!\n", ret); pr_info("unregister input kprobe: %d!\n", ret);
#else #else
if (!ksu_input_hook) { return; }
ksu_input_hook = false; ksu_input_hook = false;
pr_info("stop input_hook\n"); pr_info("stop input_hook\n");
#endif #endif
@@ -637,7 +639,7 @@ static void stop_input_hook()
// ksud: module support // ksud: module support
void ksu_ksud_init() void ksu_ksud_init()
{ {
#ifdef CONFIG_KPROBES #ifdef CONFIG_KSU_WITH_KPROBES
int ret; int ret;
ret = register_kprobe(&execve_kp); ret = register_kprobe(&execve_kp);
@@ -657,10 +659,10 @@ void ksu_ksud_init()
void ksu_ksud_exit() void ksu_ksud_exit()
{ {
#ifdef CONFIG_KPROBES #ifdef CONFIG_KSU_WITH_KPROBES
unregister_kprobe(&execve_kp); unregister_kprobe(&execve_kp);
// this should be done before unregister vfs_read_kp // this should be done before unregister vfs_read_kp
// unregister_kprobe(&vfs_read_kp); // unregister_kprobe(&vfs_read_kp);
unregister_kprobe(&input_event_kp); unregister_kprobe(&input_event_kp);
#endif #endif
} }

View File

@@ -39,7 +39,7 @@ perform_cleanup() {
# Sets up or update KernelSU-Next environment # Sets up or update KernelSU-Next environment
setup_kernelsu() { setup_kernelsu() {
echo "[+] Setting up KernelSU-Next..." echo "[+] Setting up KernelSU-Next..."
test -d "$GKI_ROOT/KernelSU-Next" || git clone https://github.com/rifsxd/KernelSU-Next && echo "[+] Repository cloned." test -d "$GKI_ROOT/KernelSU-Next" || git clone https://github.com/KernelSU-Next/KernelSU-Next && echo "[+] Repository cloned."
cd "$GKI_ROOT/KernelSU-Next" cd "$GKI_ROOT/KernelSU-Next"
git stash && echo "[-] Stashed current changes." git stash && echo "[-] Stashed current changes."
if [ "$(git status | grep -Po 'v\d+(\.\d+)*' | head -n1)" ]; then if [ "$(git status | grep -Po 'v\d+(\.\d+)*' | head -n1)" ]; then

View File

@@ -24,6 +24,12 @@
#define SU_PATH "/system/bin/su" #define SU_PATH "/system/bin/su"
#define SH_PATH "/system/bin/sh" #define SH_PATH "/system/bin/sh"
bool ksu_faccessat_hook __read_mostly = true;
bool ksu_stat_hook __read_mostly = true;
bool ksu_execve_sucompat_hook __read_mostly = true;
bool ksu_execveat_sucompat_hook __read_mostly = true;
bool ksu_devpts_hook __read_mostly = true;
extern void escape_to_root(); extern void escape_to_root();
static void __user *userspace_stack_buffer(const void *d, size_t len) static void __user *userspace_stack_buffer(const void *d, size_t len)
@@ -54,6 +60,12 @@ int ksu_handle_faccessat(int *dfd, const char __user **filename_user, int *mode,
{ {
const char su[] = SU_PATH; const char su[] = SU_PATH;
#ifndef CONFIG_KSU_WITH_KPROBES
if (!ksu_faccessat_hook) {
return 0;
}
#endif
if (!ksu_is_allow_uid(current_uid().val)) { if (!ksu_is_allow_uid(current_uid().val)) {
return 0; return 0;
} }
@@ -75,6 +87,12 @@ int ksu_handle_stat(int *dfd, const char __user **filename_user, int *flags)
// const char sh[] = SH_PATH; // const char sh[] = SH_PATH;
const char su[] = SU_PATH; const char su[] = SU_PATH;
#ifndef CONFIG_KSU_WITH_KPROBES
if (!ksu_stat_hook){
return 0;
}
#endif
if (!ksu_is_allow_uid(current_uid().val)) { if (!ksu_is_allow_uid(current_uid().val)) {
return 0; return 0;
} }
@@ -119,6 +137,12 @@ int ksu_handle_execveat_sucompat(int *fd, struct filename **filename_ptr,
const char sh[] = KSUD_PATH; const char sh[] = KSUD_PATH;
const char su[] = SU_PATH; const char su[] = SU_PATH;
#ifndef CONFIG_KSU_WITH_KPROBES
if (!ksu_execveat_sucompat_hook) {
return 0;
}
#endif
if (unlikely(!filename_ptr)) if (unlikely(!filename_ptr))
return 0; return 0;
@@ -148,6 +172,12 @@ int ksu_handle_execve_sucompat(int *fd, const char __user **filename_user,
const char su[] = SU_PATH; const char su[] = SU_PATH;
char path[sizeof(su) + 1]; char path[sizeof(su) + 1];
#ifndef CONFIG_KSU_WITH_KPROBES
if (!ksu_execve_sucompat_hook) {
return 0;
}
#endif
if (unlikely(!filename_user)) if (unlikely(!filename_user))
return 0; return 0;
@@ -170,6 +200,12 @@ int ksu_handle_execve_sucompat(int *fd, const char __user **filename_user,
int ksu_handle_devpts(struct inode *inode) int ksu_handle_devpts(struct inode *inode)
{ {
#ifndef CONFIG_KSU_WITH_KPROBES
if (!ksu_devpts_hook) {
return 0;
}
#endif
if (!current->mm) { if (!current->mm) {
return 0; return 0;
} }
@@ -198,21 +234,9 @@ int ksu_handle_devpts(struct inode *inode)
return 0; return 0;
} }
#ifdef CONFIG_KPROBES #ifdef CONFIG_KSU_WITH_KPROBES
__maybe_unused static int faccessat_handler_pre(struct kprobe *p, static int faccessat_handler_pre(struct kprobe *p, struct pt_regs *regs)
struct pt_regs *regs)
{
int *dfd = (int *)&PT_REGS_PARM1(regs);
const char __user **filename_user = (const char **)&PT_REGS_PARM2(regs);
int *mode = (int *)&PT_REGS_PARM3(regs);
// Both sys_ and do_ is C function
int *flags = (int *)&PT_REGS_CCALL_PARM4(regs);
return ksu_handle_faccessat(dfd, filename_user, mode, flags);
}
static int sys_faccessat_handler_pre(struct kprobe *p, struct pt_regs *regs)
{ {
struct pt_regs *real_regs = PT_REAL_REGS(regs); struct pt_regs *real_regs = PT_REAL_REGS(regs);
int *dfd = (int *)&PT_REGS_PARM1(real_regs); int *dfd = (int *)&PT_REGS_PARM1(real_regs);
@@ -223,23 +247,7 @@ static int sys_faccessat_handler_pre(struct kprobe *p, struct pt_regs *regs)
return ksu_handle_faccessat(dfd, filename_user, mode, NULL); return ksu_handle_faccessat(dfd, filename_user, mode, NULL);
} }
__maybe_unused static int newfstatat_handler_pre(struct kprobe *p, static int newfstatat_handler_pre(struct kprobe *p, struct pt_regs *regs)
struct pt_regs *regs)
{
int *dfd = (int *)&PT_REGS_PARM1(regs);
const char __user **filename_user = (const char **)&PT_REGS_PARM2(regs);
#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 11, 0)
// static int vfs_statx(int dfd, const char __user *filename, int flags, struct kstat *stat, u32 request_mask)
int *flags = (int *)&PT_REGS_PARM3(regs);
#else
// int vfs_fstatat(int dfd, const char __user *filename, struct kstat *stat,int flag)
int *flags = (int *)&PT_REGS_CCALL_PARM4(regs);
#endif
return ksu_handle_stat(dfd, filename_user, flags);
}
static int sys_newfstatat_handler_pre(struct kprobe *p, struct pt_regs *regs)
{ {
struct pt_regs *real_regs = PT_REAL_REGS(regs); struct pt_regs *real_regs = PT_REAL_REGS(regs);
int *dfd = (int *)&PT_REGS_PARM1(real_regs); int *dfd = (int *)&PT_REGS_PARM1(real_regs);
@@ -250,17 +258,7 @@ static int sys_newfstatat_handler_pre(struct kprobe *p, struct pt_regs *regs)
return ksu_handle_stat(dfd, filename_user, flags); return ksu_handle_stat(dfd, filename_user, flags);
} }
// https://elixir.bootlin.com/linux/v5.10.158/source/fs/exec.c#L1864
static int execve_handler_pre(struct kprobe *p, struct pt_regs *regs) static int execve_handler_pre(struct kprobe *p, struct pt_regs *regs)
{
int *fd = (int *)&PT_REGS_PARM1(regs);
struct filename **filename_ptr =
(struct filename **)&PT_REGS_PARM2(regs);
return ksu_handle_execveat_sucompat(fd, filename_ptr, NULL, NULL, NULL);
}
static int sys_execve_handler_pre(struct kprobe *p, struct pt_regs *regs)
{ {
struct pt_regs *real_regs = PT_REAL_REGS(regs); struct pt_regs *real_regs = PT_REAL_REGS(regs);
const char __user **filename_user = const char __user **filename_user =
@@ -270,56 +268,6 @@ static int sys_execve_handler_pre(struct kprobe *p, struct pt_regs *regs)
NULL); NULL);
} }
#if 1
static struct kprobe faccessat_kp = {
.symbol_name = SYS_FACCESSAT_SYMBOL,
.pre_handler = sys_faccessat_handler_pre,
};
#else
static struct kprobe faccessat_kp = {
#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 17, 0)
.symbol_name = "do_faccessat",
#else
.symbol_name = "sys_faccessat",
#endif
.pre_handler = faccessat_handler_pre,
};
#endif
#if 1
static struct kprobe newfstatat_kp = {
.symbol_name = SYS_NEWFSTATAT_SYMBOL,
.pre_handler = sys_newfstatat_handler_pre,
};
#else
static struct kprobe newfstatat_kp = {
#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 11, 0)
.symbol_name = "vfs_statx",
#else
.symbol_name = "vfs_fstatat",
#endif
.pre_handler = newfstatat_handler_pre,
};
#endif
#if 1
static struct kprobe execve_kp = {
.symbol_name = SYS_EXECVE_SYMBOL,
.pre_handler = sys_execve_handler_pre,
};
#else
static struct kprobe execve_kp = {
#if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 9, 0)
.symbol_name = "do_execveat_common",
#elif LINUX_VERSION_CODE >= KERNEL_VERSION(4, 19, 0)
.symbol_name = "__do_execve_file",
#elif LINUX_VERSION_CODE >= KERNEL_VERSION(3, 19, 0)
.symbol_name = "do_execveat_common",
#endif
.pre_handler = execve_handler_pre,
};
#endif
static int pts_unix98_lookup_pre(struct kprobe *p, struct pt_regs *regs) static int pts_unix98_lookup_pre(struct kprobe *p, struct pt_regs *regs)
{ {
struct inode *inode; struct inode *inode;
@@ -333,35 +281,69 @@ static int pts_unix98_lookup_pre(struct kprobe *p, struct pt_regs *regs)
return ksu_handle_devpts(inode); return ksu_handle_devpts(inode);
} }
static struct kprobe pts_unix98_lookup_kp = { .symbol_name = static struct kprobe *init_kprobe(const char *name,
"pts_unix98_lookup", kprobe_pre_handler_t handler)
.pre_handler = {
pts_unix98_lookup_pre }; struct kprobe *kp = kzalloc(sizeof(struct kprobe), GFP_KERNEL);
if (!kp)
return NULL;
kp->symbol_name = name;
kp->pre_handler = handler;
int ret = register_kprobe(kp);
pr_info("sucompat: register_%s kprobe: %d\n", name, ret);
if (ret) {
kfree(kp);
return NULL;
}
return kp;
}
static void destroy_kprobe(struct kprobe **kp_ptr)
{
struct kprobe *kp = *kp_ptr;
if (!kp)
return;
unregister_kprobe(kp);
synchronize_rcu();
kfree(kp);
*kp_ptr = NULL;
}
static struct kprobe *su_kps[4];
#endif #endif
// sucompat: permited process can execute 'su' to gain root access. // sucompat: permited process can execute 'su' to gain root access.
void ksu_sucompat_init() void ksu_sucompat_init()
{ {
#ifdef CONFIG_KPROBES #ifdef CONFIG_KSU_WITH_KPROBES
int ret; su_kps[0] = init_kprobe(SYS_EXECVE_SYMBOL, execve_handler_pre);
ret = register_kprobe(&execve_kp); su_kps[1] = init_kprobe(SYS_FACCESSAT_SYMBOL, faccessat_handler_pre);
pr_info("sucompat: execve_kp: %d\n", ret); su_kps[2] = init_kprobe(SYS_NEWFSTATAT_SYMBOL, newfstatat_handler_pre);
ret = register_kprobe(&newfstatat_kp); su_kps[3] = init_kprobe("pts_unix98_lookup", pts_unix98_lookup_pre);
pr_info("sucompat: newfstatat_kp: %d\n", ret); #else
ret = register_kprobe(&faccessat_kp); ksu_faccessat_hook = true;
pr_info("sucompat: faccessat_kp: %d\n", ret); ksu_stat_hook = true;
ret = register_kprobe(&pts_unix98_lookup_kp); ksu_execve_sucompat_hook = true;
pr_info("sucompat: devpts_kp: %d\n", ret); ksu_execveat_sucompat_hook = true;
ksu_devpts_hook = true;
pr_info("ksu_sucompat_init: hooks enabled: execve/execveat_su, faccessat, stat, devpts\n");
#endif #endif
} }
void ksu_sucompat_exit() void ksu_sucompat_exit()
{ {
#ifdef CONFIG_KPROBES #ifdef CONFIG_KSU_WITH_KPROBES
unregister_kprobe(&execve_kp); for (int i = 0; i < ARRAY_SIZE(su_kps); i++) {
unregister_kprobe(&newfstatat_kp); destroy_kprobe(&su_kps[i]);
unregister_kprobe(&faccessat_kp); }
unregister_kprobe(&pts_unix98_lookup_kp); #else
ksu_faccessat_hook = false;
ksu_stat_hook = false;
ksu_execve_sucompat_hook = false;
ksu_execveat_sucompat_hook = false;
ksu_devpts_hook = false;
pr_info("ksu_sucompat_exit: hooks disabled: execve/execveat_su, faccessat, stat, devpts\n");
#endif #endif
} }

View File

@@ -296,3 +296,13 @@ JNIEXPORT jboolean JNICALL
Java_com_rifsxd_ksunext_Natives_uidShouldUmount(JNIEnv *env, jobject thiz, jint uid) { Java_com_rifsxd_ksunext_Natives_uidShouldUmount(JNIEnv *env, jobject thiz, jint uid) {
return uid_should_umount(uid); return uid_should_umount(uid);
} }
extern "C"
JNIEXPORT jboolean JNICALL
Java_com_rifsxd_ksunext_Natives_isSuEnabled(JNIEnv *env, jobject thiz) {
return is_su_enabled();
}
extern "C"
JNIEXPORT jboolean JNICALL
Java_com_rifsxd_ksunext_Natives_setSuEnabled(JNIEnv *env, jobject thiz, jboolean enabled) {
return set_su_enabled(enabled);
}

View File

@@ -27,6 +27,8 @@
#define CMD_IS_UID_GRANTED_ROOT 12 #define CMD_IS_UID_GRANTED_ROOT 12
#define CMD_IS_UID_SHOULD_UMOUNT 13 #define CMD_IS_UID_SHOULD_UMOUNT 13
#define CMD_IS_SU_ENABLED 14
#define CMD_ENABLE_SU 15
static bool ksuctl(int cmd, void* arg1, void* arg2) { static bool ksuctl(int cmd, void* arg1, void* arg2) {
int32_t result = 0; int32_t result = 0;
@@ -84,3 +86,14 @@ bool set_app_profile(const app_profile *profile) {
bool get_app_profile(p_key_t key, app_profile *profile) { bool get_app_profile(p_key_t key, app_profile *profile) {
return ksuctl(CMD_GET_APP_PROFILE, (void*) profile, nullptr); return ksuctl(CMD_GET_APP_PROFILE, (void*) profile, nullptr);
} }
bool set_su_enabled(bool enabled) {
return ksuctl(CMD_ENABLE_SU, (void*) enabled, nullptr);
}
bool is_su_enabled() {
bool enabled = true;
// if ksuctl failed, we assume su is enabled, and it cannot be disabled.
ksuctl(CMD_IS_SU_ENABLED, &enabled, nullptr);
return enabled;
}

View File

@@ -79,4 +79,8 @@ bool set_app_profile(const app_profile *profile);
bool get_app_profile(p_key_t key, app_profile *profile); bool get_app_profile(p_key_t key, app_profile *profile);
bool set_su_enabled(bool enabled);
bool is_su_enabled();
#endif //KERNELSU_KSU_H #endif //KERNELSU_KSU_H

View File

@@ -1,16 +1,22 @@
package com.rifsxd.ksunext package com.rifsxd.ksunext
import android.app.Application import android.app.Application
import android.system.Os
import coil.Coil import coil.Coil
import coil.ImageLoader import coil.ImageLoader
import me.zhanghai.android.appiconloader.coil.AppIconFetcher import me.zhanghai.android.appiconloader.coil.AppIconFetcher
import me.zhanghai.android.appiconloader.coil.AppIconKeyer import me.zhanghai.android.appiconloader.coil.AppIconKeyer
import okhttp3.Cache
import okhttp3.OkHttpClient
import java.io.File import java.io.File
import java.util.Locale
lateinit var ksuApp: KernelSUApplication lateinit var ksuApp: KernelSUApplication
class KernelSUApplication : Application() { class KernelSUApplication : Application() {
lateinit var okhttpClient: OkHttpClient
override fun onCreate() { override fun onCreate() {
super.onCreate() super.onCreate()
ksuApp = this ksuApp = this
@@ -30,7 +36,20 @@ class KernelSUApplication : Application() {
if (!webroot.exists()) { if (!webroot.exists()) {
webroot.mkdir() webroot.mkdir()
} }
// Provide working env for rust's temp_dir()
Os.setenv("TMPDIR", cacheDir.absolutePath, true)
okhttpClient =
OkHttpClient.Builder().cache(Cache(File(cacheDir, "okhttp"), 10 * 1024 * 1024))
.addInterceptor { block ->
block.proceed(
block.request().newBuilder()
.header("User-Agent", "KernelSU/${BuildConfig.VERSION_CODE}")
.header("Accept-Language", Locale.getDefault().toLanguageTag()).build()
)
}.build()
} }
} }

View File

@@ -21,6 +21,9 @@ object Natives {
// 11640: Support query working mode, LKM or GKI // 11640: Support query working mode, LKM or GKI
// when MINIMAL_SUPPORTED_KERNEL > 11640, we can remove this constant. // when MINIMAL_SUPPORTED_KERNEL > 11640, we can remove this constant.
const val MINIMAL_SUPPORTED_KERNEL_LKM = 11648 const val MINIMAL_SUPPORTED_KERNEL_LKM = 11648
// 12402: Support disable sucompat mode
const val MINIMAL_SUPPORTED_SU_COMPAT = 12402
const val KERNEL_SU_DOMAIN = "u:r:su:s0" const val KERNEL_SU_DOMAIN = "u:r:su:s0"
const val ROOT_UID = 0 const val ROOT_UID = 0
@@ -55,6 +58,15 @@ object Natives {
external fun getAppProfile(key: String?, uid: Int): Profile external fun getAppProfile(key: String?, uid: Int): Profile
external fun setAppProfile(profile: Profile?): Boolean external fun setAppProfile(profile: Profile?): Boolean
/**
* `su` compat mode can be disabled temporarily.
* 0: disabled
* 1: enabled
* negative : error
*/
external fun isSuEnabled(): Boolean
external fun setSuEnabled(enabled: Boolean): Boolean
private const val NON_ROOT_DEFAULT_PROFILE_KEY = "$" private const val NON_ROOT_DEFAULT_PROFILE_KEY = "$"
private const val NOBODY_UID = 9999 private const val NOBODY_UID = 9999

View File

@@ -98,7 +98,7 @@ private fun AboutCardContent() {
val annotatedString = AnnotatedString.Companion.fromHtml( val annotatedString = AnnotatedString.Companion.fromHtml(
htmlString = stringResource( htmlString = stringResource(
id = R.string.about_source_code, id = R.string.about_source_code,
"<b><a href=\"https://github.com/rifsxd/KernelSU-Next\">GitHub</a></b>" "<b><a href=\"https://github.com/KernelSU-Next/KernelSU-Next\">GitHub</a></b>"
), ),
linkStyles = TextLinkStyles( linkStyles = TextLinkStyles(
style = SpanStyle( style = SpanStyle(

View File

@@ -73,6 +73,7 @@ fun RootProfileConfig(
) )
} }
/*
var expanded by remember { mutableStateOf(false) } var expanded by remember { mutableStateOf(false) }
val currentNamespace = when (profile.namespace) { val currentNamespace = when (profile.namespace) {
Natives.Profile.Namespace.INHERITED.ordinal -> stringResource(R.string.profile_namespace_inherited) Natives.Profile.Namespace.INHERITED.ordinal -> stringResource(R.string.profile_namespace_inherited)
@@ -126,6 +127,7 @@ fun RootProfileConfig(
} }
} }
}) })
*/
UidPanel(uid = profile.uid, label = "uid", onUidChange = { UidPanel(uid = profile.uid, label = "uid", onUidChange = {
onProfileChange( onProfileChange(

View File

@@ -95,6 +95,7 @@ fun AppProfileScreen(
val scope = rememberCoroutineScope() val scope = rememberCoroutineScope()
val failToUpdateAppProfile = stringResource(R.string.failed_to_update_app_profile).format(appInfo.label) val failToUpdateAppProfile = stringResource(R.string.failed_to_update_app_profile).format(appInfo.label)
val failToUpdateSepolicy = stringResource(R.string.failed_to_update_sepolicy).format(appInfo.label) val failToUpdateSepolicy = stringResource(R.string.failed_to_update_sepolicy).format(appInfo.label)
val suNotAllowed = stringResource(R.string.su_not_allowed).format(appInfo.label)
val packageName = appInfo.packageName val packageName = appInfo.packageName
val initialProfile = Natives.getAppProfile(packageName, appInfo.uid) val initialProfile = Natives.getAppProfile(packageName, appInfo.uid)
@@ -143,8 +144,13 @@ fun AppProfileScreen(
}, },
onProfileChange = { onProfileChange = {
scope.launch { scope.launch {
if (it.allowSu && !it.rootUseDefault && it.rules.isNotEmpty()) { if (it.allowSu) {
if (!setSepolicy(profile.name, it.rules)) { // sync with allowlist.c - forbid_system_uid
if (appInfo.uid < 2000 && appInfo.uid != 1000) {
snackBarHost.showSnackbar(suNotAllowed)
return@launch
}
if (!it.rootUseDefault && it.rules.isNotEmpty() && !setSepolicy(profile.name, it.rules)) {
snackBarHost.showSnackbar(failToUpdateSepolicy) snackBarHost.showSnackbar(failToUpdateSepolicy)
return@launch return@launch
} }

View File

@@ -0,0 +1,297 @@
package com.rifsxd.ksunext.ui.screen
import android.content.Context
import android.content.Intent
import android.net.Uri
import android.widget.Toast
import androidx.activity.compose.rememberLauncherForActivityResult
import androidx.activity.result.contract.ActivityResultContracts
import androidx.compose.foundation.clickable
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.WindowInsets
import androidx.compose.foundation.layout.WindowInsetsSides
import androidx.compose.foundation.layout.only
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.safeDrawing
import androidx.compose.foundation.rememberScrollState
import androidx.compose.foundation.verticalScroll
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.automirrored.filled.Undo
import androidx.compose.material.icons.filled.*
import androidx.compose.material3.ExperimentalMaterial3Api
import androidx.compose.material3.HorizontalDivider
import androidx.compose.material3.Icon
import androidx.compose.material3.IconButton
import androidx.compose.material3.ListItem
import androidx.compose.material3.ModalBottomSheet
import androidx.compose.material3.Scaffold
import androidx.compose.material3.SnackbarHost
import androidx.compose.material3.Text
import androidx.compose.material3.AlertDialog
import androidx.compose.material3.TextButton
import androidx.compose.material3.TopAppBar
import androidx.compose.material3.TopAppBarDefaults
import androidx.compose.material3.TopAppBarScrollBehavior
import androidx.compose.material3.rememberTopAppBarState
import androidx.compose.runtime.Composable
import androidx.compose.runtime.getValue
import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import androidx.compose.runtime.rememberCoroutineScope
import androidx.compose.runtime.saveable.rememberSaveable
import androidx.compose.runtime.setValue
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.vector.ImageVector
import androidx.compose.ui.input.nestedscroll.nestedScroll
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.text.style.LineHeightStyle
import androidx.compose.ui.text.style.TextAlign
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.Dp
import androidx.compose.ui.unit.dp
import androidx.core.content.FileProvider
import com.maxkeppeker.sheets.core.models.base.Header
import com.maxkeppeker.sheets.core.models.base.IconSource
import com.maxkeppeker.sheets.core.models.base.rememberUseCaseState
import com.maxkeppeler.sheets.list.ListDialog
import com.maxkeppeler.sheets.list.models.ListOption
import com.maxkeppeler.sheets.list.models.ListSelection
import com.ramcosta.composedestinations.annotation.Destination
import com.ramcosta.composedestinations.annotation.RootGraph
import com.ramcosta.composedestinations.navigation.DestinationsNavigator
import com.ramcosta.composedestinations.navigation.EmptyDestinationsNavigator
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext
import com.rifsxd.ksunext.BuildConfig
import com.rifsxd.ksunext.Natives
import com.rifsxd.ksunext.ksuApp
import com.rifsxd.ksunext.R
import com.rifsxd.ksunext.ui.component.AboutDialog
import com.rifsxd.ksunext.ui.component.ConfirmResult
import com.rifsxd.ksunext.ui.component.DialogHandle
import com.rifsxd.ksunext.ui.component.SwitchItem
import com.rifsxd.ksunext.ui.component.rememberConfirmDialog
import com.rifsxd.ksunext.ui.component.rememberCustomDialog
import com.rifsxd.ksunext.ui.component.rememberLoadingDialog
import com.rifsxd.ksunext.ui.util.LocalSnackbarHost
import com.rifsxd.ksunext.ui.util.getBugreportFile
import com.rifsxd.ksunext.ui.util.*
import java.time.LocalDateTime
import java.time.format.DateTimeFormatter
/**
* @author rifsxd
* @date 2025/1/14.
*/
@OptIn(ExperimentalMaterial3Api::class)
@Destination<RootGraph>
@Composable
fun BackupRestoreScreen(navigator: DestinationsNavigator) {
val scrollBehavior = TopAppBarDefaults.pinnedScrollBehavior(rememberTopAppBarState())
val snackBarHost = LocalSnackbarHost.current
val isManager = Natives.becomeManager(ksuApp.packageName)
val ksuVersion = if (isManager) Natives.version else null
Scaffold(
topBar = {
TopBar(
scrollBehavior = scrollBehavior
)
},
snackbarHost = { SnackbarHost(snackBarHost) },
contentWindowInsets = WindowInsets.safeDrawing.only(WindowInsetsSides.Top + WindowInsetsSides.Horizontal)
) { paddingValues ->
val loadingDialog = rememberLoadingDialog()
val restoreDialog = rememberConfirmDialog()
val backupDialog = rememberConfirmDialog()
Column(
modifier = Modifier
.padding(paddingValues)
.nestedScroll(scrollBehavior.nestedScrollConnection)
.verticalScroll(rememberScrollState())
) {
val context = LocalContext.current
val scope = rememberCoroutineScope()
var showRebootDialog by remember { mutableStateOf(false) }
if (showRebootDialog) {
AlertDialog(
onDismissRequest = { showRebootDialog = false },
title = { Text(stringResource(R.string.reboot_required)) },
text = { Text(stringResource(R.string.reboot_message)) },
confirmButton = {
TextButton(onClick = {
showRebootDialog = false
reboot()
}) {
Text(stringResource(R.string.reboot))
}
},
dismissButton = {
TextButton(onClick = { showRebootDialog = false }) {
Text(stringResource(R.string.later))
}
}
)
}
val moduleBackup = stringResource(id = R.string.module_backup)
val backupMessage = stringResource(id = R.string.module_backup_message)
ListItem(
leadingContent = {
Icon(
Icons.Filled.Backup,
moduleBackup
)
},
headlineContent = { Text(moduleBackup) },
modifier = Modifier.clickable {
scope.launch {
val result = backupDialog.awaitConfirm(title = moduleBackup, content = backupMessage)
if (result == ConfirmResult.Confirmed) {
loadingDialog.withLoading {
moduleBackup()
}
}
}
}
)
if (showRebootDialog) {
AlertDialog(
onDismissRequest = { showRebootDialog = false },
title = { Text(stringResource(R.string.reboot_required)) },
text = { Text(stringResource(R.string.reboot_message)) },
confirmButton = {
TextButton(onClick = {
showRebootDialog = false
reboot()
}) {
Text(stringResource(R.string.reboot))
}
},
dismissButton = {
TextButton(onClick = { showRebootDialog = false }) {
Text(stringResource(R.string.later))
}
}
)
}
val prefs = context.getSharedPreferences("settings", Context.MODE_PRIVATE)
var useOverlayFs by rememberSaveable {
mutableStateOf(
prefs.getBoolean("use_overlay_fs", false)
)
}
val moduleRestore = stringResource(id = R.string.module_restore)
val restoreMessage = stringResource(id = R.string.module_restore_message)
ListItem(
leadingContent = {
Icon(
Icons.Filled.Restore,
moduleRestore,
tint = if (useOverlayFs) androidx.compose.material3.MaterialTheme.colorScheme.onSurface.copy(alpha = 0.38f) else androidx.compose.material3.MaterialTheme.colorScheme.onSurface
)
},
headlineContent = {
Text(
moduleRestore,
color = if (useOverlayFs) androidx.compose.material3.MaterialTheme.colorScheme.onSurface.copy(alpha = 0.38f) else androidx.compose.material3.MaterialTheme.colorScheme.onSurface
)
},
modifier = Modifier.clickable(
enabled = !useOverlayFs,
onClick = {
scope.launch {
val result = restoreDialog.awaitConfirm(title = moduleRestore, content = restoreMessage)
if (result == ConfirmResult.Confirmed) {
loadingDialog.withLoading {
moduleRestore()
showRebootDialog = true
}
}
}
}
)
)
HorizontalDivider(thickness = Dp.Hairline)
val allowlistBackup = stringResource(id = R.string.allowlist_backup)
val allowlistbackupMessage = stringResource(id = R.string.allowlist_backup_message)
ListItem(
leadingContent = {
Icon(
Icons.Filled.Backup,
allowlistBackup
)
},
headlineContent = { Text(allowlistBackup) },
modifier = Modifier.clickable {
scope.launch {
val result = backupDialog.awaitConfirm(title = allowlistBackup, content = allowlistbackupMessage)
if (result == ConfirmResult.Confirmed) {
loadingDialog.withLoading {
allowlistBackup()
}
}
}
}
)
val allowlistRestore = stringResource(id = R.string.allowlist_restore)
val allowlistrestoreMessage = stringResource(id = R.string.allowlist_restore_message)
ListItem(
leadingContent = {
Icon(
Icons.Filled.Restore,
allowlistRestore
)
},
headlineContent = { Text(allowlistRestore) },
modifier = Modifier.clickable {
scope.launch {
val result = restoreDialog.awaitConfirm(title = allowlistRestore, content = allowlistrestoreMessage)
if (result == ConfirmResult.Confirmed) {
loadingDialog.withLoading {
allowlistRestore()
}
}
}
}
)
}
}
}
@OptIn(ExperimentalMaterial3Api::class)
@Composable
private fun TopBar(
scrollBehavior: TopAppBarScrollBehavior? = null
) {
TopAppBar(
title = { Text(stringResource(R.string.backup_restore)) },
windowInsets = WindowInsets.safeDrawing.only(WindowInsetsSides.Top + WindowInsetsSides.Horizontal),
scrollBehavior = scrollBehavior
)
}
@Preview
@Composable
private fun BackupPreview() {
BackupRestoreScreen(EmptyDestinationsNavigator)
}

View File

@@ -110,7 +110,7 @@ fun ExecuteModuleActionScreen(navigator: DestinationsNavigator, moduleId: String
val date = format.format(Date()) val date = format.format(Date())
val file = File( val file = File(
Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS), Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS),
"KernelSU_module_action_log_${date}.log" "KernelSU_Next_module_action_log_${date}.log"
) )
file.writeText(logContent.toString()) file.writeText(logContent.toString())
snackBarHost.showSnackbar("Log saved to ${file.absolutePath}") snackBarHost.showSnackbar("Log saved to ${file.absolutePath}")

View File

@@ -59,6 +59,7 @@ import kotlinx.coroutines.withContext
import kotlinx.parcelize.Parcelize import kotlinx.parcelize.Parcelize
import com.rifsxd.ksunext.R import com.rifsxd.ksunext.R
import com.rifsxd.ksunext.ui.component.KeyEventBlocker import com.rifsxd.ksunext.ui.component.KeyEventBlocker
import com.rifsxd.ksunext.ui.util.FlashResult
import com.rifsxd.ksunext.ui.util.LkmSelection import com.rifsxd.ksunext.ui.util.LkmSelection
import com.rifsxd.ksunext.ui.util.LocalSnackbarHost import com.rifsxd.ksunext.ui.util.LocalSnackbarHost
import com.rifsxd.ksunext.ui.util.flashModule import com.rifsxd.ksunext.ui.util.flashModule
@@ -80,38 +81,17 @@ enum class FlashingStatus {
// Lets you flash modules sequentially when mutiple zipUris are selected // Lets you flash modules sequentially when mutiple zipUris are selected
fun flashModulesSequentially( fun flashModulesSequentially(
uris: List<Uri>, uris: List<Uri>,
onFinish: (Boolean, Int) -> Unit,
onStdout: (String) -> Unit, onStdout: (String) -> Unit,
onStderr: (String) -> Unit onStderr: (String) -> Unit
) { ): FlashResult {
val iterator = uris.iterator() for (uri in uris) {
flashModule(uri, onStdout, onStderr).apply {
// Start processing from the first module inside a coroutine if (code != 0) {
CoroutineScope(Dispatchers.IO).launch { return FlashResult(code, err, showReboot)
// Define the recursive function within the coroutine
suspend fun processNext() {
if (iterator.hasNext()) {
// Flash the current module
flashModule(iterator.next(), onFinish = { showReboot, code ->
// If successful, continue to the next one
if (code == 0) {
// Recursively call to process the next module
launch {
processNext()
}
} else {
onFinish(showReboot, code) // If failed, finish the process
}
}, onStdout, onStderr)
} else {
// No more modules to process, finish the process
onFinish(true, 0)
} }
} }
// Start the process
processNext()
} }
return FlashResult(0, "", true)
} }
/** /**
@@ -124,7 +104,7 @@ fun flashModulesSequentially(
fun FlashScreen(navigator: DestinationsNavigator, flashIt: FlashIt) { fun FlashScreen(navigator: DestinationsNavigator, flashIt: FlashIt) {
var text by rememberSaveable { mutableStateOf("") } var text by rememberSaveable { mutableStateOf("") }
var tempText : String var tempText: String
val logContent = rememberSaveable { StringBuilder() } val logContent = rememberSaveable { StringBuilder() }
var showFloatAction by rememberSaveable { mutableStateOf(false) } var showFloatAction by rememberSaveable { mutableStateOf(false) }
@@ -145,16 +125,7 @@ fun FlashScreen(navigator: DestinationsNavigator, flashIt: FlashIt) {
return@LaunchedEffect return@LaunchedEffect
} }
withContext(Dispatchers.IO) { withContext(Dispatchers.IO) {
flashIt(flashIt, onFinish = { showReboot, code -> flashIt(flashIt, onStdout = {
if (code != 0) {
text += "Error: exit code = $code.\nPlease save and check the log.\n"
}
if (showReboot) {
text += "\n\n\n"
showFloatAction = true
}
flashing = if (code == 0) FlashingStatus.SUCCESS else FlashingStatus.FAILED
}, onStdout = {
tempText = "$it\n" tempText = "$it\n"
if (tempText.startsWith("")) { // clear command if (tempText.startsWith("")) { // clear command
text = tempText.substring(6) text = tempText.substring(6)
@@ -164,7 +135,16 @@ fun FlashScreen(navigator: DestinationsNavigator, flashIt: FlashIt) {
logContent.append(it).append("\n") logContent.append(it).append("\n")
}, onStderr = { }, onStderr = {
logContent.append(it).append("\n") logContent.append(it).append("\n")
}) }).apply {
if (code != 0) {
text += "Error code: $code.\n $err Please save and check the log.\n"
}
if (showReboot) {
text += "\n\n\n"
showFloatAction = true
}
flashing = if (code == 0) FlashingStatus.SUCCESS else FlashingStatus.FAILED
}
} }
} }
@@ -181,7 +161,7 @@ fun FlashScreen(navigator: DestinationsNavigator, flashIt: FlashIt) {
val date = format.format(Date()) val date = format.format(Date())
val file = File( val file = File(
Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS), Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS),
"KernelSU_install_log_${date}.log" "KernelSU_Next_install_log_${date}.log"
) )
file.writeText(logContent.toString()) file.writeText(logContent.toString())
snackBarHost.showSnackbar("Log saved to ${file.absolutePath}") snackBarHost.showSnackbar("Log saved to ${file.absolutePath}")
@@ -238,8 +218,6 @@ sealed class FlashIt : Parcelable {
data class FlashBoot(val boot: Uri? = null, val lkm: LkmSelection, val ota: Boolean) : data class FlashBoot(val boot: Uri? = null, val lkm: LkmSelection, val ota: Boolean) :
FlashIt() FlashIt()
data class FlashModule(val uri: Uri) : FlashIt()
data class FlashModules(val uris: List<Uri>) : FlashIt() data class FlashModules(val uris: List<Uri>) : FlashIt()
data object FlashRestore : FlashIt() data object FlashRestore : FlashIt()
@@ -248,29 +226,26 @@ sealed class FlashIt : Parcelable {
} }
fun flashIt( fun flashIt(
flashIt: FlashIt, onFinish: (Boolean, Int) -> Unit, flashIt: FlashIt,
onStdout: (String) -> Unit, onStdout: (String) -> Unit,
onStderr: (String) -> Unit onStderr: (String) -> Unit
) { ): FlashResult {
when (flashIt) { return when (flashIt) {
is FlashIt.FlashBoot -> installBoot( is FlashIt.FlashBoot -> installBoot(
flashIt.boot, flashIt.boot,
flashIt.lkm, flashIt.lkm,
flashIt.ota, flashIt.ota,
onFinish,
onStdout, onStdout,
onStderr onStderr
) )
is FlashIt.FlashModule -> flashModule(flashIt.uri, onFinish, onStdout, onStderr)
is FlashIt.FlashModules -> { is FlashIt.FlashModules -> {
flashModulesSequentially(flashIt.uris, onFinish, onStdout, onStderr) flashModulesSequentially(flashIt.uris, onStdout, onStderr)
} }
FlashIt.FlashRestore -> restoreBoot(onFinish, onStdout, onStderr) FlashIt.FlashRestore -> restoreBoot(onStdout, onStderr)
FlashIt.FlashUninstall -> uninstallPermanently(onFinish, onStdout, onStderr) FlashIt.FlashUninstall -> uninstallPermanently(onStdout, onStderr)
} }
} }

View File

@@ -92,6 +92,7 @@ import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext import kotlinx.coroutines.withContext
import com.rifsxd.ksunext.Natives import com.rifsxd.ksunext.Natives
import com.rifsxd.ksunext.R import com.rifsxd.ksunext.R
import com.rifsxd.ksunext.ksuApp
import com.rifsxd.ksunext.ui.component.ConfirmResult import com.rifsxd.ksunext.ui.component.ConfirmResult
import com.rifsxd.ksunext.ui.component.rememberConfirmDialog import com.rifsxd.ksunext.ui.component.rememberConfirmDialog
import com.rifsxd.ksunext.ui.component.rememberLoadingDialog import com.rifsxd.ksunext.ui.component.rememberLoadingDialog
@@ -107,7 +108,6 @@ import com.rifsxd.ksunext.ui.util.uninstallModule
import com.rifsxd.ksunext.ui.util.restoreModule import com.rifsxd.ksunext.ui.util.restoreModule
import com.rifsxd.ksunext.ui.viewmodel.ModuleViewModel import com.rifsxd.ksunext.ui.viewmodel.ModuleViewModel
import com.rifsxd.ksunext.ui.webui.WebUIActivity import com.rifsxd.ksunext.ui.webui.WebUIActivity
import okhttp3.OkHttpClient
@OptIn(ExperimentalMaterial3Api::class) @OptIn(ExperimentalMaterial3Api::class)
@Destination<RootGraph> @Destination<RootGraph>
@@ -213,6 +213,12 @@ fun ModuleScreen(navigator: DestinationsNavigator) {
floatingActionButton = { floatingActionButton = {
if (!hideInstallButton) { if (!hideInstallButton) {
val moduleInstall = stringResource(id = R.string.module_install) val moduleInstall = stringResource(id = R.string.module_install)
val confirmTitle = stringResource(R.string.module)
var zipUris by remember { mutableStateOf<List<Uri>>(emptyList()) }
val confirmDialog = rememberConfirmDialog(onConfirm = {
navigator.navigate(FlashScreenDestination(FlashIt.FlashModules(zipUris)))
viewModel.markNeedRefresh()
})
val selectZipLauncher = rememberLauncherForActivityResult( val selectZipLauncher = rememberLauncherForActivityResult(
contract = ActivityResultContracts.StartActivityForResult() contract = ActivityResultContracts.StartActivityForResult()
) { result -> ) { result ->
@@ -231,8 +237,16 @@ fun ModuleScreen(navigator: DestinationsNavigator) {
data.data?.let { uris.add(it) } data.data?.let { uris.add(it) }
} }
// Show confirm dialog with selected zip file(s) name(s)
val moduleNames = uris.mapIndexed { index, uri -> "\n${index + 1}. ${uri.getFileName(context)}" }.joinToString("")
val confirmContent = context.getString(R.string.module_install_prompt_with_name, moduleNames)
zipUris = uris zipUris = uris
showConfirmDialog = uris.isNotEmpty() confirmDialog.showConfirm(
title = confirmTitle,
content = confirmContent,
markdown = true
)
} }
ExtendedFloatingActionButton( ExtendedFloatingActionButton(
@@ -252,34 +266,7 @@ fun ModuleScreen(navigator: DestinationsNavigator) {
contentWindowInsets = WindowInsets.safeDrawing.only(WindowInsetsSides.Top + WindowInsetsSides.Horizontal), contentWindowInsets = WindowInsets.safeDrawing.only(WindowInsetsSides.Top + WindowInsetsSides.Horizontal),
snackbarHost = { SnackbarHost(hostState = snackBarHost) } snackbarHost = { SnackbarHost(hostState = snackBarHost) }
) { innerPadding -> ) { innerPadding ->
// Confirmation dialog
if (showConfirmDialog && zipUris.isNotEmpty()) {
val moduleNames = zipUris.joinToString("\n") { getFileName(context, it) }
AlertDialog(
onDismissRequest = { showConfirmDialog = false },
confirmButton = {
TextButton(onClick = {
showConfirmDialog = false
navigator.navigate(FlashScreenDestination(FlashIt.FlashModules(zipUris)))
viewModel.markNeedRefresh()
}) {
Text(stringResource(R.string.confirm))
}
},
dismissButton = {
TextButton(onClick = { showConfirmDialog = false }) {
Text(stringResource(android.R.string.cancel))
}
},
title = { Text(stringResource(R.string.module)) },
text = {
Text(
stringResource(R.string.module_install_prompt_with_name, moduleNames)
)
}
)
}
when { when {
hasMagisk -> { hasMagisk -> {
Box( Box(
@@ -301,7 +288,7 @@ fun ModuleScreen(navigator: DestinationsNavigator) {
modifier = Modifier.nestedScroll(scrollBehavior.nestedScrollConnection), modifier = Modifier.nestedScroll(scrollBehavior.nestedScrollConnection),
boxModifier = Modifier.padding(innerPadding), boxModifier = Modifier.padding(innerPadding),
onInstallModule = { onInstallModule = {
navigator.navigate(FlashScreenDestination(FlashIt.FlashModule(it))) navigator.navigate(FlashScreenDestination(FlashIt.FlashModules(listOf(it))))
}, },
onClickModule = { id, name, hasWebUi -> onClickModule = { id, name, hasWebUi ->
if (hasWebUi) { if (hasWebUi) {
@@ -353,6 +340,16 @@ private fun ModuleList(
val startDownloadingText = stringResource(R.string.module_start_downloading) val startDownloadingText = stringResource(R.string.module_start_downloading)
val fetchChangeLogFailed = stringResource(R.string.module_changelog_failed) val fetchChangeLogFailed = stringResource(R.string.module_changelog_failed)
val prefs = context.getSharedPreferences("settings", Context.MODE_PRIVATE)
val hasShownWarning = rememberSaveable { mutableStateOf(prefs.getBoolean("has_shown_warning", false)) }
var useOverlayFs by rememberSaveable {
mutableStateOf(
prefs.getBoolean("use_overlay_fs", false)
)
}
val loadingDialog = rememberLoadingDialog() val loadingDialog = rememberLoadingDialog()
val confirmDialog = rememberConfirmDialog() val confirmDialog = rememberConfirmDialog()
@@ -365,7 +362,7 @@ private fun ModuleList(
val changelogResult = loadingDialog.withLoading { val changelogResult = loadingDialog.withLoading {
withContext(Dispatchers.IO) { withContext(Dispatchers.IO) {
runCatching { runCatching {
OkHttpClient().newCall( ksuApp.okhttpClient.newCall(
okhttp3.Request.Builder().url(changelogUrl).build() okhttp3.Request.Builder().url(changelogUrl).build()
).execute().body!!.string() ).execute().body!!.string()
} }
@@ -507,14 +504,14 @@ private fun ModuleList(
}, },
) { ) {
when { when {
!viewModel.isOverlayAvailable -> { useOverlayFs && !viewModel.isOverlayAvailable -> {
item { item {
Box( Box(
modifier = Modifier.fillParentMaxSize(), modifier = Modifier.fillParentMaxSize(),
contentAlignment = Alignment.Center contentAlignment = Alignment.Center
) { ) {
Text( Text(
stringResource(R.string.module_overlay_fs_not_available), text = stringResource(R.string.module_overlay_fs_not_available),
textAlign = TextAlign.Center textAlign = TextAlign.Center
) )
} }
@@ -623,22 +620,22 @@ fun ModuleItem(
val interactionSource = remember { MutableInteractionSource() } val interactionSource = remember { MutableInteractionSource() }
val indication = LocalIndication.current val indication = LocalIndication.current
val viewModel = viewModel<ModuleViewModel>() val viewModel = viewModel<ModuleViewModel>()
val context = LocalContext.current
val prefs = context.getSharedPreferences("settings", Context.MODE_PRIVATE)
var developerOptionsEnabled by rememberSaveable {
mutableStateOf(
prefs.getBoolean("enable_developer_options", false)
)
}
LaunchedEffect(Unit) {
developerOptionsEnabled = prefs.getBoolean("enable_developer_options", false)
}
Column( Column(
modifier = Modifier modifier = Modifier
.run {
if (module.hasWebUi) {
toggleable(
value = module.enabled,
interactionSource = interactionSource,
role = Role.Button,
indication = indication,
onValueChange = { onClick(module) }
)
} else {
this
}
}
.padding(22.dp, 18.dp, 22.dp, 12.dp) .padding(22.dp, 18.dp, 22.dp, 12.dp)
) { ) {
Row( Row(
@@ -647,6 +644,10 @@ fun ModuleItem(
) { ) {
val moduleVersion = stringResource(id = R.string.module_version) val moduleVersion = stringResource(id = R.string.module_version)
val moduleAuthor = stringResource(id = R.string.module_author) val moduleAuthor = stringResource(id = R.string.module_author)
val moduleId = stringResource(id = R.string.module_id)
val moduleVersionCode = stringResource(id = R.string.module_version_code)
val moduleUpdateJson = stringResource(id = R.string.module_update_json)
val moduleUpdateJsonEmpty = stringResource(id = R.string.module_update_json_empty)
Column( Column(
modifier = Modifier.fillMaxWidth(0.8f) modifier = Modifier.fillMaxWidth(0.8f)
@@ -675,6 +676,33 @@ fun ModuleItem(
fontFamily = MaterialTheme.typography.bodySmall.fontFamily, fontFamily = MaterialTheme.typography.bodySmall.fontFamily,
textDecoration = textDecoration textDecoration = textDecoration
) )
if (developerOptionsEnabled) {
Text(
text = "$moduleId: ${module.id}",
fontSize = MaterialTheme.typography.bodySmall.fontSize,
lineHeight = MaterialTheme.typography.bodySmall.lineHeight,
fontFamily = MaterialTheme.typography.bodySmall.fontFamily,
textDecoration = textDecoration
)
Text(
text = "$moduleVersionCode: ${module.versionCode}",
fontSize = MaterialTheme.typography.bodySmall.fontSize,
lineHeight = MaterialTheme.typography.bodySmall.lineHeight,
fontFamily = MaterialTheme.typography.bodySmall.fontFamily,
textDecoration = textDecoration
)
Text(
text = if (module.updateJson.isNotEmpty()) "$moduleUpdateJson: ${module.updateJson}" else "$moduleUpdateJson: $moduleUpdateJsonEmpty",
fontSize = MaterialTheme.typography.bodySmall.fontSize,
lineHeight = MaterialTheme.typography.bodySmall.lineHeight,
fontFamily = MaterialTheme.typography.bodySmall.fontFamily,
textDecoration = textDecoration
)
}
} }
Spacer(modifier = Modifier.weight(1f)) Spacer(modifier = Modifier.weight(1f))
@@ -718,6 +746,7 @@ fun ModuleItem(
if (module.hasActionScript) { if (module.hasActionScript) {
FilledTonalButton( FilledTonalButton(
modifier = Modifier.defaultMinSize(52.dp, 32.dp), modifier = Modifier.defaultMinSize(52.dp, 32.dp),
enabled = !module.remove && module.enabled,
onClick = { onClick = {
navigator.navigate(ExecuteModuleActionScreenDestination(module.dirId)) navigator.navigate(ExecuteModuleActionScreenDestination(module.dirId))
viewModel.markNeedRefresh() viewModel.markNeedRefresh()
@@ -745,6 +774,7 @@ fun ModuleItem(
if (module.hasWebUi) { if (module.hasWebUi) {
FilledTonalButton( FilledTonalButton(
modifier = Modifier.defaultMinSize(52.dp, 32.dp), modifier = Modifier.defaultMinSize(52.dp, 32.dp),
enabled = !module.remove && module.enabled,
onClick = { onClick(module) }, onClick = { onClick(module) },
interactionSource = interactionSource, interactionSource = interactionSource,
contentPadding = ButtonDefaults.TextButtonContentPadding contentPadding = ButtonDefaults.TextButtonContentPadding
@@ -770,6 +800,7 @@ fun ModuleItem(
if (updateUrl.isNotEmpty()) { if (updateUrl.isNotEmpty()) {
Button( Button(
modifier = Modifier.defaultMinSize(52.dp, 32.dp), modifier = Modifier.defaultMinSize(52.dp, 32.dp),
enabled = !module.remove,
onClick = { onUpdate(module) }, onClick = { onUpdate(module) },
shape = ButtonDefaults.textShape, shape = ButtonDefaults.textShape,
contentPadding = ButtonDefaults.TextButtonContentPadding contentPadding = ButtonDefaults.TextButtonContentPadding

View File

@@ -63,6 +63,7 @@ import com.ramcosta.composedestinations.annotation.Destination
import com.ramcosta.composedestinations.annotation.RootGraph import com.ramcosta.composedestinations.annotation.RootGraph
import com.ramcosta.composedestinations.generated.destinations.AppProfileTemplateScreenDestination import com.ramcosta.composedestinations.generated.destinations.AppProfileTemplateScreenDestination
import com.ramcosta.composedestinations.generated.destinations.FlashScreenDestination import com.ramcosta.composedestinations.generated.destinations.FlashScreenDestination
import com.ramcosta.composedestinations.generated.destinations.BackupRestoreScreenDestination
import com.ramcosta.composedestinations.navigation.DestinationsNavigator import com.ramcosta.composedestinations.navigation.DestinationsNavigator
import com.ramcosta.composedestinations.navigation.EmptyDestinationsNavigator import com.ramcosta.composedestinations.navigation.EmptyDestinationsNavigator
import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Dispatchers
@@ -113,8 +114,6 @@ fun SettingScreen(navigator: DestinationsNavigator) {
} }
val loadingDialog = rememberLoadingDialog() val loadingDialog = rememberLoadingDialog()
val shrinkDialog = rememberConfirmDialog() val shrinkDialog = rememberConfirmDialog()
val restoreDialog = rememberConfirmDialog()
val backupDialog = rememberConfirmDialog()
Column( Column(
modifier = Modifier modifier = Modifier
@@ -159,10 +158,11 @@ fun SettingScreen(navigator: DestinationsNavigator) {
} }
if (ksuVersion != null) { if (ksuVersion != null) {
SwitchItem( SwitchItem(
icon = Icons.Filled.RemoveModerator, icon = Icons.Filled.FolderDelete,
title = stringResource(id = R.string.settings_umount_modules_default), title = stringResource(id = R.string.settings_umount_modules_default),
summary = stringResource(id = R.string.settings_umount_modules_default_summary), summary = stringResource(id = R.string.settings_umount_modules_default_summary),
checked = umountChecked checked = umountChecked
) { ) {
if (Natives.setDefaultUmountModules(it)) { if (Natives.setDefaultUmountModules(it)) {
umountChecked = it umountChecked = it
@@ -170,6 +170,23 @@ fun SettingScreen(navigator: DestinationsNavigator) {
} }
} }
if (Natives.version >= Natives.MINIMAL_SUPPORTED_SU_COMPAT) {
var isSuDisabled by rememberSaveable {
mutableStateOf(!Natives.isSuEnabled())
}
SwitchItem(
icon = Icons.Filled.RemoveModerator,
title = stringResource(id = R.string.settings_disable_su),
summary = stringResource(id = R.string.settings_disable_su_summary),
checked = isSuDisabled
) { checked ->
val shouldEnable = !checked
if (Natives.setSuEnabled(shouldEnable)) {
isSuDisabled = !shouldEnable
}
}
}
val prefs = context.getSharedPreferences("settings", Context.MODE_PRIVATE) val prefs = context.getSharedPreferences("settings", Context.MODE_PRIVATE)
val suSFS = getSuSFS() val suSFS = getSuSFS()
@@ -300,7 +317,7 @@ fun SettingScreen(navigator: DestinationsNavigator) {
) )
} }
SwitchItem( SwitchItem(
icon = Icons.Filled.DeveloperMode, icon = Icons.Filled.Web,
title = stringResource(id = R.string.enable_web_debugging), title = stringResource(id = R.string.enable_web_debugging),
summary = stringResource(id = R.string.enable_web_debugging_summary), summary = stringResource(id = R.string.enable_web_debugging_summary),
checked = enableWebDebugging checked = enableWebDebugging
@@ -309,6 +326,23 @@ fun SettingScreen(navigator: DestinationsNavigator) {
enableWebDebugging = it enableWebDebugging = it
} }
var developerOptionsEnabled by rememberSaveable {
mutableStateOf(
prefs.getBoolean("enable_developer_options", false)
)
}
if (ksuVersion != null) {
SwitchItem(
icon = Icons.Filled.DeveloperMode,
title = stringResource(id = R.string.enable_developer_options),
summary = stringResource(id = R.string.enable_developer_options_summary),
checked = developerOptionsEnabled
) {
prefs.edit().putBoolean("enable_developer_options", it).apply()
developerOptionsEnabled = it
}
}
var showBottomsheet by remember { mutableStateOf(false) } var showBottomsheet by remember { mutableStateOf(false) }
ListItem( ListItem(
@@ -340,7 +374,7 @@ fun SettingScreen(navigator: DestinationsNavigator) {
.clickable { .clickable {
val formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd_HH_mm") val formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd_HH_mm")
val current = LocalDateTime.now().format(formatter) val current = LocalDateTime.now().format(formatter)
exportBugreportLauncher.launch("KernelSU_bugreport_${current}.tar.gz") exportBugreportLauncher.launch("KernelSU_Next_bugreport_${current}.tar.gz")
showBottomsheet = false showBottomsheet = false
} }
) { ) {
@@ -419,50 +453,17 @@ fun SettingScreen(navigator: DestinationsNavigator) {
} }
if (ksuVersion != null) { if (ksuVersion != null) {
val moduleBackup = stringResource(id = R.string.module_backup) val backupRestore = stringResource(id = R.string.backup_restore)
val backupMessage = stringResource(id = R.string.module_backup_message)
ListItem( ListItem(
leadingContent = { leadingContent = {
Icon( Icon(
Icons.Filled.Backup, Icons.Filled.Backup,
moduleBackup backupRestore
) )
}, },
headlineContent = { Text(moduleBackup) }, headlineContent = { Text(backupRestore) },
modifier = Modifier.clickable { modifier = Modifier.clickable {
scope.launch { navigator.navigate(BackupRestoreScreenDestination)
val result = backupDialog.awaitConfirm(title = moduleBackup, content = backupMessage)
if (result == ConfirmResult.Confirmed) {
loadingDialog.withLoading {
moduleBackup()
}
}
}
}
)
}
if (ksuVersion != null) {
val moduleRestore = stringResource(id = R.string.module_restore)
val restoreMessage = stringResource(id = R.string.module_restore_message)
ListItem(
leadingContent = {
Icon(
Icons.Filled.Restore,
moduleRestore
)
},
headlineContent = { Text(moduleRestore) },
modifier = Modifier.clickable {
scope.launch {
val result = restoreDialog.awaitConfirm(title = moduleRestore, content = restoreMessage)
if (result == ConfirmResult.Confirmed) {
loadingDialog.withLoading {
moduleRestore()
showRebootDialog = true
}
}
}
} }
) )
} }

View File

@@ -11,6 +11,7 @@ import android.os.Environment
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.runtime.DisposableEffect import androidx.compose.runtime.DisposableEffect
import androidx.core.content.ContextCompat import androidx.core.content.ContextCompat
import com.rifsxd.ksunext.ksuApp
import com.rifsxd.ksunext.ui.util.module.LatestVersionInfo import com.rifsxd.ksunext.ui.util.module.LatestVersionInfo
/** /**
@@ -63,11 +64,11 @@ fun download(
fun checkNewVersion(): LatestVersionInfo { fun checkNewVersion(): LatestVersionInfo {
// Next version updates // Next version updates
val url = "https://api.github.com/repos/rifsxd/KernelSU-Next/releases/latest" val url = "https://api.github.com/repos/KernelSU-Next/KernelSU-Next/releases/latest"
// default null value if failed // default null value if failed
val defaultValue = LatestVersionInfo() val defaultValue = LatestVersionInfo()
runCatching { runCatching {
okhttp3.OkHttpClient().newCall(okhttp3.Request.Builder().url(url).build()).execute() ksuApp.okhttpClient.newCall(okhttp3.Request.Builder().url(url).build()).execute()
.use { response -> .use { response ->
if (!response.isSuccessful) { if (!response.isSuccessful) {
return defaultValue return defaultValue

View File

@@ -49,6 +49,11 @@ fun getKsuDaemonPath(): String {
} }
} }
data class FlashResult(val code: Int, val err: String, val showReboot: Boolean) {
constructor(result: Shell.Result, showReboot: Boolean) : this(result.code, result.err.joinToString("\n"), showReboot)
constructor(result: Shell.Result) : this(result, result.isSuccess)
}
object KsuCli { object KsuCli {
val SHELL: Shell = createRootShell() val SHELL: Shell = createRootShell()
val GLOBAL_MNT_SHELL: Shell = createRootShell(true) val GLOBAL_MNT_SHELL: Shell = createRootShell(true)
@@ -190,10 +195,9 @@ private fun flashWithIO(
fun flashModule( fun flashModule(
uri: Uri, uri: Uri,
onFinish: (Boolean, Int) -> Unit,
onStdout: (String) -> Unit, onStdout: (String) -> Unit,
onStderr: (String) -> Unit onStderr: (String) -> Unit
): Boolean { ): FlashResult {
val resolver = ksuApp.contentResolver val resolver = ksuApp.contentResolver
with(resolver.openInputStream(uri)) { with(resolver.openInputStream(uri)) {
val file = File(ksuApp.cacheDir, "module.zip") val file = File(ksuApp.cacheDir, "module.zip")
@@ -206,15 +210,14 @@ fun flashModule(
file.delete() file.delete()
onFinish(result.isSuccess, result.code) return FlashResult(result)
return result.isSuccess
} }
} }
fun runModuleAction( fun runModuleAction(
moduleId: String, onStdout: (String) -> Unit, onStderr: (String) -> Unit moduleId: String, onStdout: (String) -> Unit, onStderr: (String) -> Unit
): Boolean { ): Boolean {
val shell = getRootShell() val shell = createRootShell(true)
val stdoutCallback: CallbackList<String?> = object : CallbackList<String?>() { val stdoutCallback: CallbackList<String?> = object : CallbackList<String?>() {
override fun onAddElement(s: String?) { override fun onAddElement(s: String?) {
@@ -236,21 +239,19 @@ fun runModuleAction(
} }
fun restoreBoot( fun restoreBoot(
onFinish: (Boolean, Int) -> Unit, onStdout: (String) -> Unit, onStderr: (String) -> Unit onStdout: (String) -> Unit, onStderr: (String) -> Unit
): Boolean { ): FlashResult {
val magiskboot = File(ksuApp.applicationInfo.nativeLibraryDir, "libmagiskboot.so") val magiskboot = File(ksuApp.applicationInfo.nativeLibraryDir, "libmagiskboot.so")
val result = flashWithIO("${getKsuDaemonPath()} boot-restore -f --magiskboot $magiskboot", onStdout, onStderr) val result = flashWithIO("${getKsuDaemonPath()} boot-restore -f --magiskboot $magiskboot", onStdout, onStderr)
onFinish(result.isSuccess, result.code) return FlashResult(result)
return result.isSuccess
} }
fun uninstallPermanently( fun uninstallPermanently(
onFinish: (Boolean, Int) -> Unit, onStdout: (String) -> Unit, onStderr: (String) -> Unit onStdout: (String) -> Unit, onStderr: (String) -> Unit
): Boolean { ): FlashResult {
val magiskboot = File(ksuApp.applicationInfo.nativeLibraryDir, "libmagiskboot.so") val magiskboot = File(ksuApp.applicationInfo.nativeLibraryDir, "libmagiskboot.so")
val result = flashWithIO("${getKsuDaemonPath()} uninstall --magiskboot $magiskboot", onStdout, onStderr) val result = flashWithIO("${getKsuDaemonPath()} uninstall --magiskboot $magiskboot", onStdout, onStderr)
onFinish(result.isSuccess, result.code) return FlashResult(result)
return result.isSuccess
} }
suspend fun shrinkModules(): Boolean = withContext(Dispatchers.IO) { suspend fun shrinkModules(): Boolean = withContext(Dispatchers.IO) {
@@ -268,10 +269,9 @@ fun installBoot(
bootUri: Uri?, bootUri: Uri?,
lkm: LkmSelection, lkm: LkmSelection,
ota: Boolean, ota: Boolean,
onFinish: (Boolean, Int) -> Unit,
onStdout: (String) -> Unit, onStdout: (String) -> Unit,
onStderr: (String) -> Unit, onStderr: (String) -> Unit,
): Boolean { ): FlashResult {
val resolver = ksuApp.contentResolver val resolver = ksuApp.contentResolver
val bootFile = bootUri?.let { uri -> val bootFile = bootUri?.let { uri ->
@@ -334,15 +334,14 @@ fun installBoot(
lkmFile?.delete() lkmFile?.delete()
// if boot uri is empty, it is direct install, when success, we should show reboot button // if boot uri is empty, it is direct install, when success, we should show reboot button
onFinish(bootUri == null && result.isSuccess, result.code) return FlashResult(result, bootUri == null && result.isSuccess)
return result.isSuccess
} }
fun reboot(reason: String = "") { fun reboot(reason: String = "") {
val shell = getRootShell() val shell = getRootShell()
if (reason == "recovery") { if (reason == "recovery") {
// KEYCODE_POWER = 26, hide incorrect "Factory data reset" message // KEYCODE_POWER = 26, hide incorrect "Factory data reset" message
ShellUtils.fastCmd(shell, "/system/bin/input keyevent 26") ShellUtils.fastCmd(shell, "/system/bin/reboot $reason")
} }
ShellUtils.fastCmd(shell, "/system/bin/svc power reboot $reason || /system/bin/reboot $reason") ShellUtils.fastCmd(shell, "/system/bin/svc power reboot $reason || /system/bin/reboot $reason")
} }
@@ -503,6 +502,59 @@ fun moduleRestore(): Boolean {
return result.isEmpty() return result.isEmpty()
} }
fun allowlistBackupDir(): String? {
val shell = getRootShell()
val baseBackupDir = "/data/adb/allowlist_bak"
val resultBase = ShellUtils.fastCmd(shell, "mkdir -p $baseBackupDir").trim()
if (resultBase.isNotEmpty()) return null
val timestamp = ShellUtils.fastCmd(shell, "date +%Y%m%d_%H%M%S").trim()
if (timestamp.isEmpty()) return null
val newBackupDir = "$baseBackupDir/$timestamp"
val resultNewDir = ShellUtils.fastCmd(shell, "mkdir -p $newBackupDir").trim()
if (resultNewDir.isEmpty()) return newBackupDir
return null
}
fun allowlistBackup(): Boolean {
val shell = getRootShell()
val checkEmptyCommand = "if [ -z \"$(ls -A /data/adb/ksu/.allowlist)\" ]; then echo 'empty'; fi"
val resultCheckEmpty = ShellUtils.fastCmd(shell, checkEmptyCommand).trim()
if (resultCheckEmpty == "empty") {
return false
}
val backupDir = allowlistBackupDir() ?: return false
val command = "cp -rp /data/adb/ksu/.allowlist $backupDir"
val result = ShellUtils.fastCmd(shell, command).trim()
return result.isEmpty()
}
fun allowlistRestore(): Boolean {
val shell = getRootShell()
val command = "ls -t /data/adb/allowlist_bak | head -n 1"
val latestBackupDir = ShellUtils.fastCmd(shell, command).trim()
if (latestBackupDir.isEmpty()) return false
val sourceDir = "/data/adb/allowlist_bak/$latestBackupDir"
val destinationDir = "/data/adb/ksu/"
val createDestDirCommand = "mkdir -p $destinationDir"
ShellUtils.fastCmd(shell, createDestDirCommand)
val moveCommand = "cp -rp $sourceDir/.allowlist $destinationDir"
val result = ShellUtils.fastCmd(shell, moveCommand).trim()
return result.isEmpty()
}
private fun getSuSFSDaemonPath(): String { private fun getSuSFSDaemonPath(): String {
return ksuApp.applicationInfo.nativeLibraryDir + File.separator + "libsusfsd.so" return ksuApp.applicationInfo.nativeLibraryDir + File.separator + "libsusfsd.so"
} }

View File

@@ -101,7 +101,7 @@ fun getBugreportFile(context: Context): File {
val formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd_HH_mm") val formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd_HH_mm")
val current = LocalDateTime.now().format(formatter) val current = LocalDateTime.now().format(formatter)
val targetFile = File(context.cacheDir, "KernelSU_bugreport_${current}.tar.gz") val targetFile = File(context.cacheDir, "KernelSU_Next_bugreport_${current}.tar.gz")
shell.newJob().add("tar czf ${targetFile.absolutePath} -C ${bugreportDir.absolutePath} .").exec() shell.newJob().add("tar czf ${targetFile.absolutePath} -C ${bugreportDir.absolutePath} .").exec()
shell.newJob().add("rm -rf ${bugreportDir.absolutePath}").exec() shell.newJob().add("rm -rf ${bugreportDir.absolutePath}").exec()

View File

@@ -12,6 +12,7 @@ import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
import java.text.Collator import java.text.Collator
import java.util.Locale import java.util.Locale
import com.rifsxd.ksunext.ksuApp
import com.rifsxd.ksunext.ui.util.HanziToPinyin import com.rifsxd.ksunext.ui.util.HanziToPinyin
import com.rifsxd.ksunext.ui.util.listModules import com.rifsxd.ksunext.ui.util.listModules
import com.rifsxd.ksunext.ui.util.overlayFsAvailable import com.rifsxd.ksunext.ui.util.overlayFsAvailable
@@ -144,11 +145,8 @@ class ModuleViewModel : ViewModel() {
val result = kotlin.runCatching { val result = kotlin.runCatching {
val url = m.updateJson val url = m.updateJson
Log.i(TAG, "checkUpdate url: $url") Log.i(TAG, "checkUpdate url: $url")
val response = okhttp3.OkHttpClient() val response = ksuApp.okhttpClient.newCall(
.newCall( okhttp3.Request.Builder().url(url).build()
okhttp3.Request.Builder()
.url(url)
.build()
).execute() ).execute()
Log.d(TAG, "checkUpdate code: ${response.code}") Log.d(TAG, "checkUpdate code: ${response.code}")
if (response.isSuccessful) { if (response.isSuccessful) {

View File

@@ -11,18 +11,17 @@ import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.withContext import kotlinx.coroutines.withContext
import kotlinx.parcelize.Parcelize import kotlinx.parcelize.Parcelize
import com.rifsxd.ksunext.Natives import com.rifsxd.ksunext.Natives
import com.rifsxd.ksunext.ksuApp
import com.rifsxd.ksunext.profile.Capabilities import com.rifsxd.ksunext.profile.Capabilities
import com.rifsxd.ksunext.profile.Groups import com.rifsxd.ksunext.profile.Groups
import com.rifsxd.ksunext.ui.util.getAppProfileTemplate import com.rifsxd.ksunext.ui.util.getAppProfileTemplate
import com.rifsxd.ksunext.ui.util.listAppProfileTemplates import com.rifsxd.ksunext.ui.util.listAppProfileTemplates
import com.rifsxd.ksunext.ui.util.setAppProfileTemplate import com.rifsxd.ksunext.ui.util.setAppProfileTemplate
import okhttp3.OkHttpClient
import okhttp3.Request import okhttp3.Request
import org.json.JSONArray import org.json.JSONArray
import org.json.JSONObject import org.json.JSONObject
import java.text.Collator import java.text.Collator
import java.util.Locale import java.util.Locale
import java.util.concurrent.TimeUnit
/** /**
@@ -138,13 +137,7 @@ class TemplateViewModel : ViewModel() {
private fun fetchRemoteTemplates() { private fun fetchRemoteTemplates() {
runCatching { runCatching {
val client: OkHttpClient = OkHttpClient.Builder() ksuApp.okhttpClient.newCall(
.connectTimeout(5, TimeUnit.SECONDS)
.writeTimeout(5, TimeUnit.SECONDS)
.readTimeout(10, TimeUnit.SECONDS)
.build()
client.newCall(
Request.Builder().url(TEMPLATE_INDEX_URL).build() Request.Builder().url(TEMPLATE_INDEX_URL).build()
).execute().use { response -> ).execute().use { response ->
if (!response.isSuccessful) { if (!response.isSuccessful) {
@@ -155,7 +148,7 @@ private fun fetchRemoteTemplates() {
0.until(remoteTemplateIds.length()).forEach { i -> 0.until(remoteTemplateIds.length()).forEach { i ->
val id = remoteTemplateIds.getString(i) val id = remoteTemplateIds.getString(i)
Log.i(TAG, "fetch template: $id") Log.i(TAG, "fetch template: $id")
val templateJson = client.newCall( val templateJson = ksuApp.okhttpClient.newCall(
Request.Builder().url(TEMPLATE_URL.format(id)).build() Request.Builder().url(TEMPLATE_URL.format(id)).build()
).runCatching { ).runCatching {
execute().use { response -> execute().use { response ->

View File

@@ -0,0 +1,193 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="issue_report_title">Haben Sie Probleme?</string>
<string name="issue_report_body">Sind Sie auf einen Fehler gestoßen oder haben Sie Feedback??</string>
<string name="issue_report_body_2">Melden Sie es so schnell wie möglich!</string>
<string name="issue_report_github">Auf GitHub melden</string>
<string name="issue_report_telegram">Kontakt über Telegramm</string>
<string name="issue_report_github_link">https://github.com/KernelSU-Next/KernelSU-Next/issues</string>
<string name="issue_report_telegram_link">https://t.me/ksunext</string>
<string name="confirm">Bestätigen</string>
<string name="app_name" translatable="false">KernelSU Next</string>
<string name="home">Home</string>
<string name="home_not_installed">Nicht installiert</string>
<string name="home_click_to_install">Zum installieren klicken</string>
<string name="home_working">Funktioniert</string>
<string name="home_working_version">Version: %d</string>
<string name="home_superuser_count">Superusers: %d</string>
<string name="home_module_count">Module: %d</string>
<string name="home_failure">KernelSU Next v2 Signatur nicht im Kernel gefunden! [ !KSU_NEXT || != size/hash ]</string>
<string name="home_failure_tip">Bitten Sie Ihren Kernel-Entwickler, KernelSU Next zu integrieren!</string>
<string name="home_kernel">Kernel version</string>
<string name="home_susfs">SuSFS: %s</string>
<string name="home_susfs_version">SuSFS version</string>
<string name="home_susfs_sus_su">SuS SU</string>
<string name="home_android">Android version</string>
<string name="home_manager_version">Manager version</string>
<string name="home_selinux_status">SELinux status</string>
<string name="selinux_status_disabled">Deaktiviert</string>
<string name="selinux_status_enforcing">Enforcing</string>
<string name="selinux_status_permissive">Permissive</string>
<string name="selinux_status_unknown">Unbekannt</string>
<string name="superuser">Superuser</string>
<string name="module_failed_to_enable">Aktivierung des Moduls fehlgeschlagen: %s</string>
<string name="module_failed_to_disable">Deaktivierung des Moduls fehlgeschlagen: %s</string>
<string name="module_empty">Kein Modul installiert</string>
<string name="module">Modul</string>
<string name="module_install_prompt_with_name">Das/die folgende(n) Modul(e) wird/werden installiert: %1$s</string>
<string name="module_sort_a_to_z">Sortieren (A-Z)</string>
<string name="module_sort_z_to_a">Sortieren (Z-A)</string>
<string name="uninstall">Deinstallieren</string>
<string name="restore">Wiederherstellen</string>
<string name="module_install">Installieren</string>
<string name="install">Installieren</string>
<string name="reboot">Neustart</string>
<string name="settings">Einstellungen</string>
<string name="reboot_userspace">Weicher Neustart</string>
<string name="reboot_recovery">Neustart zur Recovery</string>
<string name="reboot_bootloader">Neustart zum Bootloader</string>
<string name="reboot_download">Neustart zu Download</string>
<string name="reboot_edl">Neustart zu EDL</string>
<string name="about">Über</string>
<string name="module_uninstall_confirm">Sind Sie sicher, dass Sie das Modul deinstallieren möchten? %s?</string>
<string name="module_uninstall_success">%s deinstalliert</string>
<string name="module_uninstall_failed">Deinstallierung fehlgeschlagen %s</string>
<string name="module_restore_confirm">Sind Sie sicher, dass Sie das Modul wiederherstellen wollen? %s?</string>
<string name="module_restore_success">%s wiederhergestekkt</string>
<string name="module_restore_failed">Wiederherstellung fehlgeschlagen: %s</string>
<string name="module_version">Version</string>
<string name="module_author">Autor</string>
<string name="module_id">ID</string>
<string name="module_version_code">Code</string>
<string name="module_update_json">UpdateJson</string>
<string name="module_update_json_empty">leer</string>
<string name="enable_developer_options">Aktiviere Entwickler-Optionen</string>
<string name="enable_developer_options_summary">Versteckte Einstellungen und Debug-Informationen anzeigen, die nur für Entwickler relevant sind.</string>
<string name="module_overlay_fs_not_available">Die Module sind nicht verfügbar, da OverlayFS vom Kernel deaktiviert ist.</string>
<string name="refresh">Aktualisieren</string>
<string name="show_system_apps">zeige system apps</string>
<string name="hide_system_apps">verstecke system apps</string>
<string name="export_log">Logs exportieren</string>
<string name="safe_mode">Abgesicherter Modus</string>
<string name="reboot_to_apply">Neustart, um wirksam zu werden</string>
<string name="module_magisk_conflict">Die Module sind aufgrund eines Konflikts mit Magisk nicht verfügbar!</string>
<string name="home_module_mount">Modul system</string>
<string name="home_magic_mount">Magic Mount</string>
<string name="home_overlayfs_mount">OverlayFS</string>
<string name="unavailable">Nicht verfügbar</string>
<string name="use_overlay_fs">OverlayFS verwenden</string>
<string name="use_overlay_fs_summary">Schalten Sie zwischen der Verwendung von OverlayFS und Magic Mount für das mount System von KernelSU Next um.</string>
<string name="reboot_required">Neustart erforderlich</string>
<string name="reboot_message">Die Änderungen werden nach dem Neustart des Systems wirksam. Möchten Sie jetzt neu starten?</string>
<string name="module_restore">Wiederherstellen module</string>
<string name="module_restore_message">Wiederherstellen von Modulen aus der letzten Sicherung.</string>
<string name="backup_restore">Sicherung &amp; Wiederherstellen</string>
<string name="module_backup">Sicherung module</string>
<string name="module_backup_message">Sicherung der aktuell installierten Module.</string>
<string name="allowlist_restore">Wiederherstellen der Zulassen-Liste</string>
<string name="allowlist_restore_message">Wiederherstellen der Zulassen-Liste aus dem letzten Backup.</string>
<string name="allowlist_backup">Sicherung der Zulassen-Liste</string>
<string name="allowlist_backup_message">Sicherung der aktuell konfigurierten Zulassen-Liste.</string>
<string name="warning">Warnung</string>
<string name="warning_message">diese Funktion befindet sich noch in der Beta-Phase und in der Entwicklung. Bitte stellen Sie sicher, dass Sie Ihre Module sichern, bevor Sie fortfahren. Verwenden Sie diese Funktion nur, wenn Sie sich der möglichen Risiken bewusst sind. Gehen Sie mit Bedacht vor.</string>
<string name="proceed">Fortfahren</string>
<string name="cancel">Abbruch</string>
<string name="later">Später</string>
<string name="home_next_kernelsu">🔥 Next build</string>
<string name="home_next_kernelsu_repo">https://github.com/KernelSU-Next/KernelSU-Next</string>
<string name="home_next_kernelsu_body">Next experimenteller Zweig. Entdecken Sie es auf GitHub!</string>
<string name="home_experimental_kernelsu">⚠️ Warnung vor experimenteller Entwicklung!</string>
<string name="home_experimental_kernelsu_repo">127.0.0.1</string>
<string name="home_experimental_kernelsu_body">KernelSU Next ist eine nicht-offizielle Version, die sich stets in aktiver experimenteller Entwicklung befindet. Sie wird im Ist-Zustand zur Verfügung gestellt, ohne Garantie auf Stabilität, Leistung oder Zuverlässigkeit.</string>
<string name="home_experimental_kernelsu_body_point_1"> • Die Verwendung erfolgt auf eigene Gefahr: Abstürze, unerwartetes Verhalten oder Systemprobleme können auftreten.</string>
<string name="home_experimental_kernelsu_body_point_2"> • Keine Garantie: Die Entwickler sind nicht verantwortlich für Datenverluste, Systemschäden oder andere Folgen, die sich aus der Nutzung ergeben.</string>
<string name="home_experimental_kernelsu_body_point_3"> • Nur zu Testzwecken: für Benutzer, die sich der Risiken bewusst sind und mit der Behebung von Problemen vertraut sind.</string>
<string name="about_source_code"><![CDATA[Quellcode ansehen unter %1$s]]></string>
<string name="profile" translatable="false">App Profile</string>
<string name="profile_default">Standard</string>
<string name="profile_template">Vorlage</string>
<string name="profile_custom">Benutzerdefiniert</string>
<string name="profile_name">Profilname</string>
<string name="profile_namespace">Mount namespace</string>
<string name="profile_namespace_inherited">Vererbt</string>
<string name="profile_namespace_global">Global</string>
<string name="profile_namespace_individual">Individuell</string>
<string name="profile_groups">Gruppen</string>
<string name="profile_capabilities">Funktionen</string>
<string name="profile_selinux_context">SELinux context</string>
<string name="profile_umount_modules">Umount Module</string>
<string name="failed_to_update_app_profile">App-Profil konnte nicht aktualisiert werden für %s</string>
<string name="require_kernel_version">Die aktuelle KernelSU Next Version %1$d ist zu veraltet, damit der Manager richtig funktioniert. aktualisieren Sie bitte auf Version %2$d oder höher!</string>
<string name="settings_umount_modules_default">Umount Module</string>
<string name="settings_umount_modules_default_summary">Der globale Standardwert für \„Umount Module\“ in App Profile. Wenn er aktiviert ist, werden alle Moduländerungen im System für Anwendungen entfernt, für die kein Profil festgelegt wurde.</string>
<string name="settings_susfs_toggle">verstecke kprobe hooks</string>
<string name="settings_susfs_toggle_summary">Diese Option deaktiviert die von ksu erzeugten kprobe-hooks und aktiviert stattdessen die eingebetteten nicht-kprobe-hooks, die die gleiche Funktionalität implementieren, die auf einen Nicht-GKI-Kernel angewendet würde, der kprobe nicht unterstützt.</string>
<string name="profile_umount_modules_summary">Wenn Sie diese Option aktivieren, kann KernelSU Next alle von den Modulen für diese Anwendung geänderten Dateien wiederherstellen.</string>
<string name="profile_selinux_domain">Domain</string>
<string name="profile_selinux_rules">Regeln</string>
<string name="module_update">Aktualisierung</string>
<string name="module_downloading">Herunterladen des Moduls: %s</string>
<string name="module_start_downloading">Mit dem Herunterladen beginnen: %s</string>
<string name="new_version_available">Neue Version %s ist verfügbar, klicken Sie zum Aktualisieren.</string>
<string name="launch_app">Start</string>
<string name="close">Schließen</string>
<string name="force_stop_app">Stopp erzwingen</string>
<string name="restart_app">Neustart</string>
<string name="failed_to_update_sepolicy">SELinux-Regeln konnten nicht aktualisiert werden: %s</string>
<string name="su_not_allowed">Das Gewähren von Superuser ist nicht erlaubt: %s</string>
<string name="module_changelog">Änderungsbericht</string>
<string name="settings_profile_template">App Profil Vorlage</string>
<string name="settings_profile_template_summary">Verwalten Sie lokale und Online-Vorlagen von App-Profilen</string>
<string name="app_profile_template_create">Vorlage erstellen</string>
<string name="app_profile_template_edit">Vorlage bearbeiten</string>
<string name="app_profile_template_id">ID</string>
<string name="app_profile_template_id_invalid">Ungültige Vorlagen-ID</string>
<string name="app_profile_template_name">Name</string>
<string name="app_profile_template_description">Beschreibung</string>
<string name="app_profile_template_save">Speichern</string>
<string name="app_profile_template_delete">Löschen</string>
<string name="app_profile_template_view">Vorlage ansehen</string>
<string name="app_profile_template_readonly">Nur lesen</string>
<string name="app_profile_template_id_exist">Die Vorlagen-ID existiert bereits!</string>
<string name="app_profile_import_export">Importieren/Exportieren</string>
<string name="app_profile_import_from_clipboard">Importieren aus der Zwischenablage</string>
<string name="app_profile_export_to_clipboard">In die Zwischenablage exportieren</string>
<string name="app_profile_template_export_empty">Lokale Vorlage für den Export nicht gefunden!</string>
<string name="app_profile_template_import_success">Erfolgreich importiert</string>
<string name="app_profile_template_sync">Online-Vorlagen synchronisieren</string>
<string name="app_profile_template_save_failed">Vorlage konnte nicht gespeichert werden</string>
<string name="app_profile_template_import_empty">Die Zwischenablage ist leer!</string>
<string name="module_changelog_failed">Abrufen des Änderungsberichts fehlgeschlagen: %s</string>
<string name="settings_check_update">Prüfen auf Aktualisierung</string>
<string name="settings_check_update_summary">Beim Öffnen der App automatisch nach Updates suchen.</string>
<string name="grant_root_failed">Root konnte nicht gewährt werden!</string>
<string name="action">Aktion</string>
<string name="open">Öffnen</string>
<string name="enable_web_debugging">WebView-Debugging aktivieren</string>
<string name="enable_web_debugging_summary">Kann zum Debuggen von WebUI verwendet werden. Bitte nur bei Bedarf aktivieren.</string>
<string name="direct_install">Direkte Installation (empfohlen)</string>
<string name="select_file">Eine Datei auswählen</string>
<string name="install_inactive_slot">Auf inaktivem slot installieren (nach OTA)</string>
<string name="install_inactive_slot_warning">Ihr Gerät wird **gezwungen**, nach einem Neustart in den aktuell inaktiven slot zu booten!\n Verwenden Sie diese Option nur, nachdem OTA abgeschlossen ist.\nFortfahren?</string>
<string name="install_next">Weiter</string>
<string name="select_file_tip">%1$s Partitionsabbild wird empfohlen</string>
<string name="select_kmi">KMI auswählen</string>
<string name="shrink_sparse_image">Minimierung des sparse Abbildes</string>
<string name="shrink_sparse_image_message">Ändern Sie die Größe des Sparse-Abbildes, in dem sich das Modul befindet, auf seine tatsächliche Größe. Beachten Sie, dass dies dazu führen kann, dass das Modul nicht ordnungsgemäß funktioniert, und verwenden Sie es daher nur, wenn es notwendig ist (z. B. zur Sicherung).</string>
<string name="settings_uninstall">Deinstallieren</string>
<string name="settings_uninstall_temporary">vorübergehend Deinstallieren</string>
<string name="settings_uninstall_permanent">Endgültig deinstallieren</string>
<string name="settings_restore_stock_image">Stock-Image wiederherstellen</string>
<string name="settings_uninstall_temporary_message">Vorübergehende Deinstallation von KernelSU Next, Wiederherstellung des ursprünglichen Zustands nach dem nächsten Neustart.</string>
<string name="settings_uninstall_permanent_message">KernelSU Next (Root und alle Module) vollständig und dauerhaft deinstallieren.</string>
<string name="settings_restore_stock_image_message">Stellen Sie das Werksabbild wieder her (wenn ein Backup vorhanden ist), das normalerweise vor OTA verwendet wird; wenn Sie KernelSU als Nächstes deinstallieren müssen, verwenden Sie bitte \„Endgültig deinstallieren\“.</string>
<string name="flashing">Flashing</string>
<string name="flash_success">Flash erfolgreich</string>
<string name="flash_failed">Flash fehlgeschlagen</string>
<string name="selected_lkm">Ausgewähltes LKM: %s</string>
<string name="save_log">Protokolle speichern</string>
<string name="log_saved">Protokolle gespeichert</string>
<string name="send_log">Protokolle teilen</string>
<string name="settings_disable_su">Su-Kompatibilität deaktivieren</string>
<string name="settings_disable_su_summary">Deaktivieren Sie vorübergehend alle Anwendungen, die über den Befehl su Root-Rechte erhalten (bestehende Root-Prozesse sind davon nicht betroffen).</string>
</resources>

View File

@@ -5,7 +5,7 @@
<string name="issue_report_body_2">Signalez-le dès que possible !</string> <string name="issue_report_body_2">Signalez-le dès que possible !</string>
<string name="issue_report_github">Signaler sur GitHub</string> <string name="issue_report_github">Signaler sur GitHub</string>
<string name="issue_report_telegram">Contacter via Telegram</string> <string name="issue_report_telegram">Contacter via Telegram</string>
<string name="issue_report_github_link">https://github.com/rifsxd/KernelSU-Next/issues</string> <string name="issue_report_github_link">https://github.com/KernelSU-Next/KernelSU-Next/issues</string>
<string name="issue_report_telegram_link">https://t.me/ksunext</string> <string name="issue_report_telegram_link">https://t.me/ksunext</string>
<string name="confirm">Confirmer</string> <string name="confirm">Confirmer</string>
<string name="app_name" translatable="false">KernelSU Next</string> <string name="app_name" translatable="false">KernelSU Next</string>
@@ -26,7 +26,7 @@
<string name="home_manager_version">Version du manager</string> <string name="home_manager_version">Version du manager</string>
<string name="home_selinux_status">Statut SELinux</string> <string name="home_selinux_status">Statut SELinux</string>
<string name="selinux_status_disabled">Désactivé</string> <string name="selinux_status_disabled">Désactivé</string>
<string name="selinux_status_enforcing">En vigueur</string> <string name="selinux_status_enforcing">Appliqué</string>
<string name="selinux_status_permissive">Permissif</string> <string name="selinux_status_permissive">Permissif</string>
<string name="selinux_status_unknown">Inconnu</string> <string name="selinux_status_unknown">Inconnu</string>
<string name="superuser">SuperUtilisateur</string> <string name="superuser">SuperUtilisateur</string>
@@ -43,7 +43,7 @@
<string name="install">Installer</string> <string name="install">Installer</string>
<string name="reboot">Redémarrer</string> <string name="reboot">Redémarrer</string>
<string name="settings">Paramètres</string> <string name="settings">Paramètres</string>
<string name="reboot_userspace">Redémarrage léger</string> <string name="reboot_userspace">Redémarrage logiciel</string>
<string name="reboot_recovery">Redémarrer en mode Recovery</string> <string name="reboot_recovery">Redémarrer en mode Recovery</string>
<string name="reboot_bootloader">Redémarrer en mode Bootloader</string> <string name="reboot_bootloader">Redémarrer en mode Bootloader</string>
<string name="reboot_download">Redémarrer sur les Téléchargements</string> <string name="reboot_download">Redémarrer sur les Téléchargements</string>
@@ -62,14 +62,14 @@
<string name="show_system_apps">Montrer les apps système</string> <string name="show_system_apps">Montrer les apps système</string>
<string name="hide_system_apps">Cacher les apps système</string> <string name="hide_system_apps">Cacher les apps système</string>
<string name="export_log">Exporter les logs</string> <string name="export_log">Exporter les logs</string>
<string name="safe_mode">Mode sécurité</string> <string name="safe_mode">Mode sécurisé</string>
<string name="reboot_to_apply">Redémarrer pour appliquer les changements</string> <string name="reboot_to_apply">Redémarrer pour appliquer les changements</string>
<string name="module_magisk_conflict">Les modules sont indisponibles en raison d\'un conflit avec Magisk!</string> <string name="module_magisk_conflict">Les modules sont indisponibles en raison d\'un conflit avec Magisk!</string>
<string name="home_module_mount">Module système</string> <string name="home_module_mount">Système de module</string>
<string name="home_magic_mount">Magic Mount</string> <string name="home_magic_mount">Magic Mount</string>
<string name="home_overlayfs_mount">OverlayFS</string> <string name="home_overlayfs_mount">OverlayFS</string>
<string name="unavailable">Indisponible</string> <string name="unavailable">Indisponible</string>
<string name="use_overlay_fs">Utiliser OverlayFS (Beta)</string> <string name="use_overlay_fs">Utiliser OverlayFS</string>
<string name="use_overlay_fs_summary">Alterner entre l\utilisation dOverlayFS et de Magic Mount pour le système de montage de KernelSU Next.</string> <string name="use_overlay_fs_summary">Alterner entre l\utilisation dOverlayFS et de Magic Mount pour le système de montage de KernelSU Next.</string>
<string name="reboot_required">Redémarrage requis</string> <string name="reboot_required">Redémarrage requis</string>
<string name="reboot_message">Les changements ne seront effectifs qu\'après un redémarrage. Voulez-vous redémarrer maintenant?</string> <string name="reboot_message">Les changements ne seront effectifs qu\'après un redémarrage. Voulez-vous redémarrer maintenant?</string>
@@ -83,7 +83,7 @@
<string name="cancel">Annuler</string> <string name="cancel">Annuler</string>
<string name="later">Plus tard</string> <string name="later">Plus tard</string>
<string name="home_next_kernelsu">🔥 Next build</string> <string name="home_next_kernelsu">🔥 Next build</string>
<string name="home_next_kernelsu_repo">https://github.com/rifsxd/KernelSU-Next</string> <string name="home_next_kernelsu_repo">https://github.com/KernelSU-Next/KernelSU-Next</string>
<string name="home_next_kernelsu_body">Branche expérimentale Next. Allez la voir sur Github!</string> <string name="home_next_kernelsu_body">Branche expérimentale Next. Allez la voir sur Github!</string>
<string name="home_experimental_kernelsu">⚠️ Attention, développement expérimental!</string> <string name="home_experimental_kernelsu">⚠️ Attention, développement expérimental!</string>
<string name="home_experimental_kernelsu_repo">127.0.0.1</string> <string name="home_experimental_kernelsu_repo">127.0.0.1</string>
@@ -106,12 +106,12 @@
<string name="profile_selinux_context">Contexte SELinux</string> <string name="profile_selinux_context">Contexte SELinux</string>
<string name="profile_umount_modules">Démonter les modules</string> <string name="profile_umount_modules">Démonter les modules</string>
<string name="failed_to_update_app_profile">Échec de la mise à jour du profil d\'application pour %s</string> <string name="failed_to_update_app_profile">Échec de la mise à jour du profil d\'application pour %s</string>
<string name="require_kernel_version">La version actuelle de KernelSU next %1$d Est trop ancienne pour que le gestionnaire fonctionne correctement. Merci de mettre à jour vers la version %2$d ou supérieur!</string> <string name="require_kernel_version">La version actuelle de KernelSU Next %1$d Est trop ancienne pour que le gestionnaire fonctionne correctement. Merci de mettre à jour vers la version %2$d ou supérieur!</string>
<string name="settings_umount_modules_default">Démonter les modules par défaut</string> <string name="settings_umount_modules_default">Démonter les modules par défaut</string>
<string name="settings_umount_modules_default_summary">Valeur globale par défaut pour \"Démonter les modules\" Dans le profil d\'application. Si activé, toutes les modifications systèmes effectuées par des modules seront annulées pour les applications n\'ayant pas de profil sélectionné.</string> <string name="settings_umount_modules_default_summary">Valeur globale par défaut pour \"Démonter les modules\" Dans le profil d\'application. Si activé, toutes les modifications systèmes effectuées par des modules seront annulées pour les applications n\'ayant pas de profil sélectionné.</string>
<string name="settings_susfs_toggle">Cacher les hooks kprobe</string> <string name="settings_susfs_toggle">Cacher les hooks kprobe</string>
<string name="settings_susfs_toggle_summary">Désactive les hooks kprobe créés par KSU et, à la place, active les hooks non-kprobe intégrés, implémentant les mêmes fonctionnalités qui seraient appliquées à un kernel non-GKI, qui ne supportent krpobe.</string> <string name="settings_susfs_toggle_summary">Désactive les hooks kprobe créés par KSU et, à la place, active les hooks non-kprobe intégrés, implémentant les mêmes fonctionnalités qui seraient appliquées à un kernel non-GKI, qui ne supportent pas les kprobes.</string>
<string name="profile_umount_modules_summary">Activer cette option permettra à KernelSU Next de restaurer n\'importe quel fichier modifié par les modules pour cette app.</string> <string name="profile_umount_modules_summary">Activer cette option permettra à KernelSU Next de restaurer n\'importe quel fichier modifié par les modules pour cette application.</string>
<string name="profile_selinux_domain">Domaine</string> <string name="profile_selinux_domain">Domaine</string>
<string name="profile_selinux_rules">Règles</string> <string name="profile_selinux_rules">Règles</string>
<string name="module_update">Mise à jour</string> <string name="module_update">Mise à jour</string>
@@ -151,8 +151,8 @@
<string name="grant_root_failed">Échec de l\'accord du statut root!</string> <string name="grant_root_failed">Échec de l\'accord du statut root!</string>
<string name="action">Action</string> <string name="action">Action</string>
<string name="open">Ouvrir</string> <string name="open">Ouvrir</string>
<string name="enable_web_debugging">Activer le débuggage WebView</string> <string name="enable_web_debugging">Activer le débogage de WebView</string>
<string name="enable_web_debugging_summary">Peut être utilisé pour débug la WebUI. Merci de ne l\'activer qu\'en cas de nécéssité.</string> <string name="enable_web_debugging_summary">Peut être utilisé pour déboguer la WebUI. Merci de ne l\'activer qu\'en cas de nécéssité.</string>
<string name="direct_install">Installation directe (recommandé)</string> <string name="direct_install">Installation directe (recommandé)</string>
<string name="select_file">Sélectionner un fichier</string> <string name="select_file">Sélectionner un fichier</string>
<string name="install_inactive_slot">Installer sur un slot inactif (après OTA)</string> <string name="install_inactive_slot">Installer sur un slot inactif (après OTA)</string>
@@ -161,12 +161,12 @@
<string name="select_file_tip">%1$s Partitionner l\'image est recommandé.</string> <string name="select_file_tip">%1$s Partitionner l\'image est recommandé.</string>
<string name="select_kmi">Sélectionner le KMI</string> <string name="select_kmi">Sélectionner le KMI</string>
<string name="shrink_sparse_image">Minimiser l\'espace disponible réservé</string> <string name="shrink_sparse_image">Minimiser l\'espace disponible réservé</string>
<string name="shrink_sparse_image_message">Redimensionne l\'image où se trouve le module à sa taille réelle. Notez que cela peut entraîner un fonctionnement anormal du module. Veuillez donc l\'utiliser uniquement en cas de nécessité (par exemple, pour une sauvegarde).</string> <string name="shrink_sparse_image_message">Redimensionne l\'image où se trouve le module à sa taille réelle. Notez que cela peut entraîner un fonctionnement anormal des modules. Veuillez donc l\'utiliser uniquement en cas de nécessité (par exemple, pour une sauvegarde).</string>
<string name="settings_uninstall">Désinstaller</string> <string name="settings_uninstall">Désinstaller</string>
<string name="settings_uninstall_temporary">Désinstaller temporairement</string> <string name="settings_uninstall_temporary">Désinstaller temporairement</string>
<string name="settings_uninstall_permanent">Désinstaller de façon permanente</string> <string name="settings_uninstall_permanent">Désinstaller de façon permanente</string>
<string name="settings_restore_stock_image">Restaurer l\'image stock</string> <string name="settings_restore_stock_image">Restaurer l\'image stock</string>
<string name="settings_uninstall_temporary_message">insnstalle temporairement KernelSU Next, qui sera restauré au prochain redémarrage.</string> <string name="settings_uninstall_temporary_message">Désinstalle temporairement KernelSU Next, qui sera restauré au prochain redémarrage.</string>
<string name="settings_uninstall_permanent_message">Désinstallation de KernelSU Next (Root et les modules) complètement et de façon définitive.</string> <string name="settings_uninstall_permanent_message">Désinstallation de KernelSU Next (Root et les modules) complètement et de façon définitive.</string>
<string name="settings_restore_stock_image_message">Restaure l\'image stock (si une sauvegarde existe), habituellement utilisée avant une mise à jour OTA; Si vous avez besoin de désinstaller KernelSU Next, Merci de sélectionner \"Désinstaller de façon permanente\".</string> <string name="settings_restore_stock_image_message">Restaure l\'image stock (si une sauvegarde existe), habituellement utilisée avant une mise à jour OTA; Si vous avez besoin de désinstaller KernelSU Next, Merci de sélectionner \"Désinstaller de façon permanente\".</string>
<string name="flashing">En cours de flash...</string> <string name="flashing">En cours de flash...</string>

View File

@@ -5,7 +5,7 @@
<string name="issue_report_body_2">Mohon beritahu kami sesegera mungkin!</string> <string name="issue_report_body_2">Mohon beritahu kami sesegera mungkin!</string>
<string name="issue_report_github">Laporkan di GitHub</string> <string name="issue_report_github">Laporkan di GitHub</string>
<string name="issue_report_telegram">Hubungi melalui Telegram</string> <string name="issue_report_telegram">Hubungi melalui Telegram</string>
<string name="issue_report_github_link">https://github.com/rifsxd/KernelSU-Next/issues</string> <string name="issue_report_github_link">https://github.com/KernelSU-Next/KernelSU-Next/issues</string>
<string name="issue_report_telegram_link">https://t.me/ksunext</string> <string name="issue_report_telegram_link">https://t.me/ksunext</string>
<string name="confirm">Yakin</string> <string name="confirm">Yakin</string>
<string name="app_name" translatable="false">KernelSU Next</string> <string name="app_name" translatable="false">KernelSU Next</string>
@@ -17,8 +17,9 @@
<string name="home_superuser_count">SuperUser: %d</string> <string name="home_superuser_count">SuperUser: %d</string>
<string name="home_module_count">Modul: %d</string> <string name="home_module_count">Modul: %d</string>
<string name="home_failure">Tandatangan KernelSU Next v2 tidak ditemukan pada kernel! [ !KSU_NEXT || != size/hash ]</string> <string name="home_failure">Tandatangan KernelSU Next v2 tidak ditemukan pada kernel! [ !KSU_NEXT || != size/hash ]</string>
<string name="home_failure_tip">Mohon agar para pengembang kernel anda mengintegrasikan KernelSU Next!</string> <string name="home_failure_tip">Minta pengembang kernel Anda untuk mengintegrasikan KernelSU Next!</string>
<string name="home_kernel">Kernel</string> <string name="home_kernel">Kernel</string>
<string name="home_susfs_version">Versi SuSFS</string>
<string name="home_android">Versi Android</string> <string name="home_android">Versi Android</string>
<string name="home_manager_version">Versi Manager</string> <string name="home_manager_version">Versi Manager</string>
<string name="home_selinux_status">Status SELinux</string> <string name="home_selinux_status">Status SELinux</string>
@@ -54,6 +55,12 @@
<string name="module_restore_failed">Pemulihan gagal: %s</string> <string name="module_restore_failed">Pemulihan gagal: %s</string>
<string name="module_version">Versi</string> <string name="module_version">Versi</string>
<string name="module_author">Oleh</string> <string name="module_author">Oleh</string>
<string name="module_id">ID</string>
<string name="module_version_code">Kode</string>
<string name="module_update_json">PembaruanJson</string>
<string name="module_update_json_empty">Kosong</string>
<string name="enable_developer_options">Aktifkan opsi pengembang</string>
<string name="enable_developer_options_summary">Tampilkan pengaturan tersembunyi dan info debug module</string>
<string name="module_overlay_fs_not_available">OverlayFS dinonaktifkan oleh kernel, modul tidak tersedia.</string> <string name="module_overlay_fs_not_available">OverlayFS dinonaktifkan oleh kernel, modul tidak tersedia.</string>
<string name="refresh">Muat ulang</string> <string name="refresh">Muat ulang</string>
<string name="show_system_apps">Tampilkan aplikasi sistem</string> <string name="show_system_apps">Tampilkan aplikasi sistem</string>
@@ -65,8 +72,27 @@
<string name="home_module_mount">Modul Sistem</string> <string name="home_module_mount">Modul Sistem</string>
<string name="home_magic_mount">Magic Mount</string> <string name="home_magic_mount">Magic Mount</string>
<string name="home_overlayfs_mount">OverlayFS</string> <string name="home_overlayfs_mount">OverlayFS</string>
<string name="unavailable">Tidak Tersedia</string>
<string name="use_overlay_fs">Gunakan OverlayFS (Tahap Pengujian)</string>
<string name="use_overlay_fs_summary">Beralih Modul Sistem dari Magic Mount ke OverlayFS Untuk KernelSU-Next.</string>
<string name="reboot_required">Muat Ulang Di Perlukan</string>
<string name="reboot_message">Perubahan akan berlaku setelah sistem dinyalakan ulang. Apakah Anda ingin menyalakan ulang sekarang Atau Nanti?</string>
<string name="module_restore">Mengembalikan modul</string>
<string name="module_restore_message">Pulihkan modul dari cadangan terbaru.</string>
<string name="backup_restore">Cadangkan &amp; Pulihkan</string>
<string name="module_backup">Cadangkan modul</string>
<string name="module_backup_message">Cadangkan modul yang terpasang saat ini.</string>
<string name="allowlist_restore">Kembalikan daftar izin</string>
<string name="allowlist_restore_message">Kembalikan daftar izin yang dikonfigurasi saat ini.</string>
<string name="allowlist_backup">Cadangan daftar izin</string>
<string name="allowlist_backup_message">Cadangkan daftar izin yang dikonfigurasi saat ini.</string>
<string name="warning">Peringatan Keras!</string>
<string name="warning_message">Fitur ini masih dalam tahap beta dan pengembangan. Pastikan Anda mencadangkan modul Anda sebelum melanjutkan. Gunakan fitur ini hanya jika Anda memahami potensi risikonya. Lanjutkan dengan hati-hati ya.</string>
<string name="proceed">Lanjutkan</string>
<string name="cancel">Batal</string>
<string name="later">Nanti</string>
<string name="home_next_kernelsu">🔥 Pembangunan Next</string> <string name="home_next_kernelsu">🔥 Pembangunan Next</string>
<string name="home_next_kernelsu_repo">https://github.com/rifsxd/KernelSU-Next</string> <string name="home_next_kernelsu_repo">https://github.com/KernelSU-Next/KernelSU-Next</string>
<string name="home_next_kernelsu_body">Next cabang eksperimental. Lihat di GitHub!</string> <string name="home_next_kernelsu_body">Next cabang eksperimental. Lihat di GitHub!</string>
<string name="home_experimental_kernelsu">⚠️ Peringatan Pengembangan Eksperimental!</string> <string name="home_experimental_kernelsu">⚠️ Peringatan Pengembangan Eksperimental!</string>
<string name="home_experimental_kernelsu_repo">127.0.0.1</string> <string name="home_experimental_kernelsu_repo">127.0.0.1</string>
@@ -106,6 +132,7 @@
<string name="force_stop_app">Paksa berhenti</string> <string name="force_stop_app">Paksa berhenti</string>
<string name="restart_app">Mulai ulang</string> <string name="restart_app">Mulai ulang</string>
<string name="failed_to_update_sepolicy">Gagal membarui aturan SELinux pada: %s</string> <string name="failed_to_update_sepolicy">Gagal membarui aturan SELinux pada: %s</string>
<string name="su_not_allowed">Pemberian superuser tidak diizinkan untuk: %s</string>
<string name="module_changelog">Catatan Perubahan</string> <string name="module_changelog">Catatan Perubahan</string>
<string name="settings_profile_template">Templat Profil Aplikasi</string> <string name="settings_profile_template">Templat Profil Aplikasi</string>
<string name="settings_profile_template_summary">Atur templat Profil yang lokal dan daring</string> <string name="settings_profile_template_summary">Atur templat Profil yang lokal dan daring</string>
@@ -129,28 +156,28 @@
<string name="app_profile_template_save_failed">Gagal menyimpan templat</string> <string name="app_profile_template_save_failed">Gagal menyimpan templat</string>
<string name="app_profile_template_import_empty">Papan klip kosong!</string> <string name="app_profile_template_import_empty">Papan klip kosong!</string>
<string name="module_changelog_failed">Gagal mengambil Changelog: %s</string> <string name="module_changelog_failed">Gagal mengambil Changelog: %s</string>
<string name="settings_check_update">Cek terbaru</string> <string name="settings_check_update">Periksa pembaruan</string>
<string name="settings_check_update_summary">Cek terbaru setiap membuka aplikasi.</string> <string name="settings_check_update_summary">Periksa pembaruan secara otomatis saat membuka aplikasi.</string>
<string name="grant_root_failed">Gagal memberikan akses root!</string> <string name="grant_root_failed">Gagal memberikan akses root!</string>
<string name="action">Tindakan</string> <string name="action">Tindakan</string>
<string name="open">Buka</string> <string name="open">Buka</string>
<string name="enable_web_debugging">Pengawakutuan WebView</string> <string name="enable_web_debugging">Aktifkan debugging WebView</string>
<string name="enable_web_debugging_summary">Dapat mengawakutu WebView, hanya aktifkan jika butuh.</string> <string name="enable_web_debugging_summary">Dapat digunakan untuk men-debug WebUI. Harap aktifkan hanya jika diperlukan.</string>
<string name="direct_install">Instal langsung (rekomendasi)</string> <string name="direct_install">Instalasi langsung (Disarankan)</string>
<string name="select_file">Pilih berkas</string> <string name="select_file">Pilih file</string>
<string name="install_inactive_slot">Instal ke slot nonaktif (setelah OTA)</string> <string name="install_inactive_slot">Instal ke slot tidak aktif (Setelah OTA)</string>
<string name="install_inactive_slot_warning">Gawai akan **DIPAKSA** untuk but ke slot nonaktif! \nHANYA gunakan setelah proses OTA selesai. \nLanjutkan?</string> <string name="install_inactive_slot_warning">Perangkat Anda akan **DIPAKSA** untuk boot ke slot tidak aktif saat ini setelah reboot!\nGunakan opsi ini hanya setelah OTA selesai.\nLanjutkan?</string>
<string name="install_next">Selanjutnya</string> <string name="install_next">Selanjutnya</string>
<string name="select_file_tip">%1$s image partisi terekomendasi</string> <string name="select_file_tip">%1$s image partisi direkomendasikan</string>
<string name="select_kmi">Pilih KMI</string> <string name="select_kmi">Pilih KMI</string>
<string name="shrink_sparse_image">Meminimalkan sparse image</string> <string name="shrink_sparse_image">Meminimalkan sparse image</string>
<string name="shrink_sparse_image_message">Mengembalikan sparse image, lokasi modul disimpan, ke ukuran sebenarnya. Dapat menyebabkan modul bekerja abnormal, maka gunakan saat dibutuhkan saja (mis. untuk pencadangan).</string> <string name="shrink_sparse_image_message">Mengembalikan sparse image, lokasi modul disimpan, ke ukuran sebenarnya. Dapat menyebabkan modul bekerja abnormal, maka gunakan saat dibutuhkan saja (mis. untuk pencadangan).</string>
<string name="settings_uninstall">Hapus</string> <string name="settings_uninstall">Copot Pemasangan</string>
<string name="settings_uninstall_temporary">Hapus temporer</string> <string name="settings_uninstall_temporary">Copot pemasangan untuk sementara</string>
<string name="settings_uninstall_permanent">Hapus permanen</string> <string name="settings_uninstall_permanent">Copot pemasangan secara permanen</string>
<string name="settings_restore_stock_image">Pulihkan image asal</string> <string name="settings_restore_stock_image">Pulihkan image bawaan</string>
<string name="settings_uninstall_temporary_message">Hapus temporer KernelSU Next, pulihkan ke kondisi asali setelah but berikutnya.</string> <string name="settings_uninstall_temporary_message">Copot pemasangan KernelSU Next untuk sementara, pulihkan ke keadaan semula setelah reboot berikutnya.</string>
<string name="settings_uninstall_permanent_message">Hapus permanen KernelSU-Next (root dan modul).</string> <string name="settings_uninstall_permanent_message">Mencopot pemasangan KernelSU Next (Root dan semua modul) sepenuhnya dan secara permanen.</string>
<string name="settings_restore_stock_image_message">Pulihkan image bawaan ROM (jika cadangan tersedia), umumnya dilakukan sebelum OTA; jika ingin menghapus KernelSU, gunakan fungsi "Hapus permanen".</string> <string name="settings_restore_stock_image_message">Pulihkan image bawaan ROM (jika cadangan tersedia), umumnya dilakukan sebelum OTA; jika ingin menghapus KernelSU, gunakan fungsi "Hapus permanen".</string>
<string name="flashing">Pasang</string> <string name="flashing">Pasang</string>
<string name="flash_success">Pemasangan Berhasil</string> <string name="flash_success">Pemasangan Berhasil</string>
@@ -159,4 +186,6 @@
<string name="save_log">Simpan Log</string> <string name="save_log">Simpan Log</string>
<string name="log_saved">Log disimpan</string> <string name="log_saved">Log disimpan</string>
<string name="send_log">Kirim Log</string> <string name="send_log">Kirim Log</string>
<string name="settings_disable_su">Nonaktifkan kompatibilitas su</string>
<string name="settings_disable_su_summary">Nonaktifkan sementara aplikasi apa pun agar tidak mendapatkan hak akses root melalui perintah su (proses root yang sudah ada tidak akan terpengaruh).</string>
</resources> </resources>

View File

@@ -0,0 +1,179 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="issue_report_title">問題に直面していますか?</string>
<string name="issue_report_body">エラーを見つけていますか、または改善の提案がありますか?</string>
<string name="issue_report_body_2">すぐに報告してください!</string>
<string name="issue_report_github">GitHubで報告</string>
<string name="issue_report_telegram">Telegramで連絡</string>
<string name="issue_report_github_link">https://github.com/KernelSU-Next/KernelSU-Next/issues</string>
<string name="issue_report_telegram_link">https://t.me/ksunext</string>
<string name="confirm">確認</string>
<string name="app_name" translatable="false">KernelSU Next</string>
<string name="home">ホーム</string>
<string name="home_not_installed">未インストール</string>
<string name="home_click_to_install">インストールをクリック</string>
<string name="home_working">動作中</string>
<string name="home_working_version">バージョン:%d</string>
<string name="home_superuser_count">スーパーユーザー:%d</string>
<string name="home_module_count">モジュール:%d</string>
<string name="home_failure">カーネルに KernelSU Next V2 の署名が見つかりません! [ !KSU_NEXT || != size/hash ]</string>
<string name="home_failure_tip">カーネル開発者に KernelSU Next を統合してもらってください!</string>
<string name="home_kernel">カーネルバージョン</string>
<string name="home_susfs">SuSFS%s</string>
<string name="home_susfs_version">SuSFS バージョン</string>
<string name="home_susfs_sus_su">SuS SU</string>
<string name="home_android">Android バージョン</string>
<string name="home_manager_version">アプリのバージョン</string>
<string name="home_selinux_status">SELinuxの状態</string>
<string name="selinux_status_disabled">無効</string>
<string name="selinux_status_enforcing">強制</string>
<string name="selinux_status_permissive">許可モード</string>
<string name="selinux_status_unknown">不明</string>
<string name="superuser">スーパーユーザー</string>
<string name="module_failed_to_enable">モジュールを有効にできませんでした:%s</string>
<string name="module_failed_to_disable">モジュールを無効にできませんでした:%s</string>
<string name="module_empty">インストールされたモジュールはありません!</string>
<string name="module">モジュール</string>
<string name="module_install_prompt_with_name">%1$s モジュールをインストールしてもよろしいですか?</string>
<string name="module_sort_a_to_z">A-Zで並べ替え</string>
<string name="module_sort_z_to_a">Z-Aで並べ替え</string>
<string name="uninstall">アンインストール</string>
<string name="restore">復元</string>
<string name="module_install">インストール</string>
<string name="install">インストール</string>
<string name="reboot">再起動</string>
<string name="settings">設定</string>
<string name="reboot_userspace">システムの再起動</string>
<string name="reboot_recovery">Recoveryに再起動</string>
<string name="reboot_bootloader">Bootloaderに再起動</string>
<string name="reboot_download">ダウンロードに再起動</string>
<string name="reboot_edl">EDLへ再起動</string>
<string name="about">KernelSU Nextについて</string>
<string name="module_uninstall_confirm">%s モジュールをアンインストールしてもよろしいですか?</string>
<string name="module_uninstall_success">%s がアンインストールされました</string>
<string name="module_uninstall_failed">アンインストールに失敗しました:%s</string>
<string name="module_restore_confirm">%s モジュールを復元してもよろしいですか?</string>
<string name="module_restore_success">%s が復元されました</string>
<string name="module_restore_failed">復元に失敗しました:%s</string>
<string name="module_version">バージョン</string>
<string name="module_author">著者</string>
<string name="module_overlay_fs_not_available">OverlayFS はカーネルによって無効にされているため、モジュールは使用できません。</string>
<string name="refresh">更新</string>
<string name="show_system_apps">システムアプリを表示</string>
<string name="hide_system_apps">システムアプリを非表示</string>
<string name="export_log">ログをエクスポート</string>
<string name="safe_mode">セーフモード</string>
<string name="reboot_to_apply">再起動して適用</string>
<string name="module_magisk_conflict">Magiskとの競合により、モジュールは使用できません。</string>
<string name="home_module_mount">モジュールシステム</string>
<string name="home_magic_mount">Magicマウント</string>
<string name="home_overlayfs_mount">OverlayFS</string>
<string name="unavailable">利用不可</string>
<string name="use_overlay_fs">OverlayFSを使用実験的</string>
<string name="use_overlay_fs_summary">OverlayFSとMagicマウントの2つのマウントシステムの間で切り替えます。</string>
<string name="reboot_required">再起動が必要です</string>
<string name="reboot_message">変更はシステムを再起動した後に適用されます。今すぐ再起動しますか?</string>
<string name="module_restore">モジュールを復元</string>
<string name="module_restore_message">バックアップからモジュールを復元します。</string>
<string name="module_backup">モジュールをバックアップ</string>
<string name="module_backup_message">現在インストールされているモジュールをバックアップします。</string>
<string name="warning">警告</string>
<string name="warning_message">これはまだ開発中の実験的機能です。操作を続行する前に、モジュールがバックアップされていることを確認してください。この機能を使用するには、そのリスクを理解し、結果を知った上で慎重に操作してください。</string>
<string name="proceed">続行</string>
<string name="cancel">キャンセル</string>
<string name="later">後で</string>
<string name="home_next_kernelsu">🔥 次のビルド</string>
<string name="home_next_kernelsu_repo">https://github.com/KernelSU-Next/KernelSU-Next</string>
<string name="home_next_kernelsu_body">実験的ブランチ。GitHubで確認してください</string>
<string name="home_experimental_kernelsu">⚠️ Experimental development warning!</string>
<string name="home_experimental_kernelsu_repo">127.0.0.1</string>
<string name="home_experimental_kernelsu_body">KernelSU Nextはサードパーティのバージョンで、積極的な実験開発を維持しています。このバージョンでは、安定性、パフォーマンス、信頼性は保証されません。</string>
<string name="home_experimental_kernelsu_body_point_1"> • リスクは自己責任:クラッシュ、予期しない動作、またはシステムの故障が発生する可能性があります。</string>
<string name="home_experimental_kernelsu_body_point_2"> • 保証なし:開発者はデータの損失、システムの損傷などの問題に対して責任を負いません。</string>
<string name="home_experimental_kernelsu_body_point_3"> • テスト専用:このバージョンはリスクを理解し、問題を簡単に解決できるユーザー向けです。</string>
<string name="about_source_code"><![CDATA[ %1$s でソースコードを表示]]></string>
<string name="profile" translatable="false">アプリプロファイル</string>
<string name="profile_default">デフォルト</string>
<string name="profile_template">テンプレート</string>
<string name="profile_custom">カスタム</string>
<string name="profile_name">名前</string>
<string name="profile_namespace">ネームスペース</string>
<string name="profile_namespace_inherited">継承</string>
<string name="profile_namespace_global">グローバル</string>
<string name="profile_namespace_individual">プライベート</string>
<string name="profile_groups">グループ</string>
<string name="profile_capabilities">権限</string>
<string name="profile_selinux_context">SELinux</string>
<string name="profile_umount_modules">モジュールをアンマウント</string>
<string name="failed_to_update_app_profile">%s のアプリプロファイルの更新に失敗しました</string>
<string name="require_kernel_version">現在の KernelSU Nextバージョン %1$d は低すぎるため、マネージャーは正常に動作しません。KernelSU Nextバージョンを %2$d 以上にアップグレードしてください!</string>
<string name="settings_umount_modules_default">デフォルトのモジュールアンマウント</string>
<string name="settings_umount_modules_default_summary">アプリプロファイル内の「モジュールのアンマウント」がデフォルトでオンになります。 有効にするとモジュールによるものを含め、プロファイルが設定されていないアプリすべてのシステム変更が削除されます。</string>
<string name="settings_susfs_toggle">Kprobeフックを非表示</string>
<string name="settings_susfs_toggle_summary">KSUによって作成された Kprobeフックを無効にし、非Kprobeインラインフックを代わりに使用します。これはKprobeをサポートしていない非GKIカーネルに似た方法です。</string>
<string name="profile_umount_modules_summary">有効にすると、KernelSU Next がこのアプリのモジュールによって変更されたファイルを復元できるようになります。</string>
<string name="profile_selinux_domain">ドメイン</string>
<string name="profile_selinux_rules">ルール</string>
<string name="module_update">更新</string>
<string name="module_downloading">モジュールをダウンロード中:%s</string>
<string name="module_start_downloading">ダウンロード開始:%s</string>
<string name="new_version_available">新しいバージョンが見つかりました:%s、アップグレードをクリックしてください。</string>
<string name="launch_app">起動</string>
<string name="close">閉じる</string>
<string name="force_stop_app">強制停止</string>
<string name="restart_app">アプリを再起動</string>
<string name="failed_to_update_sepolicy">%s の SELinuxルール更新に失敗しました</string>
<string name="module_changelog">更新履歴</string>
<string name="settings_profile_template">アプリプロファイルテンプレート</string>
<string name="settings_profile_template_summary">ローカルおよびオンラインのアプリプロファイルテンプレートを管理します</string>
<string name="app_profile_template_create">テンプレートを作成</string>
<string name="app_profile_template_edit">テンプレートを編集</string>
<string name="app_profile_template_id">テンプレート ID</string>
<string name="app_profile_template_id_invalid">テンプレート ID が無効です</string>
<string name="app_profile_template_name">名前</string>
<string name="app_profile_template_description">説明</string>
<string name="app_profile_template_save">保存</string>
<string name="app_profile_template_delete">削除</string>
<string name="app_profile_template_view">テンプレートを表示</string>
<string name="app_profile_template_readonly">読み取り専用</string>
<string name="app_profile_template_id_exist">テンプレート ID は既に存在します!</string>
<string name="app_profile_import_export">インポート/エクスポート</string>
<string name="app_profile_import_from_clipboard">クリップボードからインポート</string>
<string name="app_profile_export_to_clipboard">クリップボードにエクスポート</string>
<string name="app_profile_template_export_empty">エクスポートできるローカルテンプレートはありません!</string>
<string name="app_profile_template_import_success">インポートに成功しました!</string>
<string name="app_profile_template_sync">オンラインルールを同期</string>
<string name="app_profile_template_save_failed">テンプレートの保存に失敗しました!</string>
<string name="app_profile_template_import_empty">クリップボードが空です!</string>
<string name="module_changelog_failed">更新ログの取得に失敗しました: %s</string>
<string name="settings_check_update">更新を確認</string>
<string name="settings_check_update_summary">アプリ起動後に自動的に最新バージョンを確認します。</string>
<string name="grant_root_failed">rootの取得に失敗しました</string>
<string name="action">実行</string>
<string name="open">開く</string>
<string name="enable_web_debugging">WebViewデバッグを有効にする</string>
<string name="enable_web_debugging_summary">WebUIのデバッグに使用できます。必要な場合のみ有効にしてください。</string>
<string name="direct_install">直接インストール(推奨)</string>
<string name="select_file">ファイルを選択</string>
<string name="install_inactive_slot">未使用のスロットにインストールOTA後</string>
<string name="install_inactive_slot_warning">再起動後に**強制的に**別のスロットに切り替わります!\nOTA更新完了後の再起動前にのみ使用してください。\n確認しますか</string>
<string name="install_next">次へ</string>
<string name="select_file_tip">%1$sパーティションイメージを選択することをお勧めします</string>
<string name="select_kmi">KMIを選択</string>
<string name="shrink_sparse_image">スパースファイルを最小化</string>
<string name="shrink_sparse_image_message">モジュールが存在するスパースファイルイメージを実際のサイズに調整します。これによりモジュールが正常に動作しない可能性がありますので、必要な場合(バックアップなど)にのみ使用してください。</string>
<string name="settings_uninstall">アンインストール</string>
<string name="settings_uninstall_temporary">一時的にアンインストール</string>
<string name="settings_uninstall_permanent">完全にアンインストール</string>
<string name="settings_restore_stock_image">工場出荷時のイメージを復元</string>
<string name="settings_uninstall_temporary_message">KernelSU Nextを一時的にアンインストールし、次回の再起動後に復元します。</string>
<string name="settings_uninstall_permanent_message">KernelSU Nextとすべてのモジュールを完全に削除します。</string>
<string name="settings_restore_stock_image_message">工場出荷時のイメージを復元します。一般的にはOTA前に使用します。アンインストールする場合は「完全にアンインストール」を使用してください。</string>
<string name="flashing">フラッシュ中</string>
<string name="flash_success">フラッシュ成功</string>
<string name="flash_failed">フラッシュ失敗</string>
<string name="selected_lkm">選択されたLKM%s</string>
<string name="save_log">ログを保存</string>
<string name="log_saved">ログが保存されました</string>
<string name="send_log">ログを共有</string>
</resources>

View File

@@ -1,11 +1,11 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<resources> <resources>
<string name="issue_report_title">문제가 있으신가요?</string> <string name="issue_report_title">문제가 있으십니까?</string>
<string name="issue_report_body">버그가 발생했거나 피드백이 있으신가요?</string> <string name="issue_report_body">버그가 발생했거나 피드백이 있으십니까?</string>
<string name="issue_report_body_2">가능한 한 빨리 보고하세요!</string> <string name="issue_report_body_2">가능한 한 빨리 보고하십시오!</string>
<string name="issue_report_github">GitHub에 보고</string> <string name="issue_report_github">GitHub에 보고</string>
<string name="issue_report_telegram">Telegram을 통해 문의</string> <string name="issue_report_telegram">Telegram을 통해 문의</string>
<string name="issue_report_github_link">https://github.com/rifsxd/KernelSU-Next/issues</string> <string name="issue_report_github_link">https://github.com/KernelSU-Next/KernelSU-Next/issues</string>
<string name="issue_report_telegram_link">https://t.me/ksunext</string> <string name="issue_report_telegram_link">https://t.me/ksunext</string>
<string name="confirm">확인</string> <string name="confirm">확인</string>
<string name="app_name" translatable="false">KernelSU Next</string> <string name="app_name" translatable="false">KernelSU Next</string>
@@ -17,7 +17,7 @@
<string name="home_superuser_count">루트 권한: %d개</string> <string name="home_superuser_count">루트 권한: %d개</string>
<string name="home_module_count">설치된 모듈: %d개</string> <string name="home_module_count">설치된 모듈: %d개</string>
<string name="home_failure">KernelSU Next v2 서명이 커널에서 발견되지 않았습니다! [ !KSU_NEXT || != size/hash ]</string> <string name="home_failure">KernelSU Next v2 서명이 커널에서 발견되지 않았습니다! [ !KSU_NEXT || != size/hash ]</string>
<string name="home_failure_tip">커널 개발자에게 KernelSU Next 지원을 문의해주세요!</string> <string name="home_failure_tip">커널 개발자에게 KernelSU Next 지원을 문의해주십시오!</string>
<string name="home_kernel">커널 버전</string> <string name="home_kernel">커널 버전</string>
<string name="home_susfs">SuSFS: %s</string> <string name="home_susfs">SuSFS: %s</string>
<string name="home_susfs_version">SuSFS 버전</string> <string name="home_susfs_version">SuSFS 버전</string>
@@ -26,15 +26,15 @@
<string name="home_manager_version">매니저 버전</string> <string name="home_manager_version">매니저 버전</string>
<string name="home_selinux_status">SELinux 상태</string> <string name="home_selinux_status">SELinux 상태</string>
<string name="selinux_status_disabled">비활성화됨</string> <string name="selinux_status_disabled">비활성화됨</string>
<string name="selinux_status_enforcing">적용</string> <string name="selinux_status_enforcing">적용</string>
<string name="selinux_status_permissive">허용</string> <string name="selinux_status_permissive">허용</string>
<string name="selinux_status_unknown">알 수 없음</string> <string name="selinux_status_unknown">알 수 없음</string>
<string name="superuser">슈퍼유저</string> <string name="superuser">슈퍼유저</string>
<string name="module_failed_to_enable">모듈 활성화 실패: %s</string> <string name="module_failed_to_enable">모듈 활성화 실패: %s</string>
<string name="module_failed_to_disable">모듈 비활성화 실패: %s</string> <string name="module_failed_to_disable">모듈 비활성화 실패: %s</string>
<string name="module_empty">설치된 모듈 없음</string> <string name="module_empty">설치된 모듈 없음</string>
<string name="module">모듈</string> <string name="module">모듈</string>
<string name="module_install_prompt_with_name">%1$s 모듈을 설치할까요?</string> <string name="module_install_prompt_with_name">%1$s 모듈(들)이 설치될 예정입니다.</string>
<string name="module_sort_a_to_z">정렬 (A-Z)</string> <string name="module_sort_a_to_z">정렬 (A-Z)</string>
<string name="module_sort_z_to_a">정렬 (Z-A)</string> <string name="module_sort_z_to_a">정렬 (Z-A)</string>
<string name="uninstall">삭제</string> <string name="uninstall">삭제</string>
@@ -49,14 +49,20 @@
<string name="reboot_download">다운로드 모드로 다시 시작</string> <string name="reboot_download">다운로드 모드로 다시 시작</string>
<string name="reboot_edl">EDL 모드로 다시 시작</string> <string name="reboot_edl">EDL 모드로 다시 시작</string>
<string name="about">정보</string> <string name="about">정보</string>
<string name="module_uninstall_confirm">%s 모듈을 삭제할까요?</string> <string name="module_uninstall_confirm">%s 모듈을 삭제하시겠습니까?</string>
<string name="module_uninstall_success">%s 모듈 삭제됨</string> <string name="module_uninstall_success">%s 모듈 삭제됨</string>
<string name="module_uninstall_failed">모듈 삭제 실패: %s</string> <string name="module_uninstall_failed">모듈 삭제 실패: %s</string>
<string name="module_restore_confirm">%s 모듈을 복구할까요?</string> <string name="module_restore_confirm">%s 모듈을 복구하시겠습니까?</string>
<string name="module_restore_success">%s 모듈 복구됨</string> <string name="module_restore_success">%s 모듈 복구됨</string>
<string name="module_restore_failed">모듈 복구 실패: %s</string> <string name="module_restore_failed">모듈 복구 실패: %s</string>
<string name="module_version">버전</string> <string name="module_version">버전</string>
<string name="module_author">개발자</string> <string name="module_author">개발자</string>
<string name="module_id">아이디</string>
<string name="module_version_code">버전 코드</string>
<string name="module_update_json">업데이트 Json</string>
<string name="module_update_json_empty">비어있음</string>
<string name="enable_developer_options">개발자 옵션 활성화</string>
<string name="enable_developer_options_summary">개발자를 위한 숨겨진 설정과 디버깅 정보를 표시</string>
<string name="module_overlay_fs_not_available">커널에서 OverlayFS를 비활성화하여 모듈을 사용할 수 없습니다.</string> <string name="module_overlay_fs_not_available">커널에서 OverlayFS를 비활성화하여 모듈을 사용할 수 없습니다.</string>
<string name="refresh">새로 고침</string> <string name="refresh">새로 고침</string>
<string name="show_system_apps">시스템 앱 보이기</string> <string name="show_system_apps">시스템 앱 보이기</string>
@@ -76,15 +82,20 @@
<string name="module_restore">모듈 복원</string> <string name="module_restore">모듈 복원</string>
<string name="module_restore_message">가장 최근의 백업으로부터 모듈을 복구합니다.</string> <string name="module_restore_message">가장 최근의 백업으로부터 모듈을 복구합니다.</string>
<string name="module_backup">모듈 백업</string> <string name="module_backup">모듈 백업</string>
<string name="backup_restore">백업 &amp; 복원</string>
<string name="module_backup_message">현재 설치된 모듈들을 백업합니다.</string> <string name="module_backup_message">현재 설치된 모듈들을 백업합니다.</string>
<string name="warning">경고</string> <string name="warning">경고</string>
<string name="warning_message">이 기능은 아직 베타 단계이며 개발 중입니다. 계속하기 전에 모듈들을 백업해 놓으시기를 바랍니다. 위험를 이해한 경우에만 이 기능을 이용하세요. 주의하여 계속하세요.</string> <string name="allowlist_restore">허용목록 복원</string>
<string name="allowlist_restore_message">최근 백업으로부터 허용목록 복원</string>
<string name="allowlist_backup">허용목록 백업</string>
<string name="allowlist_backup_message">현재 설정된 허용목록 백업</string>
<string name="warning_message">이 기능은 아직 베타 단계이며 개발 중입니다. 계속하기 전에 모듈들을 백업해 놓으시기를 바랍니다. 위험를 이해한 경우에만 이 기능을 이용하십시오. 그럼에도 계속하시겠습니까?</string>
<string name="proceed">계속</string> <string name="proceed">계속</string>
<string name="cancel">취소</string> <string name="cancel">취소</string>
<string name="later">나중에</string> <string name="later">나중에</string>
<string name="home_next_kernelsu">🔥 Next 빌드</string> <string name="home_next_kernelsu">🔥 Next 빌드</string>
<string name="home_next_kernelsu_repo">https://github.com/rifsxd/KernelSU-Next</string> <string name="home_next_kernelsu_repo">https://github.com/KernelSU-Next/KernelSU-Next</string>
<string name="home_next_kernelsu_body">Next 시험 브랜치입니다. GitHub에서 확인하세요!</string> <string name="home_next_kernelsu_body">Next 시험 브랜치입니다. GitHub에서 확인하십시오!</string>
<string name="home_experimental_kernelsu">⚠️ 실험적 개발 버전 경고!</string> <string name="home_experimental_kernelsu">⚠️ 실험적 개발 버전 경고!</string>
<string name="home_experimental_kernelsu_repo">127.0.0.1</string> <string name="home_experimental_kernelsu_repo">127.0.0.1</string>
<string name="home_experimental_kernelsu_body">KernelSU Next는 활발한 실험적 개발 단계에 있는 비공식 버전입니다. 안정성, 성능 또는 신뢰성에 대한 보장 없이 있는 그대로 제공됩니다.</string> <string name="home_experimental_kernelsu_body">KernelSU Next는 활발한 실험적 개발 단계에 있는 비공식 버전입니다. 안정성, 성능 또는 신뢰성에 대한 보장 없이 있는 그대로 제공됩니다.</string>
@@ -106,7 +117,7 @@
<string name="profile_selinux_context">SELinux 컨텍스</string> <string name="profile_selinux_context">SELinux 컨텍스</string>
<string name="profile_umount_modules">모듈 마운트 해제</string> <string name="profile_umount_modules">모듈 마운트 해제</string>
<string name="failed_to_update_app_profile">%s에 대한 앱 프로파일 업데이트 실패</string> <string name="failed_to_update_app_profile">%s에 대한 앱 프로파일 업데이트 실패</string>
<string name="require_kernel_version">현재 KernelSU Next 버전 %1$d 이 너무 낮아 매니저가 올바르게 작동하기 어렵습니다. 버전 %2$d 이상으로 업데이트해 주세요!</string> <string name="require_kernel_version">현재 KernelSU Next 버전 %1$d 이 너무 낮아 매니저가 올바르게 작동하기 어렵습니다. 버전 %2$d 이상으로 업데이트해 주십시오!</string>
<string name="settings_umount_modules_default">기본적으로 모듈 마운트 해제</string> <string name="settings_umount_modules_default">기본적으로 모듈 마운트 해제</string>
<string name="settings_umount_modules_default_summary">앱 프로파일의 \"모듈 마운트 해제\" 옵션에 대한 전역 기본값입니다. 이 옵션이 활성화되면, 프로파일이 설정되어 있지 않은 앱들에 대한 모듈의 모든 수정사항을 복구합니다.</string> <string name="settings_umount_modules_default_summary">앱 프로파일의 \"모듈 마운트 해제\" 옵션에 대한 전역 기본값입니다. 이 옵션이 활성화되면, 프로파일이 설정되어 있지 않은 앱들에 대한 모듈의 모든 수정사항을 복구합니다.</string>
<string name="settings_susfs_toggle">kprobe hook 숨기기</string> <string name="settings_susfs_toggle">kprobe hook 숨기기</string>
@@ -117,12 +128,13 @@
<string name="module_update">업데이트</string> <string name="module_update">업데이트</string>
<string name="module_downloading">모듈 다운로드중: %s</string> <string name="module_downloading">모듈 다운로드중: %s</string>
<string name="module_start_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="launch_app">실행</string>
<string name="close">닫기</string> <string name="close">닫기</string>
<string name="force_stop_app">강제 종료</string> <string name="force_stop_app">강제 종료</string>
<string name="restart_app">앱 다시 시작</string> <string name="restart_app">앱 다시 시작</string>
<string name="failed_to_update_sepolicy">%s 앱에 대한 SELinux 규칙 업데이트 실패</string> <string name="failed_to_update_sepolicy">%s 앱에 대한 SELinux 규칙 업데이트 실패</string>
<string name="su_not_allowed">$s 앱에게 루트 권한 부여하는 것이 허용되지 않음</string>
<string name="module_changelog">업데이트 내역</string> <string name="module_changelog">업데이트 내역</string>
<string name="settings_profile_template">앱 프로파일 템플릿</string> <string name="settings_profile_template">앱 프로파일 템플릿</string>
<string name="settings_profile_template_summary">로컬과 온라인의 앱 프로파일 템플릿 관리</string> <string name="settings_profile_template_summary">로컬과 온라인의 앱 프로파일 템플릿 관리</string>
@@ -152,23 +164,23 @@
<string name="action">동작 실행</string> <string name="action">동작 실행</string>
<string name="open">열기</string> <string name="open">열기</string>
<string name="enable_web_debugging">WebView 디버깅 활성화</string> <string name="enable_web_debugging">WebView 디버깅 활성화</string>
<string name="enable_web_debugging_summary">WebUI 디버깅에 사용 가능, 필요한 경우에만 활성화해주세요.</string> <string name="enable_web_debugging_summary">WebUI 디버깅에 사용 가능, 필요한 경우에만 활성화해주십시오.</string>
<string name="direct_install">직접 설치 (권장)</string> <string name="direct_install">직접 설치 (권장)</string>
<string name="select_file">파일 선택</string> <string name="select_file">파일 선택</string>
<string name="install_inactive_slot">비활성 슬롯에 설치 (OTA 업데이트 이후)</string> <string name="install_inactive_slot">비활성 슬롯에 설치 (OTA 업데이트 이후)</string>
<string name="install_inactive_slot_warning">재부팅 후 기기는 **강제로** 비활성 슬롯으로 부팅됩니다!\nOTA 업데이트를 진행한 후에만 이 옵션을 사용하세요.\n계속 진행하시겠습니까?</string> <string name="install_inactive_slot_warning">재부팅 후 기기는 **강제로** 비활성 슬롯으로 부팅됩니다!\nOTA 업데이트를 진행한 후에만 이 옵션을 사용하십시오.\n계속 진행하시겠습니까?</string>
<string name="install_next">다음</string> <string name="install_next">다음</string>
<string name="select_file_tip">%1$s 파티션 이미지가 권장됨</string> <string name="select_file_tip">%1$s 파티션 이미지가 권장됨</string>
<string name="select_kmi">KMI 선택</string> <string name="select_kmi">KMI 선택</string>
<string name="shrink_sparse_image">Sparse 이미지 최소화</string> <string name="shrink_sparse_image">Sparse 이미지 최소화</string>
<string name="shrink_sparse_image_message">모듈이 위치한 sparse 이미지를 실제 크기로 축소합니다. 모듈이 비정상적으로 작동할 수 있으니, 필요할 경우에만 (예: 백업) 사용하세요.</string> <string name="shrink_sparse_image_message">모듈이 위치한 sparse 이미지를 실제 크기로 축소합니다. 모듈이 비정상적으로 작동할 수 있으니, 필요할 경우에만 (예: 백업) 사용하십시오.</string>
<string name="settings_uninstall">KernelSU Next 제거</string> <string name="settings_uninstall">KernelSU Next 제거</string>
<string name="settings_uninstall_temporary">임시 제거</string> <string name="settings_uninstall_temporary">임시 제거</string>
<string name="settings_uninstall_permanent">영구 제거</string> <string name="settings_uninstall_permanent">영구 제거</string>
<string name="settings_restore_stock_image">순정 이미지 복구</string> <string name="settings_restore_stock_image">순정 이미지 복구</string>
<string name="settings_uninstall_temporary_message">임시로 KernelSU Next룰 제거하고, 다음 재부팅 때 복구합니다.</string> <string name="settings_uninstall_temporary_message">임시로 KernelSU Next룰 제거하고, 다음 재부팅 때 복구합니다.</string>
<string name="settings_uninstall_permanent_message">KernelSU Next (루트 권한과 모든 모듈 포함)를 완전히, 그리고 영구히 제거합니다.</string> <string name="settings_uninstall_permanent_message">KernelSU Next (루트 권한과 모든 모듈 포함)를 완전히, 그리고 영구히 제거합니다.</string>
<string name="settings_restore_stock_image_message">순정 이미지 복구 (백업이 존재할 때), OTA 업데이트 전에 사용합니다; KernelSU Next를 제거하려면, \"영구 제거\"를 사용하세요.</string> <string name="settings_restore_stock_image_message">순정 이미지 복구 (백업이 존재할 때), OTA 업데이트 전에 사용합니다; KernelSU Next를 제거하려면, \"영구 제거\"를 사용하십시오.</string>
<string name="flashing">플래시 중</string> <string name="flashing">플래시 중</string>
<string name="flash_success">플래시 성공</string> <string name="flash_success">플래시 성공</string>
<string name="flash_failed">플래시 실패</string> <string name="flash_failed">플래시 실패</string>
@@ -176,4 +188,6 @@
<string name="save_log">로그 저장</string> <string name="save_log">로그 저장</string>
<string name="log_saved">로그 저장됨</string> <string name="log_saved">로그 저장됨</string>
<string name="send_log">로그 보내기</string> <string name="send_log">로그 보내기</string>
<string name="settings_disable_su">su 호환성 비활성화</string>
<string name="settings_disable_su_summary">su 명령어를 통한 투르 권한 획득을 일시적으로 비활성화 (이미 존재하는 루트 프로세스는 영향을 받지 않음)</string>
</resources> </resources>

View File

@@ -0,0 +1,179 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="issue_report_title">Napotkałeś problem?</string>
<string name="issue_report_body">Znalazłeś błąd lub chcesz zostawić opinię?</string>
<string name="issue_report_body_2">Zgłoś to najszybciej jak to możliwe!</string>
<string name="issue_report_github">Zgłoś na GitHubie</string>
<string name="issue_report_telegram">Skontaktuj się na Telegramie</string>
<string name="issue_report_github_link">https://github.com/KernelSU-Next/KernelSU-Next/issues</string>
<string name="issue_report_telegram_link">https://t.me/ksunext</string>
<string name="confirm">Potwierdź</string>
<string name="app_name" translatable="false">KernelSU Next</string>
<string name="home">Strona główna</string>
<string name="home_not_installed">Nie zainstalowano</string>
<string name="home_click_to_install">Kliknij, aby zainstalować</string>
<string name="home_working">Działa</string>
<string name="home_working_version">Wersja: %d</string>
<string name="home_superuser_count">Superużytkownicy: %d</string>
<string name="home_module_count">Moduły: %d</string>
<string name="home_failure">Nie znaleziono sygnatury KernelSU Next v2 w jądrze! [ !KSU_NEXT || != size/hash ]</string>
<string name="home_failure_tip">Zapytaj swojego dewelopera o integrację z KernelSU Next!</string>
<string name="home_kernel">Wersja jądra</string>
<string name="home_susfs">SuSFS: %s</string>
<string name="home_susfs_version">Wersja SuSFS</string>
<string name="home_susfs_sus_su">SuS SU</string>
<string name="home_android">Wersja Androida</string>
<string name="home_manager_version">Wersja Managera</string>
<string name="home_selinux_status">Status SELinux</string>
<string name="selinux_status_disabled">Wyłączony</string>
<string name="selinux_status_enforcing">Wymuszony</string>
<string name="selinux_status_permissive">Dozwolony</string>
<string name="selinux_status_unknown">Nieznany</string>
<string name="superuser">Superużytkownik</string>
<string name="module_failed_to_enable">Nie udało się włączyć modułu: %s</string>
<string name="module_failed_to_disable">Nie udało się wyłączyć modułu: %s</string>
<string name="module_empty">Nie zainstalowano żadnych modułów</string>
<string name="module">Moduły</string>
<string name="module_install_prompt_with_name">Zainstalować moduł %1$s?</string>
<string name="module_sort_a_to_z">Sortuj (A-Z)</string>
<string name="module_sort_z_to_a">Sortuj (Z-A)</string>
<string name="uninstall">Odinstaluj</string>
<string name="restore">Przywróć</string>
<string name="module_install">Zainstaluj</string>
<string name="install">Zainstaluj</string>
<string name="reboot">Uruchom ponownie</string>
<string name="settings">Ustawienia</string>
<string name="reboot_userspace">Miękki restart</string>
<string name="reboot_recovery">Restart do trybu Recovery</string>
<string name="reboot_bootloader">Restart do trybu Bootloadera</string>
<string name="reboot_download">Restart do trybu Download</string>
<string name="reboot_edl">Restart do trybu EDL</string>
<string name="about">Autor</string>
<string name="module_uninstall_confirm">Odinstalować moduł %s?</string>
<string name="module_uninstall_success">%s odstalowano</string>
<string name="module_uninstall_failed">Nie można odinstalować: %s</string>
<string name="module_restore_confirm">Przywrócić moduł %s?</string>
<string name="module_restore_success">%s przywrócono</string>
<string name="module_restore_failed">Nie można przywrócić: %s</string>
<string name="module_version">Wersja</string>
<string name="module_author">Autor</string>
<string name="module_overlay_fs_not_available">Moduły są niedostępne, ponieważ OverlayFS jest wyłączony przez jądro.</string>
<string name="refresh">Odśwież</string>
<string name="show_system_apps">Pokaż aplikacje systemowe</string>
<string name="hide_system_apps">Ukryj aplikacje systemowe</string>
<string name="export_log">Eksport logów</string>
<string name="safe_mode">Tryb bezpieczny</string>
<string name="reboot_to_apply">Zrestartuj, aby zastosować zmiany</string>
<string name="module_magisk_conflict">Moduły są niedostępne z powodu konfliku z Magiskiem!</string>
<string name="home_module_mount">Moduł montowania</string>
<string name="home_magic_mount">Magic Mount</string>
<string name="home_overlayfs_mount">OverlayFS</string>
<string name="unavailable">Niedostępne</string>
<string name="use_overlay_fs">Użyj OverlayFS</string>
<string name="use_overlay_fs_summary">Przełącz pomiędzy OverlayFS, a Magic Mount dla modułu montowania.</string>
<string name="reboot_required">Wymagany restart</string>
<string name="reboot_message">Zmiany zostaną zastosowane po restarcie. Uruchomić ponownie?</string>
<string name="module_restore">Przywróć moduły</string>
<string name="module_restore_message">Przywróć moduły z kopii zapasowej.</string>
<string name="module_backup">Kopia zapasowa modułów</string>
<string name="module_backup_message">Kopia zapasowa obecnie zainstalowanych modułów.</string>
<string name="warning">Uwaga</string>
<string name="warning_message">Ta funkcja jest dalej rozwijana. Upewnij się, że utworzyłeś kopię zapasową. Używaj tej opcji tylko, gdy rozumiesz ryzyko. Zachowaj ostrożność.</string>
<string name="proceed">Dalej</string>
<string name="cancel">Anuluj</string>
<string name="later">Później</string>
<string name="home_next_kernelsu">🔥 Nowa wersja</string>
<string name="home_next_kernelsu_repo">https://github.com/KernelSU-Next/KernelSU-Next</string>
<string name="home_next_kernelsu_body">Nowa wersja eksperymentalna. Sprawdź na GitHubie!</string>
<string name="home_experimental_kernelsu">⚠️ Uwaga to wersja eksperymentalna!</string>
<string name="home_experimental_kernelsu_repo">127.0.0.1</string>
<string name="home_experimental_kernelsu_body">KernelSU Next to wersja nieoficjalna, która jest w fazie rozwoju. Nie gwarantujemy stabiności, wydajności, czy niezawodności.</string>
<string name="home_experimental_kernelsu_body_point_1"> • Używasz na własne ryzyko: mogą wystąpić problemy.</string>
<string name="home_experimental_kernelsu_body_point_2"> • Brak gwarancji: deweloperzy nie biorą odpowiedzialności za utratę danych i inne niespodziewane skutki.</string>
<string name="home_experimental_kernelsu_body_point_3"> • Tylko dla testerów: przeznaczone dla użytkowników, którzy rozumieją ryzyko i wiedzą co robią.</string>
<string name="about_source_code"><![CDATA[Zobacz kod źródłowy na %1$s]]></string>
<string name="profile" translatable="false">Profil aplikacji</string>
<string name="profile_default">Domyślny</string>
<string name="profile_template">Szablon</string>
<string name="profile_custom">Własny</string>
<string name="profile_name">Nazwa profilu</string>
<string name="profile_namespace">Przestrzeń nazw montowania</string>
<string name="profile_namespace_inherited">Odziedziczona</string>
<string name="profile_namespace_global">Globalna</string>
<string name="profile_namespace_individual">Indywidualna</string>
<string name="profile_groups">Grupy</string>
<string name="profile_capabilities">Uprawnienia</string>
<string name="profile_selinux_context">Kontekst SELinux</string>
<string name="profile_umount_modules">Odmontuj moduły</string>
<string name="failed_to_update_app_profile">Nie udało się zaktualizować profilu aplikacji dla %s</string>
<string name="require_kernel_version">Obecna wersja KernelSU Next %1$d jest za niska, aby manager działał prawidłowo. Zaktualizuj do wersji %2$d lub wyższej!</string>
<string name="settings_umount_modules_default">Domyślnie odmontuj moduły</string>
<string name="settings_umount_modules_default_summary">Globalna wartość domyślna opcji \"Odmontuj moduły\" w profilu aplikacji. Jeśli jest włączona, wycofuje wszystkie modyfikacje dokonane przez moduły dla aplikacji, które nie mają ustawionego profilu.</string>
<string name="settings_susfs_toggle">Ukryj kprobe hooks</string>
<string name="settings_susfs_toggle_summary">Wyłącza kprobe hooks tworzone przez ksu i zastępuje je non-kprobe hooks, implementując tę samą funkcjonalność, która byłaby zastosowana w jądrze non-GKI, które nie obsługuje kprobe.</string>
<string name="profile_umount_modules_summary">>Włączenie tej opcji umożliwi KernelSU przywrócenie wszelkich zmodyfikowanych plików przez moduły dla tej aplikacji.</string>
<string name="profile_selinux_domain">Domena</string>
<string name="profile_selinux_rules">Reguły</string>
<string name="module_update">Zaktualizuj</string>
<string name="module_downloading">Pobieranie modułu: %s</string>
<string name="module_start_downloading">Rozpocznij pobieranie: %s</string>
<string name="new_version_available">Nowa wersja %s jest dostępna. Kliknij, aby zaktualizować.</string>
<string name="launch_app">Uruchom</string>
<string name="close">Zamknij</string>
<string name="force_stop_app">Wymuś zatrzymanie</string>
<string name="restart_app">Restartuj</string>
<string name="failed_to_update_sepolicy">Nie udało się zaktualizować reguł SELinux dla: %s</string>
<string name="module_changelog">Lista zmian</string>
<string name="settings_profile_template">Szablon profilu aplikacji</string>
<string name="settings_profile_template_summary">Zarządzaj lokalnym i internetowym szablonem profilu aplikacji</string>
<string name="app_profile_template_create">Stwórz szablon</string>
<string name="app_profile_template_edit">Edytuj szablon</string>
<string name="app_profile_template_id">Identyfikator</string>
<string name="app_profile_template_id_invalid">Błędny identyfikator szablonu</string>
<string name="app_profile_template_name">Nazwa</string>
<string name="app_profile_template_description">Opis</string>
<string name="app_profile_template_save">Zapisz</string>
<string name="app_profile_template_delete">Usuń</string>
<string name="app_profile_template_view">Zobacz szablon</string>
<string name="app_profile_template_readonly">Tylko do odczytu</string>
<string name="app_profile_template_id_exist">Szablon o takim identyfikatorze już istnieje!</string>
<string name="app_profile_import_export">Importuj/Eksportuj</string>
<string name="app_profile_import_from_clipboard">Importuj ze schowka</string>
<string name="app_profile_export_to_clipboard">Eksportuj do schowka</string>
<string name="app_profile_template_export_empty">Nie można znaleźć lokalnego szablonu do eksportu!</string>
<string name="app_profile_template_import_success">Zaimportowano pomyślnie</string>
<string name="app_profile_template_sync">Synchronizuj internetowe szablony</string>
<string name="app_profile_template_save_failed">Nie udało się zapisać szablonu</string>
<string name="app_profile_template_import_empty">Schowek jest pusty!</string>
<string name="module_changelog_failed">Pobranie dziennika zmian nie powiodło się: %s</string>
<string name="settings_check_update">Wyszukaj aktualizacje</string>
<string name="settings_check_update_summary">Wyszukuj aktualizacje automatycznie przy otwieraniu aplikacji</string>
<string name="grant_root_failed">Nie udało się przyznać roota!</string>
<string name="action">Akcja</string>
<string name="open">Otwórz</string>
<string name="enable_web_debugging">Włącz debugowanie WebView</string>
<string name="enable_web_debugging_summary">Może być użyte do debugowania WebUI. Włącz tylko w razie potrzeby.</string>
<string name="direct_install">Instalacja bezpośrednia (zalecane)</string>
<string name="select_file">Wybierz plik</string>
<string name="install_inactive_slot">Zainstaluj do nieaktywnego slotu (po aktualizcji OTA)</string>
<string name="install_inactive_slot_warning">Po ponownym uruchomieniu Twoje urządzenie zostanie **ZMUSZONE** do uruchomia się z obecnie nieaktywnego slotu!\nUżyj tej opcji dopiero po zakończeniu aktualizacji OTA.\nCzy chcesz kontynuować?</string>
<string name="install_next">Dalej</string>
<string name="select_file_tip">Obraz partycji %1$s jest zalecany</string>
<string name="select_kmi">Wybierz KMI</string>
<string name="shrink_sparse_image">Minimalizuj rozrzedzony (sparse) obraz</string>
<string name="shrink_sparse_image_message">Zmienia rozmiar obrazu rozrzedzonego(sparse), w którym znajduje się moduł, do jego rzeczywistego rozmiaru. Należy pamiętać, że może to spowodować nieprawidłowe działanie modułu, więc należy go używać tylko wtedy, gdy jest to konieczne (np. do tworzenia kopii zapasowych).</string>
<string name="settings_uninstall">Odinstaluj</string>
<string name="settings_uninstall_temporary">Odinstaluj tymczasowo</string>
<string name="settings_uninstall_permanent">Odinstaluj zupełnie</string>
<string name="settings_restore_stock_image">Przywróć obraz fabryczny</string>
<string name="settings_uninstall_temporary_message">Tymczasowo odinstaluj KernelSU, przywróć do oryginalnego stanu po następnym ponownym uruchomieniu.</string>
<string name="settings_uninstall_permanent_message">Całkowite i trwałe odinstalowanie KernelSU (Root i wszystkich modułów).</string>
<string name="settings_restore_stock_image_message">Przywróć obraz fabryczny (jeśli istnieje kopia zapasowa), zwykle używany przed OTA; jeśli chcesz odinstalować KernelSU, użyj opcji \"Odinstaluj całkowicie\".</string>
<string name="flashing">Flashowanie</string>
<string name="flash_success">Flashowanie ukończone pomyślnie</string>
<string name="flash_failed">Flashowanie nieudane</string>
<string name="selected_lkm">Wybrano LKM: %s</string>
<string name="save_log">Zapisz logi</string>
<string name="log_saved">Logi zapisane</string>
<string name="send_log">Udostępnij logi</string>
</resources>

View File

@@ -5,7 +5,7 @@
<string name="issue_report_body_2">Reporte o mais rápido possível!</string> <string name="issue_report_body_2">Reporte o mais rápido possível!</string>
<string name="issue_report_github">Reportar no GitHub</string> <string name="issue_report_github">Reportar no GitHub</string>
<string name="issue_report_telegram">Contato via Telegram</string> <string name="issue_report_telegram">Contato via Telegram</string>
<string name="issue_report_github_link">https://github.com/rifsxd/KernelSU-Next/issues</string> <string name="issue_report_github_link">https://github.com/KernelSU-Next/KernelSU-Next/issues</string>
<string name="issue_report_telegram_link">https://t.me/ksunext</string> <string name="issue_report_telegram_link">https://t.me/ksunext</string>
<string name="confirm">Confirmar</string> <string name="confirm">Confirmar</string>
<string name="app_name" translatable="false">KernelSU Next</string> <string name="app_name" translatable="false">KernelSU Next</string>
@@ -34,7 +34,7 @@
<string name="module_failed_to_disable">Falha ao desativar o módulo %s</string> <string name="module_failed_to_disable">Falha ao desativar o módulo %s</string>
<string name="module_empty">Nenhum módulo instalado</string> <string name="module_empty">Nenhum módulo instalado</string>
<string name="module">Módulo</string> <string name="module">Módulo</string>
<string name="module_install_prompt_with_name">Deseja continuar instalando o módulo %1$s?</string> <string name="module_install_prompt_with_name">Os seguintes módulos serão instalados: %1$s</string>
<string name="module_sort_a_to_z">Ordenar (A-Z)</string> <string name="module_sort_a_to_z">Ordenar (A-Z)</string>
<string name="module_sort_z_to_a">Ordenar (Z-A)</string> <string name="module_sort_z_to_a">Ordenar (Z-A)</string>
<string name="uninstall">Desinstalar</string> <string name="uninstall">Desinstalar</string>
@@ -57,6 +57,12 @@
<string name="module_restore_failed">Falha ao restaurar %s</string> <string name="module_restore_failed">Falha ao restaurar %s</string>
<string name="module_version">Versão</string> <string name="module_version">Versão</string>
<string name="module_author">Autor</string> <string name="module_author">Autor</string>
<string name="module_id">ID</string>
<string name="module_version_code">Código</string>
<string name="module_update_json">UpdateJson</string>
<string name="module_update_json_empty">Vazio</string>
<string name="enable_developer_options">Ativar opções do desenvolvedor</string>
<string name="enable_developer_options_summary">Exibe as configurações ocultas e informações de depuração relevantes apenas para desenvolvedores.</string>
<string name="module_overlay_fs_not_available">Os módulos estão indisponíveis porque OverlayFS está desabilitado pelo kernel!</string> <string name="module_overlay_fs_not_available">Os módulos estão indisponíveis porque OverlayFS está desabilitado pelo kernel!</string>
<string name="refresh">Atualizar</string> <string name="refresh">Atualizar</string>
<string name="show_system_apps">Mostrar apps do sistema</string> <string name="show_system_apps">Mostrar apps do sistema</string>
@@ -69,21 +75,26 @@
<string name="home_magic_mount">Magic Mount</string> <string name="home_magic_mount">Magic Mount</string>
<string name="home_overlayfs_mount">OverlayFS</string> <string name="home_overlayfs_mount">OverlayFS</string>
<string name="unavailable">Indisponível</string> <string name="unavailable">Indisponível</string>
<string name="use_overlay_fs">Usar OverlayFS (Beta)</string> <string name="use_overlay_fs">Usar OverlayFS</string>
<string name="use_overlay_fs_summary">Alterne entre usar OverlayFS sobre Magic Mount para o sistema de montagem do KernelSU Next.</string> <string name="use_overlay_fs_summary">Alterne entre usar OverlayFS sobre Magic Mount para o sistema de montagem do KernelSU Next.</string>
<string name="reboot_required">Reinicialização necessária</string> <string name="reboot_required">Reinicialização necessária</string>
<string name="reboot_message">As alterações entrarão em vigor após a reinicialização do sistema. Deseja reiniciar agora?</string> <string name="reboot_message">As alterações entrarão em vigor após a reinicialização do sistema. Deseja reiniciar agora?</string>
<string name="module_restore">Restaurar módulo</string> <string name="module_restore">Restaurar módulo</string>
<string name="module_restore_message">Restaure módulos de backup recente.</string> <string name="module_restore_message">Restaure os módulos de um backup recente.</string>
<string name="backup_restore">Backup e restauração</string>
<string name="module_backup">Backup do módulo</string> <string name="module_backup">Backup do módulo</string>
<string name="module_backup_message">Backup dos módulos atualmente instalados.</string> <string name="module_backup_message">Faça backup dos módulos atualmente instalados.</string>
<string name="allowlist_restore">Restaurar lista de permissões</string>
<string name="allowlist_restore_message">Restaure a lista de permissões de backup recente.</string>
<string name="allowlist_backup">Backup da lista de permissões</string>
<string name="allowlist_backup_message">Faça backup da lista de permissões configurada atualmente.</string>
<string name="warning">Aviso</string> <string name="warning">Aviso</string>
<string name="warning_message">Este recurso ainda está em beta e em desenvolvimento. Certifique-se de fazer backup de seus módulos antes de continuar. Use esse recurso somente se você compreender os riscos potenciais. Proceda com cautela.</string> <string name="warning_message">Este recurso ainda está em beta e em desenvolvimento. Certifique-se de fazer backup de seus módulos antes de continuar. Use esse recurso somente se você compreender os riscos potenciais. Proceda com cautela.</string>
<string name="proceed">Prosseguir</string> <string name="proceed">Prosseguir</string>
<string name="cancel">Cancelar</string> <string name="cancel">Cancelar</string>
<string name="later">Mais tarde</string> <string name="later">Mais tarde</string>
<string name="home_next_kernelsu">🔥 Compilação next</string> <string name="home_next_kernelsu">🔥 Compilação next</string>
<string name="home_next_kernelsu_repo">https://github.com/rifsxd/KernelSU-Next</string> <string name="home_next_kernelsu_repo">https://github.com/KernelSU-Next/KernelSU-Next</string>
<string name="home_next_kernelsu_body">Branch next experimental. Confira no GitHub!</string> <string name="home_next_kernelsu_body">Branch next experimental. Confira no GitHub!</string>
<string name="home_experimental_kernelsu">⚠️ Aviso de desenvolvimento experimental!</string> <string name="home_experimental_kernelsu">⚠️ Aviso de desenvolvimento experimental!</string>
<string name="home_experimental_kernelsu_repo">127.0.0.1</string> <string name="home_experimental_kernelsu_repo">127.0.0.1</string>
@@ -107,10 +118,10 @@
<string name="profile_umount_modules">Desmontar módulos</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="failed_to_update_app_profile">Falha ao atualizar o Perfil do Aplicativo para %s</string>
<string name="require_kernel_version">A versão atual do KernelSU Next %1$d é muito baixa para o gerenciador funcionar corretamente. Por favor, atualize para a versão %2$d ou superior!</string> <string name="require_kernel_version">A versão atual do KernelSU Next %1$d é muito baixa para o gerenciador funcionar corretamente. Por favor, atualize para a versão %2$d ou superior!</string>
<string name="settings_umount_modules_default">Desmontar módulos por padrão</string> <string name="settings_umount_modules_default">Desmontar módulos</string>
<string name="settings_umount_modules_default_summary">O valor padrão global para \"Desmontar módulos\" em Perfil do Aplicativo. Se ativado, ele removerá todas as modificações do módulo no sistema para apps que não possuem um perfil definido.</string> <string name="settings_umount_modules_default_summary">O valor padrão global para \"Desmontar módulos\" em Perfil do Aplicativo. Se ativado, ele removerá todas as modificações do módulo no sistema para apps que não possuem um perfil definido.</string>
<string name="settings_susfs_toggle">Ocultar ganchos kprobe</string> <string name="settings_susfs_toggle">Ocultar ganchos kprobe</string>
<string name="settings_susfs_toggle_summary">Ele desativa os ganchos kprobe criados pelo ksu e, em vez disso, ativa os ganchos embutidos não-kprobe, implementando a mesma funcionalidade que seria aplicada a um kernel não-GKI, que não oferece suporte para kprobe.</string> <string name="settings_susfs_toggle_summary">Esta opção desativa os ganchos kprobe criados pelo ksu e, em vez disso, ativa os ganchos embutidos não-kprobe, implementando a mesma funcionalidade que seria aplicada a um kernel não-GKI, que não oferece suporte para kprobe.</string>
<string name="profile_umount_modules_summary">Ativar esta opção permitirá que o KernelSU Next restaure quaisquer arquivos modificados pelos módulos para este app.</string> <string name="profile_umount_modules_summary">Ativar esta opção permitirá que o KernelSU Next restaure quaisquer arquivos modificados pelos módulos para este app.</string>
<string name="profile_selinux_domain">Domínio</string> <string name="profile_selinux_domain">Domínio</string>
<string name="profile_selinux_rules">Regras</string> <string name="profile_selinux_rules">Regras</string>
@@ -123,6 +134,7 @@
<string name="force_stop_app">Forçar parada</string> <string name="force_stop_app">Forçar parada</string>
<string name="restart_app">Reiniciar</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="failed_to_update_sepolicy">Falha ao atualizar as regras do SELinux para: %s</string>
<string name="su_not_allowed">O acesso de SuperUsuário não é permitido para: %s</string>
<string name="module_changelog">Registro de alterações</string> <string name="module_changelog">Registro de alterações</string>
<string name="settings_profile_template">Modelo do Perfil do Aplicativo</string> <string name="settings_profile_template">Modelo do Perfil do Aplicativo</string>
<string name="settings_profile_template_summary">Gerencie o modelo local e online do Perfil do Aplicativo.</string> <string name="settings_profile_template_summary">Gerencie o modelo local e online do Perfil do Aplicativo.</string>
@@ -176,4 +188,6 @@
<string name="save_log">Salvar registros</string> <string name="save_log">Salvar registros</string>
<string name="log_saved">Registros salvos</string> <string name="log_saved">Registros salvos</string>
<string name="send_log">Compartilhar registros</string> <string name="send_log">Compartilhar registros</string>
<string name="settings_disable_su">Desativar compatibilidade su</string>
<string name="settings_disable_su_summary">Desative temporariamente a capacidade de qualquer app obter privilégios root por meio do comando su (processos root existentes não serão afetados).</string>
</resources> </resources>

View File

@@ -5,7 +5,7 @@
<string name="issue_report_body_2">Сообщите об этом как можно скорее!</string> <string name="issue_report_body_2">Сообщите об этом как можно скорее!</string>
<string name="issue_report_github">Сообщить на GitHub</string> <string name="issue_report_github">Сообщить на GitHub</string>
<string name="issue_report_telegram">Связаться через Telegram</string> <string name="issue_report_telegram">Связаться через Telegram</string>
<string name="issue_report_github_link">https://github.com/rifsxd/KernelSU-Next/issues</string> <string name="issue_report_github_link">https://github.com/KernelSU-Next/KernelSU-Next/issues</string>
<string name="issue_report_telegram_link">https://t.me/ksunext</string> <string name="issue_report_telegram_link">https://t.me/ksunext</string>
<string name="confirm">Подтвердить</string> <string name="confirm">Подтвердить</string>
<string name="app_name" translatable="false">KernelSU Next</string> <string name="app_name" translatable="false">KernelSU Next</string>
@@ -83,7 +83,7 @@
<string name="cancel">Отмена</string> <string name="cancel">Отмена</string>
<string name="later">Позже</string> <string name="later">Позже</string>
<string name="home_next_kernelsu">🔥 Следующий билд</string> <string name="home_next_kernelsu">🔥 Следующий билд</string>
<string name="home_next_kernelsu_repo">https://github.com/rifsxd/KernelSU-Next</string> <string name="home_next_kernelsu_repo">https://github.com/KernelSU-Next/KernelSU-Next</string>
<string name="home_next_kernelsu_body">Следующая экспериментальная ветка. Посмотрите на GitHub!</string> <string name="home_next_kernelsu_body">Следующая экспериментальная ветка. Посмотрите на GitHub!</string>
<string name="home_experimental_kernelsu">⚠️ Предупреждение об экспериментальной разработке!</string> <string name="home_experimental_kernelsu">⚠️ Предупреждение об экспериментальной разработке!</string>
<string name="home_experimental_kernelsu_repo">127.0.0.1</string> <string name="home_experimental_kernelsu_repo">127.0.0.1</string>

View File

@@ -5,7 +5,7 @@
<string name="issue_report_body_2">โปรดรายงานมันให้เร็วที่สุด!</string> <string name="issue_report_body_2">โปรดรายงานมันให้เร็วที่สุด!</string>
<string name="issue_report_github">รายงานบน Github</string> <string name="issue_report_github">รายงานบน Github</string>
<string name="issue_report_telegram">ติดต่อผ่านทาง Telegram</string> <string name="issue_report_telegram">ติดต่อผ่านทาง Telegram</string>
<string name="issue_report_github_link">https://github.com/rifsxd/KernelSU-Next/issues</string> <string name="issue_report_github_link">https://github.com/KernelSU-Next/KernelSU-Next/issues</string>
<string name="issue_report_telegram_link">https://t.me/ksunext</string> <string name="issue_report_telegram_link">https://t.me/ksunext</string>
<string name="confirm">ยืนยัน</string> <string name="confirm">ยืนยัน</string>
<string name="app_name" translatable="false">KernelSU Next</string> <string name="app_name" translatable="false">KernelSU Next</string>
@@ -83,7 +83,7 @@
<string name="cancel">ยกเลิก</string> <string name="cancel">ยกเลิก</string>
<string name="later">ภายหลัง</string> <string name="later">ภายหลัง</string>
<string name="home_next_kernelsu">🔥 Next build</string> <string name="home_next_kernelsu">🔥 Next build</string>
<string name="home_next_kernelsu_repo">https://github.com/rifsxd/KernelSU-Next</string> <string name="home_next_kernelsu_repo">https://github.com/KernelSU-Next/KernelSU-Next</string>
<string name="home_next_kernelsu_body">Branch ทดลอง Next ดูได้ที่ GitHub!</string> <string name="home_next_kernelsu_body">Branch ทดลอง Next ดูได้ที่ GitHub!</string>
<string name="home_experimental_kernelsu">⚠️ คำเตือนสิ่งนี้อยู่ภายใต้การพัฒนา!</string> <string name="home_experimental_kernelsu">⚠️ คำเตือนสิ่งนี้อยู่ภายใต้การพัฒนา!</string>
<string name="home_experimental_kernelsu_repo">127.0.0.1</string> <string name="home_experimental_kernelsu_repo">127.0.0.1</string>

View File

@@ -5,7 +5,7 @@
<string name="issue_report_body_2">Hemen bildirin!</string> <string name="issue_report_body_2">Hemen bildirin!</string>
<string name="issue_report_github">GitHub\'da Bildir</string> <string name="issue_report_github">GitHub\'da Bildir</string>
<string name="issue_report_telegram">Telegram\'dan İletişime Geçin</string> <string name="issue_report_telegram">Telegram\'dan İletişime Geçin</string>
<string name="issue_report_github_link">https://github.com/rifsxd/KernelSU-Next/issues</string> <string name="issue_report_github_link">https://github.com/KernelSU-Next/KernelSU-Next/issues</string>
<string name="issue_report_telegram_link">https://t.me/ksunext</string> <string name="issue_report_telegram_link">https://t.me/ksunext</string>
<string name="confirm">Onayla</string> <string name="confirm">Onayla</string>
<string name="app_name" translatable="false">KernelSU Next</string> <string name="app_name" translatable="false">KernelSU Next</string>
@@ -29,11 +29,11 @@
<string name="selinux_status_enforcing">Zorlanıyor (Enforcing)</string> <string name="selinux_status_enforcing">Zorlanıyor (Enforcing)</string>
<string name="selinux_status_permissive">Serbest (Permissive)</string> <string name="selinux_status_permissive">Serbest (Permissive)</string>
<string name="selinux_status_unknown">Bilinmiyor</string> <string name="selinux_status_unknown">Bilinmiyor</string>
<string name="superuser">Süper kullanıcı</string> <string name="superuser">SüperKullanıcı</string>
<string name="module_failed_to_enable">Modül etkinleştirilemedi: %s</string> <string name="module_failed_to_enable">Modül etkinleştirilemedi: %s</string>
<string name="module_failed_to_disable">Modül devre dışı bırakılamadı: %s</string> <string name="module_failed_to_disable">Modül devre dışı bırakılamadı: %s</string>
<string name="module_empty">Yüklü modül yok</string> <string name="module_empty">Yüklü modül yok</string>
<string name="module">Modül</string> <string name="module">Modüller</string>
<string name="module_install_prompt_with_name">%1$s modülünü yüklemeye devam etmek istiyor musunuz?</string> <string name="module_install_prompt_with_name">%1$s modülünü yüklemeye devam etmek istiyor musunuz?</string>
<string name="module_sort_a_to_z">Sırala (A-Z)</string> <string name="module_sort_a_to_z">Sırala (A-Z)</string>
<string name="module_sort_z_to_a">Sırala (Z-A)</string> <string name="module_sort_z_to_a">Sırala (Z-A)</string>
@@ -69,7 +69,7 @@
<string name="home_magic_mount">Magic Mount</string> <string name="home_magic_mount">Magic Mount</string>
<string name="home_overlayfs_mount">OverlayFS</string> <string name="home_overlayfs_mount">OverlayFS</string>
<string name="unavailable">Kullanılamaz</string> <string name="unavailable">Kullanılamaz</string>
<string name="use_overlay_fs">OverlayFS Kullan (Beta)</string> <string name="use_overlay_fs">OverlayFS Kullan</string>
<string name="use_overlay_fs_summary">KernelSU Next\'in Mount sistemi için OverlayFS ile Magic Mount arasında geçiş yapın.</string> <string name="use_overlay_fs_summary">KernelSU Next\'in Mount sistemi için OverlayFS ile Magic Mount arasında geçiş yapın.</string>
<string name="reboot_required">Yeniden Başlatma Gerekiyor</string> <string name="reboot_required">Yeniden Başlatma Gerekiyor</string>
<string name="reboot_message">Değişiklikler sistem yeniden başlatıldıktan sonra etkili olacaktır. Şimdi yeniden başlatmak istiyor musunuz?</string> <string name="reboot_message">Değişiklikler sistem yeniden başlatıldıktan sonra etkili olacaktır. Şimdi yeniden başlatmak istiyor musunuz?</string>
@@ -83,7 +83,7 @@
<string name="cancel">İptal</string> <string name="cancel">İptal</string>
<string name="later">Sonra</string> <string name="later">Sonra</string>
<string name="home_next_kernelsu">🔥 Yeni Sürüm</string> <string name="home_next_kernelsu">🔥 Yeni Sürüm</string>
<string name="home_next_kernelsu_repo">https://github.com/rifsxd/KernelSU-Next</string> <string name="home_next_kernelsu_repo">https://github.com/KernelSU-Next/KernelSU-Next</string>
<string name="home_next_kernelsu_body">Son deneysel dal. GitHub\'da kontrol edin!</string> <string name="home_next_kernelsu_body">Son deneysel dal. GitHub\'da kontrol edin!</string>
<string name="home_experimental_kernelsu">⚠️ Deneysel Geliştirme Uyarısı!</string> <string name="home_experimental_kernelsu">⚠️ Deneysel Geliştirme Uyarısı!</string>
<string name="home_experimental_kernelsu_repo">127.0.0.1</string> <string name="home_experimental_kernelsu_repo">127.0.0.1</string>

View File

@@ -0,0 +1,190 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="issue_report_title">Đang gặp sự cố?</string>
<string name="issue_report_body">Muốn báo cáo lỗi hoặc góp ý?</string>
<string name="issue_report_body_2">Báo cáo hoặc góp ý nhanh nhất có thể!</string>
<string name="issue_report_github">Báo cáo trên GitHub</string>
<string name="issue_report_telegram">Liên hệ qua Telegram</string>
<string name="issue_report_github_link">https://github.com/KernelSU-Next/KernelSU-Next/issues</string>
<string name="issue_report_telegram_link">https://t.me/ksunext</string>
<string name="confirm">Xác nhận</string>
<string name="app_name" translatable="false">KernelSU Next</string>
<string name="home">Màn hình chính</string>
<string name="home_not_installed">Chưa cài đặt</string>
<string name="home_click_to_install">Bấm để cái đặt</string>
<string name="home_working">Đã cài đặt và hoạt động</string>
<string name="home_working_version">Phiên bản: %d</string>
<string name="home_superuser_count">Ứng dụng đã cấp su: %d</string>
<string name="home_module_count">Modules: %d</string>
<string name="home_failure">Chữ kí KernelSU Next v2 Không dược tìm thấy (chưa cài đặt,nhúng sai cách hoặc nhầm trình quản lý?) [ !KSU_NEXT || != size/hash ]</string>
<string name="home_failure_tip">Hỏi hoặc tự nhúng nhân KernelSU Next vào Kernel của bạn!</string>
<string name="home_kernel">Phiên bản kernel</string>
<string name="home_susfs">SuSFS: %s</string>
<string name="home_susfs_version">Phiên bản SuSFS</string>
<string name="home_susfs_sus_su">SuS SU</string>
<string name="home_android">Phiên bản android</string>
<string name="home_manager_version">Phiên bản trình quản lý</string>
<string name="home_selinux_status">Trạng thái SELinux</string>
<string name="selinux_status_disabled">Vô hiệu hoá</string>
<string name="selinux_status_enforcing">Enforcing</string>
<string name="selinux_status_permissive">Permissive</string>
<string name="selinux_status_unknown">Chịu</string>
<string name="superuser">Superuser</string>
<string name="module_failed_to_enable">Không thể kích hoạt module: %s</string>
<string name="module_failed_to_disable">Không thể vô hiệu hoá module: %s</string>
<string name="module_empty">Chưa cài module nào</string>
<string name="module">Module</string>
<string name="module_install_prompt_with_name">Bạn có THẬT SỰ muốn cài module này không (kiểm tra trước khi cài ASAF) %1$s?</string>
<string name="module_sort_a_to_z">Sắp xếp (A-Z)</string>
<string name="module_sort_z_to_a">Sắp xếp (Z-A)</string>
<string name="uninstall">Gỡ cài đặt</string>
<string name="restore">Khôi phục</string>
<string name="module_install">Cài đặt</string>
<string name="install">Cài đặt</string>
<string name="reboot">Khởi động lại</string>
<string name="settings">Cài đặt</string>
<string name="reboot_userspace">Khởi động lại systemctrl</string>
<string name="reboot_recovery">Vào Recovery</string>
<string name="reboot_bootloader">Vào Bootloader</string>
<string name="reboot_download">Vào Download Mode</string>
<string name="reboot_edl">Vào EDL</string>
<string name="about">Thông tin</string>
<string name="module_uninstall_confirm">Bạn có THẬT SỰ muốn gỡ module %s?</string>
<string name="module_uninstall_success">%s đã được gỡ</string>
<string name="module_uninstall_failed">Gỡ cài đặt thất bại: %s</string>
<string name="module_restore_confirm">Khôi phục module lại như lúc cài %s?</string>
<string name="module_restore_success">%s đã khôi phục</string>
<string name="module_restore_failed">Khôi phục thất bại, vui lòng cài lại : %s</string>
<string name="module_version">Phiên bản</string>
<string name="module_author">Người tạo ra</string>
<string name="module_id">ID</string>
<string name="module_version_code">Code</string>
<string name="module_update_json">UpdateJson</string>
<string name="module_update_json_empty">Trống</string>
<string name="enable_developer_options">Kích hoạt tính năng dành cho nhà phát triển</string>
<string name="enable_developer_options_summary">Hiện thị những cài đặt ẩn và nhũng log DÀNH RIÊNG CHO NHÀ PHÁT TRIỂN.</string>
<string name="module_overlay_fs_not_available">Không thể sử dụng module vì flag Overlayfs không được kích hoạt trong kernel, vui lòng kích hoạt</string>
<string name="refresh">Làm mới</string>
<string name="show_system_apps">Hiện thị ứng dụng hệ thống</string>
<string name="hide_system_apps">Ẩn ứng dụng hệ thống</string>
<string name="export_log">Xuất logs</string>
<string name="safe_mode">CHẾ ĐỘ AN TOÀN!?!?</string>
<string name="reboot_to_apply">Khởi động lại để có hiệu lực</string>
<string name="module_magisk_conflict">Vui lòng gỡ magisk để sử dụng module</string>
<string name="home_module_mount">Module hệ thống</string>
<string name="home_magic_mount">Magic Mount</string>
<string name="home_overlayfs_mount">OverlayFS</string>
<string name="unavailable">Không có sẵn</string>
<string name="use_overlay_fs">Sử dụng OverlayFS</string>
<string name="use_overlay_fs_summary">Gạt bật tắt chuyển giữa phương thức OverlayFS và Magic Mount cho các tập mount hệ thống.</string>
<string name="reboot_required">Yêu cầu khởi động lại</string>
<string name="reboot_message">Một/Nhiều thay đổi cần được khởi động lại hệ thống, khởi động luôn?</string>
<string name="module_restore">Khôi phục module</string>
<string name="module_restore_message">Khôi phục modules từ bản sao lưu gần nhất.</string>
<string name="backup_restore">Sao lưu &amp; Khôi phục</string>
<string name="module_backup">Sao lưu module</string>
<string name="module_backup_message">Sao lưu những module đang được cài đặt.</string>
<string name="allowlist_restore">Khôi phục danh sách ngoại trừ</string>
<string name="allowlist_restore_message">Khôi phục danh sách ngoại trừ từ bản sao lưu gần nhất</string>
<string name="allowlist_backup">Sao lưu danh sách ngoại trừ</string>
<string name="allowlist_backup_message">Sao lưu danh sách ngoại trừ từ bản sao lưu gần nhất</string>
<string name="warning">LƯU Ý!!!</string>
<string name="warning_message">Tính năng này vẫn đang trong giai đoạn thử nghiệm, chỉ sử dụng khi bạn chịu trách nghiệm và đủ hiểu biết </string>
<string name="proceed">Tiếp tục</string>
<string name="cancel">Huỷ</string>
<string name="later">Để sau</string>
<string name="home_next_kernelsu">🔥 Bản dựng tiếp theo</string>
<string name="home_next_kernelsu_repo">https://github.com/KernelSU-Next/KernelSU-Next</string>
<string name="home_next_kernelsu_body">Nhánh thử nghiệm tiếp theo. Xem trong GitHub!</string>
<string name="home_experimental_kernelsu">⚠️ Cảnh báo nhánh thử nghiệm cho nhà phát triển!</string>
<string name="home_experimental_kernelsu_repo">127.0.0.1</string>
<string name="home_experimental_kernelsu_body">KernelSU Next là 1 nhánh của KernelSU luôn có những nhánh thử nghiệm và cập nhật hàng ngày, nó có thể không ổn định</string>
<string name="home_experimental_kernelsu_body_point_1"> • Tự chịu trách nghiệm: crashes, những thứ kì lạ, không vào được 1 vài ứng dụng,... có thể diễn ra.</string>
<string name="home_experimental_kernelsu_body_point_2"> • Không bảo hành: Những nhà phát triển trong KernelSU (Next) và bên ngoài sẽ không chịu trách nghiệm khi hardbrick,bootloop,mất dữ liệu,... .</string>
<string name="home_experimental_kernelsu_body_point_3"> • Đùng để thử nghiệm là chính: Chỉ dành cho những người có kĩ năng, kinh nghiệm, trải nghiệm .</string>
<string name="about_source_code"><![CDATA[Xem mã nguồn tại %1$s]]></string>
<string name="profile" translatable="false">Hồ sơ ứng dụng</string>
<string name="profile_default">Mặc định</string>
<string name="profile_template">Mẫu</string>
<string name="profile_custom">Tuỳ biến</string>
<string name="profile_name">Tên hồ sơ</string>
<string name="profile_namespace">Mount namespace</string>
<string name="profile_namespace_inherited">Thừa hưởng</string>
<string name="profile_namespace_global">Chung</string>
<string name="profile_namespace_individual">Riêng biệt</string>
<string name="profile_groups">Nhóm</string>
<string name="profile_capabilities">Tính tương thích</string>
<string name="profile_selinux_context">Nội dung của SELinux</string>
<string name="profile_umount_modules">Umount modules</string>
<string name="failed_to_update_app_profile">Cập nhật hồ sơ ứng dụng thất bại cho %s</string>
<string name="require_kernel_version">Phiên bản KernelSU Next được nhúng trong kernel là %1$d và nó quá thấp để trình quản lý hoạt động. Vui lòng cập nhật lên phiên bản %2$d hoặc!</string>
<string name="settings_umount_modules_default">Umount modules cho toàn hệ thống</string>
<string name="settings_umount_modules_default_summary">Giá trị mặc định chung cho \"Umount modules\" trong hồ sơ ứng dụng. Nếu bật, tất cả nhưng module có can thiệp/thay đổi hệ thống sẽ không đổi trừ khi được kích hoạt trong hồ sơ ứng dụng riêng biệt. (modder oem rom hoặc những người muốn chép file vào phân vùng hệ thống nên tắt).</string>
<string name="settings_susfs_toggle">Ẩn kprobe hooks</string>
<string name="settings_susfs_toggle_summary">Tính năng này sẽ vô hiệu hoá những kprobe hooks đã tạo bởi kernelsu và sẽ kích hoạt và nhúng những non-kprobe hooks,đảm bảo những kernel non-GKI(EOL) hoạt động ổn định.</string>
<string name="profile_umount_modules_summary">Kích hoạt tính năng này sẽ tách các ứng dụng chưa cấp hồ sơ riêng và root.</string>
<string name="profile_selinux_domain">Tên miền</string>
<string name="profile_selinux_rules">Luật</string>
<string name="module_update">Có cập nhật!</string>
<string name="module_downloading">Tải xuống module: %s</string>
<string name="module_start_downloading">Đang tải xuống module: %s</string>
<string name="new_version_available">Phiên bản %s đã ra mắt, bấm để cập nhật.</string>
<string name="launch_app">Mở</string>
<string name="close">Đóng</string>
<string name="force_stop_app">Buốc tắt</string>
<string name="restart_app">Khởi động lại</string>
<string name="failed_to_update_sepolicy">Cập nhất luật SELinux thất bại cho: %s</string>
<string name="module_changelog">Nhật kí thay đổi</string>
<string name="settings_profile_template">Mẫu hồ sơ ứng dụng</string>
<string name="settings_profile_template_summary">Quản lý/Tải xuống trực tuyến hồ sơ ứng dụng</string>
<string name="app_profile_template_create">Tạo mẫu hồ sơ ứng dụng</string>
<string name="app_profile_template_edit">Sửa mẫu hồ sơ ứng dụng</string>
<string name="app_profile_template_id">ID</string>
<string name="app_profile_template_id_invalid">ID mẫu không hợp lệ/tồn tại</string>
<string name="app_profile_template_name">Tên</string>
<string name="app_profile_template_description">Chi tiết</string>
<string name="app_profile_template_save">Lưu</string>
<string name="app_profile_template_delete">Xoá</string>
<string name="app_profile_template_view">Xem mẫu hồ sơ ứng dụng</string>
<string name="app_profile_template_readonly">Chỉ đọc</string>
<string name="app_profile_template_id_exist">ID mẫu hồ sơ ứng dụng đã tồn tại</string>
<string name="app_profile_import_export">Nhập/Xuất</string>
<string name="app_profile_import_from_clipboard">Nhập từ bảng nhớ</string>
<string name="app_profile_export_to_clipboard">Xuất đến bảng nhớ</string>
<string name="app_profile_template_export_empty">Không tìm thấy hồ sơ ứng dụng nội bộ!</string>
<string name="app_profile_template_import_success">Nhập thành công</string>
<string name="app_profile_template_sync">Đồng bộ với hồ sơ ứng dụng trực tuyến</string>
<string name="app_profile_template_save_failed">Lưu hồ sơ ứng dụng thất bại</string>
<string name="app_profile_template_import_empty">Bảng nhớ tạm đang trống hoặc sai thông tin!</string>
<string name="module_changelog_failed">Đọc nhất kí thay đôi thất bại: %s</string>
<string name="settings_check_update">Kiểm tra cập nhật</string>
<string name="settings_check_update_summary">Tự động kiểm tra cập nhật khi mở ứng dụng.</string>
<string name="grant_root_failed">Cấp quyền root thất bại!</string>
<string name="action">Chạy</string>
<string name="open">Mở</string>
<string name="enable_web_debugging">Kích hoạt WebView debugging</string>
<string name="enable_web_debugging_summary">Sử dụng để debug WebUI. Sử dụng khi bạn có kinh nghiệm, kĩ năng.</string>
<string name="direct_install">Cài đặt trực tiếp (cho GKI 2.0)</string>
<string name="select_file">Chọn file</string>
<string name="install_inactive_slot">Cài đặt vào phân vùng update (cho người OTA)</string>
<string name="install_inactive_slot_warning">Thiết bị của bạn sẽ BUỘC khởi động vào phân dùng chưa được sử dụng (có thể A hoặc B)\nSử dụng sau khi update OTA.\nTiếp?</string>
<string name="install_next">Tiếp</string>
<string name="select_file_tip">tập tin %1$s được khuyến kích</string>
<string name="select_kmi">Chọn KMI</string>
<string name="shrink_sparse_image">Nén module.img</string>
<string name="shrink_sparse_image_message">Nén lại module.img về kích thước thực, CHỈ SỬ DỤNG KHI CÓ HIỂU BIẾT VÀ CẦN THIẾT!?!?!?!?!.</string>
<string name="settings_uninstall">Gỡ cài đặt</string>
<string name="settings_uninstall_temporary">Gỡ cài đặt tạm thời</string>
<string name="settings_uninstall_permanent">Gỡ cài đặt sạch</string>
<string name="settings_restore_stock_image">Khôi phục phân vùng khởi động về mặc định</string>
<string name="settings_uninstall_temporary_message">Tạm thời gỡ KernelSU Next.</string>
<string name="settings_uninstall_permanent_message">Gỡ cài đặt sạch hoàn toàn, trả về trạng thái lúc đầu .</string>
<string name="settings_restore_stock_image_message">Khôi phục lại boot lúc đầu (nếu có); nếu bạn cần gỡ hẳn KernelSU Next, sử dụng\"Gỡ cài đặt sạch\".</string>
<string name="flashing">Đang cài đặt</string>
<string name="flash_success">Cài đặt thành công</string>
<string name="flash_failed">Cài đặt thất bại</string>
<string name="selected_lkm">Đã chọn file LKM: %s</string>
<string name="save_log">Lưu logs</string>
<string name="log_saved">Logs đã được lưu</string>
<string name="send_log">Chia sẻ logs</string>
</resources>

View File

@@ -5,7 +5,7 @@
<string name="issue_report_body_2">快向我们报告吧!</string> <string name="issue_report_body_2">快向我们报告吧!</string>
<string name="issue_report_github">在 GitHub 报告</string> <string name="issue_report_github">在 GitHub 报告</string>
<string name="issue_report_telegram">在 Telegram 联系</string> <string name="issue_report_telegram">在 Telegram 联系</string>
<string name="issue_report_github_link">https://github.com/rifsxd/KernelSU-Next/issues</string> <string name="issue_report_github_link">https://github.com/KernelSU-Next/KernelSU-Next/issues</string>
<string name="issue_report_telegram_link">https://t.me/ksunext</string> <string name="issue_report_telegram_link">https://t.me/ksunext</string>
<string name="confirm">确认</string> <string name="confirm">确认</string>
<string name="app_name" translatable="false">KernelSU Next</string> <string name="app_name" translatable="false">KernelSU Next</string>
@@ -57,6 +57,12 @@
<string name="module_restore_failed">恢复失败:%s</string> <string name="module_restore_failed">恢复失败:%s</string>
<string name="module_version">版本</string> <string name="module_version">版本</string>
<string name="module_author">作者</string> <string name="module_author">作者</string>
<string name="module_id">模块标识</string>
<string name="module_version_code">模块版本</string>
<string name="module_update_json">更新配置</string>
<string name="module_update_json_empty">无更新配置</string>
<string name="enable_developer_options">启用开发者模式</string>
<string name="enable_developer_options_summary">显示隐藏的开发者专用设置和调试信息</string>
<string name="module_overlay_fs_not_available">OverlayFS 被内核禁用,模块不可用。</string> <string name="module_overlay_fs_not_available">OverlayFS 被内核禁用,模块不可用。</string>
<string name="refresh">刷新</string> <string name="refresh">刷新</string>
<string name="show_system_apps">显示系统应用</string> <string name="show_system_apps">显示系统应用</string>
@@ -75,6 +81,11 @@
<string name="reboot_message">更改将在重启系统后生效。您想现在重启吗?</string> <string name="reboot_message">更改将在重启系统后生效。您想现在重启吗?</string>
<string name="module_restore">恢复模块</string> <string name="module_restore">恢复模块</string>
<string name="module_restore_message">从备份中恢复模块。</string> <string name="module_restore_message">从备份中恢复模块。</string>
<string name="backup_restore">备份 &amp; 恢复</string>
<string name="allowlist_restore">恢复超级用户列表</string>
<string name="allowlist_restore_message">从最近的备份中恢复超级用户列表</string>
<string name="allowlist_backup">备份超级用户列表</string>
<string name="allowlist_backup_message">备份当前的超级用户列表</string>
<string name="module_backup">备份模块</string> <string name="module_backup">备份模块</string>
<string name="module_backup_message">备份当前已安装的模块。</string> <string name="module_backup_message">备份当前已安装的模块。</string>
<string name="warning">警告</string> <string name="warning">警告</string>
@@ -83,7 +94,7 @@
<string name="cancel">取消</string> <string name="cancel">取消</string>
<string name="later">稍后</string> <string name="later">稍后</string>
<string name="home_next_kernelsu">🔥 Next 构建</string> <string name="home_next_kernelsu">🔥 Next 构建</string>
<string name="home_next_kernelsu_repo">https://github.com/rifsxd/KernelSU-Next</string> <string name="home_next_kernelsu_repo">https://github.com/KernelSU-Next/KernelSU-Next</string>
<string name="home_next_kernelsu_body">Next 实验性分支。在 GitHub 上查看!</string> <string name="home_next_kernelsu_body">Next 实验性分支。在 GitHub 上查看!</string>
<string name="home_experimental_kernelsu">⚠️ 实验性开发警告!</string> <string name="home_experimental_kernelsu">⚠️ 实验性开发警告!</string>
<string name="home_experimental_kernelsu_repo">127.0.0.1</string> <string name="home_experimental_kernelsu_repo">127.0.0.1</string>
@@ -176,4 +187,6 @@
<string name="save_log">保存日志</string> <string name="save_log">保存日志</string>
<string name="log_saved">日志已保存</string> <string name="log_saved">日志已保存</string>
<string name="send_log">分享日志</string> <string name="send_log">分享日志</string>
<string name="settings_disable_su">关闭 su 兼容</string>
<string name="settings_disable_su_summary">临时禁止任何应用通过 su 命令获取 root 权限(已运行的 root 进程不受影响)</string>
</resources> </resources>

View File

@@ -5,7 +5,7 @@
<string name="issue_report_body_2">請儘快告知我們!</string> <string name="issue_report_body_2">請儘快告知我們!</string>
<string name="issue_report_github">在 GitHub 回報</string> <string name="issue_report_github">在 GitHub 回報</string>
<string name="issue_report_telegram">透過 Telegram 聯繫</string> <string name="issue_report_telegram">透過 Telegram 聯繫</string>
<string name="issue_report_github_link">https://github.com/rifsxd/KernelSU-Next/issues</string> <string name="issue_report_github_link">https://github.com/KernelSU-Next/KernelSU-Next/issues</string>
<string name="issue_report_telegram_link">https://t.me/ksunext</string> <string name="issue_report_telegram_link">https://t.me/ksunext</string>
<string name="confirm">確認</string> <string name="confirm">確認</string>
<string name="app_name" translatable="false">KernelSU Next</string> <string name="app_name" translatable="false">KernelSU Next</string>
@@ -80,7 +80,7 @@
<string name="cancel">取消</string> <string name="cancel">取消</string>
<string name="later">稍後</string> <string name="later">稍後</string>
<string name="home_next_kernelsu">🔥 Next 構建</string> <string name="home_next_kernelsu">🔥 Next 構建</string>
<string name="home_next_kernelsu_repo">https://github.com/rifsxd/KernelSU-Next</string> <string name="home_next_kernelsu_repo">https://github.com/KernelSU-Next/KernelSU-Next</string>
<string name="home_next_kernelsu_body">Next 實驗性分支。在 GitHub 上查看!</string> <string name="home_next_kernelsu_body">Next 實驗性分支。在 GitHub 上查看!</string>
<string name="home_experimental_kernelsu">⚠️ 實驗性開發警告!</string> <string name="home_experimental_kernelsu">⚠️ 實驗性開發警告!</string>
<string name="home_experimental_kernelsu_repo">127.0.0.1</string> <string name="home_experimental_kernelsu_repo">127.0.0.1</string>

View File

@@ -5,7 +5,7 @@
<string name="issue_report_body_2">Report it as soon as possible!</string> <string name="issue_report_body_2">Report it as soon as possible!</string>
<string name="issue_report_github">Report on GitHub</string> <string name="issue_report_github">Report on GitHub</string>
<string name="issue_report_telegram">Contact via Telegram</string> <string name="issue_report_telegram">Contact via Telegram</string>
<string name="issue_report_github_link">https://github.com/rifsxd/KernelSU-Next/issues</string> <string name="issue_report_github_link">https://github.com/KernelSU-Next/KernelSU-Next/issues</string>
<string name="issue_report_telegram_link">https://t.me/ksunext</string> <string name="issue_report_telegram_link">https://t.me/ksunext</string>
<string name="confirm">Confirm</string> <string name="confirm">Confirm</string>
<string name="app_name" translatable="false">KernelSU Next</string> <string name="app_name" translatable="false">KernelSU Next</string>
@@ -34,7 +34,7 @@
<string name="module_failed_to_disable">Failed to disable 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 module installed</string>
<string name="module">Module</string> <string name="module">Module</string>
<string name="module_install_prompt_with_name">Do you want to continue installing module %1$s?</string> <string name="module_install_prompt_with_name">The following module(s) will be installed: %1$s</string>
<string name="module_sort_a_to_z">Sort (A-Z)</string> <string name="module_sort_a_to_z">Sort (A-Z)</string>
<string name="module_sort_z_to_a">Sort (Z-A)</string> <string name="module_sort_z_to_a">Sort (Z-A)</string>
<string name="uninstall">Uninstall</string> <string name="uninstall">Uninstall</string>
@@ -57,6 +57,12 @@
<string name="module_restore_failed">Failed to restore: %s</string> <string name="module_restore_failed">Failed to restore: %s</string>
<string name="module_version">Version</string> <string name="module_version">Version</string>
<string name="module_author">Author</string> <string name="module_author">Author</string>
<string name="module_id">ID</string>
<string name="module_version_code">Code</string>
<string name="module_update_json">UpdateJson</string>
<string name="module_update_json_empty">Empty</string>
<string name="enable_developer_options">Enable developer options</string>
<string name="enable_developer_options_summary">Show hidden settings and debug info relevant only for developers.</string>
<string name="module_overlay_fs_not_available">Modules are unavailable as OverlayFS is disabled by the kernel.</string> <string name="module_overlay_fs_not_available">Modules are unavailable as OverlayFS is disabled by the kernel.</string>
<string name="refresh">Refresh</string> <string name="refresh">Refresh</string>
<string name="show_system_apps">Show system apps</string> <string name="show_system_apps">Show system apps</string>
@@ -69,21 +75,26 @@
<string name="home_magic_mount">Magic Mount</string> <string name="home_magic_mount">Magic Mount</string>
<string name="home_overlayfs_mount">OverlayFS</string> <string name="home_overlayfs_mount">OverlayFS</string>
<string name="unavailable">Unavailable</string> <string name="unavailable">Unavailable</string>
<string name="use_overlay_fs">Use OverlayFS (Beta)</string> <string name="use_overlay_fs">Use OverlayFS</string>
<string name="use_overlay_fs_summary">Toggle between using OverlayFS over Magic Mount for KernelSU Next\'s mount system.</string> <string name="use_overlay_fs_summary">Toggle between using OverlayFS over Magic Mount for KernelSU Next\'s mount system.</string>
<string name="reboot_required">Reboot required</string> <string name="reboot_required">Reboot required</string>
<string name="reboot_message">The changes will take effect after the system restart. Do you want to reboot now?</string> <string name="reboot_message">The changes will take effect after the system restart. Do you want to reboot now?</string>
<string name="module_restore">Restore module</string> <string name="module_restore">Restore module</string>
<string name="module_restore_message">Restore modules from recent backup.</string> <string name="module_restore_message">Restore modules from recent backup.</string>
<string name="backup_restore">Backup &amp; Restore</string>
<string name="module_backup">Backup module</string> <string name="module_backup">Backup module</string>
<string name="module_backup_message">Backup currently installed modules.</string> <string name="module_backup_message">Backup currently installed modules.</string>
<string name="allowlist_restore">Restore allowlist</string>
<string name="allowlist_restore_message">Restore allowlist from recent backup.</string>
<string name="allowlist_backup">Backup allowlist</string>
<string name="allowlist_backup_message">Backup currently configured allowlist.</string>
<string name="warning">Warning</string> <string name="warning">Warning</string>
<string name="warning_message">This feature is still in beta and under development. Please ensure you backup your modules before proceeding. Only use this feature if you understand the potential risks. Proceed with caution.</string> <string name="warning_message">This feature is still in beta and under development. Please ensure you backup your modules before proceeding. Only use this feature if you understand the potential risks. Proceed with caution.</string>
<string name="proceed">Proceed</string> <string name="proceed">Proceed</string>
<string name="cancel">Cancel</string> <string name="cancel">Cancel</string>
<string name="later">Later</string> <string name="later">Later</string>
<string name="home_next_kernelsu">🔥 Next build</string> <string name="home_next_kernelsu">🔥 Next build</string>
<string name="home_next_kernelsu_repo">https://github.com/rifsxd/KernelSU-Next</string> <string name="home_next_kernelsu_repo">https://github.com/KernelSU-Next/KernelSU-Next</string>
<string name="home_next_kernelsu_body">Next experimental branch. Check it out on GitHub!</string> <string name="home_next_kernelsu_body">Next experimental branch. Check it out on GitHub!</string>
<string name="home_experimental_kernelsu">⚠️ Experimental development warning!</string> <string name="home_experimental_kernelsu">⚠️ Experimental development warning!</string>
<string name="home_experimental_kernelsu_repo">127.0.0.1</string> <string name="home_experimental_kernelsu_repo">127.0.0.1</string>
@@ -107,10 +118,10 @@
<string name="profile_umount_modules">Umount modules</string> <string name="profile_umount_modules">Umount modules</string>
<string name="failed_to_update_app_profile">Failed to update App Profile for %s</string> <string name="failed_to_update_app_profile">Failed to update App Profile for %s</string>
<string name="require_kernel_version">The current KernelSU Next version %1$d is too low for the manager to work properly. Please upgrade to version %2$d or higher!</string> <string name="require_kernel_version">The current KernelSU Next version %1$d is too low for the manager to work properly. Please upgrade to version %2$d or higher!</string>
<string name="settings_umount_modules_default">Umount modules by default</string> <string name="settings_umount_modules_default">Umount modules</string>
<string name="settings_umount_modules_default_summary">The global default value for \"Umount modules\" in App Profile. If enabled, it will remove all module modifications to the system for apps that don\'t have a profile set.</string> <string name="settings_umount_modules_default_summary">The global default value for \"Umount modules\" in App Profile. If enabled, it will remove all module modifications to the system for apps that don\'t have a profile set.</string>
<string name="settings_susfs_toggle">Hide kprobe hooks</string> <string name="settings_susfs_toggle">Hide kprobe hooks</string>
<string name="settings_susfs_toggle_summary">It disables the kprobe hooks created by ksu and, instead, activates the embedded non-kprobe hooks, implementing the same functionality that would be applied to a non-GKI kernel, which doesn\'t support kprobe.</string> <string name="settings_susfs_toggle_summary">This option disables the kprobe hooks created by ksu and, instead, activates the embedded non-kprobe hooks, implementing the same functionality that would be applied to a non-GKI kernel, which doesn\'t support kprobe.</string>
<string name="profile_umount_modules_summary">Enabling this option will allow KernelSU Next to restore any modified files by the modules for this app.</string> <string name="profile_umount_modules_summary">Enabling this option will allow KernelSU Next to restore any modified files by the modules for this app.</string>
<string name="profile_selinux_domain">Domain</string> <string name="profile_selinux_domain">Domain</string>
<string name="profile_selinux_rules">Rules</string> <string name="profile_selinux_rules">Rules</string>
@@ -123,6 +134,7 @@
<string name="force_stop_app">Force stop</string> <string name="force_stop_app">Force stop</string>
<string name="restart_app">Restart</string> <string name="restart_app">Restart</string>
<string name="failed_to_update_sepolicy">Failed to update SELinux rules for: %s</string> <string name="failed_to_update_sepolicy">Failed to update SELinux rules for: %s</string>
<string name="su_not_allowed">Granting superuser isn\'t allowed for: %s</string>
<string name="module_changelog">Changelog</string> <string name="module_changelog">Changelog</string>
<string name="settings_profile_template">App Profile Template</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="settings_profile_template_summary">Manage local and online template of App Profile</string>
@@ -176,4 +188,6 @@
<string name="save_log">Save logs</string> <string name="save_log">Save logs</string>
<string name="log_saved">Logs saved</string> <string name="log_saved">Logs saved</string>
<string name="send_log">Share logs</string> <string name="send_log">Share logs</string>
<string name="settings_disable_su">Disable su compatibility</string>
<string name="settings_disable_su_summary">Temporarily disable the ability of any app to gain root privileges via the su command (existing root processes won\'t be affected).</string>
</resources> </resources>

View File

@@ -30,7 +30,7 @@ cmaker {
val androidMinSdkVersion = 26 val androidMinSdkVersion = 26
val androidTargetSdkVersion = 35 val androidTargetSdkVersion = 35
val androidCompileSdkVersion = 35 val androidCompileSdkVersion = 35
val androidCompileNdkVersion = "27.2.12479018" val androidCompileNdkVersion = "28.0.13004108"
val androidSourceCompatibility = JavaVersion.VERSION_21 val androidSourceCompatibility = JavaVersion.VERSION_21
val androidTargetCompatibility = JavaVersion.VERSION_21 val androidTargetCompatibility = JavaVersion.VERSION_21
val managerVersionCode by extra(getVersionCode()) val managerVersionCode by extra(getVersionCode())

View File

@@ -1,14 +1,14 @@
[versions] [versions]
agp = "8.8.0" agp = "8.8.1"
kotlin = "2.1.0" kotlin = "2.1.10"
ksp = "2.1.0-1.0.29" ksp = "2.1.10-1.0.30"
compose-bom = "2025.01.00" compose-bom = "2025.02.00"
lifecycle = "2.8.7" lifecycle = "2.8.7"
navigation = "2.8.5" navigation = "2.8.7"
activity-compose = "1.10.0" activity-compose = "1.10.0"
kotlinx-coroutines = "1.10.1" kotlinx-coroutines = "1.10.1"
coil-compose = "2.7.0" coil-compose = "2.7.0"
compose-destination = "2.1.0-beta15" compose-destination = "2.1.0-beta16"
sheets-compose-dialogs = "1.3.0" sheets-compose-dialogs = "1.3.0"
markdown = "4.6.2" markdown = "4.6.2"
webkit = "1.12.1" webkit = "1.12.1"

View File

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

View File

@@ -29,7 +29,7 @@ version = "0.8.11"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e89da841a80418a9b391ebaea17f5c112ffaaa96f621d2c285b5174da76b9011" checksum = "e89da841a80418a9b391ebaea17f5c112ffaaa96f621d2c285b5174da76b9011"
dependencies = [ dependencies = [
"cfg-if 1.0.0", "cfg-if",
"once_cell", "once_cell",
"version_check", "version_check",
"zerocopy", "zerocopy",
@@ -131,9 +131,9 @@ dependencies = [
[[package]] [[package]]
name = "anyhow" name = "anyhow"
version = "1.0.95" version = "1.0.96"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "34ac096ce696dc2fcabef30516bb13c0a68a11d30131d3df6f04711467681b04" checksum = "6b964d184e89d9b6b67dd2715bc8e74cf3107fb2b529990c90cf517326150bf4"
[[package]] [[package]]
name = "arbitrary" name = "arbitrary"
@@ -146,9 +146,9 @@ dependencies = [
[[package]] [[package]]
name = "async-trait" name = "async-trait"
version = "0.1.85" version = "0.1.86"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3f934833b4b7233644e5848f235df3f57ed8c80f1528a26c3dfa13d2147fa056" checksum = "644dd749086bf3771a2fbc5f256fdb982d53f011c7d5d560304eafeecebce79d"
dependencies = [ dependencies = [
"proc-macro2", "proc-macro2",
"quote", "quote",
@@ -168,7 +168,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8d82cb332cdfaed17ae235a638438ac4d4839913cc2af585c3c6746e8f8bee1a" checksum = "8d82cb332cdfaed17ae235a638438ac4d4839913cc2af585c3c6746e8f8bee1a"
dependencies = [ dependencies = [
"addr2line", "addr2line",
"cfg-if 1.0.0", "cfg-if",
"libc", "libc",
"miniz_oxide", "miniz_oxide",
"object", "object",
@@ -184,9 +184,9 @@ checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a"
[[package]] [[package]]
name = "bitflags" name = "bitflags"
version = "2.6.0" version = "2.8.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b048fb63fd8b5923fc5aa7b340d8e156aec7ec02f0c78fa8a6ddc2613f6f71de" checksum = "8f68f53c83ab957f72c32642f3868eec03eb974d1fb82e453128456482613d36"
[[package]] [[package]]
name = "block-buffer" name = "block-buffer"
@@ -199,9 +199,9 @@ dependencies = [
[[package]] [[package]]
name = "bumpalo" name = "bumpalo"
version = "3.16.0" version = "3.17.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "79296716171880943b8470b5f8d03aa55eb2e645a4874bdbb28adb49162e012c" checksum = "1628fb46dfa0b37568d12e5edd512553eccf6a22a78e8bde00bb4aed84d5bdbf"
[[package]] [[package]]
name = "byteorder" name = "byteorder"
@@ -211,25 +211,19 @@ checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b"
[[package]] [[package]]
name = "bytes" name = "bytes"
version = "1.9.0" version = "1.10.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "325918d6fe32f23b19878fe4b34794ae41fc19ddbe53b10571a4874d44ffd39b" checksum = "f61dac84819c6588b558454b194026eb1f09c293b9036ae9b159e74e73ab6cf9"
[[package]] [[package]]
name = "cc" name = "cc"
version = "1.2.10" version = "1.2.15"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "13208fcbb66eaeffe09b99fffbe1af420f00a7b35aa99ad683dfc1aa76145229" checksum = "c736e259eea577f443d5c86c304f9f4ae0295c43f3ba05c21f1d66b5f06001af"
dependencies = [ dependencies = [
"shlex", "shlex",
] ]
[[package]]
name = "cfg-if"
version = "0.1.10"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "4785bdd1c96b2a846b2bd7cc02e86b6b3dbf14e7e53446c4f54c92a361040822"
[[package]] [[package]]
name = "cfg-if" name = "cfg-if"
version = "1.0.0" version = "1.0.0"
@@ -252,9 +246,9 @@ dependencies = [
[[package]] [[package]]
name = "clap" name = "clap"
version = "4.5.27" version = "4.5.30"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "769b0145982b4b48713e01ec42d61614425f27b7058bda7180a3a41f30104796" checksum = "92b7b18d71fad5313a1e320fa9897994228ce274b60faa4d694fe0ea89cd9e6d"
dependencies = [ dependencies = [
"clap_builder", "clap_builder",
"clap_derive", "clap_derive",
@@ -262,9 +256,9 @@ dependencies = [
[[package]] [[package]]
name = "clap_builder" name = "clap_builder"
version = "4.5.27" version = "4.5.30"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1b26884eb4b57140e4d2d93652abfa49498b938b3c9179f9fc487b0acc3edad7" checksum = "a35db2071778a7344791a4fb4f95308b5673d219dee3ae348b86642574ecc90c"
dependencies = [ dependencies = [
"anstream", "anstream",
"anstyle", "anstyle",
@@ -274,9 +268,9 @@ dependencies = [
[[package]] [[package]]
name = "clap_derive" name = "clap_derive"
version = "4.5.24" version = "4.5.28"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "54b755194d6389280185988721fffba69495eed5ee9feeee9a599b53db80318c" checksum = "bf4ced95c6f4a675af3da73304b9ac4ed991640c36374e4b46795c49e17cf1ed"
dependencies = [ dependencies = [
"heck", "heck",
"proc-macro2", "proc-macro2",
@@ -333,9 +327,9 @@ dependencies = [
[[package]] [[package]]
name = "cpufeatures" name = "cpufeatures"
version = "0.2.16" version = "0.2.17"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "16b80225097f2e5ae4e7179dd2266824648f3e2f49d9134d584b76389d31c4c3" checksum = "59ed5838eebb26a2bb2e58f6d5b5316989ae9d08bab10e0e6d103e656d1b0280"
dependencies = [ dependencies = [
"libc", "libc",
] ]
@@ -361,7 +355,7 @@ version = "1.4.2"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a97769d94ddab943e4510d138150169a2758b5ef3eb191a9ee688de3e23ef7b3" checksum = "a97769d94ddab943e4510d138150169a2758b5ef3eb191a9ee688de3e23ef7b3"
dependencies = [ dependencies = [
"cfg-if 1.0.0", "cfg-if",
] ]
[[package]] [[package]]
@@ -496,9 +490,9 @@ dependencies = [
[[package]] [[package]]
name = "either" name = "either"
version = "1.13.0" version = "1.14.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "60b1af1c220855b6ceac025d3f6ecdd2b7c4894bfe9cd9bda4fbb4bc7c0d4cf0" checksum = "b7914353092ddf589ad78f25c5c1c21b7f80b0ff8621e7c814c3485b5306da9d"
[[package]] [[package]]
name = "encoding_rs" name = "encoding_rs"
@@ -506,7 +500,7 @@ version = "0.8.35"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "75030f3c4f45dafd7586dd6780965a8c7e8e285a5ecb86713e63a79c5b2766f3" checksum = "75030f3c4f45dafd7586dd6780965a8c7e8e285a5ecb86713e63a79c5b2766f3"
dependencies = [ dependencies = [
"cfg-if 1.0.0", "cfg-if",
] ]
[[package]] [[package]]
@@ -536,9 +530,9 @@ dependencies = [
[[package]] [[package]]
name = "equivalent" name = "equivalent"
version = "1.0.1" version = "1.0.2"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f"
[[package]] [[package]]
name = "errno" name = "errno"
@@ -558,7 +552,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "33d852cb9b869c2a9b3df2f71a3074817f01e1844f839a144f5fcef059a4eb5d" checksum = "33d852cb9b869c2a9b3df2f71a3074817f01e1844f839a144f5fcef059a4eb5d"
dependencies = [ dependencies = [
"libc", "libc",
"windows-sys 0.52.0", "windows-sys 0.59.0",
] ]
[[package]] [[package]]
@@ -590,9 +584,9 @@ checksum = "37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be"
[[package]] [[package]]
name = "flate2" name = "flate2"
version = "1.0.35" version = "1.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c936bfdafb507ebbf50b8074c54fa31c5be9a1e7e5f467dd659697041407d07c" checksum = "11faaf5a5236997af9848be0bef4db95824b1d534ebc64d0f0c6cf3e67bd38dc"
dependencies = [ dependencies = [
"crc32fast", "crc32fast",
"miniz_oxide", "miniz_oxide",
@@ -619,13 +613,14 @@ dependencies = [
[[package]] [[package]]
name = "getrandom" name = "getrandom"
version = "0.2.15" version = "0.3.1"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c4567c8db10ae91089c99af84c68c38da3ec2f087c3f82960bcdbf3656b6f4d7" checksum = "43a49c392881ce6d5c3b8cb70f98717b7c07aabbdff06687b9030dbfbe2725f8"
dependencies = [ dependencies = [
"cfg-if 1.0.0", "cfg-if",
"libc", "libc",
"wasi", "wasi",
"windows-targets",
] ]
[[package]] [[package]]
@@ -662,19 +657,6 @@ version = "0.4.3"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70"
[[package]]
name = "hole-punch"
version = "0.0.4-alpha.0"
source = "git+https://github.com/tiann/hole-punch#11ab7a61bfb98682b72fd7f58a47d8e5d997328e"
dependencies = [
"cfg-if 0.1.10",
"errno 0.2.8",
"libc",
"memmap",
"thiserror 1.0.69",
"winapi",
]
[[package]] [[package]]
name = "humansize" name = "humansize"
version = "2.1.3" version = "2.1.3"
@@ -773,9 +755,9 @@ dependencies = [
[[package]] [[package]]
name = "js-sys" name = "js-sys"
version = "0.3.76" version = "0.3.77"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6717b6b5b077764fb5966237269cb3c64edddde4b14ce42647430a78ced9e7b7" checksum = "1cfaf33c695fc6e08064efbc1f72ec937429614f25eef83af942d0e227c3a28f"
dependencies = [ dependencies = [
"once_cell", "once_cell",
"wasm-bindgen", "wasm-bindgen",
@@ -806,7 +788,6 @@ dependencies = [
"env_logger", "env_logger",
"extattr", "extattr",
"getopts", "getopts",
"hole-punch",
"humansize", "humansize",
"is_executable", "is_executable",
"java-properties", "java-properties",
@@ -817,10 +798,8 @@ dependencies = [
"nom", "nom",
"procfs", "procfs",
"regex-lite", "regex-lite",
"retry",
"rust-embed", "rust-embed",
"rustix 0.38.34", "rustix 0.38.34",
"serde",
"serde_json", "serde_json",
"sha1", "sha1",
"sha256", "sha256",
@@ -838,9 +817,9 @@ checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe"
[[package]] [[package]]
name = "libc" name = "libc"
version = "0.2.169" version = "0.2.170"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b5aba8db14291edd000dfcc4d620c7ebfb122c613afb886ca8803fa4e128a20a" checksum = "875b3680cb2f8f71bdcf9a30f38d48282f5d3c95cbf9b3fa57269bb5d5c06828"
[[package]] [[package]]
name = "libflate" name = "libflate"
@@ -886,9 +865,9 @@ checksum = "9374ef4228402d4b7e403e5838cb880d9ee663314b0a900d5a6aabf0c213552e"
[[package]] [[package]]
name = "log" name = "log"
version = "0.4.25" version = "0.4.26"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "04cbf5b083de1c7e0222a7a51dbfdba1cbe1c6ab0b15e29fff3f6c077fd9cd9f" checksum = "30bde2b3dc3671ae49d8e2e9f044c7c005836e7a023ee57cffa25ab82764bb9e"
[[package]] [[package]]
name = "loopdev" name = "loopdev"
@@ -915,39 +894,22 @@ version = "2.7.4"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3"
[[package]]
name = "memmap"
version = "0.7.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6585fd95e7bb50d6cc31e20d4cf9afb4e2ba16c5846fc76793f11218da9c475b"
dependencies = [
"libc",
"winapi",
]
[[package]]
name = "minimal-lexical"
version = "0.2.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a"
[[package]] [[package]]
name = "miniz_oxide" name = "miniz_oxide"
version = "0.8.3" version = "0.8.5"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b8402cab7aefae129c6977bb0ff1b8fd9a04eb5b51efc50a70bea51cda0c7924" checksum = "8e3e04debbb59698c15bacbb6d93584a8c0ca9cc3213cb423d31f760d8843ce5"
dependencies = [ dependencies = [
"adler2", "adler2",
] ]
[[package]] [[package]]
name = "nom" name = "nom"
version = "7.1.3" version = "8.0.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d273983c5a657a70a3e8f2a01329822f3b8c8172b73826411a55751e404a0a4a" checksum = "df9761775871bdef83bee530e60050f7e54b1105350d6884eb0fb4f46c2f9405"
dependencies = [ dependencies = [
"memchr", "memchr",
"minimal-lexical",
] ]
[[package]] [[package]]
@@ -976,9 +938,9 @@ dependencies = [
[[package]] [[package]]
name = "once_cell" name = "once_cell"
version = "1.20.2" version = "1.20.3"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1261fe7e33c73b354eab43b1273a57c8f967d0391e80353e51f764ac02cf6775" checksum = "945462a4b81e43c4e3ba96bd7b49d834c6f61198356aa858733bc4acf3cbe62e"
[[package]] [[package]]
name = "pin-project-lite" name = "pin-project-lite"
@@ -992,15 +954,6 @@ version = "0.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391"
[[package]]
name = "ppv-lite86"
version = "0.2.20"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "77957b295656769bb8ad2b6a6b09d897d94f05c41b069aede1fcdaa675eaea04"
dependencies = [
"zerocopy",
]
[[package]] [[package]]
name = "proc-macro2" name = "proc-macro2"
version = "1.0.93" version = "1.0.93"
@@ -1016,12 +969,12 @@ version = "0.17.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "cc5b72d8145275d844d4b5f6d4e1eef00c8cd889edb6035c21675d1bb1f45c9f" checksum = "cc5b72d8145275d844d4b5f6d4e1eef00c8cd889edb6035c21675d1bb1f45c9f"
dependencies = [ dependencies = [
"bitflags 2.6.0", "bitflags 2.8.0",
"chrono", "chrono",
"flate2", "flate2",
"hex", "hex",
"procfs-core", "procfs-core",
"rustix 0.38.42", "rustix 0.38.44",
] ]
[[package]] [[package]]
@@ -1030,7 +983,7 @@ version = "0.17.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "239df02d8349b06fc07398a3a1697b06418223b1c7725085e801e7c0fc6a12ec" checksum = "239df02d8349b06fc07398a3a1697b06418223b1c7725085e801e7c0fc6a12ec"
dependencies = [ dependencies = [
"bitflags 2.6.0", "bitflags 2.8.0",
"chrono", "chrono",
"hex", "hex",
] ]
@@ -1044,36 +997,6 @@ dependencies = [
"proc-macro2", "proc-macro2",
] ]
[[package]]
name = "rand"
version = "0.8.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404"
dependencies = [
"libc",
"rand_chacha",
"rand_core",
]
[[package]]
name = "rand_chacha"
version = "0.3.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88"
dependencies = [
"ppv-lite86",
"rand_core",
]
[[package]]
name = "rand_core"
version = "0.6.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c"
dependencies = [
"getrandom",
]
[[package]] [[package]]
name = "rayon" name = "rayon"
version = "1.10.0" version = "1.10.0"
@@ -1100,15 +1023,6 @@ version = "0.1.6"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "53a49587ad06b26609c52e423de037e7f57f20d53535d66e08c695f347df952a" checksum = "53a49587ad06b26609c52e423de037e7f57f20d53535d66e08c695f347df952a"
[[package]]
name = "retry"
version = "2.0.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9166d72162de3575f950507683fac47e30f6f2c3836b71b7fbc61aa517c9c5f4"
dependencies = [
"rand",
]
[[package]] [[package]]
name = "rle-decode-fast" name = "rle-decode-fast"
version = "1.0.3" version = "1.0.3"
@@ -1161,7 +1075,7 @@ name = "rustix"
version = "0.38.34" version = "0.38.34"
source = "git+https://github.com/Kernel-SU/rustix.git?branch=main#4a53fbc7cb7a07cabe87125cc21dbc27db316259" source = "git+https://github.com/Kernel-SU/rustix.git?branch=main#4a53fbc7cb7a07cabe87125cc21dbc27db316259"
dependencies = [ dependencies = [
"bitflags 2.6.0", "bitflags 2.8.0",
"errno 0.3.10", "errno 0.3.10",
"itoa", "itoa",
"libc", "libc",
@@ -1172,22 +1086,28 @@ dependencies = [
[[package]] [[package]]
name = "rustix" name = "rustix"
version = "0.38.42" version = "0.38.44"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f93dc38ecbab2eb790ff964bb77fa94faf256fd3e73285fd7ba0903b76bedb85" checksum = "fdb5bc1ae2baa591800df16c9ca78619bf65c0488b41b96ccec5d11220d8c154"
dependencies = [ dependencies = [
"bitflags 2.6.0", "bitflags 2.8.0",
"errno 0.3.10", "errno 0.3.10",
"libc", "libc",
"linux-raw-sys", "linux-raw-sys",
"windows-sys 0.52.0", "windows-sys 0.59.0",
] ]
[[package]] [[package]]
name = "ryu" name = "rustversion"
version = "1.0.18" version = "1.0.19"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f3cb5ba0dc43242ce17de99c180e96db90b235b8a9fdc9543c96d2209116bd9f" checksum = "f7c45b9784283f1b2e7fb61b42047c2fd678ef0960d4f6f1eba131594cc369d4"
[[package]]
name = "ryu"
version = "1.0.19"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6ea1a2d0a644769cc99faa24c3ad26b379b786fe7c36fd3c546254801650e6dd"
[[package]] [[package]]
name = "same-file" name = "same-file"
@@ -1200,18 +1120,18 @@ dependencies = [
[[package]] [[package]]
name = "serde" name = "serde"
version = "1.0.217" version = "1.0.218"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "02fc4265df13d6fa1d00ecff087228cc0a2b5f3c0e87e258d8b94a156e984c70" checksum = "e8dfc9d19bdbf6d17e22319da49161d5d0108e4188e8b680aef6299eed22df60"
dependencies = [ dependencies = [
"serde_derive", "serde_derive",
] ]
[[package]] [[package]]
name = "serde_derive" name = "serde_derive"
version = "1.0.217" version = "1.0.218"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5a9bf7cf98d04a2b28aead066b7496853d4779c9cc183c440dbac457641e19a0" checksum = "f09503e191f4e797cb8aac08e9a4a4695c5edf6a2e70e376d961ddd5c969f82b"
dependencies = [ dependencies = [
"proc-macro2", "proc-macro2",
"quote", "quote",
@@ -1220,9 +1140,9 @@ dependencies = [
[[package]] [[package]]
name = "serde_json" name = "serde_json"
version = "1.0.137" version = "1.0.139"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "930cfb6e6abf99298aaad7d29abbef7a9999a9a8806a40088f55f0dcec03146b" checksum = "44f86c3acccc9c65b153fe1b85a3be07fe5515274ec9f0653b4a0875731c72a6"
dependencies = [ dependencies = [
"itoa", "itoa",
"memchr", "memchr",
@@ -1236,7 +1156,7 @@ version = "0.10.6"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e3bf829a2d51ab4a5ddf1352d8470c140cadc8301b2ae1789db023f01cedd6ba" checksum = "e3bf829a2d51ab4a5ddf1352d8470c140cadc8301b2ae1789db023f01cedd6ba"
dependencies = [ dependencies = [
"cfg-if 1.0.0", "cfg-if",
"cpufeatures", "cpufeatures",
"digest", "digest",
] ]
@@ -1247,7 +1167,7 @@ version = "0.10.8"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "793db75ad2bcafc3ffa7c68b215fee268f537982cd901d132f89c6343f3a3dc8" checksum = "793db75ad2bcafc3ffa7c68b215fee268f537982cd901d132f89c6343f3a3dc8"
dependencies = [ dependencies = [
"cfg-if 1.0.0", "cfg-if",
"cpufeatures", "cpufeatures",
"digest", "digest",
] ]
@@ -1285,9 +1205,9 @@ checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f"
[[package]] [[package]]
name = "syn" name = "syn"
version = "2.0.96" version = "2.0.98"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d5d0adab1ae378d7f53bdebc67a39f1f151407ef230f0ce2883572f5d8985c80" checksum = "36147f1a48ae0ec2b5b3bc5b537d267457555a10dc06f3dbc8cb11ba3006d3b1"
dependencies = [ dependencies = [
"proc-macro2", "proc-macro2",
"quote", "quote",
@@ -1296,52 +1216,32 @@ dependencies = [
[[package]] [[package]]
name = "tempfile" name = "tempfile"
version = "3.15.0" version = "3.17.1"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9a8a559c81686f576e8cd0290cd2a24a2a9ad80c98b3478856500fcbd7acd704" checksum = "22e5a0acb1f3f55f65cc4a866c361b2fb2a0ff6366785ae6fbb5f85df07ba230"
dependencies = [ dependencies = [
"cfg-if 1.0.0", "cfg-if",
"fastrand", "fastrand",
"getrandom", "getrandom",
"once_cell", "once_cell",
"rustix 0.38.42", "rustix 0.38.44",
"windows-sys 0.52.0", "windows-sys 0.59.0",
] ]
[[package]] [[package]]
name = "thiserror" name = "thiserror"
version = "1.0.69" version = "2.0.11"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52" checksum = "d452f284b73e6d76dd36758a0c8684b1d5be31f92b89d07fd5822175732206fc"
dependencies = [ dependencies = [
"thiserror-impl 1.0.69", "thiserror-impl",
]
[[package]]
name = "thiserror"
version = "2.0.9"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f072643fd0190df67a8bab670c20ef5d8737177d6ac6b2e9a236cb096206b2cc"
dependencies = [
"thiserror-impl 2.0.9",
] ]
[[package]] [[package]]
name = "thiserror-impl" name = "thiserror-impl"
version = "1.0.69" version = "2.0.11"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" checksum = "26afc1baea8a989337eeb52b6e72a039780ce45c3edfcc9c5b9d112feeb173c2"
dependencies = [
"proc-macro2",
"quote",
"syn",
]
[[package]]
name = "thiserror-impl"
version = "2.0.9"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7b50fa271071aae2e6ee85f842e2e28ba8cd2c5fb67f11fcb1fd70b276f9e7d4"
dependencies = [ dependencies = [
"proc-macro2", "proc-macro2",
"quote", "quote",
@@ -1380,15 +1280,15 @@ dependencies = [
[[package]] [[package]]
name = "typenum" name = "typenum"
version = "1.17.0" version = "1.18.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825" checksum = "1dccffe3ce07af9386bfd29e80c0ab1a8205a2fc34e4bcd40364df902cfa8f3f"
[[package]] [[package]]
name = "unicode-ident" name = "unicode-ident"
version = "1.0.14" version = "1.0.17"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "adb9e6ca4f869e1180728b7950e35922a7fc6397f7b641499e8f3ef06e50dc83" checksum = "00e2473a93778eb0bad35909dff6a10d28e63f792f16ed15e404fca9d5eeedbe"
[[package]] [[package]]
name = "unicode-width" name = "unicode-width"
@@ -1426,26 +1326,30 @@ dependencies = [
[[package]] [[package]]
name = "wasi" name = "wasi"
version = "0.11.0+wasi-snapshot-preview1" version = "0.13.3+wasi-0.2.2"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" checksum = "26816d2e1a4a36a2940b96c5296ce403917633dff8f3440e9b236ed6f6bacad2"
dependencies = [
"wit-bindgen-rt",
]
[[package]] [[package]]
name = "wasm-bindgen" name = "wasm-bindgen"
version = "0.2.99" version = "0.2.100"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a474f6281d1d70c17ae7aa6a613c87fce69a127e2624002df63dcb39d6cf6396" checksum = "1edc8929d7499fc4e8f0be2262a241556cfc54a0bea223790e71446f2aab1ef5"
dependencies = [ dependencies = [
"cfg-if 1.0.0", "cfg-if",
"once_cell", "once_cell",
"rustversion",
"wasm-bindgen-macro", "wasm-bindgen-macro",
] ]
[[package]] [[package]]
name = "wasm-bindgen-backend" name = "wasm-bindgen-backend"
version = "0.2.99" version = "0.2.100"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5f89bb38646b4f81674e8f5c3fb81b562be1fd936d84320f3264486418519c79" checksum = "2f0a0651a5c2bc21487bde11ee802ccaf4c51935d0d3d42a6101f98161700bc6"
dependencies = [ dependencies = [
"bumpalo", "bumpalo",
"log", "log",
@@ -1457,9 +1361,9 @@ dependencies = [
[[package]] [[package]]
name = "wasm-bindgen-macro" name = "wasm-bindgen-macro"
version = "0.2.99" version = "0.2.100"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2cc6181fd9a7492eef6fef1f33961e3695e4579b9872a6f7c83aee556666d4fe" checksum = "7fe63fc6d09ed3792bd0897b314f53de8e16568c2b3f7982f468c0bf9bd0b407"
dependencies = [ dependencies = [
"quote", "quote",
"wasm-bindgen-macro-support", "wasm-bindgen-macro-support",
@@ -1467,9 +1371,9 @@ dependencies = [
[[package]] [[package]]
name = "wasm-bindgen-macro-support" name = "wasm-bindgen-macro-support"
version = "0.2.99" version = "0.2.100"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "30d7a95b763d3c45903ed6c81f156801839e5ee968bb07e534c44df0fcd330c2" checksum = "8ae87ea40c9f689fc23f209965b6fb8a99ad69aeeb0231408be24920604395de"
dependencies = [ dependencies = [
"proc-macro2", "proc-macro2",
"quote", "quote",
@@ -1480,19 +1384,22 @@ dependencies = [
[[package]] [[package]]
name = "wasm-bindgen-shared" name = "wasm-bindgen-shared"
version = "0.2.99" version = "0.2.100"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "943aab3fdaaa029a6e0271b35ea10b72b943135afe9bffca82384098ad0e06a6" checksum = "1a05d73b933a847d6cccdda8f838a22ff101ad9bf93e33684f39c1f5f0eece3d"
dependencies = [
"unicode-ident",
]
[[package]] [[package]]
name = "which" name = "which"
version = "7.0.1" version = "7.0.2"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "fb4a9e33648339dc1642b0e36e21b3385e6148e289226f657c809dee59df5028" checksum = "2774c861e1f072b3aadc02f8ba886c26ad6321567ecc294c935434cad06f1283"
dependencies = [ dependencies = [
"either", "either",
"env_home", "env_home",
"rustix 0.38.42", "rustix 0.38.44",
"winsafe", "winsafe",
] ]
@@ -1518,7 +1425,7 @@ version = "0.1.9"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "cf221c93e13a30d793f7645a0e7762c55d169dbb0a49671918a2319d289b10bb" checksum = "cf221c93e13a30d793f7645a0e7762c55d169dbb0a49671918a2319d289b10bb"
dependencies = [ dependencies = [
"windows-sys 0.52.0", "windows-sys 0.59.0",
] ]
[[package]] [[package]]
@@ -1624,13 +1531,21 @@ version = "0.0.19"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d135d17ab770252ad95e9a872d365cf3090e3be864a34ab46f48555993efc904" checksum = "d135d17ab770252ad95e9a872d365cf3090e3be864a34ab46f48555993efc904"
[[package]]
name = "wit-bindgen-rt"
version = "0.33.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3268f3d866458b787f390cf61f4bbb563b922d091359f9608842999eaee3943c"
dependencies = [
"bitflags 2.8.0",
]
[[package]] [[package]]
name = "zerocopy" name = "zerocopy"
version = "0.7.35" version = "0.7.35"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1b9b4fd18abc82b8136838da5d50bae7bdea537c574d8dc1a34ed098d6c166f0" checksum = "1b9b4fd18abc82b8136838da5d50bae7bdea537c574d8dc1a34ed098d6c166f0"
dependencies = [ dependencies = [
"byteorder",
"zerocopy-derive", "zerocopy-derive",
] ]
@@ -1660,7 +1575,7 @@ dependencies = [
"indexmap", "indexmap",
"lzma-rs", "lzma-rs",
"memchr", "memchr",
"thiserror 2.0.9", "thiserror",
"time", "time",
"zopfli", "zopfli",
] ]

View File

@@ -1,7 +1,7 @@
[package] [package]
name = "ksud" name = "ksud"
version = "0.1.0" version = "0.1.0"
edition = "2021" edition = "2024"
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
@@ -20,16 +20,14 @@ zip-extensions = { version = "0.8", features = [
java-properties = { git = "https://github.com/Kernel-SU/java-properties.git", branch = "master", default-features = false } java-properties = { git = "https://github.com/Kernel-SU/java-properties.git", branch = "master", default-features = false }
log = "0.4" log = "0.4"
env_logger = { version = "0.11", default-features = false } env_logger = { version = "0.11", default-features = false }
serde = { version = "1" }
serde_json = "1" serde_json = "1"
encoding_rs = "0.8" encoding_rs = "0.8"
retry = "2"
humansize = "2" humansize = "2"
libc = "0.2" libc = "0.2"
extattr = "1" extattr = "1"
jwalk = "0.8" jwalk = "0.8"
is_executable = "1" is_executable = "1"
nom = "7" nom = "8"
derive-new = "0.7" derive-new = "0.7"
rust-embed = { version = "8", features = [ rust-embed = { version = "8", features = [
"debug-embed", "debug-embed",
@@ -41,7 +39,6 @@ sha256 = "1"
sha1 = "0.10" sha1 = "0.10"
tempfile = "3" tempfile = "3"
chrono = "0.4" chrono = "0.4"
hole-punch = { git = "https://github.com/tiann/hole-punch" }
regex-lite = "0.1" regex-lite = "0.1"
[target.'cfg(any(target_os = "android", target_os = "linux"))'.dependencies] [target.'cfg(any(target_os = "android", target_os = "linux"))'.dependencies]

View File

@@ -1,4 +1,4 @@
use anyhow::{ensure, Result}; use anyhow::{Result, ensure};
use std::io::{Read, Seek, SeekFrom}; use std::io::{Read, Seek, SeekFrom};
pub fn get_apk_signature(apk: &str) -> Result<(u32, String)> { pub fn get_apk_signature(apk: &str) -> Result<(u32, String)> {

View File

@@ -12,13 +12,6 @@ pub const BOOTCTL_PATH: &str = concatcp!(BINARY_DIR, "bootctl");
#[allow(dead_code)] #[allow(dead_code)]
pub const SUSFSD_PATH: &str = concatcp!(BINARY_DIR, "susfsd"); pub const SUSFSD_PATH: &str = concatcp!(BINARY_DIR, "susfsd");
#[cfg(all(target_arch = "x86_64", target_os = "android"))]
#[derive(RustEmbed)]
#[folder = "bin/x86_64"]
struct Asset;
// IF NOT x86_64 ANDROID, ie. macos, linux, windows, always use aarch64
#[cfg(not(all(target_arch = "x86_64", target_os = "android")))]
#[derive(RustEmbed)] #[derive(RustEmbed)]
#[folder = "bin/aarch64"] #[folder = "bin/aarch64"]
struct Asset; struct Asset;

View File

@@ -5,11 +5,11 @@ use std::path::PathBuf;
use std::process::Command; use std::process::Command;
use std::process::Stdio; use std::process::Stdio;
use anyhow::Context;
use anyhow::Result;
use anyhow::anyhow; use anyhow::anyhow;
use anyhow::bail; use anyhow::bail;
use anyhow::ensure; use anyhow::ensure;
use anyhow::Context;
use anyhow::Result;
use regex_lite::Regex; use regex_lite::Regex;
use which::which; use which::which;
@@ -74,7 +74,7 @@ fn parse_kmi_from_modules() -> Result<String> {
// find a *.ko in /vendor/lib/modules // find a *.ko in /vendor/lib/modules
let modfile = std::fs::read_dir("/vendor/lib/modules")? let modfile = std::fs::read_dir("/vendor/lib/modules")?
.filter_map(Result::ok) .filter_map(Result::ok)
.find(|entry| entry.path().extension().map_or(false, |ext| ext == "ko")) .find(|entry| entry.path().extension().is_some_and(|ext| ext == "ko"))
.map(|entry| entry.path()) .map(|entry| entry.path())
.ok_or_else(|| anyhow!("No kernel module found"))?; .ok_or_else(|| anyhow!("No kernel module found"))?;
let output = Command::new("modinfo").arg(modfile).output()?; let output = Command::new("modinfo").arg(modfile).output()?;
@@ -97,7 +97,7 @@ pub fn get_current_kmi() -> Result<String> {
} }
fn parse_kmi_from_kernel(kernel: &PathBuf, workdir: &Path) -> Result<String> { fn parse_kmi_from_kernel(kernel: &PathBuf, workdir: &Path) -> Result<String> {
use std::fs::{copy, File}; use std::fs::{File, copy};
use std::io::{BufReader, Read}; use std::io::{BufReader, Read};
let kernel_path = workdir.join("kernel"); let kernel_path = workdir.join("kernel");
copy(kernel, &kernel_path).context("Failed to copy kernel")?; copy(kernel, &kernel_path).context("Failed to copy kernel")?;
@@ -235,7 +235,10 @@ pub fn restore(
ensure!(status.success(), "magiskboot unpack failed"); ensure!(status.success(), "magiskboot unpack failed");
let is_kernelsu_patched = is_kernelsu_patched(&magiskboot, workdir)?; let is_kernelsu_patched = is_kernelsu_patched(&magiskboot, workdir)?;
ensure!(is_kernelsu_patched, "boot image is not patched by KernelSU Next"); ensure!(
is_kernelsu_patched,
"boot image is not patched by KernelSU Next"
);
let mut new_boot = None; let mut new_boot = None;
let mut from_backup = false; let mut from_backup = false;

View File

@@ -1,4 +1,4 @@
use anyhow::{ensure, Context, Ok, Result}; use anyhow::{Context, Ok, Result, ensure};
use std::{ use std::{
path::{Path, PathBuf}, path::{Path, PathBuf},
process::Command, process::Command,

View File

@@ -4,7 +4,7 @@ use crate::defs::{
use crate::magic_mount::NodeFileType::{Directory, RegularFile, Symlink, Whiteout}; use crate::magic_mount::NodeFileType::{Directory, RegularFile, Symlink, Whiteout};
use crate::restorecon::{lgetfilecon, lsetfilecon}; use crate::restorecon::{lgetfilecon, lsetfilecon};
use crate::utils::ensure_dir_exists; use crate::utils::ensure_dir_exists;
use anyhow::{bail, Context, Result}; use anyhow::{Context, Result, bail};
use extattr::lgetxattr; use extattr::lgetxattr;
use rustix::fs::{ use rustix::fs::{
bind_mount, chmod, chown, mount, move_mount, unmount, Gid, MetadataExt, Mode, MountFlags, bind_mount, chmod, chown, mount, move_mount, unmount, Gid, MetadataExt, Mode, MountFlags,
@@ -283,7 +283,7 @@ fn do_magic_mount<P: AsRef<Path>, WP: AsRef<Path>>(
Symlink => true, Symlink => true,
Whiteout => real_path.exists(), Whiteout => real_path.exists(),
_ => { _ => {
if let Ok(metadata) = real_path.metadata() { if let Ok(metadata) = real_path.symlink_metadata() {
let file_type = NodeFileType::from_file_type(metadata.file_type()) let file_type = NodeFileType::from_file_type(metadata.file_type())
.unwrap_or(Whiteout); .unwrap_or(Whiteout);
file_type != node.file_type || file_type == Symlink file_type != node.file_type || file_type == Symlink

View File

@@ -6,7 +6,7 @@ use crate::{
sepolicy, sepolicy,
}; };
use anyhow::{anyhow, bail, ensure, Context, Result}; use anyhow::{Context, Result, anyhow, bail, ensure};
use const_format::concatcp; use const_format::concatcp;
use is_executable::is_executable; use is_executable::is_executable;
use java_properties::PropertiesIter; use java_properties::PropertiesIter;
@@ -16,7 +16,7 @@ use std::fs::{copy, rename};
use std::{ use std::{
collections::HashMap, collections::HashMap,
env::var as env_var, env::var as env_var,
fs::{remove_dir_all, remove_file, set_permissions, File, Permissions}, fs::{File, Permissions, remove_dir_all, remove_file, set_permissions},
io::Cursor, io::Cursor,
path::{Path, PathBuf}, path::{Path, PathBuf},
process::Command, process::Command,

View File

@@ -6,7 +6,7 @@ use std::path::Path;
#[cfg(any(target_os = "linux", target_os = "android"))] #[cfg(any(target_os = "linux", target_os = "android"))]
use anyhow::{Context, Ok}; use anyhow::{Context, Ok};
#[cfg(any(target_os = "linux", target_os = "android"))] #[cfg(any(target_os = "linux", target_os = "android"))]
use extattr::{lsetxattr, Flags as XattrFlags}; use extattr::{Flags as XattrFlags, lsetxattr};
pub const SYSTEM_CON: &str = "u:object_r:system_file:s0"; pub const SYSTEM_CON: &str = "u:object_r:system_file:s0";
pub const ADB_CON: &str = "u:object_r:adb_data_file:s0"; pub const ADB_CON: &str = "u:object_r:adb_data_file:s0";

View File

@@ -3,20 +3,16 @@ use derive_new::new;
use nom::{ use nom::{
branch::alt, branch::alt,
bytes::complete::{tag, take_while, take_while1, take_while_m_n}, bytes::complete::{tag, take_while, take_while1, take_while_m_n},
character::{ character::complete::{space0, space1},
complete::{space0, space1},
is_alphanumeric,
},
combinator::map, combinator::map,
sequence::Tuple, AsChar, IResult, Parser,
IResult, Parser,
}; };
use std::{ffi, path::Path, vec}; use std::{ffi, path::Path, vec};
type SeObject<'a> = Vec<&'a str>; type SeObject<'a> = Vec<&'a str>;
fn is_sepolicy_char(c: char) -> bool { fn is_sepolicy_char(c: char) -> bool {
is_alphanumeric(c as u8) || c == '_' || c == '-' c.is_alphanum() || c == '_' || c == '-'
} }
fn parse_single_word(input: &str) -> IResult<&str, &str> { fn parse_single_word(input: &str) -> IResult<&str, &str> {
@@ -173,7 +169,8 @@ impl<'a> SeObjectParser<'a> for NormalPerm<'a> {
tag("deny"), tag("deny"),
tag("auditallow"), tag("auditallow"),
tag("dontaudit"), tag("dontaudit"),
))(input)?; ))
.parse(input)?;
let (input, _) = space0(input)?; let (input, _) = space0(input)?;
let (input, source) = parse_seobj(input)?; let (input, source) = parse_seobj(input)?;
@@ -193,7 +190,8 @@ impl<'a> SeObjectParser<'a> for XPerm<'a> {
tag("allowxperm"), tag("allowxperm"),
tag("auditallowxperm"), tag("auditallowxperm"),
tag("dontauditxperm"), tag("dontauditxperm"),
))(input)?; ))
.parse(input)?;
let (input, _) = space0(input)?; let (input, _) = space0(input)?;
let (input, source) = parse_seobj(input)?; let (input, source) = parse_seobj(input)?;
@@ -215,7 +213,7 @@ impl<'a> SeObjectParser<'a> for XPerm<'a> {
impl<'a> SeObjectParser<'a> for TypeState<'a> { impl<'a> SeObjectParser<'a> for TypeState<'a> {
fn parse(input: &'a str) -> IResult<&'a str, Self> { fn parse(input: &'a str) -> IResult<&'a str, Self> {
let (input, op) = alt((tag("permissive"), tag("enforce")))(input)?; let (input, op) = alt((tag("permissive"), tag("enforce"))).parse(input)?;
let (input, _) = space1(input)?; let (input, _) = space1(input)?;
let (input, stype) = parse_seobj_no_star(input)?; let (input, stype) = parse_seobj_no_star(input)?;
@@ -243,7 +241,7 @@ impl<'a> SeObjectParser<'a> for Type<'a> {
impl<'a> SeObjectParser<'a> for TypeAttr<'a> { impl<'a> SeObjectParser<'a> for TypeAttr<'a> {
fn parse(input: &'a str) -> IResult<&'a str, Self> { fn parse(input: &'a str) -> IResult<&'a str, Self> {
let (input, _) = alt((tag("typeattribute"), tag("attradd")))(input)?; let (input, _) = alt((tag("typeattribute"), tag("attradd"))).parse(input)?;
let (input, _) = space1(input)?; let (input, _) = space1(input)?;
let (input, stype) = parse_seobj_no_star(input)?; let (input, stype) = parse_seobj_no_star(input)?;
let (input, _) = space1(input)?; let (input, _) = space1(input)?;
@@ -265,7 +263,7 @@ impl<'a> SeObjectParser<'a> for Attr<'a> {
impl<'a> SeObjectParser<'a> for TypeTransition<'a> { impl<'a> SeObjectParser<'a> for TypeTransition<'a> {
fn parse(input: &'a str) -> IResult<&'a str, Self> { fn parse(input: &'a str) -> IResult<&'a str, Self> {
let (input, _) = alt((tag("type_transition"), tag("name_transition")))(input)?; let (input, _) = alt((tag("type_transition"), tag("name_transition"))).parse(input)?;
let (input, _) = space1(input)?; let (input, _) = space1(input)?;
let (input, source) = parse_single_word(input)?; let (input, source) = parse_single_word(input)?;
let (input, _) = space1(input)?; let (input, _) = space1(input)?;
@@ -294,7 +292,7 @@ impl<'a> SeObjectParser<'a> for TypeTransition<'a> {
impl<'a> SeObjectParser<'a> for TypeChange<'a> { impl<'a> SeObjectParser<'a> for TypeChange<'a> {
fn parse(input: &'a str) -> IResult<&'a str, Self> { fn parse(input: &'a str) -> IResult<&'a str, Self> {
let (input, op) = alt((tag("type_change"), tag("type_member")))(input)?; let (input, op) = alt((tag("type_change"), tag("type_member"))).parse(input)?;
let (input, _) = space1(input)?; let (input, _) = space1(input)?;
let (input, source) = parse_single_word(input)?; let (input, source) = parse_single_word(input)?;
let (input, _) = space1(input)?; let (input, _) = space1(input)?;
@@ -337,7 +335,8 @@ impl<'a> PolicyStatement<'a> {
map(TypeTransition::parse, PolicyStatement::TypeTransition), map(TypeTransition::parse, PolicyStatement::TypeTransition),
map(TypeChange::parse, PolicyStatement::TypeChange), map(TypeChange::parse, PolicyStatement::TypeChange),
map(GenFsCon::parse, PolicyStatement::GenFsCon), map(GenFsCon::parse, PolicyStatement::GenFsCon),
))(input)?; ))
.parse(input)?;
let (input, _) = space0(input)?; let (input, _) = space0(input)?;
let (input, _) = take_while(|c| c == ';')(input)?; let (input, _) = take_while(|c| c == ';')(input)?;
let (input, _) = space0(input)?; let (input, _) = space0(input)?;

View File

@@ -14,7 +14,7 @@ use crate::{
#[cfg(any(target_os = "linux", target_os = "android"))] #[cfg(any(target_os = "linux", target_os = "android"))]
use rustix::{ use rustix::{
process::getuid, process::getuid,
thread::{set_thread_res_gid, set_thread_res_uid, Gid, Uid}, thread::{Gid, Uid, set_thread_res_gid, set_thread_res_uid},
}; };
#[cfg(any(target_os = "linux", target_os = "android"))] #[cfg(any(target_os = "linux", target_os = "android"))]
@@ -280,6 +280,6 @@ fn add_path_to_env(path: &str) -> Result<()> {
let new_path = PathBuf::from(path.trim_end_matches('/')); let new_path = PathBuf::from(path.trim_end_matches('/'));
paths.push(new_path); paths.push(new_path);
let new_path_env = env::join_paths(paths)?; let new_path_env = env::join_paths(paths)?;
env::set_var("PATH", new_path_env); unsafe { env::set_var("PATH", new_path_env) };
Ok(()) Ok(())
} }

View File

@@ -1,4 +1,4 @@
use anyhow::{bail, Context, Error, Ok, Result}; use anyhow::{Context, Error, Ok, Result, bail};
use std::{ use std::{
fs::{create_dir_all, remove_file, write, File, OpenOptions}, fs::{create_dir_all, remove_file, write, File, OpenOptions},
io::{ io::{
@@ -11,7 +11,7 @@ use std::{
use crate::{assets, boot_patch, defs, ksucalls, module, restorecon}; use crate::{assets, boot_patch, defs, ksucalls, module, restorecon};
#[allow(unused_imports)] #[allow(unused_imports)]
use std::fs::{set_permissions, Permissions}; use std::fs::{Permissions, set_permissions};
#[cfg(unix)] #[cfg(unix)]
use std::os::unix::prelude::PermissionsExt; use std::os::unix::prelude::PermissionsExt;
@@ -20,7 +20,7 @@ use std::path::PathBuf;
#[cfg(any(target_os = "linux", target_os = "android"))] #[cfg(any(target_os = "linux", target_os = "android"))]
use rustix::{ use rustix::{
process, process,
thread::{move_into_link_name_space, unshare, LinkNameSpaceType, UnshareFlags}, thread::{LinkNameSpaceType, move_into_link_name_space},
}; };
pub fn ensure_clean_dir(dir: impl AsRef<Path>) -> Result<()> { pub fn ensure_clean_dir(dir: impl AsRef<Path>) -> Result<()> {
@@ -125,7 +125,7 @@ pub fn get_zip_uncompressed_size(zip_path: &str) -> Result<u64> {
pub fn switch_mnt_ns(pid: i32) -> Result<()> { pub fn switch_mnt_ns(pid: i32) -> Result<()> {
use rustix::{ use rustix::{
fd::AsFd, fd::AsFd,
fs::{open, Mode, OFlags}, fs::{Mode, OFlags, open},
}; };
let path = format!("/proc/{pid}/ns/mnt"); let path = format!("/proc/{pid}/ns/mnt");
let fd = open(path, OFlags::RDONLY, Mode::from_raw_mode(0))?; let fd = open(path, OFlags::RDONLY, Mode::from_raw_mode(0))?;

View File

@@ -131,9 +131,9 @@ dependencies = [
[[package]] [[package]]
name = "anyhow" name = "anyhow"
version = "1.0.95" version = "1.0.96"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "34ac096ce696dc2fcabef30516bb13c0a68a11d30131d3df6f04711467681b04" checksum = "6b964d184e89d9b6b67dd2715bc8e74cf3107fb2b529990c90cf517326150bf4"
[[package]] [[package]]
name = "arbitrary" name = "arbitrary"
@@ -146,9 +146,9 @@ dependencies = [
[[package]] [[package]]
name = "async-trait" name = "async-trait"
version = "0.1.85" version = "0.1.86"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3f934833b4b7233644e5848f235df3f57ed8c80f1528a26c3dfa13d2147fa056" checksum = "644dd749086bf3771a2fbc5f256fdb982d53f011c7d5d560304eafeecebce79d"
dependencies = [ dependencies = [
"proc-macro2", "proc-macro2",
"quote", "quote",
@@ -184,9 +184,9 @@ checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a"
[[package]] [[package]]
name = "bitflags" name = "bitflags"
version = "2.6.0" version = "2.8.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b048fb63fd8b5923fc5aa7b340d8e156aec7ec02f0c78fa8a6ddc2613f6f71de" checksum = "8f68f53c83ab957f72c32642f3868eec03eb974d1fb82e453128456482613d36"
[[package]] [[package]]
name = "block-buffer" name = "block-buffer"
@@ -199,9 +199,9 @@ dependencies = [
[[package]] [[package]]
name = "bumpalo" name = "bumpalo"
version = "3.16.0" version = "3.17.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "79296716171880943b8470b5f8d03aa55eb2e645a4874bdbb28adb49162e012c" checksum = "1628fb46dfa0b37568d12e5edd512553eccf6a22a78e8bde00bb4aed84d5bdbf"
[[package]] [[package]]
name = "byteorder" name = "byteorder"
@@ -211,15 +211,15 @@ checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b"
[[package]] [[package]]
name = "bytes" name = "bytes"
version = "1.9.0" version = "1.10.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "325918d6fe32f23b19878fe4b34794ae41fc19ddbe53b10571a4874d44ffd39b" checksum = "f61dac84819c6588b558454b194026eb1f09c293b9036ae9b159e74e73ab6cf9"
[[package]] [[package]]
name = "cc" name = "cc"
version = "1.2.10" version = "1.2.15"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "13208fcbb66eaeffe09b99fffbe1af420f00a7b35aa99ad683dfc1aa76145229" checksum = "c736e259eea577f443d5c86c304f9f4ae0295c43f3ba05c21f1d66b5f06001af"
dependencies = [ dependencies = [
"shlex", "shlex",
] ]
@@ -252,9 +252,9 @@ dependencies = [
[[package]] [[package]]
name = "clap" name = "clap"
version = "4.5.27" version = "4.5.31"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "769b0145982b4b48713e01ec42d61614425f27b7058bda7180a3a41f30104796" checksum = "027bb0d98429ae334a8698531da7077bdf906419543a35a55c2cb1b66437d767"
dependencies = [ dependencies = [
"clap_builder", "clap_builder",
"clap_derive", "clap_derive",
@@ -262,9 +262,9 @@ dependencies = [
[[package]] [[package]]
name = "clap_builder" name = "clap_builder"
version = "4.5.27" version = "4.5.31"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1b26884eb4b57140e4d2d93652abfa49498b938b3c9179f9fc487b0acc3edad7" checksum = "5589e0cba072e0f3d23791efac0fd8627b49c829c196a492e88168e6a669d863"
dependencies = [ dependencies = [
"anstream", "anstream",
"anstyle", "anstyle",
@@ -274,9 +274,9 @@ dependencies = [
[[package]] [[package]]
name = "clap_derive" name = "clap_derive"
version = "4.5.24" version = "4.5.28"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "54b755194d6389280185988721fffba69495eed5ee9feeee9a599b53db80318c" checksum = "bf4ced95c6f4a675af3da73304b9ac4ed991640c36374e4b46795c49e17cf1ed"
dependencies = [ dependencies = [
"heck", "heck",
"proc-macro2", "proc-macro2",
@@ -333,9 +333,9 @@ dependencies = [
[[package]] [[package]]
name = "cpufeatures" name = "cpufeatures"
version = "0.2.16" version = "0.2.17"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "16b80225097f2e5ae4e7179dd2266824648f3e2f49d9134d584b76389d31c4c3" checksum = "59ed5838eebb26a2bb2e58f6d5b5316989ae9d08bab10e0e6d103e656d1b0280"
dependencies = [ dependencies = [
"libc", "libc",
] ]
@@ -496,9 +496,9 @@ dependencies = [
[[package]] [[package]]
name = "either" name = "either"
version = "1.13.0" version = "1.14.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "60b1af1c220855b6ceac025d3f6ecdd2b7c4894bfe9cd9bda4fbb4bc7c0d4cf0" checksum = "b7914353092ddf589ad78f25c5c1c21b7f80b0ff8621e7c814c3485b5306da9d"
[[package]] [[package]]
name = "encoding_rs" name = "encoding_rs"
@@ -536,9 +536,9 @@ dependencies = [
[[package]] [[package]]
name = "equivalent" name = "equivalent"
version = "1.0.1" version = "1.0.2"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f"
[[package]] [[package]]
name = "errno" name = "errno"
@@ -558,7 +558,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "33d852cb9b869c2a9b3df2f71a3074817f01e1844f839a144f5fcef059a4eb5d" checksum = "33d852cb9b869c2a9b3df2f71a3074817f01e1844f839a144f5fcef059a4eb5d"
dependencies = [ dependencies = [
"libc", "libc",
"windows-sys 0.52.0", "windows-sys 0.59.0",
] ]
[[package]] [[package]]
@@ -590,14 +590,24 @@ checksum = "37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be"
[[package]] [[package]]
name = "flate2" name = "flate2"
version = "1.0.35" version = "1.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c936bfdafb507ebbf50b8074c54fa31c5be9a1e7e5f467dd659697041407d07c" checksum = "11faaf5a5236997af9848be0bef4db95824b1d534ebc64d0f0c6cf3e67bd38dc"
dependencies = [ dependencies = [
"crc32fast", "crc32fast",
"miniz_oxide", "miniz_oxide",
] ]
[[package]]
name = "fs4"
version = "0.13.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "be058769cf1633370c3d0dac6bb9b223b8f18900cf808abadf7843192e706238"
dependencies = [
"rustix 0.38.44",
"windows-sys 0.59.0",
]
[[package]] [[package]]
name = "generic-array" name = "generic-array"
version = "0.14.7" version = "0.14.7"
@@ -619,13 +629,14 @@ dependencies = [
[[package]] [[package]]
name = "getrandom" name = "getrandom"
version = "0.2.15" version = "0.3.1"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c4567c8db10ae91089c99af84c68c38da3ec2f087c3f82960bcdbf3656b6f4d7" checksum = "43a49c392881ce6d5c3b8cb70f98717b7c07aabbdff06687b9030dbfbe2725f8"
dependencies = [ dependencies = [
"cfg-if 1.0.0", "cfg-if 1.0.0",
"libc", "libc",
"wasi", "wasi",
"windows-targets",
] ]
[[package]] [[package]]
@@ -773,9 +784,9 @@ dependencies = [
[[package]] [[package]]
name = "js-sys" name = "js-sys"
version = "0.3.76" version = "0.3.77"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6717b6b5b077764fb5966237269cb3c64edddde4b14ce42647430a78ced9e7b7" checksum = "1cfaf33c695fc6e08064efbc1f72ec937429614f25eef83af942d0e227c3a28f"
dependencies = [ dependencies = [
"once_cell", "once_cell",
"wasm-bindgen", "wasm-bindgen",
@@ -805,6 +816,7 @@ dependencies = [
"encoding_rs", "encoding_rs",
"env_logger", "env_logger",
"extattr", "extattr",
"fs4",
"getopts", "getopts",
"hole-punch", "hole-punch",
"humansize", "humansize",
@@ -817,10 +829,8 @@ dependencies = [
"nom", "nom",
"procfs", "procfs",
"regex-lite", "regex-lite",
"retry",
"rust-embed", "rust-embed",
"rustix 0.38.34", "rustix 0.38.34",
"serde",
"serde_json", "serde_json",
"sha1", "sha1",
"sha256", "sha256",
@@ -838,9 +848,9 @@ checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe"
[[package]] [[package]]
name = "libc" name = "libc"
version = "0.2.169" version = "0.2.170"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b5aba8db14291edd000dfcc4d620c7ebfb122c613afb886ca8803fa4e128a20a" checksum = "875b3680cb2f8f71bdcf9a30f38d48282f5d3c95cbf9b3fa57269bb5d5c06828"
[[package]] [[package]]
name = "libflate" name = "libflate"
@@ -886,9 +896,9 @@ checksum = "9374ef4228402d4b7e403e5838cb880d9ee663314b0a900d5a6aabf0c213552e"
[[package]] [[package]]
name = "log" name = "log"
version = "0.4.25" version = "0.4.26"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "04cbf5b083de1c7e0222a7a51dbfdba1cbe1c6ab0b15e29fff3f6c077fd9cd9f" checksum = "30bde2b3dc3671ae49d8e2e9f044c7c005836e7a023ee57cffa25ab82764bb9e"
[[package]] [[package]]
name = "loopdev" name = "loopdev"
@@ -925,29 +935,22 @@ dependencies = [
"winapi", "winapi",
] ]
[[package]]
name = "minimal-lexical"
version = "0.2.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a"
[[package]] [[package]]
name = "miniz_oxide" name = "miniz_oxide"
version = "0.8.3" version = "0.8.5"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b8402cab7aefae129c6977bb0ff1b8fd9a04eb5b51efc50a70bea51cda0c7924" checksum = "8e3e04debbb59698c15bacbb6d93584a8c0ca9cc3213cb423d31f760d8843ce5"
dependencies = [ dependencies = [
"adler2", "adler2",
] ]
[[package]] [[package]]
name = "nom" name = "nom"
version = "7.1.3" version = "8.0.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d273983c5a657a70a3e8f2a01329822f3b8c8172b73826411a55751e404a0a4a" checksum = "df9761775871bdef83bee530e60050f7e54b1105350d6884eb0fb4f46c2f9405"
dependencies = [ dependencies = [
"memchr", "memchr",
"minimal-lexical",
] ]
[[package]] [[package]]
@@ -976,9 +979,9 @@ dependencies = [
[[package]] [[package]]
name = "once_cell" name = "once_cell"
version = "1.20.2" version = "1.20.3"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1261fe7e33c73b354eab43b1273a57c8f967d0391e80353e51f764ac02cf6775" checksum = "945462a4b81e43c4e3ba96bd7b49d834c6f61198356aa858733bc4acf3cbe62e"
[[package]] [[package]]
name = "pin-project-lite" name = "pin-project-lite"
@@ -992,15 +995,6 @@ version = "0.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391"
[[package]]
name = "ppv-lite86"
version = "0.2.20"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "77957b295656769bb8ad2b6a6b09d897d94f05c41b069aede1fcdaa675eaea04"
dependencies = [
"zerocopy",
]
[[package]] [[package]]
name = "proc-macro2" name = "proc-macro2"
version = "1.0.93" version = "1.0.93"
@@ -1016,12 +1010,12 @@ version = "0.17.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "cc5b72d8145275d844d4b5f6d4e1eef00c8cd889edb6035c21675d1bb1f45c9f" checksum = "cc5b72d8145275d844d4b5f6d4e1eef00c8cd889edb6035c21675d1bb1f45c9f"
dependencies = [ dependencies = [
"bitflags 2.6.0", "bitflags 2.8.0",
"chrono", "chrono",
"flate2", "flate2",
"hex", "hex",
"procfs-core", "procfs-core",
"rustix 0.38.42", "rustix 0.38.44",
] ]
[[package]] [[package]]
@@ -1030,7 +1024,7 @@ version = "0.17.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "239df02d8349b06fc07398a3a1697b06418223b1c7725085e801e7c0fc6a12ec" checksum = "239df02d8349b06fc07398a3a1697b06418223b1c7725085e801e7c0fc6a12ec"
dependencies = [ dependencies = [
"bitflags 2.6.0", "bitflags 2.8.0",
"chrono", "chrono",
"hex", "hex",
] ]
@@ -1044,36 +1038,6 @@ dependencies = [
"proc-macro2", "proc-macro2",
] ]
[[package]]
name = "rand"
version = "0.8.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404"
dependencies = [
"libc",
"rand_chacha",
"rand_core",
]
[[package]]
name = "rand_chacha"
version = "0.3.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88"
dependencies = [
"ppv-lite86",
"rand_core",
]
[[package]]
name = "rand_core"
version = "0.6.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c"
dependencies = [
"getrandom",
]
[[package]] [[package]]
name = "rayon" name = "rayon"
version = "1.10.0" version = "1.10.0"
@@ -1100,15 +1064,6 @@ version = "0.1.6"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "53a49587ad06b26609c52e423de037e7f57f20d53535d66e08c695f347df952a" checksum = "53a49587ad06b26609c52e423de037e7f57f20d53535d66e08c695f347df952a"
[[package]]
name = "retry"
version = "2.0.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9166d72162de3575f950507683fac47e30f6f2c3836b71b7fbc61aa517c9c5f4"
dependencies = [
"rand",
]
[[package]] [[package]]
name = "rle-decode-fast" name = "rle-decode-fast"
version = "1.0.3" version = "1.0.3"
@@ -1161,7 +1116,7 @@ name = "rustix"
version = "0.38.34" version = "0.38.34"
source = "git+https://github.com/Kernel-SU/rustix.git?branch=main#4a53fbc7cb7a07cabe87125cc21dbc27db316259" source = "git+https://github.com/Kernel-SU/rustix.git?branch=main#4a53fbc7cb7a07cabe87125cc21dbc27db316259"
dependencies = [ dependencies = [
"bitflags 2.6.0", "bitflags 2.8.0",
"errno 0.3.10", "errno 0.3.10",
"itoa", "itoa",
"libc", "libc",
@@ -1172,22 +1127,28 @@ dependencies = [
[[package]] [[package]]
name = "rustix" name = "rustix"
version = "0.38.42" version = "0.38.44"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f93dc38ecbab2eb790ff964bb77fa94faf256fd3e73285fd7ba0903b76bedb85" checksum = "fdb5bc1ae2baa591800df16c9ca78619bf65c0488b41b96ccec5d11220d8c154"
dependencies = [ dependencies = [
"bitflags 2.6.0", "bitflags 2.8.0",
"errno 0.3.10", "errno 0.3.10",
"libc", "libc",
"linux-raw-sys", "linux-raw-sys",
"windows-sys 0.52.0", "windows-sys 0.59.0",
] ]
[[package]] [[package]]
name = "ryu" name = "rustversion"
version = "1.0.18" version = "1.0.19"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f3cb5ba0dc43242ce17de99c180e96db90b235b8a9fdc9543c96d2209116bd9f" checksum = "f7c45b9784283f1b2e7fb61b42047c2fd678ef0960d4f6f1eba131594cc369d4"
[[package]]
name = "ryu"
version = "1.0.19"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6ea1a2d0a644769cc99faa24c3ad26b379b786fe7c36fd3c546254801650e6dd"
[[package]] [[package]]
name = "same-file" name = "same-file"
@@ -1200,18 +1161,18 @@ dependencies = [
[[package]] [[package]]
name = "serde" name = "serde"
version = "1.0.217" version = "1.0.218"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "02fc4265df13d6fa1d00ecff087228cc0a2b5f3c0e87e258d8b94a156e984c70" checksum = "e8dfc9d19bdbf6d17e22319da49161d5d0108e4188e8b680aef6299eed22df60"
dependencies = [ dependencies = [
"serde_derive", "serde_derive",
] ]
[[package]] [[package]]
name = "serde_derive" name = "serde_derive"
version = "1.0.217" version = "1.0.218"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5a9bf7cf98d04a2b28aead066b7496853d4779c9cc183c440dbac457641e19a0" checksum = "f09503e191f4e797cb8aac08e9a4a4695c5edf6a2e70e376d961ddd5c969f82b"
dependencies = [ dependencies = [
"proc-macro2", "proc-macro2",
"quote", "quote",
@@ -1220,9 +1181,9 @@ dependencies = [
[[package]] [[package]]
name = "serde_json" name = "serde_json"
version = "1.0.137" version = "1.0.139"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "930cfb6e6abf99298aaad7d29abbef7a9999a9a8806a40088f55f0dcec03146b" checksum = "44f86c3acccc9c65b153fe1b85a3be07fe5515274ec9f0653b4a0875731c72a6"
dependencies = [ dependencies = [
"itoa", "itoa",
"memchr", "memchr",
@@ -1285,9 +1246,9 @@ checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f"
[[package]] [[package]]
name = "syn" name = "syn"
version = "2.0.96" version = "2.0.98"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d5d0adab1ae378d7f53bdebc67a39f1f151407ef230f0ce2883572f5d8985c80" checksum = "36147f1a48ae0ec2b5b3bc5b537d267457555a10dc06f3dbc8cb11ba3006d3b1"
dependencies = [ dependencies = [
"proc-macro2", "proc-macro2",
"quote", "quote",
@@ -1296,16 +1257,16 @@ dependencies = [
[[package]] [[package]]
name = "tempfile" name = "tempfile"
version = "3.15.0" version = "3.17.1"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9a8a559c81686f576e8cd0290cd2a24a2a9ad80c98b3478856500fcbd7acd704" checksum = "22e5a0acb1f3f55f65cc4a866c361b2fb2a0ff6366785ae6fbb5f85df07ba230"
dependencies = [ dependencies = [
"cfg-if 1.0.0", "cfg-if 1.0.0",
"fastrand", "fastrand",
"getrandom", "getrandom",
"once_cell", "once_cell",
"rustix 0.38.42", "rustix 0.38.44",
"windows-sys 0.52.0", "windows-sys 0.59.0",
] ]
[[package]] [[package]]
@@ -1319,11 +1280,11 @@ dependencies = [
[[package]] [[package]]
name = "thiserror" name = "thiserror"
version = "2.0.9" version = "2.0.11"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f072643fd0190df67a8bab670c20ef5d8737177d6ac6b2e9a236cb096206b2cc" checksum = "d452f284b73e6d76dd36758a0c8684b1d5be31f92b89d07fd5822175732206fc"
dependencies = [ dependencies = [
"thiserror-impl 2.0.9", "thiserror-impl 2.0.11",
] ]
[[package]] [[package]]
@@ -1339,9 +1300,9 @@ dependencies = [
[[package]] [[package]]
name = "thiserror-impl" name = "thiserror-impl"
version = "2.0.9" version = "2.0.11"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7b50fa271071aae2e6ee85f842e2e28ba8cd2c5fb67f11fcb1fd70b276f9e7d4" checksum = "26afc1baea8a989337eeb52b6e72a039780ce45c3edfcc9c5b9d112feeb173c2"
dependencies = [ dependencies = [
"proc-macro2", "proc-macro2",
"quote", "quote",
@@ -1380,15 +1341,15 @@ dependencies = [
[[package]] [[package]]
name = "typenum" name = "typenum"
version = "1.17.0" version = "1.18.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825" checksum = "1dccffe3ce07af9386bfd29e80c0ab1a8205a2fc34e4bcd40364df902cfa8f3f"
[[package]] [[package]]
name = "unicode-ident" name = "unicode-ident"
version = "1.0.14" version = "1.0.17"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "adb9e6ca4f869e1180728b7950e35922a7fc6397f7b641499e8f3ef06e50dc83" checksum = "00e2473a93778eb0bad35909dff6a10d28e63f792f16ed15e404fca9d5eeedbe"
[[package]] [[package]]
name = "unicode-width" name = "unicode-width"
@@ -1426,26 +1387,30 @@ dependencies = [
[[package]] [[package]]
name = "wasi" name = "wasi"
version = "0.11.0+wasi-snapshot-preview1" version = "0.13.3+wasi-0.2.2"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" checksum = "26816d2e1a4a36a2940b96c5296ce403917633dff8f3440e9b236ed6f6bacad2"
dependencies = [
"wit-bindgen-rt",
]
[[package]] [[package]]
name = "wasm-bindgen" name = "wasm-bindgen"
version = "0.2.99" version = "0.2.100"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a474f6281d1d70c17ae7aa6a613c87fce69a127e2624002df63dcb39d6cf6396" checksum = "1edc8929d7499fc4e8f0be2262a241556cfc54a0bea223790e71446f2aab1ef5"
dependencies = [ dependencies = [
"cfg-if 1.0.0", "cfg-if 1.0.0",
"once_cell", "once_cell",
"rustversion",
"wasm-bindgen-macro", "wasm-bindgen-macro",
] ]
[[package]] [[package]]
name = "wasm-bindgen-backend" name = "wasm-bindgen-backend"
version = "0.2.99" version = "0.2.100"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5f89bb38646b4f81674e8f5c3fb81b562be1fd936d84320f3264486418519c79" checksum = "2f0a0651a5c2bc21487bde11ee802ccaf4c51935d0d3d42a6101f98161700bc6"
dependencies = [ dependencies = [
"bumpalo", "bumpalo",
"log", "log",
@@ -1457,9 +1422,9 @@ dependencies = [
[[package]] [[package]]
name = "wasm-bindgen-macro" name = "wasm-bindgen-macro"
version = "0.2.99" version = "0.2.100"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2cc6181fd9a7492eef6fef1f33961e3695e4579b9872a6f7c83aee556666d4fe" checksum = "7fe63fc6d09ed3792bd0897b314f53de8e16568c2b3f7982f468c0bf9bd0b407"
dependencies = [ dependencies = [
"quote", "quote",
"wasm-bindgen-macro-support", "wasm-bindgen-macro-support",
@@ -1467,9 +1432,9 @@ dependencies = [
[[package]] [[package]]
name = "wasm-bindgen-macro-support" name = "wasm-bindgen-macro-support"
version = "0.2.99" version = "0.2.100"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "30d7a95b763d3c45903ed6c81f156801839e5ee968bb07e534c44df0fcd330c2" checksum = "8ae87ea40c9f689fc23f209965b6fb8a99ad69aeeb0231408be24920604395de"
dependencies = [ dependencies = [
"proc-macro2", "proc-macro2",
"quote", "quote",
@@ -1480,19 +1445,22 @@ dependencies = [
[[package]] [[package]]
name = "wasm-bindgen-shared" name = "wasm-bindgen-shared"
version = "0.2.99" version = "0.2.100"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "943aab3fdaaa029a6e0271b35ea10b72b943135afe9bffca82384098ad0e06a6" checksum = "1a05d73b933a847d6cccdda8f838a22ff101ad9bf93e33684f39c1f5f0eece3d"
dependencies = [
"unicode-ident",
]
[[package]] [[package]]
name = "which" name = "which"
version = "7.0.1" version = "7.0.2"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "fb4a9e33648339dc1642b0e36e21b3385e6148e289226f657c809dee59df5028" checksum = "2774c861e1f072b3aadc02f8ba886c26ad6321567ecc294c935434cad06f1283"
dependencies = [ dependencies = [
"either", "either",
"env_home", "env_home",
"rustix 0.38.42", "rustix 0.38.44",
"winsafe", "winsafe",
] ]
@@ -1518,7 +1486,7 @@ version = "0.1.9"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "cf221c93e13a30d793f7645a0e7762c55d169dbb0a49671918a2319d289b10bb" checksum = "cf221c93e13a30d793f7645a0e7762c55d169dbb0a49671918a2319d289b10bb"
dependencies = [ dependencies = [
"windows-sys 0.52.0", "windows-sys 0.59.0",
] ]
[[package]] [[package]]
@@ -1624,13 +1592,21 @@ version = "0.0.19"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d135d17ab770252ad95e9a872d365cf3090e3be864a34ab46f48555993efc904" checksum = "d135d17ab770252ad95e9a872d365cf3090e3be864a34ab46f48555993efc904"
[[package]]
name = "wit-bindgen-rt"
version = "0.33.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3268f3d866458b787f390cf61f4bbb563b922d091359f9608842999eaee3943c"
dependencies = [
"bitflags 2.8.0",
]
[[package]] [[package]]
name = "zerocopy" name = "zerocopy"
version = "0.7.35" version = "0.7.35"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1b9b4fd18abc82b8136838da5d50bae7bdea537c574d8dc1a34ed098d6c166f0" checksum = "1b9b4fd18abc82b8136838da5d50bae7bdea537c574d8dc1a34ed098d6c166f0"
dependencies = [ dependencies = [
"byteorder",
"zerocopy-derive", "zerocopy-derive",
] ]
@@ -1660,7 +1636,7 @@ dependencies = [
"indexmap", "indexmap",
"lzma-rs", "lzma-rs",
"memchr", "memchr",
"thiserror 2.0.9", "thiserror 2.0.11",
"time", "time",
"zopfli", "zopfli",
] ]

View File

@@ -1,7 +1,7 @@
[package] [package]
name = "ksud" name = "ksud"
version = "0.1.0" version = "0.1.0"
edition = "2021" edition = "2024"
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
@@ -20,16 +20,14 @@ zip-extensions = { version = "0.8", features = [
java-properties = { git = "https://github.com/Kernel-SU/java-properties.git", branch = "master", default-features = false } java-properties = { git = "https://github.com/Kernel-SU/java-properties.git", branch = "master", default-features = false }
log = "0.4" log = "0.4"
env_logger = { version = "0.11", default-features = false } env_logger = { version = "0.11", default-features = false }
serde = { version = "1" }
serde_json = "1" serde_json = "1"
encoding_rs = "0.8" encoding_rs = "0.8"
retry = "2"
humansize = "2" humansize = "2"
libc = "0.2" libc = "0.2"
extattr = "1" extattr = "1"
jwalk = "0.8" jwalk = "0.8"
is_executable = "1" is_executable = "1"
nom = "7" nom = "8"
derive-new = "0.7" derive-new = "0.7"
rust-embed = { version = "8", features = [ rust-embed = { version = "8", features = [
"debug-embed", "debug-embed",
@@ -43,6 +41,7 @@ tempfile = "3"
chrono = "0.4" chrono = "0.4"
hole-punch = { git = "https://github.com/tiann/hole-punch" } hole-punch = { git = "https://github.com/tiann/hole-punch" }
regex-lite = "0.1" regex-lite = "0.1"
fs4 = "0.13"
[target.'cfg(any(target_os = "android", target_os = "linux"))'.dependencies] [target.'cfg(any(target_os = "android", target_os = "linux"))'.dependencies]
rustix = { git = "https://github.com/Kernel-SU/rustix.git", branch = "main", features = [ rustix = { git = "https://github.com/Kernel-SU/rustix.git", branch = "main", features = [
@@ -60,4 +59,4 @@ android_logger = { version = "0.14", default-features = false }
strip = true strip = true
opt-level = "z" opt-level = "z"
lto = true lto = true
codegen-units = 1 codegen-units = 1

View File

@@ -1,4 +1,4 @@
use anyhow::{ensure, Result}; use anyhow::{Result, ensure};
use std::io::{Read, Seek, SeekFrom}; use std::io::{Read, Seek, SeekFrom};
pub fn get_apk_signature(apk: &str) -> Result<(u32, String)> { pub fn get_apk_signature(apk: &str) -> Result<(u32, String)> {

View File

@@ -12,13 +12,6 @@ pub const BOOTCTL_PATH: &str = concatcp!(BINARY_DIR, "bootctl");
#[allow(dead_code)] #[allow(dead_code)]
pub const SUSFSD_PATH: &str = concatcp!(BINARY_DIR, "susfsd"); pub const SUSFSD_PATH: &str = concatcp!(BINARY_DIR, "susfsd");
#[cfg(all(target_arch = "x86_64", target_os = "android"))]
#[derive(RustEmbed)]
#[folder = "bin/x86_64"]
struct Asset;
// IF NOT x86_64 ANDROID, ie. macos, linux, windows, always use aarch64
#[cfg(not(all(target_arch = "x86_64", target_os = "android")))]
#[derive(RustEmbed)] #[derive(RustEmbed)]
#[folder = "bin/aarch64"] #[folder = "bin/aarch64"]
struct Asset; struct Asset;

View File

@@ -5,11 +5,11 @@ use std::path::PathBuf;
use std::process::Command; use std::process::Command;
use std::process::Stdio; use std::process::Stdio;
use anyhow::Context;
use anyhow::Result;
use anyhow::anyhow; use anyhow::anyhow;
use anyhow::bail; use anyhow::bail;
use anyhow::ensure; use anyhow::ensure;
use anyhow::Context;
use anyhow::Result;
use regex_lite::Regex; use regex_lite::Regex;
use which::which; use which::which;
@@ -74,7 +74,7 @@ fn parse_kmi_from_modules() -> Result<String> {
// find a *.ko in /vendor/lib/modules // find a *.ko in /vendor/lib/modules
let modfile = std::fs::read_dir("/vendor/lib/modules")? let modfile = std::fs::read_dir("/vendor/lib/modules")?
.filter_map(Result::ok) .filter_map(Result::ok)
.find(|entry| entry.path().extension().map_or(false, |ext| ext == "ko")) .find(|entry| entry.path().extension().is_some_and(|ext| ext == "ko"))
.map(|entry| entry.path()) .map(|entry| entry.path())
.ok_or_else(|| anyhow!("No kernel module found"))?; .ok_or_else(|| anyhow!("No kernel module found"))?;
let output = Command::new("modinfo").arg(modfile).output()?; let output = Command::new("modinfo").arg(modfile).output()?;
@@ -97,7 +97,7 @@ pub fn get_current_kmi() -> Result<String> {
} }
fn parse_kmi_from_kernel(kernel: &PathBuf, workdir: &Path) -> Result<String> { fn parse_kmi_from_kernel(kernel: &PathBuf, workdir: &Path) -> Result<String> {
use std::fs::{copy, File}; use std::fs::{File, copy};
use std::io::{BufReader, Read}; use std::io::{BufReader, Read};
let kernel_path = workdir.join("kernel"); let kernel_path = workdir.join("kernel");
copy(kernel, &kernel_path).context("Failed to copy kernel")?; copy(kernel, &kernel_path).context("Failed to copy kernel")?;
@@ -235,7 +235,10 @@ pub fn restore(
ensure!(status.success(), "magiskboot unpack failed"); ensure!(status.success(), "magiskboot unpack failed");
let is_kernelsu_patched = is_kernelsu_patched(&magiskboot, workdir)?; let is_kernelsu_patched = is_kernelsu_patched(&magiskboot, workdir)?;
ensure!(is_kernelsu_patched, "boot image is not patched by KernelSU Next"); ensure!(
is_kernelsu_patched,
"boot image is not patched by KernelSU Next"
);
let mut new_boot = None; let mut new_boot = None;
let mut from_backup = false; let mut from_backup = false;

View File

@@ -1,4 +1,4 @@
use anyhow::{ensure, Context, Ok, Result}; use anyhow::{Context, Ok, Result, ensure};
use std::{ use std::{
path::{Path, PathBuf}, path::{Path, PathBuf},
process::Command, process::Command,

View File

@@ -1,4 +1,4 @@
use anyhow::{bail, Context, Result}; use anyhow::{Context, Result, bail};
use log::{info, warn}; use log::{info, warn};
use std::{collections::HashMap, path::Path}; use std::{collections::HashMap, path::Path};

View File

@@ -6,7 +6,7 @@ use crate::{
sepolicy, utils, sepolicy, utils,
}; };
use anyhow::{anyhow, bail, ensure, Context, Result}; use anyhow::{Context, Result, anyhow, bail, ensure};
use const_format::concatcp; use const_format::concatcp;
use is_executable::is_executable; use is_executable::is_executable;
use java_properties::PropertiesIter; use java_properties::PropertiesIter;
@@ -16,7 +16,7 @@ use std::fs::OpenOptions;
use std::{ use std::{
collections::HashMap, collections::HashMap,
env::var as env_var, env::var as env_var,
fs::{remove_dir_all, remove_file, set_permissions, File, Permissions}, fs::{File, Permissions, remove_dir_all, remove_file, set_permissions},
io::Cursor, io::Cursor,
path::{Path, PathBuf}, path::{Path, PathBuf},
process::{Command, Stdio}, process::{Command, Stdio},
@@ -281,19 +281,31 @@ pub fn prune_modules() -> Result<()> {
Ok(()) Ok(())
})?; })?;
// collect remaining modules, if none, remove img
let remaining_modules: Vec<_> = std::fs::read_dir(defs::MODULE_DIR)?
.filter_map(|entry| entry.ok())
.filter(|entry| entry.path().join("module.prop").exists())
.collect();
if remaining_modules.is_empty() {
info!("no remaining modules, deleting image files.");
std::fs::remove_file(defs::MODULE_IMG).ok();
std::fs::remove_file(defs::MODULE_UPDATE_IMG).ok();
}
Ok(()) Ok(())
} }
fn create_module_image(image: &str, image_size: u64, journal_size: u64) -> Result<()> { fn create_module_image(image: &str, image_size: u64) -> Result<()> {
File::create(image) File::create(image)
.context("Failed to create ext4 image file")? .context("Failed to create ext4 image file")?
.set_len(image_size) .set_len(image_size)
.context("Failed to truncate ext4 image")?; .context("Failed to truncate ext4 image")?;
// format the img to ext4 filesystem // format the img to ext4 filesystem without journal
let result = Command::new("mkfs.ext4") let result = Command::new("mkfs.ext4")
.arg("-J") .arg("-O")
.arg(format!("size={journal_size}")) .arg("^has_journal")
.arg(image) .arg(image)
.stdout(Stdio::piped()) .stdout(Stdio::piped())
.output()?; .output()?;
@@ -364,13 +376,13 @@ fn _install_module(zip: &str) -> Result<()> {
humansize::format_size(zip_uncompressed_size, humansize::DECIMAL) humansize::format_size(zip_uncompressed_size, humansize::DECIMAL)
); );
let sparse_image_size = 1 << 34; // 16GB let data_vfs = fs4::statvfs("/data").with_context(|| "Failed to stat /data".to_string())?;
let journal_size = 8; // 8M let sparse_image_size = data_vfs.total_space();
if !modules_img_exist && !modules_update_img_exist { if !modules_img_exist && !modules_update_img_exist {
// if no modules and modules_update, it is brand new installation, we should create a new img // if no modules and modules_update, it is brand new installation, we should create a new img
// create a tmp module img and mount it to modules_update // create a tmp module img and mount it to modules_update
info!("Creating brand new module image"); info!("Creating brand new module image");
create_module_image(tmp_module_img, sparse_image_size, journal_size)?; create_module_image(tmp_module_img, sparse_image_size)?;
} else if modules_update_img_exist { } else if modules_update_img_exist {
// modules_update.img exists, we should use it as tmp img // modules_update.img exists, we should use it as tmp img
info!("Using existing modules_update.img as tmp image"); info!("Using existing modules_update.img as tmp image");
@@ -392,7 +404,7 @@ fn _install_module(zip: &str) -> Result<()> {
// legacy image, it's block size is 1024 with unlimited journal size // legacy image, it's block size is 1024 with unlimited journal size
if blksize == 1024 { if blksize == 1024 {
println!("- Legacy image, migrating to new format, please be patient..."); println!("- Legacy image, migrating to new format, please be patient...");
create_module_image(tmp_module_img, sparse_image_size, journal_size)?; create_module_image(tmp_module_img, sparse_image_size)?;
let _dontdrop = let _dontdrop =
mount::AutoMountExt4::try_new(tmp_module_img, module_update_tmp_dir, true) mount::AutoMountExt4::try_new(tmp_module_img, module_update_tmp_dir, true)
.with_context(|| format!("Failed to mount {tmp_module_img}"))?; .with_context(|| format!("Failed to mount {tmp_module_img}"))?;
@@ -459,6 +471,7 @@ fn _install_module(zip: &str) -> Result<()> {
utils::copy_sparse_file(tmp_module_img, defs::MODULE_UPDATE_IMG, true) utils::copy_sparse_file(tmp_module_img, defs::MODULE_UPDATE_IMG, true)
.with_context(|| "Failed to copy image.".to_string())?; .with_context(|| "Failed to copy image.".to_string())?;
let _ = std::fs::remove_file(tmp_module_img); let _ = std::fs::remove_file(tmp_module_img);
check_image(defs::MODULE_UPDATE_IMG)?;
} }
mark_update()?; mark_update()?;
@@ -520,6 +533,7 @@ where
utils::copy_sparse_file(modules_update_tmp_img, defs::MODULE_UPDATE_IMG, true) utils::copy_sparse_file(modules_update_tmp_img, defs::MODULE_UPDATE_IMG, true)
.with_context(|| "Failed to copy image.".to_string())?; .with_context(|| "Failed to copy image.".to_string())?;
let _ = std::fs::remove_file(modules_update_tmp_img); let _ = std::fs::remove_file(modules_update_tmp_img);
check_image(defs::MODULE_UPDATE_IMG)?;
} }
mark_update()?; mark_update()?;

View File

@@ -1,4 +1,4 @@
use anyhow::{anyhow, bail, Ok, Result}; use anyhow::{Ok, Result, anyhow, bail};
#[cfg(any(target_os = "linux", target_os = "android"))] #[cfg(any(target_os = "linux", target_os = "android"))]
use anyhow::Context; use anyhow::Context;

View File

@@ -6,7 +6,7 @@ use std::path::Path;
#[cfg(any(target_os = "linux", target_os = "android"))] #[cfg(any(target_os = "linux", target_os = "android"))]
use anyhow::{Context, Ok}; use anyhow::{Context, Ok};
#[cfg(any(target_os = "linux", target_os = "android"))] #[cfg(any(target_os = "linux", target_os = "android"))]
use extattr::{lsetxattr, Flags as XattrFlags}; use extattr::{Flags as XattrFlags, lsetxattr};
pub const SYSTEM_CON: &str = "u:object_r:system_file:s0"; pub const SYSTEM_CON: &str = "u:object_r:system_file:s0";
pub const ADB_CON: &str = "u:object_r:adb_data_file:s0"; pub const ADB_CON: &str = "u:object_r:adb_data_file:s0";

View File

@@ -1,22 +1,18 @@
use anyhow::{bail, Result}; use anyhow::{Result, bail};
use derive_new::new; use derive_new::new;
use nom::{ use nom::{
AsChar, IResult, Parser,
branch::alt, branch::alt,
bytes::complete::{tag, take_while, take_while1, take_while_m_n}, bytes::complete::{tag, take_while, take_while_m_n, take_while1},
character::{ character::complete::{space0, space1},
complete::{space0, space1},
is_alphanumeric,
},
combinator::map, combinator::map,
sequence::Tuple,
IResult, Parser,
}; };
use std::{ffi, path::Path, vec}; use std::{ffi, path::Path, vec};
type SeObject<'a> = Vec<&'a str>; type SeObject<'a> = Vec<&'a str>;
fn is_sepolicy_char(c: char) -> bool { fn is_sepolicy_char(c: char) -> bool {
is_alphanumeric(c as u8) || c == '_' || c == '-' c.is_alphanum() || c == '_' || c == '-'
} }
fn parse_single_word(input: &str) -> IResult<&str, &str> { fn parse_single_word(input: &str) -> IResult<&str, &str> {
@@ -173,7 +169,8 @@ impl<'a> SeObjectParser<'a> for NormalPerm<'a> {
tag("deny"), tag("deny"),
tag("auditallow"), tag("auditallow"),
tag("dontaudit"), tag("dontaudit"),
))(input)?; ))
.parse(input)?;
let (input, _) = space0(input)?; let (input, _) = space0(input)?;
let (input, source) = parse_seobj(input)?; let (input, source) = parse_seobj(input)?;
@@ -193,7 +190,8 @@ impl<'a> SeObjectParser<'a> for XPerm<'a> {
tag("allowxperm"), tag("allowxperm"),
tag("auditallowxperm"), tag("auditallowxperm"),
tag("dontauditxperm"), tag("dontauditxperm"),
))(input)?; ))
.parse(input)?;
let (input, _) = space0(input)?; let (input, _) = space0(input)?;
let (input, source) = parse_seobj(input)?; let (input, source) = parse_seobj(input)?;
@@ -215,7 +213,7 @@ impl<'a> SeObjectParser<'a> for XPerm<'a> {
impl<'a> SeObjectParser<'a> for TypeState<'a> { impl<'a> SeObjectParser<'a> for TypeState<'a> {
fn parse(input: &'a str) -> IResult<&'a str, Self> { fn parse(input: &'a str) -> IResult<&'a str, Self> {
let (input, op) = alt((tag("permissive"), tag("enforce")))(input)?; let (input, op) = alt((tag("permissive"), tag("enforce"))).parse(input)?;
let (input, _) = space1(input)?; let (input, _) = space1(input)?;
let (input, stype) = parse_seobj_no_star(input)?; let (input, stype) = parse_seobj_no_star(input)?;
@@ -243,7 +241,7 @@ impl<'a> SeObjectParser<'a> for Type<'a> {
impl<'a> SeObjectParser<'a> for TypeAttr<'a> { impl<'a> SeObjectParser<'a> for TypeAttr<'a> {
fn parse(input: &'a str) -> IResult<&'a str, Self> { fn parse(input: &'a str) -> IResult<&'a str, Self> {
let (input, _) = alt((tag("typeattribute"), tag("attradd")))(input)?; let (input, _) = alt((tag("typeattribute"), tag("attradd"))).parse(input)?;
let (input, _) = space1(input)?; let (input, _) = space1(input)?;
let (input, stype) = parse_seobj_no_star(input)?; let (input, stype) = parse_seobj_no_star(input)?;
let (input, _) = space1(input)?; let (input, _) = space1(input)?;
@@ -265,7 +263,7 @@ impl<'a> SeObjectParser<'a> for Attr<'a> {
impl<'a> SeObjectParser<'a> for TypeTransition<'a> { impl<'a> SeObjectParser<'a> for TypeTransition<'a> {
fn parse(input: &'a str) -> IResult<&'a str, Self> { fn parse(input: &'a str) -> IResult<&'a str, Self> {
let (input, _) = alt((tag("type_transition"), tag("name_transition")))(input)?; let (input, _) = alt((tag("type_transition"), tag("name_transition"))).parse(input)?;
let (input, _) = space1(input)?; let (input, _) = space1(input)?;
let (input, source) = parse_single_word(input)?; let (input, source) = parse_single_word(input)?;
let (input, _) = space1(input)?; let (input, _) = space1(input)?;
@@ -294,7 +292,7 @@ impl<'a> SeObjectParser<'a> for TypeTransition<'a> {
impl<'a> SeObjectParser<'a> for TypeChange<'a> { impl<'a> SeObjectParser<'a> for TypeChange<'a> {
fn parse(input: &'a str) -> IResult<&'a str, Self> { fn parse(input: &'a str) -> IResult<&'a str, Self> {
let (input, op) = alt((tag("type_change"), tag("type_member")))(input)?; let (input, op) = alt((tag("type_change"), tag("type_member"))).parse(input)?;
let (input, _) = space1(input)?; let (input, _) = space1(input)?;
let (input, source) = parse_single_word(input)?; let (input, source) = parse_single_word(input)?;
let (input, _) = space1(input)?; let (input, _) = space1(input)?;
@@ -337,7 +335,8 @@ impl<'a> PolicyStatement<'a> {
map(TypeTransition::parse, PolicyStatement::TypeTransition), map(TypeTransition::parse, PolicyStatement::TypeTransition),
map(TypeChange::parse, PolicyStatement::TypeChange), map(TypeChange::parse, PolicyStatement::TypeChange),
map(GenFsCon::parse, PolicyStatement::GenFsCon), map(GenFsCon::parse, PolicyStatement::GenFsCon),
))(input)?; ))
.parse(input)?;
let (input, _) = space0(input)?; let (input, _) = space0(input)?;
let (input, _) = take_while(|c| c == ';')(input)?; let (input, _) = take_while(|c| c == ';')(input)?;
let (input, _) = space0(input)?; let (input, _) = space0(input)?;

View File

@@ -14,7 +14,7 @@ use crate::{
#[cfg(any(target_os = "linux", target_os = "android"))] #[cfg(any(target_os = "linux", target_os = "android"))]
use rustix::{ use rustix::{
process::getuid, process::getuid,
thread::{set_thread_res_gid, set_thread_res_uid, Gid, Uid}, thread::{Gid, Uid, set_thread_res_gid, set_thread_res_uid},
}; };
#[cfg(any(target_os = "linux", target_os = "android"))] #[cfg(any(target_os = "linux", target_os = "android"))]
@@ -280,6 +280,6 @@ fn add_path_to_env(path: &str) -> Result<()> {
let new_path = PathBuf::from(path.trim_end_matches('/')); let new_path = PathBuf::from(path.trim_end_matches('/'));
paths.push(new_path); paths.push(new_path);
let new_path_env = env::join_paths(paths)?; let new_path_env = env::join_paths(paths)?;
env::set_var("PATH", new_path_env); unsafe { env::set_var("PATH", new_path_env) };
Ok(()) Ok(())
} }

View File

@@ -1,6 +1,6 @@
use anyhow::{bail, Context, Error, Ok, Result}; use anyhow::{Context, Error, Ok, Result, bail};
use std::{ use std::{
fs::{self, create_dir_all, remove_file, write, File, OpenOptions}, fs::{self, File, OpenOptions, create_dir_all, remove_file, write},
io::{ io::{
ErrorKind::{AlreadyExists, NotFound}, ErrorKind::{AlreadyExists, NotFound},
Write, Write,
@@ -13,7 +13,7 @@ use std::{
use crate::{assets, boot_patch, defs, ksucalls, module, restorecon}; use crate::{assets, boot_patch, defs, ksucalls, module, restorecon};
use std::fs::metadata; use std::fs::metadata;
#[allow(unused_imports)] #[allow(unused_imports)]
use std::fs::{set_permissions, Permissions}; use std::fs::{Permissions, set_permissions};
#[cfg(unix)] #[cfg(unix)]
use std::os::unix::prelude::PermissionsExt; use std::os::unix::prelude::PermissionsExt;
@@ -26,7 +26,7 @@ use std::path::PathBuf;
#[cfg(any(target_os = "linux", target_os = "android"))] #[cfg(any(target_os = "linux", target_os = "android"))]
use rustix::{ use rustix::{
process, process,
thread::{move_into_link_name_space, unshare, LinkNameSpaceType, UnshareFlags}, thread::{LinkNameSpaceType, move_into_link_name_space},
}; };
pub fn ensure_clean_dir(dir: impl AsRef<Path>) -> Result<()> { pub fn ensure_clean_dir(dir: impl AsRef<Path>) -> Result<()> {
@@ -131,7 +131,7 @@ pub fn get_zip_uncompressed_size(zip_path: &str) -> Result<u64> {
pub fn switch_mnt_ns(pid: i32) -> Result<()> { pub fn switch_mnt_ns(pid: i32) -> Result<()> {
use rustix::{ use rustix::{
fd::AsFd, fd::AsFd,
fs::{open, Mode, OFlags}, fs::{Mode, OFlags, open},
}; };
let path = format!("/proc/{pid}/ns/mnt"); let path = format!("/proc/{pid}/ns/mnt");
let fd = open(path, OFlags::RDONLY, Mode::from_raw_mode(0))?; let fd = open(path, OFlags::RDONLY, Mode::from_raw_mode(0))?;