Compare commits

...

267 Commits

Author SHA1 Message Date
rifsxd
407826396b ci: try release artifacts properly 2025-05-23 05:17:08 +06:00
rifsxd
124547c9c5 manager: update root project name to "KernelSU-Next" 2025-05-23 05:02:04 +06:00
igor
db7a9df880 Update translation (#423) 2025-05-23 04:55:37 +06:00
rifsxd
29725214f7 ksud_overlayfs: change find_temp_path to use keep() method for temporary directory since into_path() is deprecated 2025-05-23 04:52:48 +06:00
rifsxd
9189de4db1 manager: refactor backup and restore paths and logic for modules and allowlist 2025-05-23 04:48:36 +06:00
rifsxd
fec0032883 ksud: fix clippy warning/error 2025-05-23 03:18:36 +06:00
роизен
1ee737b1aa Update and rename strings.xml to strings.xml (#422) 2025-05-23 00:43:45 +06:00
dependabot[bot]
2a32e1d746 build(deps): bump the crates group across 1 directory with 18 updates (#417)
Bumps the crates group with 11 updates in the /userspace/ksud_overlayfs directory:

| Package | From | To |
| --- | --- | --- |
| [clap](https://github.com/clap-rs/clap) | `4.5.37` | `4.5.38` |
| rust-embed | `8.7.1` | `8.7.2` |
| [tempfile](https://github.com/Stebalien/tempfile) | `3.19.1` | `3.20.0` |
| [ahash](https://github.com/tkaitchuck/ahash) | `0.8.11` | `0.8.12` |
| [anstyle-wincon](https://github.com/rust-cli/anstyle) | `3.0.7` | `3.0.8` |
| [backtrace](https://github.com/rust-lang/backtrace-rs) | `0.3.74` | `0.3.75` |
| [cc](https://github.com/rust-lang/cc-rs) | `1.2.21` | `1.2.23` |
| [crc](https://github.com/mrhooray/crc-rs) | `3.2.1` | `3.3.0` |
| [getrandom](https://github.com/rust-random/getrandom) | `0.3.2` | `0.3.3` |
| [libm](https://github.com/rust-lang/compiler-builtins) | `0.2.14` | `0.2.15` |
| [windows-core](https://github.com/microsoft/windows-rs) | `0.61.0` | `0.61.2` |



Updates `clap` from 4.5.37 to 4.5.38
- [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.37...clap_complete-v4.5.38)

Updates `rust-embed` from 8.7.1 to 8.7.2

Updates `tempfile` from 3.19.1 to 3.20.0
- [Changelog](https://github.com/Stebalien/tempfile/blob/master/CHANGELOG.md)
- [Commits](https://github.com/Stebalien/tempfile/compare/v3.19.1...v3.20.0)

Updates `ahash` from 0.8.11 to 0.8.12
- [Release notes](https://github.com/tkaitchuck/ahash/releases)
- [Commits](https://github.com/tkaitchuck/ahash/commits)

Updates `anstyle-wincon` from 3.0.7 to 3.0.8
- [Commits](https://github.com/rust-cli/anstyle/compare/anstyle-wincon-v3.0.7...anstyle-wincon-v3.0.8)

Updates `backtrace` from 0.3.74 to 0.3.75
- [Release notes](https://github.com/rust-lang/backtrace-rs/releases)
- [Commits](https://github.com/rust-lang/backtrace-rs/compare/0.3.74...0.3.75)

Updates `cc` from 1.2.21 to 1.2.23
- [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.21...cc-v1.2.23)

Updates `clap_builder` from 4.5.37 to 4.5.38
- [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.37...v4.5.38)

Updates `crc` from 3.2.1 to 3.3.0
- [Release notes](https://github.com/mrhooray/crc-rs/releases)
- [Commits](https://github.com/mrhooray/crc-rs/commits)

Updates `getrandom` from 0.3.2 to 0.3.3
- [Changelog](https://github.com/rust-random/getrandom/blob/master/CHANGELOG.md)
- [Commits](https://github.com/rust-random/getrandom/compare/v0.3.2...v0.3.3)

Updates `libm` from 0.2.14 to 0.2.15
- [Release notes](https://github.com/rust-lang/compiler-builtins/releases)
- [Changelog](https://github.com/rust-lang/compiler-builtins/blob/master/.release-plz.toml)
- [Commits](https://github.com/rust-lang/compiler-builtins/compare/libm-v0.2.14...libm-v0.2.15)

Updates `rust-embed-impl` from 8.7.0 to 8.7.2

Updates `rust-embed-utils` from 8.7.0 to 8.7.2

Updates `windows-core` from 0.61.0 to 0.61.2
- [Release notes](https://github.com/microsoft/windows-rs/releases)
- [Commits](https://github.com/microsoft/windows-rs/commits)

Updates `windows-result` from 0.3.2 to 0.3.4
- [Release notes](https://github.com/microsoft/windows-rs/releases)
- [Commits](https://github.com/microsoft/windows-rs/commits)

Updates `windows-strings` from 0.4.0 to 0.4.2
- [Release notes](https://github.com/microsoft/windows-rs/releases)
- [Commits](https://github.com/microsoft/windows-rs/commits)

Updates `zerocopy` from 0.7.35 to 0.8.25
- [Release notes](https://github.com/google/zerocopy/releases)
- [Changelog](https://github.com/google/zerocopy/blob/main/CHANGELOG.md)
- [Commits](https://github.com/google/zerocopy/compare/v0.7.35...v0.8.25)

Updates `zerocopy-derive` from 0.7.35 to 0.8.25
- [Release notes](https://github.com/google/zerocopy/releases)
- [Changelog](https://github.com/google/zerocopy/blob/main/CHANGELOG.md)
- [Commits](https://github.com/google/zerocopy/compare/v0.7.35...v0.8.25)

---
updated-dependencies:
- dependency-name: clap
  dependency-version: 4.5.38
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: crates
- dependency-name: rust-embed
  dependency-version: 8.7.2
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: crates
- dependency-name: tempfile
  dependency-version: 3.20.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: crates
- dependency-name: ahash
  dependency-version: 0.8.12
  dependency-type: indirect
  update-type: version-update:semver-patch
  dependency-group: crates
- dependency-name: anstyle-wincon
  dependency-version: 3.0.8
  dependency-type: indirect
  update-type: version-update:semver-patch
  dependency-group: crates
- dependency-name: backtrace
  dependency-version: 0.3.75
  dependency-type: indirect
  update-type: version-update:semver-patch
  dependency-group: crates
- dependency-name: cc
  dependency-version: 1.2.23
  dependency-type: indirect
  update-type: version-update:semver-patch
  dependency-group: crates
- dependency-name: clap_builder
  dependency-version: 4.5.38
  dependency-type: indirect
  update-type: version-update:semver-patch
  dependency-group: crates
- dependency-name: crc
  dependency-version: 3.3.0
  dependency-type: indirect
  update-type: version-update:semver-minor
  dependency-group: crates
- dependency-name: getrandom
  dependency-version: 0.3.3
  dependency-type: indirect
  update-type: version-update:semver-patch
  dependency-group: crates
- dependency-name: libm
  dependency-version: 0.2.15
  dependency-type: indirect
  update-type: version-update:semver-patch
  dependency-group: crates
- dependency-name: rust-embed-impl
  dependency-version: 8.7.2
  dependency-type: indirect
  update-type: version-update:semver-patch
  dependency-group: crates
- dependency-name: rust-embed-utils
  dependency-version: 8.7.2
  dependency-type: indirect
  update-type: version-update:semver-patch
  dependency-group: crates
- dependency-name: windows-core
  dependency-version: 0.61.2
  dependency-type: indirect
  update-type: version-update:semver-patch
  dependency-group: crates
- dependency-name: windows-result
  dependency-version: 0.3.4
  dependency-type: indirect
  update-type: version-update:semver-patch
  dependency-group: crates
- dependency-name: windows-strings
  dependency-version: 0.4.2
  dependency-type: indirect
  update-type: version-update:semver-patch
  dependency-group: crates
- dependency-name: zerocopy
  dependency-version: 0.8.25
  dependency-type: indirect
  update-type: version-update:semver-minor
  dependency-group: crates
- dependency-name: zerocopy-derive
  dependency-version: 0.8.25
  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-05-23 00:40:58 +06:00
dependabot[bot]
bdaf50ab0f build(deps): bump the crates group across 1 directory with 18 updates (#416)
Bumps the crates group with 11 updates in the /userspace/ksud_magic directory:

| Package | From | To |
| --- | --- | --- |
| [clap](https://github.com/clap-rs/clap) | `4.5.37` | `4.5.38` |
| rust-embed | `8.7.1` | `8.7.2` |
| [tempfile](https://github.com/Stebalien/tempfile) | `3.19.1` | `3.20.0` |
| [ahash](https://github.com/tkaitchuck/ahash) | `0.8.11` | `0.8.12` |
| [anstyle-wincon](https://github.com/rust-cli/anstyle) | `3.0.7` | `3.0.8` |
| [backtrace](https://github.com/rust-lang/backtrace-rs) | `0.3.74` | `0.3.75` |
| [cc](https://github.com/rust-lang/cc-rs) | `1.2.21` | `1.2.23` |
| [crc](https://github.com/mrhooray/crc-rs) | `3.2.1` | `3.3.0` |
| [getrandom](https://github.com/rust-random/getrandom) | `0.3.2` | `0.3.3` |
| [libm](https://github.com/rust-lang/compiler-builtins) | `0.2.14` | `0.2.15` |
| [windows-core](https://github.com/microsoft/windows-rs) | `0.61.0` | `0.61.2` |



Updates `clap` from 4.5.37 to 4.5.38
- [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.37...clap_complete-v4.5.38)

Updates `rust-embed` from 8.7.1 to 8.7.2

Updates `tempfile` from 3.19.1 to 3.20.0
- [Changelog](https://github.com/Stebalien/tempfile/blob/master/CHANGELOG.md)
- [Commits](https://github.com/Stebalien/tempfile/compare/v3.19.1...v3.20.0)

Updates `ahash` from 0.8.11 to 0.8.12
- [Release notes](https://github.com/tkaitchuck/ahash/releases)
- [Commits](https://github.com/tkaitchuck/ahash/commits)

Updates `anstyle-wincon` from 3.0.7 to 3.0.8
- [Commits](https://github.com/rust-cli/anstyle/compare/anstyle-wincon-v3.0.7...anstyle-wincon-v3.0.8)

Updates `backtrace` from 0.3.74 to 0.3.75
- [Release notes](https://github.com/rust-lang/backtrace-rs/releases)
- [Commits](https://github.com/rust-lang/backtrace-rs/compare/0.3.74...0.3.75)

Updates `cc` from 1.2.21 to 1.2.23
- [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.21...cc-v1.2.23)

Updates `clap_builder` from 4.5.37 to 4.5.38
- [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.37...v4.5.38)

Updates `crc` from 3.2.1 to 3.3.0
- [Release notes](https://github.com/mrhooray/crc-rs/releases)
- [Commits](https://github.com/mrhooray/crc-rs/commits)

Updates `getrandom` from 0.3.2 to 0.3.3
- [Changelog](https://github.com/rust-random/getrandom/blob/master/CHANGELOG.md)
- [Commits](https://github.com/rust-random/getrandom/compare/v0.3.2...v0.3.3)

Updates `libm` from 0.2.14 to 0.2.15
- [Release notes](https://github.com/rust-lang/compiler-builtins/releases)
- [Changelog](https://github.com/rust-lang/compiler-builtins/blob/master/.release-plz.toml)
- [Commits](https://github.com/rust-lang/compiler-builtins/compare/libm-v0.2.14...libm-v0.2.15)

Updates `rust-embed-impl` from 8.7.0 to 8.7.2

Updates `rust-embed-utils` from 8.7.0 to 8.7.2

Updates `windows-core` from 0.61.0 to 0.61.2
- [Release notes](https://github.com/microsoft/windows-rs/releases)
- [Commits](https://github.com/microsoft/windows-rs/commits)

Updates `windows-result` from 0.3.2 to 0.3.4
- [Release notes](https://github.com/microsoft/windows-rs/releases)
- [Commits](https://github.com/microsoft/windows-rs/commits)

Updates `windows-strings` from 0.4.0 to 0.4.2
- [Release notes](https://github.com/microsoft/windows-rs/releases)
- [Commits](https://github.com/microsoft/windows-rs/commits)

Updates `zerocopy` from 0.7.35 to 0.8.25
- [Release notes](https://github.com/google/zerocopy/releases)
- [Changelog](https://github.com/google/zerocopy/blob/main/CHANGELOG.md)
- [Commits](https://github.com/google/zerocopy/compare/v0.7.35...v0.8.25)

Updates `zerocopy-derive` from 0.7.35 to 0.8.25
- [Release notes](https://github.com/google/zerocopy/releases)
- [Changelog](https://github.com/google/zerocopy/blob/main/CHANGELOG.md)
- [Commits](https://github.com/google/zerocopy/compare/v0.7.35...v0.8.25)

---
updated-dependencies:
- dependency-name: clap
  dependency-version: 4.5.38
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: crates
- dependency-name: rust-embed
  dependency-version: 8.7.2
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: crates
- dependency-name: tempfile
  dependency-version: 3.20.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: crates
- dependency-name: ahash
  dependency-version: 0.8.12
  dependency-type: indirect
  update-type: version-update:semver-patch
  dependency-group: crates
- dependency-name: anstyle-wincon
  dependency-version: 3.0.8
  dependency-type: indirect
  update-type: version-update:semver-patch
  dependency-group: crates
- dependency-name: backtrace
  dependency-version: 0.3.75
  dependency-type: indirect
  update-type: version-update:semver-patch
  dependency-group: crates
- dependency-name: cc
  dependency-version: 1.2.23
  dependency-type: indirect
  update-type: version-update:semver-patch
  dependency-group: crates
- dependency-name: clap_builder
  dependency-version: 4.5.38
  dependency-type: indirect
  update-type: version-update:semver-patch
  dependency-group: crates
- dependency-name: crc
  dependency-version: 3.3.0
  dependency-type: indirect
  update-type: version-update:semver-minor
  dependency-group: crates
- dependency-name: getrandom
  dependency-version: 0.3.3
  dependency-type: indirect
  update-type: version-update:semver-patch
  dependency-group: crates
- dependency-name: libm
  dependency-version: 0.2.15
  dependency-type: indirect
  update-type: version-update:semver-patch
  dependency-group: crates
- dependency-name: rust-embed-impl
  dependency-version: 8.7.2
  dependency-type: indirect
  update-type: version-update:semver-patch
  dependency-group: crates
- dependency-name: rust-embed-utils
  dependency-version: 8.7.2
  dependency-type: indirect
  update-type: version-update:semver-patch
  dependency-group: crates
- dependency-name: windows-core
  dependency-version: 0.61.2
  dependency-type: indirect
  update-type: version-update:semver-patch
  dependency-group: crates
- dependency-name: windows-result
  dependency-version: 0.3.4
  dependency-type: indirect
  update-type: version-update:semver-patch
  dependency-group: crates
- dependency-name: windows-strings
  dependency-version: 0.4.2
  dependency-type: indirect
  update-type: version-update:semver-patch
  dependency-group: crates
- dependency-name: zerocopy
  dependency-version: 0.8.25
  dependency-type: indirect
  update-type: version-update:semver-minor
  dependency-group: crates
- dependency-name: zerocopy-derive
  dependency-version: 0.8.25
  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-05-23 00:40:36 +06:00
dependabot[bot]
37a129080a build(deps): bump the maven group across 1 directory with 10 updates (#378)
Bumps the maven group with 10 updates in the /manager directory:

| Package | From | To |
| --- | --- | --- |
| androidx.navigation:navigation-compose | `2.8.9` | `2.9.0` |
| androidx.compose:compose-bom | `2025.04.01` | `2025.05.00` |
| androidx.lifecycle:lifecycle-runtime-ktx | `2.8.7` | `2.9.0` |
| androidx.lifecycle:lifecycle-runtime-compose | `2.8.7` | `2.9.0` |
| androidx.lifecycle:lifecycle-viewmodel-compose | `2.8.7` | `2.9.0` |
| com.android.application | `8.9.2` | `8.10.0` |
| com.android.library | `8.9.2` | `8.10.0` |
| [org.jetbrains.kotlin.android](https://github.com/JetBrains/kotlin) | `2.1.20` | `2.1.21` |
| [org.jetbrains.kotlin.plugin.compose](https://github.com/JetBrains/kotlin) | `2.1.20` | `2.1.21` |
| [com.google.devtools.ksp](https://github.com/google/ksp) | `2.1.20-2.0.1` | `2.1.21-2.0.1` |



Updates `androidx.navigation:navigation-compose` from 2.8.9 to 2.9.0

Updates `androidx.compose:compose-bom` from 2025.04.01 to 2025.05.00

Updates `androidx.lifecycle:lifecycle-runtime-ktx` from 2.8.7 to 2.9.0

Updates `androidx.lifecycle:lifecycle-runtime-compose` from 2.8.7 to 2.9.0

Updates `androidx.lifecycle:lifecycle-viewmodel-compose` from 2.8.7 to 2.9.0

Updates `androidx.lifecycle:lifecycle-runtime-compose` from 2.8.7 to 2.9.0

Updates `androidx.lifecycle:lifecycle-viewmodel-compose` from 2.8.7 to 2.9.0

Updates `com.android.application` from 8.9.2 to 8.10.0

Updates `com.android.library` from 8.9.2 to 8.10.0

Updates `com.android.library` from 8.9.2 to 8.10.0

Updates `org.jetbrains.kotlin.android` from 2.1.20 to 2.1.21
- [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.20...v2.1.21)

Updates `org.jetbrains.kotlin.plugin.compose` from 2.1.20 to 2.1.21
- [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.20...v2.1.21)

Updates `org.jetbrains.kotlin.plugin.compose` from 2.1.20 to 2.1.21
- [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.20...v2.1.21)

Updates `com.google.devtools.ksp` from 2.1.20-2.0.1 to 2.1.21-2.0.1
- [Release notes](https://github.com/google/ksp/releases)
- [Commits](https://github.com/google/ksp/compare/2.1.20-2.0.1...2.1.21-2.0.1)

---
updated-dependencies:
- dependency-name: androidx.navigation:navigation-compose
  dependency-version: 2.9.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: maven
- dependency-name: androidx.compose:compose-bom
  dependency-version: 2025.05.00
  dependency-type: direct:production
  dependency-group: maven
- dependency-name: androidx.lifecycle:lifecycle-runtime-ktx
  dependency-version: 2.9.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: maven
- dependency-name: androidx.lifecycle:lifecycle-runtime-compose
  dependency-version: 2.9.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: maven
- dependency-name: androidx.lifecycle:lifecycle-viewmodel-compose
  dependency-version: 2.9.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: maven
- dependency-name: androidx.lifecycle:lifecycle-runtime-compose
  dependency-version: 2.9.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: maven
- dependency-name: androidx.lifecycle:lifecycle-viewmodel-compose
  dependency-version: 2.9.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: maven
- dependency-name: com.android.application
  dependency-version: 8.10.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: maven
- dependency-name: com.android.library
  dependency-version: 8.10.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: maven
- dependency-name: com.android.library
  dependency-version: 8.10.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: maven
- dependency-name: org.jetbrains.kotlin.android
  dependency-version: 2.1.21
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: maven
- dependency-name: org.jetbrains.kotlin.plugin.compose
  dependency-version: 2.1.21
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: maven
- dependency-name: org.jetbrains.kotlin.plugin.compose
  dependency-version: 2.1.21
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: maven
- dependency-name: com.google.devtools.ksp
  dependency-version: 2.1.21-2.0.1
  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-05-23 00:40:18 +06:00
Rifat Azad
024b6ce292 docs: updated installation link for all README 2025-05-22 20:45:58 +06:00
rifsxd
b13a12e3d5 manager: something interesting? 2025-05-22 11:02:01 +06:00
rifsxd
9d9738eed0 manager: keep screen on when FlashingStatus.FLASHING 2025-05-22 10:21:31 +06:00
rifsxd
135fe1e5d4 manager: made the see more collapse button round for infocard 2025-05-22 10:07:03 +06:00
Rifat Azad
2d033b6b87 manager: disable mount system info if ksuversion is null 2025-05-22 09:48:25 +06:00
cvnertnc
9048ffbdab Manager: update values-tr/strings.xml and Docs: update README-tr.md (#415) 2025-05-22 08:38:47 +06:00
роизен
d43fdd3cb4 Add Ukranian (#414)
* Create README_UA.md

* Update README_UA.md

* Update README.md

* Update README_BG.md

* Update README_CN.md

* Update README_FR.md

* Update README_ID.md

* Update README_IT.md

* Update README_JA.md

* Update README_KO.md

* Update README_PL.md

* Update README_PT-BR.md

* Update README_RU.md

* Update README_TH.md

* Update README_TR.md

* Update README_TW.md

* Update README_VI.md

* Create strings.xml

* МЕГА ПОТУЖНО

* МЕГА ПОТУЖНО

* напотужнічав

---------

Co-authored-by: Rifat Azad <33044977+rifsxd@users.noreply.github.com>
2025-05-22 08:37:51 +06:00
Melamit
14d16eff46 docs: Update translations (#383)
* docs: Update Installation instruction link for BG, JA and EN

* docs: Add Ukrainian translation

* docs: Add LKM mode deprecaton info in English and Ukrainian translations

This informs the user about the recent change in KernelSU Next manager in the Readme

---------

Co-authored-by: melamit <sunshine@melamit.in>
2025-05-22 08:06:07 +06:00
luigimak
1a603c2b48 Update Italian Translation (#413)
Update values-it/strings.xml
2025-05-22 08:02:45 +06:00
mr_vokintos
2092161fe0 Update Russian (#409)
* Update README_RU.md

Donations added

* Update strings.xml

fix

* Update strings.xml

again

* Update README_RU.md

* Update Ru strings.xml

Fixes and additions

* Update README_RU.md

I didn't like the way it looked

* Update strings.xml

* Update strings.xml

* Update strings.xml

* Update strings.xml

* Update strings.xml
2025-05-22 08:01:44 +06:00
igor
a8b92f50cc Update portuguese translation (#401) 2025-05-22 08:00:21 +06:00
itsaschoolbus
4556c9a5d1 manager: Update LKM mode deprecation string for Vietnamese (#396) 2025-05-22 07:59:58 +06:00
Nhật Minh
e6fcae4f02 Update strings.xml (#372) 2025-05-22 07:59:34 +06:00
Rifat Azad
74ab5488e1 manager: rename unmount -> umount for superuser label item 2025-05-22 07:39:18 +06:00
rifsxd
5cdec242eb manager: keep screen on when isActionRunning (#341) 2025-05-22 00:27:31 +06:00
rifsxd
e938a499f6 manager: disabled auto update by default 2025-05-22 00:09:40 +06:00
rifsxd
84b5915eea manager: use WebUIX as default webui providor 2025-05-22 00:08:07 +06:00
rifsxd
540ce1d2c3 manager: redesign/rearrange home infocard 2025-05-21 23:42:05 +06:00
rifsxd
b40f2af0f0 manager: fix bad prctl calls for native code 2025-05-21 22:55:38 +06:00
rifsxd
324d09a61e manager: added MINIMAL_SUPPORTED_HOOK_MODE and hook_mode info 2025-05-21 18:07:47 +06:00
rifsxd
d5dfecefea Revert "kernel: Makefile: sanity checks"
This reverts commit 26d3ec14a6.
2025-05-21 18:07:46 +06:00
rifsxd
ce37e17c87 kernel: added CMD_HOOK_MODE prctl to get the enabled su hook mode value 2025-05-21 18:07:41 +06:00
rifsxd
3b1d5f15f4 manager: webuix no longer should be stated beta as it is stable enough for release 2025-05-21 15:18:01 +06:00
rifsxd
714ec4695b manager: show home_failure instead of lkm_mode_deprecated 2025-05-21 15:16:37 +06:00
rifsxd
3795d92d7a manager: fix kprobes strings 2025-05-21 15:15:27 +06:00
rifsxd
eed685507a kernel: rename KSU_WITH_KPROBES to KSU_KPROBES_HOOK for better self explanitory 2025-05-21 15:13:17 +06:00
backslashxx
26d3ec14a6 kernel: Makefile: sanity checks 2025-05-21 15:09:33 +06:00
ShirkNeko
96d475407a Add a formatting string for the update list #2556 (#2597)
Fix module update failures caused by spaces and other non Linux readable
characters


Signed-off-by: ShirkNeko <109797057+ShirkNeko@users.noreply.github.com>
2025-05-21 15:03:06 +06:00
backslashxx
27d8bc458f kernel: sucompat: increase reliability of execve_sucompat
On plain ARMv8.0 devices (A53,A57,A73), strncpy_from_user_nofault() sometimes
fails to copy `filename_user` string correctly. This breaks su ofc, breaking
some apps like Termux (Play Store ver), ZArchiver and Root Explorer.

This does NOT seem to affect newer ARMv8.2+ CPUs (A75/A76 and newer)

My speculation? ARMv8.0 has weak speculation :)

here we replace `strncpy_from_user_nofault()` with another routine:
 - access_ok() to validate the pointer
 - strncpy_from_user() to copy and validate string
 - manual null-termination just in case, as strncpy_from_user_nofault also does it
 - remove that memset, seems useless as it is an strncpy, not strncat

Kind of mimicking _nofault, but yes with this one we allow pagefaults.

Tested on:
- ARMv8.0 A73.a53, A57.a53, A53.a53
- ARMv8.2 A76.a55

Tested-by: iDead XD <rafifirdaus12bb@gmail.com>
Signed-off-by: backslashxx <118538522+backslashxx@users.noreply.github.com>
2025-05-21 15:01:01 +06:00
Der_Googler
519f86c47e manager: refactor label item in superuser list (#403) 2025-05-19 22:50:11 +06:00
backslashxx
980f71c1bd kernel: core_hook: fixup 217d230b (#402)
Reported-by: Trijal Saha <97483939+Trijal08@users.noreply.github.com>
2025-05-19 22:49:44 +06:00
Rifat Azad
7692665428 manager: warn about LKM mode deprecation for GKI2 kernels 2025-05-19 00:07:05 +06:00
Trijal Saha
aaca0b5283 ci: Only have one task for susfsd irrespective of the target architecture (#395) 2025-05-18 22:49:39 +06:00
Der_Googler
e5a495489d Improve StatusCard and fix WX wrappers of WebUI X (#393)
* manager: bump mmrl to 1998c70b77

* manager: improve StatusCard
2025-05-18 22:11:38 +06:00
Der_Googler
e07a6fb3ff manager: Bump MMRL and possible fix #384 (#391)
* manager: bump mmrl to 346470abb8

- Possible fix a bug where IUserManager.getUsers(ZZZ) are not defined in the framework.jar
- Refactored WebUI X to meet the new WXInterface
- Only fetch the app from the current user and not all users

* manager: remove unused AIDL interfaces
2025-05-18 16:50:51 +06:00
Rifat Azad
b8c2660996 manager: add ABI info icon 2025-05-18 12:30:20 +06:00
rifsxd
ec2ecdcacb manager: fix unresolved referance 2025-05-18 12:22:34 +06:00
rifsxd
3c3ab77f65 manager: Add ABI archirecture info for manager 2025-05-18 12:09:08 +06:00
rifsxd
ffb2c89c36 manager: add kernel ABI info 2025-05-18 12:03:49 +06:00
rifsxd
bda62cc8a1 manager: refine working mode designation 2025-05-18 11:54:41 +06:00
Wang Han
a052af4180 Fix fallback option for createRootShell() (#2593) 2025-05-18 11:30:47 +06:00
rifsxd
8835c37536 ksud_magic: Update zip-extensions and set needed features for zip
zip-extensions does not export time and deflate64 features now.
2025-05-18 11:29:58 +06:00
Wang Han
69f3c9f6ab Update zip-extensions and set needed features for zip (#2592)
zip-extensions does not export time and deflate64 features now.
2025-05-18 11:25:38 +06:00
Rifat Azad
af3e0bd6a5 ci: fux ksud armv7a artifact download 2025-05-18 10:40:31 +06:00
Rifat Azad
5b14512323 ci: fux susfsd artifact download 2025-05-18 10:32:41 +06:00
Rifat Azad
6f176ad1c4 ksud_magic: removed loopdev 2025-05-18 10:24:39 +06:00
Rifat Azad
bc9d720a3c ksud_overlayfs: use upstream loopdev 2025-05-18 10:18:35 +06:00
Rifat Azad
93c5013251 ksud_overlayfs: use upstream hole-punch 2025-05-18 10:01:05 +06:00
Rifat Azad
bc5c993093 manager: added armv7a abi 2025-05-18 09:14:14 +06:00
Rifat Azad
759b3c5baf ci: fix workflow 2025-05-18 04:10:23 +06:00
Rifat Azad
e1303d13a3 ci: fix duplicate susfsd artifact upload error 2025-05-18 04:05:50 +06:00
Rifat Azad
8824115697 ci: upload armv7a susfsd artifact 2025-05-18 03:57:09 +06:00
Rifat Azad
a78a1e7d2e ci: fixed syntax error 2025-05-18 03:49:41 +06:00
backslashxx
9e150b2c44 ksud/installer: /odm handling
we move the folder out of system if it exists in real filesystem and it
is not a symlink.
this is already supported on init_event.rs so only handle_partition
logic was needed to make it happen

since KernelSU is using overlayfs, we need to move these out.

Signed-off-by: backslashxx
<118538522+backslashxx@users.noreply.github.com>

---------

Signed-off-by: backslashxx <118538522+backslashxx@users.noreply.github.com>
2025-05-18 03:42:32 +06:00
backslashxx
217d230b61 kernel: expose KSU_LSM_SECURITY_HOOKS on Kconfig
disabling this removes the need for LSM_HOOK_INIT, security_add_hooks and such,.
furthermore, this will also allow easier integration on pre-4.1 kernels.
Expose this and make it a configurable option.

Signed-off-by: backslashxx <118538522+backslashxx@users.noreply.github.com>
2025-05-18 03:23:12 +06:00
backslashxx
ba1b3c4fc7 kernel/throne_tracker: we just uninstalled the manager, stop looking for it
When the manager UID disappears from packages.list, we correctly
invalidate it — good. But, in the very next breath, we start scanning
/data/app hoping to find it again?

This event is just unnecessary I/O, exactly when we should be doing less.
Apparently this causes hangups and stuckups which is REALLY noticeable
on Ultra-Legacy devices.

Skip the scan — we’ll catch the reinstall next time packages.list updates.

Signed-off-by: backslashxx <118538522+backslashxx@users.noreply.github.com>
2025-05-18 03:23:12 +06:00
backslashxx
5f871cd713 kernel/selinux: fix pointer mismatch with 32-bit ksud on 64-bit kernels
Since KernelSU Manager can now be built for 32-bit, theres this problematic
setup where userspace is 32-bit (armeabi-v7a) and kernel is 64bit (aarch64).

On 64-bit kernels with CONFIG_COMPAT=y, 32-bit userspace passes 32-bit pointers.
These values are interpreted as 64-bit pointers without proper casting and that
results in invalid or near-null memory access.

This patch adds proper compat-mode handling with the ff changes:
- introduce a dedicated struct (`sepol_compat_data`) using u32 fields
- use `compat_ptr()` to safely convert 32-bit user pointers to kernel pointers
- adding a runtime `ksu_is_compat` flag to dynamically select between struct layouts

This prevents a near-null pointer dereference when handling SELinux
policy updates from 32-bit ksud in a 64-bit kernel.

Truth table:

kernel 32 + ksud 32, struct is u32, no compat_ptr
kernel 64 + ksud 32, struct is u32, yes compat_ptr
kernel 64 + ksud 64, struct is u64, no compat_ptr

Preprocessor check

64BIT=y COMPAT=y: define both structs, select dynamically
64BIT=y COMPAT=n: struct u64
64BIT=n: struct u32

Signed-off-by: backslashxx <118538522+backslashxx@users.noreply.github.com>
2025-05-18 03:23:12 +06:00
backslashxx
4a37422af5 kernel/sucompat: sync to KSU pr #2506
kernel: sucompat: sucompat toggle support for non-kp

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 likely unneeded, It keeps feature parity to non-kprobe builds.

adapted from upstream:
	kernel: Allow to re-enable sucompat - 4593ae81c7

Rejected: https://github.com/tiann/KernelSU/pull/2506

Signed-off-by: backslashxx <118538522+backslashxx@users.noreply.github.com>

kernel: sucompat: fix compile issue on kprobe builds, unused variable
2025-05-18 03:23:12 +06:00
Rifat Azad
a081fc87c9 manager/userspace: added 32bit (armv7a) support 2025-05-18 03:19:50 +06:00
Rifat Azad
0e8286e195 manager: refactor working mode designation 2025-05-18 01:56:47 +06:00
Rifat Azad
e9d53c4084 manager: removed overlayfs check for modules screen
since magic_mount is the default mount system which most UL (ultra legacy) devices will depend on
2025-05-17 10:41:22 +06:00
Rifat Azad
697a0ac9fc issue_template: we don't accept features requests anymore 2025-05-13 10:14:34 +06:00
dependabot[bot]
7f12e1c19a build(deps): bump the crates group across 1 directory with 4 updates (#365)
Bumps the crates group with 4 updates in the /userspace/ksud_magic directory: rust-embed, [cc](https://github.com/rust-lang/cc-rs), [libm](https://github.com/rust-lang/compiler-builtins) and [tokio](https://github.com/tokio-rs/tokio).


Updates `rust-embed` from 8.7.0 to 8.7.1

Updates `cc` from 1.2.20 to 1.2.21
- [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.20...cc-v1.2.21)

Updates `libm` from 0.2.13 to 0.2.14
- [Release notes](https://github.com/rust-lang/compiler-builtins/releases)
- [Changelog](https://github.com/rust-lang/compiler-builtins/blob/master/.release-plz.toml)
- [Commits](https://github.com/rust-lang/compiler-builtins/compare/libm-v0.2.13...libm-v0.2.14)

Updates `tokio` from 1.44.2 to 1.45.0
- [Release notes](https://github.com/tokio-rs/tokio/releases)
- [Commits](https://github.com/tokio-rs/tokio/compare/tokio-1.44.2...tokio-1.45.0)

---
updated-dependencies:
- dependency-name: rust-embed
  dependency-version: 8.7.1
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: crates
- dependency-name: cc
  dependency-version: 1.2.21
  dependency-type: indirect
  update-type: version-update:semver-patch
  dependency-group: crates
- dependency-name: libm
  dependency-version: 0.2.14
  dependency-type: indirect
  update-type: version-update:semver-patch
  dependency-group: crates
- dependency-name: tokio
  dependency-version: 1.45.0
  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-05-07 02:36:03 +06:00
dependabot[bot]
bf99cb50fd build(deps): bump the crates group across 1 directory with 4 updates (#364)
Bumps the crates group with 4 updates in the /userspace/ksud_overlayfs directory: rust-embed, [cc](https://github.com/rust-lang/cc-rs), [libm](https://github.com/rust-lang/compiler-builtins) and [tokio](https://github.com/tokio-rs/tokio).


Updates `rust-embed` from 8.7.0 to 8.7.1

Updates `cc` from 1.2.20 to 1.2.21
- [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.20...cc-v1.2.21)

Updates `libm` from 0.2.13 to 0.2.14
- [Release notes](https://github.com/rust-lang/compiler-builtins/releases)
- [Changelog](https://github.com/rust-lang/compiler-builtins/blob/master/.release-plz.toml)
- [Commits](https://github.com/rust-lang/compiler-builtins/compare/libm-v0.2.13...libm-v0.2.14)

Updates `tokio` from 1.44.2 to 1.45.0
- [Release notes](https://github.com/tokio-rs/tokio/releases)
- [Commits](https://github.com/tokio-rs/tokio/compare/tokio-1.44.2...tokio-1.45.0)

---
updated-dependencies:
- dependency-name: rust-embed
  dependency-version: 8.7.1
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: crates
- dependency-name: cc
  dependency-version: 1.2.21
  dependency-type: indirect
  update-type: version-update:semver-patch
  dependency-group: crates
- dependency-name: libm
  dependency-version: 0.2.14
  dependency-type: indirect
  update-type: version-update:semver-patch
  dependency-group: crates
- dependency-name: tokio
  dependency-version: 1.45.0
  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-05-07 02:35:26 +06:00
dependabot[bot]
1333f0113f build(deps): bump the maven group in /manager with 2 updates (#349)
Bumps the maven group in /manager with 2 updates: [io.github.raamcosta.compose-destinations:core](https://github.com/raamcosta/compose-destinations) and [io.github.raamcosta.compose-destinations:ksp](https://github.com/raamcosta/compose-destinations).


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

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

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

---
updated-dependencies:
- dependency-name: io.github.raamcosta.compose-destinations:core
  dependency-version: 2.1.1
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: maven
- dependency-name: io.github.raamcosta.compose-destinations:ksp
  dependency-version: 2.1.1
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: maven
- dependency-name: io.github.raamcosta.compose-destinations:ksp
  dependency-version: 2.1.1
  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-05-07 02:35:03 +06:00
igor
1b544bd22d Update Portuguese translation (#361) 2025-05-07 02:33:03 +06:00
mr_vokintos
24f514c949 Fixes for Russian translation (#358)
* Update README_RU.md

Donations added

* Update strings.xml

fix

* Update strings.xml

again

* Update README_RU.md

* Update Ru strings.xml

Fixes and additions

* Update README_RU.md

I didn't like the way it looked
2025-05-07 02:32:31 +06:00
Bachpooh
8eed26e0a1 manager: Update values-vi/strings.xml (#357)
* Corrects mistranslation
* Fix issues #335
2025-05-07 02:32:17 +06:00
luigimak
3c5b3f0a49 Update Italian translation (#355) 2025-05-07 02:32:03 +06:00
Caner Karaca
1d23b4bb67 ksud: fix rustfmt errors (#359) 2025-05-06 22:48:58 +06:00
Rifat Azad
48e533f660 ksud_overlayfs: removed custom_sparse_size text file extension 2025-05-04 19:39:06 +06:00
Der_Googler
86fbed60eb Add Eruda Support for WebUI X (#354)
* manager: Improvements

- Bump MMRL version
- Improved SwitchItem when it is not enabled
- Added option to enable eruda

* manager: Use custom user agent for WebUI X
2025-05-04 01:08:34 +06:00
dependabot[bot]
164341b543 build(deps): bump the crates group across 1 directory with 2 updates (#344)
Bumps the crates group with 2 updates in the /userspace/ksud_magic directory: [chrono](https://github.com/chronotope/chrono) and [sha2](https://github.com/RustCrypto/hashes).


Updates `chrono` from 0.4.40 to 0.4.41
- [Release notes](https://github.com/chronotope/chrono/releases)
- [Changelog](https://github.com/chronotope/chrono/blob/main/CHANGELOG.md)
- [Commits](https://github.com/chronotope/chrono/compare/v0.4.40...v0.4.41)

Updates `sha2` from 0.10.8 to 0.10.9
- [Commits](https://github.com/RustCrypto/hashes/compare/sha2-v0.10.8...sha2-v0.10.9)

---
updated-dependencies:
- dependency-name: chrono
  dependency-version: 0.4.41
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: crates
- dependency-name: sha2
  dependency-version: 0.10.9
  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-05-02 00:06:52 +06:00
dependabot[bot]
94942fe488 build(deps): bump the crates group across 1 directory with 2 updates (#343)
Bumps the crates group with 2 updates in the /userspace/ksud_overlayfs directory: [chrono](https://github.com/chronotope/chrono) and [sha2](https://github.com/RustCrypto/hashes).


Updates `chrono` from 0.4.40 to 0.4.41
- [Release notes](https://github.com/chronotope/chrono/releases)
- [Changelog](https://github.com/chronotope/chrono/blob/main/CHANGELOG.md)
- [Commits](https://github.com/chronotope/chrono/compare/v0.4.40...v0.4.41)

Updates `sha2` from 0.10.8 to 0.10.9
- [Commits](https://github.com/RustCrypto/hashes/compare/sha2-v0.10.8...sha2-v0.10.9)

---
updated-dependencies:
- dependency-name: chrono
  dependency-version: 0.4.41
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: crates
- dependency-name: sha2
  dependency-version: 0.10.9
  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-05-02 00:06:28 +06:00
dependabot[bot]
ca64f6c8ac build(deps): bump the maven group across 1 directory with 5 updates (#322)
Bumps the maven group with 5 updates in the /manager directory:

| Package | From | To |
| --- | --- | --- |
| androidx.compose:compose-bom | `2025.03.01` | `2025.04.00` |
| [org.jetbrains.kotlinx:kotlinx-coroutines-core](https://github.com/Kotlin/kotlinx.coroutines) | `1.10.1` | `1.10.2` |
| com.android.application | `8.9.1` | `8.9.2` |
| com.android.library | `8.9.1` | `8.9.2` |
| [com.google.devtools.ksp](https://github.com/google/ksp) | `2.1.20-1.0.32` | `2.1.20-2.0.0` |



Updates `androidx.compose:compose-bom` from 2025.03.01 to 2025.04.00

Updates `org.jetbrains.kotlinx:kotlinx-coroutines-core` from 1.10.1 to 1.10.2
- [Release notes](https://github.com/Kotlin/kotlinx.coroutines/releases)
- [Changelog](https://github.com/Kotlin/kotlinx.coroutines/blob/master/CHANGES.md)
- [Commits](https://github.com/Kotlin/kotlinx.coroutines/compare/1.10.1...1.10.2)

Updates `com.android.application` from 8.9.1 to 8.9.2

Updates `com.android.library` from 8.9.1 to 8.9.2

Updates `com.android.library` from 8.9.1 to 8.9.2

Updates `com.google.devtools.ksp` from 2.1.20-1.0.32 to 2.1.20-2.0.0
- [Release notes](https://github.com/google/ksp/releases)
- [Commits](https://github.com/google/ksp/compare/2.1.20-1.0.32...2.1.20-2.0.0)

---
updated-dependencies:
- dependency-name: androidx.compose:compose-bom
  dependency-version: 2025.04.00
  dependency-type: direct:production
  dependency-group: maven
- dependency-name: org.jetbrains.kotlinx:kotlinx-coroutines-core
  dependency-version: 1.10.2
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: maven
- dependency-name: com.android.application
  dependency-version: 8.9.2
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: maven
- dependency-name: com.android.library
  dependency-version: 8.9.2
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: maven
- dependency-name: com.android.library
  dependency-version: 8.9.2
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: maven
- dependency-name: com.google.devtools.ksp
  dependency-version: 2.1.20-2.0.0
  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-05-02 00:06:11 +06:00
luigimak
e8ef483098 Update italian translation (#342)
* Update values-it/strings.xml

Update Italian Translation

* Update italian translation
2025-05-02 00:05:16 +06:00
cvnertnc
85faf43fdd manager: Update values-tr/strings.xml (#334) 2025-05-02 00:04:14 +06:00
igor
09620c269e Update portuguese & english (#333) 2025-05-02 00:03:29 +06:00
itsaschoolbus
0c05a4c375 manager: Update WebUI X translation string for Vietnamese (#332) 2025-05-02 00:03:10 +06:00
Der_Googler
298aa7960e Improve Platform (#345)
* Add option to use WebUI X

- Added WebUI X from MMRL to KernelSU Next

* Some improvements

* Again some improvements

* Fix NPE

* Still not fixed

Use mappings from the action to decode the stacktrace

* bump mmrl

does still not work

* Works

* WORKS

* small fixes

* manager: only launch webui x when Platform.isAlive is `true`

* manager: disable "Use WebUI X" option when Platform.isAlive is `false`

* manager: improve app list loading

* manager: use system packageManager api

* ci: add spoofed manager workflow

* ci: add spoofed manager workflow

---------

Co-authored-by: rifsxd <rifat.44.azad.rifs@gmail.com>
Co-authored-by: Rifat Azad <33044977+rifsxd@users.noreply.github.com>
2025-05-01 20:24:00 +06:00
rifsxd
b112513df0 ci: add spoofed manager workflow 2025-05-01 19:52:36 +06:00
rifsxd
f19b5a453a ksud: changed deps repo to fetch from KernelSU-Next org 2025-05-01 17:29:08 +06:00
rifsxd
72e54653a2 ksud: disabled BootRestore command 2025-05-01 16:54:09 +06:00
rifsxd
5696d72a3f ksud: fix rustfmt errors 2025-05-01 16:47:20 +06:00
rifsxd
757d20166a manager: clean lkm remnants
ksud: clean clippy warnings
2025-05-01 16:30:09 +06:00
rifsxd
1336996129 manager: disabled KMI/LKM installation
manager: check if overlayfs is available to allow mount system switching
ksud: disabled KMI/LKM commands
ci: disabled LKM build workflow
ksud: removed ksuinit
2025-05-01 15:58:18 +06:00
Rifat Azad
4f35240203 ci/gki-kernel: run the sed command for BAZEL only if BUILD.bazel exists to avoid file not found error on non BAZEL kernel common tree 2025-05-01 11:48:41 +06:00
Rifat Azad
5565a6b3f8 ci: fix BAZEL build while remove protected module exports 2025-05-01 01:02:25 +06:00
Der_Googler
9dbe135e66 Fix Shortcuts in WebUI X (#339)
* manager: fix webui x shortcuts
2025-04-30 11:08:25 +06:00
rifsxd
fe5c031701 ci/gki-kernel: keep abi_gki_protected_exports to avoid BAZEL build errors 2025-04-29 01:30:48 +06:00
rifsxd
0511a90640 manager: fully optimize the broken/buggy bottom navbar 2025-04-28 23:25:52 +06:00
Re*Index. (ot_inc)
2c87dfbb35 Add Japanese README. (#320)
* Add Japanese README

* Update README.md

* Update README_JA.md
2025-04-28 01:56:00 +06:00
Caner Karaca
9b4d07008d ci: update workflows (#329) 2025-04-28 01:55:16 +06:00
Caner Karaca
c40218a919 manager: update gradle and NDK (#327)
* manager: update gradle

* manager: update NDK
2025-04-28 01:54:58 +06:00
Caner Karaca
0c410b87ec ksud: cargo lock file maintenance (#328) 2025-04-28 01:54:46 +06:00
rifsxd
114a07a440 manager: fixed buggy bottombar with a neat workaround 2025-04-28 00:14:29 +06:00
Der_Googler
babae3b2ad Add WebUI X (#316)
* Add option to use WebUI X

- Added WebUI X from MMRL to KernelSU Next

* Some improvements

* Again some improvements

* Fix NPE

* Still not fixed

Use mappings from the action to decode the stacktrace

* bump mmrl

does still not work

* Works

* WORKS

* small fixes
2025-04-27 22:01:25 +06:00
muhammadbahaa2001
a7a9f86a71 Updated Arabic (#312) 2025-04-25 20:15:46 +06:00
Aliza
c65fcd5133 Adding Persian Language (#305)
* Adding Persian Language

* Create app.yml

* Delete .github/workflows/app.yml
2025-04-17 21:40:59 +06:00
Oscar1640
b298b4203a Fix su --shell argument handling for ksud magic mount (#309)
Co-authored-by: Wang Han <416810799@qq.com>
2025-04-17 21:36:04 +06:00
onlymash
250310fc9f improve manager translations for zh-rCN (#300) 2025-04-13 22:35:11 +06:00
GMárton
89cf05d3a4 Added Hungarian translation (#284) 2025-04-09 01:10:13 +06:00
Rifat Azad
1d258196b1 CI: try uploading artifacts properly for release 2025-04-03 22:13:56 +06:00
rifsxd
63ebf730f9 manager: improved floating button for module & LKM flashing screen 2025-04-03 19:22:08 +06:00
dependabot[bot]
810889a964 build(deps): bump the crates group across 1 directory with 41 updates (#277)
Bumps the crates group with 31 updates in the /userspace/ksud_magic directory:

| Package | From | To |
| --- | --- | --- |
| [anyhow](https://github.com/dtolnay/anyhow) | `1.0.96` | `1.0.97` |
| [clap](https://github.com/clap-rs/clap) | `4.5.30` | `4.5.35` |
| [zip](https://github.com/zip-rs/zip2) | `2.2.2` | `2.5.0` |
| [log](https://github.com/rust-lang/log) | `0.4.26` | `0.4.27` |
| [env_logger](https://github.com/rust-cli/env_logger) | `0.11.6` | `0.11.8` |
| [serde_json](https://github.com/serde-rs/json) | `1.0.139` | `1.0.140` |
| [libc](https://github.com/rust-lang/libc) | `0.2.170` | `0.2.171` |
| [rust-embed](https://github.com/pyros2097/rust-embed) | `8.5.0` | `8.6.0` |
| [sha256](https://github.com/baoyachi/sha256-rs) | `1.5.0` | `1.6.0` |
| [tempfile](https://github.com/Stebalien/tempfile) | `3.17.1` | `3.19.1` |
| [chrono](https://github.com/chronotope/chrono) | `0.4.39` | `0.4.40` |
| [android_logger](https://github.com/rust-mobile/android_logger-rs) | `0.14.1` | `0.15.0` |
| [async-trait](https://github.com/dtolnay/async-trait) | `0.1.86` | `0.1.88` |
| [bytes](https://github.com/tokio-rs/bytes) | `1.10.0` | `1.10.1` |
| [cc](https://github.com/rust-lang/cc-rs) | `1.2.15` | `1.2.17` |
| [either](https://github.com/rayon-rs/either) | `1.14.0` | `1.15.0` |
| [flate2](https://github.com/rust-lang/flate2-rs) | `1.1.0` | `1.1.1` |
| [getrandom](https://github.com/rust-random/getrandom) | `0.3.1` | `0.3.2` |
| [iana-time-zone](https://github.com/strawlab/iana-time-zone) | `0.1.61` | `0.1.63` |
| [indexmap](https://github.com/indexmap-rs/indexmap) | `2.7.1` | `2.8.0` |
| [itoa](https://github.com/dtolnay/itoa) | `1.0.14` | `1.0.15` |
| [once_cell](https://github.com/matklad/once_cell) | `1.20.3` | `1.21.3` |
| [proc-macro2](https://github.com/dtolnay/proc-macro2) | `1.0.93` | `1.0.94` |
| [quote](https://github.com/dtolnay/quote) | `1.0.38` | `1.0.40` |
| [rustversion](https://github.com/dtolnay/rustversion) | `1.0.19` | `1.0.20` |
| [ryu](https://github.com/dtolnay/ryu) | `1.0.19` | `1.0.20` |
| [serde](https://github.com/serde-rs/serde) | `1.0.218` | `1.0.219` |
| [syn](https://github.com/dtolnay/syn) | `2.0.98` | `2.0.100` |
| [time](https://github.com/time-rs/time) | `0.3.37` | `0.3.41` |
| [tokio](https://github.com/tokio-rs/tokio) | `1.43.0` | `1.44.1` |
| [unicode-ident](https://github.com/dtolnay/unicode-ident) | `1.0.17` | `1.0.18` |



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

Updates `clap` from 4.5.30 to 4.5.35
- [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...clap_complete-v4.5.35)

Updates `zip` from 2.2.2 to 2.5.0
- [Release notes](https://github.com/zip-rs/zip2/releases)
- [Changelog](https://github.com/zip-rs/zip2/blob/master/CHANGELOG.md)
- [Commits](https://github.com/zip-rs/zip2/compare/v2.2.2...v2.5.0)

Updates `log` from 0.4.26 to 0.4.27
- [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.26...0.4.27)

Updates `env_logger` from 0.11.6 to 0.11.8
- [Release notes](https://github.com/rust-cli/env_logger/releases)
- [Changelog](https://github.com/rust-cli/env_logger/blob/main/CHANGELOG.md)
- [Commits](https://github.com/rust-cli/env_logger/compare/v0.11.6...v0.11.8)

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

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

Updates `rust-embed` from 8.5.0 to 8.6.0
- [Changelog](https://github.com/pyrossh/rust-embed/blob/master/changelog.md)
- [Commits](https://github.com/pyros2097/rust-embed/commits)

Updates `sha256` from 1.5.0 to 1.6.0
- [Release notes](https://github.com/baoyachi/sha256-rs/releases)
- [Commits](https://github.com/baoyachi/sha256-rs/compare/1.5.0...1.6.0)

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

Updates `chrono` from 0.4.39 to 0.4.40
- [Release notes](https://github.com/chronotope/chrono/releases)
- [Changelog](https://github.com/chronotope/chrono/blob/main/CHANGELOG.md)
- [Commits](https://github.com/chronotope/chrono/compare/v0.4.39...v0.4.40)

Updates `android_logger` from 0.14.1 to 0.15.0
- [Release notes](https://github.com/rust-mobile/android_logger-rs/releases)
- [Changelog](https://github.com/rust-mobile/android_logger-rs/blob/master/CHANGELOG.md)
- [Commits](https://github.com/rust-mobile/android_logger-rs/compare/0.14.1...v0.15.0)

Updates `android_log-sys` from 0.3.1 to 0.3.2
- [Commits](https://github.com/rust-mobile/android_log-sys-rs/commits)

Updates `async-trait` from 0.1.86 to 0.1.88
- [Release notes](https://github.com/dtolnay/async-trait/releases)
- [Commits](https://github.com/dtolnay/async-trait/compare/0.1.86...0.1.88)

Updates `bytes` from 1.10.0 to 1.10.1
- [Release notes](https://github.com/tokio-rs/bytes/releases)
- [Changelog](https://github.com/tokio-rs/bytes/blob/master/CHANGELOG.md)
- [Commits](https://github.com/tokio-rs/bytes/compare/v1.10.0...v1.10.1)

Updates `cc` from 1.2.15 to 1.2.17
- [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.15...cc-v1.2.17)

Updates `clap_builder` from 4.5.30 to 4.5.35
- [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.35)

Updates `clap_derive` from 4.5.28 to 4.5.32
- [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.28...v4.5.32)

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

Updates `flate2` from 1.1.0 to 1.1.1
- [Release notes](https://github.com/rust-lang/flate2-rs/releases)
- [Commits](https://github.com/rust-lang/flate2-rs/compare/1.1.0...1.1.1)

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

Updates `iana-time-zone` from 0.1.61 to 0.1.63
- [Changelog](https://github.com/strawlab/iana-time-zone/blob/main/CHANGELOG.md)
- [Commits](https://github.com/strawlab/iana-time-zone/compare/v0.1.61...v0.1.63)

Updates `indexmap` from 2.7.1 to 2.8.0
- [Changelog](https://github.com/indexmap-rs/indexmap/blob/main/RELEASES.md)
- [Commits](https://github.com/indexmap-rs/indexmap/compare/2.7.1...2.8.0)

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

Updates `once_cell` from 1.20.3 to 1.21.3
- [Changelog](https://github.com/matklad/once_cell/blob/master/CHANGELOG.md)
- [Commits](https://github.com/matklad/once_cell/compare/v1.20.3...v1.21.3)

Updates `proc-macro2` from 1.0.93 to 1.0.94
- [Release notes](https://github.com/dtolnay/proc-macro2/releases)
- [Commits](https://github.com/dtolnay/proc-macro2/compare/1.0.93...1.0.94)

Updates `quote` from 1.0.38 to 1.0.40
- [Release notes](https://github.com/dtolnay/quote/releases)
- [Commits](https://github.com/dtolnay/quote/compare/1.0.38...1.0.40)

Updates `rust-embed-impl` from 8.5.0 to 8.6.0
- [Changelog](https://github.com/pyrossh/rust-embed/blob/master/changelog.md)
- [Commits](https://github.com/pyros2097/rust-embed/commits)

Updates `rust-embed-utils` from 8.5.0 to 8.6.0
- [Changelog](https://github.com/pyrossh/rust-embed/blob/master/changelog.md)
- [Commits](https://github.com/pyros2097/rust-embed/commits)

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

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

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

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

Updates `syn` from 2.0.98 to 2.0.100
- [Release notes](https://github.com/dtolnay/syn/releases)
- [Commits](https://github.com/dtolnay/syn/compare/2.0.98...2.0.100)

Updates `time` from 0.3.37 to 0.3.41
- [Release notes](https://github.com/time-rs/time/releases)
- [Changelog](https://github.com/time-rs/time/blob/main/CHANGELOG.md)
- [Commits](https://github.com/time-rs/time/compare/v0.3.37...v0.3.41)

Updates `time-core` from 0.1.2 to 0.1.4
- [Release notes](https://github.com/time-rs/time/releases)
- [Changelog](https://github.com/time-rs/time/blob/main/CHANGELOG.md)
- [Commits](https://github.com/time-rs/time/commits)

Updates `tokio` from 1.43.0 to 1.44.1
- [Release notes](https://github.com/tokio-rs/tokio/releases)
- [Commits](https://github.com/tokio-rs/tokio/compare/tokio-1.43.0...tokio-1.44.1)

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

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

Updates `windows-core` from 0.52.0 to 0.61.0
- [Release notes](https://github.com/microsoft/windows-rs/releases)
- [Commits](https://github.com/microsoft/windows-rs/compare/0.52.0...0.61.0)

Updates `wit-bindgen-rt` from 0.33.0 to 0.39.0
- [Release notes](https://github.com/bytecodealliance/wit-bindgen/releases)
- [Commits](https://github.com/bytecodealliance/wit-bindgen/compare/v0.33.0...v0.39.0)

---
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: zip
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: crates
- dependency-name: log
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: crates
- dependency-name: env_logger
  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: rust-embed
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: crates
- dependency-name: sha256
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: crates
- dependency-name: tempfile
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: crates
- dependency-name: chrono
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: crates
- dependency-name: android_logger
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: crates
- dependency-name: android_log-sys
  dependency-type: indirect
  update-type: version-update:semver-patch
  dependency-group: crates
- dependency-name: async-trait
  dependency-type: indirect
  update-type: version-update:semver-patch
  dependency-group: crates
- dependency-name: bytes
  dependency-type: indirect
  update-type: version-update:semver-patch
  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: clap_derive
  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-patch
  dependency-group: crates
- dependency-name: getrandom
  dependency-type: indirect
  update-type: version-update:semver-patch
  dependency-group: crates
- dependency-name: iana-time-zone
  dependency-type: indirect
  update-type: version-update:semver-patch
  dependency-group: crates
- dependency-name: indexmap
  dependency-type: indirect
  update-type: version-update:semver-minor
  dependency-group: crates
- dependency-name: itoa
  dependency-type: indirect
  update-type: version-update:semver-patch
  dependency-group: crates
- dependency-name: once_cell
  dependency-type: indirect
  update-type: version-update:semver-minor
  dependency-group: crates
- dependency-name: proc-macro2
  dependency-type: indirect
  update-type: version-update:semver-patch
  dependency-group: crates
- dependency-name: quote
  dependency-type: indirect
  update-type: version-update:semver-patch
  dependency-group: crates
- dependency-name: rust-embed-impl
  dependency-type: indirect
  update-type: version-update:semver-minor
  dependency-group: crates
- dependency-name: rust-embed-utils
  dependency-type: indirect
  update-type: version-update:semver-minor
  dependency-group: crates
- dependency-name: rustversion
  dependency-type: indirect
  update-type: version-update:semver-patch
  dependency-group: crates
- dependency-name: ryu
  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: syn
  dependency-type: indirect
  update-type: version-update:semver-patch
  dependency-group: crates
- dependency-name: time
  dependency-type: indirect
  update-type: version-update:semver-patch
  dependency-group: crates
- dependency-name: time-core
  dependency-type: indirect
  update-type: version-update:semver-patch
  dependency-group: crates
- dependency-name: tokio
  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
- dependency-name: wasi
  dependency-type: indirect
  update-type: version-update:semver-minor
  dependency-group: crates
- dependency-name: windows-core
  dependency-type: indirect
  update-type: version-update:semver-minor
  dependency-group: crates
- dependency-name: wit-bindgen-rt
  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-04-03 17:29:00 +06:00
dependabot[bot]
0a97eee7ad build(deps): bump the crates group across 1 directory with 41 updates (#276)
Bumps the crates group with 31 updates in the /userspace/ksud_overlayfs directory:

| Package | From | To |
| --- | --- | --- |
| [anyhow](https://github.com/dtolnay/anyhow) | `1.0.96` | `1.0.97` |
| [clap](https://github.com/clap-rs/clap) | `4.5.31` | `4.5.35` |
| [zip](https://github.com/zip-rs/zip2) | `2.2.2` | `2.5.0` |
| [log](https://github.com/rust-lang/log) | `0.4.26` | `0.4.27` |
| [env_logger](https://github.com/rust-cli/env_logger) | `0.11.6` | `0.11.8` |
| [serde_json](https://github.com/serde-rs/json) | `1.0.139` | `1.0.140` |
| [libc](https://github.com/rust-lang/libc) | `0.2.170` | `0.2.171` |
| [rust-embed](https://github.com/pyros2097/rust-embed) | `8.5.0` | `8.6.0` |
| [sha256](https://github.com/baoyachi/sha256-rs) | `1.5.0` | `1.6.0` |
| [tempfile](https://github.com/Stebalien/tempfile) | `3.17.1` | `3.19.1` |
| [chrono](https://github.com/chronotope/chrono) | `0.4.39` | `0.4.40` |
| [android_logger](https://github.com/rust-mobile/android_logger-rs) | `0.14.1` | `0.15.0` |
| [async-trait](https://github.com/dtolnay/async-trait) | `0.1.86` | `0.1.88` |
| [bytes](https://github.com/tokio-rs/bytes) | `1.10.0` | `1.10.1` |
| [cc](https://github.com/rust-lang/cc-rs) | `1.2.15` | `1.2.17` |
| [either](https://github.com/rayon-rs/either) | `1.14.0` | `1.15.0` |
| [flate2](https://github.com/rust-lang/flate2-rs) | `1.1.0` | `1.1.1` |
| [getrandom](https://github.com/rust-random/getrandom) | `0.3.1` | `0.3.2` |
| [iana-time-zone](https://github.com/strawlab/iana-time-zone) | `0.1.61` | `0.1.63` |
| [indexmap](https://github.com/indexmap-rs/indexmap) | `2.7.1` | `2.8.0` |
| [itoa](https://github.com/dtolnay/itoa) | `1.0.14` | `1.0.15` |
| [once_cell](https://github.com/matklad/once_cell) | `1.20.3` | `1.21.3` |
| [proc-macro2](https://github.com/dtolnay/proc-macro2) | `1.0.93` | `1.0.94` |
| [quote](https://github.com/dtolnay/quote) | `1.0.38` | `1.0.40` |
| [rustversion](https://github.com/dtolnay/rustversion) | `1.0.19` | `1.0.20` |
| [ryu](https://github.com/dtolnay/ryu) | `1.0.19` | `1.0.20` |
| [serde](https://github.com/serde-rs/serde) | `1.0.218` | `1.0.219` |
| [syn](https://github.com/dtolnay/syn) | `2.0.98` | `2.0.100` |
| [time](https://github.com/time-rs/time) | `0.3.37` | `0.3.41` |
| [tokio](https://github.com/tokio-rs/tokio) | `1.43.0` | `1.44.1` |
| [unicode-ident](https://github.com/dtolnay/unicode-ident) | `1.0.17` | `1.0.18` |



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

Updates `clap` from 4.5.31 to 4.5.35
- [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.31...clap_complete-v4.5.35)

Updates `zip` from 2.2.2 to 2.5.0
- [Release notes](https://github.com/zip-rs/zip2/releases)
- [Changelog](https://github.com/zip-rs/zip2/blob/master/CHANGELOG.md)
- [Commits](https://github.com/zip-rs/zip2/compare/v2.2.2...v2.5.0)

Updates `log` from 0.4.26 to 0.4.27
- [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.26...0.4.27)

Updates `env_logger` from 0.11.6 to 0.11.8
- [Release notes](https://github.com/rust-cli/env_logger/releases)
- [Changelog](https://github.com/rust-cli/env_logger/blob/main/CHANGELOG.md)
- [Commits](https://github.com/rust-cli/env_logger/compare/v0.11.6...v0.11.8)

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

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

Updates `rust-embed` from 8.5.0 to 8.6.0
- [Changelog](https://github.com/pyrossh/rust-embed/blob/master/changelog.md)
- [Commits](https://github.com/pyros2097/rust-embed/commits)

Updates `sha256` from 1.5.0 to 1.6.0
- [Release notes](https://github.com/baoyachi/sha256-rs/releases)
- [Commits](https://github.com/baoyachi/sha256-rs/compare/1.5.0...1.6.0)

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

Updates `chrono` from 0.4.39 to 0.4.40
- [Release notes](https://github.com/chronotope/chrono/releases)
- [Changelog](https://github.com/chronotope/chrono/blob/main/CHANGELOG.md)
- [Commits](https://github.com/chronotope/chrono/compare/v0.4.39...v0.4.40)

Updates `android_logger` from 0.14.1 to 0.15.0
- [Release notes](https://github.com/rust-mobile/android_logger-rs/releases)
- [Changelog](https://github.com/rust-mobile/android_logger-rs/blob/master/CHANGELOG.md)
- [Commits](https://github.com/rust-mobile/android_logger-rs/compare/0.14.1...v0.15.0)

Updates `android_log-sys` from 0.3.1 to 0.3.2
- [Commits](https://github.com/rust-mobile/android_log-sys-rs/commits)

Updates `async-trait` from 0.1.86 to 0.1.88
- [Release notes](https://github.com/dtolnay/async-trait/releases)
- [Commits](https://github.com/dtolnay/async-trait/compare/0.1.86...0.1.88)

Updates `bytes` from 1.10.0 to 1.10.1
- [Release notes](https://github.com/tokio-rs/bytes/releases)
- [Changelog](https://github.com/tokio-rs/bytes/blob/master/CHANGELOG.md)
- [Commits](https://github.com/tokio-rs/bytes/compare/v1.10.0...v1.10.1)

Updates `cc` from 1.2.15 to 1.2.17
- [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.15...cc-v1.2.17)

Updates `clap_builder` from 4.5.31 to 4.5.35
- [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.31...v4.5.35)

Updates `clap_derive` from 4.5.28 to 4.5.32
- [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.28...v4.5.32)

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

Updates `flate2` from 1.1.0 to 1.1.1
- [Release notes](https://github.com/rust-lang/flate2-rs/releases)
- [Commits](https://github.com/rust-lang/flate2-rs/compare/1.1.0...1.1.1)

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

Updates `iana-time-zone` from 0.1.61 to 0.1.63
- [Changelog](https://github.com/strawlab/iana-time-zone/blob/main/CHANGELOG.md)
- [Commits](https://github.com/strawlab/iana-time-zone/compare/v0.1.61...v0.1.63)

Updates `indexmap` from 2.7.1 to 2.8.0
- [Changelog](https://github.com/indexmap-rs/indexmap/blob/main/RELEASES.md)
- [Commits](https://github.com/indexmap-rs/indexmap/compare/2.7.1...2.8.0)

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

Updates `once_cell` from 1.20.3 to 1.21.3
- [Changelog](https://github.com/matklad/once_cell/blob/master/CHANGELOG.md)
- [Commits](https://github.com/matklad/once_cell/compare/v1.20.3...v1.21.3)

Updates `proc-macro2` from 1.0.93 to 1.0.94
- [Release notes](https://github.com/dtolnay/proc-macro2/releases)
- [Commits](https://github.com/dtolnay/proc-macro2/compare/1.0.93...1.0.94)

Updates `quote` from 1.0.38 to 1.0.40
- [Release notes](https://github.com/dtolnay/quote/releases)
- [Commits](https://github.com/dtolnay/quote/compare/1.0.38...1.0.40)

Updates `rust-embed-impl` from 8.5.0 to 8.6.0
- [Changelog](https://github.com/pyrossh/rust-embed/blob/master/changelog.md)
- [Commits](https://github.com/pyros2097/rust-embed/commits)

Updates `rust-embed-utils` from 8.5.0 to 8.6.0
- [Changelog](https://github.com/pyrossh/rust-embed/blob/master/changelog.md)
- [Commits](https://github.com/pyros2097/rust-embed/commits)

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

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

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

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

Updates `syn` from 2.0.98 to 2.0.100
- [Release notes](https://github.com/dtolnay/syn/releases)
- [Commits](https://github.com/dtolnay/syn/compare/2.0.98...2.0.100)

Updates `time` from 0.3.37 to 0.3.41
- [Release notes](https://github.com/time-rs/time/releases)
- [Changelog](https://github.com/time-rs/time/blob/main/CHANGELOG.md)
- [Commits](https://github.com/time-rs/time/compare/v0.3.37...v0.3.41)

Updates `time-core` from 0.1.2 to 0.1.4
- [Release notes](https://github.com/time-rs/time/releases)
- [Changelog](https://github.com/time-rs/time/blob/main/CHANGELOG.md)
- [Commits](https://github.com/time-rs/time/commits)

Updates `tokio` from 1.43.0 to 1.44.1
- [Release notes](https://github.com/tokio-rs/tokio/releases)
- [Commits](https://github.com/tokio-rs/tokio/compare/tokio-1.43.0...tokio-1.44.1)

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

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

Updates `windows-core` from 0.52.0 to 0.61.0
- [Release notes](https://github.com/microsoft/windows-rs/releases)
- [Commits](https://github.com/microsoft/windows-rs/compare/0.52.0...0.61.0)

Updates `wit-bindgen-rt` from 0.33.0 to 0.39.0
- [Release notes](https://github.com/bytecodealliance/wit-bindgen/releases)
- [Commits](https://github.com/bytecodealliance/wit-bindgen/compare/v0.33.0...v0.39.0)

---
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: zip
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: crates
- dependency-name: log
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: crates
- dependency-name: env_logger
  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: rust-embed
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: crates
- dependency-name: sha256
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: crates
- dependency-name: tempfile
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: crates
- dependency-name: chrono
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: crates
- dependency-name: android_logger
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: crates
- dependency-name: android_log-sys
  dependency-type: indirect
  update-type: version-update:semver-patch
  dependency-group: crates
- dependency-name: async-trait
  dependency-type: indirect
  update-type: version-update:semver-patch
  dependency-group: crates
- dependency-name: bytes
  dependency-type: indirect
  update-type: version-update:semver-patch
  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: clap_derive
  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-patch
  dependency-group: crates
- dependency-name: getrandom
  dependency-type: indirect
  update-type: version-update:semver-patch
  dependency-group: crates
- dependency-name: iana-time-zone
  dependency-type: indirect
  update-type: version-update:semver-patch
  dependency-group: crates
- dependency-name: indexmap
  dependency-type: indirect
  update-type: version-update:semver-minor
  dependency-group: crates
- dependency-name: itoa
  dependency-type: indirect
  update-type: version-update:semver-patch
  dependency-group: crates
- dependency-name: once_cell
  dependency-type: indirect
  update-type: version-update:semver-minor
  dependency-group: crates
- dependency-name: proc-macro2
  dependency-type: indirect
  update-type: version-update:semver-patch
  dependency-group: crates
- dependency-name: quote
  dependency-type: indirect
  update-type: version-update:semver-patch
  dependency-group: crates
- dependency-name: rust-embed-impl
  dependency-type: indirect
  update-type: version-update:semver-minor
  dependency-group: crates
- dependency-name: rust-embed-utils
  dependency-type: indirect
  update-type: version-update:semver-minor
  dependency-group: crates
- dependency-name: rustversion
  dependency-type: indirect
  update-type: version-update:semver-patch
  dependency-group: crates
- dependency-name: ryu
  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: syn
  dependency-type: indirect
  update-type: version-update:semver-patch
  dependency-group: crates
- dependency-name: time
  dependency-type: indirect
  update-type: version-update:semver-patch
  dependency-group: crates
- dependency-name: time-core
  dependency-type: indirect
  update-type: version-update:semver-patch
  dependency-group: crates
- dependency-name: tokio
  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
- dependency-name: wasi
  dependency-type: indirect
  update-type: version-update:semver-minor
  dependency-group: crates
- dependency-name: windows-core
  dependency-type: indirect
  update-type: version-update:semver-minor
  dependency-group: crates
- dependency-name: wit-bindgen-rt
  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-04-03 17:28:48 +06:00
dependabot[bot]
cc8f0e456a build(deps): bump the maven group across 1 directory with 10 updates (#253)
Bumps the maven group with 10 updates in the /manager directory:

| Package | From | To |
| --- | --- | --- |
| androidx.navigation:navigation-compose | `2.8.8` | `2.8.9` |
| androidx.compose:compose-bom | `2025.02.00` | `2025.03.00` |
| androidx.webkit:webkit | `1.12.1` | `1.13.0` |
| [io.github.raamcosta.compose-destinations:core](https://github.com/raamcosta/compose-destinations) | `2.1.0-beta16` | `2.1.0` |
| [io.github.raamcosta.compose-destinations:ksp](https://github.com/raamcosta/compose-destinations) | `2.1.0-beta16` | `2.1.0` |
| com.android.application | `8.8.2` | `8.9.0` |
| com.android.library | `8.8.2` | `8.9.0` |
| [org.jetbrains.kotlin.android](https://github.com/JetBrains/kotlin) | `2.1.10` | `2.1.20` |
| [org.jetbrains.kotlin.plugin.compose](https://github.com/JetBrains/kotlin) | `2.1.10` | `2.1.20` |
| [com.google.devtools.ksp](https://github.com/google/ksp) | `2.1.10-1.0.31` | `2.1.20-1.0.31` |



Updates `androidx.navigation:navigation-compose` from 2.8.8 to 2.8.9

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

Updates `androidx.webkit:webkit` from 1.12.1 to 1.13.0

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

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

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

Updates `com.android.application` from 8.8.2 to 8.9.0

Updates `com.android.library` from 8.8.2 to 8.9.0

Updates `com.android.library` from 8.8.2 to 8.9.0

Updates `org.jetbrains.kotlin.android` from 2.1.10 to 2.1.20
- [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.10...v2.1.20)

Updates `org.jetbrains.kotlin.plugin.compose` from 2.1.10 to 2.1.20
- [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.10...v2.1.20)

Updates `org.jetbrains.kotlin.plugin.compose` from 2.1.10 to 2.1.20
- [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.10...v2.1.20)

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

---
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: androidx.webkit:webkit
  dependency-type: direct:production
  update-type: version-update:semver-minor
  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: com.android.application
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: maven
- dependency-name: com.android.library
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: maven
- dependency-name: com.android.library
  dependency-type: direct:production
  update-type: version-update:semver-minor
  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-04-03 17:28:36 +06:00
Kangmin Kim
0f7e8d3214 Update Korean strings.xml (#280) 2025-04-03 15:50:34 +06:00
igor
2c193e0dd4 Update portuguese translation (#279)
* manager: improved mount system info fetching logic

* Update portuguese translation

---------

Co-authored-by: rifsxd <rifat.44.azad.rifs@gmail.com>
Co-authored-by: Rifat Azad <33044977+rifsxd@users.noreply.github.com>
2025-04-03 15:50:21 +06:00
Rifat Azad
2512239ea7 ksud_overlayfs: fixed rust formatting error 2025-04-03 15:13:21 +06:00
cvnertnc
6f6b797e22 Update values-tr/strings.xml (#278)
* manager: improved mount system info fetching logic

* Update values-tr/strings.xml

---------

Co-authored-by: rifsxd <rifat.44.azad.rifs@gmail.com>
Co-authored-by: Rifat Azad <33044977+rifsxd@users.noreply.github.com>
2025-04-03 02:28:03 +06:00
the slaytanic one~
d5f25590a5 Added Bulgaran Readme + Fix my older writing style of the bulgarian translatation in strings.xml (#273)
* Added Bulgaran Readme (By boyan)

* manager: improved mount system info fetching logic

* UPDATE BULGARIAN STRINGS.xml

no questions asked

---------

Co-authored-by: rifsxd <rifat.44.azad.rifs@gmail.com>
Co-authored-by: Rifat Azad <33044977+rifsxd@users.noreply.github.com>
2025-04-03 01:36:42 +06:00
Nhật Minh
bf81c9a17b Update strings.xml (#270)
update vietnamese

Co-authored-by: Rifat Azad <33044977+rifsxd@users.noreply.github.com>
2025-04-03 01:35:50 +06:00
rifsxd
5cec5aa656 manager: improved mount system info fetching logic 2025-04-03 00:21:53 +06:00
rifsxd
02dbb7d0f7 ksud: added module mount command to check current mount system enabled 2025-04-02 15:12:44 +06:00
rifsxd
c5aa6ffffc manager: module & allowlist backup directory changed to /data/adb/ksu/
manager: placed export logs list item to the bottom
2025-04-02 14:46:23 +06:00
rifsxd
335ea3190f docs: removed redundant web page 2025-04-02 14:11:22 +06:00
5ec1cff
35c98aee76 Fix off-by-one when iterating dir (#2530)
Fix https://github.com/tiann/KernelSU/issues/2528
2025-04-02 14:09:44 +06:00
Wang Han
dc992818de Fix su --shell argument handling (#2529)
This fixes https://github.com/tiann/KernelSU/issues/2523.
2025-04-02 14:09:34 +06:00
Wang Han
dfea38e0f2 Skip staging package when searching manager (#2511) 2025-04-02 14:09:22 +06:00
ZGX089
6452427b6c Added Arabic translation (#267) 2025-03-30 01:46:24 +06:00
Caner Karaca
feb3c47bdc Fix formatting (#266) 2025-03-30 01:46:06 +06:00
kam821
de44373599 Update Polish translation (#264)
- Added settings_language translation
2025-03-27 22:20:21 +06:00
luigimak
4bd7e7cc9f Update values-it/strings.xml (#261)
Update Italian Translation
2025-03-27 22:20:04 +06:00
igor
39014fb89c Update portuguese translation (#260) 2025-03-27 00:56:09 +06:00
AJleKcAHgP68
eeecbf255a Update Ru translate (#256) 2025-03-27 00:55:51 +06:00
Saksham Singla
11e4729519 Update README.md (#262)
Changed Installation Instructions Link according to new website ksunext.org
2025-03-27 00:55:33 +06:00
kam821
f3093eace6 Add Polish documentation (#249)
- Added README_PL.md
- Added link to Polish version in other language versions
2025-03-24 22:15:16 +06:00
rifsxd
3a7edf48bf manager: remove beta warning for mount system switch 2025-03-23 23:27:10 +06:00
rifsxd
de189fe426 ksud_overlayfs: ability to specify custom sparse image size 2025-03-23 23:15:47 +06:00
rifsxd
30835787c9 Revert "ksud: determine modules's size by checking partion size"
This reverts commit c40bfd694c.
2025-03-23 22:38:01 +06:00
mr_vokintos
9fc1bd1876 Update README_RU.md (#248)
Donations added
2025-03-23 17:53:45 +06:00
AxelPLN(Axel Yinjia Huang)
a223781fae improve manager translations for zh-rCN & zh-rTW (#247)
* add README_TW

* Update README_CN.md

* add Simplified Chinese for website

add Simplified Chinese for website

fix some mistakes in README_CN

* Update zh/devices.html

* Update zh/features.html

* Update zh/devices.html

* Update zh/features.html

* Update zh/index.html

* Add Traditional Chinese translation for manager

* Try to add switching function for website

* fix manager translations for zh-rCH & zh-rTW

* try to add language switcher for manager

* try to add language switcher for manager

* try to add language switching function for manager app

* try to add language switching function for manager app

* try to add language switching function for manager app

* discard invalid changes
2025-03-23 17:50:22 +06:00
kam821
2a154c1985 Update Polish translation - SUSFS/sus_su (#243)
Added SUSFS/sus_su strings translation
2025-03-23 17:49:05 +06:00
luigimak
110b8e92dc Update Italian Translation (#242)
* Update values-it/strings.xml

Update Italian translation

* Added Italian link README_IT.md

* Added Italian link README_IT.md

* Added Italian link README_IT.md

* Added Italian link README_IT.md

* Added Italian link README_IT.md

* Added Italian link README_IT.md

* Added Italian link README_IT.md

* Added Italian link README_IT.md

* Added Italian link README_IT.md

* Added Italian link README_IT.md

* Added Italian link README_IT.md

* Create README_IT.md

Create Italian README
2025-03-23 17:48:37 +06:00
igor
3b87014bf9 Update Portuguese Brazilian translation (#240) 2025-03-23 17:47:27 +06:00
AJleKcAHgP68
bd0bcc4337 Russian translation updated (#239) 2025-03-23 17:46:24 +06:00
the slaytanic one~
916f8151ea UPDATE BG translation...thats all (#237)
* Create strings.xml

* UPDATE BULGARIAN XD
2025-03-23 17:45:24 +06:00
rifsxd
59ca8fa2c2 manager: susfs and sus_su status now global strings 2025-03-16 00:50:57 +06:00
AJleKcAHgP68
238f2ee008 Update Ru strings.xml (#234)
Update Ru string
2025-03-14 16:47:45 +06:00
kam821
7eaf37bc4a Update Polish Translation (#229)
* Update Polish Translation - UpdateJson

UpdateJson in this context doesn't mean 'update the json file', but 'a link to a JSON file that contains info so manager can update the module'.
It is also a field described in the Magisk documentation, so it's best to leave the original form.

* Update Polish Translation - Export logs

Mostly a cosmetic change, should fit better with the other options in the settings menu
2025-03-14 16:47:27 +06:00
JuicerV3
022ee4bb1c README_TH: Update Thai translation (#224) 2025-03-14 16:47:07 +06:00
Ksawlii
d209dc087e Update selinux strings in values-pl (#218)
Signed-off-by: Ksawlii <ksawery.blaszczak@proton.me>
2025-03-14 16:46:39 +06:00
rifsxd
d79ea50c6e Revert "ksud_magic: probe for more workdir candidates (#221)"
This reverts commit a68b4fe7e0.
2025-03-11 23:31:30 +06:00
rifsxd
d8944d641c ksud_magic: reformat rust codes 2025-03-10 23:51:02 +06:00
Wang Han
1c9705fdd0 Set KSU_APP_PROFILE_VER for shell (#2481)
This reverts commit bd24044ec3.
2025-03-10 22:16:22 +06:00
AlexLiuDev233
f369297be9 kernel: fix sometimes sucompat can not toggle by manager (#2484)
When the manager is already running, if other programs / kernel toggle
the sucompat enable status,
The manager "Disable SU Compat" toggle button can not work, kmesg print
"cmd enable su but no need to change."

I think we should still return reply_ok when the syscall value is
consistent with the kernel, which would fix the issue.
2025-03-10 22:16:03 +06:00
backslashxx
a68b4fe7e0 ksud_magic: probe for more workdir candidates (#221)
- reuses old ksu functions
- makes sure its an empty dir
- adapted from https://github.com/rsuntk/KernelSU/commit/141f010 71cb86c2e9

Co-authored-by: powellnorma <101364699+powellnorma@users.noreply.github.com>
Co-authored-by: Rissu <90097027+rsuntk@users.noreply.github.com>
2025-03-09 14:48:24 +06:00
kam821
52399f7fd1 Update Polish Translation (#212)
- Fixed incorrect translations
- Unified nomenclature
- Added splitting to preserve both forms where needed
2025-03-09 14:33:48 +06:00
backslashxx
7218a504c9 kernel: ksud: add ksu_handle_execve_ksud (#217)
adapted from sys_execve_handler_pre()
upstream, https://github.com/tiann/KernelSU/commit/2027ac3

this completes the puzzle where all hooks are on syscalls

ksu_handle_execve_ksud
- sets argv to __argv, dunno what this is for, I just copied.
- creates dummy struct `filename_in` to store filename in `filename_in.name`
- strncpy filename to path, assign path to .name
- simply a shim for ksu_handle_execveat_ksud

usage: `ksu_handle_execve_ksud(filename, argv);` on sys_execve

tested on 4.14, 6.1

Tested-by: selfmusing <mirandamehek@gmail.com>
Tested-by: Adam W. Willis <return.of.octobot@gmail.com>

Signed-off-by: backslashxx <118538522+backslashxx@users.noreply.github.com>
Co-authored-by: Another Guy <25584417+anotherjin@users.noreply.github.com>
2025-03-09 14:33:26 +06:00
luigimak
9d5999c8c3 Create values-it/strings.xml (#208)
Italian translation
2025-03-08 10:41:51 +06:00
the slaytanic one~
204805852c Create strings.xml (#205) 2025-03-05 01:22:08 +06:00
xradens
36b42e611e Update Bahasa Indonesia Translation (#203)
Fixed some translations
2025-03-03 20:54:24 +06:00
dependabot[bot]
c50bbd32aa build(deps): bump the maven group across 1 directory with 5 updates (#201)
Bumps the maven group with 5 updates in the /manager directory:

| Package | From | To |
| --- | --- | --- |
| androidx.activity:activity-compose | `1.10.0` | `1.10.1` |
| androidx.navigation:navigation-compose | `2.8.7` | `2.8.8` |
| com.android.application | `8.8.1` | `8.8.2` |
| com.android.library | `8.8.1` | `8.8.2` |
| [com.google.devtools.ksp](https://github.com/google/ksp) | `2.1.10-1.0.30` | `2.1.10-1.0.31` |



Updates `androidx.activity:activity-compose` from 1.10.0 to 1.10.1

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

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

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

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

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

---
updated-dependencies:
- dependency-name: androidx.activity:activity-compose
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: maven
- dependency-name: androidx.navigation:navigation-compose
  dependency-type: direct:production
  update-type: version-update:semver-patch
  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-03-03 20:54:11 +06:00
Anaël
d2f6d00327 manager: translations: Update french translations (#198)
* manager: translations: Update french translations

* Fixed typos
* Added su compat translations
* Added allowlist backup/restore translations
* Added about source code translation

* manager: translations: fix typo

* This was missed in commit 4097d55716

* manager: translations: fix another typo

* i really have to get some sleep duh im tired
2025-03-02 01:20:57 +06:00
rifsxd
c9e4c8e186 manager: remove unnecessary isManager definition in Settings screen 2025-02-28 01:40:28 +06:00
Wang Han
3a6c30fba1 Avoid popping back stack right after navigation (#2477)
This fixes https://github.com/tiann/KernelSU/issues/2462.
2025-02-28 00:50:50 +06:00
rifsxd
d5d4304120 manager: hide su related settings screen items if ksuVersion is null 2025-02-28 00:35:13 +06:00
rifsxd
4eac2f783e manager: change MINIMAL_SUPPORTED_SU_COMPAT to 12404 (where disable su compat feature was fully implemented) 2025-02-28 00:25:59 +06:00
rifsxd
2cc765ee0a manager: add back navigation to BackupRestore screen 2025-02-28 00:22:37 +06:00
cvnertnc
453524d382 Update values-tr/strings.xml (#195) 2025-02-27 03:33:34 +06:00
Mateusz Chrząszcz
fccc3db5c5 Update strings.xml fix, update (#194) 2025-02-26 03:10:27 +06:00
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
155 changed files with 6366 additions and 2369 deletions

View File

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

View File

@@ -7,9 +7,9 @@ jobs:
uses: ./.github/workflows/gki-kernel.yml
with:
version: android12-5.10
version_name: android12-5.10.226
tag: android12-5.10-2024-11
os_patch_level: 2024-11
version_name: android12-5.10.233
tag: android12-5.10-2025-02
os_patch_level: 2025-02
patch_path: "5.10"
debug: true
build-debug-kernel-a13:
@@ -17,11 +17,11 @@ jobs:
matrix:
include:
- version: "5.10"
sub_level: 223
os_patch_level: 2024-11
sub_level: 234
os_patch_level: 2025-03
- version: "5.15"
sub_level: 167
os_patch_level: 2024-11
sub_level: 178
os_patch_level: 2025-03
uses: ./.github/workflows/gki-kernel.yml
with:
version: android13-${{ matrix.version }}
@@ -34,11 +34,11 @@ jobs:
matrix:
include:
- version: "5.15"
sub_level: 167
os_patch_level: 2024-11
sub_level: 178
os_patch_level: 2025-03
- version: "6.1"
sub_level: 115
os_patch_level: 2024-12
sub_level: 129
os_patch_level: 2025-04
uses: ./.github/workflows/gki-kernel.yml
with:
version: android14-${{ matrix.version }}
@@ -51,8 +51,8 @@ jobs:
matrix:
include:
- version: "6.6"
sub_level: 57
os_patch_level: 2024-12
sub_level: 82
os_patch_level: 2025-04
uses: ./.github/workflows/gki-kernel.yml
with:
version: android15-${{ matrix.version }}

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@@ -1,4 +1,4 @@
name: Build Manager
name: Build Manager CI
on:
push:
@@ -13,60 +13,49 @@ on:
pull_request:
branches: [ "next" ]
paths:
- '.github/workflows/build-manager-ci.yml'
- 'manager/**'
workflow_call:
workflow_dispatch:
jobs:
build-lkm:
uses: ./.github/workflows/build-lkm.yml
secrets: inherit
# build-lkm:
# uses: ./.github/workflows/build-lkm.yml
# secrets: inherit
build-susfsd:
needs: build-lkm
# needs: build-lkm
strategy:
matrix:
include:
- target: aarch64-linux-android
os: ubuntu-latest
- os: ubuntu-latest
uses: ./.github/workflows/susfsd.yml
with:
target: ${{ matrix.target }}
os: ${{ matrix.os }}
build-ksud_overlayfs:
build-ksud:
needs: build-susfsd
strategy:
matrix:
include:
- target: aarch64-linux-android
os: ubuntu-latest
uses: ./.github/workflows/ksud_overlayfs.yml
with:
target: ${{ matrix.target }}
os: ${{ matrix.os }}
build-ksud_magic:
needs: build-ksud_overlayfs
strategy:
matrix:
include:
- target: aarch64-linux-android
- target: armv7-linux-androideabi
os: ubuntu-latest
uses: ./.github/workflows/ksud_magic.yml
uses: ./.github/workflows/ksud.yml
with:
target: ${{ matrix.target }}
os: ${{ matrix.os }}
build-manager:
needs: build-ksud_magic
needs: build-ksud
runs-on: ubuntu-latest
defaults:
run:
working-directory: ./manager
steps:
- name: Checkout
- name: Checkout Repository
uses: actions/checkout@v4
with:
fetch-depth: 0
@@ -80,7 +69,7 @@ jobs:
echo "UPLOAD=false" >> $GITHUB_OUTPUT
fi
- name: Write key
- name: Write Key
run: |
if [ ! -z "${{ secrets.KEYSTORE }}" ]; then
{
@@ -101,40 +90,55 @@ jobs:
- name: Setup Gradle
uses: gradle/actions/setup-gradle@v4
- name: Setup Android SDK
uses: android-actions/setup-android@v3
- name: Download arm64 susfsd
- name: Download susfsd
uses: actions/download-artifact@v4
with:
name: susfsd-aarch64-linux-android
name: susfsd-linux-android
path: .
- name: Copy susfsd to app jniLibs
run: |
mkdir -p app/src/main/jniLibs/arm64-v8a
cp -f ../arm64-v8a/susfsd ../manager/app/src/main/jniLibs/arm64-v8a/libsusfsd.so
mkdir -p app/src/main/jniLibs/armeabi-v7a
cp -f ../armeabi-v7a/susfsd ../manager/app/src/main/jniLibs/armeabi-v7a/libsusfsd.so
- name: Download arm64 ksud_overlayfs
uses: actions/download-artifact@v4
with:
name: ksud_overlayfs-aarch64-linux-android
path: ksud_overlayfs
- name: Download arm ksud_overlayfs
uses: actions/download-artifact@v4
with:
name: ksud_overlayfs-armv7-linux-androideabi
path: ksud_overlayfs
- name: Copy ksud_overlayfs to app jniLibs
run: |
cp -f ../ksud_overlayfs/aarch64-linux-android/release/ksud ../manager/app/src/main/jniLibs/arm64-v8a/libksud_overlayfs.so
cp -f ../ksud_overlayfs/armv7-linux-androideabi/release/ksud ../manager/app/src/main/jniLibs/armeabi-v7a/libksud_overlayfs.so
- name: Download arm64 ksud_magic
uses: actions/download-artifact@v4
with:
name: ksud_magic-aarch64-linux-android
path: ksud_magic
- name: Download arm ksud_magic
uses: actions/download-artifact@v4
with:
name: ksud_magic-armv7-linux-androideabi
path: ksud_magic
- name: Copy ksud_magic to app jniLibs
run: |
cp -f ../ksud_magic/aarch64-linux-android/release/ksud ../manager/app/src/main/jniLibs/arm64-v8a/libksud_magic.so
cp -f ../ksud_magic/armv7-linux-androideabi/release/ksud ../manager/app/src/main/jniLibs/armeabi-v7a/libksud_magic.so
- name: Build with Gradle
run: |
@@ -148,19 +152,19 @@ jobs:
chmod +x gradlew
./gradlew clean assembleRelease
- name: Upload build artifact
- name: Upload Build Artifact
uses: actions/upload-artifact@v4
with:
name: manager
name: Manager
path: manager/app/build/outputs/apk/release/*.apk
- name: Upload mappings
- name: Upload Mappings
uses: actions/upload-artifact@v4
with:
name: "mappings"
path: "manager/app/build/outputs/mapping/release/"
name: Mappings
path: manager/app/build/outputs/mapping/release/
- name: Bot session cache
- name: Bot Session Cache
if: steps.need_upload.outputs.UPLOAD == 'true'
id: bot_session_cache
uses: actions/cache@v4
@@ -168,7 +172,7 @@ jobs:
path: scripts/ksunextbot.session
key: ${{ runner.os }}-bot-session
- name: Upload to telegram
- name: Upload to Telegram
if: steps.need_upload.outputs.UPLOAD == 'true'
env:
API_ID: ${{ secrets.API_ID }}
@@ -187,4 +191,3 @@ jobs:
pip3 install telethon
python3 $GITHUB_WORKSPACE/scripts/ksunextbot.py $APK
fi

View File

@@ -0,0 +1,200 @@
name: Build Manager Spoofed
on:
push:
branches: [ "next" ]
paths:
- '.github/workflows/build-manager-ci.yml'
- 'manager/**'
- 'kernel/**'
- 'userspace/ksud_overlayfs**'
- 'userspace/ksud_magic/**'
- 'userspace/susfsd/**'
pull_request:
branches: [ "next" ]
paths:
- '.github/workflows/build-manager-ci.yml'
- 'manager/**'
workflow_call:
workflow_dispatch:
schedule:
- cron: "0 12 * * *" # 6 PM UTC+6 | 12 PM UTC
jobs:
# build-lkm:
# uses: ./.github/workflows/build-lkm.yml
# secrets: inherit
build-susfsd:
# needs: build-lkm
strategy:
matrix:
include:
- os: ubuntu-latest
uses: ./.github/workflows/susfsd.yml
with:
os: ${{ matrix.os }}
build-ksud:
needs: build-susfsd
strategy:
matrix:
include:
- target: aarch64-linux-android
os: ubuntu-latest
- target: armv7-linux-androideabi
os: ubuntu-latest
uses: ./.github/workflows/ksud.yml
with:
target: ${{ matrix.target }}
os: ${{ matrix.os }}
build-manager:
needs: build-ksud
runs-on: ubuntu-latest
defaults:
run:
working-directory: ./manager
steps:
- name: Checkout Repository
uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Spoof Package ID
run: |
chmod +x spoof
./spoof
- name: Setup need_upload
id: need_upload
run: |
if [ ! -z "${{ secrets.BOT_TOKEN }}" ]; then
echo "UPLOAD=true" >> $GITHUB_OUTPUT
else
echo "UPLOAD=false" >> $GITHUB_OUTPUT
fi
- name: Write Key
run: |
if [ ! -z "${{ secrets.KEYSTORE }}" ]; then
{
echo KEYSTORE_PASSWORD='${{ secrets.KEYSTORE_PASSWORD }}'
echo KEY_ALIAS='${{ secrets.KEY_ALIAS }}'
echo KEY_PASSWORD='${{ secrets.KEY_PASSWORD }}'
echo KEYSTORE_FILE='key.jks'
} >> gradle.properties
echo ${{ secrets.KEYSTORE }} | base64 -d > key.jks
fi
- name: Setup Java
uses: actions/setup-java@v4
with:
distribution: temurin
java-version: 21
- name: Setup Gradle
uses: gradle/actions/setup-gradle@v4
- name: Download susfsd
uses: actions/download-artifact@v4
with:
name: susfsd-linux-android
path: .
- name: Copy susfsd to app jniLibs
run: |
mkdir -p app/src/main/jniLibs/arm64-v8a
cp -f ../arm64-v8a/susfsd ../manager/app/src/main/jniLibs/arm64-v8a/libsusfsd.so
mkdir -p app/src/main/jniLibs/armeabi-v7a
cp -f ../armeabi-v7a/susfsd ../manager/app/src/main/jniLibs/armeabi-v7a/libsusfsd.so
- name: Download arm64 ksud_overlayfs
uses: actions/download-artifact@v4
with:
name: ksud_overlayfs-aarch64-linux-android
path: ksud_overlayfs
- name: Download arm ksud_overlayfs
uses: actions/download-artifact@v4
with:
name: ksud_overlayfs-armv7-linux-androideabi
path: ksud_overlayfs
- name: Copy ksud_overlayfs to app jniLibs
run: |
cp -f ../ksud_overlayfs/aarch64-linux-android/release/ksud ../manager/app/src/main/jniLibs/arm64-v8a/libksud_overlayfs.so
cp -f ../ksud_overlayfs/armv7-linux-androideabi/release/ksud ../manager/app/src/main/jniLibs/armeabi-v7a/libksud_overlayfs.so
- name: Download arm64 ksud_magic
uses: actions/download-artifact@v4
with:
name: ksud_magic-aarch64-linux-android
path: ksud_magic
- name: Download arm ksud_magic
uses: actions/download-artifact@v4
with:
name: ksud_magic-armv7-linux-androideabi
path: ksud_magic
- name: Copy ksud_magic to app jniLibs
run: |
cp -f ../ksud_magic/aarch64-linux-android/release/ksud ../manager/app/src/main/jniLibs/arm64-v8a/libksud_magic.so
cp -f ../ksud_magic/armv7-linux-androideabi/release/ksud ../manager/app/src/main/jniLibs/armeabi-v7a/libksud_magic.so
- name: Build with Gradle
run: |
{
echo 'org.gradle.parallel=true'
echo 'org.gradle.vfs.watch=true'
echo 'org.gradle.jvmargs=-Xmx2048m'
echo 'android.native.buildOutput=verbose'
} >> gradle.properties
sed -i 's/org.gradle.configuration-cache=true//g' gradle.properties
chmod +x gradlew
./gradlew clean assembleRelease
- name: Upload Build Artifact
uses: actions/upload-artifact@v4
with:
name: Manager
path: manager/app/build/outputs/apk/release/*.apk
- name: Upload Mappings
uses: actions/upload-artifact@v4
with:
name: Mappings
path: manager/app/build/outputs/mapping/release/
- name: Bot Session Cache
if: steps.need_upload.outputs.UPLOAD == 'true'
id: bot_session_cache
uses: actions/cache@v4
with:
path: scripts/ksunextbot.session
key: ${{ runner.os }}-bot-session
- name: Upload to Telegram
if: steps.need_upload.outputs.UPLOAD == 'true'
env:
API_ID: ${{ secrets.API_ID }}
API_HASH: ${{ secrets.API_HASH }}
CHAT_ID: ${{ secrets.CHAT_ID }}
BOT_TOKEN: ${{ secrets.BOT_TOKEN }}
MESSAGE_THREAD_ID: ${{ secrets.MESSAGE_THREAD_ID }}
COMMIT_MESSAGE: ${{ github.event.head_commit.message }}
COMMIT_URL: ${{ github.event.head_commit.url }}
RUN_URL: ${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}
TITLE: CI Manager (SPOOFED BUILD)
run: |
if [ ! -z "${{ secrets.BOT_TOKEN }}" ]; then
export VERSION=$(git rev-list --count HEAD)
APK=$(find ./app/build/outputs/apk/release -name "*.apk")
pip3 install telethon
python3 $GITHUB_WORKSPACE/scripts/ksunextbot.py $APK
fi

View File

@@ -13,60 +13,49 @@ on:
# pull_request:
# branches: [ "next" ]
# paths:
# - '.github/workflows/build-manager-ci.yml'
# - 'manager/**'
workflow_call:
workflow_dispatch:
jobs:
build-lkm:
uses: ./.github/workflows/build-lkm.yml
secrets: inherit
# build-lkm:
# uses: ./.github/workflows/build-lkm.yml
# secrets: inherit // DISBAND LKM MODE
build-susfsd:
needs: build-lkm
# needs: build-lkm
strategy:
matrix:
include:
- target: aarch64-linux-android
os: ubuntu-latest
- os: ubuntu-latest
uses: ./.github/workflows/susfsd.yml
with:
target: ${{ matrix.target }}
os: ${{ matrix.os }}
build-ksud_overlayfs:
build-ksud:
needs: build-susfsd
strategy:
matrix:
include:
- target: aarch64-linux-android
os: ubuntu-latest
uses: ./.github/workflows/ksud_overlayfs.yml
with:
target: ${{ matrix.target }}
os: ${{ matrix.os }}
build-ksud_magic:
needs: build-ksud_overlayfs
strategy:
matrix:
include:
- target: aarch64-linux-android
- target: armv7-linux-androideabi
os: ubuntu-latest
uses: ./.github/workflows/ksud_magic.yml
uses: ./.github/workflows/ksud.yml
with:
target: ${{ matrix.target }}
os: ${{ matrix.os }}
build-manager:
needs: build-ksud_magic
needs: build-ksud
runs-on: ubuntu-latest
defaults:
run:
working-directory: ./manager
steps:
- name: Checkout
- name: Checkout Repository
uses: actions/checkout@v4
with:
fetch-depth: 0
@@ -80,7 +69,7 @@ jobs:
echo "UPLOAD=false" >> $GITHUB_OUTPUT
fi
- name: Write key
- name: Write Key
run: |
if [ ! -z "${{ secrets.KEYSTORE }}" ]; then
{
@@ -101,40 +90,55 @@ jobs:
- name: Setup Gradle
uses: gradle/actions/setup-gradle@v4
- name: Setup Android SDK
uses: android-actions/setup-android@v3
- name: Download arm64 susfsd
- name: Download susfsd
uses: actions/download-artifact@v4
with:
name: susfsd-aarch64-linux-android
name: susfsd-linux-android
path: .
- name: Copy susfsd to app jniLibs
run: |
mkdir -p app/src/main/jniLibs/arm64-v8a
cp -f ../arm64-v8a/susfsd ../manager/app/src/main/jniLibs/arm64-v8a/libsusfsd.so
mkdir -p app/src/main/jniLibs/armeabi-v7a
cp -f ../armeabi-v7a/susfsd ../manager/app/src/main/jniLibs/armeabi-v7a/libsusfsd.so
- name: Download arm64 ksud_overlayfs
uses: actions/download-artifact@v4
with:
name: ksud_overlayfs-aarch64-linux-android
path: ksud_overlayfs
- name: Download arm ksud_overlayfs
uses: actions/download-artifact@v4
with:
name: ksud_overlayfs-armv7-linux-androideabi
path: ksud_overlayfs
- name: Copy ksud_overlayfs to app jniLibs
run: |
cp -f ../ksud_overlayfs/aarch64-linux-android/release/ksud ../manager/app/src/main/jniLibs/arm64-v8a/libksud_overlayfs.so
cp -f ../ksud_overlayfs/armv7-linux-androideabi/release/ksud ../manager/app/src/main/jniLibs/armeabi-v7a/libksud_overlayfs.so
- name: Download arm64 ksud_magic
uses: actions/download-artifact@v4
with:
name: ksud_magic-aarch64-linux-android
path: ksud_magic
- name: Download arm ksud_magic
uses: actions/download-artifact@v4
with:
name: ksud_magic-armv7-linux-androideabi
path: ksud_magic
- name: Copy ksud_magic to app jniLibs
run: |
cp -f ../ksud_magic/aarch64-linux-android/release/ksud ../manager/app/src/main/jniLibs/arm64-v8a/libksud_magic.so
cp -f ../ksud_magic/armv7-linux-androideabi/release/ksud ../manager/app/src/main/jniLibs/armeabi-v7a/libksud_magic.so
- name: Build with Gradle
run: |
@@ -148,19 +152,19 @@ jobs:
chmod +x gradlew
./gradlew clean assembleRelease
- name: Upload build artifact
- name: Upload Build Artifact
uses: actions/upload-artifact@v4
with:
name: manager
name: Manager
path: manager/app/build/outputs/apk/release/*.apk
- name: Upload mappings
- name: Upload Mappings
uses: actions/upload-artifact@v4
with:
name: "mappings"
path: "manager/app/build/outputs/mapping/release/"
name: Mappings
path: manager/app/build/outputs/mapping/release/
- name: Bot session cache
- name: Bot Session Cache
if: steps.need_upload.outputs.UPLOAD == 'true'
id: bot_session_cache
uses: actions/cache@v4
@@ -168,7 +172,7 @@ jobs:
path: scripts/ksunextbot.session
key: ${{ runner.os }}-bot-session
- name: Upload to telegram
- name: Upload to Telegram
if: steps.need_upload.outputs.UPLOAD == 'true'
env:
API_ID: ${{ secrets.API_ID }}
@@ -187,4 +191,3 @@ jobs:
pip3 install telethon
python3 $GITHUB_WORKSPACE/scripts/ksunextbot.py $APK
fi

View File

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

View File

@@ -198,6 +198,9 @@ jobs:
- name: Make working directory clean to avoid dirty
working-directory: android-kernel
run: |
if [ -f ./common/BUILD.bazel ]; then
sed -i '/^[[:space:]]*"protected_exports_list"[[:space:]]*:[[:space:]]*"android\/abi_gki_protected_exports_aarch64",$/d' ./common/BUILD.bazel
fi
rm common/android/abi_gki_protected_exports_* || echo "No protected exports!"
git config --global user.email "bot@kernelsu.org"
git config --global user.name "KernelSU-NextBot"
@@ -255,4 +258,4 @@ jobs:
if: ${{ inputs.build_lkm == true }}
with:
name: ${{ inputs.version }}-lkm
path: ./output/*_kernelsu.ko
path: ./output/*_kernelsu.ko

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

@@ -0,0 +1,81 @@
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/ // DISBAND LKM MODE
- name: Import susfsd Libraries
run: |
cp susfsd-linux-android/arm64-v8a/susfsd ./userspace/ksud_overlayfs/bin/aarch64/
cp susfsd-linux-android/arm64-v8a/susfsd ./userspace/ksud_magic/bin/aarch64/
cp susfsd-linux-android/armeabi-v7a/susfsd ./userspace/ksud_overlayfs/bin/arm/
cp susfsd-linux-android/armeabi-v7a/susfsd ./userspace/ksud_magic/bin/arm/
- 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-a13-kernel
- build-a14-kernel
- build-a15-kernel
runs-on: ubuntu-latest
steps:
- name: Download artifacts
@@ -47,10 +48,10 @@ jobs:
uses: softprops/action-gh-release@v2
with:
files: |
manager/*.apk
Manager/*.apk
android*-lkm/*_kernelsu.ko
AnyKernel3-*.zip
boot-images-*/Image-*/*.img.gz
ksud_magic-*
ksud_overlayfs-*
susfsd-*
ksud_magic-*/ksud_magic-*
ksud_overlayfs-*/ksud_overlayfs-*
susfsd-*/susfsd-*

View File

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

View File

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

View File

@@ -1,4 +1,4 @@
name: Build susfsd
name: Build susfsd aarch64
on:
push:
branches: [ "next" ]
@@ -8,9 +8,6 @@ on:
workflow_dispatch:
workflow_call:
inputs:
target:
required: true
type: string
os:
required: false
type: string
@@ -26,9 +23,9 @@ jobs:
- name: Build susfsd
working-directory: ./userspace/susfsd
run: $ANDROID_NDK/ndk-build
- name: Upload a Build Artifact
- name: Upload Build Artifacts
uses: actions/upload-artifact@v4
with:
name: susfsd-aarch64-linux-android
name: susfsd-linux-android
path: ./userspace/susfsd/libs

View File

@@ -1,15 +1,18 @@
**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) | [Italiano](README_IT.md) | [Polski](README_PL.md) | [Български](README_BG.md) | [日本語](README_JA.md) | [Українська](README_UA.md)
# KernelSU Next
<img src="/assets/kernelsu_next.png" style="width: 96px;" alt="logo">
A Kernel-based root solution for Android devices.
A kernel-based root solution for Android devices.
[![Latest Release](https://img.shields.io/github/v/release/rifsxd/KernelSU-Next?label=Release&logo=github)](https://github.com/rifsxd/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)
[![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/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)
[![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)
> [!IMPORTANT]
> Support for installing KernelSU Next in LKM mode through manager was disabled, you can still update it by manually repacking `init_boot`.
## Features
@@ -17,18 +20,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).
3. [App Profile](https://kernelsu.org/guide/app-profile.html): Lock up the root power in a cage.
## Compatibility State
## Compatibility state
KernelSU Next officially supports most Android kernels starting from 4.4 up to 6.6.
- GKI 2.0 (5.10+) kernels can run pre-built images and LKM/KMI.
- GKI 1.0 (4.19 - 5.4) kernels need to rebuilt with KernelSU driver.
- EOL (<4.14) kernels also need to be rebuilt with KernelSU driver (3.18+ is experimental and may need some function backports).
Currently, only `arm64-v8a` is supported.
Currently, only the `arm64-v8a` architecture is supported.
## Usage
- [Installation instruction](https://rifsxd.github.io/KernelSU-Next/)
- [Installation instruction](https://ksunext.org/pages/installation.html)
## Security
@@ -39,11 +42,25 @@ For information on reporting security vulnerabilities in KernelSU, see [SECURITY
- Files under the `kernel` directory are [GPL-2.0-only](https://www.gnu.org/licenses/old-licenses/gpl-2.0.en.html).
- All other parts except the `kernel` directory are [GPL-3.0-or-later](https://www.gnu.org/licenses/gpl-3.0.html).
## Donations
- 0x12b5224b7aca0121c2f003240a901e1d064371c1 [ USDT BEP20 ]
- TYUVMWGTcnR5svnDoX85DWHyqUAeyQcdjh [ USDT TRC20 ]
- 0x12b5224b7aca0121c2f003240a901e1d064371c1 [ USDT ERC20 ]
- 0x12b5224b7aca0121c2f003240a901e1d064371c1 [ ETH ERC20 ]
- Ld238uYBuRQdZB5YwdbkuU6ektBAAUByoL [ LTC ]
- 19QgifcjMjSr1wB2DJcea5cxitvWVcXMT6 [ BTC ]
## Credits
- [kernel-assisted-superuser](https://git.zx2c4.com/kernel-assisted-superuser/about/): the KernelSU idea.
- [Magisk](https://github.com/topjohnwu/Magisk): the powerful root tool.
- [genuine](https://github.com/brevent/genuine/): apk v2 signature validation.
- [Diamorphine](https://github.com/m0nad/Diamorphine): some rootkit skills.
- [KernelSU](https://github.com/tiann/KernelSU): thanks to tiann, or else KernelSU Next wouldn't even exist.
- [Kernel-Assisted Superuser](https://git.zx2c4.com/kernel-assisted-superuser/about/): The KernelSU idea.
- [Magisk](https://github.com/topjohnwu/Magisk): The powerful root tool.
- [genuine](https://github.com/brevent/genuine/): APK v2 signature validation.
- [Diamorphine](https://github.com/m0nad/Diamorphine): Some rootkit skills.
- [KernelSU](https://github.com/tiann/KernelSU): Thanks to tiann, or else KernelSU Next wouldn't even exist.
- [Magic Mount Port](https://github.com/5ec1cff/KernelSU/blob/main/userspace/ksud/src/magic_mount.rs): 💜 5ec1cff for saving KernelSU!

58
docs/README_BG.md Normal file
View File

@@ -0,0 +1,58 @@
[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_UA.md) | [ภาษาไทย](README_TH.md) | [Tiếng Việt](README_VI.md) | [Italiano](README_IT.md) | [Polski](README_PL.md) | **Български** | [日本語](README_JA.md)
# KernelSU Next
<img src="/assets/kernelsu_next.png" style="width: 96px;" alt="лого">
Ядрено решение за root достъп за Android устройства.
[![Последна версия](https://img.shields.io/github/v/release/KernelSU-Next/KernelSU-Next?label=Версия&logo=github)](https://github.com/KernelSU-Next/KernelSU-Next/releases/latest)
[![Нощна версия](https://img.shields.io/badge/Нощнаерсия-сива?logo=hackthebox&logoColor=fff)](https://nightly.link/KernelSU-Next/KernelSU-Next/workflows/build-manager-ci/next/Manager)
[![Лиценз: GPL v2](https://img.shields.io/badge/Лиценз-GPL%20v2-оранжев.svg?logo=gnu)](https://www.gnu.org/licenses/old-licenses/gpl-2.0.en.html)
[![Лиценз в GitHub](https://img.shields.io/github/license/KernelSU-Next/KernelSU-Next?logo=gnu)](/LICENSE)
## Възможности
1. Управление на `su` и root достъп на ядрено ниво
2. Система за модули базирана на [Magic Mount](https://topjohnwu.github.io/Magisk/details.html#magic-mount) / [OverlayFS](https://en.wikipedia.org/wiki/OverlayFS)
3. [Профили за приложения](https://kernelsu.org/guide/app-profile.html): Ограничаване на root права за конкретни приложения
## Съвместимост
KernelSU Next официално поддържа повечето Android ядра от версия 4.4 до 6.6:
- Ядра GKI 2.0 (5.10+) могат да използват предварително компилирани изображения и LKM/KMI
- Ядра GKI 1.0 (4.19 - 5.4) изискват прекомпилиране с драйвера на KernelSU
- Остарели ядра (<4.14) също изискват прекомпилиране (3.18+ е експериментална поддръжка)
В момента се поддържа само архитектурата `arm64-v8a`.
## Инсталация
- [Инструкции за инсталиране](https://ksunext.org/pages/installation.html)
## Сигурност
За докладване на уязвимости вижте [SECURITY.md](/SECURITY.md).
## Лиценз
- Файловете в директорията `kernel` са [GPL-2.0-only](https://www.gnu.org/licenses/old-licenses/gpl-2.0.en.html)
- Всички останали файлове са [GPL-3.0-or-later](https://www.gnu.org/licenses/gpl-3.0.html)
## Дарения
- 0x12b5224b7aca0121c2f003240a901e1d064371c1 [ USDT BEP20 ]
- TYUVMWGTcnR5svnDoX85DWHyqUAeyQcdjh [ USDT TRC20 ]
- 0x12b5224b7aca0121c2f003240a901e1d064371c1 [ USDT ERC20 ]
- 0x12b5224b7aca0121c2f003240a901e1d064371c1 [ ETH ERC20 ]
- Ld238uYBuRQdZB5YwdbkuU6ektBAAUByoL [ LTC ]
- 19QgifcjMjSr1wB2DJcea5cxitvWVcXMT6 [ BTC ]
## Благодарности
- [Kernel-Assisted Superuser](https://git.zx2c4.com/kernel-assisted-superuser/about/): Идеята за KernelSU
- [Magisk](https://github.com/topjohnwu/Magisk): Мощният root инструмент
- [genuine](https://github.com/brevent/genuine/): Валидация на APK подписи v2
- [Diamorphine](https://github.com/m0nad/Diamorphine): Rootkit техники
- [KernelSU](https://github.com/tiann/KernelSU): Благодарности към tiann за създаването на KernelSU
- [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_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_UA.md) | [ภาษาไทย](README_TH.md) | [Tiếng Việt](README_VI.md) | [Italiano](README_IT.md) | [Polski](README_PL.md) | [Български](README_BG.md) | [日本語](README_JA.md)
# KernelSU Next
@@ -6,10 +6,10 @@
安卓基于内核的 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)
[![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)
[![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/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)
[![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://ksunext.org/pages/installation.html)
## 安全性
@@ -41,9 +41,9 @@ KernelSU Next 支持从 4.4 到 6.6 的大多数安卓内核
## 鸣谢
- [kernel-assisted-superuser](https://git.zx2c4.com/kernel-assisted-superuser/about/): KernelSU 的灵感.
- [Kernel-Assisted Superuser](https://git.zx2c4.com/kernel-assisted-superuser/about/): KernelSU 的灵感.
- [Magisk](https://github.com/topjohnwu/Magisk): 强大的 Root 工具.
- [genuine](https://github.com/brevent/genuine/): apk v2 签名验证
- [genuine](https://github.com/brevent/genuine/): APK v2 签名验证
- [Diamorphine](https://github.com/m0nad/Diamorphine): 一些 Rootkit 技巧
- [KernelSU](https://github.com/tiann/KernelSU): 感谢 tiann否则 KernelSU Next 根本不会存在
- [Magic Mount Port](https://github.com/5ec1cff/KernelSU/blob/main/userspace/ksud/src/magic_mount.rs): 💜 5ec1cff 為了拯救 KernelSU

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_UA.md) | [ภาษาไทย](README_TH.md) | [Tiếng Việt](README_VI.md) | [Italiano](README_IT.md) | [Polski](README_PL.md) | [Български](README_BG.md) | [日本語](README_JA.md)
# KernelSU Next
@@ -6,10 +6,10 @@
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)
[![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)
[![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)
[![Licence GitHub](https://img.shields.io/github/license/rifsxd/KernelSU-Next?logo=gnu)](/LICENSE)
[![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/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)
[![GitHub License](https://img.shields.io/github/license/KernelSU-Next/KernelSU-Next?logo=gnu)](/LICENSE)
## Fonctionnalités
@@ -28,7 +28,7 @@ Actuellement, seul `arm64-v8a` est pris en charge.
## Utilisation
- [Instructions d'installation](https://rifsxd.github.io/KernelSU-Next/)
- [Instructions d'installation](https://ksunext.org/pages/installation.html)
## Sécurité
@@ -41,9 +41,9 @@ Pour signaler des vulnérabilités de sécurité dans KernelSU, consultez [SECUR
## Crédits
- [kernel-assisted-superuser](https://git.zx2c4.com/kernel-assisted-superuser/about/) : l'idée de KernelSU.
- [Magisk](https://github.com/topjohnwu/Magisk) : l'outil root puissant.
- [genuine](https://github.com/brevent/genuine/) : validation de signature apk v2.
- [Diamorphine](https://github.com/m0nad/Diamorphine) : quelques techniques de rootkit.
- [KernelSU](https://github.com/tiann/KernelSU) : merci à tiann, sans qui KernelSU Next n'existerait même pas.
- [Kernel-Assisted Superuser](https://git.zx2c4.com/kernel-assisted-superuser/about/) : L'idée de KernelSU.
- [Magisk](https://github.com/topjohnwu/Magisk) : L'outil root puissant.
- [genuine](https://github.com/brevent/genuine/) : Validation de signature APK v2.
- [Diamorphine](https://github.com/m0nad/Diamorphine) : Quelques techniques de rootkit.
- [KernelSU](https://github.com/tiann/KernelSU) : Merci à tiann, sans qui KernelSU Next n'existerait même pas.
- [Magic Mount Port](https://github.com/5ec1cff/KernelSU/blob/main/userspace/ksud/src/magic_mount.rs) : 💜 5ec1cff pour avoir sauvé KernelSU !

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_UA.md) | [ภาษาไทย](README_TH.md) | [Tiếng Việt](README_VI.md) | [Italiano](README_IT.md) | [Polski](README_PL.md) | [Български](README_BG.md) | [日本語](README_JA.md)
# KernelSU Next
@@ -6,10 +6,10 @@
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)
[![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)
[![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/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)
[![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
@@ -28,7 +28,7 @@ Saat ini, hanya `arm64-v8a` yang didukung.
## Penggunaan
- [Petunjuk instalasi](https://rifsxd.github.io/KernelSU-Next/)
- [Petunjuk instalasi](https://ksunext.org/pages/installation.html)
## Keamanan
@@ -41,9 +41,9 @@ Untuk informasi tentang melaporkan kerentanannya di KernelSU, lihat [SECURITY.md
## Kredit
- [kernel-assisted-superuser](https://git.zx2c4.com/kernel-assisted-superuser/about/): ide KernelSU.
- [Magisk](https://github.com/topjohnwu/Magisk): alat root yang kuat.
- [genuine](https://github.com/brevent/genuine/): validasi tanda tangan apk v2.
- [Diamorphine](https://github.com/m0nad/Diamorphine): beberapa keterampilan rootkit.
- [KernelSU](https://github.com/tiann/KernelSU): terima kasih kepada tiann, jika tidak, KernelSU Next bahkan tidak akan ada.
- [Kernel-Assisted Superuser](https://git.zx2c4.com/kernel-assisted-superuser/about/): Ide KernelSU.
- [Magisk](https://github.com/topjohnwu/Magisk): Alat root yang kuat.
- [genuine](https://github.com/brevent/genuine/): Validasi tanda tangan APK v2.
- [Diamorphine](https://github.com/m0nad/Diamorphine): Beberapa keterampilan rootkit.
- [KernelSU](https://github.com/tiann/KernelSU): Terima kasih kepada tiann, jika tidak, KernelSU Next bahkan tidak akan ada.
- [Magic Mount Port](https://github.com/5ec1cff/KernelSU/blob/main/userspace/ksud/src/magic_mount.rs): 💜 5ec1cff karena menyelamatkan KernelSU!

63
docs/README_IT.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_UA.md) | [ภาษาไทย](README_TH.md) | [Tiếng Việt](README_VI.md) | **Italiano** | [Polski](README_PL.md) | [Български](README_BG.md) | [日本語](README_JA.md)
# KernelSU Next
<img src="/assets/kernelsu_next.png" style="width: 96px;" alt="logo">
Una soluzione root basata sul kernel per dispositivi Android.
[![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/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)
[![GitHub License](https://img.shields.io/github/license/KernelSU-Next/KernelSU-Next?logo=gnu)](/LICENSE)
## Caratteristiche
1. Gestione degli accessi `su` e root basata sul kernel.
2. Sistema modulare basato sul sistema di montaggio dinamico [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): Rinchiudi il potere della radice in una gabbia.
## Stato compatibilità
KernelSU Next supporta ufficialmente la maggior parte dei kernel Android dalla versione 4.4 alla 6.6.
- I kernel GKI 2.0 (5.10+) possono eseguire immagini precostruite e LKM/KMI.
- I kernel GKI 1.0 (4.19 - 5.4) devono essere ricostruiti con il driver KernelSU.
- Anche i kernel EOL (<4.14) devono essere ricostruiti con il driver KernelSU (la versione 3.18+ è sperimentale e potrebbe richiedere alcuni backport di funzioni).
Attualmente è supportata solo l'architettura `arm64-v8a`.
## Utilizzo
- [Istruzioni per l'installazione](https://ksunext.org/pages/installation.html)
## Security
Per informazioni sulla segnalazione delle vulnerabilità di sicurezza in KernelSU, vedere [SECURITY.md](/SECURITY.md).
## Licenza
- I file nella directory `kernel` sono [GPL-2.0-only](https://www.gnu.org/licenses/old-licenses/gpl-2.0.en.html).
- Tutte le altre parti eccetto la directory `kernel` sono [GPL-3.0-or-later](https://www.gnu.org/licenses/gpl-3.0.html).
## Donazioni
- 0x12b5224b7aca0121c2f003240a901e1d064371c1 [ USDT BEP20 ]
- TYUVMWGTcnR5svnDoX85DWHyqUAeyQcdjh [ USDT TRC20 ]
- 0x12b5224b7aca0121c2f003240a901e1d064371c1 [ USDT ERC20 ]
- 0x12b5224b7aca0121c2f003240a901e1d064371c1 [ ETH ERC20 ]
- Ld238uYBuRQdZB5YwdbkuU6ektBAAUByoL [ LTC ]
- 19QgifcjMjSr1wB2DJcea5cxitvWVcXMT6 [ BTC ]
## Crediti
- [Kernel-Assisted Superuser](https://git.zx2c4.com/kernel-assisted-superuser/about/): L'idea di KernelSU.
- [Magisk](https://github.com/topjohnwu/Magisk): Il potente strumento di root.
- [genuine](https://github.com/brevent/genuine/): Convalida della firma APK v2.
- [Diamorphine](https://github.com/m0nad/Diamorphine): Alcune competenze sui rootkit.
- [KernelSU](https://github.com/tiann/KernelSU): Grazie a tiann, altrimenti KernelSU Next non esisterebbe nemmeno.
- [Magic Mount Port](https://github.com/5ec1cff/KernelSU/blob/main/userspace/ksud/src/magic_mount.rs): 💜 5ec1cff per aver salvato KernelSU!

63
docs/README_JA.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_UA.md) | [ภาษาไทย](README_TH.md) | [Tiếng Việt](README_VI.md) | [Italiano](README_IT.md) | [Polski](README_PL.md) | [Български](README_BG.md) | **日本語**
# KernelSU Next
<img src="/assets/kernelsu_next.png" style="width: 96px;" alt="logo">
Android デバイス用のカーネルベースな root ソリューション。
[![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/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)
[![GitHub License](https://img.shields.io/github/license/KernelSU-Next/KernelSU-Next?logo=gnu)](/LICENSE)
## 機能
1. カーネルベースの `su` および root アクセスの管理。
2. 動的マウントシステム [Magic Mount](https://topjohnwu.github.io/Magisk/details.html#magic-mount) / [OverlayFS](https://en.wikipedia.org/wiki/OverlayFS) をベースとしたモジュールシステム。
3. [アプリプロファイル](https://kernelsu.org/guide/app-profile.html): root 権限をケージに閉じ込めます。
## 互換性の状態
KernelSU Next は 4.4 から 6.6 までのほとんどの Android カーネルを公式でサポートしています。
- GKI 2.0 (5.10 以降) のカーネルはビルド済みイメージで LKM/KMI を実行できます。
- GKI 1.0 (4.19 - 5.4) のカーネルは、KernelSU ドライバを使用してビルドする必要があります。
- EOL (4.14 未満) のカーネルも KernelSU ドライバを使用して再ビルドする必要があります (3.18 以降は実験中の段階であり、一部の関数のバックポートが必要になる場合があります)。
現在 `arm64-v8a` アーキテクチャのみをサポートしています。
## 使い方
- [インストール手順](https://ksunext.org/pages/installation.html)
## セキュリティ
KernelSU のセキュリティ脆弱性の報告については [SECURITY.md](/SECURITY.md) を参照してください。
## ライセンス
- `kernel` ディレクトリ内のファイルは [GPL-2.0](https://www.gnu.org/licenses/old-licenses/gpl-2.0.ja.html) のみライセンス下にあります。
- `kernel` ディレクトリを除くその他すべての部分は [GPL-3.0 またはそれ以降](https://www.gnu.org/licenses/gpl-3.0.html) のライセンス下にあります。
## 寄付
- 0x12b5224b7aca0121c2f003240a901e1d064371c1 [ USDT BEP20 ]
- TYUVMWGTcnR5svnDoX85DWHyqUAeyQcdjh [ USDT TRC20 ]
- 0x12b5224b7aca0121c2f003240a901e1d064371c1 [ USDT ERC20 ]
- 0x12b5224b7aca0121c2f003240a901e1d064371c1 [ ETH ERC20 ]
- Ld238uYBuRQdZB5YwdbkuU6ektBAAUByoL [ LTC ]
- 19QgifcjMjSr1wB2DJcea5cxitvWVcXMT6 [ BTC ]
## クレジット
- [Kernel-Assisted Superuser](https://git.zx2c4.com/kernel-assisted-superuser/about/): KernelSU のアイデアを考案。
- [Magisk](https://github.com/topjohnwu/Magisk): パワフルな root ツール。
- [genuine](https://github.com/brevent/genuine/): APK v2 署名認証。
- [Diamorphine](https://github.com/m0nad/Diamorphine): いくつかの rootkit スキル。
- [KernelSU](https://github.com/tiann/KernelSU): tiann に感謝を申し上げます。これが存在しなければ KernelSU Next は存在しませんでした。
- [Magic Mount Port](https://github.com/5ec1cff/KernelSU/blob/main/userspace/ksud/src/magic_mount.rs): 💜 5ec1cff へ KernelSU を救ってくれてありがとう!

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_UA.md) | [ภาษาไทย](README_TH.md) | [Tiếng Việt](README_VI.md) | [Italiano](README_IT.md) | [Polski](README_PL.md) | [Български](README_BG.md) | [日本語](README_JA.md)
# 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)
[![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)
[![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/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)
[![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://ksunext.org/pages/installation.html)
## 보안
@@ -41,9 +41,9 @@ KernelSU의 보안 취약점 보고에 대한 자세한 내용은 [SECURITY.md](
## 크레딧
- [kernel-assisted-superuser](https://git.zx2c4.com/kernel-assisted-superuser/about/): KernelSU의 아이디어
- [Kernel-Assisted Superuser](https://git.zx2c4.com/kernel-assisted-superuser/about/): KernelSU의 아이디어
- [Magisk](https://github.com/topjohnwu/Magisk): 강력한 루팅 도구
- [genuine](https://github.com/brevent/genuine/): apk v2 서명 검사
- [genuine](https://github.com/brevent/genuine/): APK v2 서명 검사
- [Diamorphine](https://github.com/m0nad/Diamorphine): 일부 rootkit 기술
- [KernelSU](https://github.com/tiann/KernelSU): KernelSU Next가 존재할 있게 tiann에게 감사드립니다.
- [Magic Mount Port](https://github.com/5ec1cff/KernelSU/blob/main/userspace/ksud/src/magic_mount.rs): KernelSU를 구해준 5ec1cff에게 감사드립니다!

63
docs/README_PL.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_UA.md) | [ภาษาไทย](README_TH.md) | [Tiếng Việt](README_VI.md) | [Italiano](README_IT.md) | **Polski** | [Български](README_BG.md) | [日本語](README_JA.md)
# KernelSU Next
<img src="/assets/kernelsu_next.png" style="width: 96px;" alt="logo">
Bazujące na jądrze rozwiązanie root dla urządzeń z Androidem.
[![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/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)
[![GitHub License](https://img.shields.io/github/license/KernelSU-Next/KernelSU-Next?logo=gnu)](/LICENSE)
## Funkcjonalności
1. Oparte na jądrze `su` i zarządzanie dostępem do roota.
2. System modułów oparty na dynamicznym systemie montowania [Magic Mount](https://topjohnwu.github.io/Magisk/details.html#magic-mount) / [OverlayFS](https://en.wikipedia.org/wiki/OverlayFS).
3. [Profil aplikacji](https://kernelsu.org/guide/app-profile.html): Ujarzmij moc roota poprzez możliwość nakładania ograniczeń na uprawnienia roota dla poszczególnych aplikacji.
## Stan zgodności
KernelSU Next oficjalnie obsługuje większość jąder Androida od wersji 4.4 do 6.6.
- Jądra GKI 2.0 (5.10+) mogą uruchamiać wstępnie przygotowane obrazy i LKM/KMI.
- Jądra GKI 1.0 (4.19 - 5.4) muszą zostać zrekompilowane z dodatkiem sterownika KernelSU.
- Jądra EOL (<4.14) również muszą zostać zrekompilowane z dodatkiem sterownika KernelSU (obsługa 3.18+ jest eksperymentalna i może wymagać backportu pewnych funkcji).
Obecnie obsługiwana jest tylko architektura `arm64-v8a`.
## Użycie
- [Instrukcja instalacji](https://ksunext.org/pages/installation.html)
## Bezpieczeństwo
Informacje na temat zgłaszania luk bezpieczeństwa w KernelSU znajdziesz w [SECURITY.md](/SECURITY.md).
## Licencje
- Pliki w katalogu `kernel` dostępne na licencji [GPL-2.0-only](https://www.gnu.org/licenses/old-licenses/gpl-2.0.en.html).
- Wszystkie inne elementy, z wyjątkiem katalogu `kernel`, dostępne na licencji [GPL-3.0-or-later](https://www.gnu.org/licenses/gpl-3.0.html).
## Darowizny
- 0x12b5224b7aca0121c2f003240a901e1d064371c1 [ USDT BEP20 ]
- TYUVMWGTcnR5svnDoX85DWHyqUAeyQcdjh [ USDT TRC20 ]
- 0x12b5224b7aca0121c2f003240a901e1d064371c1 [ USDT ERC20 ]
- 0x12b5224b7aca0121c2f003240a901e1d064371c1 [ ETH ERC20 ]
- Ld238uYBuRQdZB5YwdbkuU6ektBAAUByoL [ LTC ]
- 19QgifcjMjSr1wB2DJcea5cxitvWVcXMT6 [ BTC ]
## Podziękowania
- [Kernel-Assisted Superuser](https://git.zx2c4.com/kernel-assisted-superuser/about/): Idea, na której opiera się KernelSU.
- [Magisk](https://github.com/topjohnwu/Magisk): Potężne narzędzie do rootowania.
- [genuine](https://github.com/brevent/genuine/): Walidacja podpisu APK v2.
- [Diamorphine](https://github.com/m0nad/Diamorphine): Część zdolności rootkitowych.
- [KernelSU](https://github.com/tiann/KernelSU): Dzięki tiann, bez ciebie KernelSU Next w ogóle by nie istniał.
- [Magic Mount Port](https://github.com/5ec1cff/KernelSU/blob/main/userspace/ksud/src/magic_mount.rs): 💜 5ec1cff za uratowanie 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_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_UA.md) | [ภาษาไทย](README_TH.md) | [Tiếng Việt](README_VI.md) | [Italiano](README_IT.md) | [Polski](README_PL.md) | [Български](README_BG.md) | [日本語](README_JA.md)
# KernelSU Next
@@ -6,10 +6,13 @@
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)
[![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)
[![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/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)
[![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)
> [!IMPORTANT]
> O suporte para instalação do KernelSU Next no modo LKM através do gerenciador foi desativado. Você ainda pode atualizá-lo manualmente reempacotando `init_boot`.
## Características
@@ -24,11 +27,11 @@ KernelSU Next suporta oficialmente a maioria dos kernels Android a partir de 4.4
- Os kernels GKI 1.0 (4.19 - 5.4) precisam ser reconstruídos com o driver KernelSU.
- Os kernels EOL (<4.14) também precisam ser reconstruídos com o driver KernelSU (3.18+ é experimental e pode precisar portar algumas funções).
Atualmente, apenas `arm64-v8a` é suportado.
Atualmente, apenas a arquitetura `arm64-v8a` é compatível.
## Uso
- [Instruções de instalação](https://rifsxd.github.io/KernelSU-Next/)
- [Instruções de instalação](https://ksunext.org/pages/installation.html)
## Segurança
@@ -39,11 +42,25 @@ Para obter informações sobre como relatar vulnerabilidades de segurança do Ke
- Os arquivos no diretório `kernel` são [GPL-2.0-only](https://www.gnu.org/licenses/old-licenses/gpl-2.0.en.html).
- Todas as outras partes, exceto o diretório `kernel` são [GPL-3.0-or-later](https://www.gnu.org/licenses/gpl-3.0.html).
## Doações
- 0x12b5224b7aca0121c2f003240a901e1d064371c1 [ USDT BEP20 ]
- TYUVMWGTcnR5svnDoX85DWHyqUAeyQcdjh [ USDT TRC20 ]
- 0x12b5224b7aca0121c2f003240a901e1d064371c1 [ USDT ERC20 ]
- 0x12b5224b7aca0121c2f003240a901e1d064371c1 [ ETH ERC20 ]
- Ld238uYBuRQdZB5YwdbkuU6ektBAAUByoL [ LTC ]
- 19QgifcjMjSr1wB2DJcea5cxitvWVcXMT6 [ BTC ]
## Créditos
- [kernel-assisted-superuser](https://git.zx2c4.com/kernel-assisted-superuser/about/): a ideia do KernelSU.
- [Magisk](https://github.com/topjohnwu/Magisk): a poderosa ferramenta root.
- [genuine](https://github.com/brevent/genuine/): validação de assinatura apk v2.
- [Diamorphine](https://github.com/m0nad/Diamorphine): algumas habilidades de rootkit.
- [KernelSU](https://github.com/tiann/KernelSU): obrigado a tiann, ou então o KernelSU Next nem existiria.
- [Kernel-Assisted Superuser](https://git.zx2c4.com/kernel-assisted-superuser/about/): A ideia do KernelSU.
- [Magisk](https://github.com/topjohnwu/Magisk): A poderosa ferramenta root.
- [genuine](https://github.com/brevent/genuine/): Validação de assinatura APK v2.
- [Diamorphine](https://github.com/m0nad/Diamorphine): Algumas habilidades de rootkit.
- [KernelSU](https://github.com/tiann/KernelSU): Obrigado ao tiann, ou então o KernelSU Next nem existiria.
- [Magic Mount Port](https://github.com/5ec1cff/KernelSU/blob/main/userspace/ksud/src/magic_mount.rs): 💜 5ec1cff por salvar o KernelSU!

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_UA.md) | [ภาษาไทย](README_TH.md) | [Tiếng Việt](README_VI.md) | [Italiano](README_IT.md) | [Polski](README_PL.md) | [Български](README_BG.md) | [日本語](README_JA.md)
# KernelSU Next
@@ -6,10 +6,10 @@
Root-решение для Android на базе ядра.
[![Последний релиз](https://img.shields.io/github/v/release/rifsxd/KernelSU-Next?label=Release&logo=github)](https://github.com/rifsxd/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)
[![Лицензия: 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)
[![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/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)
[![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://ksunext.org/pages/installation.html)
## Безопасность
@@ -39,11 +39,25 @@ KernelSU Next работает с большинством ядер Android (4.4
- Всё, что в директории `kernel`, [GPL-2.0-only](https://www.gnu.org/licenses/old-licenses/gpl-2.0.en.html).
- Остальной код, кроме директории `kernel`, под [GPL-3.0-or-later](https://www.gnu.org/licenses/gpl-3.0.html).
## Донаты
- 0x12b5224b7aca0121c2f003240a901e1d064371c1 [ USDT BEP20 ]
- TYUVMWGTcnR5svnDoX85DWHyqUAeyQcdjh [ USDT TRC20 ]
- 0x12b5224b7aca0121c2f003240a901e1d064371c1 [ USDT ERC20 ]
- 0x12b5224b7aca0121c2f003240a901e1d064371c1 [ ETH ERC20 ]
- Ld238uYBuRQdZB5YwdbkuU6ektBAAUByoL [ LTC ]
- 19QgifcjMjSr1wB2DJcea5cxitvWVcXMT6 [ BTC ]
## Благодарность
- [kernel-assisted-superuser](https://git.zx2c4.com/kernel-assisted-superuser/about/): идея KernelSU.
- [Magisk](https://github.com/topjohnwu/Magisk): топовый инструмент для root.
- [genuine](https://github.com/brevent/genuine/): валидация подписи APK v2.
- [Diamorphine](https://github.com/m0nad/Diamorphine): некоторые навыки rootkit.
- [KernelSU](https://github.com/tiann/KernelSU): спасибо tiann, без него KernelSU Next не релизнулся бы.
- [Magic Mount Port](https://github.com/5ec1cff/KernelSU/blob/main/userspace/ksud/src/magic_mount.rs): 💜 5ec1cff за сохранение KernelSU!
- [Kernel-Assisted Superuser](https://git.zx2c4.com/kernel-assisted-superuser/about/): Идея KernelSU.
- [Magisk](https://github.com/topjohnwu/Magisk): Топовый инструмент для root.
- [genuine](https://github.com/brevent/genuine/): Валидация подписи APK v2.
- [Diamorphine](https://github.com/m0nad/Diamorphine): Некоторые навыки rootkit.
- [KernelSU](https://github.com/tiann/KernelSU): Спасибо tiann, без него KernelSU Next даже не существовал бы.
- [Magic Mount Port](https://github.com/5ec1cff/KernelSU/blob/main/userspace/ksud/src/magic_mount.rs): 💜 5ec1cff за сохранение KernelSU!

View File

@@ -1,49 +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) | **ภาษาไทย**
[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_UA.md) | **ภาษาไทย** | [Tiếng Việt](README_VI.md) | [Italiano](README_IT.md) | [Polski](README_PL.md) | [Български](README_BG.md) | [日本語](README_JA.md)
# KernelSU Next
<img src="/assets/kernelsu_next.png" style="width: 96px;" alt="logo">
โซลูชันรูทบนพื้นฐานเคอร์เนลสำหรับอุปกรณ์ 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)
[![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)
[![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/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)
[![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` บนเคอร์เนล
2. ระบบโมดูลที่ใช้ระบบการติดตั้งแบบไดนามิก [Magic Mount](https://topjohnwu.github.io/Magisk/details.html#magic-mount) / [OverlayFS](https://en.wikipedia.org/wiki/OverlayFS)
3. [App Profile](https://kernelsu.org/guide/app-profile.html): จำกัดพลังรูทไว้สำหรับแอปต่างๆ
1. จัดการการเข้าถึงรูท และ `su` บนพื้นฐานเคอร์เนล
2. ระบบโมดูลแบบไดนามิกเมานต์ [Magic Mount](https://topjohnwu.github.io/Magisk/details.html#magic-mount) / [OverlayFS](https://en.wikipedia.org/wiki/OverlayFS)
3. [App Profile](https://kernelsu.org/guide/app-profile.html): จำกัดสิทธิ์เข้าถึงรูทสำหรับแอปต่างๆ
## การเข้ากันในอุปกรณ์ต่างๆ
KernelSU Next รองรับแบบเป็นทางการตั้งแต่เคอร์เนลแอนดรอยด์ 4.4 ถึง 6.6
- GKI 2.0 (5.10+) เคอร์เนลสามารถรันแบบไฟล์สำเร็จรูปและ LKM/KMI ได้
- GKI 1.0 (4.19 - 5.4) เคอร์เนลต้องการ build ร่วมกับไดร์เวอร์ของทาง KernelSU
- EOL (<4.14) เคอร์เนลก็ต้องการ build ร่วมกับไดร์เวอร์ของทาง KernelSU เช่นกัน (3.18+ ยังเป็นการทดลองอยู่และยังต้องการเขียนนหลังบ้านเพิ่มเติม)
- GKI 2.0 (5.10+) เคอร์เนลสามารถรันไฟล์อิมเมจสำเร็จรูป และ LKM/KMI ได้
- GKI 1.0 (4.19 - 5.4) เคอร์เนลจะต้องรีบิ้วร่วมกับไดร์เวอร์ของ KernelSU
- EOL (<4.14) เคอร์เนลก็ต้องรีบิ้วร่วมกับไดร์เวอร์ของ KernelSU เช่นกัน (3.18+ ยังเป็นเวอร์ชั่นทดลอง และยังต้องเขียนฟังก์ชั่นหลังบ้านเพิ่มเติม)
ในขณะนี้, มีแค่สถาปัตยกรรม `arm64-v8a` ที่รองรับเท่านั้น
## การใช้งาน
- [คำแนะนำในการติดตั้ง](https://rifsxd.github.io/KernelSU-Next/)
- [คำแนะนำในการติดตั้ง](https://ksunext.org/pages/installation.html)
## ความปลอดภัย
สำหรับข้อมูลเกี่ยวกับการรายงานช่องโหว่ด้านความปลอดภัยใน KernelSU โปรดดูที่ [SECURITY.md](/SECURITY.md).
สำหรับข้อมูลการรายงานช่องโหว่ด้านความปลอดภัยของ KernelSU โปรดดูที่ [SECURITY.md](/SECURITY.md).
## ใบอนุญาต
## สัญญาอนุญาต
- ไฟล์ที่ภายใต้โฟลเดอร์ `kernel` ถือว่าเป็น [GPL-2.0-only](https://www.gnu.org/licenses/old-licenses/gpl-2.0.en.html).
- ไฟล์ที่นอกเหนือจากโฟลเดอร์ `kernel` ถือว่าเป็น [GPL-3.0-or-later](https://www.gnu.org/licenses/gpl-3.0.html).
- ไฟล์ภายใต้โฟลเดอร์ `kernel` ถือว่าเป็นสัญญาอนุญาต [GPL-2.0-only](https://www.gnu.org/licenses/old-licenses/gpl-2.0.en.html).
- ไฟล์ที่นอกเหนือจากโฟลเดอร์ `kernel` ถือว่าเป็นสัญญาอนุญาต [GPL-3.0-or-later](https://www.gnu.org/licenses/gpl-3.0.html).
## การบริจาก
- 0x12b5224b7aca0121c2f003240a901e1d064371c1 [ USDT BEP20 ]
- TYUVMWGTcnR5svnDoX85DWHyqUAeyQcdjh [ USDT TRC20 ]
- 0x12b5224b7aca0121c2f003240a901e1d064371c1 [ USDT ERC20 ]
- 0x12b5224b7aca0121c2f003240a901e1d064371c1 [ ETH ERC20 ]
- Ld238uYBuRQdZB5YwdbkuU6ektBAAUByoL [ LTC ]
- 19QgifcjMjSr1wB2DJcea5cxitvWVcXMT6 [ BTC ]
## เครดิต
- [kernel-assisted-superuser](https://git.zx2c4.com/kernel-assisted-superuser/about/): ที่เป็นคนริเริ่มไอเดียเกี่ยวกับ KernelSU
- [Magisk](https://github.com/topjohnwu/Magisk): อุปกรณ์มือเกี่ยวกับรูทที่ทรงพลัง
- [genuine](https://github.com/brevent/genuine/): การออกลายเซ็นให้กับไฟล์ apk v2
- [Diamorphine](https://github.com/m0nad/Diamorphine): ความรู้ความสามารถเกี่ยวกับ rootkit
- [KernelSU](https://github.com/tiann/KernelSU): ต้องขอบคุณ tiann ถ้าไม่มีคนนั้นก็ไม่มีสิ่งที่เรียกว่า KernelSU เกิดขึ้น
- [Magic Mount Port](https://github.com/5ec1cff/KernelSU/blob/main/userspace/ksud/src/magic_mount.rs): 💜 5ec1cff ที่ช่วย KernelSU ไว้
- [Kernel-Assisted Superuser](https://git.zx2c4.com/kernel-assisted-superuser/about/): ที่เป็นคนริเริ่มไอเดีย KernelSU
- [Magisk](https://github.com/topjohnwu/Magisk): เครื่องมือรูทที่ทรงพลัง
- [genuine](https://github.com/brevent/genuine/): การตรวจสอบลายเซ็น APK v2
- [Diamorphine](https://github.com/m0nad/Diamorphine): ความรู้เกี่ยวกับ rootkit
- [KernelSU](https://github.com/tiann/KernelSU): ต้องขอบคุณ tiann ไม่งั้นจะไม่มี KernelSU ขึ้นมา
- [Magic Mount Port](https://github.com/5ec1cff/KernelSU/blob/main/userspace/ksud/src/magic_mount.rs): 💜 5ec1cff ที่ช่วย KernelSU เอาไว้!

View File

@@ -1,49 +1,63 @@
[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_UA.md) | [ภาษาไทย](README_TH.md) | [Tiếng Việt](README_VI.md) | [Italiano](README_IT.md) | [Polski](README_PL.md) | [Български](README_BG.md) | [日本語](README_JA.md)
# KernelSU Next
<img src="/assets/kernelsu_next.png" style="width: 96px;" alt="logo">
Android cihazlar için Kernel tabanlı bir root çözümü.
Android cihazlar için çekirdek tabanlı 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)
[![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)
[![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)
[![Son Sürüm](https://img.shields.io/github/v/release/KernelSU-Next/KernelSU-Next?label=Release&logo=github)](https://github.com/KernelSU-Next/KernelSU-Next/releases/latest)
[![Gece Sürümü](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)
[![Lisans: 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 Lisansı](https://img.shields.io/github/license/KernelSU-Next/KernelSU-Next?logo=gnu)](/LICENSE)
## Özellikler
1. Çekirdek tabanlı `su` ve kök erişim yönetimi.
2. Dinamik montaj sistemine dayalı modül sistemi [Magic Mount](https://topjohnwu.github.io/Magisk/details.html#magic-mount) / [OverlayFS](https://en.wikipedia.org/wiki/OverlayFS).
3. [App Profile](https://kernelsu.org/guide/app-profile.html): Kök gücünü bir kafese kilitleyin.
1. Çekirdek tabanlı `su` ve root erişimi yönetimi.
2. Dinamik bağlama sistemi [Magic Mount](https://topjohnwu.github.io/Magisk/details.html#magic-mount) / [OverlayFS](https://en.wikipedia.org/wiki/OverlayFS) tabanlı modül sistemi.
3. [Uygulama Profili](https://kernelsu.org/guide/app-profile.html): Root yetkisini bir kafese kilitleyin.
## Uyumluluk Durumu
KernelSU Next, 4.4'dan başlayarak 6.6'ya kadar çoğu Android çekirdeğini resmi olarak desteklemektedir.
- GKI 2.0 (5.10+) çekirdekleri önceden oluşturulmuş görüntüleri ve LKM/KMI'yi çalıştırabilir.
- GKI 1.0 (4.19 - 5.4) çekirdeklerinin KernelSU sürücüsü ile yeniden oluşturulması gerekir.
- EOL (<4.14) çekirdeklerinin de KernelSU sürücüsü ile yeniden oluşturulması gerekir. (3.18+ deneyseldir ve bazı fonksiyon geri yüklemelerine ihtiyaç duyulabilir.)
KernelSU Next, resmi olarak Android çekirdeklerinin çoğunu 4.4 sürümünden 6.6 sürümüne kadar destekler.
- GKI 2.0 (5.10+) çekirdekleri, hazır imajları ve LKM/KMI desteğini çalıştırabilir.
- GKI 1.0 (4.19 - 5.4) çekirdeklerinin KernelSU sürücüsü ile yeniden derlenmesi gerekir.
- EOL (<4.14) çekirdekler de KernelSU sürücüsüyle yeniden derlenmelidir (3.18+ deneysel olup bazı fonksiyonların geri aktarımı gerekebilir).
Şu anda sadece `arm64-v8a` desteklenmektedir.
Şu anda yalnızca `arm64-v8a` mimarisi desteklenmektedir.
## Kullanım
- [Kurulum Talimatı](https://rifsxd.github.io/KernelSU-Next/)
- [Kurulum Talimatları](https://ksunext.org/pages/installation.html)
## Güvenlik
KernelSU'daki güvenlik ıklarını bildirme hakkında bilgi için [SECURITY.md](/SECURITY.md) bölümüne bakın.
KernelSU'daki güvenlik ıklarını bildirme hakkında bilgi için bkz: [SECURITY.md](/SECURITY.md)
## Lisans
- `kernel` dizini altındaki dosyalar sadece [GPL-2.0](https://www.gnu.org/licenses/old-licenses/gpl-2.0.en.html) lisansına tabiidir.
- `kernel` dizini dışındaki diğer tüm kısımlar [GPL-3.0](https://www.gnu.org/licenses/gpl-3.0.html) ya da daha sonraki bir sürüm lisansa tabiidir.
- `kernel` dizinindeki dosyalar [GPL-2.0-only](https://www.gnu.org/licenses/old-licenses/gpl-2.0.en.html) lisanslıdır.
- `kernel` dizini dışındaki tüm diğer bölümler [GPL-3.0-or-later](https://www.gnu.org/licenses/gpl-3.0.html) lisansı altındadır.
## Krediler
## Bağışlar
- [kernel-assisted-superuser](https://git.zx2c4.com/kernel-assisted-superuser/about/): KernelSU fikri.
- [Magisk](https://github.com/topjohnwu/Magisk): güçlü kök aracı.
- [genuine](https://github.com/brevent/genuine/): apk v2 imza doğrulama.
- [Diamorphine](https://github.com/m0nad/Diamorphine): bazı rootkit becerileri.
- [KernelSU](https://github.com/tiann/KernelSU): tiann'a teşekkürler, yoksa KernelSU Next var olamazdı bile.
- [Magic Mount Port](https://github.com/5ec1cff/KernelSU/blob/main/userspace/ksud/src/magic_mount.rs): 💜 5ec1cff KernelSU'yu kurtardığınız için!
- 0x12b5224b7aca0121c2f003240a901e1d064371c1 [ USDT BEP20 ]
- TYUVMWGTcnR5svnDoX85DWHyqUAeyQcdjh [ USDT TRC20 ]
- 0x12b5224b7aca0121c2f003240a901e1d064371c1 [ USDT ERC20 ]
- 0x12b5224b7aca0121c2f003240a901e1d064371c1 [ ETH ERC20 ]
- Ld238uYBuRQdZB5YwdbkuU6ektBAAUByoL [ LTC ]
- 19QgifcjMjSr1wB2DJcea5cxitvWVcXMT6 [ BTC ]
## Katkıda Bulunanlar
- [Kernel-Assisted Superuser](https://git.zx2c4.com/kernel-assisted-superuser/about/): KernelSU fikrinin temeli.
- [Magisk](https://github.com/topjohnwu/Magisk): Güçlü root aracı.
- [genuine](https://github.com/brevent/genuine/): APK v2 imza doğrulama.
- [Diamorphine](https://github.com/m0nad/Diamorphine): Bazı rootkit teknikleri.
- [KernelSU](https://github.com/tiann/KernelSU): tiann'a teşekkürler, KernelSU Next onun sayesinde var.
- [Magic Mount Port](https://github.com/5ec1cff/KernelSU/blob/main/userspace/ksud/src/magic_mount.rs): 💜 KernelSU'yu kurtardığı için 5ec1cff'e teşekkürler!

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_UA.md) | [ภาษาไทย](README_TH.md) | [Tiếng Việt](README_VI.md) | [Italiano](README_IT.md) | [Polski](README_PL.md) | [Български](README_BG.md) | [日本語](README_JA.md)
# KernelSU Next
<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)
[![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)
[![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/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)
[![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) 的模塊系統。
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://ksunext.org/pages/installation.html)
## 安全性
@@ -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 工具.
- [genuine](https://github.com/brevent/genuine/): apk v2 簽名驗證
- [genuine](https://github.com/brevent/genuine/): APK v2 簽名驗證
- [Diamorphine](https://github.com/m0nad/Diamorphine): 一些 Rootkit 技巧
- [KernelSU](https://github.com/tiann/KernelSU): 感謝 tiann否則 KernelSU Next 根本不會存在
- [Magic Mount Port](https://github.com/5ec1cff/KernelSU/blob/main/userspace/ksud/src/magic_mount.rs): 💜 5ec1cff 為了拯救 KernelSU

66
docs/README_UA.md Normal file
View File

@@ -0,0 +1,66 @@
[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](README_VI.md) | [Italiano](README_IT.md) | [Polski](README_PL.md) | [Български](README_BG.md) | [日本語](README_JA.md) | **Українська**
# KernelSU Next
<img src="/assets/kernelsu_next.png" style="width: 96px;" alt="logo">
Рут-рішення на основі ядра для пристроїв Android.
[![Останній реліз](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/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)
[![GitHub Ліцензія](https://img.shields.io/github/license/KernelSU-Next/KernelSU-Next?logo=gnu)](/LICENSE)
> [!IMPORTANT]
> Підтримка встановлення KernelSU Next способом модуля ядра через менеджер була вимкнена, натомість ви можете самі оновити його перепаковуючи ```init_boot``` вручну.
## Можливості
1. `su` на основі ядра та можливість контролювати дозволи руту.
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. [Профілі додатків](https://kernelsu.org/guide/app-profile.html): Обмеж права руту для додатків.
## Compatibility state
KernelSU Next офіційно підтримує більшість Android ядер починаючи з 4.4 і до 6.6.
- Користувачі GKI 2.0 (5.10+) ядра можуть використовувати готові образи та LKM/KMI.
- Користувачі GKI 1.0 (4.19 - 5.4) ядра мають бути перезібрані з драйвером KernelSU.
- Користувачі EOL (<4.14) ядра також мають бути перезібрані з драйвером KernelSU (Підтримка 3.18+ експерементальна і потребує бекпортів деяких функцій в ядрі).
На даний момент підтримується лише архітектура `armv8-a`.
## Спосіб використання
- [Інструкція для встановлення/інтеграції](https://ksunext.org/pages/installation.html)
## Безпека
Для інформації зв'язаною з безпекою дивіться [SECURITY.md](/SECURITY.md).
## Ліцензія
- Всі файли в директорії `kernel` мають ліцензію [GPL-2.0-only](https://www.gnu.org/licenses/old-licenses/gpl-2.0.en.html).
- Всі інші файли виключаючи директорію `kernel` мають ліцензію [GPL-3.0-or-later](https://www.gnu.org/licenses/gpl-3.0.html).
## Підтримка розробника
- 0x12b5224b7aca0121c2f003240a901e1d064371c1 [ USDT BEP20 ]
- TYUVMWGTcnR5svnDoX85DWHyqUAeyQcdjh [ USDT TRC20 ]
- 0x12b5224b7aca0121c2f003240a901e1d064371c1 [ USDT ERC20 ]
- 0x12b5224b7aca0121c2f003240a901e1d064371c1 [ ETH ERC20 ]
- Ld238uYBuRQdZB5YwdbkuU6ektBAAUByoL [ LTC ]
- 19QgifcjMjSr1wB2DJcea5cxitvWVcXMT6 [ BTC ]
## Подяки
- [Kernel-Assisted Superuser](https://git.zx2c4.com/kernel-assisted-superuser/about/): Ідея KernelSU.
- [Magisk](https://github.com/topjohnwu/Magisk): Потужний засіб руту.
- [genuine](https://github.com/brevent/genuine/): Перевірка підпису APK v2.
- [Diamorphine](https://github.com/m0nad/Diamorphine): Деякі руткіт скіли.
- [KernelSU](https://github.com/tiann/KernelSU): Дякую tiann, інакше KernelSU Next ніколи б не існував.
- [Magic Mount Port](https://github.com/5ec1cff/KernelSU/blob/main/userspace/ksud/src/magic_mount.rs): Дякую 💜 5ec1cff за збереження KernelSU!

63
docs/README_VI.md Normal file
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_UA.md) | [ภาษาไทย](README_TH.md) | **Tiếng Việt** | [Italiano](README_IT.md) | [Polski](README_PL.md) | [Български](README_BG.md) | [日本語](README_JA.md)
# 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 thể cần backports 1 vài thứ ).
Hiện tại kernelSU Next chỉ hỗ trợ những cpu `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://ksunext.org/pages/installation.html)
## 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` 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` 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 tương thích cao cho các thiết bị chạy Android.
- [genuine](https://github.com/brevent/genuine/): Chữ 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
module will be called kernelsu.
config KSU_KPROBES_HOOK
bool "Use kprobes for kernelsu"
depends on KSU
depends on KPROBES
default y
help
Disable if you use manual hooks.
config KSU_DEBUG
bool "KernelSU debug mode"
depends on KSU
@@ -24,4 +32,12 @@ config KSU_ALLOWLIST_WORKAROUND
Enable session keyring init workaround for problematic devices.
Useful for situations where the SU allowlist is not kept after a reboot.
config KSU_LSM_SECURITY_HOOKS
bool "use lsm security hooks"
depends on KSU
default y
help
Disabling this is mostly only useful for kernel 4.1 and older.
Make sure to implement manual hooks on security/security.c.
endmenu

View File

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

View File

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

View File

@@ -7,7 +7,9 @@
#include <linux/kallsyms.h>
#include <linux/kernel.h>
#include <linux/kprobes.h>
#ifdef CONFIG_KSU_LSM_SECURITY_HOOKS
#include <linux/lsm_hooks.h>
#endif
#include <linux/mm.h>
#include <linux/nsproxy.h>
#include <linux/path.h>
@@ -53,6 +55,10 @@ static bool ksu_module_mounted = false;
extern int handle_sepolicy(unsigned long arg3, void __user *arg4);
static bool ksu_su_compat_enabled = true;
extern void ksu_sucompat_init();
extern void ksu_sucompat_exit();
static inline bool is_allow_su()
{
if (is_manager()) {
@@ -169,6 +175,7 @@ void escape_to_root(void)
cred->fsgid.val = profile->gid;
cred->sgid.val = profile->gid;
cred->egid.val = profile->gid;
cred->securebits = 0;
BUILD_BUG_ON(sizeof(profile->capabilities.effective) !=
sizeof(kernel_cap_t));
@@ -180,14 +187,10 @@ void escape_to_root(void)
profile->capabilities.effective | CAP_DAC_READ_SEARCH;
memcpy(&cred->cap_effective, &cap_for_ksud,
sizeof(cred->cap_effective));
memcpy(&cred->cap_inheritable, &profile->capabilities.effective,
sizeof(cred->cap_inheritable));
memcpy(&cred->cap_permitted, &profile->capabilities.effective,
sizeof(cred->cap_permitted));
memcpy(&cred->cap_bset, &profile->capabilities.effective,
sizeof(cred->cap_bset));
memcpy(&cred->cap_ambient, &profile->capabilities.effective,
sizeof(cred->cap_ambient));
// set ambient caps to all-zero
// fixes "operation not permitted" on dbus cap dropping
memset(&cred->cap_ambient, 0,
@@ -247,6 +250,26 @@ int ksu_handle_rename(struct dentry *old_dentry, struct dentry *new_dentry)
return 0;
}
static void nuke_ext4_sysfs() {
struct path path;
int err = kern_path("/data/adb/modules", 0, &path);
if (err) {
pr_err("nuke path err: %d\n", err);
return;
}
struct super_block* sb = path.dentry->d_inode->i_sb;
const char* name = sb->s_type->name;
if (strcmp(name, "ext4") != 0) {
pr_info("nuke but module aren't mounted\n");
path_put(&path);
return;
}
ext4_unregister_sysfs(sb);
path_put(&path);
}
int ksu_handle_prctl(int option, unsigned long arg2, unsigned long arg3,
unsigned long arg4, unsigned long arg5)
{
@@ -305,17 +328,29 @@ int ksu_handle_prctl(int option, unsigned long arg2, unsigned long arg3,
if (copy_to_user(arg3, &version, sizeof(version))) {
pr_err("prctl reply error, cmd: %lu\n", arg2);
}
u32 version_flags = 0;
#ifdef MODULE
u32 is_lkm = 0x1;
#else
u32 is_lkm = 0x0;
version_flags |= 0x1;
#endif
if (arg4 && copy_to_user(arg4, &is_lkm, sizeof(is_lkm))) {
if (arg4 &&
copy_to_user(arg4, &version_flags, sizeof(version_flags))) {
pr_err("prctl reply error, cmd: %lu\n", arg2);
}
return 0;
}
if (arg2 == CMD_HOOK_MODE) {
#ifdef CONFIG_KSU_KPROBES_HOOK
const char *mode = "Kprobes";
#else
const char *mode = "Manual";
#endif
if (copy_to_user((void __user *)arg3, mode, strlen(mode) + 1)) {
pr_info("hook: copy_to_user() failed\n");
}
return 0;
}
if (arg2 == CMD_REPORT_EVENT) {
if (!from_root) {
return 0;
@@ -341,6 +376,7 @@ int ksu_handle_prctl(int option, unsigned long arg2, unsigned long arg3,
case EVENT_MODULE_MOUNTED: {
ksu_module_mounted = true;
pr_info("module mounted!\n");
nuke_ext4_sysfs();
break;
}
default:
@@ -456,6 +492,42 @@ int ksu_handle_prctl(int option, unsigned long arg2, unsigned long arg3,
return 0;
}
if (arg2 == CMD_IS_SU_ENABLED) {
if (copy_to_user(arg3, &ksu_su_compat_enabled,
sizeof(ksu_su_compat_enabled))) {
pr_err("copy su compat failed\n");
return 0;
}
if (copy_to_user(result, &reply_ok, sizeof(reply_ok))) {
pr_err("prctl reply error, cmd: %lu\n", arg2);
}
return 0;
}
if (arg2 == CMD_ENABLE_SU) {
bool enabled = (arg3 != 0);
if (enabled == ksu_su_compat_enabled) {
pr_info("cmd enable su but no need to change.\n");
if (copy_to_user(result, &reply_ok, sizeof(reply_ok))) {// return the reply_ok directly
pr_err("prctl reply error, cmd: %lu\n", arg2);
}
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;
}
@@ -576,6 +648,7 @@ int ksu_handle_setuid(struct cred *new, const struct cred *old)
// fixme: use `collect_mounts` and `iterate_mount` to iterate all mountpoint and
// filter the mountpoint whose target is `/data/adb`
try_umount("/odm", true, 0);
try_umount("/system", true, 0);
try_umount("/system_ext", true, 0);
try_umount("/vendor", true, 0);
@@ -589,6 +662,10 @@ int ksu_handle_setuid(struct cred *new, const struct cred *old)
// try umount hosts file
try_umount("/system/etc/hosts", false, MNT_DETACH);
// try umount lsposed dex2oat bins
try_umount("/apex/com.android.art/bin/dex2oat64", false, MNT_DETACH);
try_umount("/apex/com.android.art/bin/dex2oat32", false, MNT_DETACH);
return 0;
}
@@ -661,15 +738,9 @@ __maybe_unused int ksu_kprobe_exit(void)
return 0;
}
static int ksu_task_prctl(int option, unsigned long arg2, unsigned long arg3,
unsigned long arg4, unsigned long arg5)
{
ksu_handle_prctl(option, arg2, arg3, arg4, arg5);
return -ENOSYS;
}
// kernel 4.4 and 4.9
// kernel 4.9 and older
#if LINUX_VERSION_CODE < KERNEL_VERSION(4, 10, 0) || defined(CONFIG_IS_HW_HISI) || defined(CONFIG_KSU_ALLOWLIST_WORKAROUND)
static int ksu_key_permission(key_ref_t key_ref, const struct cred *cred,
int ksu_key_permission(key_ref_t key_ref, const struct cred *cred,
unsigned perm)
{
if (init_session_keyring != NULL) {
@@ -684,6 +755,15 @@ static int ksu_key_permission(key_ref_t key_ref, const struct cred *cred,
return 0;
}
#endif
#ifdef CONFIG_KSU_LSM_SECURITY_HOOKS
static int ksu_task_prctl(int option, unsigned long arg2, unsigned long arg3,
unsigned long arg4, unsigned long arg5)
{
ksu_handle_prctl(option, arg2, arg3, arg4, arg5);
return -ENOSYS;
}
static int ksu_inode_rename(struct inode *old_inode, struct dentry *old_dentry,
struct inode *new_inode, struct dentry *new_dentry)
{
@@ -882,16 +962,21 @@ void __init ksu_lsm_hook_init(void)
}
smp_mb();
}
#endif
#endif // MODULE
#endif // CONFIG_KSU_LSM_SECURITY_HOOKS
void __init ksu_core_init(void)
{
#ifdef CONFIG_KSU_LSM_SECURITY_HOOKS
ksu_lsm_hook_init();
#else
pr_info("ksu_core_init: LSM hooks not in use.\n");
#endif
}
void ksu_core_exit(void)
{
#ifdef CONFIG_KPROBES
#ifdef CONFIG_KSU_KPROBES_HOOK
pr_info("ksu_core_kprobe_exit\n");
// we dont use this now
// 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,
loff_t *pos)
{
#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 14, 0)
#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 14, 0) || defined(KSU_KERNEL_READ)
return kernel_read(p, buf, count, pos);
#else
loff_t offset = pos ? *pos : 0;
@@ -122,7 +122,7 @@ ssize_t ksu_kernel_read_compat(struct file *p, void *buf, size_t count,
ssize_t ksu_kernel_write_compat(struct file *p, const void *buf, size_t count,
loff_t *pos)
{
#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 14, 0)
#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 14, 0) || defined(KSU_KERNEL_WRITE)
return kernel_write(p, buf, count, pos);
#else
loff_t offset = pos ? *pos : 0;
@@ -134,7 +134,7 @@ ssize_t ksu_kernel_write_compat(struct file *p, const void *buf, size_t count,
#endif
}
#if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 8, 0)
#if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 8, 0) || defined(KSU_STRNCPY_FROM_USER_NOFAULT)
long ksu_strncpy_from_user_nofault(char *dst, const void __user *unsafe_addr,
long count)
{

View File

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

View File

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

View File

@@ -54,18 +54,23 @@ static void stop_vfs_read_hook();
static void stop_execve_hook();
static void stop_input_hook();
#ifdef CONFIG_KPROBES
#ifdef CONFIG_KSU_KPROBES_HOOK
static struct work_struct stop_vfs_read_work;
static struct work_struct stop_execve_hook_work;
static struct work_struct stop_input_hook_work;
#else
#endif
bool ksu_vfs_read_hook __read_mostly = true;
bool ksu_execveat_hook __read_mostly = true;
bool ksu_input_hook __read_mostly = true;
#endif
u32 ksu_devpts_sid;
#ifdef CONFIG_COMPAT
bool ksu_is_compat __read_mostly = false;
#endif
void on_post_fs_data(void)
{
static bool done = false;
@@ -107,6 +112,7 @@ static const char __user *get_user_arg_ptr(struct user_arg_ptr argv, int nr)
if (get_user(compat, argv.ptr.compat + nr))
return ERR_PTR(-EFAULT);
ksu_is_compat = true;
return compat_ptr(compat);
}
#endif
@@ -157,7 +163,7 @@ int ksu_handle_execveat_ksud(int *fd, struct filename **filename_ptr,
struct user_arg_ptr *argv,
struct user_arg_ptr *envp, int *flags)
{
#ifndef CONFIG_KPROBES
#ifndef CONFIG_KSU_KPROBES_HOOK
if (!ksu_execveat_hook) {
return 0;
}
@@ -313,7 +319,7 @@ static ssize_t read_iter_proxy(struct kiocb *iocb, struct iov_iter *to)
int ksu_handle_vfs_read(struct file **file_ptr, char __user **buf_ptr,
size_t *count_ptr, loff_t **pos)
{
#ifndef CONFIG_KPROBES
#ifndef CONFIG_KSU_KPROBES_HOOK
if (!ksu_vfs_read_hook) {
return 0;
}
@@ -426,7 +432,7 @@ static bool is_volumedown_enough(unsigned int count)
int ksu_handle_input_handle_event(unsigned int *type, unsigned int *code,
int *value)
{
#ifndef CONFIG_KPROBES
#ifndef CONFIG_KSU_KPROBES_HOOK
if (!ksu_input_hook) {
return 0;
}
@@ -468,7 +474,37 @@ bool ksu_is_safe_mode()
return false;
}
#ifdef CONFIG_KPROBES
/*
* ksu_handle_execve_ksud, execve_ksud handler for non kprobe
* adapted from sys_execve_handler_pre
* https://github.com/tiann/KernelSU/commit/2027ac3
*/
__maybe_unused int ksu_handle_execve_ksud(const char __user *filename_user,
const char __user *const __user *__argv)
{
struct user_arg_ptr argv = { .ptr.native = __argv };
struct filename filename_in, *filename_p;
char path[32];
// return early if disabled.
if (!ksu_execveat_hook) {
return 0;
}
if (!filename_user)
return 0;
memset(path, 0, sizeof(path));
ksu_strncpy_from_user_nofault(path, filename_user, 32);
// this is because ksu_handle_execveat_ksud calls it filename->name
filename_in.name = path;
filename_p = &filename_in;
return ksu_handle_execveat_ksud(AT_FDCWD, &filename_p, &argv, NULL, NULL);
}
#ifdef CONFIG_KSU_KPROBES_HOOK
// https://elixir.bootlin.com/linux/v5.10.158/source/fs/exec.c#L1864
static int execve_handler_pre(struct kprobe *p, struct pt_regs *regs)
@@ -598,7 +634,7 @@ static void do_stop_input_hook(struct work_struct *work)
static void stop_vfs_read_hook()
{
#ifdef CONFIG_KPROBES
#ifdef CONFIG_KSU_KPROBES_HOOK
bool ret = schedule_work(&stop_vfs_read_work);
pr_info("unregister vfs_read kprobe: %d!\n", ret);
#else
@@ -609,7 +645,7 @@ static void stop_vfs_read_hook()
static void stop_execve_hook()
{
#ifdef CONFIG_KPROBES
#ifdef CONFIG_KSU_KPROBES_HOOK
bool ret = schedule_work(&stop_execve_hook_work);
pr_info("unregister execve kprobe: %d!\n", ret);
#else
@@ -620,15 +656,16 @@ static void stop_execve_hook()
static void stop_input_hook()
{
#ifdef CONFIG_KSU_KPROBES_HOOK
static bool input_hook_stopped = false;
if (input_hook_stopped) {
return;
}
input_hook_stopped = true;
#ifdef CONFIG_KPROBES
bool ret = schedule_work(&stop_input_hook_work);
pr_info("unregister input kprobe: %d!\n", ret);
#else
if (!ksu_input_hook) { return; }
ksu_input_hook = false;
pr_info("stop input_hook\n");
#endif
@@ -637,7 +674,7 @@ static void stop_input_hook()
// ksud: module support
void ksu_ksud_init()
{
#ifdef CONFIG_KPROBES
#ifdef CONFIG_KSU_KPROBES_HOOK
int ret;
ret = register_kprobe(&execve_kp);
@@ -657,10 +694,10 @@ void ksu_ksud_init()
void ksu_ksud_exit()
{
#ifdef CONFIG_KPROBES
#ifdef CONFIG_KSU_KPROBES_HOOK
unregister_kprobe(&execve_kp);
// this should be done before unregister vfs_read_kp
// unregister_kprobe(&vfs_read_kp);
unregister_kprobe(&input_event_kp);
#endif
}
}

View File

@@ -149,17 +149,45 @@ void apply_kernelsu_rules()
#define CMD_TYPE_CHANGE 8
#define CMD_GENFSCON 9
#ifdef CONFIG_64BIT
struct sepol_data {
u32 cmd;
u32 subcmd;
char __user *sepol1;
char __user *sepol2;
char __user *sepol3;
char __user *sepol4;
char __user *sepol5;
char __user *sepol6;
char __user *sepol7;
u64 field_sepol1;
u64 field_sepol2;
u64 field_sepol3;
u64 field_sepol4;
u64 field_sepol5;
u64 field_sepol6;
u64 field_sepol7;
};
#ifdef CONFIG_COMPAT
extern bool ksu_is_compat __read_mostly;
struct sepol_compat_data {
u32 cmd;
u32 subcmd;
u32 field_sepol1;
u32 field_sepol2;
u32 field_sepol3;
u32 field_sepol4;
u32 field_sepol5;
u32 field_sepol6;
u32 field_sepol7;
};
#endif // CONFIG_COMPAT
#else
struct sepol_data {
u32 cmd;
u32 subcmd;
u32 field_sepol1;
u32 field_sepol2;
u32 field_sepol3;
u32 field_sepol4;
u32 field_sepol5;
u32 field_sepol6;
u32 field_sepol7;
};
#endif // CONFIG_64BIT
static int get_object(char *buf, char __user *user_object, size_t buf_sz,
char **object)
@@ -204,15 +232,59 @@ int handle_sepolicy(unsigned long arg3, void __user *arg4)
if (!getenforce()) {
pr_info("SELinux permissive or disabled when handle policy!\n");
}
u32 cmd, subcmd;
char __user *sepol1, *sepol2, *sepol3, *sepol4, *sepol5, *sepol6, *sepol7;
#if defined(CONFIG_64BIT) && defined(CONFIG_COMPAT)
if (unlikely(ksu_is_compat)) {
struct sepol_compat_data compat_data;
if (copy_from_user(&compat_data, arg4, sizeof(struct sepol_compat_data))) {
pr_err("sepol: copy sepol_data failed.\n");
return -1;
}
sepol1 = compat_ptr(compat_data.field_sepol1);
sepol2 = compat_ptr(compat_data.field_sepol2);
sepol3 = compat_ptr(compat_data.field_sepol3);
sepol4 = compat_ptr(compat_data.field_sepol4);
sepol5 = compat_ptr(compat_data.field_sepol5);
sepol6 = compat_ptr(compat_data.field_sepol6);
sepol7 = compat_ptr(compat_data.field_sepol7);
cmd = compat_data.cmd;
subcmd = compat_data.subcmd;
} else {
struct sepol_data data;
if (copy_from_user(&data, arg4, sizeof(struct sepol_data))) {
pr_err("sepol: copy sepol_data failed.\n");
return -1;
}
sepol1 = data.field_sepol1;
sepol2 = data.field_sepol2;
sepol3 = data.field_sepol3;
sepol4 = data.field_sepol4;
sepol5 = data.field_sepol5;
sepol6 = data.field_sepol6;
sepol7 = data.field_sepol7;
cmd = data.cmd;
subcmd = data.subcmd;
}
#else
// basically for full native, say (64BIT=y COMPAT=n) || (64BIT=n)
struct sepol_data data;
if (copy_from_user(&data, arg4, sizeof(struct sepol_data))) {
pr_err("sepol: copy sepol_data failed.\n");
return -1;
}
u32 cmd = data.cmd;
u32 subcmd = data.subcmd;
sepol1 = data.field_sepol1;
sepol2 = data.field_sepol2;
sepol3 = data.field_sepol3;
sepol4 = data.field_sepol4;
sepol5 = data.field_sepol5;
sepol6 = data.field_sepol6;
sepol7 = data.field_sepol7;
cmd = data.cmd;
subcmd = data.subcmd;
#endif
rcu_read_lock();
@@ -226,22 +298,22 @@ int handle_sepolicy(unsigned long arg3, void __user *arg4)
char perm_buf[MAX_SEPOL_LEN];
char *s, *t, *c, *p;
if (get_object(src_buf, data.sepol1, sizeof(src_buf), &s) < 0) {
if (get_object(src_buf, sepol1, sizeof(src_buf), &s) < 0) {
pr_err("sepol: copy src failed.\n");
goto exit;
}
if (get_object(tgt_buf, data.sepol2, sizeof(tgt_buf), &t) < 0) {
if (get_object(tgt_buf, sepol2, sizeof(tgt_buf), &t) < 0) {
pr_err("sepol: copy tgt failed.\n");
goto exit;
}
if (get_object(cls_buf, data.sepol3, sizeof(cls_buf), &c) < 0) {
if (get_object(cls_buf, sepol3, sizeof(cls_buf), &c) < 0) {
pr_err("sepol: copy cls failed.\n");
goto exit;
}
if (get_object(perm_buf, data.sepol4, sizeof(perm_buf), &p) <
if (get_object(perm_buf, sepol4, sizeof(perm_buf), &p) <
0) {
pr_err("sepol: copy perm failed.\n");
goto exit;
@@ -271,24 +343,24 @@ int handle_sepolicy(unsigned long arg3, void __user *arg4)
char perm_set[MAX_SEPOL_LEN];
char *s, *t, *c;
if (get_object(src_buf, data.sepol1, sizeof(src_buf), &s) < 0) {
if (get_object(src_buf, sepol1, sizeof(src_buf), &s) < 0) {
pr_err("sepol: copy src failed.\n");
goto exit;
}
if (get_object(tgt_buf, data.sepol2, sizeof(tgt_buf), &t) < 0) {
if (get_object(tgt_buf, sepol2, sizeof(tgt_buf), &t) < 0) {
pr_err("sepol: copy tgt failed.\n");
goto exit;
}
if (get_object(cls_buf, data.sepol3, sizeof(cls_buf), &c) < 0) {
if (get_object(cls_buf, sepol3, sizeof(cls_buf), &c) < 0) {
pr_err("sepol: copy cls failed.\n");
goto exit;
}
if (strncpy_from_user(operation, data.sepol4,
if (strncpy_from_user(operation, sepol4,
sizeof(operation)) < 0) {
pr_err("sepol: copy operation failed.\n");
goto exit;
}
if (strncpy_from_user(perm_set, data.sepol5, sizeof(perm_set)) <
if (strncpy_from_user(perm_set, sepol5, sizeof(perm_set)) <
0) {
pr_err("sepol: copy perm_set failed.\n");
goto exit;
@@ -308,7 +380,7 @@ int handle_sepolicy(unsigned long arg3, void __user *arg4)
} else if (cmd == CMD_TYPE_STATE) {
char src[MAX_SEPOL_LEN];
if (strncpy_from_user(src, data.sepol1, sizeof(src)) < 0) {
if (strncpy_from_user(src, sepol1, sizeof(src)) < 0) {
pr_err("sepol: copy src failed.\n");
goto exit;
}
@@ -328,11 +400,11 @@ int handle_sepolicy(unsigned long arg3, void __user *arg4)
char type[MAX_SEPOL_LEN];
char attr[MAX_SEPOL_LEN];
if (strncpy_from_user(type, data.sepol1, sizeof(type)) < 0) {
if (strncpy_from_user(type, sepol1, sizeof(type)) < 0) {
pr_err("sepol: copy type failed.\n");
goto exit;
}
if (strncpy_from_user(attr, data.sepol2, sizeof(attr)) < 0) {
if (strncpy_from_user(attr, sepol2, sizeof(attr)) < 0) {
pr_err("sepol: copy attr failed.\n");
goto exit;
}
@@ -352,7 +424,7 @@ int handle_sepolicy(unsigned long arg3, void __user *arg4)
} else if (cmd == CMD_ATTR) {
char attr[MAX_SEPOL_LEN];
if (strncpy_from_user(attr, data.sepol1, sizeof(attr)) < 0) {
if (strncpy_from_user(attr, sepol1, sizeof(attr)) < 0) {
pr_err("sepol: copy attr failed.\n");
goto exit;
}
@@ -369,28 +441,28 @@ int handle_sepolicy(unsigned long arg3, void __user *arg4)
char default_type[MAX_SEPOL_LEN];
char object[MAX_SEPOL_LEN];
if (strncpy_from_user(src, data.sepol1, sizeof(src)) < 0) {
if (strncpy_from_user(src, sepol1, sizeof(src)) < 0) {
pr_err("sepol: copy src failed.\n");
goto exit;
}
if (strncpy_from_user(tgt, data.sepol2, sizeof(tgt)) < 0) {
if (strncpy_from_user(tgt, sepol2, sizeof(tgt)) < 0) {
pr_err("sepol: copy tgt failed.\n");
goto exit;
}
if (strncpy_from_user(cls, data.sepol3, sizeof(cls)) < 0) {
if (strncpy_from_user(cls, sepol3, sizeof(cls)) < 0) {
pr_err("sepol: copy cls failed.\n");
goto exit;
}
if (strncpy_from_user(default_type, data.sepol4,
if (strncpy_from_user(default_type, sepol4,
sizeof(default_type)) < 0) {
pr_err("sepol: copy default_type failed.\n");
goto exit;
}
char *real_object;
if (data.sepol5 == NULL) {
if (sepol5 == NULL) {
real_object = NULL;
} else {
if (strncpy_from_user(object, data.sepol5,
if (strncpy_from_user(object, sepol5,
sizeof(object)) < 0) {
pr_err("sepol: copy object failed.\n");
goto exit;
@@ -409,19 +481,19 @@ int handle_sepolicy(unsigned long arg3, void __user *arg4)
char cls[MAX_SEPOL_LEN];
char default_type[MAX_SEPOL_LEN];
if (strncpy_from_user(src, data.sepol1, sizeof(src)) < 0) {
if (strncpy_from_user(src, sepol1, sizeof(src)) < 0) {
pr_err("sepol: copy src failed.\n");
goto exit;
}
if (strncpy_from_user(tgt, data.sepol2, sizeof(tgt)) < 0) {
if (strncpy_from_user(tgt, sepol2, sizeof(tgt)) < 0) {
pr_err("sepol: copy tgt failed.\n");
goto exit;
}
if (strncpy_from_user(cls, data.sepol3, sizeof(cls)) < 0) {
if (strncpy_from_user(cls, sepol3, sizeof(cls)) < 0) {
pr_err("sepol: copy cls failed.\n");
goto exit;
}
if (strncpy_from_user(default_type, data.sepol4,
if (strncpy_from_user(default_type, sepol4,
sizeof(default_type)) < 0) {
pr_err("sepol: copy default_type failed.\n");
goto exit;
@@ -442,15 +514,15 @@ int handle_sepolicy(unsigned long arg3, void __user *arg4)
char name[MAX_SEPOL_LEN];
char path[MAX_SEPOL_LEN];
char context[MAX_SEPOL_LEN];
if (strncpy_from_user(name, data.sepol1, sizeof(name)) < 0) {
if (strncpy_from_user(name, sepol1, sizeof(name)) < 0) {
pr_err("sepol: copy name failed.\n");
goto exit;
}
if (strncpy_from_user(path, data.sepol2, sizeof(path)) < 0) {
if (strncpy_from_user(path, sepol2, sizeof(path)) < 0) {
pr_err("sepol: copy path failed.\n");
goto exit;
}
if (strncpy_from_user(context, data.sepol3, sizeof(context)) <
if (strncpy_from_user(context, sepol3, sizeof(context)) <
0) {
pr_err("sepol: copy context failed.\n");
goto exit;

View File

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

View File

@@ -24,6 +24,10 @@
#define SU_PATH "/system/bin/su"
#define SH_PATH "/system/bin/sh"
#ifndef CONFIG_KSU_KPROBES_HOOK
static bool ksu_sucompat_non_kp __read_mostly = true;
#endif
extern void escape_to_root();
static void __user *userspace_stack_buffer(const void *d, size_t len)
@@ -54,6 +58,12 @@ int ksu_handle_faccessat(int *dfd, const char __user **filename_user, int *mode,
{
const char su[] = SU_PATH;
#ifndef CONFIG_KSU_KPROBES_HOOK
if (!ksu_sucompat_non_kp) {
return 0;
}
#endif
if (!ksu_is_allow_uid(current_uid().val)) {
return 0;
}
@@ -75,6 +85,12 @@ int ksu_handle_stat(int *dfd, const char __user **filename_user, int *flags)
// const char sh[] = SH_PATH;
const char su[] = SU_PATH;
#ifndef CONFIG_KSU_KPROBES_HOOK
if (!ksu_sucompat_non_kp){
return 0;
}
#endif
if (!ksu_is_allow_uid(current_uid().val)) {
return 0;
}
@@ -119,6 +135,12 @@ int ksu_handle_execveat_sucompat(int *fd, struct filename **filename_ptr,
const char sh[] = KSUD_PATH;
const char su[] = SU_PATH;
#ifndef CONFIG_KSU_KPROBES_HOOK
if (!ksu_sucompat_non_kp) {
return 0;
}
#endif
if (unlikely(!filename_ptr))
return 0;
@@ -148,11 +170,32 @@ int ksu_handle_execve_sucompat(int *fd, const char __user **filename_user,
const char su[] = SU_PATH;
char path[sizeof(su) + 1];
#ifndef CONFIG_KSU_KPROBES_HOOK
if (!ksu_sucompat_non_kp) {
return 0;
}
#endif
if (unlikely(!filename_user))
return 0;
memset(path, 0, sizeof(path));
ksu_strncpy_from_user_nofault(path, *filename_user, sizeof(path));
// nofault variant fails probably due to pagefault_disable
// some cpus dont really have that good speculative execution
// substitute set_fs, check if pointer is valid
#if LINUX_VERSION_CODE < KERNEL_VERSION(5,0,0)
if (!access_ok(VERIFY_READ, *filename_user, sizeof(path)))
return 0;
#else
if (!access_ok(*filename_user, sizeof(path)))
return 0;
#endif
// success = returns number of bytes and should be less than path
long len = strncpy_from_user(path, *filename_user, sizeof(path));
if (len <= 0 || len > sizeof(path))
return 0;
// strncpy_from_user_nofault does this too
path[sizeof(path) - 1] = '\0';
if (likely(memcmp(path, su, sizeof(su))))
return 0;
@@ -170,6 +213,12 @@ int ksu_handle_execve_sucompat(int *fd, const char __user **filename_user,
int ksu_handle_devpts(struct inode *inode)
{
#ifndef CONFIG_KSU_KPROBES_HOOK
if (!ksu_sucompat_non_kp) {
return 0;
}
#endif
if (!current->mm) {
return 0;
}
@@ -198,21 +247,9 @@ int ksu_handle_devpts(struct inode *inode)
return 0;
}
#ifdef CONFIG_KPROBES
#ifdef CONFIG_KSU_KPROBES_HOOK
__maybe_unused static int faccessat_handler_pre(struct kprobe *p,
struct pt_regs *regs)
{
int *dfd = (int *)&PT_REGS_PARM1(regs);
const char __user **filename_user = (const char **)&PT_REGS_PARM2(regs);
int *mode = (int *)&PT_REGS_PARM3(regs);
// Both sys_ and do_ is C function
int *flags = (int *)&PT_REGS_CCALL_PARM4(regs);
return ksu_handle_faccessat(dfd, filename_user, mode, flags);
}
static int sys_faccessat_handler_pre(struct kprobe *p, struct pt_regs *regs)
static int faccessat_handler_pre(struct kprobe *p, struct pt_regs *regs)
{
struct pt_regs *real_regs = PT_REAL_REGS(regs);
int *dfd = (int *)&PT_REGS_PARM1(real_regs);
@@ -223,23 +260,7 @@ static int sys_faccessat_handler_pre(struct kprobe *p, struct pt_regs *regs)
return ksu_handle_faccessat(dfd, filename_user, mode, NULL);
}
__maybe_unused static int newfstatat_handler_pre(struct kprobe *p,
struct pt_regs *regs)
{
int *dfd = (int *)&PT_REGS_PARM1(regs);
const char __user **filename_user = (const char **)&PT_REGS_PARM2(regs);
#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 11, 0)
// static int vfs_statx(int dfd, const char __user *filename, int flags, struct kstat *stat, u32 request_mask)
int *flags = (int *)&PT_REGS_PARM3(regs);
#else
// int vfs_fstatat(int dfd, const char __user *filename, struct kstat *stat,int flag)
int *flags = (int *)&PT_REGS_CCALL_PARM4(regs);
#endif
return ksu_handle_stat(dfd, filename_user, flags);
}
static int sys_newfstatat_handler_pre(struct kprobe *p, struct pt_regs *regs)
static int newfstatat_handler_pre(struct kprobe *p, struct pt_regs *regs)
{
struct pt_regs *real_regs = PT_REAL_REGS(regs);
int *dfd = (int *)&PT_REGS_PARM1(real_regs);
@@ -250,17 +271,7 @@ static int sys_newfstatat_handler_pre(struct kprobe *p, struct pt_regs *regs)
return ksu_handle_stat(dfd, filename_user, flags);
}
// https://elixir.bootlin.com/linux/v5.10.158/source/fs/exec.c#L1864
static int execve_handler_pre(struct kprobe *p, struct pt_regs *regs)
{
int *fd = (int *)&PT_REGS_PARM1(regs);
struct filename **filename_ptr =
(struct filename **)&PT_REGS_PARM2(regs);
return ksu_handle_execveat_sucompat(fd, filename_ptr, NULL, NULL, NULL);
}
static int sys_execve_handler_pre(struct kprobe *p, struct pt_regs *regs)
{
struct pt_regs *real_regs = PT_REAL_REGS(regs);
const char __user **filename_user =
@@ -270,56 +281,6 @@ static int sys_execve_handler_pre(struct kprobe *p, struct pt_regs *regs)
NULL);
}
#if 1
static struct kprobe faccessat_kp = {
.symbol_name = SYS_FACCESSAT_SYMBOL,
.pre_handler = sys_faccessat_handler_pre,
};
#else
static struct kprobe faccessat_kp = {
#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 17, 0)
.symbol_name = "do_faccessat",
#else
.symbol_name = "sys_faccessat",
#endif
.pre_handler = faccessat_handler_pre,
};
#endif
#if 1
static struct kprobe newfstatat_kp = {
.symbol_name = SYS_NEWFSTATAT_SYMBOL,
.pre_handler = sys_newfstatat_handler_pre,
};
#else
static struct kprobe newfstatat_kp = {
#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 11, 0)
.symbol_name = "vfs_statx",
#else
.symbol_name = "vfs_fstatat",
#endif
.pre_handler = newfstatat_handler_pre,
};
#endif
#if 1
static struct kprobe execve_kp = {
.symbol_name = SYS_EXECVE_SYMBOL,
.pre_handler = sys_execve_handler_pre,
};
#else
static struct kprobe execve_kp = {
#if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 9, 0)
.symbol_name = "do_execveat_common",
#elif LINUX_VERSION_CODE >= KERNEL_VERSION(4, 19, 0)
.symbol_name = "__do_execve_file",
#elif LINUX_VERSION_CODE >= KERNEL_VERSION(3, 19, 0)
.symbol_name = "do_execveat_common",
#endif
.pre_handler = execve_handler_pre,
};
#endif
static int pts_unix98_lookup_pre(struct kprobe *p, struct pt_regs *regs)
{
struct inode *inode;
@@ -333,35 +294,61 @@ static int pts_unix98_lookup_pre(struct kprobe *p, struct pt_regs *regs)
return ksu_handle_devpts(inode);
}
static struct kprobe pts_unix98_lookup_kp = { .symbol_name =
"pts_unix98_lookup",
.pre_handler =
pts_unix98_lookup_pre };
static struct kprobe *init_kprobe(const char *name,
kprobe_pre_handler_t handler)
{
struct kprobe *kp = kzalloc(sizeof(struct kprobe), GFP_KERNEL);
if (!kp)
return NULL;
kp->symbol_name = name;
kp->pre_handler = handler;
int ret = register_kprobe(kp);
pr_info("sucompat: register_%s kprobe: %d\n", name, ret);
if (ret) {
kfree(kp);
return NULL;
}
return kp;
}
static void destroy_kprobe(struct kprobe **kp_ptr)
{
struct kprobe *kp = *kp_ptr;
if (!kp)
return;
unregister_kprobe(kp);
synchronize_rcu();
kfree(kp);
*kp_ptr = NULL;
}
static struct kprobe *su_kps[4];
#endif
// sucompat: permited process can execute 'su' to gain root access.
void ksu_sucompat_init()
{
#ifdef CONFIG_KPROBES
int ret;
ret = register_kprobe(&execve_kp);
pr_info("sucompat: execve_kp: %d\n", ret);
ret = register_kprobe(&newfstatat_kp);
pr_info("sucompat: newfstatat_kp: %d\n", ret);
ret = register_kprobe(&faccessat_kp);
pr_info("sucompat: faccessat_kp: %d\n", ret);
ret = register_kprobe(&pts_unix98_lookup_kp);
pr_info("sucompat: devpts_kp: %d\n", ret);
#ifdef CONFIG_KSU_KPROBES_HOOK
su_kps[0] = init_kprobe(SYS_EXECVE_SYMBOL, execve_handler_pre);
su_kps[1] = init_kprobe(SYS_FACCESSAT_SYMBOL, faccessat_handler_pre);
su_kps[2] = init_kprobe(SYS_NEWFSTATAT_SYMBOL, newfstatat_handler_pre);
su_kps[3] = init_kprobe("pts_unix98_lookup", pts_unix98_lookup_pre);
#else
ksu_sucompat_non_kp = true;
pr_info("ksu_sucompat_init: hooks enabled: execve/execveat_su, faccessat, stat, devpts\n");
#endif
}
void ksu_sucompat_exit()
{
#ifdef CONFIG_KPROBES
unregister_kprobe(&execve_kp);
unregister_kprobe(&newfstatat_kp);
unregister_kprobe(&faccessat_kp);
unregister_kprobe(&pts_unix98_lookup_kp);
#ifdef CONFIG_KSU_KPROBES_HOOK
for (int i = 0; i < ARRAY_SIZE(su_kps); i++) {
destroy_kprobe(&su_kps[i]);
}
#else
ksu_sucompat_non_kp = false;
pr_info("ksu_sucompat_exit: hooks disabled: execve/execveat_su, faccessat, stat, devpts\n");
#endif
}

View File

@@ -148,6 +148,12 @@ FILLDIR_RETURN_TYPE my_actor(struct dir_context *ctx, const char *name,
if (!strncmp(name, "..", namelen) || !strncmp(name, ".", namelen))
return FILLDIR_ACTOR_CONTINUE; // Skip "." and ".."
if (d_type == DT_DIR && namelen >= 8 && !strncmp(name, "vmdl", 4) &&
!strncmp(name + namelen - 4, ".tmp", 4)) {
pr_info("Skipping directory: %.*s\n", namelen, name);
return FILLDIR_ACTOR_CONTINUE; // Skip staging package
}
if (snprintf(dirpath, DATA_PATH_LEN, "%s/%.*s", my_ctx->parent_dir,
namelen, name) >= DATA_PATH_LEN) {
pr_err("Path too long: %s/%.*s\n", my_ctx->parent_dir, namelen,
@@ -224,7 +230,7 @@ void search_manager(const char *path, int depth, struct list_head *uid_data)
data.depth = depth;
list_add_tail(&data.list, &data_path_list);
for (i = depth; i > 0; i--) {
for (i = depth; i >= 0; i--) {
struct data_path *pos, *n;
list_for_each_entry_safe(pos, n, &data_path_list, list) {
@@ -355,12 +361,14 @@ void track_throne()
if (ksu_is_manager_uid_valid()) {
pr_info("manager is uninstalled, invalidate it!\n");
ksu_invalidate_manager_uid();
goto prune;
}
pr_info("Searching manager...\n");
search_manager("/data/app", 2, &uid_list);
pr_info("Search manager finished\n");
}
prune:
// then prune the allowlist
ksu_prune_allowlist(is_uid_exist, &uid_list);
out:

View File

@@ -34,7 +34,6 @@ android {
}
buildFeatures {
aidl = true
buildConfig = true
compose = true
prefab = true
@@ -133,4 +132,9 @@ dependencies {
implementation(libs.androidx.webkit)
implementation(libs.lsposed.cxx)
implementation(libs.mmrl.platform)
compileOnly(libs.mmrl.hidden.api)
implementation(libs.mmrl.ui)
implementation(libs.mmrl.webui)
}

View File

@@ -0,0 +1,47 @@
-verbose
-optimizationpasses 5
-dontwarn org.conscrypt.**
-dontwarn kotlinx.serialization.**
# Please add these rules to your existing keep rules in order to suppress warnings.
# This is generated automatically by the Android Gradle plugin.
-dontwarn com.google.auto.service.AutoService
-dontwarn com.google.j2objc.annotations.RetainedWith
-dontwarn javax.lang.model.SourceVersion
-dontwarn javax.lang.model.element.AnnotationMirror
-dontwarn javax.lang.model.element.AnnotationValue
-dontwarn javax.lang.model.element.Element
-dontwarn javax.lang.model.element.ElementKind
-dontwarn javax.lang.model.element.ElementVisitor
-dontwarn javax.lang.model.element.ExecutableElement
-dontwarn javax.lang.model.element.Modifier
-dontwarn javax.lang.model.element.Name
-dontwarn javax.lang.model.element.PackageElement
-dontwarn javax.lang.model.element.TypeElement
-dontwarn javax.lang.model.element.TypeParameterElement
-dontwarn javax.lang.model.element.VariableElement
-dontwarn javax.lang.model.type.ArrayType
-dontwarn javax.lang.model.type.DeclaredType
-dontwarn javax.lang.model.type.ExecutableType
-dontwarn javax.lang.model.type.TypeKind
-dontwarn javax.lang.model.type.TypeMirror
-dontwarn javax.lang.model.type.TypeVariable
-dontwarn javax.lang.model.type.TypeVisitor
-dontwarn javax.lang.model.util.AbstractAnnotationValueVisitor8
-dontwarn javax.lang.model.util.AbstractTypeVisitor8
-dontwarn javax.lang.model.util.ElementFilter
-dontwarn javax.lang.model.util.Elements
-dontwarn javax.lang.model.util.SimpleElementVisitor8
-dontwarn javax.lang.model.util.SimpleTypeVisitor7
-dontwarn javax.lang.model.util.SimpleTypeVisitor8
-dontwarn javax.lang.model.util.Types
-dontwarn javax.tools.Diagnostic$Kind
# MMRL:webui reflection
-keep class com.dergoogler.mmrl.webui.model.ModId { *; }
-keep class com.dergoogler.mmrl.webui.interfaces.** { *; }
-keep class com.rifsxd.ksunext.ui.webui.WebViewInterface { *; }
-keep,allowobfuscation class * extends com.dergoogler.mmrl.platform.content.IService { *; }

View File

@@ -33,6 +33,13 @@
android:exported="false"
android:theme="@style/Theme.KernelSU.WebUI" />
<activity
android:name=".ui.webui.WebUIXActivity"
android:autoRemoveFromRecents="true"
android:documentLaunchMode="intoExisting"
android:exported="false"
android:theme="@style/Theme.KernelSU.WebUI" />
<provider
android:name="androidx.core.content.FileProvider"
android:authorities="${applicationId}.fileprovider"

View File

@@ -1,9 +0,0 @@
// IKsuInterface.aidl
package com.rifsxd.ksunext;
import android.content.pm.PackageInfo;
import rikka.parcelablelist.ParcelableListSlice;
interface IKsuInterface {
ParcelableListSlice<PackageInfo> getPackages(int flags);
}

View File

@@ -25,6 +25,13 @@ Java_com_rifsxd_ksunext_Natives_getVersion(JNIEnv *env, jobject) {
return get_version();
}
extern "C"
JNIEXPORT jstring JNICALL
Java_com_rifsxd_ksunext_Natives_getHookMode(JNIEnv *env, jobject) {
const char* mode = get_hook_mode();
return env->NewStringUTF(mode);
}
extern "C"
JNIEXPORT jintArray JNICALL
Java_com_rifsxd_ksunext_Natives_getAllowList(JNIEnv *env, jobject) {
@@ -296,3 +303,13 @@ JNIEXPORT jboolean JNICALL
Java_com_rifsxd_ksunext_Natives_uidShouldUmount(JNIEnv *env, jobject thiz, jint uid) {
return uid_should_umount(uid);
}
extern "C"
JNIEXPORT jboolean JNICALL
Java_com_rifsxd_ksunext_Natives_isSuEnabled(JNIEnv *env, jobject thiz) {
return is_su_enabled();
}
extern "C"
JNIEXPORT jboolean JNICALL
Java_com_rifsxd_ksunext_Natives_setSuEnabled(JNIEnv *env, jobject thiz, jboolean enabled) {
return set_su_enabled(enabled);
}

View File

@@ -27,6 +27,9 @@
#define CMD_IS_UID_GRANTED_ROOT 12
#define CMD_IS_UID_SHOULD_UMOUNT 13
#define CMD_IS_SU_ENABLED 14
#define CMD_ENABLE_SU 15
#define CMD_HOOK_MODE 16
static bool ksuctl(int cmd, void* arg1, void* arg2) {
int32_t result = 0;
@@ -59,6 +62,12 @@ int get_version() {
return version;
}
const char* get_hook_mode() {
static char mode[16];
ksuctl(CMD_HOOK_MODE, mode, nullptr);
return mode;
}
bool get_allow_list(int *uids, int *size) {
return ksuctl(CMD_GET_SU_LIST, uids, size);
}
@@ -84,3 +93,14 @@ bool set_app_profile(const app_profile *profile) {
bool get_app_profile(p_key_t key, app_profile *profile) {
return ksuctl(CMD_GET_APP_PROFILE, (void*) profile, nullptr);
}
bool set_su_enabled(bool enabled) {
return ksuctl(CMD_ENABLE_SU, (void*) enabled, nullptr);
}
bool is_su_enabled() {
bool enabled = true;
// if ksuctl failed, we assume su is enabled, and it cannot be disabled.
ksuctl(CMD_IS_SU_ENABLED, &enabled, nullptr);
return enabled;
}

View File

@@ -11,6 +11,8 @@ bool become_manager(const char *);
int get_version();
const char* get_hook_mode();
bool get_allow_list(int *uids, int *size);
bool uid_should_umount(int uid);
@@ -79,4 +81,8 @@ bool set_app_profile(const app_profile *profile);
bool get_app_profile(p_key_t key, app_profile *profile);
bool set_su_enabled(bool enabled);
bool is_su_enabled();
#endif //KERNELSU_KSU_H

View File

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

View File

@@ -26,6 +26,19 @@ data class KernelVersion(val major: Int, val patchLevel: Int, val subLevel: Int)
return false
}
fun isULegacy(): Boolean {
return major == 3
}
fun isLegacy(): Boolean {
return major == 4 && patchLevel in 1..18
}
fun isGKI1(): Boolean {
return (major == 4 && patchLevel >= 19) || (major == 5 && patchLevel < 10)
}
}
fun parseKernelVersion(version: String): KernelVersion {

View File

@@ -21,6 +21,13 @@ object Natives {
// 11640: Support query working mode, LKM or GKI
// when MINIMAL_SUPPORTED_KERNEL > 11640, we can remove this constant.
const val MINIMAL_SUPPORTED_KERNEL_LKM = 11648
// 12404: Support disable sucompat mode
const val MINIMAL_SUPPORTED_SU_COMPAT = 12404
// 12569: support get hook mode
const val MINIMAL_SUPPORTED_HOOK_MODE = 12569
const val KERNEL_SU_DOMAIN = "u:r:su:s0"
const val ROOT_UID = 0
@@ -47,6 +54,16 @@ object Natives {
external fun uidShouldUmount(uid: Int): Boolean
/**
* Get a string indicating the SU hook mode enabled in kernel.
* The return values are:
* - "Manual": Manual hooks was enabled.
* - "Kprobes": Kprobes hooks was enabled (CONFIG_KSU_KPROBES_HOOK).
*
* @return return hook mode, or null if unavailable.
*/
external fun getHookMode(): String?
/**
* Get the profile of the given package.
* @param key usually the package name
@@ -55,6 +72,15 @@ object Natives {
external fun getAppProfile(key: String?, uid: Int): Profile
external fun setAppProfile(profile: Profile?): Boolean
/**
* `su` compat mode can be disabled temporarily.
* 0: disabled
* 1: enabled
* negative : error
*/
external fun isSuEnabled(): Boolean
external fun setSuEnabled(enabled: Boolean): Boolean
private const val NON_ROOT_DEFAULT_PROFILE_KEY = "$"
private const val NOBODY_UID = 9999

View File

@@ -1,77 +0,0 @@
package com.rifsxd.ksunext.ui;
import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.os.IBinder;
import android.os.UserHandle;
import android.os.UserManager;
import android.util.Log;
import androidx.annotation.NonNull;
import com.topjohnwu.superuser.ipc.RootService;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.List;
import com.rifsxd.ksunext.IKsuInterface;
import rikka.parcelablelist.ParcelableListSlice;
/**
* @author weishu
* @date 2023/4/18.
*/
public class KsuService extends RootService {
private static final String TAG = "KsuService";
class Stub extends IKsuInterface.Stub {
@Override
public ParcelableListSlice<PackageInfo> getPackages(int flags) {
List<PackageInfo> list = getInstalledPackagesAll(flags);
Log.i(TAG, "getPackages: " + list.size());
return new ParcelableListSlice<>(list);
}
}
@Override
public IBinder onBind(@NonNull Intent intent) {
return new Stub();
}
List<Integer> getUserIds() {
List<Integer> result = new ArrayList<>();
UserManager um = (UserManager) getSystemService(Context.USER_SERVICE);
List<UserHandle> userProfiles = um.getUserProfiles();
for (UserHandle userProfile : userProfiles) {
int userId = userProfile.hashCode();
result.add(userProfile.hashCode());
}
return result;
}
ArrayList<PackageInfo> getInstalledPackagesAll(int flags) {
ArrayList<PackageInfo> packages = new ArrayList<>();
for (Integer userId : getUserIds()) {
Log.i(TAG, "getInstalledPackagesAll: " + userId);
packages.addAll(getInstalledPackagesAsUser(flags, userId));
}
return packages;
}
List<PackageInfo> getInstalledPackagesAsUser(int flags, int userId) {
try {
PackageManager pm = getPackageManager();
Method getInstalledPackagesAsUser = pm.getClass().getDeclaredMethod("getInstalledPackagesAsUser", int.class, int.class);
return (List<PackageInfo>) getInstalledPackagesAsUser.invoke(pm, flags, userId);
} catch (Throwable e) {
Log.e(TAG, "err", e);
}
return new ArrayList<>();
}
}

View File

@@ -29,6 +29,7 @@ import androidx.compose.material3.SnackbarHostState
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.runtime.CompositionLocalProvider
import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.getValue
import androidx.compose.runtime.remember
import androidx.compose.ui.Modifier
@@ -38,6 +39,7 @@ import androidx.navigation.NavBackStackEntry
import androidx.navigation.NavHostController
import androidx.navigation.compose.rememberNavController
import androidx.navigation.compose.currentBackStackEntryAsState
import com.dergoogler.mmrl.platform.Platform
import com.ramcosta.composedestinations.DestinationsNavHost
import com.ramcosta.composedestinations.animations.NavHostAnimatedDestinationStyle
import com.ramcosta.composedestinations.generated.destinations.ExecuteModuleActionScreenDestination
@@ -52,7 +54,7 @@ import com.rifsxd.ksunext.ui.theme.KernelSUTheme
import com.rifsxd.ksunext.ui.util.LocalSnackbarHost
import com.rifsxd.ksunext.ui.util.rootAvailable
import com.rifsxd.ksunext.ui.util.install
import com.rifsxd.ksunext.ui.util.*
import com.rifsxd.ksunext.ui.webui.initPlatform
class MainActivity : ComponentActivity() {
@@ -67,7 +69,7 @@ class MainActivity : ComponentActivity() {
super.onCreate(savedInstanceState)
val isManager = Natives.becomeManager(ksuApp.packageName)
if (isManager) install()
if (isManager) install()
setContent {
KernelSUTheme {
@@ -81,6 +83,11 @@ class MainActivity : ComponentActivity() {
else -> true
}
// pre-init platform to faster start WebUI X activities
LaunchedEffect(Unit) {
initPlatform()
}
Scaffold(
bottomBar = {
AnimatedVisibility(

View File

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

View File

@@ -5,14 +5,18 @@ import androidx.compose.foundation.interaction.MutableInteractionSource
import androidx.compose.foundation.selection.toggleable
import androidx.compose.material3.Icon
import androidx.compose.material3.ListItem
import androidx.compose.material3.LocalTextStyle
import androidx.compose.material3.RadioButton
import androidx.compose.material3.Switch
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.runtime.remember
import androidx.compose.ui.Modifier
import androidx.compose.ui.draw.alpha
import androidx.compose.ui.graphics.vector.ImageVector
import androidx.compose.ui.semantics.Role
import com.dergoogler.mmrl.ui.component.LabelItem
import com.dergoogler.mmrl.ui.component.text.TextRow
@Composable
fun SwitchItem(
@@ -21,9 +25,11 @@ fun SwitchItem(
summary: String? = null,
checked: Boolean,
enabled: Boolean = true,
onCheckedChange: (Boolean) -> Unit
beta: Boolean = false,
onCheckedChange: (Boolean) -> Unit,
) {
val interactionSource = remember { MutableInteractionSource() }
val stateAlpha = remember(checked, enabled) { Modifier.alpha(if (enabled) 1f else 0.5f) }
ListItem(
modifier = Modifier
@@ -36,10 +42,30 @@ fun SwitchItem(
onValueChange = onCheckedChange
),
headlineContent = {
Text(title)
TextRow(
leadingContent = if (beta) {
{
LabelItem(
modifier = Modifier.then(stateAlpha),
text = "Beta"
)
}
} else null
) {
Text(
modifier = Modifier.then(stateAlpha),
text = title,
)
}
},
leadingContent = icon?.let {
{ Icon(icon, title) }
{
Icon(
modifier = Modifier.then(stateAlpha),
imageVector = icon,
contentDescription = title
)
}
},
trailingContent = {
Switch(
@@ -51,7 +77,10 @@ fun SwitchItem(
},
supportingContent = {
if (summary != null) {
Text(summary)
Text(
modifier = Modifier.then(stateAlpha),
text = summary
)
}
}
)

View File

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

View File

@@ -55,6 +55,7 @@ import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.Dp
import androidx.compose.ui.unit.DpOffset
import androidx.compose.ui.unit.dp
import androidx.lifecycle.compose.dropUnlessResumed
import coil.compose.AsyncImage
import coil.request.ImageRequest
import com.ramcosta.composedestinations.annotation.Destination
@@ -95,6 +96,7 @@ fun AppProfileScreen(
val scope = rememberCoroutineScope()
val failToUpdateAppProfile = stringResource(R.string.failed_to_update_app_profile).format(appInfo.label)
val failToUpdateSepolicy = stringResource(R.string.failed_to_update_sepolicy).format(appInfo.label)
val suNotAllowed = stringResource(R.string.su_not_allowed).format(appInfo.label)
val packageName = appInfo.packageName
val initialProfile = Natives.getAppProfile(packageName, appInfo.uid)
@@ -108,7 +110,7 @@ fun AppProfileScreen(
Scaffold(
topBar = {
TopBar(
onBack = { navigator.popBackStack() },
onBack = dropUnlessResumed { navigator.popBackStack() },
scrollBehavior = scrollBehavior
)
},
@@ -143,8 +145,13 @@ fun AppProfileScreen(
},
onProfileChange = {
scope.launch {
if (it.allowSu && !it.rootUseDefault && it.rules.isNotEmpty()) {
if (!setSepolicy(profile.name, it.rules)) {
if (it.allowSu) {
// sync with allowlist.c - forbid_system_uid
if (appInfo.uid < 2000 && appInfo.uid != 1000) {
snackBarHost.showSnackbar(suNotAllowed)
return@launch
}
if (!it.rootUseDefault && it.rules.isNotEmpty() && !setSepolicy(profile.name, it.rules)) {
snackBarHost.showSnackbar(failToUpdateSepolicy)
return@launch
}

View File

@@ -0,0 +1,306 @@
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.*
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 androidx.lifecycle.compose.dropUnlessResumed
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(
onBack = dropUnlessResumed {
navigator.popBackStack()
},
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(
onBack: () -> Unit = {},
scrollBehavior: TopAppBarScrollBehavior? = null
) {
TopAppBar(
title = { Text(stringResource(R.string.backup_restore)) }, navigationIcon = {
IconButton(
onClick = onBack
) { Icon(Icons.AutoMirrored.Filled.ArrowBack, contentDescription = null) }
},
windowInsets = WindowInsets.safeDrawing.only(WindowInsetsSides.Top + WindowInsetsSides.Horizontal),
scrollBehavior = scrollBehavior
)
}
@Preview
@Composable
private fun BackupPreview() {
BackupRestoreScreen(EmptyDestinationsNavigator)
}

View File

@@ -27,6 +27,7 @@ import androidx.compose.material3.SnackbarHost
import androidx.compose.material3.Text
import androidx.compose.material3.TopAppBar
import androidx.compose.runtime.Composable
import androidx.compose.runtime.DisposableEffect
import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
@@ -36,9 +37,11 @@ import androidx.compose.runtime.setValue
import androidx.compose.ui.Modifier
import androidx.compose.ui.input.key.Key
import androidx.compose.ui.input.key.key
import androidx.compose.ui.platform.LocalView
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.text.font.FontFamily
import androidx.compose.ui.unit.dp
import androidx.lifecycle.compose.dropUnlessResumed
import com.ramcosta.composedestinations.annotation.Destination
import com.ramcosta.composedestinations.annotation.RootGraph
import com.ramcosta.composedestinations.navigation.DestinationsNavigator
@@ -66,6 +69,14 @@ fun ExecuteModuleActionScreen(navigator: DestinationsNavigator, moduleId: String
var actionResult: Boolean
var isActionRunning by rememberSaveable { mutableStateOf(true) }
val view = LocalView.current
DisposableEffect(isActionRunning) {
view.keepScreenOn = isActionRunning
onDispose {
view.keepScreenOn = false
}
}
BackHandler(enabled = isActionRunning) {
// Disable back button if action is running
}
@@ -100,7 +111,7 @@ fun ExecuteModuleActionScreen(navigator: DestinationsNavigator, moduleId: String
topBar = {
TopBar(
isActionRunning = isActionRunning,
onBack = {
onBack = dropUnlessResumed {
navigator.popBackStack()
},
onSave = {
@@ -110,7 +121,7 @@ fun ExecuteModuleActionScreen(navigator: DestinationsNavigator, moduleId: String
val date = format.format(Date())
val file = File(
Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS),
"KernelSU_module_action_log_${date}.log"
"KernelSU_Next_module_action_log_${date}.log"
)
file.writeText(logContent.toString())
snackBarHost.showSnackbar("Log saved to ${file.absolutePath}")

View File

@@ -33,6 +33,7 @@ import androidx.compose.material3.TopAppBarDefaults
import androidx.compose.material3.TopAppBarScrollBehavior
import androidx.compose.material3.rememberTopAppBarState
import androidx.compose.runtime.Composable
import androidx.compose.runtime.DisposableEffect
import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
@@ -44,10 +45,12 @@ import androidx.compose.ui.Modifier
import androidx.compose.ui.input.key.Key
import androidx.compose.ui.input.key.key
import androidx.compose.ui.input.nestedscroll.nestedScroll
import androidx.compose.ui.platform.LocalView
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.text.font.FontFamily
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp
import androidx.lifecycle.compose.dropUnlessResumed
import com.ramcosta.composedestinations.annotation.Destination
import com.ramcosta.composedestinations.annotation.RootGraph
import com.ramcosta.composedestinations.navigation.DestinationsNavigator
@@ -59,6 +62,7 @@ import kotlinx.coroutines.withContext
import kotlinx.parcelize.Parcelize
import com.rifsxd.ksunext.R
import com.rifsxd.ksunext.ui.component.KeyEventBlocker
import com.rifsxd.ksunext.ui.util.FlashResult
import com.rifsxd.ksunext.ui.util.LkmSelection
import com.rifsxd.ksunext.ui.util.LocalSnackbarHost
import com.rifsxd.ksunext.ui.util.flashModule
@@ -80,38 +84,17 @@ enum class FlashingStatus {
// Lets you flash modules sequentially when mutiple zipUris are selected
fun flashModulesSequentially(
uris: List<Uri>,
onFinish: (Boolean, Int) -> Unit,
onStdout: (String) -> Unit,
onStderr: (String) -> Unit
) {
val iterator = uris.iterator()
// Start processing from the first module inside a coroutine
CoroutineScope(Dispatchers.IO).launch {
// 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)
): FlashResult {
for (uri in uris) {
flashModule(uri, onStdout, onStderr).apply {
if (code != 0) {
return FlashResult(code, err, showReboot)
}
}
// Start the process
processNext()
}
return FlashResult(0, "", true)
}
/**
@@ -124,7 +107,7 @@ fun flashModulesSequentially(
fun FlashScreen(navigator: DestinationsNavigator, flashIt: FlashIt) {
var text by rememberSaveable { mutableStateOf("") }
var tempText : String
var tempText: String
val logContent = rememberSaveable { StringBuilder() }
var showFloatAction by rememberSaveable { mutableStateOf(false) }
@@ -136,6 +119,14 @@ fun FlashScreen(navigator: DestinationsNavigator, flashIt: FlashIt) {
mutableStateOf(FlashingStatus.FLASHING)
}
val view = LocalView.current
DisposableEffect(flashing) {
view.keepScreenOn = flashing == FlashingStatus.FLASHING
onDispose {
view.keepScreenOn = false
}
}
BackHandler(enabled = flashing == FlashingStatus.FLASHING) {
// Disable back button if flashing is running
}
@@ -145,16 +136,7 @@ fun FlashScreen(navigator: DestinationsNavigator, flashIt: FlashIt) {
return@LaunchedEffect
}
withContext(Dispatchers.IO) {
flashIt(flashIt, onFinish = { showReboot, code ->
if (code != 0) {
text += "Error: exit code = $code.\nPlease save and check the log.\n"
}
if (showReboot) {
text += "\n\n\n"
showFloatAction = true
}
flashing = if (code == 0) FlashingStatus.SUCCESS else FlashingStatus.FAILED
}, onStdout = {
flashIt(flashIt, onStdout = {
tempText = "$it\n"
if (tempText.startsWith("")) { // clear command
text = tempText.substring(6)
@@ -164,7 +146,16 @@ fun FlashScreen(navigator: DestinationsNavigator, flashIt: FlashIt) {
logContent.append(it).append("\n")
}, onStderr = {
logContent.append(it).append("\n")
})
}).apply {
if (code != 0) {
text += "Error code: $code.\n $err Please save and check the log.\n"
}
if (showReboot) {
text += "\n\n\n"
showFloatAction = true
}
flashing = if (code == 0) FlashingStatus.SUCCESS else FlashingStatus.FAILED
}
}
}
@@ -172,7 +163,7 @@ fun FlashScreen(navigator: DestinationsNavigator, flashIt: FlashIt) {
topBar = {
TopBar(
flashing,
onBack = {
onBack = dropUnlessResumed {
navigator.popBackStack()
},
onSave = {
@@ -181,7 +172,7 @@ fun FlashScreen(navigator: DestinationsNavigator, flashIt: FlashIt) {
val date = format.format(Date())
val file = File(
Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS),
"KernelSU_install_log_${date}.log"
"KernelSU_Next_install_log_${date}.log"
)
file.writeText(logContent.toString())
snackBarHost.showSnackbar("Log saved to ${file.absolutePath}")
@@ -191,8 +182,8 @@ fun FlashScreen(navigator: DestinationsNavigator, flashIt: FlashIt) {
)
},
floatingActionButton = {
if (showFloatAction) {
// Reboot button (bottom left)
if (flashIt is FlashIt.FlashModules && (flashing == FlashingStatus.SUCCESS)) {
// Reboot button for modules flashing
ExtendedFloatingActionButton(
onClick = {
scope.launch {
@@ -205,6 +196,28 @@ fun FlashScreen(navigator: DestinationsNavigator, flashIt: FlashIt) {
text = { Text(text = stringResource(R.string.reboot)) }
)
}
if (flashIt is FlashIt.FlashModules && (flashing == FlashingStatus.FAILED)) {
// Close button for modules flashing
ExtendedFloatingActionButton(
text = { Text(text = stringResource(R.string.close)) },
icon = { Icon(Icons.Filled.Close, contentDescription = null) },
onClick = {
navigator.popBackStack()
}
)
}
if (flashIt is FlashIt.FlashBoot && (flashing == FlashingStatus.SUCCESS || flashing == FlashingStatus.FAILED)) {
// Close button for LKM flashing
ExtendedFloatingActionButton(
text = { Text(text = stringResource(R.string.close)) },
icon = { Icon(Icons.Filled.Close, contentDescription = null) },
onClick = {
navigator.popBackStack()
}
)
}
},
contentWindowInsets = WindowInsets.safeDrawing,
snackbarHost = { SnackbarHost(hostState = snackBarHost) }
@@ -238,8 +251,6 @@ sealed class FlashIt : Parcelable {
data class FlashBoot(val boot: Uri? = null, val lkm: LkmSelection, val ota: Boolean) :
FlashIt()
data class FlashModule(val uri: Uri) : FlashIt()
data class FlashModules(val uris: List<Uri>) : FlashIt()
data object FlashRestore : FlashIt()
@@ -248,29 +259,26 @@ sealed class FlashIt : Parcelable {
}
fun flashIt(
flashIt: FlashIt, onFinish: (Boolean, Int) -> Unit,
flashIt: FlashIt,
onStdout: (String) -> Unit,
onStderr: (String) -> Unit
) {
when (flashIt) {
): FlashResult {
return when (flashIt) {
is FlashIt.FlashBoot -> installBoot(
flashIt.boot,
flashIt.lkm,
flashIt.ota,
onFinish,
onStdout,
onStderr
)
is FlashIt.FlashModule -> flashModule(flashIt.uri, onFinish, onStdout, onStderr)
is FlashIt.FlashModules -> {
flashModulesSequentially(flashIt.uris, 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

@@ -6,6 +6,7 @@ import android.os.PowerManager
import android.os.Handler
import android.os.Looper
import android.system.Os
import android.widget.Toast
import androidx.annotation.StringRes
import androidx.compose.animation.*
import androidx.compose.foundation.clickable
@@ -29,12 +30,17 @@ import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.platform.LocalUriHandler
import androidx.compose.ui.res.painterResource
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.text.intl.Locale
import androidx.compose.ui.text.toUpperCase
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp
import androidx.core.content.pm.PackageInfoCompat
import com.dergoogler.mmrl.ui.component.LabelItem
import com.dergoogler.mmrl.ui.component.LabelItemDefaults
import com.dergoogler.mmrl.ui.component.text.TextRow
import com.ramcosta.composedestinations.annotation.Destination
import com.ramcosta.composedestinations.annotation.RootGraph
import com.ramcosta.composedestinations.generated.destinations.InstallScreenDestination
// import com.ramcosta.composedestinations.generated.destinations.InstallScreenDestination // DISBAND LKM MODE
import com.ramcosta.composedestinations.navigation.DestinationsNavigator
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.withContext
@@ -60,9 +66,9 @@ fun HomeScreen(navigator: DestinationsNavigator) {
TopBar(
kernelVersion,
ksuVersion,
onInstallClick = {
navigator.navigate(InstallScreenDestination)
},
// onInstallClick = {
// navigator.navigate(InstallScreenDestination)
// }, // DISBAND LKM MODE
scrollBehavior = scrollBehavior
)
},
@@ -81,7 +87,7 @@ fun HomeScreen(navigator: DestinationsNavigator) {
}
StatusCard(kernelVersion, ksuVersion, lkmMode) {
navigator.navigate(InstallScreenDestination)
// navigator.navigate(InstallScreenDestination) // DISBAND LKM MODE
}
if (isManager && Natives.requireNewKernel()) {
WarningCard(
@@ -97,7 +103,7 @@ fun HomeScreen(navigator: DestinationsNavigator) {
}
val checkUpdate =
LocalContext.current.getSharedPreferences("settings", Context.MODE_PRIVATE)
.getBoolean("check_update", true)
.getBoolean("check_update", false)
if (checkUpdate) {
UpdateCard()
}
@@ -167,20 +173,20 @@ fun RebootDropdownItem(@StringRes id: Int, reason: String = "") {
private fun TopBar(
kernelVersion: KernelVersion,
ksuVersion: Int?,
onInstallClick: () -> Unit,
// onInstallClick: () -> Unit, // DISBAND LKM MODE
scrollBehavior: TopAppBarScrollBehavior? = null
) {
TopAppBar(
title = { Text(stringResource(R.string.app_name)) },
actions = {
if (kernelVersion.isGKI()) {
IconButton(onClick = onInstallClick) {
Icon(
imageVector = Icons.Filled.Archive,
contentDescription = stringResource(id = R.string.install)
)
}
}
// if (kernelVersion.isGKI()) {
// IconButton(onClick = onInstallClick) {
// Icon(
// imageVector = Icons.Filled.Archive,
// contentDescription = stringResource(id = R.string.install)
// )
// }
// } // DISBAND LKM MODE
if (ksuVersion != null) {
var showDropdown by remember { mutableStateOf(false) }
@@ -197,7 +203,8 @@ private fun TopBar(
}) {
RebootDropdownItem(id = R.string.reboot)
val pm = LocalContext.current.getSystemService(Context.POWER_SERVICE) as PowerManager?
val pm =
LocalContext.current.getSystemService(Context.POWER_SERVICE) as PowerManager?
@Suppress("DEPRECATION")
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R && pm?.isRebootingUserspaceSupported == true) {
RebootDropdownItem(id = R.string.reboot_userspace, reason = "userspace")
@@ -234,86 +241,123 @@ private fun StatusCard(
lkmMode: Boolean?,
onClickInstall: () -> Unit = {}
) {
val context = LocalContext.current
var tapCount by remember { mutableStateOf(0) }
ElevatedCard(
colors = CardDefaults.elevatedCardColors(containerColor = run {
if (ksuVersion != null) MaterialTheme.colorScheme.secondaryContainer
else MaterialTheme.colorScheme.errorContainer
})
) {
Row(modifier = Modifier
.fillMaxWidth()
.clickable {
if (kernelVersion.isGKI()) {
onClickInstall()
Row(
modifier = Modifier
.fillMaxWidth()
.clickable {
tapCount++
if (tapCount == 10) {
Toast.makeText(context, "Never gonna give you up! 💜", Toast.LENGTH_SHORT).show()
// tapCount = 0
val url = "https://www.youtube.com/watch?v=dQw4w9WgXcQ"
val intent = android.content.Intent(android.content.Intent.ACTION_VIEW, android.net.Uri.parse(url))
intent.addFlags(android.content.Intent.FLAG_ACTIVITY_NEW_TASK)
context.startActivity(intent)
}
// if (kernelVersion.isGKI()) {
// onClickInstall()
// }
}
}
.padding(24.dp), verticalAlignment = Alignment.CenterVertically) {
.padding(24.dp), verticalAlignment = Alignment.CenterVertically) {
when {
ksuVersion != null -> {
val safeMode = when {
Natives.isSafeMode -> " [${stringResource(id = R.string.safe_mode)}]"
else -> ""
val workingMode = when {
lkmMode == true -> "LKM"
lkmMode == false || kernelVersion.isGKI() -> "GKI2"
lkmMode == null && kernelVersion.isULegacy() -> "U-LEGACY"
lkmMode == null && kernelVersion.isLegacy() -> "LEGACY"
lkmMode == null && kernelVersion.isGKI1() -> "GKI1"
else -> "NON-STANDARD"
}
val workingMode = when (lkmMode) {
null -> " <LTS>"
true -> " <LKM>"
else -> " <GKI>"
}
val workingText =
"${stringResource(id = R.string.home_working)}$workingMode$safeMode"
Icon(
getSeasonalIcon(), // Use dynamic seasonal icon
contentDescription = stringResource(R.string.home_working)
)
Column(Modifier.padding(start = 20.dp)) {
Text(
text = workingText,
style = MaterialTheme.typography.titleMedium
)
Spacer(Modifier.height(4.dp))
Column(
modifier = Modifier.padding(start = 20.dp),
verticalArrangement = Arrangement.spacedBy(4.dp)
) {
val labelStyle = LabelItemDefaults.style
TextRow(
trailingContent = {
LabelItem(
icon = if (Natives.isSafeMode) {
{
Icon(
tint = labelStyle.contentColor,
imageVector = Icons.Filled.Security,
contentDescription = null
)
}
} else {
null
},
text = {
Text(
text = workingMode,
style = labelStyle.textStyle.copy(color = labelStyle.contentColor),
)
}
)
}
) {
Text(
text = stringResource(id = R.string.home_working),
style = MaterialTheme.typography.titleMedium
)
}
Text(
text = stringResource(R.string.home_working_version, ksuVersion),
style = MaterialTheme.typography.bodyMedium
)
Spacer(Modifier.height(4.dp))
Text(
text = stringResource(
R.string.home_superuser_count, getSuperuserCount()
), style = MaterialTheme.typography.bodyMedium
)
Spacer(Modifier.height(4.dp))
Text(
text = stringResource(R.string.home_module_count, getModuleCount()),
style = MaterialTheme.typography.bodyMedium
)
Spacer(Modifier.height(4.dp))
val suSFS = getSuSFS()
if (suSFS == "Supported") {
Text(
text = stringResource(R.string.home_susfs, getSuSFS()),
text = "SuSFS: " + stringResource(R.string.susfs_supported),
style = MaterialTheme.typography.bodyMedium
)
}
}
}
kernelVersion.isGKI() -> {
Icon(Icons.Filled.AutoFixHigh, stringResource(R.string.home_not_installed))
Column(Modifier.padding(start = 20.dp)) {
Text(
text = stringResource(R.string.home_not_installed),
style = MaterialTheme.typography.titleMedium
)
Spacer(Modifier.height(4.dp))
Text(
text = stringResource(R.string.home_click_to_install),
style = MaterialTheme.typography.bodyMedium
)
}
}
// kernelVersion.isGKI() -> {
// Icon(Icons.Filled.Report, stringResource(R.string.lkm_mode_deprecated))
// Column(Modifier.padding(start = 20.dp)) {
// Text(
// text = stringResource(R.string.lkm_mode_deprecated),
// style = MaterialTheme.typography.titleMedium
// )
// Spacer(Modifier.height(4.dp))
// Text(
// text = stringResource(R.string.lkm_alternative_suggestion),
// style = MaterialTheme.typography.bodyMedium
// )
// }
// }
else -> {
Icon(Icons.Filled.Dangerous, stringResource(R.string.home_failure))
@@ -379,8 +423,7 @@ private fun InfoCard() {
.fillMaxWidth()
.padding(start = 24.dp, top = 24.dp, end = 24.dp, bottom = 16.dp)
) {
val contents = StringBuilder()
val uname = Os.uname()
var expanded by rememberSaveable { mutableStateOf(false) }
@Composable
fun InfoCardItem(label: String, content: String, icon: Any? = null) {
@@ -411,59 +454,102 @@ private fun InfoCard() {
)
}
}
}
Column {
if (ksuVersion != null) {
val managerVersion = getManagerVersion(context)
InfoCardItem(
label = stringResource(R.string.home_manager_version),
content = "${managerVersion.first} (${managerVersion.second})",
icon = painterResource(R.drawable.ic_ksu_next),
)
InfoCardItem(
label = stringResource(R.string.home_kernel),
content = uname.release,
icon = painterResource(R.drawable.ic_linux),
)
if (Natives.version >= Natives.MINIMAL_SUPPORTED_HOOK_MODE) {
Spacer(Modifier.height(16.dp))
InfoCardItem(
label = stringResource(R.string.hook_mode),
content = Natives.getHookMode() ?: stringResource(R.string.unavailable),
icon = Icons.Filled.Phishing,
)
}
Spacer(Modifier.height(16.dp))
InfoCardItem(
label = stringResource(R.string.home_android),
content = "${Build.VERSION.RELEASE} (${Build.VERSION.SDK_INT})",
icon = Icons.Filled.Android,
Spacer(Modifier.height(16.dp))
InfoCardItem(
label = stringResource(R.string.home_mount_system),
content = currentMountSystem().ifEmpty { stringResource(R.string.unavailable) },
icon = Icons.Filled.SettingsSuggest,
)
)
val suSFS = getSuSFS()
if (suSFS == "Supported") {
val isSUS_SU = getSuSFSFeatures() == "CONFIG_KSU_SUSFS_SUS_SU"
val susSUMode = if (isSUS_SU) {
val mode = susfsSUS_SU_Mode()
val modeString =
if (mode == "2") stringResource(R.string.enabled) else stringResource(R.string.disabled)
"| SuS SU: $modeString"
} else ""
Spacer(Modifier.height(16.dp))
InfoCardItem(
label = stringResource(R.string.home_susfs_version),
content = "${getSuSFSVersion()} (${getSuSFSVariant()}) $susSUMode",
icon = painterResource(R.drawable.ic_sus),
)
}
}
Spacer(Modifier.height(16.dp))
val managerVersion = getManagerVersion(context)
InfoCardItem(
label = stringResource(R.string.home_manager_version),
content = "${managerVersion.first} (${managerVersion.second})",
icon = painterResource(R.drawable.ic_ksu_next),
)
if (!expanded) {
Spacer(Modifier.height(12.dp))
Row(
modifier = Modifier
.fillMaxWidth(),
horizontalArrangement = Arrangement.Center
) {
IconButton(
onClick = { expanded = true },
modifier = Modifier.size(36.dp)
) {
Icon(
imageVector = Icons.Filled.KeyboardArrowDown,
contentDescription = "Show more"
)
}
}
}
Spacer(Modifier.height(16.dp))
InfoCardItem(
label = stringResource(R.string.home_selinux_status),
content = getSELinuxStatus(),
icon = Icons.Filled.Security,
)
AnimatedVisibility(visible = expanded) {
val uname = Os.uname()
Column {
Spacer(Modifier.height(16.dp))
InfoCardItem(
label = stringResource(R.string.home_kernel),
content = "${uname.release} (${uname.machine})",
icon = painterResource(R.drawable.ic_linux),
)
Spacer(Modifier.height(16.dp))
InfoCardItem(
label = stringResource(R.string.home_module_mount),
content = when {
ksuVersion == null -> stringResource(R.string.unavailable)
useOverlayFs -> stringResource(R.string.home_overlayfs_mount)
else -> stringResource(R.string.home_magic_mount)
},
icon = Icons.Filled.SettingsSuggest,
)
Spacer(Modifier.height(16.dp))
val isSUS_SU = getSuSFSFeatures() == "CONFIG_KSU_SUSFS_SUS_SU"
val suSFS = getSuSFS()
if (suSFS == "Supported") {
val susSUMode = if (isSUS_SU) "| SuS SU mode: ${susfsSUS_SU_Mode()}" else ""
InfoCardItem(
label = stringResource(R.string.home_susfs_version),
content = "${getSuSFSVersion()} (${getSuSFSVariant()}) $susSUMode",
icon = painterResource(R.drawable.ic_sus),
)
Spacer(Modifier.height(16.dp))
InfoCardItem(
label = stringResource(R.string.home_android),
content = "${Build.VERSION.RELEASE} (${Build.VERSION.SDK_INT})",
icon = Icons.Filled.Android,
)
Spacer(Modifier.height(16.dp))
InfoCardItem(
label = stringResource(R.string.home_abi),
content = Build.SUPPORTED_ABIS.joinToString(", "),
icon = Icons.Filled.Memory,
)
Spacer(Modifier.height(16.dp))
InfoCardItem(
label = stringResource(R.string.home_selinux_status),
content = getSELinuxStatus(),
icon = Icons.Filled.Security,
)
}
}
}
}
}
@@ -476,12 +562,13 @@ fun NextCard() {
ElevatedCard {
Row(modifier = Modifier
.fillMaxWidth()
.clickable {
uriHandler.openUri(url)
}
.padding(24.dp), verticalAlignment = Alignment.CenterVertically) {
Row(
modifier = Modifier
.fillMaxWidth()
.clickable {
uriHandler.openUri(url)
}
.padding(24.dp), verticalAlignment = Alignment.CenterVertically) {
Column {
Text(
text = stringResource(R.string.home_next_kernelsu),
@@ -505,13 +592,15 @@ fun EXperimentalCard() {
ElevatedCard {
Row(modifier = Modifier
.fillMaxWidth()
/*.clickable {
uriHandler.openUri(url)
}
*/
.padding(24.dp), verticalAlignment = Alignment.CenterVertically) {
Row(
modifier = Modifier
.fillMaxWidth()
/*.clickable {
uriHandler.openUri(url)
}
*/
.padding(24.dp), verticalAlignment = Alignment.CenterVertically
) {
Column {
Text(
text = stringResource(R.string.home_experimental_kernelsu),

View File

@@ -47,6 +47,7 @@ import androidx.compose.ui.res.stringResource
import androidx.compose.ui.semantics.Role
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp
import androidx.lifecycle.compose.dropUnlessResumed
import com.maxkeppeker.sheets.core.models.base.Header
import com.maxkeppeker.sheets.core.models.base.rememberUseCaseState
import com.maxkeppeler.sheets.list.ListDialog
@@ -133,7 +134,7 @@ fun InstallScreen(navigator: DestinationsNavigator) {
Scaffold(
topBar = {
TopBar(
onBack = { navigator.popBackStack() },
onBack = dropUnlessResumed { navigator.popBackStack() },
onLkmUpload = onLkmUpload,
scrollBehavior = scrollBehavior
)

View File

@@ -81,6 +81,7 @@ import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.Dp
import androidx.compose.ui.unit.dp
import androidx.lifecycle.viewmodel.compose.viewModel
import com.dergoogler.mmrl.platform.Platform
import com.ramcosta.composedestinations.annotation.Destination
import com.ramcosta.composedestinations.annotation.RootGraph
import com.ramcosta.composedestinations.generated.destinations.ExecuteModuleActionScreenDestination
@@ -92,6 +93,7 @@ import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext
import com.rifsxd.ksunext.Natives
import com.rifsxd.ksunext.R
import com.rifsxd.ksunext.ksuApp
import com.rifsxd.ksunext.ui.component.ConfirmResult
import com.rifsxd.ksunext.ui.component.rememberConfirmDialog
import com.rifsxd.ksunext.ui.component.rememberLoadingDialog
@@ -107,7 +109,7 @@ import com.rifsxd.ksunext.ui.util.uninstallModule
import com.rifsxd.ksunext.ui.util.restoreModule
import com.rifsxd.ksunext.ui.viewmodel.ModuleViewModel
import com.rifsxd.ksunext.ui.webui.WebUIActivity
import okhttp3.OkHttpClient
import com.rifsxd.ksunext.ui.webui.WebUIXActivity
@OptIn(ExperimentalMaterial3Api::class)
@Destination<RootGraph>
@@ -213,6 +215,12 @@ fun ModuleScreen(navigator: DestinationsNavigator) {
floatingActionButton = {
if (!hideInstallButton) {
val moduleInstall = stringResource(id = R.string.module_install)
val confirmTitle = stringResource(R.string.module)
var zipUris by remember { mutableStateOf<List<Uri>>(emptyList()) }
val confirmDialog = rememberConfirmDialog(onConfirm = {
navigator.navigate(FlashScreenDestination(FlashIt.FlashModules(zipUris)))
viewModel.markNeedRefresh()
})
val selectZipLauncher = rememberLauncherForActivityResult(
contract = ActivityResultContracts.StartActivityForResult()
) { result ->
@@ -231,8 +239,19 @@ fun ModuleScreen(navigator: DestinationsNavigator) {
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
showConfirmDialog = uris.isNotEmpty()
confirmDialog.showConfirm(
title = confirmTitle,
content = confirmContent,
markdown = true
)
}
ExtendedFloatingActionButton(
@@ -252,34 +271,7 @@ fun ModuleScreen(navigator: DestinationsNavigator) {
contentWindowInsets = WindowInsets.safeDrawing.only(WindowInsetsSides.Top + WindowInsetsSides.Horizontal),
snackbarHost = { SnackbarHost(hostState = snackBarHost) }
) { 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 {
hasMagisk -> {
Box(
@@ -294,6 +286,7 @@ fun ModuleScreen(navigator: DestinationsNavigator) {
)
}
}
else -> {
ModuleList(
navigator,
@@ -301,15 +294,22 @@ fun ModuleScreen(navigator: DestinationsNavigator) {
modifier = Modifier.nestedScroll(scrollBehavior.nestedScrollConnection),
boxModifier = Modifier.padding(innerPadding),
onInstallModule = {
navigator.navigate(FlashScreenDestination(FlashIt.FlashModule(it)))
navigator.navigate(FlashScreenDestination(FlashIt.FlashModules(listOf(it))))
},
onClickModule = { id, name, hasWebUi ->
if (hasWebUi) {
webUILauncher.launch(
Intent(context, WebUIActivity::class.java)
.setData(Uri.parse("kernelsu://webui/$id"))
.putExtra("id", id)
.putExtra("name", name)
if (prefs.getBoolean("use_webuix", true) && Platform.isAlive) {
Intent(context, WebUIXActivity::class.java)
.setData(Uri.parse("kernelsu://webuix/$id"))
.putExtra("id", id)
.putExtra("name", name)
} else {
Intent(context, WebUIActivity::class.java)
.setData(Uri.parse("kernelsu://webui/$id"))
.putExtra("id", id)
.putExtra("name", name)
}
)
}
},
@@ -331,7 +331,7 @@ private fun ModuleList(
onInstallModule: (Uri) -> Unit,
onClickModule: (id: String, name: String, hasWebUi: Boolean) -> Unit,
context: Context,
snackBarHost: SnackbarHostState
snackBarHost: SnackbarHostState,
) {
val failedEnable = stringResource(R.string.module_failed_to_enable)
val failedDisable = stringResource(R.string.module_failed_to_disable)
@@ -353,6 +353,17 @@ private fun ModuleList(
val startDownloadingText = stringResource(R.string.module_start_downloading)
val fetchChangeLogFailed = stringResource(R.string.module_changelog_failed)
val prefs = context.getSharedPreferences("settings", Context.MODE_PRIVATE)
val hasShownWarning =
rememberSaveable { mutableStateOf(prefs.getBoolean("has_shown_warning", false)) }
var useOverlayFs by rememberSaveable {
mutableStateOf(
prefs.getBoolean("use_overlay_fs", false)
)
}
val loadingDialog = rememberLoadingDialog()
val confirmDialog = rememberConfirmDialog()
@@ -360,12 +371,12 @@ private fun ModuleList(
module: ModuleViewModel.ModuleInfo,
changelogUrl: String,
downloadUrl: String,
fileName: String
fileName: String,
) {
val changelogResult = loadingDialog.withLoading {
withContext(Dispatchers.IO) {
runCatching {
OkHttpClient().newCall(
ksuApp.okhttpClient.newCall(
okhttp3.Request.Builder().url(changelogUrl).build()
).execute().body!!.string()
}
@@ -507,20 +518,6 @@ private fun ModuleList(
},
) {
when {
!viewModel.isOverlayAvailable -> {
item {
Box(
modifier = Modifier.fillParentMaxSize(),
contentAlignment = Alignment.Center
) {
Text(
stringResource(R.string.module_overlay_fs_not_available),
textAlign = TextAlign.Center
)
}
}
}
viewModel.moduleList.isEmpty() -> {
item {
Box(
@@ -573,7 +570,8 @@ private fun ModuleList(
reboot()
}
} else {
val message = if (module.enabled) failedDisable else failedEnable
val message =
if (module.enabled) failedDisable else failedEnable
snackBarHost.showSnackbar(message.format(module.name))
}
}
@@ -614,7 +612,7 @@ fun ModuleItem(
onRestore: (ModuleViewModel.ModuleInfo) -> Unit,
onCheckChanged: (Boolean) -> Unit,
onUpdate: (ModuleViewModel.ModuleInfo) -> Unit,
onClick: (ModuleViewModel.ModuleInfo) -> Unit
onClick: (ModuleViewModel.ModuleInfo) -> Unit,
) {
ElevatedCard(
modifier = Modifier.fillMaxWidth()
@@ -624,21 +622,21 @@ fun ModuleItem(
val indication = LocalIndication.current
val viewModel = viewModel<ModuleViewModel>()
val context = LocalContext.current
val prefs = context.getSharedPreferences("settings", Context.MODE_PRIVATE)
var developerOptionsEnabled by rememberSaveable {
mutableStateOf(
prefs.getBoolean("enable_developer_options", false)
)
}
LaunchedEffect(Unit) {
developerOptionsEnabled = prefs.getBoolean("enable_developer_options", false)
}
Column(
modifier = Modifier
.run {
if (module.hasWebUi) {
toggleable(
value = module.enabled,
interactionSource = interactionSource,
role = Role.Button,
indication = indication,
onValueChange = { onClick(module) }
)
} else {
this
}
}
.padding(22.dp, 18.dp, 22.dp, 12.dp)
) {
Row(
@@ -647,6 +645,10 @@ fun ModuleItem(
) {
val moduleVersion = stringResource(id = R.string.module_version)
val moduleAuthor = stringResource(id = R.string.module_author)
val moduleId = stringResource(id = R.string.module_id)
val moduleVersionCode = stringResource(id = R.string.module_version_code)
val moduleUpdateJson = stringResource(id = R.string.module_update_json)
val moduleUpdateJsonEmpty = stringResource(id = R.string.module_update_json_empty)
Column(
modifier = Modifier.fillMaxWidth(0.8f)
@@ -675,6 +677,33 @@ fun ModuleItem(
fontFamily = MaterialTheme.typography.bodySmall.fontFamily,
textDecoration = textDecoration
)
if (developerOptionsEnabled) {
Text(
text = "$moduleId: ${module.id}",
fontSize = MaterialTheme.typography.bodySmall.fontSize,
lineHeight = MaterialTheme.typography.bodySmall.lineHeight,
fontFamily = MaterialTheme.typography.bodySmall.fontFamily,
textDecoration = textDecoration
)
Text(
text = "$moduleVersionCode: ${module.versionCode}",
fontSize = MaterialTheme.typography.bodySmall.fontSize,
lineHeight = MaterialTheme.typography.bodySmall.lineHeight,
fontFamily = MaterialTheme.typography.bodySmall.fontFamily,
textDecoration = textDecoration
)
Text(
text = if (module.updateJson.isNotEmpty()) "$moduleUpdateJson: ${module.updateJson}" else "$moduleUpdateJson: $moduleUpdateJsonEmpty",
fontSize = MaterialTheme.typography.bodySmall.fontSize,
lineHeight = MaterialTheme.typography.bodySmall.lineHeight,
fontFamily = MaterialTheme.typography.bodySmall.fontFamily,
textDecoration = textDecoration
)
}
}
Spacer(modifier = Modifier.weight(1f))
@@ -718,6 +747,7 @@ fun ModuleItem(
if (module.hasActionScript) {
FilledTonalButton(
modifier = Modifier.defaultMinSize(52.dp, 32.dp),
enabled = !module.remove && module.enabled,
onClick = {
navigator.navigate(ExecuteModuleActionScreenDestination(module.dirId))
viewModel.markNeedRefresh()
@@ -745,6 +775,7 @@ fun ModuleItem(
if (module.hasWebUi) {
FilledTonalButton(
modifier = Modifier.defaultMinSize(52.dp, 32.dp),
enabled = !module.remove && module.enabled,
onClick = { onClick(module) },
interactionSource = interactionSource,
contentPadding = ButtonDefaults.TextButtonContentPadding
@@ -770,6 +801,7 @@ fun ModuleItem(
if (updateUrl.isNotEmpty()) {
Button(
modifier = Modifier.defaultMinSize(52.dp, 32.dp),
enabled = !module.remove,
onClick = { onUpdate(module) },
shape = ButtonDefaults.textShape,
contentPadding = ButtonDefaults.TextButtonContentPadding
@@ -831,7 +863,7 @@ fun ModuleItem(
fontSize = MaterialTheme.typography.labelMedium.fontSize,
text = stringResource(R.string.uninstall)
)
}
}
}
}
}

View File

@@ -53,6 +53,7 @@ import androidx.compose.ui.text.style.TextAlign
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp
import androidx.core.content.FileProvider
import com.dergoogler.mmrl.platform.Platform
import com.maxkeppeker.sheets.core.models.base.Header
import com.maxkeppeker.sheets.core.models.base.IconSource
import com.maxkeppeker.sheets.core.models.base.rememberUseCaseState
@@ -63,6 +64,7 @@ import com.ramcosta.composedestinations.annotation.Destination
import com.ramcosta.composedestinations.annotation.RootGraph
import com.ramcosta.composedestinations.generated.destinations.AppProfileTemplateScreenDestination
import com.ramcosta.composedestinations.generated.destinations.FlashScreenDestination
import com.ramcosta.composedestinations.generated.destinations.BackupRestoreScreenDestination
import com.ramcosta.composedestinations.navigation.DestinationsNavigator
import com.ramcosta.composedestinations.navigation.EmptyDestinationsNavigator
import kotlinx.coroutines.Dispatchers
@@ -113,8 +115,6 @@ fun SettingScreen(navigator: DestinationsNavigator) {
}
val loadingDialog = rememberLoadingDialog()
val shrinkDialog = rememberConfirmDialog()
val restoreDialog = rememberConfirmDialog()
val backupDialog = rememberConfirmDialog()
Column(
modifier = Modifier
@@ -159,10 +159,11 @@ fun SettingScreen(navigator: DestinationsNavigator) {
}
if (ksuVersion != null) {
SwitchItem(
icon = Icons.Filled.RemoveModerator,
icon = Icons.Filled.FolderDelete,
title = stringResource(id = R.string.settings_umount_modules_default),
summary = stringResource(id = R.string.settings_umount_modules_default_summary),
checked = umountChecked
) {
if (Natives.setDefaultUmountModules(it)) {
umountChecked = it
@@ -170,6 +171,25 @@ fun SettingScreen(navigator: DestinationsNavigator) {
}
}
if (ksuVersion != null) {
if (Natives.version >= Natives.MINIMAL_SUPPORTED_SU_COMPAT) {
var isSuDisabled by rememberSaveable {
mutableStateOf(!Natives.isSuEnabled())
}
SwitchItem(
icon = Icons.Filled.RemoveModerator,
title = stringResource(id = R.string.settings_disable_su),
summary = stringResource(id = R.string.settings_disable_su_summary),
checked = isSuDisabled
) { checked ->
val shouldEnable = !checked
if (Natives.setSuEnabled(shouldEnable)) {
isSuDisabled = !shouldEnable
}
}
}
}
val prefs = context.getSharedPreferences("settings", Context.MODE_PRIVATE)
val suSFS = getSuSFS()
@@ -201,62 +221,35 @@ fun SettingScreen(navigator: DestinationsNavigator) {
}
}
val hasShownWarning = rememberSaveable { mutableStateOf(prefs.getBoolean("has_shown_warning", false)) }
var useOverlayFs by rememberSaveable {
mutableStateOf(
prefs.getBoolean("use_overlay_fs", false)
)
}
val isManager = Natives.becomeManager(ksuApp.packageName)
var showRebootDialog by remember { mutableStateOf(false) }
var showWarningDialog by remember { mutableStateOf(false) }
val isOverlayAvailable = overlayFsAvailable()
if (ksuVersion != null) {
if (ksuVersion != null && isOverlayAvailable) {
SwitchItem(
icon = Icons.Filled.Build,
title = stringResource(id = R.string.use_overlay_fs),
summary = stringResource(id = R.string.use_overlay_fs_summary),
checked = useOverlayFs
) {
if (!hasShownWarning.value) {
showWarningDialog = true
prefs.edit().putBoolean("use_overlay_fs", it).apply()
useOverlayFs = it
if (useOverlayFs) {
moduleBackup()
} else {
moduleMigration()
}
if (isManager) install()
showRebootDialog = true
}
}
if (showWarningDialog) {
AlertDialog(
onDismissRequest = { showWarningDialog = false },
title = { Text(stringResource(R.string.warning)) },
text = { Text(stringResource(R.string.warning_message)) },
confirmButton = {
TextButton(onClick = {
showWarningDialog = false
prefs.edit().putBoolean("use_overlay_fs", !useOverlayFs).apply()
useOverlayFs = !useOverlayFs
if (useOverlayFs) {
moduleBackup()
} else {
moduleMigration()
}
if (isManager) install()
showRebootDialog = true
}) {
Text(stringResource(R.string.proceed))
}
},
dismissButton = {
TextButton(onClick = { showWarningDialog = false }) {
Text(stringResource(R.string.cancel))
}
}
)
}
if (showRebootDialog) {
AlertDialog(
onDismissRequest = { showRebootDialog = false },
@@ -281,7 +274,7 @@ fun SettingScreen(navigator: DestinationsNavigator) {
var checkUpdate by rememberSaveable {
mutableStateOf(
prefs.getBoolean("check_update", true)
prefs.getBoolean("check_update", false)
)
}
SwitchItem(
@@ -299,16 +292,120 @@ fun SettingScreen(navigator: DestinationsNavigator) {
prefs.getBoolean("enable_web_debugging", false)
)
}
SwitchItem(
icon = Icons.Filled.DeveloperMode,
title = stringResource(id = R.string.enable_web_debugging),
summary = stringResource(id = R.string.enable_web_debugging_summary),
checked = enableWebDebugging
) {
prefs.edit().putBoolean("enable_web_debugging", it).apply()
enableWebDebugging = it
if (ksuVersion != null) {
SwitchItem(
icon = Icons.Filled.Web,
title = stringResource(id = R.string.enable_web_debugging),
summary = stringResource(id = R.string.enable_web_debugging_summary),
checked = enableWebDebugging
) {
prefs.edit().putBoolean("enable_web_debugging", it).apply()
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 useWebUIX by rememberSaveable {
mutableStateOf(
prefs.getBoolean("use_webuix", true)
)
}
if (ksuVersion != null) {
SwitchItem(
beta = false,
enabled = Platform.isAlive,
icon = Icons.Filled.WebAsset,
title = stringResource(id = R.string.use_webuix),
summary = stringResource(id = R.string.use_webuix_summary),
checked = useWebUIX
) {
prefs.edit().putBoolean("use_webuix", it).apply()
useWebUIX = it
}
}
var useWebUIXEruda by rememberSaveable {
mutableStateOf(
prefs.getBoolean("use_webuix_eruda", false)
)
}
if (ksuVersion != null) {
SwitchItem(
beta = false,
enabled = Platform.isAlive && useWebUIX && enableWebDebugging,
icon = Icons.Filled.FormatListNumbered,
title = stringResource(id = R.string.use_webuix_eruda),
summary = stringResource(id = R.string.use_webuix_eruda_summary),
checked = useWebUIXEruda
) {
prefs.edit().putBoolean("use_webuix_eruda", it).apply()
useWebUIXEruda = it
}
}
if (isOverlayAvailable && useOverlayFs) {
val shrink = stringResource(id = R.string.shrink_sparse_image)
val shrinkMessage = stringResource(id = R.string.shrink_sparse_image_message)
ListItem(
leadingContent = {
Icon(
Icons.Filled.Compress,
shrink
)
},
headlineContent = { Text(shrink) },
modifier = Modifier.clickable {
scope.launch {
val result = shrinkDialog.awaitConfirm(title = shrink, content = shrinkMessage)
if (result == ConfirmResult.Confirmed) {
loadingDialog.withLoading {
shrinkModules()
}
}
}
}
)
}
if (ksuVersion != null) {
val backupRestore = stringResource(id = R.string.backup_restore)
ListItem(
leadingContent = {
Icon(
Icons.Filled.Backup,
backupRestore
)
},
headlineContent = { Text(backupRestore) },
modifier = Modifier.clickable {
navigator.navigate(BackupRestoreScreenDestination)
}
)
}
// val lkmMode = Natives.version >= Natives.MINIMAL_SUPPORTED_KERNEL_LKM && Natives.isLkmMode
// if (lkmMode) {
// UninstallItem(navigator) {
// loadingDialog.withLoading(it)
// }
// } // DISBAND LKM MODE
var showBottomsheet by remember { mutableStateOf(false) }
ListItem(
@@ -340,7 +437,7 @@ fun SettingScreen(navigator: DestinationsNavigator) {
.clickable {
val formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd_HH_mm")
val current = LocalDateTime.now().format(formatter)
exportBugreportLauncher.launch("KernelSU_bugreport_${current}.tar.gz")
exportBugreportLauncher.launch("KernelSU_Next_bugreport_${current}.tar.gz")
showBottomsheet = false
}
) {
@@ -418,87 +515,6 @@ fun SettingScreen(navigator: DestinationsNavigator) {
)
}
if (ksuVersion != null) {
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 (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
}
}
}
}
)
}
if (useOverlayFs) {
val shrink = stringResource(id = R.string.shrink_sparse_image)
val shrinkMessage = stringResource(id = R.string.shrink_sparse_image_message)
ListItem(
leadingContent = {
Icon(
Icons.Filled.Compress,
shrink
)
},
headlineContent = { Text(shrink) },
modifier = Modifier.clickable {
scope.launch {
val result = shrinkDialog.awaitConfirm(title = shrink, content = shrinkMessage)
if (result == ConfirmResult.Confirmed) {
loadingDialog.withLoading {
shrinkModules()
}
}
}
}
)
}
val lkmMode = Natives.version >= Natives.MINIMAL_SUPPORTED_KERNEL_LKM && Natives.isLkmMode
if (lkmMode) {
UninstallItem(navigator) {
loadingDialog.withLoading(it)
}
}
val about = stringResource(id = R.string.about)
ListItem(
leadingContent = {
@@ -516,112 +532,112 @@ fun SettingScreen(navigator: DestinationsNavigator) {
}
}
@Composable
fun UninstallItem(
navigator: DestinationsNavigator,
withLoading: suspend (suspend () -> Unit) -> Unit
) {
val context = LocalContext.current
val scope = rememberCoroutineScope()
val uninstallConfirmDialog = rememberConfirmDialog()
val showTodo = {
Toast.makeText(context, "TODO", Toast.LENGTH_SHORT).show()
}
val uninstallDialog = rememberUninstallDialog { uninstallType ->
scope.launch {
val result = uninstallConfirmDialog.awaitConfirm(
title = context.getString(uninstallType.title),
content = context.getString(uninstallType.message)
)
if (result == ConfirmResult.Confirmed) {
withLoading {
when (uninstallType) {
UninstallType.TEMPORARY -> showTodo()
UninstallType.PERMANENT -> navigator.navigate(
FlashScreenDestination(FlashIt.FlashUninstall)
)
UninstallType.RESTORE_STOCK_IMAGE -> navigator.navigate(
FlashScreenDestination(FlashIt.FlashRestore)
)
UninstallType.NONE -> Unit
}
}
}
}
}
val uninstall = stringResource(id = R.string.settings_uninstall)
ListItem(
leadingContent = {
Icon(
Icons.Filled.Delete,
uninstall
)
},
headlineContent = { Text(uninstall) },
modifier = Modifier.clickable {
uninstallDialog.show()
}
)
}
// @Composable
// fun UninstallItem(
// navigator: DestinationsNavigator,
// withLoading: suspend (suspend () -> Unit) -> Unit,
// ) {
// val context = LocalContext.current
// val scope = rememberCoroutineScope()
// val uninstallConfirmDialog = rememberConfirmDialog()
// val showTodo = {
// Toast.makeText(context, "TODO", Toast.LENGTH_SHORT).show()
// }
// val uninstallDialog = rememberUninstallDialog { uninstallType ->
// scope.launch {
// val result = uninstallConfirmDialog.awaitConfirm(
// title = context.getString(uninstallType.title),
// content = context.getString(uninstallType.message)
// )
// if (result == ConfirmResult.Confirmed) {
// withLoading {
// when (uninstallType) {
// UninstallType.TEMPORARY -> showTodo()
// UninstallType.PERMANENT -> navigator.navigate(
// FlashScreenDestination(FlashIt.FlashUninstall)
// )
// UninstallType.RESTORE_STOCK_IMAGE -> navigator.navigate(
// FlashScreenDestination(FlashIt.FlashRestore)
// )
// UninstallType.NONE -> Unit
// }
// }
// }
// }
// }
// val uninstall = stringResource(id = R.string.settings_uninstall)
// ListItem(
// leadingContent = {
// Icon(
// Icons.Filled.Delete,
// uninstall
// )
// },
// headlineContent = { Text(uninstall) },
// modifier = Modifier.clickable {
// uninstallDialog.show()
// }
// )
// }
enum class UninstallType(val title: Int, val message: Int, val icon: ImageVector) {
TEMPORARY(
R.string.settings_uninstall_temporary,
R.string.settings_uninstall_temporary_message,
Icons.Filled.Delete
),
PERMANENT(
R.string.settings_uninstall_permanent,
R.string.settings_uninstall_permanent_message,
Icons.Filled.DeleteForever
),
RESTORE_STOCK_IMAGE(
R.string.settings_restore_stock_image,
R.string.settings_restore_stock_image_message,
Icons.AutoMirrored.Filled.Undo
),
NONE(0, 0, Icons.Filled.Delete)
}
// enum class UninstallType(val title: Int, val message: Int, val icon: ImageVector) {
// TEMPORARY(
// R.string.settings_uninstall_temporary,
// R.string.settings_uninstall_temporary_message,
// Icons.Filled.Delete
// ),
// PERMANENT(
// R.string.settings_uninstall_permanent,
// R.string.settings_uninstall_permanent_message,
// Icons.Filled.DeleteForever
// ),
// RESTORE_STOCK_IMAGE(
// R.string.settings_restore_stock_image,
// R.string.settings_restore_stock_image_message,
// Icons.AutoMirrored.Filled.Undo
// ),
// NONE(0, 0, Icons.Filled.Delete)
// }
@OptIn(ExperimentalMaterial3Api::class)
@Composable
fun rememberUninstallDialog(onSelected: (UninstallType) -> Unit): DialogHandle {
return rememberCustomDialog { dismiss ->
val options = listOf(
// UninstallType.TEMPORARY,
UninstallType.PERMANENT,
UninstallType.RESTORE_STOCK_IMAGE
)
val listOptions = options.map {
ListOption(
titleText = stringResource(it.title),
subtitleText = if (it.message != 0) stringResource(it.message) else null,
icon = IconSource(it.icon)
)
}
// @OptIn(ExperimentalMaterial3Api::class)
// @Composable
// fun rememberUninstallDialog(onSelected: (UninstallType) -> Unit): DialogHandle {
// return rememberCustomDialog { dismiss ->
// val options = listOf(
// // UninstallType.TEMPORARY,
// UninstallType.PERMANENT,
// UninstallType.RESTORE_STOCK_IMAGE
// )
// val listOptions = options.map {
// ListOption(
// titleText = stringResource(it.title),
// subtitleText = if (it.message != 0) stringResource(it.message) else null,
// icon = IconSource(it.icon)
// )
// }
var selection = UninstallType.NONE
ListDialog(state = rememberUseCaseState(visible = true, onFinishedRequest = {
if (selection != UninstallType.NONE) {
onSelected(selection)
}
}, onCloseRequest = {
dismiss()
}), header = Header.Default(
title = stringResource(R.string.settings_uninstall),
), selection = ListSelection.Single(
showRadioButtons = false,
options = listOptions,
) { index, _ ->
selection = options[index]
})
}
}
// var selection = UninstallType.NONE
// ListDialog(state = rememberUseCaseState(visible = true, onFinishedRequest = {
// if (selection != UninstallType.NONE) {
// onSelected(selection)
// }
// }, onCloseRequest = {
// dismiss()
// }), header = Header.Default(
// title = stringResource(R.string.settings_uninstall),
// ), selection = ListSelection.Single(
// showRadioButtons = false,
// options = listOptions,
// ) { index, _ ->
// selection = options[index]
// })
// }
// } // DISBAND LKM MODE
@OptIn(ExperimentalMaterial3Api::class)
@Composable
private fun TopBar(
scrollBehavior: TopAppBarScrollBehavior? = null
scrollBehavior: TopAppBarScrollBehavior? = null,
) {
TopAppBar(
title = { Text(stringResource(R.string.settings)) },
@@ -634,4 +650,4 @@ private fun TopBar(
@Composable
private fun SettingsPreview() {
SettingScreen(EmptyDestinationsNavigator)
}
}

View File

@@ -13,6 +13,7 @@ import androidx.compose.material.icons.filled.MoreVert
import androidx.compose.material3.*
import androidx.compose.material3.pulltorefresh.PullToRefreshBox
import androidx.compose.runtime.*
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.input.nestedscroll.nestedScroll
@@ -24,6 +25,9 @@ import androidx.compose.ui.unit.sp
import androidx.lifecycle.viewmodel.compose.viewModel
import coil.compose.AsyncImage
import coil.request.ImageRequest
import com.dergoogler.mmrl.platform.Platform
import com.dergoogler.mmrl.ui.component.LabelItem
import com.dergoogler.mmrl.ui.component.LabelItemDefaults
import com.ramcosta.composedestinations.annotation.Destination
import com.ramcosta.composedestinations.annotation.RootGraph
import com.ramcosta.composedestinations.generated.destinations.AppProfileScreenDestination
@@ -43,7 +47,7 @@ fun SuperUserScreen(navigator: DestinationsNavigator) {
val scrollBehavior = TopAppBarDefaults.pinnedScrollBehavior(rememberTopAppBarState())
val listState = rememberLazyListState()
LaunchedEffect(key1 = navigator) {
LaunchedEffect(navigator) {
viewModel.search = ""
if (viewModel.appList.isEmpty()) {
viewModel.fetchAppList()
@@ -148,16 +152,32 @@ private fun AppItem(
supportingContent = {
Column {
Text(app.packageName)
FlowRow {
FlowRow(
horizontalArrangement = Arrangement.spacedBy(4.dp)
) {
if (app.allowSu) {
LabelText(label = "ROOT")
LabelItem(
text = "ROOT",
)
} else {
if (Natives.uidShouldUmount(app.uid)) {
LabelText(label = "UMOUNT")
LabelItem(
text = "UMOUNT",
style = LabelItemDefaults.style.copy(
containerColor = MaterialTheme.colorScheme.secondaryContainer,
contentColor = MaterialTheme.colorScheme.onSecondaryContainer
)
)
}
}
if (app.hasCustomProfile) {
LabelText(label = "CUSTOM")
LabelItem(
text = "CUSTOM",
style = LabelItemDefaults.style.copy(
containerColor = MaterialTheme.colorScheme.onTertiary,
contentColor = MaterialTheme.colorScheme.onTertiaryContainer,
)
)
}
}
}

View File

@@ -49,6 +49,7 @@ import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.text.AnnotatedString
import androidx.compose.ui.unit.dp
import androidx.lifecycle.compose.dropUnlessResumed
import androidx.lifecycle.viewmodel.compose.viewModel
import com.ramcosta.composedestinations.annotation.Destination
import com.ramcosta.composedestinations.annotation.RootGraph
@@ -100,7 +101,7 @@ fun AppProfileTemplateScreen(
}
}
TopBar(
onBack = { navigator.popBackStack() },
onBack = dropUnlessResumed { navigator.popBackStack() },
onSync = {
scope.launch { viewModel.fetchTemplates(true) }
},

View File

@@ -44,6 +44,7 @@ import androidx.compose.ui.platform.LocalSoftwareKeyboardController
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.text.input.ImeAction
import androidx.compose.ui.text.input.KeyboardType
import androidx.lifecycle.compose.dropUnlessResumed
import com.ramcosta.composedestinations.annotation.Destination
import com.ramcosta.composedestinations.annotation.RootGraph
import com.ramcosta.composedestinations.result.ResultBackNavigator
@@ -105,7 +106,7 @@ fun TemplateEditorScreen(
},
readOnly = readOnly,
summary = titleSummary,
onBack = { navigator.navigateBack(result = !readOnly) },
onBack = dropUnlessResumed { navigator.navigateBack(result = !readOnly) },
onDelete = {
if (deleteAppProfileTemplate(template.id)) {
navigator.navigateBack(result = true)

View File

@@ -1,6 +1,9 @@
package com.rifsxd.ksunext.ui.theme
import android.os.Build
import androidx.activity.SystemBarStyle
import androidx.activity.ComponentActivity
import androidx.activity.enableEdgeToEdge
import androidx.compose.foundation.isSystemInDarkTheme
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.darkColorScheme
@@ -8,6 +11,9 @@ import androidx.compose.material3.dynamicDarkColorScheme
import androidx.compose.material3.dynamicLightColorScheme
import androidx.compose.material3.lightColorScheme
import androidx.compose.runtime.Composable
import androidx.compose.runtime.SideEffect
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.graphics.toArgb
import androidx.compose.ui.platform.LocalContext
private val DarkColorScheme = darkColorScheme(
@@ -38,9 +44,42 @@ fun KernelSUTheme(
else -> LightColorScheme
}
SystemBarStyle(
darkMode = darkTheme
)
MaterialTheme(
colorScheme = colorScheme,
typography = Typography,
content = content
)
}
@Composable
private fun SystemBarStyle(
darkMode: Boolean,
statusBarScrim: Color = Color.Transparent,
navigationBarScrim: Color = Color.Transparent,
) {
val context = LocalContext.current
val activity = context as ComponentActivity
SideEffect {
activity.enableEdgeToEdge(
statusBarStyle = SystemBarStyle.auto(
statusBarScrim.toArgb(),
statusBarScrim.toArgb(),
) { darkMode },
navigationBarStyle = when {
darkMode -> SystemBarStyle.dark(
navigationBarScrim.toArgb()
)
else -> SystemBarStyle.light(
navigationBarScrim.toArgb(),
navigationBarScrim.toArgb(),
)
}
)
}
}

View File

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

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 {
val SHELL: Shell = createRootShell()
val GLOBAL_MNT_SHELL: Shell = createRootShell(true)
@@ -92,9 +97,9 @@ fun createRootShell(globalMnt: Boolean = false): Shell {
Log.w(TAG, "ksu failed: ", e)
try {
if (globalMnt) {
builder.build("su")
} else {
builder.build("su", "-mm")
} else {
builder.build("su")
}
} catch (e: Throwable) {
Log.e(TAG, "su failed: ", e)
@@ -190,10 +195,9 @@ private fun flashWithIO(
fun flashModule(
uri: Uri,
onFinish: (Boolean, Int) -> Unit,
onStdout: (String) -> Unit,
onStderr: (String) -> Unit
): Boolean {
): FlashResult {
val resolver = ksuApp.contentResolver
with(resolver.openInputStream(uri)) {
val file = File(ksuApp.cacheDir, "module.zip")
@@ -206,15 +210,14 @@ fun flashModule(
file.delete()
onFinish(result.isSuccess, result.code)
return result.isSuccess
return FlashResult(result)
}
}
fun runModuleAction(
moduleId: String, onStdout: (String) -> Unit, onStderr: (String) -> Unit
): Boolean {
val shell = getRootShell()
val shell = createRootShell(true)
val stdoutCallback: CallbackList<String?> = object : CallbackList<String?>() {
override fun onAddElement(s: String?) {
@@ -236,21 +239,19 @@ fun runModuleAction(
}
fun restoreBoot(
onFinish: (Boolean, Int) -> Unit, onStdout: (String) -> Unit, onStderr: (String) -> Unit
): Boolean {
onStdout: (String) -> Unit, onStderr: (String) -> Unit
): FlashResult {
val magiskboot = File(ksuApp.applicationInfo.nativeLibraryDir, "libmagiskboot.so")
val result = flashWithIO("${getKsuDaemonPath()} boot-restore -f --magiskboot $magiskboot", onStdout, onStderr)
onFinish(result.isSuccess, result.code)
return result.isSuccess
return FlashResult(result)
}
fun uninstallPermanently(
onFinish: (Boolean, Int) -> Unit, onStdout: (String) -> Unit, onStderr: (String) -> Unit
): Boolean {
onStdout: (String) -> Unit, onStderr: (String) -> Unit
): FlashResult {
val magiskboot = File(ksuApp.applicationInfo.nativeLibraryDir, "libmagiskboot.so")
val result = flashWithIO("${getKsuDaemonPath()} uninstall --magiskboot $magiskboot", onStdout, onStderr)
onFinish(result.isSuccess, result.code)
return result.isSuccess
return FlashResult(result)
}
suspend fun shrinkModules(): Boolean = withContext(Dispatchers.IO) {
@@ -268,10 +269,9 @@ fun installBoot(
bootUri: Uri?,
lkm: LkmSelection,
ota: Boolean,
onFinish: (Boolean, Int) -> Unit,
onStdout: (String) -> Unit,
onStderr: (String) -> Unit,
): Boolean {
): FlashResult {
val resolver = ksuApp.contentResolver
val bootFile = bootUri?.let { uri ->
@@ -334,15 +334,14 @@ fun installBoot(
lkmFile?.delete()
// if boot uri is empty, it is direct install, when success, we should show reboot button
onFinish(bootUri == null && result.isSuccess, result.code)
return result.isSuccess
return FlashResult(result, bootUri == null && result.isSuccess)
}
fun reboot(reason: String = "") {
val shell = getRootShell()
if (reason == "recovery") {
// KEYCODE_POWER = 26, hide incorrect "Factory data reset" message
ShellUtils.fastCmd(shell, "/system/bin/input keyevent 26")
ShellUtils.fastCmd(shell, "/system/bin/reboot $reason")
}
ShellUtils.fastCmd(shell, "/system/bin/svc power reboot $reason || /system/bin/reboot $reason")
}
@@ -444,7 +443,7 @@ fun getFileName(context: Context, uri: Uri): String {
fun moduleBackupDir(): String? {
val shell = getRootShell()
val baseBackupDir = "/data/adb/modules_bak"
val baseBackupDir = "/sdcard/.ksunext/modules"
val resultBase = ShellUtils.fastCmd(shell, "mkdir -p $baseBackupDir").trim()
if (resultBase.isNotEmpty()) return null
@@ -463,16 +462,87 @@ fun moduleBackup(): Boolean {
val checkEmptyCommand = "if [ -z \"$(ls -A /data/adb/modules)\" ]; then echo 'empty'; fi"
val resultCheckEmpty = ShellUtils.fastCmd(shell, checkEmptyCommand).trim()
if (resultCheckEmpty == "empty") {
return false
}
val backupDir = moduleBackupDir() ?: return false
val command = "cp -rp /data/adb/modules/* $backupDir"
val result = ShellUtils.fastCmd(shell, command).trim()
val timestamp = ShellUtils.fastCmd(shell, "date +%Y%m%d_%H%M%S").trim()
if (timestamp.isEmpty()) return false
return result.isEmpty()
val tarName = "modules_backup_$timestamp.tar"
val tarPath = "/data/local/tmp/$tarName"
val internalBackupDir = "/sdcard/.ksunext/modules"
val internalBackupPath = "$internalBackupDir/$tarName"
val tarCmd = "tar -cpf $tarPath -C /data/adb/modules $(ls /data/adb/modules)"
val tarResult = ShellUtils.fastCmd(shell, tarCmd).trim()
if (tarResult.isNotEmpty()) return false
ShellUtils.fastCmd(shell, "mkdir -p $internalBackupDir")
val cpResult = ShellUtils.fastCmd(shell, "cp $tarPath $internalBackupPath").trim()
if (cpResult.isNotEmpty()) return false
ShellUtils.fastCmd(shell, "rm -f $tarPath")
return true
}
fun moduleRestore(): Boolean {
val shell = getRootShell()
val findTarCmd = "ls -t /sdcard/.ksunext/modules/modules_backup_*.tar 2>/dev/null | head -n 1"
val tarPath = ShellUtils.fastCmd(shell, findTarCmd).trim()
if (tarPath.isEmpty()) return false
val extractCmd = "tar -xpf $tarPath -C /data/adb/modules_update"
val extractResult = ShellUtils.fastCmd(shell, extractCmd).trim()
return extractResult.isEmpty()
}
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 timestamp = ShellUtils.fastCmd(shell, "date +%Y%m%d_%H%M%S").trim()
if (timestamp.isEmpty()) return false
val tarName = "allowlist_backup_$timestamp.tar"
val tarPath = "/data/local/tmp/$tarName"
val internalBackupDir = "/sdcard/.ksunext/allowlist"
val internalBackupPath = "$internalBackupDir/$tarName"
val tarCmd = "tar -cpf $tarPath -C /data/adb/ksu .allowlist"
val tarResult = ShellUtils.fastCmd(shell, tarCmd).trim()
if (tarResult.isNotEmpty()) return false
ShellUtils.fastCmd(shell, "mkdir -p $internalBackupDir")
val cpResult = ShellUtils.fastCmd(shell, "cp $tarPath $internalBackupPath").trim()
if (cpResult.isNotEmpty()) return false
ShellUtils.fastCmd(shell, "rm -f $tarPath")
return true
}
fun allowlistRestore(): Boolean {
val shell = getRootShell()
// Find the latest allowlist tar backup in /sdcard/.ksunext/allowlist
val findTarCmd = "ls -t /sdcard/.ksunext/allowlist/allowlist_backup_*.tar 2>/dev/null | head -n 1"
val tarPath = ShellUtils.fastCmd(shell, findTarCmd).trim()
if (tarPath.isEmpty()) return false
// Extract the tar to /data/adb/ksu (restores .allowlist folder with permissions)
val extractCmd = "tar -xpf $tarPath -C /data/adb/ksu"
val extractResult = ShellUtils.fastCmd(shell, extractCmd).trim()
return extractResult.isEmpty()
}
fun moduleMigration(): Boolean {
@@ -483,26 +553,6 @@ fun moduleMigration(): Boolean {
return result.isEmpty()
}
fun moduleRestore(): Boolean {
val shell = getRootShell()
val command = "ls -t /data/adb/modules_bak | head -n 1"
val latestBackupDir = ShellUtils.fastCmd(shell, command).trim()
if (latestBackupDir.isEmpty()) return false
val sourceDir = "/data/adb/modules_bak/$latestBackupDir"
val destinationDir = "/data/adb/modules_update"
val createDestDirCommand = "mkdir -p $destinationDir"
ShellUtils.fastCmd(shell, createDestDirCommand)
val moveCommand = "cp -rp $sourceDir/* $destinationDir"
val result = ShellUtils.fastCmd(shell, moveCommand).trim()
return result.isEmpty()
}
private fun getSuSFSDaemonPath(): String {
return ksuApp.applicationInfo.nativeLibraryDir + File.separator + "libsusfsd.so"
}
@@ -548,6 +598,13 @@ fun susfsSUS_SU_Mode(): String {
return result
}
fun currentMountSystem(): String {
val shell = getRootShell()
val cmd = "module mount"
val result = ShellUtils.fastCmd(shell, "${getKsuDaemonPath()} $cmd").trim()
return result.substringAfter(":").substringAfter(" ").trim()
}
fun setAppProfileTemplate(id: String, template: String): Boolean {
val shell = getRootShell()
val escapedTemplate = template.replace("\"", "\\\"")

View File

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

View File

@@ -12,6 +12,7 @@ import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch
import java.text.Collator
import java.util.Locale
import com.rifsxd.ksunext.ksuApp
import com.rifsxd.ksunext.ui.util.HanziToPinyin
import com.rifsxd.ksunext.ui.util.listModules
import com.rifsxd.ksunext.ui.util.overlayFsAvailable
@@ -135,6 +136,10 @@ class ModuleViewModel : ViewModel() {
}
}
private fun sanitizeVersionString(version: String): String {
return version.replace(Regex("[^a-zA-Z0-9.\\-_]"), "_")
}
fun checkUpdate(m: ModuleInfo): Triple<String, String, String> {
val empty = Triple("", "", "")
if (m.updateJson.isEmpty() || m.remove || m.update || !m.enabled) {
@@ -144,11 +149,8 @@ class ModuleViewModel : ViewModel() {
val result = kotlin.runCatching {
val url = m.updateJson
Log.i(TAG, "checkUpdate url: $url")
val response = okhttp3.OkHttpClient()
.newCall(
okhttp3.Request.Builder()
.url(url)
.build()
val response = ksuApp.okhttpClient.newCall(
okhttp3.Request.Builder().url(url).build()
).execute()
Log.d(TAG, "checkUpdate code: ${response.code}")
if (response.isSuccessful) {
@@ -167,7 +169,8 @@ class ModuleViewModel : ViewModel() {
JSONObject(result)
}.getOrNull() ?: return empty
val version = updateJson.optString("version", "")
var version = updateJson.optString("version", "")
version = sanitizeVersionString(version)
val versionCode = updateJson.optInt("versionCode", 0)
val zipUrl = updateJson.optString("zipUrl", "")
val changelog = updateJson.optString("changelog", "")

View File

@@ -1,11 +1,7 @@
package com.rifsxd.ksunext.ui.viewmodel
import android.content.ComponentName
import android.content.Intent
import android.content.ServiceConnection
import android.content.pm.ApplicationInfo
import android.content.pm.PackageInfo
import android.os.IBinder
import android.os.Parcelable
import android.os.SystemClock
import android.util.Log
@@ -14,22 +10,23 @@ import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.setValue
import androidx.lifecycle.ViewModel
import com.topjohnwu.superuser.Shell
import com.dergoogler.mmrl.platform.Platform
import com.dergoogler.mmrl.platform.TIMEOUT_MILLIS
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.withContext
import kotlinx.parcelize.Parcelize
import com.rifsxd.ksunext.IKsuInterface
import com.rifsxd.ksunext.Natives
import com.rifsxd.ksunext.ksuApp
import com.rifsxd.ksunext.ui.KsuService
import com.rifsxd.ksunext.ui.util.HanziToPinyin
import com.rifsxd.ksunext.ui.util.KsuCli
import com.rifsxd.ksunext.ui.webui.packageManager
import com.rifsxd.ksunext.ui.webui.userManager
import kotlinx.coroutines.delay
import kotlinx.coroutines.withTimeoutOrNull
import java.text.Collator
import java.util.*
import kotlin.coroutines.resume
import kotlin.coroutines.suspendCoroutine
class SuperUserViewModel : ViewModel() {
val isPlatformAlive get() = Platform.isAlive
var refreshOnReturn by mutableStateOf(false)
public set
@@ -97,55 +94,24 @@ class SuperUserViewModel : ViewModel() {
}
}
private suspend inline fun connectKsuService(
crossinline onDisconnect: () -> Unit = {}
): Pair<IBinder, ServiceConnection> = suspendCoroutine {
val connection = object : ServiceConnection {
override fun onServiceDisconnected(name: ComponentName?) {
onDisconnect()
}
override fun onServiceConnected(name: ComponentName?, binder: IBinder?) {
it.resume(binder as IBinder to this)
}
}
val intent = Intent(ksuApp, KsuService::class.java)
val task = KsuService.bindOrTask(
intent,
Shell.EXECUTOR,
connection,
)
val shell = KsuCli.SHELL
task?.let { it1 -> shell.execTask(it1) }
}
private fun stopKsuService() {
val intent = Intent(ksuApp, KsuService::class.java)
KsuService.stop(intent)
}
suspend fun fetchAppList() {
isRefreshing = true
val result = connectKsuService {
Log.w(TAG, "KsuService disconnected")
}
withContext(Dispatchers.IO) {
withTimeoutOrNull(TIMEOUT_MILLIS) {
while (!isPlatformAlive) {
delay(500)
}
} ?: return@withContext // Exit early if timeout
val pm = ksuApp.packageManager
val start = SystemClock.elapsedRealtime()
val binder = result.first
val allPackages = IKsuInterface.Stub.asInterface(binder).getPackages(0)
withContext(Dispatchers.Main) {
stopKsuService()
}
val packages = allPackages.list
val userManager = Platform.userManager
val packageManager = Platform.packageManager
val packages = packageManager.getInstalledPackages(0, userManager.myUserId)
apps = packages.map {
val appInfo = it.applicationInfo

View File

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

View File

@@ -0,0 +1,60 @@
package com.rifsxd.ksunext.ui.webui
import android.content.ServiceConnection
import android.util.Log
import com.dergoogler.mmrl.platform.Platform
import com.dergoogler.mmrl.platform.hiddenApi.HiddenPackageManager
import com.dergoogler.mmrl.platform.hiddenApi.HiddenUserManager
import com.dergoogler.mmrl.platform.model.IProvider
import com.dergoogler.mmrl.platform.model.PlatformIntent
import com.rifsxd.ksunext.Natives
import com.rifsxd.ksunext.ksuApp
import com.topjohnwu.superuser.ipc.RootService
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.delay
import kotlinx.coroutines.withContext
class KsuLibSuProvider : IProvider {
override val name = "KsuLibSu"
override fun isAvailable() = true
override suspend fun isAuthorized() = Natives.becomeManager(ksuApp.packageName)
private val serviceIntent
get() = PlatformIntent(
ksuApp,
Platform.KsuNext,
SuService::class.java
)
override fun bind(connection: ServiceConnection) {
RootService.bind(serviceIntent.intent, connection)
}
override fun unbind(connection: ServiceConnection) {
RootService.stop(serviceIntent.intent)
}
}
suspend fun initPlatform() = withContext(Dispatchers.IO) {
try {
val active = Platform.init {
this.context = ksuApp
this.platform = Platform.KsuNext
this.provider = from(KsuLibSuProvider())
}
while (!active) {
delay(1000)
}
return@withContext active
} catch (e: Exception) {
Log.e("KsuLibSu", "Failed to initialize platform", e)
return@withContext false
}
}
val Platform.Companion.packageManager get(): HiddenPackageManager = HiddenPackageManager(this.mService)
val Platform.Companion.userManager get(): HiddenUserManager = HiddenUserManager(this.mService)

View File

@@ -0,0 +1,14 @@
package com.rifsxd.ksunext.ui.webui
import android.content.Intent
import android.os.IBinder
import com.dergoogler.mmrl.platform.model.PlatformIntent.Companion.getPlatform
import com.dergoogler.mmrl.platform.service.ServiceManager
import com.topjohnwu.superuser.ipc.RootService
class SuService : RootService() {
override fun onBind(intent: Intent): IBinder {
val mode = intent.getPlatform()
return ServiceManager(mode)
}
}

View File

@@ -15,6 +15,8 @@ import androidx.core.view.ViewCompat
import androidx.core.view.WindowInsetsCompat
import androidx.core.view.updateLayoutParams
import androidx.webkit.WebViewAssetLoader
import com.dergoogler.mmrl.platform.model.ModId
import com.dergoogler.mmrl.webui.interfaces.WXOptions
import com.topjohnwu.superuser.Shell
import com.rifsxd.ksunext.ui.util.createRootShell
import java.io.File
@@ -41,7 +43,8 @@ class WebUIActivity : ComponentActivity() {
@Suppress("DEPRECATION")
setTaskDescription(ActivityManager.TaskDescription("KernelSU - $name"))
} else {
val taskDescription = ActivityManager.TaskDescription.Builder().setLabel("KernelSU - $name").build()
val taskDescription =
ActivityManager.TaskDescription.Builder().setLabel("KernelSU - $name").build()
setTaskDescription(taskDescription)
}
@@ -62,7 +65,7 @@ class WebUIActivity : ComponentActivity() {
val webViewClient = object : WebViewClient() {
override fun shouldInterceptRequest(
view: WebView,
request: WebResourceRequest
request: WebResourceRequest,
): WebResourceResponse? {
return webViewAssetLoader.shouldInterceptRequest(request.url)
}
@@ -82,7 +85,9 @@ class WebUIActivity : ComponentActivity() {
settings.javaScriptEnabled = true
settings.domStorageEnabled = true
settings.allowFileAccess = false
webviewInterface = WebViewInterface(this@WebUIActivity, this, moduleDir)
webviewInterface = WebViewInterface(
WXOptions(this@WebUIActivity, this, ModId(moduleId))
)
addJavascriptInterface(webviewInterface, "ksu")
setWebViewClient(webViewClient)
loadUrl("https://mui.kernelsu.org/index.html")

View File

@@ -0,0 +1,113 @@
package com.rifsxd.ksunext.ui.webui
import android.app.ActivityManager
import android.os.Build
import android.os.Bundle
import android.webkit.WebView
import androidx.activity.ComponentActivity
import androidx.activity.compose.setContent
import androidx.activity.enableEdgeToEdge
import androidx.compose.foundation.isSystemInDarkTheme
import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import androidx.compose.runtime.setValue
import androidx.lifecycle.lifecycleScope
import com.dergoogler.mmrl.platform.Platform
import com.dergoogler.mmrl.platform.model.ModId
import com.dergoogler.mmrl.ui.component.Loading
import com.dergoogler.mmrl.webui.screen.WebUIScreen
import com.dergoogler.mmrl.webui.util.rememberWebUIOptions
import com.rifsxd.ksunext.BuildConfig
import com.rifsxd.ksunext.ui.theme.KernelSUTheme
import kotlinx.coroutines.delay
import kotlinx.coroutines.launch
class WebUIXActivity : ComponentActivity() {
private lateinit var webView: WebView
private val userAgent
get(): String {
val ksuVersion = BuildConfig.VERSION_CODE
val platform = Platform.get("Unknown") {
platform.name
}
val platformVersion = Platform.get(-1) {
moduleManager.versionCode
}
val osVersion = Build.VERSION.RELEASE
val deviceModel = Build.MODEL
return "KernelSU Next/$ksuVersion (Linux; Android $osVersion; $deviceModel; $platform/$platformVersion)"
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
enableEdgeToEdge()
webView = WebView(this)
lifecycleScope.launch {
initPlatform()
}
val moduleId = intent.getStringExtra("id")!!
val name = intent.getStringExtra("name")!!
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.TIRAMISU) {
@Suppress("DEPRECATION")
setTaskDescription(ActivityManager.TaskDescription("KernelSU - $name"))
} else {
val taskDescription =
ActivityManager.TaskDescription.Builder().setLabel("KernelSU - $name").build()
setTaskDescription(taskDescription)
}
val prefs = getSharedPreferences("settings", MODE_PRIVATE)
setContent {
KernelSUTheme {
var isLoading by remember { mutableStateOf(true) }
LaunchedEffect(Platform.isAlive) {
while (!Platform.isAlive) {
delay(1000)
}
isLoading = false
}
if (isLoading) {
Loading()
return@KernelSUTheme
}
val webDebugging = prefs.getBoolean("enable_web_debugging", false)
val erudaInject = prefs.getBoolean("use_webuix_eruda", false)
val dark = isSystemInDarkTheme()
val options = rememberWebUIOptions(
modId = ModId(moduleId),
debug = webDebugging,
appVersionCode = BuildConfig.VERSION_CODE,
isDarkMode = dark,
enableEruda = erudaInject,
cls = WebUIXActivity::class.java,
userAgentString = userAgent
)
WebUIScreen(
webView = webView,
options = options,
interfaces = listOf(
WebViewInterface.factory()
)
)
}
}
}
}

View File

@@ -1,16 +1,17 @@
package com.rifsxd.ksunext.ui.webui
import android.app.Activity
import android.content.Context
import android.os.Handler
import android.os.Looper
import android.text.TextUtils
import android.view.Window
import android.webkit.JavascriptInterface
import android.webkit.WebView
import android.widget.Toast
import androidx.core.view.WindowInsetsCompat
import androidx.core.view.WindowInsetsControllerCompat
import com.dergoogler.mmrl.webui.interfaces.WXInterface
import com.dergoogler.mmrl.webui.interfaces.WXOptions
import com.dergoogler.mmrl.webui.model.JavaScriptInterface
import com.topjohnwu.superuser.CallbackList
import com.topjohnwu.superuser.ShellUtils
import com.topjohnwu.superuser.internal.UiThreadHandler
@@ -23,10 +24,15 @@ import java.io.File
import java.util.concurrent.CompletableFuture
class WebViewInterface(
val context: Context,
private val webView: WebView,
private val modDir: String
) {
wxOptions: WXOptions,
) : WXInterface(wxOptions) {
override var name: String = "ksu"
companion object {
fun factory() = JavaScriptInterface(WebViewInterface::class.java)
}
private val modDir get() = "/data/adb/modules/${modId.id}"
@JavascriptInterface
fun exec(cmd: String): String {
@@ -59,7 +65,7 @@ class WebViewInterface(
fun exec(
cmd: String,
options: String?,
callbackFunc: String
callbackFunc: String,
) {
val finalCommand = StringBuilder()
processOptions(finalCommand, options)
@@ -168,9 +174,9 @@ class WebViewInterface(
if (context is Activity) {
Handler(Looper.getMainLooper()).post {
if (enable) {
hideSystemUI(context.window)
hideSystemUI(activity.window)
} else {
showSystemUI(context.window)
showSystemUI(activity.window)
}
}
}
@@ -179,7 +185,7 @@ class WebViewInterface(
@JavascriptInterface
fun moduleInfo(): String {
val moduleInfos = JSONArray(listModules())
var currentModuleInfo = JSONObject()
val currentModuleInfo = JSONObject()
currentModuleInfo.put("moduleDir", modDir)
val moduleId = File(modDir).getName()
for (i in 0 until moduleInfos.length()) {
@@ -189,7 +195,7 @@ class WebViewInterface(
continue
}
var keys = currentInfo.keys()
val keys = currentInfo.keys()
for (key in keys) {
currentModuleInfo.put(key, currentInfo.get(key))
}
@@ -202,8 +208,12 @@ class WebViewInterface(
fun hideSystemUI(window: Window) =
WindowInsetsControllerCompat(window, window.decorView).let { controller ->
controller.hide(WindowInsetsCompat.Type.systemBars())
controller.systemBarsBehavior = WindowInsetsControllerCompat.BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE
controller.systemBarsBehavior =
WindowInsetsControllerCompat.BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE
}
fun showSystemUI(window: Window) =
WindowInsetsControllerCompat(window, window.decorView).show(WindowInsetsCompat.Type.systemBars())
WindowInsetsControllerCompat(
window,
window.decorView
).show(WindowInsetsCompat.Type.systemBars())

View File

@@ -0,0 +1,197 @@
<?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">تواصل من خلال التليجرام</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">توقيع KSU Next v2 غير موجود [ !KSU_NEXT || != size/hash ]</string>
<string name="home_failure_tip">اطلب من مطور بتهيئة KSU Next لجهازك</string>
<string name="home_kernel">اصدار Kernel</string>
<string name="enabled">مفعل</string>
<string name="disabled">معطل</string>
<string name="susfs_supported">مدعوم</string>
<string name="home_susfs">SuSFS: %s</string>
<string name="home_susfs_version">اصدار SuSFS</string>
<string name="home_susfs_sus_su">SuS SU</string>
<string name="home_android">إصدار الأندرويد</string>
<string name="home_manager_version">اصدار مدير الروت</string>
<string name="home_selinux_status">حالة SELinux</string>
<string name="selinux_status_disabled">معطل</string>
<string name="selinux_status_enforcing">مفعل</string>
<string name="selinux_status_permissive">مرن</string>
<string name="selinux_status_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">تصنيف (أ-ي)</string>
<string name="module_sort_z_to_a">تصنيف (ي-أ)</string>
<string name="uninstall">إلغاء التثبيت</string>
<string name="restore">إستعادة</string>
<string name="module_install">تثبيت</string>
<string name="install">تثبيت</string>
<string name="reboot">إعادة تشغيل</string>
<string name="settings">الإعدادات</string>
<string name="reboot_userspace">إعادة تشغيل سريعة</string>
<string name="reboot_recovery">إعادة التشغيل إلى وضع الريكفري</string>
<string name="reboot_bootloader">إعادة التشغيل إلى وضع bootloader</string>
<string name="reboot_download">إعادة التشغيل إلى وضع التنزيل</string>
<string name="reboot_edl">إعادة التشغيل إلى وضع EDL</string>
<string name="about">حول</string>
<string name="module_uninstall_confirm">هل انت متأكد من حذف تلك الإضافة %s؟</string>
<string name="module_uninstall_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_id">ID</string>
<string name="module_version_code">كود الإصدار</string>
<string name="module_update_json">UpdateJson</string>
<string name="module_update_json_empty">فارغ</string>
<string name="enable_developer_options">تفعيل خيارات المطور</string>
<string name="enable_developer_options_summary">عرض الإعدادات المخفية ومعلومات التصحيح ذات الصلة فقط للمطورين.</string>
<string name="module_overlay_fs_not_available">الإضافات غير متاحة حيث أن OverlayFS معطلة بواسطة النواة.</string>
<string name="refresh">تحديث</string>
<string name="show_system_apps">عرض تطبيقات النظام</string>
<string name="hide_system_apps">إخفاء تطبيقات النظام</string>
<string name="export_log">تصدير السجلات</string>
<string name="safe_mode">وضع الأمان</string>
<string name="reboot_to_apply">إعادة التشغيل لتطبيق التغييرات</string>
<string name="module_magisk_conflict">الإضافات غير متاحة بسبب تعارض مع Magisk!</string>
<string name="home_mount_system">نظام الإضافات</string>
<string name="home_magic_mount">Magic Mount</string>
<string name="home_overlayfs_mount">OverlayFS</string>
<string name="unavailable">غير متاح</string>
<string name="use_overlay_fs">استخدام OverlayFS</string>
<string name="use_overlay_fs_summary">التبديل بين استخدام OverlayFS أو Magic Mount لنظام Mount الخاص بـKernelSU Next.</string>
<string name="reboot_required">إعادة التشغيل مطلوبة</string>
<string name="reboot_message">ستدخل التغييرات حيز التنفيذ بعد إعادة تشغيل النظام. هل تريد إعادة التشغيل الآن؟</string>
<string name="module_restore">استعادة الإضافة</string>
<string name="module_restore_message">استعادة الإضافات من النسخة الاحتياطية الأخيرة.</string>
<string name="backup_restore">نسخ احتياطي واستعادة</string>
<string name="module_backup">نسخ احتياطي للإضافة</string>
<string name="module_backup_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">تحذير</string>
<string name="warning_message">هذه الميزة لا تزال في مرحلة البيتا وتحت التطوير. يرجى التأكد من عمل نسخة احتياطية من الإضافات الخاصة بك قبل المتابعة. استخدم هذه الميزة فقط إذا كنت تفهم المخاطر المحتملة. أكمل بحذر.</string>
<string name="proceed">تابع</string>
<string name="cancel">إلغاء</string>
<string name="later">لاحقًا</string>
<string name="home_next_kernelsu">🔥 الإصدار التالي</string>
<string name="home_next_kernelsu_repo">https://github.com/KernelSU-Next/KernelSU-Next</string>
<string name="home_next_kernelsu_body">فرع تجريبي قادم. تحقق منه على GitHub!</string>
<string name="home_experimental_kernelsu">⚠️ تجريبي!</string>
<string name="home_experimental_kernelsu_repo">127.0.0.1</string>
<string name="home_experimental_kernelsu_body">KernelSU Next هو إصدار غير رسمي دائمًا تحت التطوير التجريبي النشط. يتم تقديمه كما هو، دون ضمانات للاستقرار أو الأداء أو الموثوقية.</string>
<string name="home_experimental_kernelsu_body_point_1"> • استخدم على مسؤوليتك: قد تحدث أعطال أو سلوك غير متوقع أو مشاكل في النظام.</string>
<string name="home_experimental_kernelsu_body_point_2"> • لا ضمان: المطورون غير مسؤولين عن أي فقدان للبيانات أو تلف النظام أو عواقب أخرى ناتجة عن استخدامه.</string>
<string name="home_experimental_kernelsu_body_point_3"> • لأغراض الاختبار فقط: مخصص للمستخدمين الذين يفهمون المخاطر ويشعرون بالراحة في حل المشكلات.</string>
<string name="about_source_code"><![CDATA[عرض رمز المصدر في %1$s]]></string>
<string name="profile" translatable="false">ملف التطبيق</string>
<string name="profile_default">افتراضي</string>
<string name="profile_template">قالب</string>
<string name="profile_custom">مخصص</string>
<string name="profile_name">اسم الملف الشخصي</string>
<string name="profile_namespace">مساحة التثبيت</string>
<string name="profile_namespace_inherited">موروث</string>
<string name="profile_namespace_global">عالمي</string>
<string name="profile_namespace_individual">فردي</string>
<string name="profile_groups">المجموعات</string>
<string name="profile_capabilities">القدرات</string>
<string name="profile_selinux_context">سياق SELinux</string>
<string name="profile_umount_modules">إلغاء تثبيت الإضافات</string>
<string name="failed_to_update_app_profile">فشل في تحديث ملف التطبيق لـ %s</string>
<string name="require_kernel_version">إصدار KernelSU Next الحالي %1$d منخفض جدًا لكي يعمل المدير بشكل صحيح. يرجى الترقية إلى الإصدار %2$d أو أعلى!</string>
<string name="settings_umount_modules_default">إلغاء تثبيت الإضافات</string>
<string name="settings_umount_modules_default_summary">القيمة الافتراضية العالمية لـ "إلغاء تثبيت الإضافات" في ملف التطبيق. إذا تم تفعيلها، ستقوم بإزالة جميع التعديلات التي أجرتها الإضافات على النظام للتطبيقات التي لا تحتوي على ملف شخصي محدد.</string>
<string name="settings_susfs_toggle">إخفاء خطافات kprobe</string>
<string name="settings_susfs_toggle_summary">تعطيل خطافات kprobe التي أنشأها ksu، وبدلاً من ذلك، تفعيل الخطافات غير الكروب المدمجة، مما ينفذ نفس الوظائف التي ستطبق على نواة غير GKI، والتي لا تدعم kprobe.</string>
<string name="profile_umount_modules_summary">تفعيل هذا الخيار سيسمح لـ KernelSU Next باستعادة أي ملفات معدلة بواسطة الإضافات لهذا التطبيق.</string>
<string name="profile_selinux_domain">النطاق</string>
<string name="profile_selinux_rules">القواعد</string>
<string name="module_update">تحديث</string>
<string name="module_downloading">جارٍ تنزيل الإضافة: %s</string>
<string name="module_start_downloading">بدء التنزيل: %s</string>
<string name="new_version_available">إصدار جديد %s متاح، انقر للتحديث.</string>
<string name="launch_app">تشغيل</string>
<string name="close">إغلاق</string>
<string name="force_stop_app">إيقاف إجباري</string>
<string name="restart_app">إعادة تشغيل</string>
<string name="failed_to_update_sepolicy">فشل في تحديث قواعد SELinux لـ: %s</string>
<string name="su_not_allowed">لا يُسمح بمنح صلاحيات المستخدم الخارق لـ: %s</string>
<string name="module_changelog">سجل التغييرات</string>
<string name="settings_profile_template">قالب ملف التطبيق</string>
<string name="settings_profile_template_summary">إدارة القالب المحلي وعبر الإنترنت لملف التطبيق</string>
<string name="app_profile_template_create">إنشاء قالب</string>
<string name="app_profile_template_edit">تحرير القالب</string>
<string name="app_profile_template_id">ID</string>
<string name="app_profile_template_id_invalid">معرف القالب غير صالح</string>
<string name="app_profile_template_name">الاسم</string>
<string name="app_profile_template_description">الوصف</string>
<string name="app_profile_template_save">حفظ</string>
<string name="app_profile_template_delete">حذف</string>
<string name="app_profile_template_view">عرض القالب</string>
<string name="app_profile_template_readonly">للقراءة فقط</string>
<string name="app_profile_template_id_exist">معرف القالب موجود بالفعل!</string>
<string name="app_profile_import_export">استيراد/تصدير</string>
<string name="app_profile_import_from_clipboard">استيراد من الحافظة</string>
<string name="app_profile_export_to_clipboard">تصدير إلى الحافظة</string>
<string name="app_profile_template_export_empty">لا يمكن العثور على قالب محلي للتصدير!</string>
<string name="app_profile_template_import_success">تم الاستيراد بنجاح</string>
<string name="app_profile_template_sync">مزامنة القوالب عبر الإنترنت</string>
<string name="app_profile_template_save_failed">فشل في حفظ القالب</string>
<string name="app_profile_template_import_empty">الحافظة فارغة!</string>
<string name="module_changelog_failed">فشل في جلب سجل التغييرات: %s</string>
<string name="settings_check_update">التحقق من التحديث</string>
<string name="settings_check_update_summary">التحقق تلقائيًا من التحديثات عند فتح التطبيق.</string>
<string name="grant_root_failed">فشل في منح صلاحيات الجذر!</string>
<string name="action">إجراء</string>
<string name="open">فتح</string>
<string name="enable_web_debugging">تفعيل تصحيح WebView</string>
<string name="enable_web_debugging_summary">يمكن استخدامه لتصحيح WebUI. يرجى التفعيل فقط عند الحاجة.</string>
<string name="direct_install">التثبيت المباشر (موصى به)</string>
<string name="select_file">اختر ملفًا</string>
<string name="install_inactive_slot">التثبيت في الفتحة غير النشطة (بعد OTA)</string>
<string name="install_inactive_slot_warning">سيتم إجبار جهازك على الإقلاع إلى الفتحة غير النشطة الحالية بعد إعادة التشغيل!\nاستخدم هذا الخيار فقط بعد الانتهاء من OTA.\nهل تريد المتابعة؟</string>
<string name="install_next">التالي</string>
<string name="select_file_tip">%1$s Partition موصى به</string>
<string name="select_kmi">اختر KMI</string>
<string name="shrink_sparse_image">تقليل حجم partition المتناثرة</string>
<string name="shrink_sparse_image_message">إعادة حجم partition حيث توجد الإضافة إلى حجمها الفعلي. لاحظ أن هذا قد يتسبب في عمل الإضافة بشكل غير طبيعي، لذا يرجى استخدامه فقط عند الضرورة (مثل النسخ الاحتياطي).</string>
<string name="settings_uninstall">إلغاء التثبيت</string>
<string name="settings_uninstall_temporary">إلغاء التثبيت مؤقتًا</string>
<string name="settings_uninstall_permanent">إلغاء التثبيت نهائيًا</string>
<string name="settings_restore_stock_image">استعادة الصورة الأصلية</string>
<string name="settings_uninstall_temporary_message">إلغاء تثبيت KernelSU Next مؤقتًا، استعادة الحالة الأصلية بعد إعادة التشغيل التالية.</string>
<string name="settings_uninstall_permanent_message">إلغاء تثبيت KernelSU Next (الجذر وجميع الإضافات) بالكامل ودائمًا.</string>
<string name="settings_restore_stock_image_message">استعادة الصورة الأصلية (إذا كانت النسخة الاحتياطية موجودة)، عادة ما تستخدم قبل OTA؛ إذا كنت بحاجة إلى إلغاء تثبيت KernelSU Next، يرجى استخدام "إلغاء التثبيت نهائيًا".</string>
<string name="flashing">تثبيت</string>
<string name="flash_success">نجح التثبيت</string>
<string name="flash_failed">فشل التثبيت</string>
<string name="selected_lkm">LKM المحدد: %s</string>
<string name="save_log">حفظ السجلات</string>
<string name="log_saved">تم حفظ السجلات</string>
<string name="send_log">مشاركة السجلات</string>
<string name="settings_disable_su">تعطيل توافق su</string>
<string name="settings_disable_su_summary">تعطيل مؤقت لقدرة أي تطبيق على الحصول على صلاحيات الجذر عبر أمر su (لن تتأثر العمليات الجذرية الحالية).</string>
<string name="settings_language">اللغة</string>
</resources>

View File

@@ -0,0 +1,85 @@
<?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 || != размер/хеш ]</string>
<string name="home_failure_tip">Помолете разработчика на вашето ядро да интегрира KernelSU Next!</string>
<string name="home_kernel">Версия на ядрото</string>
<string name="enabled">Активирано</string>
<string name="disabled">Деактивирано</string>
<string name="susfs_supported">Поддържано</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">Сортиране (А-Я)</string>
<string name="module_sort_z_to_a">Сортиране (Я-А)</string>
<string name="uninstall">Деинсталиране</string>
<string name="restore">Възстановяване</string>
<string name="module_install">Инсталиране</string>
<string name="install">Инсталирай</string>
<string name="reboot">Рестартиране</string>
<string name="settings">Настройки</string>
<string name="reboot_userspace">Мек рестарт</string>
<string name="reboot_recovery">Рестарт в Recovery</string>
<string name="reboot_bootloader">Рестарт в Bootloader</string>
<string name="reboot_download">Рестарт в Download</string>
<string name="reboot_edl">Рестарт в EDL</string>
<string name="about">Относно</string>
<string name="module_uninstall_confirm">Сигурни ли сте, че искате да деинсталирате модула %s?</string>
<string name="module_uninstall_success">%s деинсталиран</string>
<string name="module_uninstall_failed">Неуспешно деинсталиране: %s</string>
<string name="module_restore_confirm">Сигурни ли сте, че искате да възстановите модула %s?</string>
<string name="module_restore_success">%s възстановен</string>
<string name="module_restore_failed">Неуспешно възстановяване: %s</string>
<string name="module_version">Версия</string>
<string name="module_author">Автор</string>
<string name="module_id">ID</string>
<string name="module_version_code">Код</string>
<string name="module_update_json">Актуализиране JSON</string>
<string name="module_update_json_empty">Празно</string>
<string name="enable_developer_options">Активиране на опции за разработчици</string>
<string name="enable_developer_options_summary">Показване на скрити настройки и дебъг информация, релевантни само за разработчици.</string>
<string name="module_overlay_fs_not_available">Модулите не са налични, тъй като OverlayFS е деактивиран от ядрото.</string>
<string name="refresh">Обновяване</string>
<string name="show_system_apps">Показване на системни приложения</string>
<string name="hide_system_apps">Скриване на системни приложения</string>
<string name="export_log">Експорт на логове</string>
<string name="safe_mode">Безопасен режим</string>
<string name="reboot_to_apply">Рестартирайте, за да влязат в сила</string>
<string name="module_magisk_conflict">Модулите не са налични поради конфликт с Magisk!</string>
<string name="home_mount_system">Модулна система</string>
<string name="home_magic_mount">Magic Mount</string>
<string name="home_overlayfs_mount">OverlayFS</string>
<string name="unavailable">Недостъпно</string>
<string name="use_overlay_fs">Използване на OverlayFS</string>
<string name="use_overlay_fs_summary">Превключване между използването на OverlayFS и Magic Mount за KernelSU Next.</string>
<string name="reboot_required">Необходим е рестарт</string>
<string name="reboot_message">Промените ще влязат в сила след рестарт. Искате ли да рестартирате сега?</string>
</resources>

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_mount_system">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 kprobes hook</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

@@ -0,0 +1,197 @@
<?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">گزارش در گیت‌هاب</string>
<string name="issue_report_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="enabled">فعال</string>
<string name="disabled">غیرفعال</string>
<string name="susfs_supported">پشتیبانی‌شده</string>
<string name="home_susfs">SuSFS: %s</string>
<string name="home_susfs_version">نسخه SuSFS</string>
<string name="home_susfs_sus_su">SuS SU</string>
<string name="home_android">نسخه اندروید</string>
<string name="home_manager_version">نسخه مدیر</string>
<string name="home_selinux_status">وضعیت SELinux</string>
<string name="selinux_status_disabled">غیرفعال</string>
<string name="selinux_status_enforcing">اجباری</string>
<string name="selinux_status_permissive">مجاز</string>
<string name="selinux_status_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">مرتب‌سازی (الف-ی)</string>
<string name="module_sort_z_to_a">مرتب‌سازی (ی-الف)</string>
<string name="uninstall">حذف نصب</string>
<string name="restore">بازیابی</string>
<string name="module_install">نصب</string>
<string name="install">نصب</string>
<string name="reboot">راه‌اندازی مجدد</string>
<string name="settings">تنظیمات</string>
<string name="reboot_userspace">راه‌اندازی نرم</string>
<string name="reboot_recovery">راه‌اندازی به حالت ریکاوری</string>
<string name="reboot_bootloader">راه‌اندازی به حالت بوت‌لودر</string>
<string name="reboot_download">راه‌اندازی به حالت دانلود</string>
<string name="reboot_edl">راه‌اندازی به حالت EDL</string>
<string name="about">درباره</string>
<string name="module_uninstall_confirm">آیا مطمئن هستید که می‌خواهید ماژول %s را حذف کنید؟</string>
<string name="module_uninstall_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_id">شناسه</string>
<string name="module_version_code">کد نسخه</string>
<string name="module_update_json">به‌روزرسانی JSON</string>
<string name="module_update_json_empty">خالی</string>
<string name="enable_developer_options">فعال‌سازی گزینه‌های توسعه‌دهنده</string>
<string name="enable_developer_options_summary">نمایش تنظیمات مخفی و اطلاعات اشکال‌زدایی که فقط برای توسعه‌دهندگان مفید است.</string>
<string name="module_overlay_fs_not_available">ماژول‌ها به دلیل غیرفعال بودن OverlayFS توسط هسته در دسترس نیستند.</string>
<string name="refresh">تازه‌سازی</string>
<string name="show_system_apps">نمایش برنامه‌های سیستمی</string>
<string name="hide_system_apps">پنهان کردن برنامه‌های سیستمی</string>
<string name="export_log">صدور گزارش‌ها</string>
<string name="safe_mode">حالت ایمن</string>
<string name="reboot_to_apply">برای اعمال تغییرات راه‌اندازی مجدد کنید</string>
<string name="module_magisk_conflict">ماژول‌ها به دلیل تداخل با Magisk در دسترس نیستند!</string>
<string name="home_mount_system">نصب سیستم</string>
<string name="home_magic_mount">نصب جادویی</string>
<string name="home_overlayfs_mount">OverlayFS</string>
<string name="unavailable">در دسترس نیست</string>
<string name="use_overlay_fs">استفاده از OverlayFS</string>
<string name="use_overlay_fs_summary">تغییر بین استفاده از OverlayFS و نصب جادویی برای سیستم نصب KernelSU Next.</string>
<string name="reboot_required">نیاز به راه‌اندازی مجدد</string>
<string name="reboot_message">تغییرات پس از راه‌اندازی مجدد سیستم اعمال می‌شوند. آیا می‌خواهید اکنون راه‌اندازی کنید؟</string>
<string name="module_restore">بازیابی ماژول</string>
<string name="module_restore_message">بازیابی ماژول‌ها از آخرین نسخه پشتیبان.</string>
<string name="backup_restore">پشتیبان‌گیری و بازیابی</string>
<string name="module_backup">پشتیبان‌گیری از ماژول</string>
<string name="module_backup_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">هشدار</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">شاخه آزمایشی بعدی. آن را در گیت‌هاب بررسی کنید!</string>
<string name="home_experimental_kernelsu">⚠️ هشدار توسعه آزمایشی!</string>
<string name="home_experimental_kernelsu_repo">127.0.0.1</string>
<string name="home_experimental_kernelsu_body">KernelSU Next نسخه‌ای غیررسمی است که همیشه در حال توسعه آزمایشی فعال است. این نسخه همان‌گونه که هست ارائه می‌شود، بدون تضمین پایداری، عملکرد یا قابلیت اطمینان.</string>
<string name="home_experimental_kernelsu_body_point_1"> • استفاده با مسئولیت خودتان: ممکن است با خرابی، رفتار غیرمنتظره یا مشکلات سیستمی مواجه شوید.</string>
<string name="home_experimental_kernelsu_body_point_2"> • بدون گارانتی: توسعه‌دهندگان مسئول هیچ‌گونه از دست دادن داده، آسیب به سیستم یا سایر پیامدها نیستند.</string>
<string name="home_experimental_kernelsu_body_point_3"> • فقط برای آزمایش: برای کاربرانی که خطرات را درک کرده و با عیب‌یابی راحت هستند.</string>
<string name="about_source_code"><![CDATA[مشاهده کد منبع در %1$s]]></string>
<string name="profile" translatable="false">پروفایل برنامه</string>
<string name="profile_default">پیش‌فرض</string>
<string name="profile_template">الگو</string>
<string name="profile_custom">سفارشی</string>
<string name="profile_name">نام پروفایل</string>
<string name="profile_namespace">فضای نصب</string>
<string name="profile_namespace_inherited">ارثی</string>
<string name="profile_namespace_global">جهانی</string>
<string name="profile_namespace_individual">فردی</string>
<string name="profile_groups">گروه‌ها</string>
<string name="profile_capabilities">قابلیت‌ها</string>
<string name="profile_selinux_context">زمینه SELinux</string>
<string name="profile_umount_modules">حذف ماژول‌ها</string>
<string name="failed_to_update_app_profile">به‌روزرسانی پروفایل برنامه برای %s شکست خورد</string>
<string name="require_kernel_version">نسخه کنونی KernelSU Next %1$d برای عملکرد صحیح مدیر بسیار پایین است. لطفاً به نسخه %2$d یا بالاتر ارتقا دهید!</string>
<string name="settings_umount_modules_default">حذف پیش‌فرض ماژول‌ها</string>
<string name="settings_umount_modules_default_summary">مقدار پیش‌فرض جهانی برای «حذف ماژول‌ها» در پروفایل برنامه. اگر فعال باشد، تمام تغییرات سیستمی ماژول‌ها برای برنامه‌هایی که پروفایل ندارند حذف می‌شود.</string>
<string name="settings_susfs_toggle">مخفی کردن قلاب‌های kprobe</string>
<string name="settings_susfs_toggle_summary">این گزینه قلاب‌های kprobe ایجادشده توسط ksu را غیرفعال کرده و به‌جای آن، قلاب‌های غیر kprobe داخلی را فعال می‌کند که همان عملکرد را برای هسته‌های غیر GKI که از kprobe پشتیبانی نمی‌کنند، پیاده‌سازی می‌کند.</string>
<string name="profile_umount_modules_summary">فعال کردن این گزینه به KernelSU Next اجازه می‌دهد فایل‌های تغییر یافته توسط ماژول‌ها را برای این برنامه بازیابی کند.</string>
<string name="profile_selinux_domain">دامنه</string>
<string name="profile_selinux_rules">قوانین</string>
<string name="module_update">به‌روزرسانی</string>
<string name="module_downloading">در حال دانلود ماژول: %s</string>
<string name="module_start_downloading">شروع دانلود: %s</string>
<string name="new_version_available">نسخه جدید %s در دسترس است، برای ارتقا کلیک کنید.</string>
<string name="launch_app">اجرا</string>
<string name="close">بستن</string>
<string name="force_stop_app">توقف اجباری</string>
<string name="restart_app">راه‌اندازی مجدد</string>
<string name="failed_to_update_sepolicy">به‌روزرسانی قوانین SELinux برای %s شکست خورد</string>
<string name="su_not_allowed">اعطای دسترسی ویژه برای %s مجاز نیست</string>
<string name="module_changelog">تغییرات</string>
<string name="settings_profile_template">الگوی پروفایل برنامه</string>
<string name="settings_profile_template_summary">مدیریت الگوهای محلی و آنلاین پروفایل برنامه</string>
<string name="app_profile_template_create">ایجاد الگو</string>
<string name="app_profile_template_edit">ویرایش الگو</string>
<string name="app_profile_template_id">شناسه</string>
<string name="app_profile_template_id_invalid">شناسه الگو نامعتبر است</string>
<string name="app_profile_template_name">نام</string>
<string name="app_profile_template_description">توضیحات</string>
<string name="app_profile_template_save">ذخیره</string>
<string name="app_profile_template_delete">حذف</string>
<string name="app_profile_template_view">مشاهده الگو</string>
<string name="app_profile_template_readonly">فقط خواندنی</string>
<string name="app_profile_template_id_exist">شناسه الگو قبلاً وجود دارد!</string>
<string name="app_profile_import_export">واردات/صادرات</string>
<string name="app_profile_import_from_clipboard">واردات از کلیپ‌بورد</string>
<string name="app_profile_export_to_clipboard">صادرات به کلیپ‌بورد</string>
<string name="app_profile_template_export_empty">هیچ الگوی محلی برای صادرات یافت نشد!</string>
<string name="app_profile_template_import_success">با موفقیت وارد شد</string>
<string name="app_profile_template_sync">همگام‌سازی الگوهای آنلاین</string>
<string name="app_profile_template_save_failed">ذخیره الگو شکست خورد</string>
<string name="app_profile_template_import_empty">کلیپ‌بورد خالی است!</string>
<string name="module_changelog_failed">دریافت تغییرات شکست خورد: %s</string>
<string name="settings_check_update">بررسی به‌روزرسانی</string>
<string name="settings_check_update_summary">بررسی خودکار به‌روزرسانی‌ها هنگام باز کردن برنامه.</string>
<string name="grant_root_failed">اعطای دسترسی ریشه شکست خورد!</string>
<string name="action">اقدام</string>
<string name="open">باز کردن</string>
<string name="enable_web_debugging">فعال‌سازی اشکال‌زدایی وب‌ویو</string>
<string name="enable_web_debugging_summary">می‌تواند برای اشکال‌زدایی رابط وب استفاده شود. لطفاً فقط در صورت نیاز فعال کنید.</string>
<string name="direct_install">نصب مستقیم (توصیه‌شده)</string>
<string name="select_file">انتخاب فایل</string>
<string name="install_inactive_slot">نصب در اسلات غیرفعال (پس از OTA)</string>
<string name="install_inactive_slot_warning">دستگاه شما پس از راه‌اندازی مجدد **اجباراً** به اسلات غیرفعال کنونی بوت خواهد شد!\nفقط پس از انجام OTA از این گزینه استفاده کنید.\nادامه می‌دهید؟</string>
<string name="install_next">بعدی</string>
<string name="select_file_tip">تصویر پارتیشن %1$s توصیه می‌شود</string>
<string name="select_kmi">انتخاب KMI</string>
<string name="shrink_sparse_image">کاهش اندازه تصویر پراکنده</string>
<string name="shrink_sparse_image_message">تغییر اندازه تصویر پراکنده‌ای که ماژول در آن قرار دارد به اندازه واقعی آن. توجه داشته باشید که این ممکن است باعث عملکرد غیرعادی ماژول شود، بنابراین فقط در صورت نیاز (مانند پشتیبان‌گیری) استفاده کنید.</string>
<string name="settings_uninstall">حذف نصب</string>
<string name="settings_uninstall_temporary">حذف نصب موقت</string>
<string name="settings_uninstall_permanent">حذف نصب دائمی</string>
<string name="settings_restore_stock_image">بازیابی تصویر اصلی</string>
<string name="settings_uninstall_temporary_message">حذف موقت KernelSU Next، بازگشت به حالت اولیه پس از راه‌اندازی بعدی.</string>
<string name="settings_uninstall_permanent_message">حذف کامل و دائمی KernelSU Next (ریشه و همه ماژول‌ها).</string>
<string name="settings_restore_stock_image_message">بازیابی تصویر کارخانه‌ای (در صورت وجود نسخه پشتیبان)، معمولاً قبل از OTA استفاده می‌شود؛ اگر نیاز به حذف KernelSU Next دارید، لطفاً از «حذف نصب دائمی» استفاده کنید.</string>
<string name="flashing">در حال فلش</string>
<string name="flash_success">فلش موفق</string>
<string name="flash_failed">فلش ناموفق</string>
<string name="selected_lkm">LKM انتخاب‌شده: %s</string>
<string name="save_log">ذخیره گزارش‌ها</string>
<string name="log_saved">گزارش‌ها ذخیره شدند</string>
<string name="send_log">اشتراک گزارش‌ها</string>
<string name="settings_disable_su">غیرفعال کردن سازگاری su</string>
<string name="settings_disable_su_summary">غیرفعال کردن موقت توانایی هر برنامه برای کسب دسترسی ریشه از طریق دستور su (فرآیندهای ریشه موجود تحت تأثیر قرار نمی‌گیرند).</string>
<string name="settings_language">زبان</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_github">Signaler sur GitHub</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="confirm">Confirmer</string>
<string name="app_name" translatable="false">KernelSU Next</string>
@@ -26,10 +26,10 @@
<string name="home_manager_version">Version du manager</string>
<string name="home_selinux_status">Statut SELinux</string>
<string name="selinux_status_disabled">Désactivé</string>
<string name="selinux_status_enforcing">En vigueur</string>
<string name="selinux_status_enforcing">Appliqué</string>
<string name="selinux_status_permissive">Permissif</string>
<string name="selinux_status_unknown">Inconnu</string>
<string name="superuser">SuperUtilisateur</string>
<string name="superuser">Super Utilisateur</string>
<string name="module_failed_to_enable">Échec de l\'activation du module: %s</string>
<string name="module_failed_to_disable">Échec de la désactivation du module: %s</string>
<string name="module_empty">Aucun module installé</string>
@@ -43,10 +43,10 @@
<string name="install">Installer</string>
<string name="reboot">Redémarrer</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_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 en mode téléchargement</string>
<string name="reboot_edl">Redémarrer en mode EDL</string>
<string name="about">À propos</string>
<string name="module_uninstall_confirm">Êtes-vous sûr de vouloir désinstaller le module %s?</string>
@@ -54,36 +54,43 @@
<string name="module_uninstall_failed">Échec de la désinstallation: %s</string>
<string name="module_restore_confirm">Êtes-vous sûr de vouloir restaurer le module %s?</string>
<string name="module_restore_success">%s a été restauré</string>
<string name="module_restore_failed">Échec de la restauration: %s</string>
<string name="module_restore_failed">Échec de la restoration: %s</string>
<string name="module_version">Version</string>
<string name="module_author">Auteur</string>
<string name="enable_developer_options">Activer les options pour les développeurs</string>
<string name="enable_developer_options_summary">Afficher des paramètres cachés et des information de débogage seulement utiles pour les développeurs.</string>
<string name="module_overlay_fs_not_available">Les modules sont indisponibles car OverlayFS est désactivé par le kernel.</string>
<string name="refresh">Rafraîchir</string>
<string name="show_system_apps">Montrer les apps système</string>
<string name="hide_system_apps">Cacher les apps système</string>
<string name="export_log">Exporter les logs</string>
<string name="safe_mode">Mode sécurité</string>
<string name="safe_mode">Mode sécurisé</string>
<string name="reboot_to_apply">Redémarrer pour appliquer les changements</string>
<string name="module_magisk_conflict">Les modules sont indisponibles en raison d\'un conflit avec Magisk!</string>
<string name="home_module_mount">Module système</string>
<string name="home_mount_system">Système de module</string>
<string name="home_magic_mount">Magic Mount</string>
<string name="home_overlayfs_mount">OverlayFS</string>
<string name="unavailable">Indisponible</string>
<string name="use_overlay_fs">Utiliser OverlayFS (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="reboot_required">Redémarrage requis</string>
<string name="reboot_message">Les changements ne seront effectifs qu\'après un redémarrage. Voulez-vous redémarrer maintenant?</string>
<string name="module_restore">Restaurer des modules</string>
<string name="module_restore_message">Restaurer des modules depuis une sauvegarde récente</string>
<string name="backup_restore">Sauvegarde et restoration</string>
<string name="module_backup">Sauvegarder les modules</string>
<string name="module_backup_message">Sauvegarder les modules installés</string>
<string name="allowlist_restore">Restorer la liste d\'autorisation</string>
<string name="allowlist_restore_message">Restorer la liste d\'autorisation depuis une sauvegarde récente ?</string>
<string name="allowlist_backup">Sauvegarder la liste d\'autorisation</string>
<string name="allowlist_backup_message">Sauvegarder la liste d\'autorisation actuelle ?</string>
<string name="warning">Avertissement</string>
<string name="warning_message">Cette fonctionnalité est encore en version bêta et en cours de développement. Veuillez sauvegarder vos modules avant de continuer. Utilisez cette fonctionnalité uniquement si vous comprenez les risques potentiels. Procédez avec prudence.</string>
<string name="proceed">Continuer</string>
<string name="cancel">Annuler</string>
<string name="later">Plus tard</string>
<string name="home_next_kernelsu">🔥 Next build</string>
<string name="home_next_kernelsu_repo">https://github.com/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_experimental_kernelsu">⚠️ Attention, développement expérimental!</string>
<string name="home_experimental_kernelsu_repo">127.0.0.1</string>
@@ -91,7 +98,7 @@
<string name="home_experimental_kernelsu_body_point_1"> • Soyez donc en connaissance des risques : vous pourriez faire face à des crashs, des réactions inattendues ou encore des erreurs système.</string>
<string name="home_experimental_kernelsu_body_point_2"> • Aucune garantie : Les développeurs ne seront tenus responsables d\'aucune perte de données, de dégâts au système ou d\'autres conséquences résultant de l\'utilisation de KernelSU Next.</string>
<string name="home_experimental_kernelsu_body_point_3"> • Uniquement à but de tests : KernelSU Next est prévue pour des utilisateurs avertis, qui comprennent les risques et qui sont à l\'aise avec le fait de localiser un problème.</string>
<string name="about_source_code"><![CDATA[View source code at %1$s]]></string>
<string name="about_source_code"><![CDATA[Voir le code source sur %1$s]]></string>
<string name="profile" translatable="false">Profil d\'application</string>
<string name="profile_default">Par défaut</string>
<string name="profile_template">Modèle</string>
@@ -106,12 +113,12 @@
<string name="profile_selinux_context">Contexte SELinux</string>
<string name="profile_umount_modules">Démonter les modules</string>
<string name="failed_to_update_app_profile">Échec de la mise à jour du profil d\'application pour %s</string>
<string name="require_kernel_version">La version actuelle de KernelSU next %1$d Est trop ancienne pour que le gestionnaire fonctionne correctement. Merci de mettre à jour vers la version %2$d ou supérieur!</string>
<string name="require_kernel_version">La version actuelle de KernelSU Next %1$d Est trop ancienne pour que le gestionnaire fonctionne correctement. Merci de mettre à jour vers la version %2$d ou supérieur!</string>
<string name="settings_umount_modules_default">Démonter les modules par défaut</string>
<string name="settings_umount_modules_default_summary">Valeur globale par défaut pour \"Démonter les modules\" Dans le profil d\'application. Si activé, toutes les modifications systèmes effectuées par des modules seront annulées pour les applications n\'ayant pas de profil sélectionné.</string>
<string name="settings_susfs_toggle">Cacher les hooks kprobe</string>
<string name="settings_susfs_toggle_summary">Désactive les hooks kprobe créés par KSU et, à la place, active les hooks non-kprobe intégrés, implémentant les mêmes fonctionnalités qui seraient appliquées à un kernel non-GKI, qui ne supportent krpobe.</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="settings_susfs_toggle_summary">Désactive les hooks kprobe créés par KSU et, à la place, active les hooks non-kprobe intégrés, implémentant les mêmes fonctionnalités qui seraient appliquées à un kernel non-GKI, qui ne supportent pas les kprobes.</string>
<string name="profile_umount_modules_summary">Activer cette option permettra à KernelSU Next de restaurer n\'importe quel fichier modifié par les modules pour cette application.</string>
<string name="profile_selinux_domain">Domaine</string>
<string name="profile_selinux_rules">Règles</string>
<string name="module_update">Mise à jour</string>
@@ -151,8 +158,8 @@
<string name="grant_root_failed">Échec de l\'accord du statut root!</string>
<string name="action">Action</string>
<string name="open">Ouvrir</string>
<string name="enable_web_debugging">Activer le débuggage 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">Activer le débogage de WebView</string>
<string name="enable_web_debugging_summary">Peut être utilisé pour déboguer la WebUI. Merci de ne l\'activer qu\'en cas de nécéssité.</string>
<string name="direct_install">Installation directe (recommandé)</string>
<string name="select_file">Sélectionner un fichier</string>
<string name="install_inactive_slot">Installer sur un slot inactif (après OTA)</string>
@@ -161,12 +168,12 @@
<string name="select_file_tip">%1$s Partitionner l\'image est recommandé.</string>
<string name="select_kmi">Sélectionner le KMI</string>
<string name="shrink_sparse_image">Minimiser l\'espace disponible réservé</string>
<string name="shrink_sparse_image_message">Redimensionne l\'image où se trouve le module à sa taille réelle. Notez que cela peut entraîner un fonctionnement anormal 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_temporary">Désinstaller temporairement</string>
<string name="settings_uninstall_permanent">Désinstaller de façon permanente</string>
<string name="settings_restore_stock_image">Restaurer l\'image stock</string>
<string name="settings_uninstall_temporary_message">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_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>
@@ -176,4 +183,6 @@
<string name="save_log">Enregistrer les logs</string>
<string name="log_saved">Logs Enregistrés</string>
<string name="send_log">Partager les logs</string>
<string name="settings_disable_su">Désactiver la compatibilité su</string>
<string name="settings_disable_su_summary">Désactive temporairement la possibilité d\'obtenir les permissions root en utilisant la commande su pour toutes les application (les processus root actifs ne seront pas affectés).</string>
</resources>

View File

@@ -0,0 +1,197 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="issue_report_title">Problémája van?</string>
<string name="issue_report_body">Hibát észlelt, vagy van visszajelzése?</string>
<string name="issue_report_body_2">Jelentse mielőbb!</string>
<string name="issue_report_github">Report on GitHub</string>
<string name="issue_report_telegram">Kapcsolatfelvétel Telegramon keresztül</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">Megerősítés</string>
<string name="app_name" translatable="false">KernelSU Next</string>
<string name="home">Kezdőlap</string>
<string name="home_not_installed">Nincs telepítve</string>
<string name="home_click_to_install">Kattintson a telepítéshez</string>
<string name="home_working">Működik</string>
<string name="home_working_version">Verzió: %d</string>
<string name="home_superuser_count">Superuserek: %d</string>
<string name="home_module_count">Modulok: %d</string>
<string name="home_failure">KernelSU Next v2 aláírás nem található a kernelben! [ !KSU_NEXT || != size/hash ]</string>
<string name="home_failure_tip">Kérje meg kernel fejlesztőjét, hogy integrálja a KernelSU Next-et!</string>
<string name="home_kernel">Kernel verzió</string>
<string name="enabled">Bekapcsolva</string>
<string name="disabled">Kikapcsolva</string>
<string name="susfs_supported">Támogatott</string>
<string name="home_susfs">SuSFS: %s</string>
<string name="home_susfs_version">SuSFS verzió</string>
<string name="home_susfs_sus_su">SuS SU</string>
<string name="home_android">Android verzió</string>
<string name="home_manager_version">Manager verzió</string>
<string name="home_selinux_status">SELinux státusz</string>
<string name="selinux_status_disabled">Letiltva</string>
<string name="selinux_status_enforcing">Kényszerítve</string>
<string name="selinux_status_permissive">Megengedő</string>
<string name="selinux_status_unknown">Ismeretlen</string>
<string name="superuser">Superuser</string>
<string name="module_failed_to_enable">Nem sikerült bekapcsolni a(z) %s modult</string>
<string name="module_failed_to_disable">Nem sikerült kikapcsolni a(z) %s modult</string>
<string name="module_empty">Nincs telepített modul</string>
<string name="module">Modul</string>
<string name="module_install_prompt_with_name">A következő modul(ok) lesznek telepítve: %1$s</string>
<string name="module_sort_a_to_z">Rendezés (A-Z)</string>
<string name="module_sort_z_to_a">Rendezés (Z-A)</string>
<string name="uninstall">Eltávolítás</string>
<string name="restore">Visszaállítás</string>
<string name="module_install">Telepítés</string>
<string name="install">Telepítés</string>
<string name="reboot">Újraindítás</string>
<string name="settings">Beállítások</string>
<string name="reboot_userspace">Lágy újraindítás</string>
<string name="reboot_recovery">Újraindítás Recovery módba</string>
<string name="reboot_bootloader">Újraindítás Bootloader módba</string>
<string name="reboot_download">Újraindítás Download módba</string>
<string name="reboot_edl">Újraindítás EDL módba</string>
<string name="about">Információ</string>
<string name="module_uninstall_confirm">Biztosan eltávolítja a(z) %s modult?</string>
<string name="module_uninstall_success">%s eltávolítva</string>
<string name="module_uninstall_failed">Nem sikerült eltávolítani az %s modult</string>
<string name="module_restore_confirm">Biztosan vissza szeretné állítan a(z) %s modult?</string>
<string name="module_restore_success">%s visszaállítva</string>
<string name="module_restore_failed">Nem sikerült visszaállítani a(z) %s modult</string>
<string name="module_version">Verzió</string>
<string name="module_author">Készítő</string>
<string name="module_id">Azonosító</string>
<string name="module_version_code">Kód</string>
<string name="module_update_json">UpdateJson</string>
<string name="module_update_json_empty">Üres</string>
<string name="enable_developer_options">Engedélyezze a fejlesztői beállításokat</string>
<string name="enable_developer_options_summary">Csak a fejlesztők számára releváns rejtett beállítások és hibakeresési információk megjelenítése.</string>
<string name="module_overlay_fs_not_available">A modulok nem érhetők el, mert az OverlayFS-t a kernel letiltotta.</string>
<string name="refresh">Frissítés</string>
<string name="show_system_apps">Rendszeralkalmazások megjelenítése</string>
<string name="hide_system_apps">Rendszeralkalmazások elrejtése</string>
<string name="export_log">Naplók exportálása</string>
<string name="safe_mode">Biztonságos mód</string>
<string name="reboot_to_apply">Indítsa újra a változtatások érvénybe lépéséhez</string>
<string name="module_magisk_conflict">A modulok a Magiskkel való konfliktus miatt nem érhetők el!</string>
<string name="home_mount_system">Csatolási rendszer</string>
<string name="home_magic_mount">Magic Mount</string>
<string name="home_overlayfs_mount">OverlayFS</string>
<string name="unavailable">Nem elérhető</string>
<string name="use_overlay_fs">Használja az OverlayFS-t</string>
<string name="use_overlay_fs_summary">Váltás az OverlayFS és a Magic Mount módszerek között a KernelSU Next csatolási rendszerében.</string>
<string name="reboot_required">Újraindítás szükséges</string>
<string name="reboot_message">A változtatások a rendszer újraindítása után lépnek életbe. Szeretné most újraindítani?</string>
<string name="module_restore">Modul visszaállítása</string>
<string name="module_restore_message">Modulok visszaállítása biztonsági mentésből</string>
<string name="backup_restore">Mentés &amp; Visszaállítás</string>
<string name="module_backup">Modul biztonsági mentése</string>
<string name="module_backup_message">Biztonsági mentés a jelenleg telepített modulokról.</string>
<string name="allowlist_restore">Engedélyezőlista visszaállítása</string>
<string name="allowlist_restore_message">Engedélyezőlista visszaállítása biztonsági mentésből.</string>
<string name="allowlist_backup">Az engedélyezési lista biztonsági mentése</string>
<string name="allowlist_backup_message">A jelenleg konfigurált engedélyezési lista biztonsági mentése.</string>
<string name="warning">Figyelem</string>
<string name="warning_message">Ez a funkció még béta állapotban van, és fejlesztés alatt áll. Kérjük, a folytatás előtt készítsen biztonsági másolatot a modulokról. Csak akkor használja ezt a funkciót, ha tisztában van a lehetséges kockázatokkal. Óvatosan járjon el.</string>
<string name="proceed">Folytatás</string>
<string name="cancel">Mégse</string>
<string name="later">Később</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 kísérleti branch. Nézze meg a GitHubon!</string>
<string name="home_experimental_kernelsu">⚠️ Figyelmeztetés kísérleti fejlesztésre!</string>
<string name="home_experimental_kernelsu_repo">127.0.0.1</string>
<string name="home_experimental_kernelsu_body">A KernelSU Next egy nem hivatalos verzió, amely folyamatosan kísérleti fejlesztés alatt áll. Az alkalmazás \"ahogy most van\", úgy kerül biztosításra, stabilitás, teljesítmény vagy megbízhatóság tekintetében semmilyen garancia nélkül.</string>
<string name="home_experimental_kernelsu_body_point_1">• Saját felelősségre használja: összeomlások, váratlan viselkedés vagy rendszerproblémák fordulhatnak elő.</string>
<string name="home_experimental_kernelsu_body_point_2">• Nincs garancia: a fejlesztők nem vállalnak felelősséget a használatából eredő adatvesztésért, rendszerkárosodásért vagy egyéb következményekért.</string>
<string name="home_experimental_kernelsu_body_point_3">• Csak tesztelési célokra: azoknak a felhasználóknak készült, akik megértik a kockázatokat, és jártasak a hibaelhárításban.</string>
<string name="about_source_code"><![CDATA[Tekintse meg a forráskódot: %1$s]]></string>
<string name="profile" translatable="false">App Profil</string>
<string name="profile_default">Alapértelmezett</string>
<string name="profile_template">Sablon</string>
<string name="profile_custom">Egyedi</string>
<string name="profile_name">Profil neve</string>
<string name="profile_namespace">Csatolási névtér</string>
<string name="profile_namespace_inherited">Örökölt</string>
<string name="profile_namespace_global">Globális</string>
<string name="profile_namespace_individual">Egyedi</string>
<string name="profile_groups">Csoportok</string>
<string name="profile_capabilities">Adottságok</string>
<string name="profile_selinux_context">SELinux környezet</string>
<string name="profile_umount_modules">Modulok lecsatolása</string>
<string name="failed_to_update_app_profile">Nem sikerült frissíteni a(z) %s alkalmazásprofilját</string>
<string name="require_kernel_version">A jelenlegi KernelSU Next verzió (%1$d) túl alacsony ahhoz, hogy a kezelő megfelelően működjön. Kérjük, frissítsen a(z) %2$d vagy újabb verzióra!</string>
<string name="settings_umount_modules_default">Modulok lecsatolása</string>
<string name="settings_umount_modules_default_summary">A „Modulok lecsatolása” globális alapértelmezett értéke az alkalmazásprofilban. Ha engedélyezve van, eltávolítja a rendszer összes modul-módosítását az olyan alkalmazások esetében, amelyekhez nincs beállítva profil.</string>
<string name="settings_susfs_toggle">A kprobe hook-ok elrejtése</string>
<string name="settings_susfs_toggle_summary">Ez az opció letiltja a ksu által létrehozott kprobe hook-okat, és ehelyett aktiválja a beágyazott, nem kprobe hook-okat, megvalósítva ugyanazt a funkcionalitást, amelyet egy nem GKI kernel esetében alkalmaznának, amely nem támogatja a kprobe-ot.</string>
<string name="profile_umount_modules_summary">Az opció engedélyezése lehetővé teszi, hogy a KernelSU Next visszaállítsa az alkalmazás moduljai által módosított fájlokat.</string>
<string name="profile_selinux_domain">Domain</string>
<string name="profile_selinux_rules">Szabályok</string>
<string name="module_update">Frissítés</string>
<string name="module_downloading">%s modul letöltése</string>
<string name="module_start_downloading">Letöltés indítása: %s</string>
<string name="new_version_available">Új verzió (%s) elérhető, kattintson a frissítéshez.</string>
<string name="launch_app">Indítás</string>
<string name="close">Bezár</string>
<string name="force_stop_app">Kényszer leállítás</string>
<string name="restart_app">Újraindítás</string>
<string name="failed_to_update_sepolicy">Nem sikerült frissíteni a SELinux szabályait a következőhöz: %s</string>
<string name="su_not_allowed">Superuser megadása nem engedélyezett a következőhöz: %s</string>
<string name="module_changelog">Változásnapló</string>
<string name="settings_profile_template">Alkalmazásprofil sablon</string>
<string name="settings_profile_template_summary">Az alkalmazásprofil helyi és online sablonjának kezelése</string>
<string name="app_profile_template_create">Sablon létrehozása</string>
<string name="app_profile_template_edit">Sablon szerkesztése</string>
<string name="app_profile_template_id">Azonosító</string>
<string name="app_profile_template_id_invalid">Érvénytelen sablonazonosító</string>
<string name="app_profile_template_name">Név</string>
<string name="app_profile_template_description">Leírás</string>
<string name="app_profile_template_save">Mentés</string>
<string name="app_profile_template_delete">Törlés</string>
<string name="app_profile_template_view">Sablon megtekintése</string>
<string name="app_profile_template_readonly">Csak olvasható</string>
<string name="app_profile_template_id_exist">A sablonazonosító már létezik!</string>
<string name="app_profile_import_export">Importálás/Exportálás</string>
<string name="app_profile_import_from_clipboard">Importálás a vágólapról</string>
<string name="app_profile_export_to_clipboard">Exportálás vágólapra</string>
<string name="app_profile_template_export_empty">Nem található az exportálandó helyi sablon!</string>
<string name="app_profile_template_import_success">Sikeresen importálva</string>
<string name="app_profile_template_sync">Online sablonok szinkronizálása</string>
<string name="app_profile_template_save_failed">Nem sikerült menteni a sablont</string>
<string name="app_profile_template_import_empty">A vágólap üres!</string>
<string name="module_changelog_failed">A változásnapló lekérése nem sikerült: %s</string>
<string name="settings_check_update">Ellenőrizze a frissítéseket</string>
<string name="settings_check_update_summary">Az alkalmazás megnyitásakor automatikusan ellenőrizze a frissítéseket.</string>
<string name="grant_root_failed">Nem sikerült a root jog megadása!</string>
<string name="action">Tevékenység</string>
<string name="open">Megnyitás</string>
<string name="enable_web_debugging">WebView hibakeresés engedélyezése</string>
<string name="enable_web_debugging_summary">A WebUI hibakeresésére. Kérjük, csak akkor engedélyezze, ha szükséges.</string>
<string name="direct_install">Közvetlen telepítés (ajánlott)</string>
<string name="select_file">Fájl kiválasztása a patcheléshez</string>
<string name="install_inactive_slot">Telepítés inaktív slotba (OTA után)</string>
<string name="install_inactive_slot_warning">Eszköze újraindítás után **KÉNYSZERÍTVE** lesz, hogy a jelenleg inaktív slotból induljon el! Ezt az opciót csak az OTA befejezése után használja. Folytatja?</string>
<string name="install_next">Következő</string>
<string name="select_file_tip">%1$s partíciókép javasolt</string>
<string name="select_kmi">Válassza ki a megfelelő KMI-t</string>
<string name="shrink_sparse_image">Sparse image minimalizálása</string>
<string name="shrink_sparse_image_message">Méretezze át a sparse imaget, ahol a modul található, a tényleges méretre. Vegye figyelembe, hogy ez a modul rendellenes működését okozhatja, ezért kérjük, csak akkor használja, ha szükséges (például biztonsági mentéshez).</string>
<string name="settings_uninstall">Eltávolítás</string>
<string name="settings_uninstall_temporary">Ideiglenes eltávolítás</string>
<string name="settings_uninstall_permanent">Végleges eltávolítás</string>
<string name="settings_restore_stock_image">Gyári képfájl visszaállítása</string>
<string name="settings_uninstall_temporary_message">A KernelSU ideiglenes eltávolítása, a következő újraindítás után állítsa vissza az eredeti állapotot.</string>
<string name="settings_uninstall_permanent_message">A KernelSU Next (Root és az összes modul) teljes és végleges eltávolítása.</string>
<string name="settings_restore_stock_image_message">Állítsa vissza a gyári készletképet (ha létezik biztonsági másolat), amelyet általában az OTA előtt használnak; Ha el kell távolítania a KernelSU Next-t, használja a „Végleges eltávolítás” lehetőséget.</string>
<string name="flashing">Telepítés</string>
<string name="flash_success">Sikeres telepítés</string>
<string name="flash_failed">A telepítés nem sikerült</string>
<string name="selected_lkm">A kiválasztott LKM: %s</string>
<string name="save_log">Mentse a naplókat</string>
<string name="log_saved">A naplók mentve</string>
<string name="send_log">Naplók megosztása</string>
<string name="settings_disable_su">Kapcsolja ki a su kompatibilitást</string>
<string name="settings_disable_su_summary">Ideiglenesen tiltsa le bármely alkalmazás azon képességét, hogy root jogosultságokat szerezzen a su paranccsal (a már meglévő folyamatokat ez nem érinti).</string>
<string name="settings_language">Nyelv</string>
</resources>

View File

@@ -5,7 +5,7 @@
<string name="issue_report_body_2">Mohon beritahu kami sesegera mungkin!</string>
<string name="issue_report_github">Laporkan di GitHub</string>
<string name="issue_report_telegram">Hubungi melalui Telegram</string>
<string name="issue_report_github_link">https://github.com/rifsxd/KernelSU-Next/issues</string>
<string name="issue_report_github_link">https://github.com/KernelSU-Next/KernelSU-Next/issues</string>
<string name="issue_report_telegram_link">https://t.me/ksunext</string>
<string name="confirm">Yakin</string>
<string name="app_name" translatable="false">KernelSU Next</string>
@@ -17,15 +17,16 @@
<string name="home_superuser_count">SuperUser: %d</string>
<string name="home_module_count">Modul: %d</string>
<string name="home_failure">Tandatangan KernelSU Next v2 tidak ditemukan pada kernel! [ !KSU_NEXT || != size/hash ]</string>
<string name="home_failure_tip">Mohon agar para pengembang kernel anda mengintegrasikan KernelSU Next!</string>
<string name="home_failure_tip">Minta pengembang kernel Anda untuk mengintegrasikan KernelSU Next!</string>
<string name="home_kernel">Kernel</string>
<string name="home_susfs_version">Versi SuSFS</string>
<string name="home_android">Versi Android</string>
<string name="home_manager_version">Versi Manager</string>
<string name="home_manager_version">Versi Manajer</string>
<string name="home_selinux_status">Status SELinux</string>
<string name="selinux_status_disabled">Nonaktif</string>
<string name="selinux_status_enforcing">Enforcing</string>
<string name="selinux_status_permissive">Permissive</string>
<string name="selinux_status_unknown">Unknown</string>
<string name="selinux_status_unknown">Tidak diketahui</string>
<string name="superuser">SuperUser</string>
<string name="module_failed_to_enable">Gagal mengaktifkan modul: %s</string>
<string name="module_failed_to_disable">Gagal menonaktifkan modul: %s</string>
@@ -54,6 +55,12 @@
<string name="module_restore_failed">Pemulihan gagal: %s</string>
<string name="module_version">Versi</string>
<string name="module_author">Oleh</string>
<string name="module_id">ID</string>
<string name="module_version_code">Kode</string>
<string name="module_update_json">PembaruanJson</string>
<string name="module_update_json_empty">Kosong</string>
<string name="enable_developer_options">Aktifkan opsi pengembang</string>
<string name="enable_developer_options_summary">Tampilkan pengaturan tersembunyi dan info debug module</string>
<string name="module_overlay_fs_not_available">OverlayFS dinonaktifkan oleh kernel, modul tidak tersedia.</string>
<string name="refresh">Muat ulang</string>
<string name="show_system_apps">Tampilkan aplikasi sistem</string>
@@ -62,11 +69,30 @@
<string name="safe_mode">Mode aman</string>
<string name="reboot_to_apply">Reboot agar berfungsi</string>
<string name="module_magisk_conflict">Konflik dengan Magisk, fungsi modul ditiadakan!</string>
<string name="home_module_mount">Modul Sistem</string>
<string name="home_mount_system">Modul Sistem</string>
<string name="home_magic_mount">Magic Mount</string>
<string name="home_overlayfs_mount">OverlayFS</string>
<string name="unavailable">Tidak Tersedia</string>
<string name="use_overlay_fs">Gunakan OverlayFS (Tahap Pengujian)</string>
<string name="use_overlay_fs_summary">Beralih Modul Sistem dari Magic Mount ke OverlayFS Untuk KernelSU-Next.</string>
<string name="reboot_required">Muat Ulang Di Perlukan</string>
<string name="reboot_message">Perubahan akan berlaku setelah sistem dinyalakan ulang. Apakah Anda ingin menyalakan ulang sekarang Atau Nanti?</string>
<string name="module_restore">Mengembalikan modul</string>
<string name="module_restore_message">Pulihkan modul dari cadangan terbaru.</string>
<string name="backup_restore">Cadangkan &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_repo">https://github.com/rifsxd/KernelSU-Next</string>
<string name="home_next_kernelsu_repo">https://github.com/KernelSU-Next/KernelSU-Next</string>
<string name="home_next_kernelsu_body">Next cabang eksperimental. Lihat di GitHub!</string>
<string name="home_experimental_kernelsu">⚠️ Peringatan Pengembangan Eksperimental!</string>
<string name="home_experimental_kernelsu_repo">127.0.0.1</string>
@@ -88,8 +114,8 @@
<string name="profile_capabilities">Kemampuan</string>
<string name="profile_selinux_context">SELinux</string>
<string name="profile_umount_modules">Umount Modul</string>
<string name="failed_to_update_app_profile">Gagal membarui Profil pada %s</string>
<string name="require_kernel_version">Versi KernelSU-Next %1$d terlalu rendah agar manajer berfungsi normal. Harap membarui ke versi %2$d atau di atasnya!</string>
<string name="failed_to_update_app_profile">Gagal memperbarui Profil pada %s</string>
<string name="require_kernel_version">Versi KernelSU-Next %1$d terlalu rendah agar manajer berfungsi normal. Harap memperbarui ke versi %2$d atau di atasnya!</string>
<string name="settings_umount_modules_default">Melepas Modul secara bawaan</string>
<string name="settings_umount_modules_default_summary">Menggunakan \"Umount Modul\" secara universal pada Profil Aplikasi. Jika diaktifkan, akan menghapus semua modifikasi sistem untuk aplikasi yang tidak memiliki set profil.</string>
<string name="settings_susfs_toggle">Sembunyikan hook kprobe</string>
@@ -97,15 +123,16 @@
<string name="profile_umount_modules_summary">Aktifkan opsi ini agar KernelSU dapat memulihkan kembali berkas termodifikasi oleh modul pada aplikasi ini.</string>
<string name="profile_selinux_domain">Domain</string>
<string name="profile_selinux_rules">Aturan</string>
<string name="module_update">Membarui</string>
<string name="module_update">Memperbarui</string>
<string name="module_downloading">Mengunduh modul: %s</string>
<string name="module_start_downloading">Mulai mengunduh: %s</string>
<string name="new_version_available">Tersedia versi terbaru %s, Klik untuk membarui.</string>
<string name="new_version_available">Tersedia versi terbaru %s, Klik untuk memperbarui.</string>
<string name="launch_app">Jalankan</string>
<string name="close">Menutup</string>
<string name="force_stop_app">Paksa berhenti</string>
<string name="restart_app">Mulai ulang</string>
<string name="failed_to_update_sepolicy">Gagal membarui aturan SELinux pada: %s</string>
<string name="failed_to_update_sepolicy">Gagal memperbarui aturan SELinux pada: %s</string>
<string name="su_not_allowed">Pemberian superuser tidak diizinkan untuk: %s</string>
<string name="module_changelog">Catatan Perubahan</string>
<string name="settings_profile_template">Templat Profil Aplikasi</string>
<string name="settings_profile_template_summary">Atur templat Profil yang lokal dan daring</string>
@@ -129,28 +156,28 @@
<string name="app_profile_template_save_failed">Gagal menyimpan templat</string>
<string name="app_profile_template_import_empty">Papan klip kosong!</string>
<string name="module_changelog_failed">Gagal mengambil Changelog: %s</string>
<string name="settings_check_update">Cek terbaru</string>
<string name="settings_check_update_summary">Cek terbaru setiap membuka aplikasi.</string>
<string name="settings_check_update">Periksa pembaruan</string>
<string name="settings_check_update_summary">Periksa pembaruan secara otomatis saat membuka aplikasi.</string>
<string name="grant_root_failed">Gagal memberikan akses root!</string>
<string name="action">Tindakan</string>
<string name="open">Buka</string>
<string name="enable_web_debugging">Pengawakutuan WebView</string>
<string name="enable_web_debugging_summary">Dapat mengawakutu WebView, hanya aktifkan jika butuh.</string>
<string name="direct_install">Instal langsung (rekomendasi)</string>
<string name="select_file">Pilih berkas</string>
<string name="install_inactive_slot">Instal ke slot nonaktif (setelah OTA)</string>
<string name="install_inactive_slot_warning">Gawai akan **DIPAKSA** untuk but ke slot nonaktif! \nHANYA gunakan setelah proses OTA selesai. \nLanjutkan?</string>
<string name="enable_web_debugging">Aktifkan debugging WebView</string>
<string name="enable_web_debugging_summary">Dapat digunakan untuk men-debug WebUI. Harap aktifkan hanya jika diperlukan.</string>
<string name="direct_install">Instalasi langsung (Disarankan)</string>
<string name="select_file">Pilih file</string>
<string name="install_inactive_slot">Instal ke slot tidak aktif (Setelah OTA)</string>
<string name="install_inactive_slot_warning">Perangkat Anda akan **DIPAKSA** untuk boot ke slot tidak aktif saat ini setelah reboot!\nGunakan opsi ini hanya setelah OTA selesai.\nLanjutkan?</string>
<string name="install_next">Selanjutnya</string>
<string name="select_file_tip">%1$s image partisi terekomendasi</string>
<string name="select_file_tip">%1$s image partisi direkomendasikan</string>
<string name="select_kmi">Pilih KMI</string>
<string name="shrink_sparse_image">Meminimalkan sparse image</string>
<string name="shrink_sparse_image_message">Mengembalikan sparse image, lokasi modul disimpan, ke ukuran sebenarnya. Dapat menyebabkan modul bekerja abnormal, maka gunakan saat dibutuhkan saja (mis. untuk pencadangan).</string>
<string name="settings_uninstall">Hapus</string>
<string name="settings_uninstall_temporary">Hapus temporer</string>
<string name="settings_uninstall_permanent">Hapus permanen</string>
<string name="settings_restore_stock_image">Pulihkan image asal</string>
<string name="settings_uninstall_temporary_message">Hapus temporer KernelSU Next, pulihkan ke kondisi asali setelah but berikutnya.</string>
<string name="settings_uninstall_permanent_message">Hapus permanen KernelSU-Next (root dan modul).</string>
<string name="settings_uninstall">Copot Pemasangan</string>
<string name="settings_uninstall_temporary">Copot pemasangan untuk sementara</string>
<string name="settings_uninstall_permanent">Copot pemasangan secara permanen</string>
<string name="settings_restore_stock_image">Pulihkan image bawaan</string>
<string name="settings_uninstall_temporary_message">Copot pemasangan KernelSU Next untuk sementara, pulihkan ke keadaan semula setelah reboot berikutnya.</string>
<string name="settings_uninstall_permanent_message">Mencopot pemasangan KernelSU Next (Root dan semua modul) sepenuhnya dan secara permanen.</string>
<string name="settings_restore_stock_image_message">Pulihkan image bawaan ROM (jika cadangan tersedia), umumnya dilakukan sebelum OTA; jika ingin menghapus KernelSU, gunakan fungsi "Hapus permanen".</string>
<string name="flashing">Pasang</string>
<string name="flash_success">Pemasangan Berhasil</string>
@@ -159,4 +186,6 @@
<string name="save_log">Simpan Log</string>
<string name="log_saved">Log disimpan</string>
<string name="send_log">Kirim Log</string>
<string name="settings_disable_su">Nonaktifkan kompatibilitas su</string>
<string name="settings_disable_su_summary">Nonaktifkan sementara aplikasi apa pun agar tidak mendapatkan hak akses root melalui perintah su (proses root yang sudah ada tidak akan terpengaruh).</string>
</resources>

View File

@@ -0,0 +1,205 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="issue_report_title">Hai problemi?</string>
<string name="issue_report_body">Hai riscontrato un bug o vuoi inviarci un feedback?</string>
<string name="issue_report_body_2">Segnalacelo il prima possibile!</string>
<string name="issue_report_github">Segnala su GitHub</string>
<string name="issue_report_telegram">Contatto tramite 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">Confermare</string>
<string name="app_name" translatable="false">KernelSU Next</string>
<string name="home">Home</string>
<string name="home_not_installed">Non installato</string>
<string name="home_click_to_install">Clicca per installare</string>
<string name="lkm_mode_deprecated">La modalità LKM è ora obsoleta!</string>
<string name="lkm_alternative_suggestion">Installa il kernel GKI o integra KernelSU Next sul tuo dispositivo.</string>
<string name="home_working">In esecuzione</string>
<string name="home_working_version">Versione: %d</string>
<string name="home_superuser_count">Applicazioni con accesso root: %d</string>
<string name="home_module_count">Moduli: %d</string>
<string name="home_failure">Firma KernelSU Next v2 non trovata nel kernel! [ !KSU_NEXT || != size/hash ]</string>
<string name="home_failure_tip">Chiedi allo sviluppatore del kernel di integrare KernelSU Next!</string>
<string name="home_kernel">Versione Kernel</string>
<string name="hook_mode">Modalità Hook</string>
<string name="enabled">Abilitato</string>
<string name="disabled">Disabilitato</string>
<string name="susfs_supported">Supportato</string>
<string name="home_susfs">SuSFS: %s</string>
<string name="home_susfs_version">Versione SuSFS</string>
<string name="home_susfs_sus_su">SuS SU</string>
<string name="home_android">Versione Android</string>
<string name="home_manager_version">Versione del manager</string>
<string name="home_abi">ABI</string>
<string name="home_selinux_status">Stato di SELinux</string>
<string name="selinux_status_disabled">Disabilitato</string>
<string name="selinux_status_enforcing">Enforcing</string>
<string name="selinux_status_permissive">Permissive</string>
<string name="selinux_status_unknown">Sconosciuto</string>
<string name="superuser">Accesso root</string>
<string name="module_failed_to_enable">Impossibile abilitare il modulo: %s</string>
<string name="module_failed_to_disable">Impossibile disabilitare il modulo: %s</string>
<string name="module_empty">Nessun modulo installato</string>
<string name="module">Modulo</string>
<string name="module_install_prompt_with_name">Verranno installati i seguenti moduli: %1$s</string>
<string name="module_sort_a_to_z">Ordinare (A-Z)</string>
<string name="module_sort_z_to_a">Ordinare (Z-A)</string>
<string name="uninstall">Disinstalla</string>
<string name="restore">Ripristina</string>
<string name="module_install">Installa</string>
<string name="install">Installa</string>
<string name="reboot">Riavvia</string>
<string name="settings">Impostazioni</string>
<string name="reboot_userspace">Riavvio rapido</string>
<string name="reboot_recovery">Riavvia in Recovery</string>
<string name="reboot_bootloader">Riavvia in Bootloader</string>
<string name="reboot_download">Riavvia in Download</string>
<string name="reboot_edl">Riavvia in EDL</string>
<string name="about">Informazioni</string>
<string name="module_uninstall_confirm">Sei sicuro di voler disinstallare il modulo %s?</string>
<string name="module_uninstall_success">%s disinstallato</string>
<string name="module_uninstall_failed">Impossibile disinstallare: %s</string>
<string name="module_restore_confirm">Vuoi davvero ripristinare il modulo %s?</string>
<string name="module_restore_success">%s ripristinato</string>
<string name="module_restore_failed">Impossibile ripristinare: %s</string>
<string name="module_version">Versione</string>
<string name="module_author">Autore</string>
<string name="module_id">ID</string>
<string name="module_version_code">Codice</string>
<string name="module_update_json">UpdateJson</string>
<string name="module_update_json_empty">Vuoto</string>
<string name="enable_developer_options">Abilita le opzioni sviluppatore</string>
<string name="enable_developer_options_summary">Mostra le impostazioni nascoste e le informazioni di debug rilevanti solo per gli sviluppatori.</string>
<string name="module_overlay_fs_not_available">I moduli non sono disponibili in quanto overlayFS è disabilitato dal kernel.</string>
<string name="refresh">Ricarica</string>
<string name="show_system_apps">Mostra app di sistema</string>
<string name="hide_system_apps">Nascondi app di sistema</string>
<string name="export_log">Esportare i registri</string>
<string name="safe_mode">Modalità provvisoria</string>
<string name="reboot_to_apply">Riavvia per applicare la modifica</string>
<string name="module_magisk_conflict">I moduli sono disabilitati perché in conflitto con Magisk!</string>
<string name="home_mount_system">Modulo system</string>
<string name="home_magic_mount">Magic Mount</string>
<string name="home_overlayfs_mount">OverlayFS</string>
<string name="unavailable">Non disponibile</string>
<string name="use_overlay_fs">Usa OverlayFS</string>
<string name="use_overlay_fs_summary">Alterna l\'utilizzo di OverlayFS su Magic Mount per il sistema di montaggio di KernelSU Next.</string>
<string name="reboot_required">Riavvio richiesto</string>
<string name="reboot_message">Le modifiche avranno effetto dopo il riavvio del sistema. Vuoi riavviare ora?</string>
<string name="module_restore">Ripristina modulo</string>
<string name="module_restore_message">Ripristina i moduli dal backup recente.</string>
<string name="backup_restore">Backup &amp; Ripristino</string>
<string name="module_backup">Backup modulo</string>
<string name="module_backup_message">Esegui il backup dei moduli attualmente installati.</string>
<string name="allowlist_restore">Ripristina la lista consentita</string>
<string name="allowlist_restore_message">Ripristina la lista consentita dal backup recente.</string>
<string name="allowlist_backup">Backup lista consentita</string>
<string name="allowlist_backup_message">Backup della lista consentita attualmente configurata.</string>
<string name="warning">Avvertimento</string>
<string name="warning_message">Questa funzionalità è ancora in versione beta e in fase di sviluppo. Assicurati di effettuare il backup dei tuoi moduli prima di procedere. Utilizza questa funzionalità solo se ne comprendi i potenziali rischi. Procedi con cautela.</string>
<string name="proceed">Procedere</string>
<string name="cancel">Cancellare</string>
<string name="later">Dopo</string>
<string name="home_next_kernelsu">🔥 Next build</string>
<string name="home_next_kernelsu_repo">https://github.com/KernelSU-Next/KernelSU-Next</string>
<string name="home_next_kernelsu_body">Branch sperimentale di Next. Dai un\'occhiata su GitHub!</string>
<string name="home_experimental_kernelsu">⚠️ Sviluppo sperimentale, attenzione!</string>
<string name="home_experimental_kernelsu_repo">127.0.0.1</string>
<string name="home_experimental_kernelsu_body">KernelSU Next è una versione non ufficiale che è sempre in fase di sviluppo sperimentale attivo. Viene fornita così com\'è, senza garanzie di stabilità, prestazioni o affidabilità.</string>
<string name="home_experimental_kernelsu_body_point_1"> • Usalo a tuo rischio e pericolo: potrebbero verificarsi crash, comportamenti imprevisti o problemi di sistema.</string>
<string name="home_experimental_kernelsu_body_point_2"> • Nessuna garanzia: gli sviluppatori non sono responsabili per eventuali perdite di dati, danni al sistema o altre conseguenze derivanti dal suo utilizzo.</string>
<string name="home_experimental_kernelsu_body_point_3"> • Solo a scopo di test: destinato agli utenti che comprendono i rischi e hanno dimestichezza con la risoluzione dei problemi.</string>
<string name="about_source_code"><![CDATA[Visualizza il codice sorgente su %1$s]]></string>
<string name="profile" translatable="false">Profilo dell\'App</string>
<string name="profile_default">Predefinito</string>
<string name="profile_template">Modello</string>
<string name="profile_custom">Personalizzato</string>
<string name="profile_name">Nome profilo</string>
<string name="profile_namespace">Spazio dei nomi del mount</string>
<string name="profile_namespace_inherited">Ereditato</string>
<string name="profile_namespace_global">Globale</string>
<string name="profile_namespace_individual">Individuale</string>
<string name="profile_groups">Gruppi</string>
<string name="profile_capabilities">Capacità</string>
<string name="profile_selinux_context">Contesto SELinux</string>
<string name="profile_umount_modules">Scollega moduli</string>
<string name="failed_to_update_app_profile">Aggiornamento App Profile per %s fallito</string>
<string name="require_kernel_version">La versione attualmente installata di KernelSU Next %1$d è troppo vecchia ed il gestore non può funzionare correttamente. Si prega di aggiornare alla versione %2$d o successiva!</string>
<string name="settings_umount_modules_default">Scollega moduli</string>
<string name="settings_umount_modules_default_summary">Il valore predefinito per \"Scollega moduli\" in App Profile. Se attivato, rimuoverà tutte le modifiche al sistema da parte dei moduli per le applicazioni che non hanno un profilo impostato.</string>
<string name="settings_susfs_toggle">Nascondi kprobes hook</string>
<string name="settings_susfs_toggle_summary">Questa opzione disabilita gli hook kprobe creati da ksu e, al loro posto, attiva gli hook non-kprobe incorporati, implementando la stessa funzionalità che verrebbe applicata a un kernel non-GKI, che non supporta kprobe.</string>
<string name="profile_umount_modules_summary">Attivando questa opzione permetterai a KernelSU Next di ripristinare ogni file modificato dai moduli per questa app.</string>
<string name="profile_selinux_domain">Dominio</string>
<string name="profile_selinux_rules">Regole</string>
<string name="module_update">Aggiorna</string>
<string name="module_downloading">Sto scaricando il modulo: %s</string>
<string name="module_start_downloading">Inizia a scaricare: %s</string>
<string name="new_version_available">Nuova versione: %s disponibile, tocca per aggiornare.</string>
<string name="launch_app">Apri</string>
<string name="close">Chiudi</string>
<string name="force_stop_app">Arresto forzato</string>
<string name="restart_app">Riavvia</string>
<string name="failed_to_update_sepolicy">Aggiornamento regole SELinux per %s fallito</string>
<string name="su_not_allowed">Non è consentito concedere i privilegi di superutente per: %s</string>
<string name="module_changelog">Registro aggiornamenti</string>
<string name="settings_profile_template">Modello App Profile</string>
<string name="settings_profile_template_summary">Gestisci il modello locale e online di App Profile</string>
<string name="app_profile_template_create">Crea modello</string>
<string name="app_profile_template_edit">Modifica modello</string>
<string name="app_profile_template_id">ID</string>
<string name="app_profile_template_id_invalid">Modello ID non valido</string>
<string name="app_profile_template_name">Nome</string>
<string name="app_profile_template_description">Descrizione</string>
<string name="app_profile_template_save">Salva</string>
<string name="app_profile_template_delete">Elimina</string>
<string name="app_profile_template_view">Visualizza modello</string>
<string name="app_profile_template_readonly">Sola lettura</string>
<string name="app_profile_template_id_exist">L\'ID del modello è già in uso!</string>
<string name="app_profile_import_export">Importa/Esporta</string>
<string name="app_profile_import_from_clipboard">Importa dagli appunti</string>
<string name="app_profile_export_to_clipboard">Esporta negli appunti</string>
<string name="app_profile_template_export_empty">Impossibile trovare un modello locale da esportare!</string>
<string name="app_profile_template_import_success">Importato con successo</string>
<string name="app_profile_template_sync">Sincronizza modelli online</string>
<string name="app_profile_template_save_failed">Impossibile salvare il modello</string>
<string name="app_profile_template_import_empty">Gli appunti sono vuoti!</string>
<string name="module_changelog_failed">Impossibile reperire il changelog: %s</string>
<string name="settings_check_update">Controlla aggiornamenti</string>
<string name="settings_check_update_summary">Controlla automaticamente gli aggiornamenti all\'apertura dell\'applicazione.</string>
<string name="grant_root_failed">Impossibile ottenere l\'accesso root!</string>
<string name="action">Azione</string>
<string name="open">Apri</string>
<string name="enable_web_debugging">Abilita il debug di WebView</string>
<string name="enable_web_debugging_summary">Può essere usato per il debug di WebUI, è consigliato attivarlo solo quando necessario.</string>
<string name="direct_install">Installazione diretta (Raccomandata)</string>
<string name="select_file">Scegli un file</string>
<string name="install_inactive_slot">Installa nello slot inattivo (dopo OTA)</string>
<string name="install_inactive_slot_warning">Il tuo dispositivo sarà **FORZATO** ad avviarsi nello slot inattivo dopo il riavvio!\nUsa questa opzione solo quando l\'applicazione dell\'aggiornamento OTA è terminata.\nProcedere?</string>
<string name="install_next">Avanti</string>
<string name="select_file_tip">Si consiglia l\'immagine della partizione %1$s</string>
<string name="select_kmi">Scegli il KMI</string>
<string name="shrink_sparse_image">Riduci al minimo l\'immagine sparse</string>
<string name="shrink_sparse_image_message">Ridimensiona l\'immagine sparse dei moduli alla sua reale dimensione. Nota che questo potrebbe causare malfunzionamenti dei moduli, quindi utilizzala solo quando necessario (Come per il backup).</string>
<string name="settings_uninstall">Disinstalla</string>
<string name="settings_uninstall_temporary">Disinstalla temporaneamente</string>
<string name="settings_uninstall_permanent">Disinstalla permanentemente</string>
<string name="settings_restore_stock_image">Ripristina immagine originale</string>
<string name="settings_uninstall_temporary_message">Disinstalla temporaneamente KernelSU Next, ripristina lo stato originale dopo il prossimo riavvio.</string>
<string name="settings_uninstall_permanent_message">Disinstalla KernelSU Next (root e tutti i moduli) completamente e permanentemente.</string>
<string name="settings_restore_stock_image_message">Ripristina l\'immagine di fabbrica originale (se il backup è presente), solitamente usato prima di applicare l\'OTA; se devi disinstallare KernelSU Next, utilizza invece \"Disinstalla permanentemente\".</string>
<string name="flashing">Installazione</string>
<string name="flash_success">Installazione completata</string>
<string name="flash_failed">Installazione fallita</string>
<string name="selected_lkm">LKM selezionato: %s</string>
<string name="save_log">Salva registri</string>
<string name="log_saved">Registri salvati</string>
<string name="send_log">Invia log</string>
<string name="settings_disable_su">Disabilita la compatibilità su</string>
<string name="settings_disable_su_summary">Disattiva temporaneamente la possibilità per qualsiasi app di ottenere privilegi di root tramite il comando su (i processi di root esistenti non saranno interessati).</string>
<string name="settings_language">Lingua</string>
<string name="use_webuix">Usa WebUI X</string>
<string name="use_webuix_summary">Usa WebUI X invece di WebUI che supporta più API</string>
<string name="use_webuix_eruda">Iniettare Eruda in WebUI X</string>
<string name="use_webuix_eruda_summary">Inietta una console di debug in WebUI X per semplificare il debug. Richiede che il debug web sia attivo.</string>
</resources>

View File

@@ -0,0 +1,180 @@
<?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_mount_system">モジュールシステム</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>
<string name="settings_language">言語</string>
</resources>

View File

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

View File

@@ -0,0 +1,197 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="issue_report_title">Napotkałeś(-aś) problem?</string>
<string name="issue_report_body">Odnalazłeś(-aś) błąd lub chcesz podzielić się swoją opinią?</string>
<string name="issue_report_body_2">Zgłoś to jak najszybciej!</string>
<string name="issue_report_github">Zgłoś na GitHub</string>
<string name="issue_report_telegram">Skontaktuj się przez 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">Potwierdź</string>
<string name="app_name" translatable="false">KernelSU Next</string>
<string name="home">Strona główna</string>
<string name="home_not_installed">Niezainstalowany</string>
<string name="home_click_to_install">Kliknij, aby zainstalować</string>
<string name="home_working">Uruchomiony</string>
<string name="home_working_version">Wersja: %d</string>
<string name="home_superuser_count">Superuserów: %d</string>
<string name="home_module_count">Modułów: %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">Poproś swojego programistę jądra o integrację KernelSU Next!</string>
<string name="home_kernel">Wersja jądra</string>
<string name="enabled">Aktywny</string>
<string name="disabled">Nieaktywny</string>
<string name="susfs_supported">Obsługiwany</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">Enforcing</string>
<string name="selinux_status_permissive">Permissive</string>
<string name="selinux_status_unknown">Nieznany</string>
<string name="superuser">Superuser</string>
<string name="module_failed_to_enable">Nie udało się włączyć modułu: %s</string>
<string name="module_failed_to_disable">Nie udało się wyłączyć modułu: %s</string>
<string name="module_empty">Brak zainstalowanych modułów</string>
<string name="module">Moduły</string>
<string name="module_install_prompt_with_name">Następujące moduły zostaną zainstalowane: %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">Reboot (uruchom ponownie)</string>
<string name="settings">Ustawienia</string>
<string name="reboot_userspace">Miękki reboot</string>
<string name="reboot_recovery">Reboot do trybu Recovery</string>
<string name="reboot_bootloader">Reboot do trybu Bootloader</string>
<string name="reboot_download">Reboot do trybu Download</string>
<string name="reboot_edl">Reboot do trybu EDL</string>
<string name="about">O autorze</string>
<string name="module_uninstall_confirm">Czy na pewno chcesz odinstalować moduł %s?</string>
<string name="module_uninstall_success">%s został odinstalowany</string>
<string name="module_uninstall_failed">Nie można odinstalować: %s</string>
<string name="module_restore_confirm">Czy na pewno chcesz przywrócić moduł %s?</string>
<string name="module_restore_success">%s został przywrócony</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_id">ID</string>
<string name="module_version_code">Kod</string>
<string name="module_update_json">UpdateJson</string>
<string name="module_update_json_empty">Brak</string>
<string name="enable_developer_options">Włącz opcje programistyczne</string>
<string name="enable_developer_options_summary">Pokaż ukryte ustawienia i informacje debugowe istotne tylko dla programistów.</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">Eksportowanie logów</string>
<string name="safe_mode">Tryb awaryjny</string>
<string name="reboot_to_apply">Uruchom ponownie, aby zastosować zmiany</string>
<string name="module_magisk_conflict">Moduły są niedostępne z powodu konfliku z Magisk!</string>
<string name="home_mount_system">System montowania</string>
<string name="home_magic_mount">Magic Mount</string>
<string name="home_overlayfs_mount">OverlayFS</string>
<string name="unavailable">Niedostępny</string>
<string name="use_overlay_fs">Używaj OverlayFS</string>
<string name="use_overlay_fs_summary">Przełącz pomiędzy używaniem OverlayFS a Magic Mount jako system montowania KernelSU Next.</string>
<string name="reboot_required">Wymagany reboot</string>
<string name="reboot_message">Zmiany zaczną obowiązywać po restarcie systemu. Czy chcesz teraz uruchomić ponownie system?</string>
<string name="module_restore">Przywróć moduły z kopii zapasowej</string>
<string name="module_restore_message">Przywróć moduły z ostatniej kopii zapasowej.</string>
<string name="backup_restore">Tworzenie / przywracanie kopii zapasowej</string>
<string name="module_backup">Utwórz kopię zapasową modułów</string>
<string name="module_backup_message">Utwórz kopię zapasową obecnie zainstalowanych modułów.</string>
<string name="allowlist_restore">Przywróć listę zgód z kopii zapasowej</string>
<string name="allowlist_restore_message">Przywróć listę zgód z ostatniej kopii zapasowej.</string>
<string name="allowlist_backup">Utwórz kopię zapasową listy zgód</string>
<string name="allowlist_backup_message">Utwórz kopię zapasową obecnie skonfigurowanej listy zgód.</string>
<string name="warning">Uwaga</string>
<string name="warning_message">Ta funkcja jest nadal w fazie beta i w trakcie rozwoju. Upewnij się, że wykonałeś(-aś) kopię zapasową przed kontynuowaniem. Używaj tej opcji tylko wtedy, gdy rozumiesz potencjalne 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">🔥 Kompilacja Next</string>
<string name="home_next_kernelsu_repo">https://github.com/KernelSU-Next/KernelSU-Next</string>
<string name="home_next_kernelsu_body">Eksperymentalna gałąź Next. Sprawdź na GitHub!</string>
<string name="home_experimental_kernelsu">⚠️ Ostrzeżenie dotyczące rozwoju eksperymentalnego!</string>
<string name="home_experimental_kernelsu_repo">127.0.0.1</string>
<string name="home_experimental_kernelsu_body">KernelSU Next to nieoficjalna wersja oprogramowania, które jest stale w fazie eksperymentalnego rozwoju. Jest ono dostarczane w stanie "takim, jak jest", bez gwarancji stabilności, wydajności i niezawodności.</string>
<string name="home_experimental_kernelsu_body_point_1"> • Używasz wyłącznie na własne ryzyko: mogą wystąpić awarie, nieoczekiwane zachowania lub problemy z systemem.</string>
<string name="home_experimental_kernelsu_body_point_2"> • Brak gwarancji: deweloperzy nie ponoszą odpowiedzialności za utratę danych, uszkodzenie systemu ani inne konsekwencje wynikające z jego użytkowania.</string>
<string name="home_experimental_kernelsu_body_point_3"> • Tylko dla celów testowych: przeznaczone dla użytkowników, którzy rozumieją ryzyko i mają doświadczenie w rozwiązywaniu problemów.</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">Dziedziczona</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">Przywileje</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 zbyt niska, aby manager działał prawidłowo. Zaktualizuj do wersji %2$d lub wyższej!</string>
<string name="settings_umount_modules_default">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, usunięte zostaną wszystkie modyfikacje systemowe dokonane przez moduły dla aplikacji, które nie mają ustawionego profilu.</string>
<string name="settings_susfs_toggle">Ukryj hooki kprobe</string>
<string name="settings_susfs_toggle_summary">Ta opcja wyłącza hooki kprobe stworzone przez ksu i zamiast tego aktywuje wbudowane hooki non-kprobe, 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 Next przywrócenie wszelkich plików zmodyfikowanych 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">Uruchom ponownie</string>
<string name="failed_to_update_sepolicy">Nie udało się zaktualizować reguł SELinux dla: %s</string>
<string name="su_not_allowed">Przyznanie uprawnień superusera nie jest dozwolone dla: %s</string>
<string name="module_changelog">Dziennik 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">Utwó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 wyeksportowania!</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">Sprawdź dostępność aktualizacji</string>
<string name="settings_check_update_summary">Automatycznie sprawdzaj dostępność aktualizacji przy otwieraniu aplikacji.</string>
<string name="grant_root_failed">Nie udało się przyznać uprawnień 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żesz użyć tej opcji w celu debugowania WebUI. Włącz tylko wtedy, gdy jest to potrzebne.</string>
<string name="direct_install">Zainstaluj bezpośrednio (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 rozruchu z aktualnie nieaktywnego slotu!\nUżywaj tej opcji dopiero po ukończeniu aktualizacji OTA.\nCzy chcesz kontynuować?</string>
<string name="install_next">Dalej</string>
<string name="select_file_tip">Zalecany jest obraz partycji %1$s</string>
<string name="select_kmi">Wybierz KMI</string>
<string name="shrink_sparse_image">Pomniejsz rozrzedzony obraz (sparse image)</string>
<string name="shrink_sparse_image_message">Zmień rozmiar rozrzedzonego obrazu (sparse image), w którym znajduje się moduł, na jego rzeczywisty rozmiar. Zwróć uwagę, że może to spowodować nieprawidłowe działanie modułu, dlatego używaj tej opcji tylko, gdy jest to konieczne (np. do tworzenia kopii zapasowej).</string>
<string name="settings_uninstall">Odinstalowywanie</string>
<string name="settings_uninstall_temporary">Odinstaluj tymczasowo</string>
<string name="settings_uninstall_permanent">Odinstaluj trwale</string>
<string name="settings_restore_stock_image">Przywróć obraz fabryczny</string>
<string name="settings_uninstall_temporary_message">Tymczasowe odinstalowanie KernelSU Next, przywraca stan oryginalny po następnym ponownym uruchomieniu.</string>
<string name="settings_uninstall_permanent_message">Całkowite i trwałe odinstalowanie KernelSU Next (Roota oraz wszystkich modułów).</string>
<string name="settings_restore_stock_image_message">Przywracanie obrazu fabrycznego (jeśli kopia zapasowa istnieje), używane zwykle przed aktualizacją OTA; jeśli chcesz odinstalować KernelSU Next, użyj opcji \"Odinstaluj trwale\".</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>
<string name="settings_disable_su">Wyłącz funkcjonalność su</string>
<string name="settings_disable_su_summary">Tymczasowo wyłącz możliwość uzyskania uprawnień roota przez dowolną aplikację za pomocą polecenia su (nie będzie to miało wpływu na istniejące procesy roota).</string>
<string name="settings_language">Język</string>
</resources>

View File

@@ -5,13 +5,15 @@
<string name="issue_report_body_2">Reporte o mais rápido possível!</string>
<string name="issue_report_github">Reportar no GitHub</string>
<string name="issue_report_telegram">Contato via Telegram</string>
<string name="issue_report_github_link">https://github.com/rifsxd/KernelSU-Next/issues</string>
<string name="issue_report_github_link">https://github.com/KernelSU-Next/KernelSU-Next/issues</string>
<string name="issue_report_telegram_link">https://t.me/ksunext</string>
<string name="confirm">Confirmar</string>
<string name="app_name" translatable="false">KernelSU Next</string>
<string name="home">Início</string>
<string name="home_not_installed">Não instalado</string>
<string name="home_click_to_install">Clique para instalar</string>
<string name="lkm_mode_deprecated">O modo LKM agora está obsoleto!</string>
<string name="lkm_alternative_suggestion">Instale o kernel GKI ou integre o KernelSU Next ao seu dispositivo.</string>
<string name="home_working">Em execução</string>
<string name="home_working_version">Versão: %d</string>
<string name="home_superuser_count">SuperUsuários: %d</string>
@@ -19,11 +21,16 @@
<string name="home_failure">Assinatura KernelSU Next v2 não encontrada no kernel! [ !KSU_NEXT || != size/hash ]</string>
<string name="home_failure_tip">Peça ao seu desenvolvedor de kernel para integrar o KernelSU Next!</string>
<string name="home_kernel">Versão do kernel</string>
<string name="hook_mode">Modo do hook</string>
<string name="enabled">Ativado</string>
<string name="disabled">Desativado</string>
<string name="susfs_supported">Suportado</string>
<string name="home_susfs">SuSFS: %s</string>
<string name="home_susfs_version">Versão do SuSFS</string>
<string name="home_susfs_sus_su">SuS SU</string>
<string name="home_android">Versão do Android</string>
<string name="home_manager_version">Versão do gerenciador</string>
<string name="home_abi">ABI</string>
<string name="home_selinux_status">Status do SELinux</string>
<string name="selinux_status_disabled">Desativado</string>
<string name="selinux_status_enforcing">Impondo</string>
@@ -34,7 +41,7 @@
<string name="module_failed_to_disable">Falha ao desativar o módulo %s</string>
<string name="module_empty">Nenhum módulo instalado</string>
<string name="module">Módulo</string>
<string name="module_install_prompt_with_name">Deseja continuar instalando o módulo %1$s?</string>
<string name="module_install_prompt_with_name">Os seguintes módulos serão instalados: %1$s</string>
<string name="module_sort_a_to_z">Ordenar (A-Z)</string>
<string name="module_sort_z_to_a">Ordenar (Z-A)</string>
<string name="uninstall">Desinstalar</string>
@@ -57,6 +64,12 @@
<string name="module_restore_failed">Falha ao restaurar %s</string>
<string name="module_version">Versão</string>
<string name="module_author">Autor</string>
<string name="module_id">ID</string>
<string name="module_version_code">Código</string>
<string name="module_update_json">UpdateJson</string>
<string name="module_update_json_empty">Vazio</string>
<string name="enable_developer_options">Ativar opções do desenvolvedor</string>
<string name="enable_developer_options_summary">Exibe as configurações ocultas e informações de depuração relevantes apenas para desenvolvedores.</string>
<string name="module_overlay_fs_not_available">Os módulos estão indisponíveis porque OverlayFS está desabilitado pelo kernel!</string>
<string name="refresh">Atualizar</string>
<string name="show_system_apps">Mostrar apps do sistema</string>
@@ -65,25 +78,30 @@
<string name="safe_mode">Modo de segurança</string>
<string name="reboot_to_apply">Reinicie para entrar em vigor</string>
<string name="module_magisk_conflict">Os módulos estão indisponíveis devido a um conflito com Magisk!</string>
<string name="home_module_mount">Sistema de módulos</string>
<string name="home_mount_system">Sistema de montagem</string>
<string name="home_magic_mount">Magic Mount</string>
<string name="home_overlayfs_mount">OverlayFS</string>
<string name="unavailable">Indisponível</string>
<string name="use_overlay_fs">Usar OverlayFS (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="reboot_required">Reinicialização necessária</string>
<string name="reboot_message">As alterações entrarão em vigor após a reinicialização do sistema. Deseja reiniciar agora?</string>
<string name="module_restore">Restaurar módulo</string>
<string name="module_restore_message">Restaure 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_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_message">Este recurso ainda está em beta e em desenvolvimento. Certifique-se de fazer backup de seus módulos antes de continuar. Use esse recurso somente se você compreender os riscos potenciais. Proceda com cautela.</string>
<string name="proceed">Prosseguir</string>
<string name="cancel">Cancelar</string>
<string name="later">Mais tarde</string>
<string name="home_next_kernelsu">🔥 Compilação next</string>
<string name="home_next_kernelsu_repo">https://github.com/rifsxd/KernelSU-Next</string>
<string name="home_next_kernelsu_repo">https://github.com/KernelSU-Next/KernelSU-Next</string>
<string name="home_next_kernelsu_body">Branch next experimental. Confira no GitHub!</string>
<string name="home_experimental_kernelsu">⚠️ Aviso de desenvolvimento experimental!</string>
<string name="home_experimental_kernelsu_repo">127.0.0.1</string>
@@ -107,10 +125,10 @@
<string name="profile_umount_modules">Desmontar módulos</string>
<string name="failed_to_update_app_profile">Falha ao atualizar o Perfil do Aplicativo para %s</string>
<string name="require_kernel_version">A versão atual do KernelSU Next %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_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">Ocultar hook kprobes</string>
<string name="settings_susfs_toggle_summary">Esta opção desativa os hook kprobes criados pelo ksu e, em vez disso, ativa os hooks embutidos não-kprobes, implementando a mesma funcionalidade que seria aplicada a um kernel não-GKI, que não oferece suporte para kprobe.</string>
<string name="profile_umount_modules_summary">Ativar esta opção permitirá que o KernelSU Next restaure quaisquer arquivos modificados pelos módulos para este app.</string>
<string name="profile_selinux_domain">Domínio</string>
<string name="profile_selinux_rules">Regras</string>
@@ -123,6 +141,7 @@
<string name="force_stop_app">Forçar parada</string>
<string name="restart_app">Reiniciar</string>
<string name="failed_to_update_sepolicy">Falha ao atualizar as regras do SELinux para: %s</string>
<string name="su_not_allowed">O acesso de SuperUsuário não é permitido para: %s</string>
<string name="module_changelog">Registro de alterações</string>
<string name="settings_profile_template">Modelo do Perfil do Aplicativo</string>
<string name="settings_profile_template_summary">Gerencie o modelo local e online do Perfil do Aplicativo.</string>
@@ -176,4 +195,11 @@
<string name="save_log">Salvar registros</string>
<string name="log_saved">Registros salvos</string>
<string name="send_log">Compartilhar registros</string>
<string name="settings_disable_su">Desativar compatibilidade su</string>
<string name="settings_disable_su_summary">Desative temporariamente a capacidade de qualquer app obter privilégios root por meio do comando su (processos root existentes não serão afetados).</string>
<string name="settings_language">Idioma</string>
<string name="use_webuix">Usar WebUI X</string>
<string name="use_webuix_summary">Use o WebUI X em vez do WebUI, que oferece suporte a mais APIs.</string>
<string name="use_webuix_eruda">Injetar Eruda no WebUI X</string>
<string name="use_webuix_eruda_summary">Injeta um console de depuração no WebUI X para facilitar a depuração. Requer que a depuração web esteja ativada.</string>
</resources>

View File

@@ -5,13 +5,15 @@
<string name="issue_report_body_2">Сообщите об этом как можно скорее!</string>
<string name="issue_report_github">Сообщить на GitHub</string>
<string name="issue_report_telegram">Связаться через Telegram</string>
<string name="issue_report_github_link">https://github.com/rifsxd/KernelSU-Next/issues</string>
<string name="issue_report_github_link">https://github.com/KernelSU-Next/KernelSU-Next/issues</string>
<string name="issue_report_telegram_link">https://t.me/ksunext</string>
<string name="confirm">Подтвердить</string>
<string name="app_name" translatable="false">KernelSU Next</string>
<string name="home">Главная</string>
<string name="home_not_installed">Не установлено</string>
<string name="home_click_to_install">Нажмите, чтобы установить</string>
<string name="lkm_mode_deprecated">Режим LKM теперь устарел!</string>
<string name="lkm_alternative_suggestion">Установите GKI ядро или интегрируйте ядра рядом с вашим устройством.</string>
<string name="home_working">Работает</string>
<string name="home_working_version">Версия: %d</string>
<string name="home_superuser_count">Superusers: %d</string>
@@ -19,22 +21,27 @@
<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="hook_mode">Режим хуков</string>
<string name="disabled">Отключено</string>
<string name="enabled">Включено</string>
<string name="susfs_supported">Поддерживается</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_abi">ABI</string>
<string name="home_selinux_status">Статус SELinux</string>
<string name="selinux_status_disabled">Отключен</string>
<string name="selinux_status_enforcing">Принудительный</string>
<string name="selinux_status_permissive">Разрешен</string>
<string name="selinux_status_enforcing">Enforcing</string>
<string name="selinux_status_permissive">Permissive</string>
<string name="selinux_status_unknown">Неизвестно</string>
<string name="superuser">Superuser</string>
<string name="module_failed_to_enable">Не удалось включить модуль: %s</string>
<string name="module_failed_to_disable">Не удалось отключить модуль: %s</string>
<string name="module_empty">Нет установленных модулей</string>
<string name="module">Модули</string>
<string name="module_install_prompt_with_name">Вы хотите продолжить установку модуля %1$s?</string>
<string name="module_install_prompt_with_name">Следующие модуль(и) будут установлены: %1$s</string>
<string name="module_sort_a_to_z">Сортировать (А-Я)</string>
<string name="module_sort_z_to_a">Сортировать (Я-А)</string>
<string name="uninstall">Удалить</string>
@@ -57,6 +64,12 @@
<string name="module_restore_failed">Не удалось восстановить: %s</string>
<string name="module_version">Версия</string>
<string name="module_author">Автор</string>
<string name="module_id">ID</string>
<string name="module_version_code">Код версии</string>
<string name="module_update_json">UpdateJson</string>
<string name="module_update_json_empty">Пусто</string>
<string name="enable_developer_options">Режим разработчика</string>
<string name="enable_developer_options_summary">Показывать скрытые настройки и отладочную информацию, актуальную только для разработчиков.</string>
<string name="module_overlay_fs_not_available">Модули недоступны, так как OverlayFS отключен ядром.</string>
<string name="refresh">Обновить</string>
<string name="show_system_apps">Показать системные приложения</string>
@@ -65,37 +78,42 @@
<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_mount_system">Система монтирования</string>
<string name="home_magic_mount">Magic Mount</string>
<string name="home_overlayfs_mount">OverlayFS</string>
<string name="unavailable">Недоступно</string>
<string name="use_overlay_fs">Использовать OverlayFS (Бета)</string>
<string name="use_overlay_fs">Использовать OverlayFS</string>
<string name="use_overlay_fs_summary">Переключение между использованием OverlayFS и Magic Mount для системы монтирования KernelSU Next.</string>
<string name="reboot_required">Требуется перезагрузка</string>
<string name="reboot_message">Изменения вступят в силу после перезагрузки системы. Перезагрузить сейчас?</string>
<string name="module_restore">Восстановить модуль</string>
<string name="module_restore">Восстановить модули</string>
<string name="module_restore_message">Восстановление модулей из последней резервной копии.</string>
<string name="module_backup">Резервное копирование модуля</string>
<string name="backup_restore">Бэкапы и восстановление</string>
<string name="module_backup">Бэкап модулей</string>
<string name="module_backup_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">Предупреждение</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/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_experimental_kernelsu">⚠️ Предупреждение об экспериментальной разработке!</string>
<string name="home_experimental_kernelsu_repo">127.0.0.1</string>
<string name="home_experimental_kernelsu_body">KernelSU Next — это неофициальная версия, которая всегда находится в стадии активной экспериментальной разработки. Она предоставляется как есть, без гарантий стабильности, производительности или надёжности.</string>
<string name="home_experimental_kernelsu_body_point_1"> • Используйте на свой страх и риск: могут возникнуть сбои, непредвиденное поведение или проблемы с системой.</string>
<string name="home_experimental_kernelsu_body_point_2">Нет гарантии: разработчики не несут ответственности за потерю данных, повреждение системы или другие последствия, вызванные использованием.</string>
<string name="home_experimental_kernelsu_body_point_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" translatable="false">Профиль Приложения</string>
<string name="profile_default">По умолчанию</string>
<string name="profile_template">Шаблон</string>
<string name="profile_custom">Пользовательский</string>
<string name="profile_custom">Настроить</string>
<string name="profile_name">Имя профиля</string>
<string name="profile_namespace">Пространство монтирования</string>
<string name="profile_namespace_inherited">Унаследовано</string>
@@ -107,10 +125,10 @@
<string name="profile_umount_modules">Отключить модули</string>
<string name="failed_to_update_app_profile">Не удалось обновить Профиль Приложения для %s</string>
<string name="require_kernel_version">Текущая версия KernelSU Next %1$d слишком низкая для корректной работы менеджера. Пожалуйста, обновитесь до версии %2$d или выше!</string>
<string name="settings_umount_modules_default">Отключать модули по умолчанию</string>
<string name="settings_umount_modules_default_summary">Глобальное значение по умолчанию для \"Отключить модули\" в профиле приложения. Если включено, это удалит все модификации системы модулями для приложений без установленного профиля.</string>
<string name="settings_susfs_toggle">Скрыть хуки kprobe</string>
<string name="settings_susfs_toggle_summary">Отключает хуки kprobe, созданные ksu, и вместо этого активирует встроенные некрючковые функции, реализующие ту же функциональность для неконечных ядер, которые не поддерживают kprobe.</string>
<string name="settings_umount_modules_default">Отключить модули</string>
<string name="settings_umount_modules_default_summary">Глобальное значение по умолчанию для \"Отключить модули\" в Профиле Приложения. Если включено, это удалит все модификации системы модулями для приложений без установленного профиля.</string>
<string name="settings_susfs_toggle">Скрыть хук kprobes</string>
<string name="settings_susfs_toggle_summary">Эта опция отключает хук kprobes, созданный ksu, и вместо него активирует встроенный хук без использования kprobes, реализующий ту же функциональность, которая применяется к ядрам без GKI, не поддерживающим kprobe.</string>
<string name="profile_umount_modules_summary">Включение этой опции позволит KernelSU Next восстанавливать любые изменённые модулями файлы для этого приложения.</string>
<string name="profile_selinux_domain">Домен</string>
<string name="profile_selinux_rules">Правила</string>
@@ -123,9 +141,10 @@
<string name="force_stop_app">Принудительно остановить</string>
<string name="restart_app">Перезапустить</string>
<string name="failed_to_update_sepolicy">Не удалось обновить правила SELinux для: %s</string>
<string name="su_not_allowed">Предоставление прав суперпользователя запрещено для: %s</string>
<string name="module_changelog">Журнал изменений</string>
<string name="settings_profile_template">Шаблон Профиля Приложения</string>
<string name="settings_profile_template_summary">Управление локальными и онлайн-шаблонами профилей приложений</string>
<string name="settings_profile_template">Шаблон Профиля Приложений</string>
<string name="settings_profile_template_summary">Управление локальными и онлайн шаблонами Профилей Приложений</string>
<string name="app_profile_template_create">Создать шаблон</string>
<string name="app_profile_template_edit">Редактировать шаблон</string>
<string name="app_profile_template_id">Идентификатор</string>
@@ -146,16 +165,16 @@
<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">Проверять обновления</string>
<string name="settings_check_update_summary">Автоматически проверять обновления при открытии приложения.</string>
<string name="grant_root_failed">Не удалось предоставить root-доступ!</string>
<string name="action">Действие</string>
<string name="action">Запустить</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="direct_install">Прямая установка (Рекомендуется)</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">Ваше устройство будет **ПРИНУДИТЕЛЬНО** загружено в текущий неактивный слот после перезагрузки!\nИспользуйте эту опцию только после завершения OTA.\nПродолжить?</string>
<string name="install_next">Далее</string>
<string name="select_file_tip">Рекомендуется образ раздела %1$s</string>
@@ -176,4 +195,11 @@
<string name="save_log">Сохранить логи</string>
<string name="log_saved">Логи сохранены</string>
<string name="send_log">Поделиться логами</string>
<string name="settings_disable_su">Откл. совместимость с su</string>
<string name="settings_disable_su_summary">Временно отключить возможность приложениям получать права root через команду su (существующие процессы с правами root не будут затронуты).</string>
<string name="settings_language">Язык</string>
<string name="use_webuix">Использовать WebUI X</string>
<string name="use_webuix_summary">Использовать WebUI X вместо WebUI, который поддерживает больше API.</string>
<string name="use_webuix_eruda">Инжект Eruda в WebUI X</string>
<string name="use_webuix_eruda_summary">Инжектить консоль отладки в WebUI X, чтобы упростить отладку. Требуется включить отладку WebView.</string>
</resources>

View File

@@ -5,7 +5,7 @@
<string name="issue_report_body_2">โปรดรายงานมันให้เร็วที่สุด!</string>
<string name="issue_report_github">รายงานบน Github</string>
<string name="issue_report_telegram">ติดต่อผ่านทาง Telegram</string>
<string name="issue_report_github_link">https://github.com/rifsxd/KernelSU-Next/issues</string>
<string name="issue_report_github_link">https://github.com/KernelSU-Next/KernelSU-Next/issues</string>
<string name="issue_report_telegram_link">https://t.me/ksunext</string>
<string name="confirm">ยืนยัน</string>
<string name="app_name" translatable="false">KernelSU Next</string>
@@ -65,7 +65,7 @@
<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_mount_system">โมดูลระบบ</string>
<string name="home_magic_mount">Magic Mount</string>
<string name="home_overlayfs_mount">OverlayFS</string>
<string name="unavailable">ไม่สามารถใช้งานได้</string>
@@ -83,7 +83,7 @@
<string name="cancel">ยกเลิก</string>
<string name="later">ภายหลัง</string>
<string name="home_next_kernelsu">🔥 Next build</string>
<string name="home_next_kernelsu_repo">https://github.com/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_experimental_kernelsu">⚠️ คำเตือนสิ่งนี้อยู่ภายใต้การพัฒนา!</string>
<string name="home_experimental_kernelsu_repo">127.0.0.1</string>
@@ -109,8 +109,8 @@
<string name="require_kernel_version">KernelSU Next เวอร์ชัน %1$d ต่ำเกินไป ทำให้ตัวจัดการไม่สามารถทำงานได้อย่างถูกต้อง โปรดอัปเกรดเป็นเวอร์ชัน %2$d หรือสูงกว่า!</string>
<string name="settings_umount_modules_default">Umount โมดูลตามค่าเริ่มต้น</string>
<string name="settings_umount_modules_default_summary">หากเปิดใช้งานค่าเริ่มต้นโดยทั่วไปสำหรับ \"Umount โมดูล\" ในโปรไฟล์แอป จะเป็นการลบการแก้ไขโมดูลทั้งหมดในระบบสำหรับแอปพลิเคชันที่ไม่มีการตั้งค่าโปรไฟล์</string>
<string name="settings_susfs_toggle">ซ่อน kprobe hooks</string>
<string name="settings_susfs_toggle_summary">จะปิดใช้งาน kprobe hooks ที่สร้างโดย ksu และเปิดใช้งาน non-kprobe hooks ที่ฝังไว้แทน โดยใช้ฟังก์ชันการทำงานเดียวกันกับที่ใช้กับเคอร์เนลที่ไม่ใช่ GKI ซึ่งไม่รองรับ</string>
<string name="settings_susfs_toggle">ซ่อน kprobes hook</string>
<string name="settings_susfs_toggle_summary">จะปิดใช้งาน kprobes hook ที่สร้างโดย ksu และเปิดใช้งาน non-kprobes hook ที่ฝังไว้แทน โดยใช้ฟังก์ชันการทำงานเดียวกันกับที่ใช้กับเคอร์เนลที่ไม่ใช่ GKI ซึ่งไม่รองรับ</string>
<string name="profile_umount_modules_summary">การเปิดใช้งานตัวเลือกนี้จะทำให้ KernelSU Next สามารถกู้คืนไฟล์ที่แก้ไขโดยโมดูลสำหรับแอปนี้ได้</string>
<string name="profile_selinux_domain">โดเมน</string>
<string name="profile_selinux_rules">กฎ</string>

View File

@@ -5,35 +5,42 @@
<string name="issue_report_body_2">Hemen bildirin!</string>
<string name="issue_report_github">GitHub\'da Bildir</string>
<string name="issue_report_telegram">Telegram\'dan İletişime Geçin</string>
<string name="issue_report_github_link">https://github.com/rifsxd/KernelSU-Next/issues</string>
<string name="issue_report_github_link">https://github.com/KernelSU-Next/KernelSU-Next/issues</string>
<string name="issue_report_telegram_link">https://t.me/ksunext</string>
<string name="confirm">Onayla</string>
<string name="app_name" translatable="false">KernelSU Next</string>
<string name="home">Ana Sayfa</string>
<string name="home_not_installed">Yüklenmedi</string>
<string name="home_not_installed">Yüklü değil</string>
<string name="home_click_to_install">Yüklemek için tıklayın</string>
<string name="lkm_mode_deprecated">LKM modu artık kullanımdan kaldırıldı!</string>
<string name="lkm_alternative_suggestion">GKI çekirdeğini kurun veya cihazınıza KernelSU Next entegre edin.</string>
<string name="home_working">Çalışıyor</string>
<string name="home_working_version">Sürüm: %d</string>
<string name="home_superuser_count">Süper kullanıcılar: %d</string>
<string name="home_module_count">Modüller: %d</string>
<string name="home_failure">KernelSU Next v2 imzası çekirdek içinde bulunamadı! [ !KSU_NEXT || != boyut/hash ]</string>
<string name="home_failure_tip">Çekirdek geliştiricinizden KernelSU Next\'i entegre etmesini isteyin!</string>
<string name="home_kernel">Çekirdek sürümü</string>
<string name="home_failure">Kernel\'de KernelSU Next v2 imzası bulunamadı! [ !KSU_NEXT || != boyut/hash ]</string>
<string name="home_failure_tip">Kernel geliştiricinizden KernelSU Next\'i entegre etmesini isteyin!</string>
<string name="home_kernel">Kernel sürümü</string>
<string name="hook_mode">Kanca Modu</string>
<string name="enabled">Etkin</string>
<string name="disabled">Devre dışı</string>
<string name="susfs_supported">Destekleniyor</string>
<string name="home_susfs">SuSFS: %s</string>
<string name="home_susfs_version">SuSFS sürümü</string>
<string name="home_susfs_sus_su">SuS SU</string>
<string name="home_android">Android sürümü</string>
<string name="home_manager_version">Yönetici sürümü</string>
<string name="home_abi">ABI</string>
<string name="home_selinux_status">SELinux durumu</string>
<string name="selinux_status_disabled">Devre dışı</string>
<string name="selinux_status_enforcing">Zorlanıyor (Enforcing)</string>
<string name="selinux_status_permissive">Serbest (Permissive)</string>
<string name="selinux_status_enforcing">Etkin (Enforcing)</string>
<string name="selinux_status_permissive">Etkin (Permissive)</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_disable">Modül devre dışı bırakılamadı: %s</string>
<string name="module_empty">Yüklü modül yok</string>
<string name="module">Modül</string>
<string name="module">Modüller</string>
<string name="module_install_prompt_with_name">%1$s modülünü yüklemeye devam etmek istiyor musunuz?</string>
<string name="module_sort_a_to_z">Sırala (A-Z)</string>
<string name="module_sort_z_to_a">Sırala (Z-A)</string>
@@ -44,93 +51,105 @@
<string name="reboot">Yeniden Başlat</string>
<string name="settings">Ayarlar</string>
<string name="reboot_userspace">Yumuşak Yeniden Başlat</string>
<string name="reboot_recovery">Kurtarma Modunda Yeniden Başlat</string>
<string name="reboot_bootloader">Bootloader\'da Yeniden Başlat</string>
<string name="reboot_download">Download Modunda Yeniden Başlat</string>
<string name="reboot_edl">EDL Modunda Yeniden Başlat</string>
<string name="reboot_recovery">Kurtarma Moduna Yeniden Başlat</string>
<string name="reboot_bootloader">Bootloader Moduna Yeniden Başlat</string>
<string name="reboot_download">Download Moduna Yeniden Başlat</string>
<string name="reboot_edl">EDL Moduna Yeniden Başlat</string>
<string name="about">Hakkında</string>
<string name="module_uninstall_confirm">%s modülünü kaldırmak istediğinizden emin misiniz?</string>
<string name="module_uninstall_success">%s kaldırıldı</string>
<string name="module_uninstall_failed">Kaldırma başarısız: %s</string>
<string name="module_uninstall_failed">Kaldırılamadı: %s</string>
<string name="module_restore_confirm">%s modülünü geri yüklemek istediğinizden emin misiniz?</string>
<string name="module_restore_success">%s geri yüklendi</string>
<string name="module_restore_failed">Geri yükleme başarısız: %s</string>
<string name="module_restore_failed">Geri yüklenemedi: %s</string>
<string name="module_version">Sürüm</string>
<string name="module_author">Yazar</string>
<string name="module_overlay_fs_not_available">Modüller kullanılamıyor çünkü OverlayFS çekirdek tarafından devre dışı bırakılmış.</string>
<string name="module_id">ID</string>
<string name="module_version_code">Kod</string>
<string name="module_update_json">GüncellemeJson</string>
<string name="module_update_json_empty">Boş</string>
<string name="enable_developer_options">Geliştirici seçeneklerini etkinleştir</string>
<string name="enable_developer_options_summary">Yalnızca geliştiriciler için geçerli olan gizli ayarları ve hata ayıklama bilgilerini göster.</string>
<string name="module_overlay_fs_not_available">OverlayFS kernel tarafından devre dışı bırakıldığı için modüller kullanılamaz.</string>
<string name="refresh">Yenile</string>
<string name="show_system_apps">Sistem uygulamalarını göster</string>
<string name="hide_system_apps">Sistem uygulamalarını gizle</string>
<string name="export_log">Günlükleri dışa aktar</string>
<string name="export_log">Logları dışa aktar</string>
<string name="safe_mode">Güvenli Mod</string>
<string name="reboot_to_apply">Değişikliklerin etkili olması için yeniden başlatın</string>
<string name="module_magisk_conflict">Modüller Magisk ile çakışma nedeniyle kullanılamıyor!</string>
<string name="home_module_mount">Modül Sistemi</string>
<string name="module_magisk_conflict">Magisk ile çakışma nedeniyle modüller kullanılamıyor!</string>
<string name="home_mount_system">Modül Sistemi</string>
<string name="home_magic_mount">Magic Mount</string>
<string name="home_overlayfs_mount">OverlayFS</string>
<string name="unavailable">Kullanılamaz</string>
<string name="use_overlay_fs">OverlayFS Kullan (Beta)</string>
<string name="use_overlay_fs_summary">KernelSU Next\'in Mount sistemi için OverlayFS ile Magic Mount arasında geçiş yapın.</string>
<string name="reboot_required">Yeniden Başlatma Gerekiyor</string>
<string name="reboot_message">Değişiklikler sistem yeniden başlatıldıktan sonra etkili olacaktır. Şimdi yeniden başlatmak istiyor musunuz?</string>
<string name="use_overlay_fs">OverlayFS Kullan</string>
<string name="use_overlay_fs_summary">KernelSU Next\'in Mount sistemi için OverlayFS ve Magic Mount arasında geçiş yapın.</string>
<string name="reboot_required">Yeniden Başlatmak Gerekiyor</string>
<string name="reboot_message">Değişiklikler, sistemin yeniden başlatılmasından sonra etkili olacak. Şimdi yeniden başlatmak ister misiniz?</string>
<string name="module_restore">Modülleri Geri Yükle</string>
<string name="module_restore_message">Modülleri son yedekten geri yükler.</string>
<string name="backup_restore">Yedekle &amp; Geri Yükle</string>
<string name="module_backup">Modülleri Yedekle</string>
<string name="module_backup_message">Şu anda yüklü olan modülleri yedekler.</string>
<string name="allowlist_restore">İzin verilenleri geri yükle</string>
<string name="allowlist_restore_message">İzin verilenler listesini son yedekten geri yükle.</string>
<string name="allowlist_backup">İzin verilenleri yedekle</string>
<string name="allowlist_backup_message">Mevcut yapılandırılmış izin verilen listesini yedekle.</string>
<string name="warning">Uyarı</string>
<string name="warning_message">Bu özellik hâlâ beta aşamasında ve geliştirilme sürecinde. Lütfen devam etmeden önce modüllerinizi yedeklediğinizden emin olun. Yalnızca bu özelliğin potansiyel risklerini anlıyorsanız kullanın. Dikkatli olun.</string>
<string name="warning_message">Bu özellik hala beta aşamasında ve geliştirme sürecindedir. Lütfen devam etmeden önce modüllerinizi yedekleyin. Bu özelliği yalnızca potansiyel riskleri anladığınızda kullanın. Dikkatli olun.</string>
<string name="proceed">Devam Et</string>
<string name="cancel">İptal</string>
<string name="later">Sonra</string>
<string name="later">Daha Sonra</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_experimental_kernelsu">⚠️ Deneysel Geliştirme Uyarısı!</string>
<string name="home_experimental_kernelsu_repo">127.0.0.1</string>
<string name="home_experimental_kernelsu_body">KernelSU Next resmi olmayan bir sürümdür ve her zaman aktif deneysel geliştirme altındadır. Stabilite, performans veya güvenilirlik garantisi verilmez.</string>
<string name="home_experimental_kernelsu_body_point_1"> • Risk aldığınızı bilerek kullanın: Çökme, beklenmeyen davranış veya sistem sorunları olabilir.</string>
<string name="home_experimental_kernelsu_body_point_2"> • Garanti verilmez: geliştiriciler, bunun kullanımı sonucu oluşabilecek veri kaybı, sistem hasarı veya diğer sonuçlardan sorumlu değildir.</string>
<string name="home_experimental_kernelsu_body_point_3">Test amaçlıdır: yalnızca riskleri anlayan ve sorun giderme konusunda rahat olan kullanıcılar için tasarlanmıştır.</string>
<string name="about_source_code"><![CDATA[Kaynak kodu şu adreste görüntüleyin: %1$s]]></string>
<string name="home_experimental_kernelsu_body">KernelSU Next, her zaman aktif deneysel geliştirme aşamasında olan resmi olmayan bir sürümdür. Olduğu gibi sunulur, kararlılık, performans veya güvenilirlik garantisi yoktur.</string>
<string name="home_experimental_kernelsu_body_point_1"> • Risk aldığınızı bilerek kullanın: çökmeler, beklenmeyen davranışlar veya sistem sorunları olabilir.</string>
<string name="home_experimental_kernelsu_body_point_2"> • Garanti verilmez: geliştiriciler, kullanımından kaynaklanan herhangi bir veri kaybı, sistem hasarı veya diğer sonuçlardan sorumlu değildir.</string>
<string name="home_experimental_kernelsu_body_point_3">Yalnızca test amaçlıdır: riskleri anlayan ve sorunları giderebilen kullanıcılar için tasarlanmıştır.</string>
<string name="about_source_code"><![CDATA[Kaynak kodunu şu adreste görüntüleyin: %1$s]]></string>
<string name="profile" translatable="false">Uygulama Profili</string>
<string name="profile_default">Varsayılan</string>
<string name="profile_template">Şablon</string>
<string name="profile_custom">Özel</string>
<string name="profile_name">Profil Adı</string>
<string name="profile_namespace">Ad Alanını Bağla</string>
<string name="profile_namespace_inherited">Kalıtsal</string>
<string name="profile_namespace_global">Küresel</string>
<string name="profile_namespace_inherited">Miras alınan</string>
<string name="profile_namespace_global">Genel</string>
<string name="profile_namespace_individual">Bireysel</string>
<string name="profile_groups">Gruplar</string>
<string name="profile_capabilities">Yetkinlikler</string>
<string name="profile_selinux_context">SELinux Bağlamı</string>
<string name="profile_umount_modules">Modüllerin Bağlantısını kes</string>
<string name="failed_to_update_app_profile">%s için uygulama profili güncellenemedi.</string>
<string name="require_kernel_version">Mevcut KernelSU Next sürümü %1$d, yöneticinin düzgün çalışması için çok düşük. Lütfen sürümü %2$d veya daha yüksek bir sürüme yükseltin!</string>
<string name="failed_to_update_app_profile">%s için Uygulama Profili güncellenemedi</string>
<string name="require_kernel_version">KernelSU Next\'in mevcut sürümü %d, yönetici için yeterli değil. Lütfen sürüm %d veya üstünü yükseltin!</string>
<string name="settings_umount_modules_default">Varsayılan olarak modüllerin bağlantısını kes</string>
<string name="settings_umount_modules_default_summary">Uygulama profilindeki \"Modüllerin bağlantısını kes\" seçeneği için varsayılan değer. Etkinleştirilirse, profil ayarı yapılmamış uygulamalar için modüllerin sistemde yaptığı tüm değişiklikler kaldırılacaktır.</string>
<string name="settings_susfs_toggle">Kprobe kancalarını gizle</string>
<string name="settings_susfs_toggle_summary">Kprobe kancalarını devre dışı bırakır ve bunun yerine gömülü olmayan kancaları etkinleştirir. Bu, kprobe\'yi desteklemeyen bir çekirdek için uygulanacak aynı işlevselliği sağlar.</string>
<string name="profile_umount_modules_summary">Bu seçeneği etkinleştirmek, KernelSU Next\'in bu uygulama için modüller tarafından değiştirilmiş herhangi bir dosyayı geri yüklemesini sağlar.</string>
<string name="profile_selinux_domain">İsim Alanı</string>
<string name="settings_umount_modules_default_summary">Uygulama Profili\'nde \"Modülleri kaldır\" için genel varsayılan değer. Etkinleştirilirse, profil ayarlı olmayan uygulamalar için sistemden tüm modül değişikliklerini kaldırır.</string>
<string name="settings_susfs_toggle">kprobe kancalarını gizle</string>
<string name="settings_susfs_toggle_summary">ksu tarafından oluşturulan kprobe kancalarını devre dışı bırakır ve bunun yerine, GKI olmayan bir çekirdek için uygulanacak aynı işlevselliği sağlayan gömülü kprobe olmayan kancaları etkinleştirir.</string>
<string name="profile_umount_modules_summary">Bu seçeneği etkinleştirmek, KernelSU Next\'in bu uygulama için modüller tarafından değiştirilen herhangi bir dosyayı geri yüklemesine izin verir.</string>
<string name="profile_selinux_domain">Etki Alanı</string>
<string name="profile_selinux_rules">Kurallar</string>
<string name="module_update">Güncelle</string>
<string name="module_downloading">Modül indiriliyor: %s</string>
<string name="module_start_downloading">İndirme başlatılıyor: %s</string>
<string name="new_version_available">Yeni sürüm %s mevcut, güncellemek için tıklayın.</string>
<string name="launch_app">Uygulamayı başlat</string>
<string name="module_start_downloading">İndirmeye başla: %s</string>
<string name="new_version_available">%s sürümü mevcut, yükseltmek için tıklayın.</string>
<string name="launch_app">Başlat</string>
<string name="close">Kapat</string>
<string name="force_stop_app">Uygulamayı durmaya zorla</string>
<string name="restart_app">Uygulamayı yeniden başlat</string>
<string name="force_stop_app">Zorla durdur</string>
<string name="restart_app">Yeniden Başlat</string>
<string name="failed_to_update_sepolicy">%s için SELinux kuralları güncellenemedi.</string>
<string name="su_not_allowed">SüperKullanıcı yetkisi verilemez: %s</string>
<string name="module_changelog">Değişiklik Günlüğü</string>
<string name="settings_profile_template">Uygulama Profili Şablonu</string>
<string name="settings_profile_template_summary">Yerel ve çevrimiçi Uygulama Profili şablonlarını yönetin</string>
<string name="settings_profile_template_summary">Yerel ve çevrimiçi Uygulama Profili Şablonlarını yönetin</string>
<string name="app_profile_template_create">Şablon oluştur</string>
<string name="app_profile_template_edit">Şablonu düzenle</string>
<string name="app_profile_template_id">ID</string>
<string name="app_profile_template_id_invalid">Geçersiz şablon ID\'si</string>
<string name="app_profile_template_name">İsim</string>
<string name="app_profile_template_id_invalid">Geçersiz şablon ID</string>
<string name="app_profile_template_name">Ad</string>
<string name="app_profile_template_description">ıklama</string>
<string name="app_profile_template_save">Kaydet</string>
<string name="app_profile_template_delete">Sil</string>
@@ -139,41 +158,48 @@
<string name="app_profile_template_id_exist">Şablon ID\'si zaten mevcut!</string>
<string name="app_profile_import_export">İçe/Dışa Aktar</string>
<string name="app_profile_import_from_clipboard">Panodan içe aktar</string>
<string name="app_profile_export_to_clipboard">Panoya dışa aktar</string>
<string name="app_profile_export_to_clipboard">Pano\'ya dışa aktar</string>
<string name="app_profile_template_export_empty">Dışa aktarılacak yerel şablon bulunamadı!</string>
<string name="app_profile_template_import_success">Başarıyla içe aktarıldı</string>
<string name="app_profile_template_sync">Çevrimiçi şablonları senkronize et</string>
<string name="app_profile_template_save_failed">Şablon kaydedilemedi</string>
<string name="app_profile_template_import_empty">Pano boş!</string>
<string name="module_changelog_failed">%s için değişiklik günlüğü alınamadı.</string>
<string name="settings_check_update">Güncellemeleri kontrol et</string>
<string name="settings_check_update_summary">Başlangıçta otomatik olarak güncellemeleri kontrol et.</string>
<string name="app_profile_template_import_empty">Panoda hiçbir şey yok!</string>
<string name="module_changelog_failed">Değişiklik günlüğü alınamadı: %s</string>
<string name="settings_check_update">Güncellemeyi kontrol et</string>
<string name="settings_check_update_summary">Uygulama açıldığında otomatik olarak güncellemeleri kontrol et.</string>
<string name="grant_root_failed">Root yetkisi verilemedi!</string>
<string name="action">Eylem</string>
<string name="open"></string>
<string name="enable_web_debugging">WebView hata ayıklamayı etkinleştir</string>
<string name="enable_web_debugging_summary">WebUI\'da hata ayıklamak için kullanılabilir. Lütfen yalnızca gerektiğinde etkinleştirin.</string>
<string name="direct_install">Doğrudan yükleme (Önerilen)</string>
<string name="select_file">Bir dosya seç</string>
<string name="install_inactive_slot">Pasif bölüme yükle (OTA sonrası)</string>
<string name="install_inactive_slot_warning">Cihazınız bir sonraki yeniden başlatmada **ZORUNLU** olarak mevcut pasif bölüme önyükleme yapacaktır!\nBu seçeneği yalnızca OTA işlemi tamamlandıktan sonra kullanın.\nDevam edilsin mi?</string>
<string name="install_next">İleri</string>
<string name="enable_web_debugging">WebView hata ayıklamasını etkinleştir</string>
<string name="enable_web_debugging_summary">WebUI hata ayıklaması için kullanılabilir. Lütfen yalnızca gerekli olduğunda etkinleştirin.</string>
<string name="direct_install">Doğrudan yükle (Önerilen)</string>
<string name="select_file">Bir dosya seçin</string>
<string name="install_inactive_slot">Etkin olmayan yuvaya yükle (OTA sonrası)</string>
<string name="install_inactive_slot_warning">Cihazınız, yeniden başlatma sonrasında **ZORLANACAK** şu anda etkin olmayan yuvaya başlatılacak!\nLütfen bu seçeneği yalnızca OTA tamamlandıktan sonra kullanın.\nDevam edilsin mi?</string>
<string name="install_next">Sonraki</string>
<string name="select_file_tip">%1$s bölüm görüntüsü önerilir</string>
<string name="select_kmi">KMI s</string>
<string name="shrink_sparse_image">Sparse imajını küçült</string>
<string name="shrink_sparse_image_message">Modüllerin bulunduğu sparse imajını gerçek boyutuna yeniden boyutlandırın. Bunun modüllerin anormal çalışmasına neden olabileceğini unutmayın, bu yüzden yalnızca gerektiğinde kullanın (Örneğin yedekleme için).</string>
<string name="select_kmi">KMI S</string>
<string name="shrink_sparse_image">Seyrek görüntüyü küçült</string>
<string name="shrink_sparse_image_message">Modülün bulunduğu seyrek görüntüyü gerçek boyutuna yeniden boyutlandırın. Bu, modülün anormal çalışmasına neden olabilir, bu nedenle lütfen yalnızca gerekli olduğunda kullanın (örneğin, yedekleme için).</string>
<string name="settings_uninstall">Kaldır</string>
<string name="settings_uninstall_temporary">Geçici olarak kaldır</string>
<string name="settings_uninstall_permanent">Kalıcı olarak kaldır</string>
<string name="settings_restore_stock_image">Stok görüntüyü geri yükle</string>
<string name="settings_uninstall_temporary_message">KernelSU Next\'i geçici olarak kaldırın, bir sonraki yeniden başlatmadan sonra orijinal duruma geri döner.</string>
<string name="settings_uninstall_permanent_message">KernelSU Next\'i (Root ve tüm modüller) tamamen ve kalıcı olarak kaldır.</string>
<string name="settings_restore_stock_image_message">Stok fabrika görüntüsünü geri yükle (Eğer bir yedek varsa), genellikle OTA\'dan önce kullanılır; KernelSU Next\'i kaldırmanız gerekiyorsa lütfen \"Kalıcı olarak kaldır\" seçeneğini kullanın.</string>
<string name="settings_restore_stock_image">Fabrika görüntüsünü geri yükle</string>
<string name="settings_uninstall_temporary_message">KernelSU Next\'i geçici olarak kaldırın, sonraki yeniden başlatmadan sonra orijinal duruma dönsün.</string>
<string name="settings_uninstall_permanent_message">KernelSU Next\'i (Root ve tüm modüller) tamamen ve kalıcı olarak kaldırın.</string>
<string name="settings_restore_stock_image_message">Fabrika görüntüsünü geri yükle (bir yedek varsa), genellikle OTA öncesi kullanılır; KernelSU Next\'i kaldırmak istiyorsanız, lütfen \"Kalıcı olarak kaldır\" kullanın.</string>
<string name="flashing">Yükleniyor</string>
<string name="flash_success">Yükleme başarılı</string>
<string name="flash_failed">Yükleme başarısız</string>
<string name="selected_lkm">Seçilen LKM: %s</string>
<string name="save_log">Günlükleri kaydet</string>
<string name="log_saved">Günlükler kaydedildi</string>
<string name="send_log">Günlükleri paylaş</string>
<string name="save_log">Logları kaydet</string>
<string name="log_saved">Loglar kaydedildi</string>
<string name="send_log">Logları paylaş</string>
<string name="settings_disable_su">Su uyumluluğunu devre dışı bırak</string>
<string name="settings_disable_su_summary">Geçici olarak herhangi bir uygulamanın su komutu aracılığıyla kök ayrıcalıkları elde etme yeteneğini devre dışı bırakır (mevcut kök süreçleri etkilenmez).</string>
<string name="settings_language">Dil</string>
<string name="use_webuix">WebUI X\'i kullanın</string>
<string name="use_webuix_summary">Daha fazla API\'yi destekleyen WebUI yerine WebUI X kullanın</string>
<string name="use_webuix_eruda">WebUI X\'e Eruda Enjekte Et</string>
<string name="use_webuix_eruda_summary">Hata ayıklamayı kolaylaştırmak için WebUI X\'e bir debug konsolu enjekte edin. Web hata ayıklamanın açık olması gerekir.</string>
</resources>

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