Compare commits
35 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
1fd13d9d8d | ||
|
|
4205db6870 | ||
|
|
70f03081a4 | ||
|
|
5ccb779b6a | ||
|
|
b07bc408ce | ||
|
|
7ee1fd63f1 | ||
|
|
3551441e42 | ||
|
|
4a1ab76322 | ||
|
|
2fedb051b8 | ||
|
|
10c35f4baa | ||
|
|
4f82eda003 | ||
|
|
80f89c0241 | ||
|
|
8399f14fad | ||
|
|
c49a66d1af | ||
|
|
d66b390361 | ||
|
|
9c290a8080 | ||
|
|
48efc28e8f | ||
|
|
634adad15c | ||
|
|
4532bab230 | ||
|
|
d3c9b6e739 | ||
|
|
8e4f980db0 | ||
|
|
cfee357ed1 | ||
|
|
9393459b27 | ||
|
|
60af173a7e | ||
|
|
23e2377f87 | ||
|
|
d45ba31849 | ||
|
|
c5705c2d5d | ||
|
|
dfae83cf58 | ||
|
|
cd5ba3ac3c | ||
|
|
2c2698f6bc | ||
|
|
f57fe79c5d | ||
|
|
91ae4c9650 | ||
|
|
01f44dc1d9 | ||
|
|
6e35b88041 | ||
|
|
c9c122d79b |
5
.github/FUNDING.yml
vendored
5
.github/FUNDING.yml
vendored
@@ -1,5 +1,4 @@
|
||||
# These are supported funding model platforms
|
||||
|
||||
github: tiann
|
||||
patreon: weishu
|
||||
custom: https://vxposed.com/donate.html
|
||||
open_collective: sukisu-ultra
|
||||
|
||||
|
||||
1
.gitignore
vendored
1
.gitignore
vendored
@@ -1,2 +1,3 @@
|
||||
.idea
|
||||
.vscode
|
||||
.DS_Store
|
||||
|
||||
@@ -26,6 +26,12 @@ curl -LSs "https://raw.githubusercontent.com/SukiSU-Ultra/SukiSU-Ultra/main/kern
|
||||
|
||||
## How to use integrated susfs
|
||||
|
||||
> [!Note]
|
||||
>
|
||||
> - Due to SuSFS version changes and unpredictability issues
|
||||
> - This susfs-main branch will only merge the latest new version after a full update
|
||||
> - Please keep an eye on the susfs branch to avoid build failures and incompatibilities caused by the various versions
|
||||
|
||||
1. Use susfs-main or other susfs-\* branches directly, no need to integrate susfs again (supports non-GKI device builds)
|
||||
|
||||
```
|
||||
@@ -44,7 +50,9 @@ curl -LSs "https://raw.githubusercontent.com/SukiSU-Ultra/SukiSU-Ultra/main/kern
|
||||
|
||||
2. **Manual hook:**
|
||||
- Standard KernelSU hook: https://kernelsu.org/guide/how-to-integrate-for-non-gki.html#manually-modify-the-kernel-source
|
||||
- backslashxx's syscall manual hook: https://github.com/backslashxx/KernelSU/issues/5
|
||||
|
||||
- backslashxx's syscall manual hook: https://github.com/backslashxx/KernelSU/issues/5 (v1.5 version is not available at the moment, if you want to use it, please use v1.4 version, or standard KernelSU hooks)
|
||||
|
||||
- Default hook method on Non-GKI kernels.
|
||||
- Need `CONFIG_KSU_MANUAL_HOOK=y`
|
||||
|
||||
@@ -118,6 +126,7 @@ Please **all** refer to https://kernelsu.org/zh_CN/guide/installation.html
|
||||
4. Bringing back non-GKI/GKI 1.0 support
|
||||
5. More customization
|
||||
6. Support for KPM kernel modules
|
||||
7. Introducing the Manager for SuSFS Configuration and Advanced Features
|
||||
|
||||
## Troubleshooting
|
||||
|
||||
|
||||
@@ -11,26 +11,41 @@
|
||||
>
|
||||
> ただし、将来的には KSU とは別に管理されるブランチとなる予定です。
|
||||
|
||||
## 追加方法
|
||||
## 追加する方法
|
||||
|
||||
メイン分岐の使用(GKI デバイス以外のビルドはサポートされていません。) (手動によるサスフ統合が必要)
|
||||
メインブランチを使用 (非 GKI のデバイスのビルドは非対応) (susfs を手動で統合が必要)
|
||||
```
|
||||
curl -LSs "https://raw.githubusercontent.com/SukiSU-Ultra/SukiSU-Ultra/main/kernel/setup.sh" | bash -s main
|
||||
```
|
||||
|
||||
GKI以外のデバイスをサポートするブランチを使用する (手動によるサスフ統合が必要)
|
||||
非 GKI のデバイスに対応するブランチを使用 (susfs を手動で統合が必要)
|
||||
```
|
||||
curl -LSs "https://raw.githubusercontent.com/SukiSU-Ultra/SukiSU-Ultra/main/kernel/setup.sh" | bash -s nongki
|
||||
```
|
||||
|
||||
## 統合された susfs の使い方
|
||||
|
||||
1. susfs-mainまたは他のsusfs-*ブランチを直接使用し、susfsを再度統合する必要はありません
|
||||
1. susfs-main または他の susfs-\* ブランチを直接で使用、susfs の統合は不要 (非 GKI デバイスのビルドに対応)
|
||||
|
||||
```
|
||||
curl -LSs "https://raw.githubusercontent.com/SukiSU-Ultra/SukiSU-Ultra/main/kernel/setup.sh" | bash -s susfs-main
|
||||
```
|
||||
|
||||
## フックの方式
|
||||
|
||||
- この方式は (https://github.com/rsuntk/KernelSU) のフック方式を参照してください。
|
||||
|
||||
1. **KPROBES でフック:**
|
||||
- 読み込み可能なカーネルモジュールの場合 (LKM)
|
||||
- GKI カーネルのデフォルトとなるフック方式
|
||||
- `CONFIG_KPROBES=y` が必要です
|
||||
|
||||
2. **手動でフック:**
|
||||
- 標準の KernelSU フック: https://kernelsu.org/guide/how-to-integrate-for-non-gki.html#manually-modify-the-kernel-source
|
||||
- backslashxx syscall フック: https://github.com/backslashxx/KernelSU/issues/5
|
||||
- 非 GKI カーネル用のデフォルトフック方式
|
||||
- `CONFIG_KSU_MANUAL_HOOK=y` が必要です
|
||||
|
||||
## KPM に対応
|
||||
|
||||
- KernelPatch に基づいて重複した KSU の機能を削除、KPM の対応を維持させています。
|
||||
@@ -41,56 +56,46 @@ curl -LSs "https://raw.githubusercontent.com/SukiSU-Ultra/SukiSU-Ultra/main/kern
|
||||
KPM テンプレートのアドレス: https://github.com/udochina/KPM-Build-Anywhere
|
||||
|
||||
> [!Note]
|
||||
> 1. `CONFIG_KPM=y` が必要である。
|
||||
> 1. `CONFIG_KPM=y` が必要です。
|
||||
> 2. 非 GKI デバイスには `CONFIG_KALLSYMS=y` と `CONFIG_KALLSYMS_ALL=y` も必要です。
|
||||
> 3. いくつかのカーネル `4.19` およびそれ以降のソースコードでは、 `4.19` からバックポートされた `set_memory.h` ヘッダーファイルも必要です。
|
||||
|
||||
|
||||
## ROOT を保持するシステムアップデートの方法
|
||||
- OTAの後、最初に再起動せず、マネージャのフラッシュ/パッチカーネルインターフェイスに移動し、`GKI/non_GKI 取り付け`を見つけ、フラッシュする必要があるAnykernel3カーネルzipファイルを選択し、フラッシュするためにシステムの現在の実行スロットと反対のスロットを選択し、GKIモードアップデートを保持するために再起動します(この方法は、現時点ではすべてのnon_GKIデバイスでサポートされていませんので、各自でお試しください。 (この方法は、すべての非GKIデバイスでサポートされていませんので、ご自身でお試しください)。
|
||||
- または、LKMモードを使用して未使用のスロットにインストールします(OTA後)。
|
||||
## ROOT を保持した状態でのシステムアップデートの方法
|
||||
|
||||
## 互換性ステータス
|
||||
- KernelSU(v1.0.0より前のバージョン)はAndroid GKI 2.0デバイス(カーネル5.10以上)を公式にサポートしています。
|
||||
- 始めに OTA 後すぐに再起動せずにマネージャーのカーネルのフラッシュ、パッチのインターフェースを開いて`GKI/非 GKI のインストール`を見つけます。フラッシュする AnyKernel3 の zip ファイルを選択し、フラッシュする実行中のスロットと逆のスロットを選択後に再起動をして GKI モードの更新が保持できます (この方法はすべての非 GKI のデバイスが対応している訳ではないので、自分でお試しください。これは非 GKI のデバイスで TWRP を使用する最も安全な方法です)。
|
||||
- または LKM モードを使用して未使用のスロットにインストールします (OTA後)。
|
||||
|
||||
- 古いカーネル(4.4+)も互換性がありますが、カーネルは手動でビルドする必要があります。
|
||||
## 互換性の状態
|
||||
|
||||
- KernelSU は追加のリバースポートを通じて 3.x カーネル (3.4-3.18) をサポートしています。
|
||||
- KernelSU (v1.0.0 より前) は Android GKI 2.0 のデバイス (カーネル 5.10 以降) を公式に対応しています。
|
||||
|
||||
- 現在は `arm64-v8a`、`armeabi-v7a (bare)`、いくつかの `X86_64` をサポートしています。
|
||||
- 古いカーネル (4.4 以降) も互換性がありますが、カーネルを手動で再ビルドする必要があります。
|
||||
|
||||
- KernelSU は追加のリバースポートを通じて 3.x カーネル (3.4-3.18) で対応可能です。
|
||||
|
||||
- 現在 `arm64-v8a`, `armeabi-v7a (bare)` および一部の `X86_64` に対応しています。
|
||||
|
||||
## その他のリンク
|
||||
|
||||
**監督に翻訳を提出する必要がある場合は、https://crowdin.com/project/SukiSU-Ultra。
|
||||
**マネージャーの翻訳を行う場合** https://crowdin.com/project/SukiSU-Ultra
|
||||
|
||||
- [GKI](https://github.com/ShirkNeko/GKI_KernelSU_SUSFS)
|
||||
- [その他パッチ済み GKI](https://github.com/ShirkNeko/GKI_KernelSU_SUSFS) ZRAM パッチ、KPM、susfs が含まれています...
|
||||
- [パッチの少ない GKI](https://github.com/MiRinFork/GKI_SukiSU_SUSFS/releases) susfs のみ
|
||||
- [OnePlus](https://github.com/ShirkNeko/Action_OnePlus_MKSU_SUSFS)
|
||||
|
||||
## フックの方式
|
||||
|
||||
- この方式は (https://github.com/rsuntk/KernelSU) のフック方式を参照してください。
|
||||
|
||||
1. **KPROBES フック:**
|
||||
- 読み込み可能なカーネルモジュールの場合 (LKM)
|
||||
- GKI カーネルのデフォルトとなるフック方式
|
||||
- `CONFIG_KPROBES=y` が必要です
|
||||
|
||||
2. **手動でフック:**
|
||||
- 標準の KernelSU フック: https://kernelsu.org/guide/how-to-integrate-for-non-gki.html#manually-modify-the-kernel-source
|
||||
- backslashxx syscall フック: https://github.com/backslashxx/KernelSU/issues/5
|
||||
- 非 GKI カーネル用のデフォルトフッキングメソッド
|
||||
- `CONFIG_KSU_MANUAL_HOOK=y` が必要です
|
||||
|
||||
## 使い方
|
||||
|
||||
### ユニバーサルGKI
|
||||
### Universal GKI
|
||||
|
||||
https://kernelsu.org/zh_CN/guide/installation.html をご参照ください。
|
||||
**すべて**参照してください https://kernelsu.org/ja_JP/guide/installation.html
|
||||
|
||||
> [!Note]
|
||||
> 1.Xiaomi、Redmi、Samsung などの GKI 2.0 を搭載したデバイス用 (Meizu、Yiga、Zenith、oppo などのマジックカーネルを搭載したメーカーは除く)。
|
||||
> 2. [more links](#%E6%9B%B4%E5%A4%9A%E9%93%BE%E6%8E%A5) で GKI ビルドを検索します。 デバイスのカーネルバージョンを検索します。 次に、それをダウンロードし、TWRPまたはカーネルフラッシングツールを使用して、AnyKernel3の接尾辞が付いたzipファイルをフラッシュします。
|
||||
> 接尾辞なしの.zipアーカイブは非圧縮で、接尾辞gzはTenguetモデルで使用されている圧縮方法です。
|
||||
>
|
||||
> 1. Xiaomi、Redmi、Samsung などの GKI 2.0 を搭載したデバイス向け (Meizu、OnePlus、Zenith、Oppo などカーネルが変更されているメーカーを除く)
|
||||
> 2. GKI のビルドは[その他のリンク](#その他のリンク)から入手できます。デバイスのカーネルバージョンを確認してください。ダウンロード後に TWRP またはカーネルフラッシュツールを使用して AnyKernel3 の接頭辞を持つ zip ファイルをフラッシュしてください。Pixel のユーザーは、パッチの少ない GKI を使用する必要があります。
|
||||
> 3. 接頭辞のない .zip アーカイブは圧縮されていません。.gz の接頭辞は Tenguet モデルで使用される圧縮になります。
|
||||
|
||||
### OnePlus
|
||||
|
||||
1. `その他のリンク`の項目に記載されているリンクを開き、デバイス情報を使用してカスタマイズされたカーネルをビルドし、AnyKernel3 の接頭辞を持つ .zip ファイルをフラッシュします。
|
||||
@@ -111,32 +116,32 @@ https://kernelsu.org/zh_CN/guide/installation.html をご参照ください。
|
||||
|
||||
## トラブルシューティング
|
||||
|
||||
1.KernelSU Managerのアンインストールができない。 →パッケージ名com.sony.playmemories.mobile.KernelSU Managerのアプリケーションをアンインストールする。
|
||||
1. KernelSU Manager のアンインストールが停止してしまう → com.sony.playmemories.mobile のアプリをアンインストールしてください。
|
||||
|
||||
## ライセンス
|
||||
|
||||
- `kernel` ディレクトリ以下のファイルは[GPL-2.0-only](https://www.gnu.org/licenses/old-licenses/gpl-2.0.en.html)です。
|
||||
- アニメキャラクターの絵文字を含むファイル `ic_launcher(?!.*alt.*).*` の画像は[五十根大虾仁](https://space.bilibili.com/370927)が著作権を所有しており、画像内のブランド知的財産権は[明风OuO](https://space.bilibili.com/274939213)が所有しています。ベクトル化は @MiRinChan が行っています。これらのファイルを使用する前に、[Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International](https://creativecommons.org/licenses/by-nc-sa/4.0/legalcode.txt)に準拠することに加えて、これらの芸術コンテンツを使用するには、2人の著者の許可にも従う必要があります。
|
||||
- 上記のファイルまたはディレクトリを除き、その他のすべての部分は[GPL-3.0以降](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) のライセンスに基づいています。
|
||||
|
||||
- アニメキャラクターの絵文字を含む `ic_launcher(?!.*alt.*).*` の画像は、[五十根大虾仁](https://space.bilibili.com/370927)が著作権を所有しています。画像に含まれるブランドの知的財産権は[明风 OuO](https://space.bilibili.com/274939213)が所有しています。ベクトル化は @MiRinChan が行っています。これらのファイルを使用する前に[クリエイティブコモンズ 表示 - 非営利 - 継承 4.0 国際](https://creativecommons.org/licenses/by-nc-sa/4.0/legalcode.txt)に準拠することに加え、これらの芸術的コンテンツを使用するためには 2 名の著者の許可に従う必要があります。
|
||||
|
||||
## スポンサーシップの一覧
|
||||
|
||||
- [Ktouls](https://github.com/Ktouls) 応援をしてくれたことに感謝。
|
||||
- [zaoqi123](https://github.com/zaoqi123) ミルクティーを買ってあげるのも良い考えですね。
|
||||
- [wswzgdg](https://github.com/wswzgdg) このプロジェクトを支援していただき、ありがとうございます。
|
||||
- [yspbwx2010](https://github.com/yspbwx2010) どうもありがとう。
|
||||
- [DARKWWEE](https://github.com/DARKWWEE) ラオウ100USDTありがとう!
|
||||
- [Saksham Singla](https://github.com/TypeFlu) ウェブサイトの提供およびメンテナンス
|
||||
- [OukaroMF](https://github.com/OukaroMF) ウェブサイトドメイン名の寄付
|
||||
- [Ktouls](https://github.com/Ktouls) 応援してくれてありがとう
|
||||
- [zaoqi123](https://github.com/zaoqi123) ミルクティーを買ってあげるのも良い考えですね
|
||||
- [wswzgdg](https://github.com/wswzgdg) このプロジェクトにご支援いただき、ありがとうございます
|
||||
- [yspbwx2010](https://github.com/yspbwx2010) ありがとうございます
|
||||
- [DARKWWEE](https://github.com/DARKWWEE) ラオスから 100 USDT の支援に感謝します
|
||||
- [Saksham Singla](https://github.com/TypeFlu) ウェブサイトの提供とメンテナンス
|
||||
- [OukaroMF](https://github.com/OukaroMF) ウェブサイトのドメインと寄付
|
||||
|
||||
## 貢献者
|
||||
|
||||
- [KernelSU](https://github.com/tiann/KernelSU): オリジナルのプロジェクトです。
|
||||
- [MKSU](https://github.com/5ec1cff/KernelSU): 使用しているプロジェクトです。
|
||||
- [RKSU](https://github.com/rsuntk/KernelsU): このプロジェクトのカーネルを使用して非 GKI デバイスのサポートを追加しています。
|
||||
- [susfs](https://gitlab.com/simonpunk/susfs4ksu):使用している susfs ファイルシステムです。
|
||||
- [KernelSU](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 ユーティリティを使用しています。
|
||||
- [KernelPatch](https://github.com/bmax121/KernelPatch): KernelPatch はカーネルモジュールの APatch 実装での重要な部分となります。
|
||||
- [KernelSU](https://github.com/tiann/KernelSU): オリジナルのプロジェクト
|
||||
- [MKSU](https://github.com/5ec1cff/KernelSU): 使用しているプロジェクト
|
||||
- [RKSU](https://github.com/rsuntk/KernelsU): このプロジェクトのカーネルを使用した非 GKI デバイスのサポートの再導入
|
||||
- [susfs](https://gitlab.com/simonpunk/susfs4ksu): susfs ファイルシステムの使用
|
||||
- [KernelSU](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): いくつかの root キットユーティリティ
|
||||
- [KernelPatch](https://github.com/bmax121/KernelPatch): KernelPatch はカーネルモジュールの APatch 実装の重要な部分での活用
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
|
||||
**实验性! 使用风险自负!**
|
||||
|
||||
> 这是非官方分支,保留所有权利 [@tiann](https://github.com/tiann)
|
||||
> 这是非官方分支,[@tiann](https://github.com/tiann) 有权保留所有权利
|
||||
>
|
||||
> 但是,我们将会在未来成为一个单独维护的 KSU 分支
|
||||
|
||||
@@ -30,6 +30,12 @@ curl -LSs "https://raw.githubusercontent.com/SukiSU-Ultra/SukiSU-Ultra/main/kern
|
||||
|
||||
1. 直接使用 susfs-main 或者其他 susfs-\* 分支,不需要再集成 susfs (支持非 GKI 设备构建)
|
||||
|
||||
> [!Note]
|
||||
>
|
||||
> - 因 SuSFS 版本的变化和不可测问题
|
||||
> - 本 susfs-main 分支只在完整更新后再合并最新新版本
|
||||
> - 请随时留意 susfs 分支的变化情况以免导致构建失败以及各种版本导致的不兼容问题
|
||||
|
||||
```
|
||||
curl -LSs "https://raw.githubusercontent.com/SukiSU-Ultra/SukiSU-Ultra/main/kernel/setup.sh" | bash -s susfs-main
|
||||
```
|
||||
@@ -46,7 +52,9 @@ curl -LSs "https://raw.githubusercontent.com/SukiSU-Ultra/SukiSU-Ultra/main/kern
|
||||
|
||||
2. **手动钩子:**
|
||||
- 标准的 KernelSU 钩子:https://kernelsu.org/guide/how-to-integrate-for-non-gki.html#manually-modify-the-kernel-source
|
||||
- backslashxx 的 syscall 手动钩子:https://github.com/backslashxx/KernelSU/issues/5
|
||||
|
||||
- backslashxx 的 syscall 手动钩子:https://github.com/backslashxx/KernelSU/issues/5 (v1.5 版本暂不可用,如要使用请使用 v1.4 版本,或者标准 KernelSU 钩子)
|
||||
|
||||
- 非 GKI 内核的默认挂钩方法
|
||||
- 需要 `CONFIG_KSU_MANUAL_HOOK=y`
|
||||
|
||||
@@ -120,6 +128,7 @@ KPM 模板地址: https://github.com/udochina/KPM-Build-Anywhere
|
||||
4. 恢复对非 GKI 2.0 内核的支持
|
||||
5. 更多自定义功能
|
||||
6. 对 KPM 内核模块的支持
|
||||
7. 引入SuSFS配置的管理器以及进阶功能
|
||||
|
||||
## 疑难解答
|
||||
|
||||
|
||||
@@ -24,5 +24,6 @@ config KPM
|
||||
Enabling this option will activate the KPM feature of SukiSU.
|
||||
This option is suitable for scenarios where you need to force KPM to be enabled.
|
||||
but it may affect system stability.
|
||||
|
||||
select KALLSYMS
|
||||
select KALLSYMS_ALL
|
||||
endmenu
|
||||
|
||||
@@ -22,29 +22,53 @@ obj-$(CONFIG_KPM) += kpm/
|
||||
REPO_OWNER := SukiSU-Ultra
|
||||
REPO_NAME := SukiSU-Ultra
|
||||
REPO_BRANCH := main
|
||||
KSU_VERSION_API := 3.1.7
|
||||
|
||||
GIT_BIN := /usr/bin/env PATH="$$PATH":/usr/bin:/usr/local/bin git
|
||||
CURL_BIN := /usr/bin/env PATH="$$PATH":/usr/bin:/usr/local/bin curl
|
||||
|
||||
KSU_GITHUB_VERSION := $(shell $(CURL_BIN) -sI "https://api.github.com/repos/$(REPO_OWNER)/$(REPO_NAME)/commits?sha=$(REPO_BRANCH)&per_page=1" | grep -i "link:" | sed -n 's/.*page=\([0-9]*\)>; rel="last".*/\1/p')
|
||||
KSU_GITHUB_VERSION := $(shell $(CURL_BIN) -s "https://api.github.com/repos/$(REPO_OWNER)/$(REPO_NAME)/releases/latest" | grep '"tag_name":' | sed -E 's/.*"v([^"]+)".*/\1/')
|
||||
KSU_GITHUB_VERSION_COMMIT := $(shell $(CURL_BIN) -sI "https://api.github.com/repos/$(REPO_OWNER)/$(REPO_NAME)/commits?sha=$(REPO_BRANCH)&per_page=1" | grep -i "link:" | sed -n 's/.*page=\([0-9]*\)>; rel="last".*/\1/p')
|
||||
|
||||
ifeq ($(KSU_GITHUB_VERSION),)
|
||||
ifeq ($(shell test -e $(srctree)/$(src)/../.git; echo $$?),0)
|
||||
LOCAL_GIT_EXISTS := $(shell test -e $(srctree)/$(src)/../.git && echo 1 || echo 0)
|
||||
|
||||
define get_ksu_version_full
|
||||
v$1-$(shell cd $(srctree)/$(src); $(GIT_BIN) rev-parse --short=8 HEAD)@$(shell cd $(srctree)/$(src); $(GIT_BIN) rev-parse --abbrev-ref HEAD)
|
||||
endef
|
||||
|
||||
ifeq ($(KSU_GITHUB_VERSION_COMMIT),)
|
||||
ifeq ($(LOCAL_GIT_EXISTS),1)
|
||||
$(shell cd $(srctree)/$(src); [ -f ../.git/shallow ] && $(GIT_BIN) fetch --unshallow)
|
||||
KSU_LOCAL_VERSION := $(shell cd $(srctree)/$(src); $(GIT_BIN) rev-list --count HEAD)
|
||||
$(eval KSU_VERSION := $(shell expr 10000 + $(KSU_LOCAL_VERSION) + 700))
|
||||
$(info -- SukiSU-Ultra version (local .git): $(KSU_VERSION))
|
||||
KSU_LOCAL_VERSION := $(shell cd $(srctree)/$(src); $(GIT_BIN) rev-list --count $(REPO_BRANCH))
|
||||
KSU_VERSION := $(shell expr 10000 + $(KSU_LOCAL_VERSION) + 700)
|
||||
$(info -- $(REPO_NAME) version (local .git): $(KSU_VERSION))
|
||||
else
|
||||
$(eval KSU_VERSION := 13000)
|
||||
KSU_VERSION := 13000
|
||||
$(warning -- Could not fetch version online or via local .git! Using fallback version: $(KSU_VERSION))
|
||||
endif
|
||||
else
|
||||
$(eval KSU_VERSION := $(shell expr 10000 + $(KSU_GITHUB_VERSION) + 700))
|
||||
$(info -- SukiSU-Ultra version (GitHub): $(KSU_VERSION))
|
||||
KSU_VERSION := $(shell expr 10000 + $(KSU_GITHUB_VERSION_COMMIT) + 700)
|
||||
$(info -- $(REPO_NAME) version (GitHub): $(KSU_VERSION))
|
||||
endif
|
||||
|
||||
ifeq ($(KSU_GITHUB_VERSION),)
|
||||
ifeq ($(LOCAL_GIT_EXISTS),1)
|
||||
$(shell cd $(srctree)/$(src); [ -f ../.git/shallow ] && $(GIT_BIN) fetch --unshallow)
|
||||
KSU_VERSION_FULL := $(call get_ksu_version_full,$(KSU_VERSION_API))
|
||||
$(info -- $(REPO_NAME) version (local .git): $(KSU_VERSION_FULL))
|
||||
$(info -- $(REPO_NAME) Formatted version (local .git): $(KSU_VERSION))
|
||||
else
|
||||
KSU_VERSION_FULL := v$(KSU_VERSION_API)-$(REPO_NAME)-unknown@unknown
|
||||
$(warning -- $(REPO_NAME) version: $(KSU_VERSION_FULL))
|
||||
endif
|
||||
else
|
||||
$(shell cd $(srctree)/$(src); [ -f ../.git/shallow ] && $(GIT_BIN) fetch --unshallow)
|
||||
KSU_VERSION_FULL := $(call get_ksu_version_full,$(KSU_GITHUB_VERSION))
|
||||
$(info -- $(REPO_NAME) version (Github): $(KSU_VERSION_FULL))
|
||||
endif
|
||||
|
||||
$(info -- SukiSU-Ultra version: $(KSU_VERSION))
|
||||
ccflags-y += -DKSU_VERSION=$(KSU_VERSION)
|
||||
ccflags-y += -DKSU_VERSION_FULL=\"$(KSU_VERSION_FULL)\"
|
||||
|
||||
ifndef KSU_EXPECTED_SIZE
|
||||
KSU_EXPECTED_SIZE := 0x35c
|
||||
|
||||
@@ -308,7 +308,7 @@ 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;
|
||||
u32 version_flags = 2;
|
||||
#ifdef MODULE
|
||||
version_flags |= 0x1;
|
||||
#endif
|
||||
@@ -319,6 +319,21 @@ int ksu_handle_prctl(int option, unsigned long arg2, unsigned long arg3,
|
||||
return 0;
|
||||
}
|
||||
|
||||
// Allow root manager to get full version strings
|
||||
if (arg2 == CMD_GET_FULL_VERSION) {
|
||||
char ksu_version_full[KSU_FULL_VERSION_STRING] = {0};
|
||||
#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 13, 0)
|
||||
strscpy(ksu_version_full, KSU_VERSION_FULL, KSU_FULL_VERSION_STRING);
|
||||
#else
|
||||
strlcpy(ksu_version_full, KSU_VERSION_FULL, KSU_FULL_VERSION_STRING);
|
||||
#endif
|
||||
if (copy_to_user((void __user *)arg3, ksu_version_full, KSU_FULL_VERSION_STRING)) {
|
||||
pr_err("prctl reply error, cmd: %lu\n", arg2);
|
||||
return -EFAULT;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (arg2 == CMD_REPORT_EVENT) {
|
||||
if (!from_root) {
|
||||
return 0;
|
||||
|
||||
@@ -23,6 +23,9 @@
|
||||
#define CMD_UID_SHOULD_UMOUNT 13
|
||||
#define CMD_IS_SU_ENABLED 14
|
||||
#define CMD_ENABLE_SU 15
|
||||
|
||||
#define CMD_GET_FULL_VERSION 30
|
||||
|
||||
#define CMD_ENABLE_KPM 100
|
||||
|
||||
#define EVENT_POST_FS_DATA 1
|
||||
@@ -35,6 +38,12 @@
|
||||
#define KSU_MAX_GROUPS 32
|
||||
#define KSU_SELINUX_DOMAIN 64
|
||||
|
||||
// SukiSU Ultra kernel su version full strings
|
||||
#ifndef KSU_VERSION_FULL
|
||||
#define KSU_VERSION_FULL "v3.x-00000000@unknown"
|
||||
#endif
|
||||
#define KSU_FULL_VERSION_STRING 255
|
||||
|
||||
struct root_profile {
|
||||
int32_t uid;
|
||||
int32_t gid;
|
||||
|
||||
Binary file not shown.
@@ -346,3 +346,9 @@ NativeBridgeNP(getSusfsFeatureStatus, jobject) {
|
||||
|
||||
return obj;
|
||||
}
|
||||
|
||||
NativeBridgeNP(getFullVersion, jstring) {
|
||||
char buff[255] = { 0 };
|
||||
get_full_version((char *) &buff);
|
||||
return GetEnvironment()->NewStringUTF(env, buff);
|
||||
}
|
||||
@@ -30,6 +30,9 @@
|
||||
#define CMD_IS_UID_SHOULD_UMOUNT 13
|
||||
#define CMD_IS_SU_ENABLED 14
|
||||
#define CMD_ENABLE_SU 15
|
||||
|
||||
#define CMD_GET_VERSION_FULL 30
|
||||
|
||||
#define CMD_ENABLE_KPM 100
|
||||
#define CMD_HOOK_TYPE 101
|
||||
#define CMD_GET_SUSFS_FEATURE_STATUS 102
|
||||
@@ -58,14 +61,18 @@ bool become_manager(const char* pkg) {
|
||||
static bool is_lkm;
|
||||
int get_version() {
|
||||
int32_t version = -1;
|
||||
int32_t lkm = 0;
|
||||
ksuctl(CMD_GET_VERSION, &version, &lkm);
|
||||
if (!is_lkm && lkm != 0) {
|
||||
int32_t flags = 0;
|
||||
ksuctl(CMD_GET_VERSION, &version, &flags);
|
||||
if (!is_lkm && (flags & 0x1)) {
|
||||
is_lkm = true;
|
||||
}
|
||||
return version;
|
||||
}
|
||||
|
||||
void get_full_version(char* buff) {
|
||||
ksuctl(CMD_GET_VERSION_FULL, buff, NULL);
|
||||
}
|
||||
|
||||
bool get_allow_list(int *uids, int *size) {
|
||||
return ksuctl(CMD_GET_SU_LIST, uids, size);
|
||||
}
|
||||
|
||||
@@ -10,6 +10,8 @@
|
||||
|
||||
bool become_manager(const char *);
|
||||
|
||||
void get_full_version(char* buff);
|
||||
|
||||
int get_version();
|
||||
|
||||
bool get_allow_list(int *uids, int *size);
|
||||
|
||||
@@ -17,6 +17,7 @@ object Natives {
|
||||
// 10977: change groups_count and groups to avoid overflow write
|
||||
// 11071: Fix the issue of failing to set a custom SELinux type.
|
||||
const val MINIMAL_SUPPORTED_KERNEL = 11071
|
||||
const val MINIMAL_SUPPORTED_KERNEL_FULL = "v3.1.5"
|
||||
|
||||
// 11640: Support query working mode, LKM or GKI
|
||||
// when MINIMAL_SUPPORTED_KERNEL > 11640, we can remove this constant.
|
||||
@@ -31,6 +32,23 @@ object Natives {
|
||||
const val ROOT_UID = 0
|
||||
const val ROOT_GID = 0
|
||||
|
||||
external fun getFullVersion(): String
|
||||
|
||||
fun getSimpleVersionFull(): String {
|
||||
val fullVersion = getFullVersion()
|
||||
val startIndex = fullVersion.indexOf('v')
|
||||
if (startIndex < 0) {
|
||||
return fullVersion
|
||||
}
|
||||
val endIndex = fullVersion.indexOf('-', startIndex)
|
||||
val versionStr = if (endIndex > startIndex) {
|
||||
fullVersion.substring(startIndex, endIndex)
|
||||
} else {
|
||||
fullVersion.substring(startIndex)
|
||||
}
|
||||
return "v" + (Regex("""\d+(\.\d+)*""").find(versionStr)?.value ?: versionStr)
|
||||
}
|
||||
|
||||
init {
|
||||
System.loadLibrary("zako")
|
||||
}
|
||||
@@ -98,7 +116,14 @@ object Natives {
|
||||
}
|
||||
|
||||
fun requireNewKernel(): Boolean {
|
||||
return version < MINIMAL_SUPPORTED_KERNEL
|
||||
if (version < MINIMAL_SUPPORTED_KERNEL) {
|
||||
return true
|
||||
}
|
||||
val simpleVersionFull = getSimpleVersionFull()
|
||||
if (simpleVersionFull.isEmpty()) {
|
||||
return false
|
||||
}
|
||||
return simpleVersionFull < MINIMAL_SUPPORTED_KERNEL_FULL
|
||||
}
|
||||
|
||||
@Immutable
|
||||
@@ -120,27 +145,7 @@ object Natives {
|
||||
val statusMagicMount: Boolean = false,
|
||||
val statusOverlayfsAutoKstat: Boolean = false,
|
||||
val statusSusSu: Boolean = false
|
||||
) : Parcelable {
|
||||
fun toMap(): Map<String, Boolean> {
|
||||
return mapOf(
|
||||
"CONFIG_KSU_SUSFS_SUS_PATH" to statusSusPath,
|
||||
"CONFIG_KSU_SUSFS_SUS_MOUNT" to statusSusMount,
|
||||
"CONFIG_KSU_SUSFS_AUTO_ADD_SUS_KSU_DEFAULT_MOUNT" to statusAutoDefaultMount,
|
||||
"CONFIG_KSU_SUSFS_AUTO_ADD_SUS_BIND_MOUNT" to statusAutoBindMount,
|
||||
"CONFIG_KSU_SUSFS_SUS_KSTAT" to statusSusKstat,
|
||||
"CONFIG_KSU_SUSFS_TRY_UMOUNT" to statusTryUmount,
|
||||
"CONFIG_KSU_SUSFS_AUTO_ADD_TRY_UMOUNT_FOR_BIND_MOUNT" to statusAutoTryUmountBind,
|
||||
"CONFIG_KSU_SUSFS_SPOOF_UNAME" to statusSpoofUname,
|
||||
"CONFIG_KSU_SUSFS_ENABLE_LOG" to statusEnableLog,
|
||||
"CONFIG_KSU_SUSFS_HIDE_KSU_SUSFS_SYMBOLS" to statusHideSymbols,
|
||||
"CONFIG_KSU_SUSFS_SPOOF_CMDLINE_OR_BOOTCONFIG" to statusSpoofCmdline,
|
||||
"CONFIG_KSU_SUSFS_OPEN_REDIRECT" to statusOpenRedirect,
|
||||
"CONFIG_KSU_SUSFS_HAS_MAGIC_MOUNT" to statusMagicMount,
|
||||
"CONFIG_KSU_SUSFS_SUS_OVERLAYFS" to statusOverlayfsAutoKstat,
|
||||
"CONFIG_KSU_SUSFS_SUS_SU" to statusSusSu
|
||||
)
|
||||
}
|
||||
}
|
||||
) : Parcelable
|
||||
|
||||
|
||||
@Immutable
|
||||
|
||||
@@ -20,6 +20,7 @@ import androidx.compose.material3.OutlinedTextField
|
||||
import androidx.compose.material3.Text
|
||||
import androidx.compose.material3.TextButton
|
||||
import androidx.compose.runtime.Composable
|
||||
import androidx.compose.runtime.LaunchedEffect
|
||||
import androidx.compose.runtime.getValue
|
||||
import androidx.compose.runtime.mutableIntStateOf
|
||||
import androidx.compose.runtime.mutableStateOf
|
||||
@@ -42,10 +43,18 @@ fun AddPathDialog(
|
||||
isLoading: Boolean,
|
||||
titleRes: Int,
|
||||
labelRes: Int,
|
||||
placeholderRes: Int
|
||||
placeholderRes: Int,
|
||||
initialValue: String = ""
|
||||
) {
|
||||
var newPath by remember { mutableStateOf("") }
|
||||
|
||||
// 当对话框显示时,设置初始值
|
||||
LaunchedEffect(showDialog, initialValue) {
|
||||
if (showDialog) {
|
||||
newPath = initialValue
|
||||
}
|
||||
}
|
||||
|
||||
if (showDialog) {
|
||||
AlertDialog(
|
||||
onDismissRequest = onDismiss,
|
||||
@@ -77,7 +86,7 @@ fun AddPathDialog(
|
||||
enabled = newPath.isNotBlank() && !isLoading,
|
||||
shape = RoundedCornerShape(8.dp)
|
||||
) {
|
||||
Text(stringResource(R.string.susfs_add))
|
||||
Text(stringResource(if (initialValue.isNotEmpty()) R.string.susfs_save else R.string.add))
|
||||
}
|
||||
},
|
||||
dismissButton = {
|
||||
@@ -105,18 +114,28 @@ fun AddTryUmountDialog(
|
||||
showDialog: Boolean,
|
||||
onDismiss: () -> Unit,
|
||||
onConfirm: (String, Int) -> Unit,
|
||||
isLoading: Boolean
|
||||
isLoading: Boolean,
|
||||
initialPath: String = "",
|
||||
initialMode: Int = 0
|
||||
) {
|
||||
var newUmountPath by remember { mutableStateOf("") }
|
||||
var newUmountMode by remember { mutableIntStateOf(0) }
|
||||
var umountModeExpanded by remember { mutableStateOf(false) }
|
||||
|
||||
// 当对话框显示时,设置初始值
|
||||
LaunchedEffect(showDialog, initialPath, initialMode) {
|
||||
if (showDialog) {
|
||||
newUmountPath = initialPath
|
||||
newUmountMode = initialMode
|
||||
}
|
||||
}
|
||||
|
||||
if (showDialog) {
|
||||
AlertDialog(
|
||||
onDismissRequest = onDismiss,
|
||||
title = {
|
||||
Text(
|
||||
stringResource(R.string.susfs_add_try_umount),
|
||||
stringResource(if (initialPath.isNotEmpty()) R.string.susfs_edit_try_umount else R.string.susfs_add_try_umount),
|
||||
style = MaterialTheme.typography.titleLarge,
|
||||
fontWeight = FontWeight.Bold
|
||||
)
|
||||
@@ -186,7 +205,7 @@ fun AddTryUmountDialog(
|
||||
enabled = newUmountPath.isNotBlank() && !isLoading,
|
||||
shape = RoundedCornerShape(8.dp)
|
||||
) {
|
||||
Text(stringResource(R.string.susfs_add))
|
||||
Text(stringResource(if (initialPath.isNotEmpty()) R.string.susfs_save else R.string.add))
|
||||
}
|
||||
},
|
||||
dismissButton = {
|
||||
@@ -214,7 +233,8 @@ fun AddKstatStaticallyDialog(
|
||||
showDialog: Boolean,
|
||||
onDismiss: () -> Unit,
|
||||
onConfirm: (String, String, String, String, String, String, String, String, String, String, String, String, String) -> Unit,
|
||||
isLoading: Boolean
|
||||
isLoading: Boolean,
|
||||
initialConfig: String = ""
|
||||
) {
|
||||
var newKstatPath by remember { mutableStateOf("") }
|
||||
var newKstatIno by remember { mutableStateOf("") }
|
||||
@@ -230,12 +250,49 @@ fun AddKstatStaticallyDialog(
|
||||
var newKstatBlocks by remember { mutableStateOf("") }
|
||||
var newKstatBlksize by remember { mutableStateOf("") }
|
||||
|
||||
// 当对话框显示时,解析初始配置
|
||||
LaunchedEffect(showDialog, initialConfig) {
|
||||
if (showDialog && initialConfig.isNotEmpty()) {
|
||||
val parts = initialConfig.split("|")
|
||||
if (parts.size >= 13) {
|
||||
newKstatPath = parts[0]
|
||||
newKstatIno = if (parts[1] == "default") "" else parts[1]
|
||||
newKstatDev = if (parts[2] == "default") "" else parts[2]
|
||||
newKstatNlink = if (parts[3] == "default") "" else parts[3]
|
||||
newKstatSize = if (parts[4] == "default") "" else parts[4]
|
||||
newKstatAtime = if (parts[5] == "default") "" else parts[5]
|
||||
newKstatAtimeNsec = if (parts[6] == "default") "" else parts[6]
|
||||
newKstatMtime = if (parts[7] == "default") "" else parts[7]
|
||||
newKstatMtimeNsec = if (parts[8] == "default") "" else parts[8]
|
||||
newKstatCtime = if (parts[9] == "default") "" else parts[9]
|
||||
newKstatCtimeNsec = if (parts[10] == "default") "" else parts[10]
|
||||
newKstatBlocks = if (parts[11] == "default") "" else parts[11]
|
||||
newKstatBlksize = if (parts[12] == "default") "" else parts[12]
|
||||
}
|
||||
} else if (showDialog && initialConfig.isEmpty()) {
|
||||
// 清空所有字段
|
||||
newKstatPath = ""
|
||||
newKstatIno = ""
|
||||
newKstatDev = ""
|
||||
newKstatNlink = ""
|
||||
newKstatSize = ""
|
||||
newKstatAtime = ""
|
||||
newKstatAtimeNsec = ""
|
||||
newKstatMtime = ""
|
||||
newKstatMtimeNsec = ""
|
||||
newKstatCtime = ""
|
||||
newKstatCtimeNsec = ""
|
||||
newKstatBlocks = ""
|
||||
newKstatBlksize = ""
|
||||
}
|
||||
}
|
||||
|
||||
if (showDialog) {
|
||||
AlertDialog(
|
||||
onDismissRequest = onDismiss,
|
||||
title = {
|
||||
Text(
|
||||
stringResource(R.string.add_kstat_statically_title),
|
||||
stringResource(if (initialConfig.isNotEmpty()) R.string.edit_kstat_statically_title else R.string.add_kstat_statically_title),
|
||||
style = MaterialTheme.typography.titleLarge,
|
||||
fontWeight = FontWeight.Bold
|
||||
)
|
||||
@@ -431,7 +488,7 @@ fun AddKstatStaticallyDialog(
|
||||
enabled = newKstatPath.isNotBlank() && !isLoading,
|
||||
shape = RoundedCornerShape(8.dp)
|
||||
) {
|
||||
Text("添加")
|
||||
Text(stringResource(if (initialConfig.isNotEmpty()) R.string.susfs_save else R.string.add))
|
||||
}
|
||||
},
|
||||
dismissButton = {
|
||||
|
||||
@@ -19,6 +19,7 @@ import androidx.compose.material.icons.Icons
|
||||
import androidx.compose.material.icons.filled.Add
|
||||
import androidx.compose.material.icons.filled.Folder
|
||||
import androidx.compose.material.icons.filled.PlayArrow
|
||||
import androidx.compose.material.icons.filled.Security
|
||||
import androidx.compose.material.icons.filled.Settings
|
||||
import androidx.compose.material.icons.filled.Storage
|
||||
import androidx.compose.material3.Button
|
||||
@@ -27,6 +28,7 @@ import androidx.compose.material3.CardDefaults
|
||||
import androidx.compose.material3.Icon
|
||||
import androidx.compose.material3.MaterialTheme
|
||||
import androidx.compose.material3.OutlinedTextField
|
||||
import androidx.compose.material3.Switch
|
||||
import androidx.compose.material3.Text
|
||||
import androidx.compose.runtime.Composable
|
||||
import androidx.compose.ui.Alignment
|
||||
@@ -34,6 +36,7 @@ import androidx.compose.ui.Modifier
|
||||
import androidx.compose.ui.res.stringResource
|
||||
import androidx.compose.ui.text.font.FontWeight
|
||||
import androidx.compose.ui.unit.dp
|
||||
import androidx.compose.ui.unit.sp
|
||||
import com.sukisu.ultra.R
|
||||
import com.sukisu.ultra.ui.screen.extensions.AddKstatPathItemCard
|
||||
import com.sukisu.ultra.ui.screen.extensions.EmptyStateCard
|
||||
@@ -42,6 +45,7 @@ import com.sukisu.ultra.ui.screen.extensions.KstatConfigItemCard
|
||||
import com.sukisu.ultra.ui.screen.extensions.PathItemCard
|
||||
import com.sukisu.ultra.ui.screen.extensions.SusMountHidingControlCard
|
||||
import com.sukisu.ultra.ui.util.SuSFSManager
|
||||
import com.sukisu.ultra.ui.util.SuSFSManager.isSusVersion_1_5_8
|
||||
|
||||
/**
|
||||
* SUS路径内容组件
|
||||
@@ -51,7 +55,8 @@ fun SusPathsContent(
|
||||
susPaths: Set<String>,
|
||||
isLoading: Boolean,
|
||||
onAddPath: () -> Unit,
|
||||
onRemovePath: (String) -> Unit
|
||||
onRemovePath: (String) -> Unit,
|
||||
onEditPath: ((String) -> Unit)? = null
|
||||
) {
|
||||
Box(modifier = Modifier.fillMaxSize()) {
|
||||
LazyColumn(
|
||||
@@ -70,6 +75,7 @@ fun SusPathsContent(
|
||||
path = path,
|
||||
icon = Icons.Default.Folder,
|
||||
onDelete = { onRemovePath(path) },
|
||||
onEdit = if (onEditPath != null) { { onEditPath(path) } } else null,
|
||||
isLoading = isLoading
|
||||
)
|
||||
}
|
||||
@@ -97,7 +103,7 @@ fun SusPathsContent(
|
||||
modifier = Modifier.size(24.dp)
|
||||
)
|
||||
Spacer(modifier = Modifier.width(8.dp))
|
||||
Text(text = stringResource(R.string.susfs_add))
|
||||
Text(text = stringResource(R.string.add))
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -116,6 +122,7 @@ fun SusMountsContent(
|
||||
isLoading: Boolean,
|
||||
onAddMount: () -> Unit,
|
||||
onRemoveMount: (String) -> Unit,
|
||||
onEditMount: ((String) -> Unit)? = null,
|
||||
onToggleHideSusMountsForAllProcs: (Boolean) -> Unit
|
||||
) {
|
||||
Box(modifier = Modifier.fillMaxSize()) {
|
||||
@@ -145,6 +152,7 @@ fun SusMountsContent(
|
||||
path = mount,
|
||||
icon = Icons.Default.Storage,
|
||||
onDelete = { onRemoveMount(mount) },
|
||||
onEdit = if (onEditMount != null) { { onEditMount(mount) } } else null,
|
||||
isLoading = isLoading
|
||||
)
|
||||
}
|
||||
@@ -172,7 +180,7 @@ fun SusMountsContent(
|
||||
modifier = Modifier.size(24.dp)
|
||||
)
|
||||
Spacer(modifier = Modifier.width(8.dp))
|
||||
Text(text = stringResource(R.string.susfs_add))
|
||||
Text(text = stringResource(R.string.add))
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -186,10 +194,13 @@ fun SusMountsContent(
|
||||
@Composable
|
||||
fun TryUmountContent(
|
||||
tryUmounts: Set<String>,
|
||||
umountForZygoteIsoService: Boolean,
|
||||
isLoading: Boolean,
|
||||
onAddUmount: () -> Unit,
|
||||
onRunUmount: () -> Unit,
|
||||
onRemoveUmount: (String) -> Unit
|
||||
onRemoveUmount: (String) -> Unit,
|
||||
onEditUmount: ((String) -> Unit)? = null,
|
||||
onToggleUmountForZygoteIsoService: (Boolean) -> Unit
|
||||
) {
|
||||
Box(modifier = Modifier.fillMaxSize()) {
|
||||
LazyColumn(
|
||||
@@ -197,6 +208,60 @@ fun TryUmountContent(
|
||||
.fillMaxSize(),
|
||||
verticalArrangement = Arrangement.spacedBy(12.dp)
|
||||
) {
|
||||
if (isSusVersion_1_5_8()) {
|
||||
item {
|
||||
Card(
|
||||
modifier = Modifier.fillMaxWidth(),
|
||||
colors = CardDefaults.cardColors(
|
||||
containerColor = MaterialTheme.colorScheme.surface
|
||||
),
|
||||
shape = RoundedCornerShape(12.dp)
|
||||
) {
|
||||
Row(
|
||||
modifier = Modifier
|
||||
.fillMaxWidth()
|
||||
.padding(12.dp),
|
||||
horizontalArrangement = Arrangement.SpaceBetween,
|
||||
verticalAlignment = Alignment.CenterVertically
|
||||
) {
|
||||
Column(
|
||||
modifier = Modifier.weight(1f)
|
||||
) {
|
||||
Row(
|
||||
verticalAlignment = Alignment.CenterVertically
|
||||
) {
|
||||
Icon(
|
||||
imageVector = Icons.Default.Security,
|
||||
contentDescription = null,
|
||||
tint = MaterialTheme.colorScheme.primary,
|
||||
modifier = Modifier.size(18.dp)
|
||||
)
|
||||
Spacer(modifier = Modifier.width(8.dp))
|
||||
Text(
|
||||
text = stringResource(R.string.umount_zygote_iso_service),
|
||||
style = MaterialTheme.typography.titleMedium,
|
||||
fontWeight = FontWeight.Medium,
|
||||
color = MaterialTheme.colorScheme.onSurface
|
||||
)
|
||||
}
|
||||
Spacer(modifier = Modifier.height(6.dp))
|
||||
Text(
|
||||
text = stringResource(R.string.umount_zygote_iso_service_description),
|
||||
style = MaterialTheme.typography.bodyMedium,
|
||||
color = MaterialTheme.colorScheme.onSurfaceVariant,
|
||||
lineHeight = 14.sp
|
||||
)
|
||||
}
|
||||
Switch(
|
||||
checked = umountForZygoteIsoService,
|
||||
onCheckedChange = onToggleUmountForZygoteIsoService,
|
||||
enabled = !isLoading
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (tryUmounts.isEmpty()) {
|
||||
item {
|
||||
EmptyStateCard(
|
||||
@@ -218,6 +283,7 @@ fun TryUmountContent(
|
||||
icon = Icons.Default.Storage,
|
||||
additionalInfo = stringResource(R.string.susfs_umount_mode_display, modeText, mode),
|
||||
onDelete = { onRemoveUmount(umountEntry) },
|
||||
onEdit = if (onEditUmount != null) { { onEditUmount(umountEntry) } } else null,
|
||||
isLoading = isLoading
|
||||
)
|
||||
}
|
||||
@@ -245,7 +311,7 @@ fun TryUmountContent(
|
||||
modifier = Modifier.size(24.dp)
|
||||
)
|
||||
Spacer(modifier = Modifier.width(8.dp))
|
||||
Text(text = stringResource(R.string.susfs_add))
|
||||
Text(text = stringResource(R.string.add))
|
||||
}
|
||||
|
||||
if (tryUmounts.isNotEmpty()) {
|
||||
@@ -282,7 +348,9 @@ fun KstatConfigContent(
|
||||
onAddKstatStatically: () -> Unit,
|
||||
onAddKstat: () -> Unit,
|
||||
onRemoveKstatConfig: (String) -> Unit,
|
||||
onEditKstatConfig: ((String) -> Unit)? = null,
|
||||
onRemoveAddKstat: (String) -> Unit,
|
||||
onEditAddKstat: ((String) -> Unit)? = null,
|
||||
onUpdateKstat: (String) -> Unit,
|
||||
onUpdateKstatFullClone: (String) -> Unit
|
||||
) {
|
||||
@@ -347,6 +415,7 @@ fun KstatConfigContent(
|
||||
KstatConfigItemCard(
|
||||
config = config,
|
||||
onDelete = { onRemoveKstatConfig(config) },
|
||||
onEdit = if (onEditKstatConfig != null) { { onEditKstatConfig(config) } } else null,
|
||||
isLoading = isLoading
|
||||
)
|
||||
}
|
||||
@@ -365,6 +434,7 @@ fun KstatConfigContent(
|
||||
AddKstatPathItemCard(
|
||||
path = path,
|
||||
onDelete = { onRemoveAddKstat(path) },
|
||||
onEdit = if (onEditAddKstat != null) { { onEditAddKstat(path) } } else null,
|
||||
onUpdate = { onUpdateKstat(path) },
|
||||
onUpdateFullClone = { onUpdateKstatFullClone(path) },
|
||||
isLoading = isLoading
|
||||
@@ -403,7 +473,7 @@ fun KstatConfigContent(
|
||||
modifier = Modifier.size(24.dp)
|
||||
)
|
||||
Spacer(modifier = Modifier.width(8.dp))
|
||||
Text(text = stringResource(R.string.susfs_add))
|
||||
Text(text = stringResource(R.string.add))
|
||||
}
|
||||
|
||||
Button(
|
||||
@@ -419,7 +489,7 @@ fun KstatConfigContent(
|
||||
modifier = Modifier.size(24.dp)
|
||||
)
|
||||
Spacer(modifier = Modifier.width(8.dp))
|
||||
Text(text = stringResource(R.string.susfs_add))
|
||||
Text(text = stringResource(R.string.add))
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -170,8 +170,8 @@ fun HomeScreen(navigator: DestinationsNavigator) {
|
||||
if (viewModel.systemStatus.requireNewKernel) {
|
||||
WarningCard(
|
||||
stringResource(id = R.string.require_kernel_version).format(
|
||||
viewModel.systemStatus.ksuVersion,
|
||||
Natives.MINIMAL_SUPPORTED_KERNEL
|
||||
Natives.getSimpleVersionFull(),
|
||||
Natives.MINIMAL_SUPPORTED_KERNEL_FULL
|
||||
)
|
||||
)
|
||||
}
|
||||
@@ -438,14 +438,16 @@ private fun StatusCard(
|
||||
|
||||
if (!isHideVersion) {
|
||||
Spacer(Modifier.height(4.dp))
|
||||
systemStatus.ksuFullVersion?.let {
|
||||
Text(
|
||||
text = stringResource(R.string.home_working_version, systemStatus.ksuVersion),
|
||||
text = stringResource(R.string.home_working_version, it),
|
||||
style = MaterialTheme.typography.bodyMedium,
|
||||
color = MaterialTheme.colorScheme.secondary,
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
systemStatus.kernelVersion.isGKI() -> {
|
||||
Icon(
|
||||
@@ -725,7 +727,7 @@ private fun InfoCard(
|
||||
|
||||
if (!isSimpleMode) {
|
||||
// 根据showKpmInfo决定是否显示KPM信息
|
||||
if (lkmMode != true && !showKpmInfo && Natives.version >= Natives.MINIMAL_SUPPORTED_KPM) {
|
||||
if (lkmMode != true && !showKpmInfo) {
|
||||
val displayVersion = if (systemInfo.kpmVersion.isEmpty() || systemInfo.kpmVersion.startsWith("Error")) {
|
||||
val statusText = if (Natives.isKPMEnabled()) {
|
||||
stringResource(R.string.kernel_patched)
|
||||
|
||||
@@ -186,7 +186,7 @@ fun InstallScreen(navigator: DestinationsNavigator) {
|
||||
}
|
||||
|
||||
val onClickNext = {
|
||||
if (isGKI && lkmSelection == LkmSelection.KmiNone && currentKmi.isBlank()) {
|
||||
if (isGKI && lkmSelection == LkmSelection.KmiNone && currentKmi.isBlank() && installMethod !is InstallMethod.HorizonKernel) {
|
||||
selectKmiDialog.show()
|
||||
} else {
|
||||
onInstall()
|
||||
@@ -373,7 +373,11 @@ private fun SelectInstallMethod(
|
||||
val horizonKernelSummary = stringResource(R.string.horizon_kernel_summary)
|
||||
val selectFileTip = stringResource(
|
||||
id = R.string.select_file_tip,
|
||||
if (isInitBoot()) "init_boot" else "boot"
|
||||
if (isInitBoot()) {
|
||||
"init_boot / vendor_boot ${stringResource(R.string.select_file_tip_vendor)}"
|
||||
} else {
|
||||
"boot"
|
||||
}
|
||||
)
|
||||
|
||||
val radioOptions = mutableListOf<InstallMethod>(
|
||||
|
||||
@@ -1,6 +1,8 @@
|
||||
package com.sukisu.ultra.ui.screen
|
||||
|
||||
import android.annotation.SuppressLint
|
||||
import androidx.activity.compose.rememberLauncherForActivityResult
|
||||
import androidx.activity.result.contract.ActivityResultContracts
|
||||
import androidx.compose.foundation.layout.Arrangement
|
||||
import androidx.compose.foundation.layout.Box
|
||||
import androidx.compose.foundation.layout.Column
|
||||
@@ -79,7 +81,10 @@ import com.sukisu.ultra.ui.component.TryUmountContent
|
||||
import com.sukisu.ultra.ui.theme.CardConfig
|
||||
import com.sukisu.ultra.ui.util.SuSFSManager
|
||||
import com.sukisu.ultra.ui.util.SuSFSManager.isSusVersion_1_5_8
|
||||
import com.sukisu.ultra.ui.util.isAbDevice
|
||||
import kotlinx.coroutines.launch
|
||||
import java.text.SimpleDateFormat
|
||||
import java.util.*
|
||||
|
||||
/**
|
||||
* 标签页枚举类
|
||||
@@ -123,9 +128,9 @@ fun SuSFSConfigScreen(
|
||||
var isLoading by remember { mutableStateOf(false) }
|
||||
var showConfirmReset by remember { mutableStateOf(false) }
|
||||
var autoStartEnabled by remember { mutableStateOf(false) }
|
||||
var lastAppliedValue by remember { mutableStateOf("") }
|
||||
var lastAppliedBuildTime by remember { mutableStateOf("") }
|
||||
var executeInPostFsData by remember { mutableStateOf(false) }
|
||||
var enableHideBl by remember { mutableStateOf(true) }
|
||||
var enableCleanupResidue by remember { mutableStateOf(false) }
|
||||
|
||||
// 槽位信息相关状态
|
||||
var slotInfoList by remember { mutableStateOf(emptyList<SuSFSManager.SlotInfo>()) }
|
||||
@@ -143,6 +148,8 @@ fun SuSFSConfigScreen(
|
||||
// SUS挂载隐藏控制状态
|
||||
var hideSusMountsForAllProcs by remember { mutableStateOf(true) }
|
||||
|
||||
var umountForZygoteIsoService by remember { mutableStateOf(false) }
|
||||
|
||||
// Kstat配置相关状态
|
||||
var kstatConfigs by remember { mutableStateOf(emptySet<String>()) }
|
||||
var addKstatPaths by remember { mutableStateOf(emptySet<String>()) }
|
||||
@@ -159,12 +166,26 @@ fun SuSFSConfigScreen(
|
||||
var showAddKstatStaticallyDialog by remember { mutableStateOf(false) }
|
||||
var showAddKstatDialog by remember { mutableStateOf(false) }
|
||||
|
||||
// 编辑状态
|
||||
var editingPath by remember { mutableStateOf<String?>(null) }
|
||||
var editingMount by remember { mutableStateOf<String?>(null) }
|
||||
var editingUmount by remember { mutableStateOf<String?>(null) }
|
||||
var editingKstatConfig by remember { mutableStateOf<String?>(null) }
|
||||
var editingKstatPath by remember { mutableStateOf<String?>(null) }
|
||||
|
||||
// 重置确认对话框状态
|
||||
var showResetPathsDialog by remember { mutableStateOf(false) }
|
||||
var showResetMountsDialog by remember { mutableStateOf(false) }
|
||||
var showResetUmountsDialog by remember { mutableStateOf(false) }
|
||||
var showResetKstatDialog by remember { mutableStateOf(false) }
|
||||
|
||||
// 备份还原相关状态
|
||||
var showBackupDialog by remember { mutableStateOf(false) }
|
||||
var showRestoreDialog by remember { mutableStateOf(false) }
|
||||
var showRestoreConfirmDialog by remember { mutableStateOf(false) }
|
||||
var selectedBackupFile by remember { mutableStateOf<String?>(null) }
|
||||
var backupInfo by remember { mutableStateOf<SuSFSManager.BackupData?>(null) }
|
||||
|
||||
val allTabs = SuSFSTab.getAllTabs(isSusVersion_1_5_8())
|
||||
|
||||
// 实时判断是否可以启用开机自启动
|
||||
@@ -174,6 +195,65 @@ fun SuSFSConfigScreen(
|
||||
}
|
||||
}
|
||||
|
||||
// 文件选择器
|
||||
val backupFileLauncher = rememberLauncherForActivityResult(
|
||||
contract = ActivityResultContracts.CreateDocument("application/json")
|
||||
) { uri ->
|
||||
uri?.let { fileUri ->
|
||||
val fileName = SuSFSManager.getRecommendedBackupPath(context)
|
||||
coroutineScope.launch {
|
||||
isLoading = true
|
||||
val success = SuSFSManager.createBackup(context, fileName)
|
||||
if (success) {
|
||||
// 复制到用户选择的位置
|
||||
try {
|
||||
context.contentResolver.openOutputStream(fileUri)?.use { outputStream ->
|
||||
java.io.File(fileName).inputStream().use { inputStream ->
|
||||
inputStream.copyTo(outputStream)
|
||||
}
|
||||
}
|
||||
} catch (e: Exception) {
|
||||
e.printStackTrace()
|
||||
}
|
||||
}
|
||||
isLoading = false
|
||||
showBackupDialog = false
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
val restoreFileLauncher = rememberLauncherForActivityResult(
|
||||
contract = ActivityResultContracts.OpenDocument()
|
||||
) { uri ->
|
||||
uri?.let { fileUri ->
|
||||
coroutineScope.launch {
|
||||
try {
|
||||
// 复制到临时文件
|
||||
val tempFile = java.io.File(context.cacheDir, "temp_restore.susfs_backup")
|
||||
context.contentResolver.openInputStream(fileUri)?.use { inputStream ->
|
||||
tempFile.outputStream().use { outputStream ->
|
||||
inputStream.copyTo(outputStream)
|
||||
}
|
||||
}
|
||||
|
||||
// 验证备份文件
|
||||
val backup = SuSFSManager.validateBackupFile(tempFile.absolutePath)
|
||||
if (backup != null) {
|
||||
selectedBackupFile = tempFile.absolutePath
|
||||
backupInfo = backup
|
||||
showRestoreConfirmDialog = true
|
||||
} else {
|
||||
// 显示错误消息
|
||||
}
|
||||
tempFile.deleteOnExit()
|
||||
} catch (e: Exception) {
|
||||
e.printStackTrace()
|
||||
}
|
||||
showRestoreDialog = false
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// 加载启用功能状态
|
||||
fun loadEnabledFeatures() {
|
||||
coroutineScope.launch {
|
||||
@@ -198,8 +278,6 @@ fun SuSFSConfigScreen(
|
||||
unameValue = SuSFSManager.getUnameValue(context)
|
||||
buildTimeValue = SuSFSManager.getBuildTimeValue(context)
|
||||
autoStartEnabled = SuSFSManager.isAutoStartEnabled(context)
|
||||
lastAppliedValue = SuSFSManager.getLastAppliedValue(context)
|
||||
lastAppliedBuildTime = SuSFSManager.getLastAppliedBuildTime(context)
|
||||
executeInPostFsData = SuSFSManager.getExecuteInPostFsData(context)
|
||||
susPaths = SuSFSManager.getSusPaths(context)
|
||||
susMounts = SuSFSManager.getSusMounts(context)
|
||||
@@ -209,6 +287,9 @@ fun SuSFSConfigScreen(
|
||||
kstatConfigs = SuSFSManager.getKstatConfigs(context)
|
||||
addKstatPaths = SuSFSManager.getAddKstatPaths(context)
|
||||
hideSusMountsForAllProcs = SuSFSManager.getHideSusMountsForAllProcs(context)
|
||||
enableHideBl = SuSFSManager.getEnableHideBl(context)
|
||||
enableCleanupResidue = SuSFSManager.getEnableCleanupResidue(context)
|
||||
umountForZygoteIsoService = SuSFSManager.getUmountForZygoteIsoService(context)
|
||||
|
||||
loadSlotInfo()
|
||||
}
|
||||
@@ -228,6 +309,186 @@ fun SuSFSConfigScreen(
|
||||
}
|
||||
}
|
||||
|
||||
// 备份对话框
|
||||
if (showBackupDialog) {
|
||||
AlertDialog(
|
||||
onDismissRequest = { showBackupDialog = false },
|
||||
title = {
|
||||
Text(
|
||||
text = stringResource(R.string.susfs_backup_title),
|
||||
style = MaterialTheme.typography.titleLarge,
|
||||
fontWeight = FontWeight.Bold
|
||||
)
|
||||
},
|
||||
text = {
|
||||
Text(stringResource(R.string.susfs_backup_description))
|
||||
},
|
||||
confirmButton = {
|
||||
Button(
|
||||
onClick = {
|
||||
val dateFormat = SimpleDateFormat("yyyyMMdd_HHmmss", Locale.getDefault())
|
||||
val timestamp = dateFormat.format(Date())
|
||||
backupFileLauncher.launch("SuSFS_Config_$timestamp.susfs_backup")
|
||||
},
|
||||
enabled = !isLoading,
|
||||
shape = RoundedCornerShape(8.dp)
|
||||
) {
|
||||
Text(stringResource(R.string.susfs_backup_create))
|
||||
}
|
||||
},
|
||||
dismissButton = {
|
||||
TextButton(
|
||||
onClick = { showBackupDialog = false },
|
||||
shape = RoundedCornerShape(8.dp)
|
||||
) {
|
||||
Text(stringResource(R.string.cancel))
|
||||
}
|
||||
},
|
||||
shape = RoundedCornerShape(12.dp)
|
||||
)
|
||||
}
|
||||
|
||||
// 还原对话框
|
||||
if (showRestoreDialog) {
|
||||
AlertDialog(
|
||||
onDismissRequest = { showRestoreDialog = false },
|
||||
title = {
|
||||
Text(
|
||||
text = stringResource(R.string.susfs_restore_title),
|
||||
style = MaterialTheme.typography.titleLarge,
|
||||
fontWeight = FontWeight.Bold
|
||||
)
|
||||
},
|
||||
text = {
|
||||
Text(stringResource(R.string.susfs_restore_description))
|
||||
},
|
||||
confirmButton = {
|
||||
Button(
|
||||
onClick = {
|
||||
restoreFileLauncher.launch(arrayOf("application/json", "*/*"))
|
||||
},
|
||||
enabled = !isLoading,
|
||||
shape = RoundedCornerShape(8.dp)
|
||||
) {
|
||||
Text(stringResource(R.string.susfs_restore_select_file))
|
||||
}
|
||||
},
|
||||
dismissButton = {
|
||||
TextButton(
|
||||
onClick = { showRestoreDialog = false },
|
||||
shape = RoundedCornerShape(8.dp)
|
||||
) {
|
||||
Text(stringResource(R.string.cancel))
|
||||
}
|
||||
},
|
||||
shape = RoundedCornerShape(12.dp)
|
||||
)
|
||||
}
|
||||
|
||||
// 还原确认对话框
|
||||
if (showRestoreConfirmDialog && backupInfo != null) {
|
||||
AlertDialog(
|
||||
onDismissRequest = {
|
||||
showRestoreConfirmDialog = false
|
||||
selectedBackupFile = null
|
||||
backupInfo = null
|
||||
},
|
||||
title = {
|
||||
Text(
|
||||
text = stringResource(R.string.susfs_restore_confirm_title),
|
||||
style = MaterialTheme.typography.titleLarge,
|
||||
fontWeight = FontWeight.Bold
|
||||
)
|
||||
},
|
||||
text = {
|
||||
Column(
|
||||
verticalArrangement = Arrangement.spacedBy(8.dp)
|
||||
) {
|
||||
Text(stringResource(R.string.susfs_restore_confirm_description))
|
||||
|
||||
Card(
|
||||
modifier = Modifier.fillMaxWidth(),
|
||||
colors = CardDefaults.cardColors(
|
||||
containerColor = MaterialTheme.colorScheme.surfaceVariant.copy(alpha = 0.3f)
|
||||
),
|
||||
shape = RoundedCornerShape(8.dp)
|
||||
) {
|
||||
Column(
|
||||
modifier = Modifier.padding(12.dp),
|
||||
verticalArrangement = Arrangement.spacedBy(4.dp)
|
||||
) {
|
||||
val dateFormat = SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.getDefault())
|
||||
Text(
|
||||
text = stringResource(R.string.susfs_backup_info_date,
|
||||
dateFormat.format(Date(backupInfo!!.timestamp))),
|
||||
style = MaterialTheme.typography.bodyMedium
|
||||
)
|
||||
Text(
|
||||
text = stringResource(R.string.susfs_backup_info_device, backupInfo!!.deviceInfo),
|
||||
style = MaterialTheme.typography.bodyMedium
|
||||
)
|
||||
Text(
|
||||
text = stringResource(R.string.susfs_backup_info_version, backupInfo!!.version),
|
||||
style = MaterialTheme.typography.bodyMedium
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
confirmButton = {
|
||||
Button(
|
||||
onClick = {
|
||||
selectedBackupFile?.let { filePath ->
|
||||
coroutineScope.launch {
|
||||
isLoading = true
|
||||
val success = SuSFSManager.restoreFromBackup(context, filePath)
|
||||
if (success) {
|
||||
// 重新加载所有配置
|
||||
unameValue = SuSFSManager.getUnameValue(context)
|
||||
buildTimeValue = SuSFSManager.getBuildTimeValue(context)
|
||||
autoStartEnabled = SuSFSManager.isAutoStartEnabled(context)
|
||||
executeInPostFsData = SuSFSManager.getExecuteInPostFsData(context)
|
||||
susPaths = SuSFSManager.getSusPaths(context)
|
||||
susMounts = SuSFSManager.getSusMounts(context)
|
||||
tryUmounts = SuSFSManager.getTryUmounts(context)
|
||||
androidDataPath = SuSFSManager.getAndroidDataPath(context)
|
||||
sdcardPath = SuSFSManager.getSdcardPath(context)
|
||||
kstatConfigs = SuSFSManager.getKstatConfigs(context)
|
||||
addKstatPaths = SuSFSManager.getAddKstatPaths(context)
|
||||
hideSusMountsForAllProcs = SuSFSManager.getHideSusMountsForAllProcs(context)
|
||||
enableHideBl = SuSFSManager.getEnableHideBl(context)
|
||||
enableCleanupResidue = SuSFSManager.getEnableCleanupResidue(context)
|
||||
umountForZygoteIsoService = SuSFSManager.getUmountForZygoteIsoService(context)
|
||||
}
|
||||
isLoading = false
|
||||
showRestoreConfirmDialog = false
|
||||
selectedBackupFile = null
|
||||
backupInfo = null
|
||||
}
|
||||
}
|
||||
},
|
||||
enabled = !isLoading,
|
||||
shape = RoundedCornerShape(8.dp)
|
||||
) {
|
||||
Text(stringResource(R.string.susfs_restore_confirm))
|
||||
}
|
||||
},
|
||||
dismissButton = {
|
||||
TextButton(
|
||||
onClick = {
|
||||
showRestoreConfirmDialog = false
|
||||
selectedBackupFile = null
|
||||
backupInfo = null
|
||||
},
|
||||
shape = RoundedCornerShape(8.dp)
|
||||
) {
|
||||
Text(stringResource(R.string.cancel))
|
||||
}
|
||||
},
|
||||
shape = RoundedCornerShape(12.dp)
|
||||
)
|
||||
}
|
||||
|
||||
// 槽位信息对话框
|
||||
SlotInfoDialog(
|
||||
showDialog = showSlotInfoDialog,
|
||||
@@ -249,94 +510,148 @@ fun SuSFSConfigScreen(
|
||||
// 各种对话框
|
||||
AddPathDialog(
|
||||
showDialog = showAddPathDialog,
|
||||
onDismiss = { showAddPathDialog = false },
|
||||
onDismiss = {
|
||||
showAddPathDialog = false
|
||||
editingPath = null
|
||||
},
|
||||
onConfirm = { path ->
|
||||
coroutineScope.launch {
|
||||
isLoading = true
|
||||
if (SuSFSManager.addSusPath(context, path)) {
|
||||
val success = if (editingPath != null) {
|
||||
SuSFSManager.editSusPath(context, editingPath!!, path)
|
||||
} else {
|
||||
SuSFSManager.addSusPath(context, path)
|
||||
}
|
||||
if (success) {
|
||||
susPaths = SuSFSManager.getSusPaths(context)
|
||||
}
|
||||
isLoading = false
|
||||
showAddPathDialog = false
|
||||
editingPath = null
|
||||
}
|
||||
},
|
||||
isLoading = isLoading,
|
||||
titleRes = R.string.susfs_add_sus_path,
|
||||
titleRes = if (editingPath != null) R.string.susfs_edit_sus_path else R.string.susfs_add_sus_path,
|
||||
labelRes = R.string.susfs_path_label,
|
||||
placeholderRes = R.string.susfs_path_placeholder
|
||||
placeholderRes = R.string.susfs_path_placeholder,
|
||||
initialValue = editingPath ?: ""
|
||||
)
|
||||
|
||||
AddPathDialog(
|
||||
showDialog = showAddMountDialog,
|
||||
onDismiss = { showAddMountDialog = false },
|
||||
onDismiss = {
|
||||
showAddMountDialog = false
|
||||
editingMount = null
|
||||
},
|
||||
onConfirm = { mount ->
|
||||
coroutineScope.launch {
|
||||
isLoading = true
|
||||
if (SuSFSManager.addSusMount(context, mount)) {
|
||||
val success = if (editingMount != null) {
|
||||
SuSFSManager.editSusMount(context, editingMount!!, mount)
|
||||
} else {
|
||||
SuSFSManager.addSusMount(context, mount)
|
||||
}
|
||||
if (success) {
|
||||
susMounts = SuSFSManager.getSusMounts(context)
|
||||
}
|
||||
isLoading = false
|
||||
showAddMountDialog = false
|
||||
editingMount = null
|
||||
}
|
||||
},
|
||||
isLoading = isLoading,
|
||||
titleRes = R.string.susfs_add_sus_mount,
|
||||
titleRes = if (editingMount != null) R.string.susfs_edit_sus_mount else R.string.susfs_add_sus_mount,
|
||||
labelRes = R.string.susfs_mount_path_label,
|
||||
placeholderRes = R.string.susfs_path_placeholder
|
||||
placeholderRes = R.string.susfs_path_placeholder,
|
||||
initialValue = editingMount ?: ""
|
||||
)
|
||||
|
||||
AddTryUmountDialog(
|
||||
showDialog = showAddUmountDialog,
|
||||
onDismiss = { showAddUmountDialog = false },
|
||||
onDismiss = {
|
||||
showAddUmountDialog = false
|
||||
editingUmount = null
|
||||
},
|
||||
onConfirm = { path, mode ->
|
||||
coroutineScope.launch {
|
||||
isLoading = true
|
||||
if (SuSFSManager.addTryUmount(context, path, mode)) {
|
||||
val success = if (editingUmount != null) {
|
||||
SuSFSManager.editTryUmount(context, editingUmount!!, path, mode)
|
||||
} else {
|
||||
SuSFSManager.addTryUmount(context, path, mode)
|
||||
}
|
||||
if (success) {
|
||||
tryUmounts = SuSFSManager.getTryUmounts(context)
|
||||
}
|
||||
isLoading = false
|
||||
showAddUmountDialog = false
|
||||
editingUmount = null
|
||||
}
|
||||
},
|
||||
isLoading = isLoading
|
||||
isLoading = isLoading,
|
||||
initialPath = editingUmount?.split("|")?.get(0) ?: "",
|
||||
initialMode = editingUmount?.split("|")?.get(1)?.toIntOrNull() ?: 0
|
||||
)
|
||||
|
||||
AddKstatStaticallyDialog(
|
||||
showDialog = showAddKstatStaticallyDialog,
|
||||
onDismiss = { showAddKstatStaticallyDialog = false },
|
||||
onDismiss = {
|
||||
showAddKstatStaticallyDialog = false
|
||||
editingKstatConfig = null
|
||||
},
|
||||
onConfirm = { path, ino, dev, nlink, size, atime, atimeNsec, mtime, mtimeNsec, ctime, ctimeNsec, blocks, blksize ->
|
||||
coroutineScope.launch {
|
||||
isLoading = true
|
||||
if (SuSFSManager.addKstatStatically(
|
||||
val success = if (editingKstatConfig != null) {
|
||||
SuSFSManager.editKstatConfig(
|
||||
context, editingKstatConfig!!, path, ino, dev, nlink, size, atime, atimeNsec,
|
||||
mtime, mtimeNsec, ctime, ctimeNsec, blocks, blksize
|
||||
)
|
||||
} else {
|
||||
SuSFSManager.addKstatStatically(
|
||||
context, path, ino, dev, nlink, size, atime, atimeNsec,
|
||||
mtime, mtimeNsec, ctime, ctimeNsec, blocks, blksize
|
||||
)) {
|
||||
)
|
||||
}
|
||||
if (success) {
|
||||
kstatConfigs = SuSFSManager.getKstatConfigs(context)
|
||||
}
|
||||
isLoading = false
|
||||
showAddKstatStaticallyDialog = false
|
||||
editingKstatConfig = null
|
||||
}
|
||||
},
|
||||
isLoading = isLoading
|
||||
isLoading = isLoading,
|
||||
initialConfig = editingKstatConfig ?: ""
|
||||
)
|
||||
|
||||
AddPathDialog(
|
||||
showDialog = showAddKstatDialog,
|
||||
onDismiss = { showAddKstatDialog = false },
|
||||
onDismiss = {
|
||||
showAddKstatDialog = false
|
||||
editingKstatPath = null
|
||||
},
|
||||
onConfirm = { path ->
|
||||
coroutineScope.launch {
|
||||
isLoading = true
|
||||
if (SuSFSManager.addKstat(context, path)) {
|
||||
val success = if (editingKstatPath != null) {
|
||||
SuSFSManager.editAddKstat(context, editingKstatPath!!, path)
|
||||
} else {
|
||||
SuSFSManager.addKstat(context, path)
|
||||
}
|
||||
if (success) {
|
||||
addKstatPaths = SuSFSManager.getAddKstatPaths(context)
|
||||
}
|
||||
isLoading = false
|
||||
showAddKstatDialog = false
|
||||
editingKstatPath = null
|
||||
}
|
||||
},
|
||||
isLoading = isLoading,
|
||||
titleRes = R.string.add_kstat_path_title,
|
||||
titleRes = if (editingKstatPath != null) R.string.edit_kstat_path_title else R.string.add_kstat_path_title,
|
||||
labelRes = R.string.file_or_directory_path_label,
|
||||
placeholderRes = R.string.susfs_path_placeholder
|
||||
placeholderRes = R.string.susfs_path_placeholder,
|
||||
initialValue = editingKstatPath ?: ""
|
||||
)
|
||||
|
||||
// 确认对话框
|
||||
@@ -366,8 +681,6 @@ fun SuSFSConfigScreen(
|
||||
if (SuSFSManager.resetToDefault(context)) {
|
||||
unameValue = "default"
|
||||
buildTimeValue = "default"
|
||||
lastAppliedValue = "default"
|
||||
lastAppliedBuildTime = "default"
|
||||
autoStartEnabled = false
|
||||
}
|
||||
isLoading = false
|
||||
@@ -530,9 +843,9 @@ fun SuSFSConfigScreen(
|
||||
val finalBuildTimeValue = buildTimeValue.trim().ifBlank { "default" }
|
||||
val success = SuSFSManager.setUname(context, finalUnameValue, finalBuildTimeValue)
|
||||
if (success) {
|
||||
lastAppliedValue = finalUnameValue
|
||||
lastAppliedBuildTime = finalBuildTimeValue
|
||||
SuSFSManager.saveExecuteInPostFsData(context, executeInPostFsData)
|
||||
SuSFSManager.saveEnableHideBl(context, enableHideBl)
|
||||
SuSFSManager.saveEnableCleanupResidue(context, enableCleanupResidue)
|
||||
}
|
||||
isLoading = false
|
||||
}
|
||||
@@ -780,7 +1093,29 @@ fun SuSFSConfigScreen(
|
||||
}
|
||||
},
|
||||
onShowSlotInfo = { showSlotInfoDialog = true },
|
||||
context = context
|
||||
context = context,
|
||||
onShowBackupDialog = { showBackupDialog = true },
|
||||
onShowRestoreDialog = { showRestoreDialog = true },
|
||||
enableHideBl = enableHideBl,
|
||||
onEnableHideBlChange = { enabled ->
|
||||
enableHideBl = enabled
|
||||
SuSFSManager.saveEnableHideBl(context, enabled)
|
||||
if (SuSFSManager.isAutoStartEnabled(context)) {
|
||||
coroutineScope.launch {
|
||||
SuSFSManager.configureAutoStart(context, true)
|
||||
}
|
||||
}
|
||||
},
|
||||
enableCleanupResidue = enableCleanupResidue,
|
||||
onEnableCleanupResidueChange = { enabled ->
|
||||
enableCleanupResidue = enabled
|
||||
SuSFSManager.saveEnableCleanupResidue(context, enabled)
|
||||
if (SuSFSManager.isAutoStartEnabled(context)) {
|
||||
coroutineScope.launch {
|
||||
SuSFSManager.configureAutoStart(context, true)
|
||||
}
|
||||
}
|
||||
}
|
||||
)
|
||||
}
|
||||
SuSFSTab.SUS_PATHS -> {
|
||||
@@ -796,6 +1131,10 @@ fun SuSFSConfigScreen(
|
||||
}
|
||||
isLoading = false
|
||||
}
|
||||
},
|
||||
onEditPath = { path ->
|
||||
editingPath = path
|
||||
showAddPathDialog = true
|
||||
}
|
||||
)
|
||||
}
|
||||
@@ -817,6 +1156,10 @@ fun SuSFSConfigScreen(
|
||||
isLoading = false
|
||||
}
|
||||
},
|
||||
onEditMount = { mount ->
|
||||
editingMount = mount
|
||||
showAddMountDialog = true
|
||||
},
|
||||
onToggleHideSusMountsForAllProcs = { hideForAll ->
|
||||
coroutineScope.launch {
|
||||
isLoading = true
|
||||
@@ -832,6 +1175,7 @@ fun SuSFSConfigScreen(
|
||||
SuSFSTab.TRY_UMOUNT -> {
|
||||
TryUmountContent(
|
||||
tryUmounts = tryUmounts,
|
||||
umountForZygoteIsoService = umountForZygoteIsoService,
|
||||
isLoading = isLoading,
|
||||
onAddUmount = { showAddUmountDialog = true },
|
||||
onRunUmount = { showRunUmountDialog = true },
|
||||
@@ -843,9 +1187,24 @@ fun SuSFSConfigScreen(
|
||||
}
|
||||
isLoading = false
|
||||
}
|
||||
},
|
||||
onEditUmount = { umountEntry ->
|
||||
editingUmount = umountEntry
|
||||
showAddUmountDialog = true
|
||||
},
|
||||
onToggleUmountForZygoteIsoService = { enabled ->
|
||||
coroutineScope.launch {
|
||||
isLoading = true
|
||||
val success = SuSFSManager.setUmountForZygoteIsoService(context, enabled)
|
||||
if (success) {
|
||||
umountForZygoteIsoService = enabled
|
||||
}
|
||||
isLoading = false
|
||||
}
|
||||
}
|
||||
)
|
||||
}
|
||||
|
||||
SuSFSTab.KSTAT_CONFIG -> {
|
||||
KstatConfigContent(
|
||||
kstatConfigs = kstatConfigs,
|
||||
@@ -862,6 +1221,10 @@ fun SuSFSConfigScreen(
|
||||
isLoading = false
|
||||
}
|
||||
},
|
||||
onEditKstatConfig = { config ->
|
||||
editingKstatConfig = config
|
||||
showAddKstatStaticallyDialog = true
|
||||
},
|
||||
onRemoveAddKstat = { path ->
|
||||
coroutineScope.launch {
|
||||
isLoading = true
|
||||
@@ -871,6 +1234,10 @@ fun SuSFSConfigScreen(
|
||||
isLoading = false
|
||||
}
|
||||
},
|
||||
onEditAddKstat = { path ->
|
||||
editingKstatPath = path
|
||||
showAddKstatDialog = true
|
||||
},
|
||||
onUpdateKstat = { path ->
|
||||
coroutineScope.launch {
|
||||
isLoading = true
|
||||
@@ -939,9 +1306,16 @@ private fun BasicSettingsContent(
|
||||
isLoading: Boolean,
|
||||
onAutoStartToggle: (Boolean) -> Unit,
|
||||
onShowSlotInfo: () -> Unit,
|
||||
context: android.content.Context
|
||||
context: android.content.Context,
|
||||
onShowBackupDialog: () -> Unit,
|
||||
onShowRestoreDialog: () -> Unit,
|
||||
enableHideBl: Boolean,
|
||||
onEnableHideBlChange: (Boolean) -> Unit,
|
||||
enableCleanupResidue: Boolean,
|
||||
onEnableCleanupResidueChange: (Boolean) -> Unit
|
||||
) {
|
||||
var scriptLocationExpanded by remember { mutableStateOf(false) }
|
||||
val isAbDevice = isAbDevice()
|
||||
|
||||
Column(
|
||||
modifier = Modifier
|
||||
@@ -1149,7 +1523,110 @@ private fun BasicSettingsContent(
|
||||
}
|
||||
}
|
||||
|
||||
// 隐藏BL脚本开关
|
||||
Card(
|
||||
modifier = Modifier.fillMaxWidth(),
|
||||
colors = CardDefaults.cardColors(
|
||||
containerColor = MaterialTheme.colorScheme.surface
|
||||
),
|
||||
shape = RoundedCornerShape(12.dp)
|
||||
) {
|
||||
Row(
|
||||
modifier = Modifier
|
||||
.fillMaxWidth()
|
||||
.padding(12.dp),
|
||||
horizontalArrangement = Arrangement.SpaceBetween,
|
||||
verticalAlignment = Alignment.CenterVertically
|
||||
) {
|
||||
Column(
|
||||
modifier = Modifier.weight(1f)
|
||||
) {
|
||||
Row(
|
||||
verticalAlignment = Alignment.CenterVertically
|
||||
) {
|
||||
Icon(
|
||||
imageVector = Icons.Default.Security,
|
||||
contentDescription = null,
|
||||
tint = MaterialTheme.colorScheme.primary,
|
||||
modifier = Modifier.size(18.dp)
|
||||
)
|
||||
Spacer(modifier = Modifier.width(8.dp))
|
||||
Text(
|
||||
text = stringResource(R.string.hide_bl_script),
|
||||
style = MaterialTheme.typography.titleMedium,
|
||||
fontWeight = FontWeight.Medium,
|
||||
color = MaterialTheme.colorScheme.onSurface
|
||||
)
|
||||
}
|
||||
Spacer(modifier = Modifier.height(6.dp))
|
||||
Text(
|
||||
text = stringResource(R.string.hide_bl_script_description),
|
||||
style = MaterialTheme.typography.bodyMedium,
|
||||
color = MaterialTheme.colorScheme.onSurfaceVariant,
|
||||
lineHeight = 14.sp
|
||||
)
|
||||
}
|
||||
Switch(
|
||||
checked = enableHideBl,
|
||||
onCheckedChange = onEnableHideBlChange,
|
||||
enabled = !isLoading
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
// 清理残留脚本开关
|
||||
Card(
|
||||
modifier = Modifier.fillMaxWidth(),
|
||||
colors = CardDefaults.cardColors(
|
||||
containerColor = MaterialTheme.colorScheme.surface
|
||||
),
|
||||
shape = RoundedCornerShape(12.dp)
|
||||
) {
|
||||
Row(
|
||||
modifier = Modifier
|
||||
.fillMaxWidth()
|
||||
.padding(12.dp),
|
||||
horizontalArrangement = Arrangement.SpaceBetween,
|
||||
verticalAlignment = Alignment.CenterVertically
|
||||
) {
|
||||
Column(
|
||||
modifier = Modifier.weight(1f)
|
||||
) {
|
||||
Row(
|
||||
verticalAlignment = Alignment.CenterVertically
|
||||
) {
|
||||
Icon(
|
||||
imageVector = Icons.Default.CleaningServices,
|
||||
contentDescription = null,
|
||||
tint = MaterialTheme.colorScheme.primary,
|
||||
modifier = Modifier.size(18.dp)
|
||||
)
|
||||
Spacer(modifier = Modifier.width(8.dp))
|
||||
Text(
|
||||
text = stringResource(R.string.cleanup_residue),
|
||||
style = MaterialTheme.typography.titleMedium,
|
||||
fontWeight = FontWeight.Medium,
|
||||
color = MaterialTheme.colorScheme.onSurface
|
||||
)
|
||||
}
|
||||
Spacer(modifier = Modifier.height(6.dp))
|
||||
Text(
|
||||
text = stringResource(R.string.cleanup_residue_description),
|
||||
style = MaterialTheme.typography.bodyMedium,
|
||||
color = MaterialTheme.colorScheme.onSurfaceVariant,
|
||||
lineHeight = 14.sp
|
||||
)
|
||||
}
|
||||
Switch(
|
||||
checked = enableCleanupResidue,
|
||||
onCheckedChange = onEnableCleanupResidueChange,
|
||||
enabled = !isLoading
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
// 槽位信息按钮
|
||||
if (isAbDevice) {
|
||||
Card(
|
||||
modifier = Modifier.fillMaxWidth(),
|
||||
colors = CardDefaults.cardColors(
|
||||
@@ -1205,6 +1682,52 @@ private fun BasicSettingsContent(
|
||||
}
|
||||
}
|
||||
}
|
||||
Row(
|
||||
modifier = Modifier.fillMaxWidth(),
|
||||
horizontalArrangement = Arrangement.spacedBy(12.dp)
|
||||
) {
|
||||
// 备份按钮
|
||||
OutlinedButton(
|
||||
onClick = onShowBackupDialog,
|
||||
enabled = !isLoading,
|
||||
shape = RoundedCornerShape(8.dp),
|
||||
modifier = Modifier
|
||||
.weight(1f)
|
||||
.height(40.dp)
|
||||
) {
|
||||
Icon(
|
||||
imageVector = Icons.Default.Backup,
|
||||
contentDescription = null,
|
||||
modifier = Modifier.size(16.dp)
|
||||
)
|
||||
Spacer(modifier = Modifier.width(6.dp))
|
||||
Text(
|
||||
stringResource(R.string.susfs_backup_title),
|
||||
fontWeight = FontWeight.Medium
|
||||
)
|
||||
}
|
||||
// 还原按钮
|
||||
OutlinedButton(
|
||||
onClick = onShowRestoreDialog,
|
||||
enabled = !isLoading,
|
||||
shape = RoundedCornerShape(8.dp),
|
||||
modifier = Modifier
|
||||
.weight(1f)
|
||||
.height(40.dp)
|
||||
) {
|
||||
Icon(
|
||||
imageVector = Icons.Default.Restore,
|
||||
contentDescription = null,
|
||||
modifier = Modifier.size(16.dp)
|
||||
)
|
||||
Spacer(modifier = Modifier.width(6.dp))
|
||||
Text(
|
||||
stringResource(R.string.susfs_restore_title),
|
||||
fontWeight = FontWeight.Medium
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -1221,7 +1744,9 @@ private fun SlotInfoDialog(
|
||||
onUseUname: (String) -> Unit,
|
||||
onUseBuildTime: (String) -> Unit
|
||||
) {
|
||||
if (showDialog) {
|
||||
val isAbDevice = isAbDevice()
|
||||
|
||||
if (showDialog && isAbDevice) {
|
||||
AlertDialog(
|
||||
onDismissRequest = onDismiss,
|
||||
title = {
|
||||
|
||||
@@ -14,6 +14,7 @@ import androidx.compose.foundation.layout.width
|
||||
import androidx.compose.foundation.shape.RoundedCornerShape
|
||||
import androidx.compose.material.icons.Icons
|
||||
import androidx.compose.material.icons.filled.Delete
|
||||
import androidx.compose.material.icons.filled.Edit
|
||||
import androidx.compose.material.icons.filled.Folder
|
||||
import androidx.compose.material.icons.filled.PlayArrow
|
||||
import androidx.compose.material.icons.filled.Update
|
||||
@@ -91,6 +92,7 @@ fun PathItemCard(
|
||||
path: String,
|
||||
icon: ImageVector,
|
||||
onDelete: () -> Unit,
|
||||
onEdit: (() -> Unit)? = null,
|
||||
isLoading: Boolean = false,
|
||||
additionalInfo: String? = null
|
||||
) {
|
||||
@@ -134,6 +136,23 @@ fun PathItemCard(
|
||||
}
|
||||
}
|
||||
}
|
||||
Row(
|
||||
horizontalArrangement = Arrangement.spacedBy(4.dp)
|
||||
) {
|
||||
if (onEdit != null) {
|
||||
IconButton(
|
||||
onClick = onEdit,
|
||||
enabled = !isLoading,
|
||||
modifier = Modifier.size(32.dp)
|
||||
) {
|
||||
Icon(
|
||||
imageVector = Icons.Default.Edit,
|
||||
contentDescription = stringResource(R.string.edit),
|
||||
tint = MaterialTheme.colorScheme.secondary,
|
||||
modifier = Modifier.size(16.dp)
|
||||
)
|
||||
}
|
||||
}
|
||||
IconButton(
|
||||
onClick = onDelete,
|
||||
enabled = !isLoading,
|
||||
@@ -141,7 +160,7 @@ fun PathItemCard(
|
||||
) {
|
||||
Icon(
|
||||
imageVector = Icons.Default.Delete,
|
||||
contentDescription = null,
|
||||
contentDescription = stringResource(R.string.delete),
|
||||
tint = MaterialTheme.colorScheme.error,
|
||||
modifier = Modifier.size(16.dp)
|
||||
)
|
||||
@@ -149,6 +168,7 @@ fun PathItemCard(
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Kstat配置项目卡片组件
|
||||
@@ -157,6 +177,7 @@ fun PathItemCard(
|
||||
fun KstatConfigItemCard(
|
||||
config: String,
|
||||
onDelete: () -> Unit,
|
||||
onEdit: (() -> Unit)? = null,
|
||||
isLoading: Boolean = false
|
||||
) {
|
||||
Card(
|
||||
@@ -208,6 +229,23 @@ fun KstatConfigItemCard(
|
||||
}
|
||||
}
|
||||
}
|
||||
Row(
|
||||
horizontalArrangement = Arrangement.spacedBy(4.dp)
|
||||
) {
|
||||
if (onEdit != null) {
|
||||
IconButton(
|
||||
onClick = onEdit,
|
||||
enabled = !isLoading,
|
||||
modifier = Modifier.size(32.dp)
|
||||
) {
|
||||
Icon(
|
||||
imageVector = Icons.Default.Edit,
|
||||
contentDescription = stringResource(R.string.edit),
|
||||
tint = MaterialTheme.colorScheme.secondary,
|
||||
modifier = Modifier.size(16.dp)
|
||||
)
|
||||
}
|
||||
}
|
||||
IconButton(
|
||||
onClick = onDelete,
|
||||
enabled = !isLoading,
|
||||
@@ -215,7 +253,7 @@ fun KstatConfigItemCard(
|
||||
) {
|
||||
Icon(
|
||||
imageVector = Icons.Default.Delete,
|
||||
contentDescription = null,
|
||||
contentDescription = stringResource(R.string.delete),
|
||||
tint = MaterialTheme.colorScheme.error,
|
||||
modifier = Modifier.size(16.dp)
|
||||
)
|
||||
@@ -223,6 +261,7 @@ fun KstatConfigItemCard(
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Add Kstat路径项目卡片组件
|
||||
@@ -231,6 +270,7 @@ fun KstatConfigItemCard(
|
||||
fun AddKstatPathItemCard(
|
||||
path: String,
|
||||
onDelete: () -> Unit,
|
||||
onEdit: (() -> Unit)? = null,
|
||||
onUpdate: () -> Unit,
|
||||
onUpdateFullClone: () -> Unit,
|
||||
isLoading: Boolean = false
|
||||
@@ -269,6 +309,20 @@ fun AddKstatPathItemCard(
|
||||
Row(
|
||||
horizontalArrangement = Arrangement.spacedBy(4.dp)
|
||||
) {
|
||||
if (onEdit != null) {
|
||||
IconButton(
|
||||
onClick = onEdit,
|
||||
enabled = !isLoading,
|
||||
modifier = Modifier.size(32.dp)
|
||||
) {
|
||||
Icon(
|
||||
imageVector = Icons.Default.Edit,
|
||||
contentDescription = stringResource(R.string.edit),
|
||||
tint = MaterialTheme.colorScheme.secondary,
|
||||
modifier = Modifier.size(16.dp)
|
||||
)
|
||||
}
|
||||
}
|
||||
IconButton(
|
||||
onClick = onUpdate,
|
||||
enabled = !isLoading,
|
||||
@@ -276,7 +330,7 @@ fun AddKstatPathItemCard(
|
||||
) {
|
||||
Icon(
|
||||
imageVector = Icons.Default.Update,
|
||||
contentDescription = null,
|
||||
contentDescription = stringResource(R.string.update),
|
||||
tint = MaterialTheme.colorScheme.secondary,
|
||||
modifier = Modifier.size(16.dp)
|
||||
)
|
||||
@@ -288,7 +342,7 @@ fun AddKstatPathItemCard(
|
||||
) {
|
||||
Icon(
|
||||
imageVector = Icons.Default.PlayArrow,
|
||||
contentDescription = null,
|
||||
contentDescription = stringResource(R.string.susfs_update_full_clone),
|
||||
tint = MaterialTheme.colorScheme.tertiary,
|
||||
modifier = Modifier.size(16.dp)
|
||||
)
|
||||
@@ -300,7 +354,7 @@ fun AddKstatPathItemCard(
|
||||
) {
|
||||
Icon(
|
||||
imageVector = Icons.Default.Delete,
|
||||
contentDescription = null,
|
||||
contentDescription = stringResource(R.string.delete),
|
||||
tint = MaterialTheme.colorScheme.error,
|
||||
modifier = Modifier.size(16.dp)
|
||||
)
|
||||
|
||||
@@ -16,6 +16,9 @@ import java.io.File
|
||||
import java.io.FileOutputStream
|
||||
import java.io.IOException
|
||||
import androidx.core.content.edit
|
||||
import org.json.JSONObject
|
||||
import java.text.SimpleDateFormat
|
||||
import java.util.*
|
||||
|
||||
/**
|
||||
* SuSFS 配置管理器
|
||||
@@ -36,13 +39,19 @@ object SuSFSManager {
|
||||
private const val KEY_KSTAT_CONFIGS = "kstat_configs"
|
||||
private const val KEY_ADD_KSTAT_PATHS = "add_kstat_paths"
|
||||
private const val KEY_HIDE_SUS_MOUNTS_FOR_ALL_PROCS = "hide_sus_mounts_for_all_procs"
|
||||
private const val KEY_ENABLE_CLEANUP_RESIDUE = "enable_cleanup_residue"
|
||||
private const val KEY_ENABLE_HIDE_BL = "enable_hide_bl"
|
||||
private const val KEY_UMOUNT_FOR_ZYGOTE_ISO_SERVICE = "umount_for_zygote_iso_service"
|
||||
|
||||
|
||||
// 常量
|
||||
private const val SUSFS_BINARY_BASE_NAME = "ksu_susfs"
|
||||
private const val DEFAULT_UNAME = "default"
|
||||
private const val DEFAULT_BUILD_TIME = "default"
|
||||
private const val MODULE_ID = "susfs_manager"
|
||||
private const val MODULE_PATH = "/data/adb/modules/$MODULE_ID"
|
||||
|
||||
private const val MIN_VERSION_FOR_HIDE_MOUNT = "1.5.8"
|
||||
private const val BACKUP_FILE_EXTENSION = ".susfs_backup"
|
||||
|
||||
data class SlotInfo(val slotName: String, val uname: String, val buildTime: String)
|
||||
data class CommandResult(val isSuccess: Boolean, val output: String, val errorOutput: String = "")
|
||||
@@ -53,13 +62,103 @@ object SuSFSManager {
|
||||
val canConfigure: Boolean = false
|
||||
)
|
||||
|
||||
// 命令执行
|
||||
/**
|
||||
* 备份数据类
|
||||
*/
|
||||
data class BackupData(
|
||||
val version: String,
|
||||
val timestamp: Long,
|
||||
val deviceInfo: String,
|
||||
val configurations: Map<String, Any>
|
||||
) {
|
||||
fun toJson(): String {
|
||||
val jsonObject = JSONObject().apply {
|
||||
put("version", version)
|
||||
put("timestamp", timestamp)
|
||||
put("deviceInfo", deviceInfo)
|
||||
put("configurations", JSONObject(configurations))
|
||||
}
|
||||
return jsonObject.toString(2)
|
||||
}
|
||||
|
||||
companion object {
|
||||
fun fromJson(jsonString: String): BackupData? {
|
||||
return try {
|
||||
val jsonObject = JSONObject(jsonString)
|
||||
val configurationsJson = jsonObject.getJSONObject("configurations")
|
||||
val configurations = mutableMapOf<String, Any>()
|
||||
|
||||
configurationsJson.keys().forEach { key ->
|
||||
val value = configurationsJson.get(key)
|
||||
configurations[key] = when (value) {
|
||||
is org.json.JSONArray -> {
|
||||
val set = mutableSetOf<String>()
|
||||
for (i in 0 until value.length()) {
|
||||
set.add(value.getString(i))
|
||||
}
|
||||
set
|
||||
}
|
||||
else -> value
|
||||
}
|
||||
}
|
||||
|
||||
BackupData(
|
||||
version = jsonObject.getString("version"),
|
||||
timestamp = jsonObject.getLong("timestamp"),
|
||||
deviceInfo = jsonObject.getString("deviceInfo"),
|
||||
configurations = configurations
|
||||
)
|
||||
} catch (e: Exception) {
|
||||
e.printStackTrace()
|
||||
null
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 模块配置数据类
|
||||
*/
|
||||
data class ModuleConfig(
|
||||
val targetPath: String,
|
||||
val unameValue: String,
|
||||
val buildTimeValue: String,
|
||||
val executeInPostFsData: Boolean,
|
||||
val susPaths: Set<String>,
|
||||
val susMounts: Set<String>,
|
||||
val tryUmounts: Set<String>,
|
||||
val androidDataPath: String,
|
||||
val sdcardPath: String,
|
||||
val enableLog: Boolean,
|
||||
val kstatConfigs: Set<String>,
|
||||
val addKstatPaths: Set<String>,
|
||||
val hideSusMountsForAllProcs: Boolean,
|
||||
val support158: Boolean,
|
||||
val enableHideBl: Boolean,
|
||||
val enableCleanupResidue: Boolean,
|
||||
val umountForZygoteIsoService: Boolean
|
||||
) {
|
||||
/**
|
||||
* 检查是否有需要自启动的配置
|
||||
*/
|
||||
fun hasAutoStartConfig(): Boolean {
|
||||
return unameValue != DEFAULT_UNAME ||
|
||||
buildTimeValue != DEFAULT_BUILD_TIME ||
|
||||
susPaths.isNotEmpty() ||
|
||||
susMounts.isNotEmpty() ||
|
||||
tryUmounts.isNotEmpty() ||
|
||||
kstatConfigs.isNotEmpty() ||
|
||||
addKstatPaths.isNotEmpty()
|
||||
}
|
||||
}
|
||||
|
||||
// 基础工具方法
|
||||
private fun getPrefs(context: Context): SharedPreferences =
|
||||
context.getSharedPreferences(PREFS_NAME, Context.MODE_PRIVATE)
|
||||
|
||||
private fun getSuSFSVersionUse(): String = try {
|
||||
getSuSFSVersion()
|
||||
} catch (_: Exception) { "1.5.8" }
|
||||
} catch (_: Exception) { MIN_VERSION_FOR_HIDE_MOUNT }
|
||||
|
||||
private fun getSuSFSBinaryName(): String = "${SUSFS_BINARY_BASE_NAME}_${getSuSFSVersionUse().removePrefix("v")}"
|
||||
|
||||
@@ -78,7 +177,9 @@ object SuSFSManager {
|
||||
return CommandResult(result.isSuccess, result.out.joinToString("\n"), result.err.joinToString("\n"))
|
||||
}
|
||||
|
||||
// 版本比较
|
||||
/**
|
||||
* 版本比较方法
|
||||
*/
|
||||
private fun compareVersions(version1: String, version2: String): Int {
|
||||
val v1Parts = version1.removePrefix("v").split(".").map { it.toIntOrNull() ?: 0 }
|
||||
val v2Parts = version2.removePrefix("v").split(".").map { it.toIntOrNull() ?: 0 }
|
||||
@@ -97,16 +198,42 @@ object SuSFSManager {
|
||||
return 0
|
||||
}
|
||||
|
||||
// 检查当前SuSFS版本是否支持SUS挂载隐藏控制功能
|
||||
/**
|
||||
* 版本检查方法
|
||||
*/
|
||||
fun isSusVersion_1_5_8(): Boolean {
|
||||
return try {
|
||||
val currentVersion = getSuSFSVersion()
|
||||
compareVersions(currentVersion, "1.5.8") >= 0
|
||||
compareVersions(currentVersion, MIN_VERSION_FOR_HIDE_MOUNT) >= 0
|
||||
} catch (_: Exception) {
|
||||
true
|
||||
true // 默认支持新功能
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取当前模块配置
|
||||
*/
|
||||
private fun getCurrentModuleConfig(context: Context): ModuleConfig {
|
||||
return ModuleConfig(
|
||||
targetPath = getSuSFSTargetPath(),
|
||||
unameValue = getUnameValue(context),
|
||||
buildTimeValue = getBuildTimeValue(context),
|
||||
executeInPostFsData = getExecuteInPostFsData(context),
|
||||
susPaths = getSusPaths(context),
|
||||
susMounts = getSusMounts(context),
|
||||
tryUmounts = getTryUmounts(context),
|
||||
androidDataPath = getAndroidDataPath(context),
|
||||
sdcardPath = getSdcardPath(context),
|
||||
enableLog = getEnableLogState(context),
|
||||
kstatConfigs = getKstatConfigs(context),
|
||||
addKstatPaths = getAddKstatPaths(context),
|
||||
hideSusMountsForAllProcs = getHideSusMountsForAllProcs(context),
|
||||
support158 = isSusVersion_1_5_8(),
|
||||
enableHideBl = getEnableHideBl(context),
|
||||
enableCleanupResidue = getEnableCleanupResidue(context),
|
||||
umountForZygoteIsoService = getUmountForZygoteIsoService(context),
|
||||
)
|
||||
}
|
||||
|
||||
// 配置存取方法
|
||||
fun saveUnameValue(context: Context, value: String) =
|
||||
@@ -121,9 +248,6 @@ object SuSFSManager {
|
||||
fun getBuildTimeValue(context: Context): String =
|
||||
getPrefs(context).getString(KEY_BUILD_TIME_VALUE, DEFAULT_BUILD_TIME) ?: DEFAULT_BUILD_TIME
|
||||
|
||||
fun getLastAppliedValue(context: Context): String = getUnameValue(context)
|
||||
fun getLastAppliedBuildTime(context: Context): String = getBuildTimeValue(context)
|
||||
|
||||
fun setAutoStartEnabled(context: Context, enabled: Boolean) =
|
||||
getPrefs(context).edit { putBoolean(KEY_AUTO_START_ENABLED, enabled) }
|
||||
|
||||
@@ -143,8 +267,7 @@ object SuSFSManager {
|
||||
getPrefs(context).edit { putBoolean(KEY_EXECUTE_IN_POST_FS_DATA, executeInPostFsData) }
|
||||
if (isAutoStartEnabled(context)) {
|
||||
kotlinx.coroutines.CoroutineScope(Dispatchers.Default).launch {
|
||||
removeMagiskModule()
|
||||
createMagiskModule(context)
|
||||
updateMagiskModule(context)
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -156,6 +279,29 @@ object SuSFSManager {
|
||||
fun getHideSusMountsForAllProcs(context: Context): Boolean =
|
||||
getPrefs(context).getBoolean(KEY_HIDE_SUS_MOUNTS_FOR_ALL_PROCS, true)
|
||||
|
||||
// 隐藏BL锁脚本
|
||||
fun saveEnableHideBl(context: Context, enabled: Boolean) =
|
||||
getPrefs(context).edit { putBoolean(KEY_ENABLE_HIDE_BL, enabled) }
|
||||
|
||||
fun getEnableHideBl(context: Context): Boolean =
|
||||
getPrefs(context).getBoolean(KEY_ENABLE_HIDE_BL, true)
|
||||
|
||||
|
||||
// 清理残留配置
|
||||
fun saveEnableCleanupResidue(context: Context, enabled: Boolean) =
|
||||
getPrefs(context).edit { putBoolean(KEY_ENABLE_CLEANUP_RESIDUE, enabled) }
|
||||
|
||||
fun getEnableCleanupResidue(context: Context): Boolean =
|
||||
getPrefs(context).getBoolean(KEY_ENABLE_CLEANUP_RESIDUE, false)
|
||||
|
||||
// Zygote隔离服务卸载控制
|
||||
fun saveUmountForZygoteIsoService(context: Context, enabled: Boolean) =
|
||||
getPrefs(context).edit { putBoolean(KEY_UMOUNT_FOR_ZYGOTE_ISO_SERVICE, enabled) }
|
||||
|
||||
fun getUmountForZygoteIsoService(context: Context): Boolean =
|
||||
getPrefs(context).getBoolean(KEY_UMOUNT_FOR_ZYGOTE_ISO_SERVICE, false)
|
||||
|
||||
|
||||
// 路径和配置管理
|
||||
fun saveSusPaths(context: Context, paths: Set<String>) =
|
||||
getPrefs(context).edit { putStringSet(KEY_SUS_PATHS, paths) }
|
||||
@@ -203,7 +349,156 @@ object SuSFSManager {
|
||||
fun getSdcardPath(context: Context): String =
|
||||
getPrefs(context).getString(KEY_SDCARD_PATH, "/sdcard") ?: "/sdcard"
|
||||
|
||||
// 获取所有配置的Map
|
||||
private fun getAllConfigurations(context: Context): Map<String, Any> {
|
||||
return mapOf(
|
||||
KEY_UNAME_VALUE to getUnameValue(context),
|
||||
KEY_BUILD_TIME_VALUE to getBuildTimeValue(context),
|
||||
KEY_AUTO_START_ENABLED to isAutoStartEnabled(context),
|
||||
KEY_SUS_PATHS to getSusPaths(context),
|
||||
KEY_SUS_MOUNTS to getSusMounts(context),
|
||||
KEY_TRY_UMOUNTS to getTryUmounts(context),
|
||||
KEY_ANDROID_DATA_PATH to getAndroidDataPath(context),
|
||||
KEY_SDCARD_PATH to getSdcardPath(context),
|
||||
KEY_ENABLE_LOG to getEnableLogState(context),
|
||||
KEY_EXECUTE_IN_POST_FS_DATA to getExecuteInPostFsData(context),
|
||||
KEY_KSTAT_CONFIGS to getKstatConfigs(context),
|
||||
KEY_ADD_KSTAT_PATHS to getAddKstatPaths(context),
|
||||
KEY_HIDE_SUS_MOUNTS_FOR_ALL_PROCS to getHideSusMountsForAllProcs(context),
|
||||
KEY_ENABLE_HIDE_BL to getEnableHideBl(context),
|
||||
KEY_ENABLE_CLEANUP_RESIDUE to getEnableCleanupResidue(context),
|
||||
KEY_UMOUNT_FOR_ZYGOTE_ISO_SERVICE to getUmountForZygoteIsoService(context),
|
||||
)
|
||||
}
|
||||
|
||||
//生成备份文件名
|
||||
private fun generateBackupFileName(): String {
|
||||
val dateFormat = SimpleDateFormat("yyyyMMdd_HHmmss", Locale.getDefault())
|
||||
val timestamp = dateFormat.format(Date())
|
||||
return "SuSFS_Config_$timestamp$BACKUP_FILE_EXTENSION"
|
||||
}
|
||||
|
||||
// 获取设备信息
|
||||
private fun getDeviceInfo(): String {
|
||||
return try {
|
||||
"${android.os.Build.MANUFACTURER} ${android.os.Build.MODEL} (${android.os.Build.VERSION.RELEASE})"
|
||||
} catch (_: Exception) {
|
||||
"Unknown Device"
|
||||
}
|
||||
}
|
||||
|
||||
// 创建配置备份
|
||||
suspend fun createBackup(context: Context, backupFilePath: String): Boolean = withContext(Dispatchers.IO) {
|
||||
try {
|
||||
val configurations = getAllConfigurations(context)
|
||||
val backupData = BackupData(
|
||||
version = getSuSFSVersion(),
|
||||
timestamp = System.currentTimeMillis(),
|
||||
deviceInfo = getDeviceInfo(),
|
||||
configurations = configurations
|
||||
)
|
||||
|
||||
val backupFile = File(backupFilePath)
|
||||
backupFile.parentFile?.mkdirs()
|
||||
|
||||
backupFile.writeText(backupData.toJson())
|
||||
|
||||
showToast(context, context.getString(R.string.susfs_backup_success, backupFile.name))
|
||||
true
|
||||
} catch (e: Exception) {
|
||||
e.printStackTrace()
|
||||
showToast(context, context.getString(R.string.susfs_backup_failed, e.message ?: "Unknown error"))
|
||||
false
|
||||
}
|
||||
}
|
||||
|
||||
//从备份文件还原配置
|
||||
suspend fun restoreFromBackup(context: Context, backupFilePath: String): Boolean = withContext(Dispatchers.IO) {
|
||||
try {
|
||||
val backupFile = File(backupFilePath)
|
||||
if (!backupFile.exists()) {
|
||||
showToast(context, context.getString(R.string.susfs_backup_file_not_found))
|
||||
return@withContext false
|
||||
}
|
||||
|
||||
val backupContent = backupFile.readText()
|
||||
val backupData = BackupData.fromJson(backupContent)
|
||||
|
||||
if (backupData == null) {
|
||||
showToast(context, context.getString(R.string.susfs_backup_invalid_format))
|
||||
return@withContext false
|
||||
}
|
||||
|
||||
// 检查备份版本兼容性
|
||||
if (backupData.version != getSuSFSVersion()) {
|
||||
showToast(context, context.getString(R.string.susfs_backup_version_mismatch))
|
||||
}
|
||||
|
||||
// 还原所有配置
|
||||
restoreConfigurations(context, backupData.configurations)
|
||||
|
||||
// 如果自启动已启用,更新模块
|
||||
if (isAutoStartEnabled(context)) {
|
||||
updateMagiskModule(context)
|
||||
}
|
||||
|
||||
val dateFormat = SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.getDefault())
|
||||
val backupDate = dateFormat.format(Date(backupData.timestamp))
|
||||
|
||||
showToast(context, context.getString(R.string.susfs_restore_success, backupDate, backupData.deviceInfo))
|
||||
true
|
||||
} catch (e: Exception) {
|
||||
e.printStackTrace()
|
||||
showToast(context, context.getString(R.string.susfs_restore_failed, e.message ?: "Unknown error"))
|
||||
false
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// 还原配置到SharedPreferences
|
||||
private fun restoreConfigurations(context: Context, configurations: Map<String, Any>) {
|
||||
val prefs = getPrefs(context)
|
||||
prefs.edit {
|
||||
configurations.forEach { (key, value) ->
|
||||
when (value) {
|
||||
is String -> putString(key, value)
|
||||
is Boolean -> putBoolean(key, value)
|
||||
is Set<*> -> {
|
||||
@Suppress("UNCHECKED_CAST")
|
||||
putStringSet(key, value as Set<String>)
|
||||
}
|
||||
is Int -> putInt(key, value)
|
||||
is Long -> putLong(key, value)
|
||||
is Float -> putFloat(key, value)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// 验证备份文件
|
||||
suspend fun validateBackupFile(backupFilePath: String): BackupData? = withContext(Dispatchers.IO) {
|
||||
try {
|
||||
val backupFile = File(backupFilePath)
|
||||
if (!backupFile.exists()) {
|
||||
return@withContext null
|
||||
}
|
||||
|
||||
val backupContent = backupFile.readText()
|
||||
BackupData.fromJson(backupContent)
|
||||
} catch (e: Exception) {
|
||||
e.printStackTrace()
|
||||
null
|
||||
}
|
||||
}
|
||||
|
||||
//获取备份文件路径
|
||||
fun getRecommendedBackupPath(context: Context): String {
|
||||
val documentsDir = File(context.getExternalFilesDir(null), "SuSFS_Backups")
|
||||
if (!documentsDir.exists()) {
|
||||
documentsDir.mkdirs()
|
||||
}
|
||||
return File(documentsDir, generateBackupFileName()).absolutePath
|
||||
}
|
||||
|
||||
// 槽位信息获取
|
||||
suspend fun getCurrentSlotInfo(): List<SlotInfo> = withContext(Dispatchers.IO) {
|
||||
@@ -310,17 +605,19 @@ object SuSFSManager {
|
||||
Toast.makeText(context, message, Toast.LENGTH_SHORT).show()
|
||||
}
|
||||
|
||||
private inline fun <reified T> Map<String, Any?>.getSetSafe(key: String): Set<T> {
|
||||
return when (val value = this[key]) {
|
||||
is Set<*> -> value.filterIsInstance<T>().toSet()
|
||||
else -> emptySet()
|
||||
}
|
||||
/**
|
||||
* 模块管理
|
||||
*/
|
||||
private suspend fun updateMagiskModule(context: Context): Boolean {
|
||||
return removeMagiskModule() && createMagiskModule(context)
|
||||
}
|
||||
|
||||
// 模块管理
|
||||
/**
|
||||
* 模块创建方法
|
||||
*/
|
||||
private suspend fun createMagiskModule(context: Context): Boolean = withContext(Dispatchers.IO) {
|
||||
try {
|
||||
val targetPath = getSuSFSTargetPath()
|
||||
val config = getCurrentModuleConfig(context)
|
||||
|
||||
// 创建模块目录
|
||||
if (!runCmdWithResult("mkdir -p $MODULE_PATH").isSuccess) return@withContext false
|
||||
@@ -329,44 +626,9 @@ object SuSFSManager {
|
||||
val moduleProp = ScriptGenerator.generateModuleProp(MODULE_ID)
|
||||
if (!runCmdWithResult("cat > $MODULE_PATH/module.prop << 'EOF'\n$moduleProp\nEOF").isSuccess) return@withContext false
|
||||
|
||||
// 获取配置
|
||||
val config = mapOf(
|
||||
"unameValue" to getUnameValue(context),
|
||||
"buildTimeValue" to getBuildTimeValue(context),
|
||||
"executeInPostFsData" to getExecuteInPostFsData(context),
|
||||
"susPaths" to getSusPaths(context),
|
||||
"susMounts" to getSusMounts(context),
|
||||
"tryUmounts" to getTryUmounts(context),
|
||||
"androidDataPath" to getAndroidDataPath(context),
|
||||
"sdcardPath" to getSdcardPath(context),
|
||||
"enableLog" to getEnableLogState(context),
|
||||
"kstatConfigs" to getKstatConfigs(context),
|
||||
"addKstatPaths" to getAddKstatPaths(context),
|
||||
"hideSusMountsForAllProcs" to getHideSusMountsForAllProcs(context)
|
||||
)
|
||||
// 生成并创建所有脚本文件
|
||||
val scripts = ScriptGenerator.generateAllScripts(config)
|
||||
|
||||
// 生成脚本
|
||||
val scripts = mapOf(
|
||||
"service.sh" to ScriptGenerator.generateServiceScript(
|
||||
targetPath, config["unameValue"] as String, config["buildTimeValue"] as String,
|
||||
config.getSetSafe<String>("susPaths"), config["androidDataPath"] as String,
|
||||
config["sdcardPath"] as String, config["enableLog"] as Boolean,
|
||||
config["executeInPostFsData"] as Boolean, config.getSetSafe<String>("kstatConfigs"),
|
||||
config.getSetSafe<String>("addKstatPaths")
|
||||
),
|
||||
"post-fs-data.sh" to ScriptGenerator.generatePostFsDataScript(
|
||||
targetPath, config["unameValue"] as String, config["buildTimeValue"] as String,
|
||||
config["executeInPostFsData"] as Boolean
|
||||
),
|
||||
"post-mount.sh" to ScriptGenerator.generatePostMountScript(
|
||||
targetPath, config.getSetSafe<String>("susMounts"), config.getSetSafe<String>("tryUmounts")
|
||||
),
|
||||
"boot-completed.sh" to ScriptGenerator.generateBootCompletedScript(
|
||||
targetPath, config["hideSusMountsForAllProcs"] as Boolean
|
||||
)
|
||||
)
|
||||
|
||||
// 创建脚本文件
|
||||
scripts.all { (filename, content) ->
|
||||
runCmdWithResult("cat > $MODULE_PATH/$filename << 'EOF'\n$content\nEOF").isSuccess &&
|
||||
runCmdWithResult("chmod 755 $MODULE_PATH/$filename").isSuccess
|
||||
@@ -386,19 +648,49 @@ object SuSFSManager {
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// 功能状态获取
|
||||
suspend fun getEnabledFeatures(context: Context): List<EnabledFeature> = withContext(Dispatchers.IO) {
|
||||
try {
|
||||
Natives.getSusfsFeatureStatus()?.let { status ->
|
||||
val status = Natives.getSusfsFeatureStatus()
|
||||
if (status != null) {
|
||||
parseEnabledFeaturesFromStatus(context, status)
|
||||
} ?: emptyList()
|
||||
} else {
|
||||
getDefaultDisabledFeatures(context)
|
||||
}
|
||||
} catch (e: Exception) {
|
||||
e.printStackTrace()
|
||||
emptyList()
|
||||
getDefaultDisabledFeatures(context)
|
||||
}
|
||||
}
|
||||
|
||||
private fun getDefaultDisabledFeatures(context: Context): List<EnabledFeature> {
|
||||
val defaultFeatures = listOf(
|
||||
"sus_path_feature_label" to context.getString(R.string.sus_path_feature_label),
|
||||
"sus_mount_feature_label" to context.getString(R.string.sus_mount_feature_label),
|
||||
"try_umount_feature_label" to context.getString(R.string.try_umount_feature_label),
|
||||
"spoof_uname_feature_label" to context.getString(R.string.spoof_uname_feature_label),
|
||||
"spoof_cmdline_feature_label" to context.getString(R.string.spoof_cmdline_feature_label),
|
||||
"open_redirect_feature_label" to context.getString(R.string.open_redirect_feature_label),
|
||||
"enable_log_feature_label" to context.getString(R.string.enable_log_feature_label),
|
||||
"auto_default_mount_feature_label" to context.getString(R.string.auto_default_mount_feature_label),
|
||||
"auto_bind_mount_feature_label" to context.getString(R.string.auto_bind_mount_feature_label),
|
||||
"auto_try_umount_bind_feature_label" to context.getString(R.string.auto_try_umount_bind_feature_label),
|
||||
"hide_symbols_feature_label" to context.getString(R.string.hide_symbols_feature_label),
|
||||
"sus_kstat_feature_label" to context.getString(R.string.sus_kstat_feature_label),
|
||||
"magic_mount_feature_label" to context.getString(R.string.magic_mount_feature_label),
|
||||
"sus_su_feature_label" to context.getString(R.string.sus_su_feature_label)
|
||||
)
|
||||
|
||||
return defaultFeatures.map { (_, displayName) ->
|
||||
EnabledFeature(
|
||||
name = displayName,
|
||||
isEnabled = false,
|
||||
statusText = context.getString(R.string.susfs_feature_disabled),
|
||||
canConfigure = displayName == context.getString(R.string.enable_log_feature_label)
|
||||
)
|
||||
}.sortedBy { it.name }
|
||||
}
|
||||
|
||||
private fun parseEnabledFeaturesFromStatus(context: Context, status: Natives.SusfsFeatureStatus): List<EnabledFeature> {
|
||||
val featureList = listOf(
|
||||
Triple("status_sus_path", context.getString(R.string.sus_path_feature_label), status.statusSusPath),
|
||||
@@ -429,7 +721,7 @@ object SuSFSManager {
|
||||
val success = executeSusfsCommand(context, "enable_log ${if (enabled) 1 else 0}")
|
||||
if (success) {
|
||||
saveEnableLogState(context, enabled)
|
||||
if (isAutoStartEnabled(context)) createMagiskModule(context)
|
||||
if (isAutoStartEnabled(context)) updateMagiskModule(context)
|
||||
showToast(context, if (enabled) context.getString(R.string.susfs_log_enabled) else context.getString(R.string.susfs_log_disabled))
|
||||
}
|
||||
return success
|
||||
@@ -444,7 +736,7 @@ object SuSFSManager {
|
||||
val success = executeSusfsCommand(context, "hide_sus_mnts_for_all_procs ${if (hideForAll) 1 else 0}")
|
||||
if (success) {
|
||||
saveHideSusMountsForAllProcs(context, hideForAll)
|
||||
if (isAutoStartEnabled(context)) createMagiskModule(context)
|
||||
if (isAutoStartEnabled(context)) updateMagiskModule(context)
|
||||
showToast(context, if (hideForAll)
|
||||
context.getString(R.string.susfs_hide_mounts_all_enabled)
|
||||
else
|
||||
@@ -461,7 +753,7 @@ object SuSFSManager {
|
||||
if (success) {
|
||||
saveUnameValue(context, unameValue)
|
||||
saveBuildTimeValue(context, buildTimeValue)
|
||||
if (isAutoStartEnabled(context)) createMagiskModule(context)
|
||||
if (isAutoStartEnabled(context)) updateMagiskModule(context)
|
||||
showToast(context, context.getString(R.string.susfs_uname_set_success, unameValue, buildTimeValue))
|
||||
}
|
||||
return success
|
||||
@@ -470,12 +762,37 @@ object SuSFSManager {
|
||||
// 添加SUS路径
|
||||
@SuppressLint("StringFormatInvalid")
|
||||
suspend fun addSusPath(context: Context, path: String): Boolean {
|
||||
// 如果是1.5.8版本,先设置路径配置
|
||||
if (isSusVersion_1_5_8()) {
|
||||
// 获取当前配置的路径,如果没有配置则使用默认值
|
||||
val androidDataPath = getAndroidDataPath(context)
|
||||
val sdcardPath = getSdcardPath(context)
|
||||
|
||||
// 先设置Android Data路径
|
||||
val androidDataSuccess = executeSusfsCommand(context, "set_android_data_root_path '$androidDataPath'")
|
||||
if (androidDataSuccess) {
|
||||
showToast(context, context.getString(R.string.susfs_android_data_path_set, androidDataPath))
|
||||
}
|
||||
|
||||
// 再设置SD卡路径
|
||||
val sdcardSuccess = executeSusfsCommand(context, "set_sdcard_root_path '$sdcardPath'")
|
||||
if (sdcardSuccess) {
|
||||
showToast(context, context.getString(R.string.susfs_sdcard_path_set, sdcardPath))
|
||||
}
|
||||
|
||||
// 如果路径设置失败,记录但不阻止继续执行
|
||||
if (!androidDataSuccess || !sdcardSuccess) {
|
||||
showToast(context, context.getString(R.string.susfs_path_setup_warning))
|
||||
}
|
||||
}
|
||||
|
||||
// 执行添加SUS路径命令
|
||||
val result = executeSusfsCommandWithOutput(context, "add_sus_path '$path'")
|
||||
val isActuallySuccessful = result.isSuccess && !result.output.contains("not found, skip adding")
|
||||
|
||||
if (isActuallySuccessful) {
|
||||
saveSusPaths(context, getSusPaths(context) + path)
|
||||
if (isAutoStartEnabled(context)) createMagiskModule(context)
|
||||
if (isAutoStartEnabled(context)) updateMagiskModule(context)
|
||||
showToast(context, context.getString(R.string.susfs_sus_path_added_success, path))
|
||||
} else {
|
||||
val errorMessage = if (result.output.contains("not found, skip adding")) {
|
||||
@@ -490,33 +807,59 @@ object SuSFSManager {
|
||||
|
||||
suspend fun removeSusPath(context: Context, path: String): Boolean {
|
||||
saveSusPaths(context, getSusPaths(context) - path)
|
||||
if (isAutoStartEnabled(context)) createMagiskModule(context)
|
||||
if (isAutoStartEnabled(context)) updateMagiskModule(context)
|
||||
showToast(context, "SUS path removed: $path")
|
||||
return true
|
||||
}
|
||||
|
||||
// 编辑SUS路径
|
||||
suspend fun editSusPath(context: Context, oldPath: String, newPath: String): Boolean {
|
||||
val currentPaths = getSusPaths(context).toMutableSet()
|
||||
if (currentPaths.remove(oldPath)) {
|
||||
currentPaths.add(newPath)
|
||||
saveSusPaths(context, currentPaths)
|
||||
if (isAutoStartEnabled(context)) updateMagiskModule(context)
|
||||
showToast(context, "SUS path updated: $oldPath -> $newPath")
|
||||
return true
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
// 添加SUS挂载
|
||||
suspend fun addSusMount(context: Context, mount: String): Boolean {
|
||||
val success = executeSusfsCommand(context, "add_sus_mount '$mount'")
|
||||
if (success) {
|
||||
saveSusMounts(context, getSusMounts(context) + mount)
|
||||
if (isAutoStartEnabled(context)) createMagiskModule(context)
|
||||
if (isAutoStartEnabled(context)) updateMagiskModule(context)
|
||||
}
|
||||
return success
|
||||
}
|
||||
|
||||
suspend fun removeSusMount(context: Context, mount: String): Boolean {
|
||||
saveSusMounts(context, getSusMounts(context) - mount)
|
||||
if (isAutoStartEnabled(context)) createMagiskModule(context)
|
||||
if (isAutoStartEnabled(context)) updateMagiskModule(context)
|
||||
showToast(context, "Removed SUS mount: $mount")
|
||||
return true
|
||||
}
|
||||
|
||||
// 编辑SUS挂载
|
||||
suspend fun editSusMount(context: Context, oldMount: String, newMount: String): Boolean {
|
||||
val currentMounts = getSusMounts(context).toMutableSet()
|
||||
if (currentMounts.remove(oldMount)) {
|
||||
currentMounts.add(newMount)
|
||||
saveSusMounts(context, currentMounts)
|
||||
if (isAutoStartEnabled(context)) updateMagiskModule(context)
|
||||
showToast(context, "SUS mount updated: $oldMount -> $newMount")
|
||||
return true
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
// 添加尝试卸载
|
||||
suspend fun addTryUmount(context: Context, path: String, mode: Int): Boolean {
|
||||
val commandSuccess = executeSusfsCommand(context, "add_try_umount '$path' $mode")
|
||||
saveTryUmounts(context, getTryUmounts(context) + "$path|$mode")
|
||||
if (isAutoStartEnabled(context)) createMagiskModule(context)
|
||||
if (isAutoStartEnabled(context)) updateMagiskModule(context)
|
||||
|
||||
showToast(context, if (commandSuccess) {
|
||||
context.getString(R.string.susfs_try_umount_added_success, path)
|
||||
@@ -528,14 +871,50 @@ object SuSFSManager {
|
||||
|
||||
suspend fun removeTryUmount(context: Context, umountEntry: String): Boolean {
|
||||
saveTryUmounts(context, getTryUmounts(context) - umountEntry)
|
||||
if (isAutoStartEnabled(context)) createMagiskModule(context)
|
||||
if (isAutoStartEnabled(context)) updateMagiskModule(context)
|
||||
val path = umountEntry.split("|").firstOrNull() ?: umountEntry
|
||||
showToast(context, "Removed Try to uninstall: $path")
|
||||
return true
|
||||
}
|
||||
|
||||
// 编辑尝试卸载
|
||||
suspend fun editTryUmount(context: Context, oldEntry: String, newPath: String, newMode: Int): Boolean {
|
||||
val currentUmounts = getTryUmounts(context).toMutableSet()
|
||||
if (currentUmounts.remove(oldEntry)) {
|
||||
currentUmounts.add("$newPath|$newMode")
|
||||
saveTryUmounts(context, currentUmounts)
|
||||
if (isAutoStartEnabled(context)) updateMagiskModule(context)
|
||||
showToast(context, "Try umount updated: $oldEntry -> $newPath|$newMode")
|
||||
return true
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
suspend fun runTryUmount(context: Context): Boolean = executeSusfsCommand(context, "run_try_umount")
|
||||
|
||||
// Zygote隔离服务卸载控制
|
||||
suspend fun setUmountForZygoteIsoService(context: Context, enabled: Boolean): Boolean {
|
||||
if (!isSusVersion_1_5_8()) {
|
||||
return false
|
||||
}
|
||||
|
||||
val result = executeSusfsCommandWithOutput(context, "umount_for_zygote_iso_service ${if (enabled) 1 else 0}")
|
||||
val success = result.isSuccess && result.output.isEmpty()
|
||||
|
||||
if (success) {
|
||||
saveUmountForZygoteIsoService(context, enabled)
|
||||
if (isAutoStartEnabled(context)) updateMagiskModule(context)
|
||||
showToast(context, if (enabled)
|
||||
context.getString(R.string.umount_zygote_iso_service_enabled)
|
||||
else
|
||||
context.getString(R.string.umount_zygote_iso_service_disabled)
|
||||
)
|
||||
} else {
|
||||
showToast(context, context.getString(R.string.susfs_command_failed))
|
||||
}
|
||||
return success
|
||||
}
|
||||
|
||||
// 添加kstat配置
|
||||
suspend fun addKstatStatically(context: Context, path: String, ino: String, dev: String, nlink: String,
|
||||
size: String, atime: String, atimeNsec: String, mtime: String, mtimeNsec: String,
|
||||
@@ -545,7 +924,7 @@ object SuSFSManager {
|
||||
if (success) {
|
||||
val configEntry = "$path|$ino|$dev|$nlink|$size|$atime|$atimeNsec|$mtime|$mtimeNsec|$ctime|$ctimeNsec|$blocks|$blksize"
|
||||
saveKstatConfigs(context, getKstatConfigs(context) + configEntry)
|
||||
if (isAutoStartEnabled(context)) createMagiskModule(context)
|
||||
if (isAutoStartEnabled(context)) updateMagiskModule(context)
|
||||
showToast(context, context.getString(R.string.kstat_static_config_added, path))
|
||||
}
|
||||
return success
|
||||
@@ -553,18 +932,35 @@ object SuSFSManager {
|
||||
|
||||
suspend fun removeKstatConfig(context: Context, config: String): Boolean {
|
||||
saveKstatConfigs(context, getKstatConfigs(context) - config)
|
||||
if (isAutoStartEnabled(context)) createMagiskModule(context)
|
||||
if (isAutoStartEnabled(context)) updateMagiskModule(context)
|
||||
val path = config.split("|").firstOrNull() ?: config
|
||||
showToast(context, context.getString(R.string.kstat_config_removed, path))
|
||||
return true
|
||||
}
|
||||
|
||||
// 编辑kstat配置
|
||||
@SuppressLint("StringFormatInvalid")
|
||||
suspend fun editKstatConfig(context: Context, oldConfig: String, path: String, ino: String, dev: String, nlink: String,
|
||||
size: String, atime: String, atimeNsec: String, mtime: String, mtimeNsec: String,
|
||||
ctime: String, ctimeNsec: String, blocks: String, blksize: String): Boolean {
|
||||
val currentConfigs = getKstatConfigs(context).toMutableSet()
|
||||
if (currentConfigs.remove(oldConfig)) {
|
||||
val newConfigEntry = "$path|$ino|$dev|$nlink|$size|$atime|$atimeNsec|$mtime|$mtimeNsec|$ctime|$ctimeNsec|$blocks|$blksize"
|
||||
currentConfigs.add(newConfigEntry)
|
||||
saveKstatConfigs(context, currentConfigs)
|
||||
if (isAutoStartEnabled(context)) updateMagiskModule(context)
|
||||
showToast(context, context.getString(R.string.kstat_config_updated, path))
|
||||
return true
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
// 添加kstat路径
|
||||
suspend fun addKstat(context: Context, path: String): Boolean {
|
||||
val success = executeSusfsCommand(context, "add_sus_kstat '$path'")
|
||||
if (success) {
|
||||
saveAddKstatPaths(context, getAddKstatPaths(context) + path)
|
||||
if (isAutoStartEnabled(context)) createMagiskModule(context)
|
||||
if (isAutoStartEnabled(context)) updateMagiskModule(context)
|
||||
showToast(context, context.getString(R.string.kstat_path_added, path))
|
||||
}
|
||||
return success
|
||||
@@ -572,11 +968,25 @@ object SuSFSManager {
|
||||
|
||||
suspend fun removeAddKstat(context: Context, path: String): Boolean {
|
||||
saveAddKstatPaths(context, getAddKstatPaths(context) - path)
|
||||
if (isAutoStartEnabled(context)) createMagiskModule(context)
|
||||
if (isAutoStartEnabled(context)) updateMagiskModule(context)
|
||||
showToast(context, context.getString(R.string.kstat_path_removed, path))
|
||||
return true
|
||||
}
|
||||
|
||||
// 编辑kstat路径
|
||||
@SuppressLint("StringFormatInvalid")
|
||||
suspend fun editAddKstat(context: Context, oldPath: String, newPath: String): Boolean {
|
||||
val currentPaths = getAddKstatPaths(context).toMutableSet()
|
||||
if (currentPaths.remove(oldPath)) {
|
||||
currentPaths.add(newPath)
|
||||
saveAddKstatPaths(context, currentPaths)
|
||||
if (isAutoStartEnabled(context)) updateMagiskModule(context)
|
||||
showToast(context, context.getString(R.string.kstat_path_updated, oldPath, newPath))
|
||||
return true
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
// 更新kstat
|
||||
suspend fun updateKstat(context: Context, path: String): Boolean {
|
||||
val success = executeSusfsCommand(context, "update_sus_kstat '$path'")
|
||||
@@ -591,12 +1001,16 @@ object SuSFSManager {
|
||||
return success
|
||||
}
|
||||
|
||||
// 设置Android数据路径和SD卡路径
|
||||
// 设置Android数据路径
|
||||
suspend fun setAndroidDataPath(context: Context, path: String): Boolean {
|
||||
val success = executeSusfsCommand(context, "set_android_data_root_path '$path'")
|
||||
if (success) {
|
||||
saveAndroidDataPath(context, path)
|
||||
if (isAutoStartEnabled(context)) createMagiskModule(context)
|
||||
if (isAutoStartEnabled(context)) {
|
||||
kotlinx.coroutines.CoroutineScope(Dispatchers.Default).launch {
|
||||
updateMagiskModule(context)
|
||||
}
|
||||
}
|
||||
}
|
||||
return success
|
||||
}
|
||||
@@ -606,23 +1020,28 @@ object SuSFSManager {
|
||||
val success = executeSusfsCommand(context, "set_sdcard_root_path '$path'")
|
||||
if (success) {
|
||||
saveSdcardPath(context, path)
|
||||
if (isAutoStartEnabled(context)) createMagiskModule(context)
|
||||
if (isAutoStartEnabled(context)) {
|
||||
kotlinx.coroutines.CoroutineScope(Dispatchers.Default).launch {
|
||||
updateMagiskModule(context)
|
||||
}
|
||||
}
|
||||
}
|
||||
return success
|
||||
}
|
||||
|
||||
/**
|
||||
* 自启动配置检查
|
||||
*/
|
||||
fun hasConfigurationForAutoStart(context: Context): Boolean {
|
||||
val enabledFeatures = runBlocking { getEnabledFeatures(context) }
|
||||
return getUnameValue(context) != DEFAULT_UNAME ||
|
||||
getBuildTimeValue(context) != DEFAULT_BUILD_TIME ||
|
||||
getSusPaths(context).isNotEmpty() ||
|
||||
getSusMounts(context).isNotEmpty() ||
|
||||
getTryUmounts(context).isNotEmpty() ||
|
||||
getKstatConfigs(context).isNotEmpty() ||
|
||||
getAddKstatPaths(context).isNotEmpty() ||
|
||||
enabledFeatures.any { it.isEnabled }
|
||||
val config = getCurrentModuleConfig(context)
|
||||
return config.hasAutoStartConfig() || runBlocking {
|
||||
getEnabledFeatures(context).any { it.isEnabled }
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 自启动配置方法
|
||||
*/
|
||||
suspend fun configureAutoStart(context: Context, enabled: Boolean): Boolean = withContext(Dispatchers.IO) {
|
||||
try {
|
||||
if (enabled) {
|
||||
|
||||
@@ -9,14 +9,22 @@ import android.annotation.SuppressLint
|
||||
object ScriptGenerator {
|
||||
|
||||
// 常量定义
|
||||
@SuppressLint("SdCardPath")
|
||||
private const val DEFAULT_ANDROID_DATA_PATH = "/sdcard/Android/data"
|
||||
@SuppressLint("SdCardPath")
|
||||
private const val DEFAULT_SDCARD_PATH = "/sdcard"
|
||||
private const val DEFAULT_UNAME = "default"
|
||||
private const val DEFAULT_BUILD_TIME = "default"
|
||||
private const val LOG_DIR = "/data/adb/ksu/log"
|
||||
|
||||
/**
|
||||
* 生成所有脚本文件
|
||||
*/
|
||||
fun generateAllScripts(config: SuSFSManager.ModuleConfig): Map<String, String> {
|
||||
return mapOf(
|
||||
"service.sh" to generateServiceScript(config),
|
||||
"post-fs-data.sh" to generatePostFsDataScript(config),
|
||||
"post-mount.sh" to generatePostMountScript(config),
|
||||
"boot-completed.sh" to generateBootCompletedScript(config)
|
||||
)
|
||||
}
|
||||
|
||||
// 日志相关的通用脚本片段
|
||||
private fun generateLogSetup(logFileName: String): String = """
|
||||
# 日志目录
|
||||
@@ -46,18 +54,7 @@ object ScriptGenerator {
|
||||
* 生成service.sh脚本内容
|
||||
*/
|
||||
@SuppressLint("SdCardPath")
|
||||
fun generateServiceScript(
|
||||
targetPath: String,
|
||||
unameValue: String,
|
||||
buildTimeValue: String,
|
||||
susPaths: Set<String>,
|
||||
androidDataPath: String,
|
||||
sdcardPath: String,
|
||||
enableLog: Boolean,
|
||||
executeInPostFsData: Boolean = false,
|
||||
kstatConfigs: Set<String> = emptySet(),
|
||||
addKstatPaths: Set<String> = emptySet()
|
||||
): String {
|
||||
private fun generateServiceScript(config: SuSFSManager.ModuleConfig): String {
|
||||
return buildString {
|
||||
appendLine("#!/system/bin/sh")
|
||||
appendLine("# SuSFS Service Script")
|
||||
@@ -65,31 +62,52 @@ object ScriptGenerator {
|
||||
appendLine()
|
||||
appendLine(generateLogSetup("susfs_service.log"))
|
||||
appendLine()
|
||||
appendLine(generateBinaryCheck(targetPath))
|
||||
appendLine(generateBinaryCheck(config.targetPath))
|
||||
appendLine()
|
||||
|
||||
// 设置日志启用状态
|
||||
generateLogSettingSection(enableLog)
|
||||
|
||||
// 设置路径
|
||||
generatePathSettingSection(androidDataPath, sdcardPath)
|
||||
|
||||
// 添加SUS路径
|
||||
generateSusPathsSection(susPaths)
|
||||
|
||||
// 添加Kstat配置
|
||||
generateKstatSection(kstatConfigs, addKstatPaths)
|
||||
if (shouldConfigureInService(config)) {
|
||||
// 添加SUS路径 (仅在不支持隐藏挂载时)
|
||||
if (!config.support158 && config.susPaths.isNotEmpty()) {
|
||||
appendLine()
|
||||
appendLine("until [ -d \"/sdcard/Android\" ]; do sleep 1; done")
|
||||
appendLine("sleep 45")
|
||||
generateSusPathsSection(config.susPaths)
|
||||
}
|
||||
|
||||
// 设置uname和构建时间
|
||||
generateUnameSection(unameValue, buildTimeValue, executeInPostFsData)
|
||||
generateUnameSection(config)
|
||||
|
||||
// 添加Kstat配置
|
||||
generateKstatSection(config.kstatConfigs, config.addKstatPaths)
|
||||
}
|
||||
|
||||
// 添加日志设置
|
||||
generateLogSettingSection(config.enableLog)
|
||||
|
||||
// 隐藏BL相关配置
|
||||
if (config.enableHideBl) {
|
||||
generateHideBlSection()
|
||||
}
|
||||
|
||||
// 清理工具残留
|
||||
if (config.enableCleanupResidue) {
|
||||
generateCleanupResidueSection()
|
||||
}
|
||||
|
||||
appendLine("echo \"$(get_current_time): Service脚本执行完成\" >> \"${'$'}LOG_FILE\"")
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 判断是否需要在service中配置
|
||||
*/
|
||||
private fun shouldConfigureInService(config: SuSFSManager.ModuleConfig): Boolean {
|
||||
return config.susPaths.isNotEmpty() ||
|
||||
config.kstatConfigs.isNotEmpty() ||
|
||||
config.addKstatPaths.isNotEmpty() ||
|
||||
(!config.executeInPostFsData && (config.unameValue != DEFAULT_UNAME || config.buildTimeValue != DEFAULT_BUILD_TIME))
|
||||
}
|
||||
|
||||
private fun StringBuilder.generateLogSettingSection(enableLog: Boolean) {
|
||||
appendLine("# 设置日志启用状态")
|
||||
val logValue = if (enableLog) 1 else 0
|
||||
@@ -98,27 +116,6 @@ object ScriptGenerator {
|
||||
appendLine()
|
||||
}
|
||||
|
||||
private fun StringBuilder.generatePathSettingSection(
|
||||
androidDataPath: String,
|
||||
sdcardPath: String
|
||||
) {
|
||||
// 设置Android Data路径
|
||||
if (androidDataPath != DEFAULT_ANDROID_DATA_PATH) {
|
||||
appendLine("# 设置Android Data路径")
|
||||
appendLine("\"${'$'}SUSFS_BIN\" set_android_data_root_path '$androidDataPath'")
|
||||
appendLine("echo \"$(get_current_time): Android Data路径设置为: $androidDataPath\" >> \"${'$'}LOG_FILE\"")
|
||||
appendLine()
|
||||
}
|
||||
|
||||
// 设置SD卡路径
|
||||
if (sdcardPath != DEFAULT_SDCARD_PATH) {
|
||||
appendLine("# 设置SD卡路径")
|
||||
appendLine("\"${'$'}SUSFS_BIN\" set_sdcard_root_path '$sdcardPath'")
|
||||
appendLine("echo \"$(get_current_time): SD卡路径设置为: $sdcardPath\" >> \"${'$'}LOG_FILE\"")
|
||||
appendLine()
|
||||
}
|
||||
}
|
||||
|
||||
private fun StringBuilder.generateSusPathsSection(susPaths: Set<String>) {
|
||||
if (susPaths.isNotEmpty()) {
|
||||
appendLine("# 添加SUS路径")
|
||||
@@ -130,6 +127,7 @@ object ScriptGenerator {
|
||||
}
|
||||
}
|
||||
|
||||
@SuppressLint("SdCardPath")
|
||||
private fun StringBuilder.generateKstatSection(
|
||||
kstatConfigs: Set<String>,
|
||||
addKstatPaths: Set<String>
|
||||
@@ -152,9 +150,10 @@ object ScriptGenerator {
|
||||
if (parts.size >= 13) {
|
||||
val path = parts[0]
|
||||
val params = parts.drop(1).joinToString("' '", "'", "'")
|
||||
appendLine()
|
||||
appendLine("\"${'$'}SUSFS_BIN\" add_sus_kstat_statically '$path' $params")
|
||||
appendLine("echo \"$(get_current_time): 添加Kstat静态配置: $path\" >> \"${'$'}LOG_FILE\"")
|
||||
|
||||
appendLine()
|
||||
appendLine("\"${'$'}SUSFS_BIN\" update_sus_kstat '$path'")
|
||||
appendLine("echo \"$(get_current_time): 更新Kstat配置: $path\" >> \"${'$'}LOG_FILE\"")
|
||||
}
|
||||
@@ -163,15 +162,11 @@ object ScriptGenerator {
|
||||
}
|
||||
}
|
||||
|
||||
private fun StringBuilder.generateUnameSection(
|
||||
unameValue: String,
|
||||
buildTimeValue: String,
|
||||
executeInPostFsData: Boolean
|
||||
) {
|
||||
if (!executeInPostFsData && (unameValue != DEFAULT_UNAME || buildTimeValue != DEFAULT_BUILD_TIME)) {
|
||||
private fun StringBuilder.generateUnameSection(config: SuSFSManager.ModuleConfig) {
|
||||
if (!config.executeInPostFsData && (config.unameValue != DEFAULT_UNAME || config.buildTimeValue != DEFAULT_BUILD_TIME)) {
|
||||
appendLine("# 设置uname和构建时间")
|
||||
appendLine("\"${'$'}SUSFS_BIN\" set_uname '$unameValue' '$buildTimeValue'")
|
||||
appendLine("echo \"$(get_current_time): 设置uname为: $unameValue, 构建时间为: $buildTimeValue\" >> \"${'$'}LOG_FILE\"")
|
||||
appendLine("\"${'$'}SUSFS_BIN\" set_uname '${config.unameValue}' '${config.buildTimeValue}'")
|
||||
appendLine("echo \"$(get_current_time): 设置uname为: ${config.unameValue}, 构建时间为: ${config.buildTimeValue}\" >> \"${'$'}LOG_FILE\"")
|
||||
appendLine()
|
||||
}
|
||||
}
|
||||
@@ -180,45 +175,50 @@ object ScriptGenerator {
|
||||
appendLine("# 隐藏BL 来自 Shamiko 脚本")
|
||||
appendLine(
|
||||
"""
|
||||
RESETPROP_BIN="/data/adb/ksu/bin/resetprop"
|
||||
|
||||
check_reset_prop() {
|
||||
local NAME=$1
|
||||
local EXPECTED=$2
|
||||
local VALUE=$(resetprop ${'$'}NAME)
|
||||
[ -z ${'$'}VALUE ] || [ ${'$'}VALUE = ${'$'}EXPECTED ] || resetprop ${'$'}NAME ${'$'}EXPECTED
|
||||
local VALUE=$("${'$'}RESETPROP_BIN" ${'$'}NAME)
|
||||
[ -z ${'$'}VALUE ] || [ ${'$'}VALUE = ${'$'}EXPECTED ] || "${'$'}RESETPROP_BIN" ${'$'}NAME ${'$'}EXPECTED
|
||||
}
|
||||
|
||||
check_missing_prop() {
|
||||
local NAME=$1
|
||||
local EXPECTED=$2
|
||||
local VALUE=$(resetprop ${'$'}NAME)
|
||||
[ -z ${'$'}VALUE ] && resetprop ${'$'}NAME ${'$'}EXPECTED
|
||||
local VALUE=$("${'$'}RESETPROP_BIN" ${'$'}NAME)
|
||||
[ -z ${'$'}VALUE ] && "${'$'}RESETPROP_BIN" ${'$'}NAME ${'$'}EXPECTED
|
||||
}
|
||||
|
||||
check_missing_match_prop() {
|
||||
local NAME=$1
|
||||
local EXPECTED=$2
|
||||
local VALUE=$(resetprop ${'$'}NAME)
|
||||
[ -z ${'$'}VALUE ] || [ ${'$'}VALUE = ${'$'}EXPECTED ] || resetprop ${'$'}NAME ${'$'}EXPECTED
|
||||
[ -z ${'$'}VALUE ] && resetprop ${'$'}NAME ${'$'}EXPECTED
|
||||
local VALUE=$("${'$'}RESETPROP_BIN" ${'$'}NAME)
|
||||
[ -z ${'$'}VALUE ] || [ ${'$'}VALUE = ${'$'}EXPECTED ] || "${'$'}RESETPROP_BIN" ${'$'}NAME ${'$'}EXPECTED
|
||||
[ -z ${'$'}VALUE ] && "${'$'}RESETPROP_BIN" ${'$'}NAME ${'$'}EXPECTED
|
||||
}
|
||||
|
||||
contains_reset_prop() {
|
||||
local NAME=$1
|
||||
local CONTAINS=$2
|
||||
local NEWVAL=$3
|
||||
[[ "$(resetprop ${'$'}NAME)" = *"${'$'}CONTAINS"* ]] && resetprop ${'$'}NAME ${'$'}NEWVAL
|
||||
case "$("${'$'}RESETPROP_BIN" ${'$'}NAME)" in
|
||||
*"${'$'}CONTAINS"*) "${'$'}RESETPROP_BIN" ${'$'}NAME ${'$'}NEWVAL ;;
|
||||
esac
|
||||
}
|
||||
""".trimIndent())
|
||||
appendLine()
|
||||
|
||||
appendLine("resetprop -w sys.boot_completed 0")
|
||||
appendLine("sleep 30")
|
||||
appendLine()
|
||||
appendLine("\"${'$'}RESETPROP_BIN\" -w sys.boot_completed 0")
|
||||
|
||||
// 添加所有系统属性重置
|
||||
val systemProps = listOf(
|
||||
"ro.boot.vbmeta.invalidate_on_error" to "yes",
|
||||
"ro.boot.vbmeta.avb_version" to "1.2",
|
||||
"ro.boot.vbmeta.hash_alg" to "sha256",
|
||||
"ro.boot.vbmeta.size" to "19968",
|
||||
"ro.boot.vbmeta.device_state" to "locked",
|
||||
"ro.boot.verifiedbootstate" to "green",
|
||||
"ro.boot.flash.locked" to "1",
|
||||
@@ -269,15 +269,89 @@ object ScriptGenerator {
|
||||
appendLine()
|
||||
}
|
||||
|
||||
// 清理残留脚本生成
|
||||
private fun StringBuilder.generateCleanupResidueSection() {
|
||||
appendLine("# 清理工具残留文件")
|
||||
appendLine("echo \"$(get_current_time): 开始清理工具残留\" >> \"${'$'}LOG_FILE\"")
|
||||
appendLine()
|
||||
|
||||
// 定义清理函数
|
||||
appendLine("""
|
||||
cleanup_path() {
|
||||
local path="$1"
|
||||
local desc="$2"
|
||||
local current="$3"
|
||||
local total="$4"
|
||||
|
||||
if [ -n "${'$'}desc" ]; then
|
||||
echo "$(get_current_time): [${'$'}current/${'$'}total] 清理: ${'$'}path (${'$'}desc)" >> "${'$'}LOG_FILE"
|
||||
else
|
||||
echo "$(get_current_time): [${'$'}current/${'$'}total] 清理: ${'$'}path" >> "${'$'}LOG_FILE"
|
||||
fi
|
||||
|
||||
if rm -rf "${'$'}path" 2>/dev/null; then
|
||||
echo "$(get_current_time): ✓ 成功清理: ${'$'}path" >> "${'$'}LOG_FILE"
|
||||
else
|
||||
echo "$(get_current_time): ✗ 清理失败或不存在: ${'$'}path" >> "${'$'}LOG_FILE"
|
||||
fi
|
||||
}
|
||||
""".trimIndent())
|
||||
|
||||
appendLine()
|
||||
appendLine("# 开始清理各种工具残留")
|
||||
appendLine("TOTAL=33")
|
||||
appendLine()
|
||||
|
||||
val cleanupPaths = listOf(
|
||||
"/data/local/stryker/" to "Stryker残留",
|
||||
"/data/system/AppRetention" to "AppRetention残留",
|
||||
"/data/local/tmp/luckys" to "Luck Tool残留",
|
||||
"/data/local/tmp/HyperCeiler" to "西米露残留",
|
||||
"/data/local/tmp/simpleHook" to "simple Hook残留",
|
||||
"/data/local/tmp/DisabledAllGoogleServices" to "谷歌省电模块残留",
|
||||
"/data/local/MIO" to "解包软件",
|
||||
"/data/DNA" to "解包软件",
|
||||
"/data/local/tmp/cleaner_starter" to "质感清理残留",
|
||||
"/data/local/tmp/byyang" to "",
|
||||
"/data/local/tmp/mount_mask" to "",
|
||||
"/data/local/tmp/mount_mark" to "",
|
||||
"/data/local/tmp/scriptTMP" to "",
|
||||
"/data/local/luckys" to "",
|
||||
"/data/local/tmp/horae_control.log" to "",
|
||||
"/data/gpu_freq_table.conf" to "",
|
||||
"/storage/emulated/0/Download/advanced/" to "",
|
||||
"/storage/emulated/0/Documents/advanced/" to "爱玩机",
|
||||
"/storage/emulated/0/Android/naki/" to "旧版asoulopt",
|
||||
"/data/swap_config.conf" to "scene附加模块2",
|
||||
"/data/local/tmp/resetprop" to "",
|
||||
"/dev/cpuset/AppOpt/" to "AppOpt模块",
|
||||
"/storage/emulated/0/Android/Clash/" to "Clash for Magisk模块",
|
||||
"/storage/emulated/0/Android/Yume-Yunyun/" to "网易云后台优化模块",
|
||||
"/data/local/tmp/Surfing_update" to "Surfing模块缓存",
|
||||
"/data/encore/custom_default_cpu_gov" to "encore模块",
|
||||
"/data/encore/default_cpu_gov" to "encore模块",
|
||||
"/data/local/tmp/yshell" to "",
|
||||
"/data/local/tmp/encore_logo.png" to "",
|
||||
"/storage/emulated/legacy/" to "",
|
||||
"/storage/emulated/elgg/" to "",
|
||||
"/data/system/junge/" to "",
|
||||
"/data/local/tmp/mount_namespace" to "挂载命名空间残留"
|
||||
)
|
||||
|
||||
cleanupPaths.forEachIndexed { index, (path, desc) ->
|
||||
val current = index + 1
|
||||
appendLine("cleanup_path '$path' '$desc' $current \$TOTAL")
|
||||
}
|
||||
|
||||
appendLine()
|
||||
appendLine("echo \"$(get_current_time): 工具残留清理完成\" >> \"${'$'}LOG_FILE\"")
|
||||
appendLine()
|
||||
}
|
||||
|
||||
/**
|
||||
* 生成post-fs-data.sh脚本内容
|
||||
*/
|
||||
fun generatePostFsDataScript(
|
||||
targetPath: String,
|
||||
unameValue: String,
|
||||
buildTimeValue: String,
|
||||
executeInPostFsData: Boolean = false
|
||||
): String {
|
||||
private fun generatePostFsDataScript(config: SuSFSManager.ModuleConfig): String {
|
||||
return buildString {
|
||||
appendLine("#!/system/bin/sh")
|
||||
appendLine("# SuSFS Post-FS-Data Script")
|
||||
@@ -285,31 +359,40 @@ object ScriptGenerator {
|
||||
appendLine()
|
||||
appendLine(generateLogSetup("susfs_post_fs_data.log"))
|
||||
appendLine()
|
||||
appendLine(generateBinaryCheck(targetPath))
|
||||
appendLine(generateBinaryCheck(config.targetPath))
|
||||
appendLine()
|
||||
appendLine("echo \"$(get_current_time): Post-FS-Data脚本开始执行\" >> \"${'$'}LOG_FILE\"")
|
||||
appendLine()
|
||||
|
||||
// 设置uname和构建时间 - 只有在选择在post-fs-data中执行时才执行
|
||||
if (executeInPostFsData && (unameValue != DEFAULT_UNAME || buildTimeValue != DEFAULT_BUILD_TIME)) {
|
||||
if (config.executeInPostFsData && (config.unameValue != DEFAULT_UNAME || config.buildTimeValue != DEFAULT_BUILD_TIME)) {
|
||||
appendLine("# 设置uname和构建时间")
|
||||
appendLine("\"${'$'}SUSFS_BIN\" set_uname '$unameValue' '$buildTimeValue'")
|
||||
appendLine("echo \"$(get_current_time): 设置uname为: $unameValue, 构建时间为: $buildTimeValue\" >> \"${'$'}LOG_FILE\"")
|
||||
appendLine("\"${'$'}SUSFS_BIN\" set_uname '${config.unameValue}' '${config.buildTimeValue}'")
|
||||
appendLine("echo \"$(get_current_time): 设置uname为: ${config.unameValue}, 构建时间为: ${config.buildTimeValue}\" >> \"${'$'}LOG_FILE\"")
|
||||
appendLine()
|
||||
}
|
||||
|
||||
generateUmountZygoteIsoServiceSection(config.umountForZygoteIsoService, config.support158)
|
||||
|
||||
appendLine("echo \"$(get_current_time): Post-FS-Data脚本执行完成\" >> \"${'$'}LOG_FILE\"")
|
||||
}
|
||||
}
|
||||
|
||||
// 添加新的生成方法
|
||||
private fun StringBuilder.generateUmountZygoteIsoServiceSection(umountForZygoteIsoService: Boolean, support158: Boolean) {
|
||||
if (support158) {
|
||||
appendLine("# 设置Zygote隔离服务卸载状态")
|
||||
val umountValue = if (umountForZygoteIsoService) 1 else 0
|
||||
appendLine("\"${'$'}SUSFS_BIN\" umount_for_zygote_iso_service $umountValue")
|
||||
appendLine("echo \"$(get_current_time): Zygote隔离服务卸载设置为: ${if (umountForZygoteIsoService) "启用" else "禁用"}\" >> \"${'$'}LOG_FILE\"")
|
||||
appendLine()
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 生成post-mount.sh脚本内容
|
||||
*/
|
||||
fun generatePostMountScript(
|
||||
targetPath: String,
|
||||
susMounts: Set<String>,
|
||||
tryUmounts: Set<String>
|
||||
): String {
|
||||
private fun generatePostMountScript(config: SuSFSManager.ModuleConfig): String {
|
||||
return buildString {
|
||||
appendLine("#!/system/bin/sh")
|
||||
appendLine("# SuSFS Post-Mount Script")
|
||||
@@ -319,13 +402,13 @@ object ScriptGenerator {
|
||||
appendLine()
|
||||
appendLine("echo \"$(get_current_time): Post-Mount脚本开始执行\" >> \"${'$'}LOG_FILE\"")
|
||||
appendLine()
|
||||
appendLine(generateBinaryCheck(targetPath))
|
||||
appendLine(generateBinaryCheck(config.targetPath))
|
||||
appendLine()
|
||||
|
||||
// 添加SUS挂载
|
||||
if (susMounts.isNotEmpty()) {
|
||||
if (config.susMounts.isNotEmpty()) {
|
||||
appendLine("# 添加SUS挂载")
|
||||
susMounts.forEach { mount ->
|
||||
config.susMounts.forEach { mount ->
|
||||
appendLine("\"${'$'}SUSFS_BIN\" add_sus_mount '$mount'")
|
||||
appendLine("echo \"$(get_current_time): 添加SUS挂载: $mount\" >> \"${'$'}LOG_FILE\"")
|
||||
}
|
||||
@@ -333,9 +416,9 @@ object ScriptGenerator {
|
||||
}
|
||||
|
||||
// 添加尝试卸载
|
||||
if (tryUmounts.isNotEmpty()) {
|
||||
if (config.tryUmounts.isNotEmpty()) {
|
||||
appendLine("# 添加尝试卸载")
|
||||
tryUmounts.forEach { umount ->
|
||||
config.tryUmounts.forEach { umount ->
|
||||
val parts = umount.split("|")
|
||||
if (parts.size == 2) {
|
||||
val path = parts[0]
|
||||
@@ -354,10 +437,8 @@ object ScriptGenerator {
|
||||
/**
|
||||
* 生成boot-completed.sh脚本内容
|
||||
*/
|
||||
fun generateBootCompletedScript(
|
||||
targetPath: String,
|
||||
hideSusMountsForAllProcs: Boolean = true
|
||||
): String {
|
||||
@SuppressLint("SdCardPath")
|
||||
private fun generateBootCompletedScript(config: SuSFSManager.ModuleConfig): String {
|
||||
return buildString {
|
||||
appendLine("#!/system/bin/sh")
|
||||
appendLine("# SuSFS Boot-Completed Script")
|
||||
@@ -367,36 +448,53 @@ object ScriptGenerator {
|
||||
appendLine()
|
||||
appendLine("echo \"$(get_current_time): Boot-Completed脚本开始执行\" >> \"${'$'}LOG_FILE\"")
|
||||
appendLine()
|
||||
appendLine(generateBinaryCheck(targetPath))
|
||||
appendLine(generateBinaryCheck(config.targetPath))
|
||||
appendLine()
|
||||
|
||||
// SUS挂载隐藏控制仅限1.5.8及以上版本
|
||||
appendLine("# 设置SUS挂载隐藏控制(仅限1.5.8及以上版本)")
|
||||
appendLine("SUSFS_VERSION=$(${'$'}SUSFS_BIN show version 2>/dev/null | grep -o 'v[0-9]\\+\\.[0-9]\\+\\.[0-9]\\+' | head -1)")
|
||||
appendLine("if [ -n \"${'$'}SUSFS_VERSION\" ]; then")
|
||||
appendLine(" VERSION_NUM=$(echo \"${'$'}SUSFS_VERSION\" | sed 's/v//' | awk -F. '{printf \"%d%02d%02d\", $1, $2, $3}')")
|
||||
appendLine(" if [ \"${'$'}VERSION_NUM\" -ge 10508 ]; then")
|
||||
val hideValue = if (hideSusMountsForAllProcs) 1 else 0
|
||||
// 仅在支持隐藏挂载功能时执行相关配置
|
||||
if (config.support158) {
|
||||
// SUS挂载隐藏控制
|
||||
val hideValue = if (config.hideSusMountsForAllProcs) 1 else 0
|
||||
appendLine("# 设置SUS挂载隐藏控制")
|
||||
appendLine("\"${'$'}SUSFS_BIN\" hide_sus_mnts_for_all_procs $hideValue")
|
||||
appendLine(" echo \"$(get_current_time): SUS挂载隐藏控制设置为: ${if (hideSusMountsForAllProcs) "对所有进程隐藏" else "仅对非KSU进程隐藏"}\" >> \"${'$'}LOG_FILE\"")
|
||||
appendLine(" else")
|
||||
appendLine(" echo \"$(get_current_time): 当前版本 ${'$'}SUSFS_VERSION 不支持SUS挂载隐藏控制功能,需要1.5.8及以上版本\" >> \"${'$'}LOG_FILE\"")
|
||||
appendLine(" fi")
|
||||
appendLine("else")
|
||||
appendLine(" echo \"$(get_current_time): 无法获取SuSFS版本信息,跳过SUS挂载隐藏控制设置\" >> \"${'$'}LOG_FILE\"")
|
||||
appendLine("fi")
|
||||
appendLine("echo \"$(get_current_time): SUS挂载隐藏控制设置为: ${if (config.hideSusMountsForAllProcs) "对所有进程隐藏" else "仅对非KSU进程隐藏"}\" >> \"${'$'}LOG_FILE\"")
|
||||
appendLine()
|
||||
|
||||
// 路径设置和SUS路径设置
|
||||
if (config.susPaths.isNotEmpty()) {
|
||||
generatePathSettingSection(config.androidDataPath, config.sdcardPath)
|
||||
appendLine()
|
||||
appendLine("until [ -d \"/sdcard/Android\" ]; do sleep 1; done")
|
||||
appendLine("sleep 45")
|
||||
appendLine()
|
||||
generateSusPathsSection(config.susPaths)
|
||||
}
|
||||
}
|
||||
|
||||
appendLine("echo \"$(get_current_time): Boot-Completed脚本执行完成\" >> \"${'$'}LOG_FILE\"")
|
||||
}
|
||||
}
|
||||
|
||||
@SuppressLint("SdCardPath")
|
||||
private fun StringBuilder.generatePathSettingSection(androidDataPath: String, sdcardPath: String) {
|
||||
appendLine("# 路径配置")
|
||||
appendLine("# 设置Android Data路径")
|
||||
appendLine("until [ -d \"/sdcard/Android\" ]; do sleep 1; done")
|
||||
appendLine("\"${'$'}SUSFS_BIN\" set_android_data_root_path '$androidDataPath'")
|
||||
appendLine("echo \"$(get_current_time): Android Data路径设置为: $androidDataPath\" >> \"${'$'}LOG_FILE\"")
|
||||
appendLine()
|
||||
appendLine("# 设置SD卡路径")
|
||||
appendLine("\"${'$'}SUSFS_BIN\" set_sdcard_root_path '$sdcardPath'")
|
||||
appendLine("echo \"$(get_current_time): SD卡路径设置为: $sdcardPath\" >> \"${'$'}LOG_FILE\"")
|
||||
appendLine()
|
||||
}
|
||||
|
||||
/**
|
||||
* 生成module.prop文件内容
|
||||
*/
|
||||
fun generateModuleProp(moduleId: String): String {
|
||||
val moduleVersion = "v1.0.0"
|
||||
val moduleVersionCode = "1000"
|
||||
val moduleVersion = "v1.0.2"
|
||||
val moduleVersionCode = "1002"
|
||||
|
||||
return """
|
||||
id=$moduleId
|
||||
|
||||
@@ -37,6 +37,7 @@ class HomeViewModel : ViewModel() {
|
||||
data class SystemStatus(
|
||||
val isManager: Boolean = false,
|
||||
val ksuVersion: Int? = null,
|
||||
val ksuFullVersion : String? = null,
|
||||
val lkmMode: Boolean? = null,
|
||||
val kernelVersion: KernelVersion = getKernelVersion(),
|
||||
val isRootAvailable: Boolean = false,
|
||||
@@ -76,6 +77,8 @@ class HomeViewModel : ViewModel() {
|
||||
|
||||
var isSimpleMode by mutableStateOf(false)
|
||||
private set
|
||||
var isKernelSimpleMode by mutableStateOf(false)
|
||||
private set
|
||||
var isHideVersion by mutableStateOf(false)
|
||||
private set
|
||||
var isHideOtherInfo by mutableStateOf(false)
|
||||
@@ -91,6 +94,7 @@ class HomeViewModel : ViewModel() {
|
||||
viewModelScope.launch(Dispatchers.IO) {
|
||||
val prefs = context.getSharedPreferences("settings", Context.MODE_PRIVATE)
|
||||
isSimpleMode = prefs.getBoolean("is_simple_mode", false)
|
||||
isKernelSimpleMode = prefs.getBoolean("is_kernel_simple_mode", false)
|
||||
isHideVersion = prefs.getBoolean("is_hide_version", false)
|
||||
isHideOtherInfo = prefs.getBoolean("is_hide_other_info", false)
|
||||
isHideSusfsStatus = prefs.getBoolean("is_hide_susfs_status", false)
|
||||
@@ -167,6 +171,25 @@ class HomeViewModel : ViewModel() {
|
||||
val kernelVersion = getKernelVersion()
|
||||
val isManager = Natives.becomeManager(ksuApp.packageName)
|
||||
val ksuVersion = if (isManager) Natives.version else null
|
||||
val fullVersion = Natives.getFullVersion()
|
||||
val ksuFullVersion = if (isKernelSimpleMode) {
|
||||
val startIndex = fullVersion.indexOf('v')
|
||||
if (startIndex >= 0) {
|
||||
val endIndex = fullVersion.indexOf('-', startIndex)
|
||||
val versionStr = if (endIndex > startIndex) {
|
||||
fullVersion.substring(startIndex, endIndex)
|
||||
} else {
|
||||
fullVersion.substring(startIndex)
|
||||
}
|
||||
val numericVersion = "v" + (Regex("""\d+(\.\d+)*""").find(versionStr)?.value ?: versionStr)
|
||||
numericVersion
|
||||
} else {
|
||||
fullVersion
|
||||
}
|
||||
} else {
|
||||
fullVersion
|
||||
}
|
||||
|
||||
val lkmMode = ksuVersion?.let {
|
||||
if (it >= Natives.MINIMAL_SUPPORTED_KERNEL_LKM && kernelVersion.isGKI()) Natives.isLkmMode else null
|
||||
}
|
||||
@@ -174,6 +197,7 @@ class HomeViewModel : ViewModel() {
|
||||
systemStatus = SystemStatus(
|
||||
isManager = isManager,
|
||||
ksuVersion = ksuVersion,
|
||||
ksuFullVersion = ksuFullVersion,
|
||||
lkmMode = lkmMode,
|
||||
kernelVersion = kernelVersion,
|
||||
isRootAvailable = rootAvailable(),
|
||||
|
||||
@@ -237,6 +237,11 @@ fun MoreSettingsScreen(
|
||||
mutableStateOf(prefs.getBoolean("is_hide_tag_row", false))
|
||||
}
|
||||
|
||||
// 内核版本简洁模式开关状态
|
||||
var isKernelSimpleMode by remember {
|
||||
mutableStateOf(prefs.getBoolean("is_kernel_simple_mode", false))
|
||||
}
|
||||
|
||||
// 显示更多模块信息开关状态
|
||||
var showMoreModuleInfo by remember {
|
||||
mutableStateOf(prefs.getBoolean("show_more_module_info", false))
|
||||
@@ -294,6 +299,12 @@ fun MoreSettingsScreen(
|
||||
isSimpleMode = newValue
|
||||
}
|
||||
|
||||
// 内核版本简洁模式开关状态
|
||||
val onKernelSimpleModeChange = { newValue: Boolean ->
|
||||
prefs.edit { putBoolean("is_kernel_simple_mode", newValue) }
|
||||
isKernelSimpleMode = newValue
|
||||
}
|
||||
|
||||
// 隐藏内核版本号开关状态
|
||||
val onHideVersionChange = { newValue: Boolean ->
|
||||
prefs.edit { putBoolean("is_hide_version", newValue) }
|
||||
@@ -1064,6 +1075,14 @@ fun MoreSettingsScreen(
|
||||
onChange = onSimpleModeChange
|
||||
)
|
||||
|
||||
SwitchSettingItem(
|
||||
icon = Icons.Filled.Brush,
|
||||
title = stringResource(R.string.kernel_simple_kernel),
|
||||
summary = stringResource(R.string.kernel_simple_kernel_summary),
|
||||
checked = isKernelSimpleMode,
|
||||
onChange = onKernelSimpleModeChange
|
||||
)
|
||||
|
||||
// 隐藏内核部分版本号
|
||||
SwitchSettingItem(
|
||||
icon = Icons.Filled.VisibilityOff,
|
||||
|
||||
Binary file not shown.
BIN
manager/app/src/main/jniLibs/armeabi-v7a/libzakoboot.so
Normal file
BIN
manager/app/src/main/jniLibs/armeabi-v7a/libzakoboot.so
Normal file
Binary file not shown.
BIN
manager/app/src/main/jniLibs/x86_64/libzakoboot.so
Normal file
BIN
manager/app/src/main/jniLibs/x86_64/libzakoboot.so
Normal file
Binary file not shown.
@@ -4,7 +4,7 @@
|
||||
<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_working_version">الإصدار: %s</string>
|
||||
<string name="home_unsupported">غير مدعوم</string>
|
||||
<string name="home_unsupported_reason">KernelSU يدعم GKI kernels فقط</string>
|
||||
<string name="home_kernel">إصدار النواة</string>
|
||||
@@ -60,7 +60,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" formatted="false">إصدار KernelSU الحالي %d منخفض جدًا بحيث لا يعمل المدير بشكل صحيح. الرجاء الترقية إلى الإصدار %d أو أعلى!</string>
|
||||
<string name="require_kernel_version" formatted="false">إصدار KernelSU الحالي %s منخفض جدًا بحيث لا يعمل المدير بشكل صحيح. الرجاء الترقية إلى الإصدار %s أو أعلى!</string>
|
||||
<string name="settings_umount_modules_default">الغاء تحميل الإضافات بشكل افتراضي</string>
|
||||
<string name="settings_umount_modules_default_summary">القيمة الافتراضية العامة لـ\"إلغاء تحميل الإضافات\" في ملفات تعريف التطبيقات. إذا تم تمكينه، إزالة جميع تعديلات الإضافات على النظام للتطبيقات التي لا تحتوي على مجموعة ملف تعريف.</string>
|
||||
<string name="settings_susfs_toggle">تعطيل روابط kprobe</string>
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
<string name="home_not_installed">Yüklənmədi</string>
|
||||
<string name="home_click_to_install">Yükləmək üçün toxunun</string>
|
||||
<string name="home_working">İşləyir</string>
|
||||
<string name="home_working_version">Versiya: %d</string>
|
||||
<string name="home_working_version">Versiya: %s</string>
|
||||
<string name="home_unsupported">Dəstəklənmir</string>
|
||||
<string name="home_unsupported_reason">Hal-hazırda KernelSU yalnız GKI nüvələrini dəstəkləyir</string>
|
||||
<string name="home_kernel">Nüvə</string>
|
||||
@@ -60,7 +60,7 @@
|
||||
<string name="profile_selinux_context">SELinux konteksi</string>
|
||||
<string name="profile_umount_modules">Modulları umount et</string>
|
||||
<string name="failed_to_update_app_profile">%s görə tətbiq profillərini güncəlləmək mümkün olmadı</string>
|
||||
<string name="require_kernel_version" formatted="false">The current KernelSU version %d is too low for the manager to work properly. Please upgrade to version %d or higher!</string>
|
||||
<string name="require_kernel_version" formatted="false">The current KernelSU version %s is too low for the manager to work properly. Please upgrade to version %s or higher!</string>
|
||||
<string name="settings_umount_modules_default">Defolt olaraq modulları umount et</string>
|
||||
<string name="settings_umount_modules_default_summary">Tətbiq Profillərində \"Umount modulları\" üçün qlobal standart dəyər. Aktivləşdirilərsə, o, Profil dəsti olmayan proqramlar üçün sistemdəki bütün modul dəyişikliklərini siləcək.</string>
|
||||
<string name="settings_susfs_toggle">Disable kprobe hooks</string>
|
||||
|
||||
@@ -28,7 +28,7 @@
|
||||
<string name="selinux_status_permissive">পারমিসিভ</string>
|
||||
<string name="module_failed_to_disable">মোডিউল ডিসেবল করা যায়নি: %s</string>
|
||||
<string name="module_empty">কোনো মোডিউল ইন্সটল করা নেই</string>
|
||||
<string name="home_working_version">সংস্করণ: %d</string>
|
||||
<string name="home_working_version">সংস্করণ: %s</string>
|
||||
<string name="profile_capabilities">ক্যাপাবিলিটিস</string>
|
||||
<string name="profile_umount_modules">আনমাউন্ট মোডিউলস</string>
|
||||
<string name="reboot_recovery">রিকভারিতে বুট</string>
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
<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_working_version">ওয়ার্কিং সংস্করণ: %s</string>
|
||||
<string name="home_unsupported">অসমর্থিত</string>
|
||||
<string name="home_unsupported_reason">KernelSU শুধুমাত্র GKI কার্নেল সমর্থন করে</string>
|
||||
<string name="home_kernel">কার্নেল</string>
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
<string name="home_not_installed">Nije instalirano</string>
|
||||
<string name="home_click_to_install">Kliknite da instalirate</string>
|
||||
<string name="home_working">Radi</string>
|
||||
<string name="home_working_version">Verzija: %d</string>
|
||||
<string name="home_working_version">Verzija: %s</string>
|
||||
<string name="home_unsupported">Nepodržano</string>
|
||||
<string name="home_unsupported_reason">KernelSU samo podržava GKI kernele sad</string>
|
||||
<string name="home_kernel">Kernel</string>
|
||||
@@ -60,7 +60,7 @@
|
||||
<string name="profile_selinux_context">SELinux kontekst</string>
|
||||
<string name="profile_umount_modules">Umount module</string>
|
||||
<string name="failed_to_update_app_profile">Ažuriranje Profila Aplikacije za %s nije uspjelo</string>
|
||||
<string name="require_kernel_version" formatted="false">The current KernelSU version %d is too low for the manager to work properly. Please upgrade to version %d or higher!</string>
|
||||
<string name="require_kernel_version" formatted="false">The current KernelSU version %s is too low for the manager to work properly. Please upgrade to version %s or higher!</string>
|
||||
<string name="settings_umount_modules_default">Umount module po zadanom</string>
|
||||
<string name="settings_umount_modules_default_summary">Globalna zadana vrijednost za \"Umount module\" u Profilima Aplikacije. Ako je omogućeno, uklonit će sve izmjene modula na sistemu za aplikacije koje nemaju postavljen Profil.</string>
|
||||
<string name="settings_susfs_toggle">Disable kprobe hooks</string>
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
<string name="home_not_installed">Ikke installeret</string>
|
||||
<string name="home_click_to_install">Klik for at installere</string>
|
||||
<string name="home_working">Arbejder</string>
|
||||
<string name="home_working_version">Version: %d</string>
|
||||
<string name="home_working_version">Version: %s</string>
|
||||
<string name="home_unsupported">Ikke understøttet</string>
|
||||
<string name="home_unsupported_reason">KernelSU understøtter kun GKI kernels</string>
|
||||
<string name="home_kernel">Kernel</string>
|
||||
@@ -60,7 +60,7 @@
|
||||
<string name="profile_selinux_context">SELinux-kontext</string>
|
||||
<string name="profile_umount_modules">Afmonteret moduler</string>
|
||||
<string name="failed_to_update_app_profile">Opdatering af App Profil for %s fejlede</string>
|
||||
<string name="require_kernel_version" formatted="false">The current KernelSU version %d is too low for the manager to work properly. Please upgrade to version %d or higher!</string>
|
||||
<string name="require_kernel_version" formatted="false">The current KernelSU version %s is too low for the manager to work properly. Please upgrade to version %s or higher!</string>
|
||||
<string name="settings_umount_modules_default">Afmontere moduler som standard</string>
|
||||
<string name="settings_umount_modules_default_summary">Den globale standard værdi for \"Afmonter moduler\" i App Profiler. Hvis aktiveret vil den fjerne alle modulers modifikationer til system applikationerne der ikke har en sat Profil.</string>
|
||||
<string name="settings_susfs_toggle">Disable kprobe hooks</string>
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
<string name="home_not_installed">Nicht installiert</string>
|
||||
<string name="home_click_to_install">Tippe zum Installieren</string>
|
||||
<string name="home_working">Funktioniert</string>
|
||||
<string name="home_working_version">Version: %d</string>
|
||||
<string name="home_working_version">Version: %s</string>
|
||||
<string name="home_unsupported">Nicht unterstützt</string>
|
||||
<string name="home_unsupported_reason">KernelSU unterstützt derzeit nur GKI-Kernel</string>
|
||||
<string name="home_kernel">Kernel</string>
|
||||
@@ -60,7 +60,7 @@
|
||||
<string name="profile_selinux_context">SELinux-Kontext</string>
|
||||
<string name="profile_umount_modules">Module aushängen</string>
|
||||
<string name="failed_to_update_app_profile">App-Profilaktualisierung für %s fehlgeschlagen</string>
|
||||
<string name="require_kernel_version" formatted="false">Die aktuelle KernelSU-Version %d ist zu alt für diese Manager-Version. Bitte auf Version %d oder höher aktualisieren!</string>
|
||||
<string name="require_kernel_version" formatted="false">Die aktuelle KernelSU-Version %s ist zu alt für diese Manager-Version. Bitte auf Version %s oder höher aktualisieren!</string>
|
||||
<string name="settings_umount_modules_default">Module standardmäßig aushängen</string>
|
||||
<string name="settings_umount_modules_default_summary">Globaler Standardwert für \"Module aushängen\" im App-Profil. Falls er aktiviert ist, werden alle Moduländerungen im System für alle Apps entfernt, für die kein Profil festgelegt ist.</string>
|
||||
<string name="settings_susfs_toggle">Kprobe-Hooks deaktivieren</string>
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
<string name="home_not_installed">No instalado</string>
|
||||
<string name="home_click_to_install">Haz clic para instalar</string>
|
||||
<string name="home_working">Funcionando</string>
|
||||
<string name="home_working_version">Versión: %d</string>
|
||||
<string name="home_working_version">Versión: %s</string>
|
||||
<string name="home_unsupported">Sin soporte</string>
|
||||
<string name="home_unsupported_reason">KernelSU solo admite kernels GKI por ahora</string>
|
||||
<string name="home_kernel">Versión del kernel</string>
|
||||
@@ -60,7 +60,7 @@
|
||||
<string name="profile_selinux_context">Contexto SELinux</string>
|
||||
<string name="profile_umount_modules">Desmontar módulos</string>
|
||||
<string name="failed_to_update_app_profile">Error al actualizar el perfil de la aplicación para %s</string>
|
||||
<string name="require_kernel_version" formatted="false">La versión %d actual de KernelSU es demasiado baja para que el gestor funcione correctamente. Por favor, ¡actualice a la versión %d o superior!</string>
|
||||
<string name="require_kernel_version" formatted="false">La versión %s actual de KernelSU es demasiado baja para que el gestor funcione correctamente. Por favor, ¡actualice a la versión %s o superior!</string>
|
||||
<string name="settings_umount_modules_default">Desmontar módulos por defecto</string>
|
||||
<string name="settings_umount_modules_default_summary">El valor global predeterminado para \"Umount modules\" en App Profile. Si está activado, eliminará todas las modificaciones de módulos del sistema para las apps que no tengan un perfil establecido.</string>
|
||||
<string name="settings_susfs_toggle">Desactivar kprobe hooks</string>
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
<string name="home_not_installed">Pole paigaldatud</string>
|
||||
<string name="home_click_to_install">Klõpsa paigaldamiseks</string>
|
||||
<string name="home_working">Töötamine</string>
|
||||
<string name="home_working_version">Versioon: %d</string>
|
||||
<string name="home_working_version">Versioon: %s</string>
|
||||
<string name="home_unsupported">Mittetoetatud</string>
|
||||
<string name="home_unsupported_reason">KernelSU toetab hetkel vaid GSI tuumasid</string>
|
||||
<string name="home_kernel">Tuum</string>
|
||||
@@ -60,7 +60,7 @@
|
||||
<string name="profile_selinux_context">SELinux kontekst</string>
|
||||
<string name="profile_umount_modules">Lahtihaagitud moodulid</string>
|
||||
<string name="failed_to_update_app_profile">Rakenduseprofiili uuendamine %s jaoks ebaõnnestus</string>
|
||||
<string name="require_kernel_version" formatted="false">The current KernelSU version %d is too low for the manager to work properly. Please upgrade to version %d or higher!</string>
|
||||
<string name="require_kernel_version" formatted="false">The current KernelSU version %s is too low for the manager to work properly. Please upgrade to version %s or higher!</string>
|
||||
<string name="settings_umount_modules_default">Haagi moodulid vaikimisi lahti</string>
|
||||
<string name="settings_umount_modules_default_summary">Globaalne vaikeväärtus \"Lahtihaagitud moodulitele\" rakenduseprofiilis. Lubamisel eemaldab see kõik moodulite süsteemimuudatused rakendustele, millel ei ole profiili määratud.</string>
|
||||
<string name="settings_susfs_toggle">Disable kprobe hooks</string>
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
<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_working_version">نسخه: %s</string>
|
||||
<string name="home_unsupported">پشتیبانی نشده</string>
|
||||
<string name="home_unsupported_reason">کرنل اس یو فقط هسته های gki را پشتیبانی میکند</string>
|
||||
<string name="home_kernel">هسته</string>
|
||||
@@ -60,7 +60,7 @@
|
||||
<string name="profile_selinux_context">SELinux context</string>
|
||||
<string name="profile_umount_modules">جداکردن ماژول ها</string>
|
||||
<string name="failed_to_update_app_profile">Failed to update App Profile for %s</string>
|
||||
<string name="require_kernel_version" formatted="false">The current KernelSU version %d is too low for the manager to work properly. Please upgrade to version %d or higher!</string>
|
||||
<string name="require_kernel_version" formatted="false">The current KernelSU version %s is too low for the manager to work properly. Please upgrade to version %s or higher!</string>
|
||||
<string name="settings_umount_modules_default">Umount modules by default</string>
|
||||
<string name="settings_umount_modules_default_summary">The global default value for \"Umount modules\" in App Profile. If enabled, it will remove all module modifications to the system for apps that don\'t have a profile set.</string>
|
||||
<string name="settings_susfs_toggle">Disable kprobe hooks</string>
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
<string name="home_not_installed">Hindi naka-install</string>
|
||||
<string name="home_click_to_install">Pindutin para mag-install</string>
|
||||
<string name="home_working">Gumagana</string>
|
||||
<string name="home_working_version">Bersyon: %d</string>
|
||||
<string name="home_working_version">Bersyon: %s</string>
|
||||
<string name="home_unsupported">Hindi Suportado</string>
|
||||
<string name="home_unsupported_reason">Sinusuportahan lang ng KernelSU ang mga kernel ng GKI ngayon</string>
|
||||
<string name="home_kernel">Kernel version</string>
|
||||
@@ -60,7 +60,7 @@
|
||||
<string name="profile_selinux_context">Konteksto ng SELinux</string>
|
||||
<string name="profile_umount_modules">I-unmount ang mga modyul</string>
|
||||
<string name="failed_to_update_app_profile">Nabigong i-update ang App Profile para sa %s</string>
|
||||
<string name="require_kernel_version" formatted="false">The current KernelSU version %d is too low for the manager to work properly. Please upgrade to version %d or higher!</string>
|
||||
<string name="require_kernel_version" formatted="false">The current KernelSU version %s is too low for the manager to work properly. Please upgrade to version %s or higher!</string>
|
||||
<string name="settings_umount_modules_default">Umount modules by default</string>
|
||||
<string name="settings_umount_modules_default_summary">Ang pangkalahatang default na halaga para sa \"Umount modules\" sa Mga Profile ng App. Kung pinagana, aalisin nito ang lahat ng mga pagbabago sa modyul sa system para sa mga aplikasyon na walang hanay ng Profile.</string>
|
||||
<string name="settings_susfs_toggle">Disable kprobe hooks</string>
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
<string name="home_not_installed">Non installé</string>
|
||||
<string name="home_click_to_install">Appuyez ici pour installer</string>
|
||||
<string name="home_working">Fonctionnel</string>
|
||||
<string name="home_working_version">Version : %d</string>
|
||||
<string name="home_working_version">Version : %s</string>
|
||||
<string name="home_unsupported">Non pris en charge</string>
|
||||
<string name="home_unsupported_reason">KernelSU ne prend désormais en charge que les noyaux GKI</string>
|
||||
<string name="home_kernel">Noyau</string>
|
||||
@@ -60,7 +60,7 @@
|
||||
<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 modification du profil d\'application de %s</string>
|
||||
<string name="require_kernel_version" formatted="false">La version actuelle de KernelSU (%d) est trop ancienne pour que le gestionnaire fonctionne correctement. Veuillez passer à la version %d ou à une version supérieure !</string>
|
||||
<string name="require_kernel_version" formatted="false">La version actuelle de KernelSU (%s) est trop ancienne pour que le gestionnaire fonctionne correctement. Veuillez passer à la version %s ou à une version supérieure !</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 l\'option \"Démonter les modules\" dans les profils d\'application. Lorsque l\'option est activée, les modifications apportées au système par les modules sont supprimées pour les applications qui n\'ont pas de profil défini.</string>
|
||||
<string name="settings_susfs_toggle">Désactiver les crochets kprobe</string>
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
<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_working_version">वर्जन: %s</string>
|
||||
<string name="home_unsupported">सपोर्ट नहीं करता है</string>
|
||||
<string name="home_unsupported_reason">KernelSU अभी केवल GKI कर्नल्स को सपोर्ट करता है</string>
|
||||
<string name="home_kernel">कर्नल</string>
|
||||
@@ -60,7 +60,7 @@
|
||||
<string name="profile_selinux_context">SELinux context</string>
|
||||
<string name="profile_umount_modules">मॉड्यूल्स अनमाउंट करें</string>
|
||||
<string name="failed_to_update_app_profile">%s के लिए ऐप प्रोफ़ाइल अपडेट करने में विफल</string>
|
||||
<string name="require_kernel_version" formatted="false">The current KernelSU version %d is too low for the manager to work properly. Please upgrade to version %d or higher!</string>
|
||||
<string name="require_kernel_version" formatted="false">The current KernelSU version %s is too low for the manager to work properly. Please upgrade to version %s or higher!</string>
|
||||
<string name="settings_umount_modules_default">डिफ़ॉल्ट रूप से मॉड्यूल अनमाउन्ट करें</string>
|
||||
<string name="settings_umount_modules_default_summary">ऐप प्रोफाइल में \"अनमाउंट मॉड्यूल\" के लिए ग्लोबल डिफ़ॉल्ट वैल्यू। यदि चालू किया गया है, तो यह एप्लीकेशंस के लिऐ सिस्टम के सभी मॉड्यूल मोडिफिकेशन को हटा देगा जिनकी प्रोफ़ाइल सेट नहीं है।</string>
|
||||
<string name="settings_susfs_toggle">Disable kprobe hooks</string>
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
<string name="home_not_installed">Nije instalirano</string>
|
||||
<string name="home_click_to_install">Kliknite da instalirate</string>
|
||||
<string name="home_working">Radi</string>
|
||||
<string name="home_working_version">Verzija: %d</string>
|
||||
<string name="home_working_version">Verzija: %s</string>
|
||||
<string name="home_unsupported">Nepodržano</string>
|
||||
<string name="home_unsupported_reason">KernelSU samo podržava GKI kernele sad</string>
|
||||
<string name="home_kernel">Kernel</string>
|
||||
@@ -60,7 +60,7 @@
|
||||
<string name="profile_selinux_context">SELinux kontekst</string>
|
||||
<string name="profile_umount_modules">Umount module</string>
|
||||
<string name="failed_to_update_app_profile">Ažuriranje Profila Aplikacije za %s nije uspjelo</string>
|
||||
<string name="require_kernel_version" formatted="false">The current KernelSU version %d is too low for the manager to work properly. Please upgrade to version %d or higher!</string>
|
||||
<string name="require_kernel_version" formatted="false">The current KernelSU version %s is too low for the manager to work properly. Please upgrade to version %s or higher!</string>
|
||||
<string name="settings_umount_modules_default">Umount module po zadanom</string>
|
||||
<string name="settings_umount_modules_default_summary">Globalna zadana vrijednost za \"Umount module\" u Profilima Aplikacije. Ako je omogućeno, uklonit će sve izmjene modula na sistemu za aplikacije koje nemaju postavljen Profil.</string>
|
||||
<string name="settings_susfs_toggle">Disable kprobe hooks</string>
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
<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_working_version">Verzió: %s</string>
|
||||
<string name="home_unsupported">Nem támogatott</string>
|
||||
<string name="home_unsupported_reason">A KernelSU jelenleg csak GKI kerneleket támogat</string>
|
||||
<string name="home_kernel">Kernel</string>
|
||||
@@ -60,7 +60,7 @@
|
||||
<string name="profile_selinux_context">SELinux kontextus</string>
|
||||
<string name="profile_umount_modules">Modulok leválasztása</string>
|
||||
<string name="failed_to_update_app_profile">Nem sikerült frissíteni az App Profilt ehhez: %s</string>
|
||||
<string name="require_kernel_version" formatted="false">The current KernelSU version %d is too low for the manager to work properly. Please upgrade to version %d or higher!</string>
|
||||
<string name="require_kernel_version" formatted="false">The current KernelSU version %s is too low for the manager to work properly. Please upgrade to version %s or higher!</string>
|
||||
<string name="settings_umount_modules_default">Modulok leválasztása alapértelmezetten</string>
|
||||
<string name="settings_umount_modules_default_summary">A \"Modulok leválasztása\" globális alapértelmezett értéke az App Profile-ban. Ha engedélyezve van, eltávolít minden modulmódosítást a rendszerből azon alkalmazások esetében, amelyeknek nincs profilja beállítva.</string>
|
||||
<string name="settings_susfs_toggle">Disable kprobe hooks</string>
|
||||
|
||||
@@ -4,10 +4,11 @@
|
||||
<string name="home_not_installed">Tidak terinstal</string>
|
||||
<string name="home_click_to_install">Klik untuk menginstal</string>
|
||||
<string name="home_working">Berfungsi</string>
|
||||
<string name="home_working_version">Versi: %d</string>
|
||||
<string name="home_working_version">Versi: %s</string>
|
||||
<string name="home_unsupported">Tidak didukung</string>
|
||||
<string name="home_unsupported_reason">KernelSU saat ini hanya mendukung kernel GKI</string>
|
||||
<string name="home_kernel">Kernel</string>
|
||||
<string name="home_susfs_version">Versi SuSFS</string>
|
||||
<string name="home_manager_version">Versi manager</string>
|
||||
<string name="home_selinux_status">Status SELinux</string>
|
||||
<string name="selinux_status_disabled">Nonaktif</string>
|
||||
@@ -19,6 +20,8 @@
|
||||
<string name="module_failed_to_disable">Gagal menonaktifkan modul: %s</string>
|
||||
<string name="module_empty">Tidak ada modul yang terpasang</string>
|
||||
<string name="module">Modul</string>
|
||||
<string name="module_sort_action_first">Urut (Tindakan pertama)</string>
|
||||
<string name="module_sort_enabled_first">Urut (Diaktifkan terlebih dahulu)</string>
|
||||
<string name="uninstall">Hapus</string>
|
||||
<string name="module_install">Instal</string>
|
||||
<string name="install">Instal</string>
|
||||
@@ -47,6 +50,7 @@
|
||||
<string name="home_click_to_learn_kernelsu">Pelajari cara instal KernelSU dan menggunakan modul</string>
|
||||
<string name="home_support_title">Dukung Kami</string>
|
||||
<string name="home_support_content">KernelSU akan selalu menjadi aplikasi gratis dan terbuka. Anda dapat memberikan donasi sebagai bentuk dukungan.</string>
|
||||
<string name="about_source_code"><![CDATA[Lihat kode sumber di %1$s<br/>Gabung dengan kami di saluran %2$s]]></string>
|
||||
<string name="profile_default">Bawaan</string>
|
||||
<string name="profile_template">Templat</string>
|
||||
<string name="profile_custom">Khusus</string>
|
||||
@@ -58,6 +62,7 @@
|
||||
<string name="failed_to_update_app_profile">Gagal membarui Profil pada %s</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">Nonaktifkan kprobe hooks</string>
|
||||
<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>
|
||||
@@ -70,122 +75,84 @@
|
||||
<string name="restart_app">Mulai ulang</string>
|
||||
<string name="failed_to_update_sepolicy">Gagal membarui aturan SELinux pada: %s</string>
|
||||
<string name="module_changelog">Catatan Perubahan</string>
|
||||
<string name="app_profile_template_import_success">Berhasil diimpor</string>
|
||||
<string name="app_profile_export_to_clipboard">Ekspor ke papan klip</string>
|
||||
<string name="app_profile_template_export_empty">Tidak ditemukan templat lokal untuk diekspor!</string>
|
||||
<string name="app_profile_template_id_exist">ID templat sudah ada!</string>
|
||||
<string name="app_profile_import_from_clipboard">Impor dari papan klip</string>
|
||||
<string name="module_changelog_failed">Gagal mengambil Changelog: %s</string>
|
||||
<string name="app_profile_template_name">Nama</string>
|
||||
<string name="app_profile_template_id_invalid">ID template tidak valid</string>
|
||||
<string name="app_profile_template_sync">Sinkronkan templat daring</string>
|
||||
<string name="settings_profile_template">Templat Profil Aplikasi</string>
|
||||
<string name="settings_profile_template_summary">Atur templat Profil yang lokal dan daring</string>
|
||||
<string name="app_profile_template_create">Buat templat</string>
|
||||
<string name="app_profile_import_export">Impor/Ekspor</string>
|
||||
<string name="app_profile_template_save_failed">Gagal menyimpan templat</string>
|
||||
<string name="app_profile_template_edit">Edit templat</string>
|
||||
<string name="app_profile_template_id">ID</string>
|
||||
<string name="settings_profile_template">Templat Profil Aplikasi</string>
|
||||
<string name="app_profile_template_id_invalid">ID template tidak valid</string>
|
||||
<string name="app_profile_template_name">Nama</string>
|
||||
<string name="app_profile_template_description">Deskripsi</string>
|
||||
<string name="app_profile_template_save">Simpan</string>
|
||||
<string name="settings_profile_template_summary">Atur templat Profil yang lokal dan daring</string>
|
||||
<string name="app_profile_template_delete">Hapus</string>
|
||||
<string name="app_profile_template_import_empty">Papan klip kosong!</string>
|
||||
<string name="app_profile_template_view">Lihat templat</string>
|
||||
<string name="app_profile_template_readonly">readonly</string>
|
||||
<string name="app_profile_template_id_exist">ID templat sudah ada!</string>
|
||||
<string name="app_profile_import_export">Impor/Ekspor</string>
|
||||
<string name="app_profile_import_from_clipboard">Impor dari papan klip</string>
|
||||
<string name="app_profile_export_to_clipboard">Ekspor ke papan klip</string>
|
||||
<string name="app_profile_template_export_empty">Tidak ditemukan templat lokal untuk diekspor!</string>
|
||||
<string name="app_profile_template_import_success">Berhasil diimpor</string>
|
||||
<string name="app_profile_template_sync">Sinkronkan templat daring</string>
|
||||
<string name="app_profile_template_save_failed">Gagal menyimpan templat</string>
|
||||
<string name="app_profile_template_import_empty">Papan klip kosong!</string>
|
||||
<string name="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="grant_root_failed">Gagal memberikan akses root!</string>
|
||||
<string name="action">Tindakan</string>
|
||||
<string name="close">Tutup</string>
|
||||
<string name="enable_web_debugging">Pengawakutuan WebView</string>
|
||||
<string name="enable_web_debugging_summary">Dapat digunakan untuk men-debug WebUI. Harap aktifkan hanya bila diperlukan.</string>
|
||||
<string name="select_file_tip">%1$s image partisi terekomendasi</string>
|
||||
<string name="select_kmi">Pilih KMI</string>
|
||||
<string name="install_next">Selanjutnya</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="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="grant_root_failed">Gagal memberikan akses root!</string>
|
||||
<string name="close">Tutup</string>
|
||||
<string name="settings_check_update">Cek terbaru</string>
|
||||
<string name="settings_check_update_summary">Cek terbaru setiap membuka aplikasi</string>
|
||||
<string name="settings_uninstall_permanent_message">Hapus permanen KernelSU (root dan modul).</string>
|
||||
<string name="settings_uninstall_temporary">Hapus sementara</string>
|
||||
<string name="settings_restore_stock_image">Pulihkan image bawaan</string>
|
||||
<string name="install_inactive_slot_warning">Gawai akan **DIPAKSA** untuk but ke slot nonaktif!
|
||||
\nHANYA gunakan setelah proses OTA selesai.
|
||||
\nLanjutkan?</string>
|
||||
<string name="install_next">Selanjutnya</string>
|
||||
<string name="select_file_tip">%1$s image partisi terekomendasi</string>
|
||||
<string name="select_kmi">Pilih KMI</string>
|
||||
<string name="settings_uninstall">Hapus</string>
|
||||
<string name="settings_uninstall_temporary_message">Sementara menghapus KernelSU, memulihkan ke kondisi asal setelah reboot berikutnya.</string>
|
||||
<string name="settings_uninstall_temporary">Hapus sementara</string>
|
||||
<string name="settings_uninstall_permanent">Hapus permanen</string>
|
||||
<string name="settings_restore_stock_image">Pulihkan image bawaan</string>
|
||||
<string name="settings_uninstall_temporary_message">Sementara menghapus KernelSU, memulihkan ke kondisi asal setelah reboot berikutnya.</string>
|
||||
<string name="settings_uninstall_permanent_message">Hapus permanen KernelSU (root dan modul).</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="flash_success">Pemasangan Berhasil</string>
|
||||
<string name="selected_lkm">LKM dipilih: %s</string>
|
||||
<string name="flashing">Pasang</string>
|
||||
<string name="flash_success">Pemasangan Berhasil</string>
|
||||
<string name="flash_failed">Pemasangan Gagal</string>
|
||||
<string name="selected_lkm">LKM dipilih: %s</string>
|
||||
<string name="save_log">Simpan Log</string>
|
||||
<string name="action">Action</string>
|
||||
<string name="log_saved">Log disimpan</string>
|
||||
<string name="module_sort_enabled_first">Urut (Diaktifkan terlebih dahulu)</string>
|
||||
<string name="module_sort_action_first">Urut (Tindakan pertama)</string>
|
||||
<string name="home_android_version">Versi Android</string>
|
||||
<string name="home_kpm_version">Versi KPM</string>
|
||||
<string name="home_susfs_version">Versi SuSFS</string>
|
||||
<string name="home_device_model">Model Perangkat</string>
|
||||
<string name="home_ContributionCard_kernelsu">Antusias Untuk SukiSU Ultra</string>
|
||||
<string name="home_click_to_ContributionCard_kernelsu">SukiSU Ultra akan menjadi cabang KSU yang relatif independen di masa mendatang, tetapi kami tetap menghargai KernelSU dan MKSU resmi dan sebagainya atas kontribusi mereka!</string>
|
||||
<string name="kpm_title">KPM</string>
|
||||
<string name="kpm_empty">Tidak ada modul kernel yang terpasang saat ini</string>
|
||||
<string name="kpm_version">Versi</string>
|
||||
<string name="kpm_author">Pembuat</string>
|
||||
<string name="kpm_uninstall">Uninstal</string>
|
||||
<string name="kpm_uninstall_success">Berhasil di Uninstal</string>
|
||||
<string name="kpm_uninstall_failed">Gagal Uninstal</string>
|
||||
<string name="kpm_install_success">Memuat module KPM berhasil</string>
|
||||
<string name="kpm_install_failed">Memuat module KPM gagal!</string>
|
||||
<string name="kpm_args">Parameter</string>
|
||||
<string name="kpm_control">Eksekusi</string>
|
||||
<string name="kernel_module_notice">Fungsi-fungsi modul kernel berikut dikembangkan oleh KernelPatch dan dimodifikasi untuk menyertakan fungsi modul kernel dari SukiSU Ultra</string>
|
||||
<string name="settings_disable_su">Nonaktifkan kompatibilitas SU</string>
|
||||
<string name="settings_disable_su_summary">Nonaktifkan sementara kemampuan aplikasi untuk mendapatkan hak akses root melalui perintah su (proses root yang sedang berjalan tidak akan terpengaruh)</string>
|
||||
<string name="use_webuix">Pilih jenis webUI untuk digunakan</string>
|
||||
<string name="engine_auto_select">Otomatis memilih</string>
|
||||
<string name="engine_force_webuix">Paksa menggunakan WebUI X</string>
|
||||
<string name="engine_force_ksu">Penggunaan wajib KSU WebUI</string>
|
||||
<string name="more_settings">Setelan lainnya</string>
|
||||
<string name="language_setting">Bahasa Aplikasi</string>
|
||||
<string name="language_follow_system">Mengikuti sistem</string>
|
||||
<string name="language_changed">Bahasa dirubah, mulai ulang aplikasi untuk menerapkan</string>
|
||||
<string name="theme_mode">Tema</string>
|
||||
<string name="theme_follow_system">Mengikuti sistem</string>
|
||||
<string name="theme_light">Terang</string>
|
||||
<string name="theme_dark">Hitam</string>
|
||||
<string name="dynamic_color_title">Warna dinamik</string>
|
||||
<string name="dynamic_color_summary">Warna dinamik, menggunakan sistem tema</string>
|
||||
<string name="choose_theme_color">Pilih warna tema</string>
|
||||
<string name="color_default">Biru</string>
|
||||
<string name="color_green">Hijau</string>
|
||||
<string name="color_purple">Ungu</string>
|
||||
<string name="color_orange">Oren</string>
|
||||
<string name="color_pink">Pink</string>
|
||||
<string name="color_gray">Abu</string>
|
||||
<string name="color_yellow">Kuning</string>
|
||||
<string name="app_dpi_title">Ubah DPI</string>
|
||||
<string name="app_dpi_summary">Pengaturan DPI hanya untuk aplikasi ini saja</string>
|
||||
<string name="dpi_size_small">Kecil</string>
|
||||
<string name="dpi_size_medium">Sedang</string>
|
||||
<string name="dpi_size_large">Besar</string>
|
||||
<string name="dpi_size_extra_large">Jumbo</string>
|
||||
<string name="dpi_size_custom">Kustomisasi</string>
|
||||
<string name="dpi_apply_settings">Terapkan setelan DPI</string>
|
||||
<string name="dpi_confirm_title">Konfirmasi perubahan DPI</string>
|
||||
<string name="dpi_confirm_message">Apa kamu yakin ingin merubah DPI aplikasi dari %1$d ke %2$d?</string>
|
||||
<string name="dpi_confirm_summary">Aplikasi membutuhkan restar untuk menerapkan opsi DPI ini, perubahan ini tidak mengganggu DPI sistem</string>
|
||||
<string name="dpi_applied_success">DPI telah di rubah ke %1$d, efektif setelah aplikasi di restar</string>
|
||||
<string name="sus_su_mode">Mode SuS SU:</string>
|
||||
<!-- Module related -->
|
||||
<string name="module_install_confirm">konfirmasi pemasangan modul %1$s?</string>
|
||||
<!-- Restore related -->
|
||||
<string name="restore_confirm_message">Operasi ini akan menimpa semua modul yang ada. Lanjutkan?</string>
|
||||
<string name="confirm">Konfirmasi</string>
|
||||
<string name="cancel">Batal</string>
|
||||
<!-- Backup related -->
|
||||
<string name="backup_success">Pencadangan berhasil (tar.gz)</string>
|
||||
<string name="backup_failed">Pencadangan gagal: %1$s</string>
|
||||
<string name="backup_modules">cadangkan modul</string>
|
||||
<string name="restore_modules">pulihkan modul</string>
|
||||
<!-- Restore related messages -->
|
||||
<string name="restore_success">Modul berhasil dipulihkan, restart diperlukan</string>
|
||||
<string name="restore_failed">Pemulihan gagal: %1$s</string>
|
||||
<string name="restart_now">Mulai Ulang Sekarang</string>
|
||||
<string name="unknown_error">Kesalahan tidak diketahui</string>
|
||||
<!-- Command related -->
|
||||
<!-- Allowlist related -->
|
||||
<string name="settings_custom_background">Latar belakang kustom</string>
|
||||
<string name="settings_custom_background_summary">Pilih gambar untuk latar belakang</string>
|
||||
<string name="settings_card_alpha">NavBar transparant</string>
|
||||
<string name="appearance_settings">Kustomisasi toolbar</string>
|
||||
<string name="icon_switch_title">Ubah ikon</string>
|
||||
<string name="icon_switch_summary">Ubah ikon peluncur aplikasi ke ikon KernelSU</string>
|
||||
<string name="icon_switched">Ikon dirubah</string>
|
||||
<string name="show_more_module_info">Tampilkan info modul lainnya</string>
|
||||
<string name="show_more_module_info_summary">Pajang info modul tambahan seperti URL pembaruan JSON</string>
|
||||
<string name="home_android_version">Versi Android</string>
|
||||
<string name="home_device_model">Model Perangkat</string>
|
||||
<string name="settings_disable_su">Nonaktifkan kompatibilitas SU</string>
|
||||
<string name="settings_disable_su_summary">Nonaktifkan sementara kemampuan aplikasi untuk mendapatkan hak akses root melalui perintah su (proses root yang sedang berjalan tidak akan terpengaruh)</string>
|
||||
<string name="more_settings">Setelan lainnya</string>
|
||||
<string name="simple_mode">Mode simple</string>
|
||||
<string name="simple_mode_summary">Sembunyikan papan kartu di beranda</string>
|
||||
<string name="hide_kernel_kernelsu_version">Sembunyikan versi kernel</string>
|
||||
@@ -198,6 +165,93 @@
|
||||
<string name="hide_link_card_summary">Sembunyikan papan kartu URL di halaman awal beranda</string>
|
||||
<string name="hide_tag_card">Sembunyikan baris label modul</string>
|
||||
<string name="hide_tag_card_summary">Sembunyikan label nama folder dan ukuran di kartu modul</string>
|
||||
<string name="theme_mode">Tema</string>
|
||||
<string name="theme_follow_system">Mengikuti sistem</string>
|
||||
<string name="theme_light">Terang</string>
|
||||
<string name="theme_dark">Hitam</string>
|
||||
<string name="dynamic_color_title">Warna dinamik</string>
|
||||
<string name="dynamic_color_summary">Warna dinamik, menggunakan sistem tema</string>
|
||||
<string name="choose_theme_color">Pilih warna tema</string>
|
||||
<string name="color_default">Biru</string>
|
||||
<string name="color_green">Hijau</string>
|
||||
<string name="color_purple">Ungu</string>
|
||||
<string name="color_orange">Oren</string>
|
||||
<string name="color_gray">Abu</string>
|
||||
<string name="color_yellow">Kuning</string>
|
||||
<string name="kpm_empty">Tidak ada modul kernel yang terpasang saat ini</string>
|
||||
<string name="kpm_version">Versi</string>
|
||||
<string name="kpm_author">Pembuat</string>
|
||||
<string name="kpm_uninstall">Uninstal</string>
|
||||
<string name="kpm_uninstall_success">Berhasil di Uninstal</string>
|
||||
<string name="kpm_uninstall_failed">Gagal Uninstal</string>
|
||||
<string name="kpm_install_success">Memuat module KPM berhasil</string>
|
||||
<string name="kpm_install_failed">Memuat module KPM gagal!</string>
|
||||
<string name="kpm_args">Parameter</string>
|
||||
<string name="kpm_control">Eksekusi</string>
|
||||
<string name="home_kpm_version">Versi KPM</string>
|
||||
<string name="kernel_module_notice">Fungsi-fungsi modul kernel berikut dikembangkan oleh KernelPatch dan dimodifikasi untuk menyertakan fungsi modul kernel dari SukiSU Ultra</string>
|
||||
<string name="home_ContributionCard_kernelsu">Antusias Untuk SukiSU Ultra</string>
|
||||
<string name="home_click_to_ContributionCard_kernelsu">SukiSU Ultra akan menjadi cabang KSU yang relatif independen di masa mendatang, tetapi kami tetap menghargai KernelSU dan MKSU resmi dan sebagainya atas kontribusi mereka!</string>
|
||||
<!-- Kernel Flash Progress Related -->
|
||||
<!-- Flash Status Related -->
|
||||
<!-- Slot selection related strings -->
|
||||
<!-- Error Messages -->
|
||||
<!-- lkm/gki install -->
|
||||
<!-- String resources used in SuperUser -->
|
||||
<string name="appearance_settings">Kustomisasi toolbar</string>
|
||||
<string name="icon_switch_title">Ubah ikon</string>
|
||||
<string name="icon_switch_summary">Ubah ikon peluncur aplikasi ke ikon KernelSU</string>
|
||||
<string name="icon_switched">Ikon dirubah</string>
|
||||
<!-- KPM display settings -->
|
||||
<string name="show_kpm_info">Tampilkan fungsi KPM</string>
|
||||
<string name="show_kpm_info_summary">Tampilkan fungsi informasi KPM dan menu KPM di bilah navigasi</string>
|
||||
<!-- Webui X settings -->
|
||||
<string name="use_webuix">Pilih jenis webUI untuk digunakan</string>
|
||||
<string name="engine_auto_select">Otomatis memilih</string>
|
||||
<string name="engine_force_webuix">Paksa menggunakan WebUI X</string>
|
||||
<string name="engine_force_ksu">Penggunaan wajib KSU WebUI</string>
|
||||
<!-- DPI setting related strings -->
|
||||
<string name="app_dpi_title">Ubah DPI</string>
|
||||
<string name="app_dpi_summary">Pengaturan DPI hanya untuk aplikasi ini saja</string>
|
||||
<string name="dpi_size_small">Kecil</string>
|
||||
<string name="dpi_size_medium">Sedang</string>
|
||||
<string name="dpi_size_large">Besar</string>
|
||||
<string name="dpi_size_extra_large">Jumbo</string>
|
||||
<string name="dpi_size_custom">Kustomisasi</string>
|
||||
<string name="dpi_apply_settings">Terapkan setelan DPI</string>
|
||||
<string name="dpi_confirm_title">Konfirmasi perubahan DPI</string>
|
||||
<string name="dpi_confirm_message">Apa kamu yakin ingin merubah DPI aplikasi dari %1$d ke %2$d?</string>
|
||||
<string name="dpi_confirm_summary">Aplikasi membutuhkan restar untuk menerapkan opsi DPI ini, perubahan ini tidak mengganggu DPI sistem</string>
|
||||
<string name="dpi_applied_success">DPI telah di rubah ke %1$d, efektif setelah aplikasi di restar</string>
|
||||
<!-- Language settings related strings -->
|
||||
<string name="language_setting">Bahasa Aplikasi</string>
|
||||
<string name="language_follow_system">Mengikuti sistem</string>
|
||||
<string name="language_changed">Bahasa dirubah, mulai ulang aplikasi untuk menerapkan</string>
|
||||
<!-- Flash related -->
|
||||
<!-- 分类相关 -->
|
||||
<!-- 排序相关 -->
|
||||
<!-- 状态相关 -->
|
||||
<!-- 标签相关 -->
|
||||
<!-- BottomSheet相关 -->
|
||||
<!-- SuSFS Configuration -->
|
||||
<!-- SuSFS Reset Confirmation -->
|
||||
<!-- SuSFS Toast Messages -->
|
||||
<!-- SuSFS Settings Item -->
|
||||
<!-- 开机自启动相关 -->
|
||||
<!-- SuSFS Tab Titles -->
|
||||
<!-- SuSFS Path Management -->
|
||||
<!-- SuSFS Umount Mode -->
|
||||
<!-- SuSFS Run Umount -->
|
||||
<!-- SuSFS Reset Categories -->
|
||||
<!-- SuSFS Path Settings -->
|
||||
<!-- SuSFS Enabled Features -->
|
||||
<!-- Feature Labels -->
|
||||
<!-- 可切换状态 -->
|
||||
<!-- Settings related strings -->
|
||||
<string name="show_more_module_info">Tampilkan info modul lainnya</string>
|
||||
<string name="show_more_module_info_summary">Pajang info modul tambahan seperti URL pembaruan JSON</string>
|
||||
<!-- SuSFS 自启动相关字符串 -->
|
||||
<!-- SuSFS Kstat相关字符串 -->
|
||||
<!-- SuSFS Mount Hiding Control Related Strings -->
|
||||
<!-- 备份和还原相关字符串 -->
|
||||
</resources>
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
<string name="home_not_installed">Non installato</string>
|
||||
<string name="home_click_to_install">Clicca per installare</string>
|
||||
<string name="home_working">In esecuzione</string>
|
||||
<string name="home_working_version">Versione: %d</string>
|
||||
<string name="home_working_version">Versione: %s</string>
|
||||
<string name="home_unsupported">Non supportato</string>
|
||||
<string name="home_unsupported_reason">KernelSU ora supporta solo i kernel GKI</string>
|
||||
<string name="home_kernel">Kernel</string>
|
||||
@@ -60,7 +60,7 @@
|
||||
<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" formatted="false">The current KernelSU version %d is too low for the manager to work properly. Please upgrade to version %d or higher!</string>
|
||||
<string name="require_kernel_version" formatted="false">The current KernelSU version %s is too low for the manager to work properly. Please upgrade to version %s or higher!</string>
|
||||
<string name="settings_umount_modules_default">Scollega moduli da default</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">Disable kprobe hooks</string>
|
||||
|
||||
@@ -39,7 +39,7 @@
|
||||
<string name="module">מודולים</string>
|
||||
<string name="module_author">יוצר</string>
|
||||
<string name="about">אודות</string>
|
||||
<string name="home_working_version">גרסה: %d</string>
|
||||
<string name="home_working_version">גרסה: %s</string>
|
||||
<string name="reboot">הפעלה מחדש</string>
|
||||
<string name="home_unsupported_reason">KernelSU תומך רק בליבת GKI כעת</string>
|
||||
<string name="home_selinux_status">סטטוס SELinux</string>
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
<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_working_version">バージョン: %s</string>
|
||||
<string name="home_unsupported">非対応</string>
|
||||
<string name="home_unsupported_reason">カーネルの KernelSU ドライバが未検出です。カーネルが間違ってませんか?</string>
|
||||
<string name="home_kernel">カーネルのバージョン</string>
|
||||
@@ -12,6 +12,8 @@
|
||||
<string name="home_manager_version">マネージャーのバージョン</string>
|
||||
<string name="home_selinux_status">SELinux のステータス</string>
|
||||
<string name="selinux_status_disabled">無効</string>
|
||||
<string name="selinux_status_enforcing">Enforcing</string>
|
||||
<string name="selinux_status_permissive">Permissive</string>
|
||||
<string name="selinux_status_unknown">不明</string>
|
||||
<string name="superuser">スーパーユーザー</string>
|
||||
<string name="module_failed_to_enable">%s モジュールを ON にできませんでした</string>
|
||||
@@ -58,7 +60,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" formatted="false">現在の KernelSU のバージョン %d は低すぎるため、マネージャーは正常に動作しません。バージョン %d 以上に更新してください!</string>
|
||||
<string name="require_kernel_version" formatted="false">現在の KernelSU のバージョン %s は低すぎるため、マネージャーは正常に動作しません。バージョン %s 以上に更新してください!</string>
|
||||
<string name="settings_umount_modules_default">デフォルトでモジュールのマウントを解除する</string>
|
||||
<string name="settings_umount_modules_default_summary">アプリプロファイルの「モジュールのアンマウント」の共通となるデフォルト値です。 有効にすると、プロファイルセットを持たないアプリのシステムに対するすべてのモジュールの変更が削除されます。</string>
|
||||
<string name="settings_susfs_toggle">kprobe フックを無効化</string>
|
||||
@@ -78,6 +80,7 @@
|
||||
<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>
|
||||
@@ -110,6 +113,7 @@
|
||||
\n続行しますか?</string>
|
||||
<string name="install_next">次へ</string>
|
||||
<string name="select_file_tip">%1$s のパーティションイメージを推奨します。</string>
|
||||
<string name="select_file_tip_vendor">(不安定)</string>
|
||||
<string name="select_kmi">KMI を選択してください</string>
|
||||
<string name="settings_uninstall">アンインストール</string>
|
||||
<string name="settings_uninstall_temporary">一時的にアンインストールする</string>
|
||||
@@ -164,6 +168,7 @@
|
||||
<string name="settings_disable_su_summary">su コマンドを使用してアプリが root 権限を取得する動作を一時的に無効化します (既存の root プロセスは影響を受けません)。</string>
|
||||
<string name="module_install_multiple_confirm_with_names">%1$d 個のモジュールをインストールしてもよろしいですか?\n\n%2$s</string>
|
||||
<string name="more_settings">その他の設定</string>
|
||||
<string name="selinux">SELinux</string>
|
||||
<string name="selinux_enabled">有効</string>
|
||||
<string name="selinux_disabled">無効</string>
|
||||
<string name="simple_mode">シンプルモード</string>
|
||||
@@ -201,6 +206,7 @@
|
||||
<string name="yes">はい</string>
|
||||
<string name="no">いいえ</string>
|
||||
<string name="failed_reboot">再起動に失敗しました</string>
|
||||
<string name="kpm_title">KPM</string>
|
||||
<string name="kpm_empty">カーネルモジュールは現在インストールされていません</string>
|
||||
<string name="kpm_version">バージョン</string>
|
||||
<string name="kpm_author">作者</string>
|
||||
@@ -321,6 +327,7 @@
|
||||
<string name="kernel_flashing">カーネルをフラッシュ中</string>
|
||||
<!-- 分类相关 -->
|
||||
<string name="category_all_apps">すべて</string>
|
||||
<string name="category_root_apps">Root</string>
|
||||
<string name="category_custom_apps">カスタム</string>
|
||||
<string name="category_default_apps">デフォルト</string>
|
||||
<!-- 排序相关 -->
|
||||
@@ -362,7 +369,6 @@
|
||||
<string name="susfs_apply">適用</string>
|
||||
<!-- SuSFS Reset Confirmation -->
|
||||
<string name="susfs_reset_confirm_title">リセットを確認</string>
|
||||
<string name="susfs_reset_confirm">リセットを確認</string>
|
||||
<!-- SuSFS Toast Messages -->
|
||||
<string name="susfs_binary_not_found">ksu_susfs ファイルが見つかりません</string>
|
||||
<string name="susfs_command_failed">SuSFS コマンドの実行に失敗しました</string>
|
||||
@@ -385,12 +391,12 @@
|
||||
<string name="susfs_tab_try_umount">アンマウントを試す</string>
|
||||
<string name="susfs_tab_path_settings">パスの設定</string>
|
||||
<string name="susfs_tab_enabled_features">有効な機能のステータス</string>
|
||||
<!-- SuSFS Dialog Actions -->
|
||||
<string name="susfs_add">追加</string>
|
||||
<!-- SuSFS Path Management -->
|
||||
<string name="susfs_add_sus_path">SUS パスを追加</string>
|
||||
<string name="susfs_add_sus_mount">SUS マウントを追加</string>
|
||||
<string name="susfs_add_try_umount">アンマウントを試すを追加</string>
|
||||
<string name="susfs_sus_path_added_success">SUS パスが正常に追加されました</string>
|
||||
<string name="susfs_path_not_found_error">パスが見つかりません</string>
|
||||
<string name="susfs_path_label">パス</string>
|
||||
<string name="susfs_mount_path_label">マウントのパス</string>
|
||||
<string name="susfs_path_placeholder">例 : /system/addon.d</string>
|
||||
@@ -416,6 +422,7 @@
|
||||
<string name="susfs_reset_mounts_message">すべての SUS マウントの構成が消去されます。続行してもよろしいですか?</string>
|
||||
<string name="susfs_reset_umounts_title">リセットしてアンマウントを試す</string>
|
||||
<string name="susfs_reset_umounts_message">すべてのアンマウント構成がリセットされます。続行してもよろしいですか?</string>
|
||||
<string name="susfs_reset_path_title">パスの設定をリセット</string>
|
||||
<!-- SuSFS Path Settings -->
|
||||
<string name="susfs_android_data_path_label">Android データパス</string>
|
||||
<string name="susfs_sdcard_path_label">SD カードのパス</string>
|
||||
@@ -453,6 +460,64 @@
|
||||
<!-- Settings related strings -->
|
||||
<string name="show_more_module_info">モジュール情報の詳細を表示</string>
|
||||
<string name="show_more_module_info_summary">更新用 JSON の URL など追加の情報を表示します。</string>
|
||||
<string name="susfs_execution_location_label">実行先</string>
|
||||
<string name="susfs_current_execution_location">現在の実行先: %s</string>
|
||||
<string name="susfs_execution_location_service">サービス</string>
|
||||
<string name="susfs_execution_location_post_fs_data">Post-FS-Data</string>
|
||||
<string name="susfs_execution_location_service_description">システムサービスの開始後に実行</string>
|
||||
<string name="susfs_execution_location_post_fs_data_description">ファイルシステムのマウント後にシステムが完全に起動する前に実行をすることで、ブートループが発生する可能性があります。</string>
|
||||
<string name="susfs_slot_info_title">スロット情報</string>
|
||||
<string name="susfs_slot_info_description">現在のブートスロット情報の表示と値のコピーをします。</string>
|
||||
<string name="susfs_current_active_slot">現在のアクティブスロット: %s</string>
|
||||
<string name="susfs_slot_uname">Uname: %s</string>
|
||||
<string name="susfs_slot_build_time">ビルド日時: %s</string>
|
||||
<string name="susfs_slot_current_badge">現在</string>
|
||||
<string name="susfs_slot_use_uname">Uname を使用する</string>
|
||||
<string name="susfs_slot_use_build_time">ビルド日時を使用する</string>
|
||||
<string name="susfs_slot_info_unavailable">スロット情報を取得できません</string>
|
||||
<!-- SuSFS 自启动相关字符串 -->
|
||||
<string name="susfs_autostart_enabled_success">SuSFS 自動起動モジュールが有効、モジュールのパス: %s</string>
|
||||
<string name="susfs_autostart_disabled_success">SuSFS 自動起動モジュールが無効</string>
|
||||
<!-- SuSFS Kstat相关字符串 -->
|
||||
<string name="susfs_tab_kstat_config">Kstat の構成</string>
|
||||
<string name="kstat_static_config_added">Kstat の静的構成を追加しました: %1$s</string>
|
||||
<string name="kstat_config_removed">Kstat の構成を削除しました: %1$s</string>
|
||||
<string name="kstat_path_added">Kstat パスを追加しました: %1$s</string>
|
||||
<string name="kstat_path_removed">Kstat パスを削除しました: %1$s</string>
|
||||
<string name="kstat_updated">Kstat が更新されました: %1$s</string>
|
||||
<string name="kstat_full_clone_updated">Kstat のフルクローンが更新されました: %1$s</string>
|
||||
<string name="add_kstat_statically_title">Kstat 静的構成を追加</string>
|
||||
<string name="file_or_directory_path_label">ファイルまたはディレクトリのパス</string>
|
||||
<string name="hint_use_default_value">ヒント: オリジナルの値を使用するには「default」を使用します</string>
|
||||
<string name="add_kstat_path_title">Kstat のパスを追加</string>
|
||||
<string name="add">追加</string>
|
||||
<string name="reset_kstat_config_title">Kstat の構成をリセット</string>
|
||||
<string name="reset_kstat_config_message">すべての Kstat の構成を消去しますか?この操作は元に戻せません。</string>
|
||||
<string name="kstat_config_description_title">Kstat の構成の説明</string>
|
||||
<string name="kstat_config_description_add_statically">• add_sus_kstat_statically: ファイル、ディレクトリの静的な状態情報</string>
|
||||
<string name="kstat_config_description_add">• add_sus_kstat: バインドマウント前にパスを追加して元の状態情報を保存します</string>
|
||||
<string name="kstat_config_description_update">• update_sus_kstat: ターゲットとなる ino を更新、サイズとブロックは変更しません</string>
|
||||
<string name="kstat_config_description_update_full_clone">• update_sus_kstat_full_clone: ino のみ更新、他の値はそのままにします</string>
|
||||
<string name="static_kstat_config">Kstat の静的構成</string>
|
||||
<string name="kstat_path_management">Kstat パスの管理</string>
|
||||
<string name="no_kstat_config_message">Kstat の構成が未設定です。上のボタンをタップで追加します。</string>
|
||||
<!-- SuSFS Mount Hiding Control Related Strings -->
|
||||
<string name="susfs_hide_mounts_control_title">SUS マウントの非表示制御</string>
|
||||
<string name="susfs_hide_mounts_control_description">プロセスの SUS マウントを非表示する動作を制御します。</string>
|
||||
<string name="susfs_hide_mounts_for_all_procs_label">すべてのプロセスで SUS マウントを非表示</string>
|
||||
<string name="susfs_hide_mounts_for_all_procs_enabled_description">有効化すると SUS マウントは KSU プロセスを含むすべてのプロセスから非表示になります。</string>
|
||||
<string name="susfs_hide_mounts_for_all_procs_disabled_description">無効化すると SUS マウントは非 KSU プロセスからのみ非表示になり、KSU プロセスはマウントを見ることができます。</string>
|
||||
<string name="susfs_hide_mounts_all_enabled">すべてのプロセスで SUS マウントの非表示を有効化しました</string>
|
||||
<string name="susfs_hide_mounts_all_disabled">すべてのプロセスで SUS マウントの非表示を無効化しました</string>
|
||||
<string name="susfs_hide_mounts_recommendation">画面のロック解除後または service.sh または boot-completed.sh の段階で無効に設定することを推奨します。これにより、KSU プロセスによってマウントされたマウントに依存する一部の root 化されたアプリの問題が解決されるはずです。</string>
|
||||
<string name="susfs_hide_mounts_current_setting">現在の設定: %s</string>
|
||||
<string name="susfs_hide_mounts_setting_all">すべてのプロセスを非表示</string>
|
||||
<string name="susfs_hide_mounts_setting_non_ksu">非 KSU プロセスのみ非表示</string>
|
||||
<string name="susfs_run">実行</string>
|
||||
<string name="kernel_simple_kernel">簡潔モードなカーネル バージョン</string>
|
||||
<string name="kernel_simple_kernel_summary">SukiSU のカーネル バージョンによって表示されるクリーンモードを有効または無効します。</string>
|
||||
<string name="susfs_android_data_path_set">Android のデータパスが設定されました: %s</string>
|
||||
<string name="susfs_sdcard_path_set">SD カードのパスは次のように設定済みです: %s</string>
|
||||
<string name="susfs_path_setup_warning">パスの設定は完全に成功しない可能性がありますが、SUS パスは引き続き追加されます。</string>
|
||||
<!-- 备份和还原相关字符串 -->
|
||||
</resources>
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
<string name="home_not_installed">Not installed</string>
|
||||
<string name="home_click_to_install">Click to install</string>
|
||||
<string name="home_working">ಕೆಲಸ ಮಾಡುತ್ತಿದೆ</string>
|
||||
<string name="home_working_version">ವರ್ಷನ್: %d</string>
|
||||
<string name="home_working_version">ವರ್ಷನ್: %s</string>
|
||||
<string name="home_unsupported">ಬೆಂಬಲಿತವಾಗಿಲ್ಲ</string>
|
||||
<string name="home_unsupported_reason">KernelSU ಈಗ GKI ಕರ್ನಲ್ಗಳನ್ನು ಮಾತ್ರ ಬೆಂಬಲಿಸುತ್ತದೆ</string>
|
||||
<string name="home_kernel">ಕರ್ನಲ್</string>
|
||||
@@ -60,7 +60,7 @@
|
||||
<string name="profile_selinux_context">SELinux ಸಂದರ್ಭ</string>
|
||||
<string name="profile_umount_modules">Umount ಮಾಡ್ಯೂಲ್ಗಳು</string>
|
||||
<string name="failed_to_update_app_profile">%s ಗಾಗಿ ಅಪ್ಲಿಕೇಶನ್ ಪ್ರೊಫೈಲ್ ಅನ್ನು ನವೀಕರಿಸಲು ವಿಫಲವಾಗಿದೆ</string>
|
||||
<string name="require_kernel_version" formatted="false">The current KernelSU version %d is too low for the manager to work properly. Please upgrade to version %d or higher!</string>
|
||||
<string name="require_kernel_version" formatted="false">The current KernelSU version %s is too low for the manager to work properly. Please upgrade to version %s or higher!</string>
|
||||
<string name="settings_umount_modules_default">ಡೀಫಾಲ್ಟ್ ಆಗಿ Umount ಮಾಡ್ಯೂಲ್</string>
|
||||
<string name="settings_umount_modules_default_summary">ಅಪ್ಲಿಕೇಶನ್ ಪ್ರೊಫೈಲ್ಗಳಲ್ಲಿ \"Umount ಮಾಡ್ಯೂಲ್\" ಗಾಗಿ ಜಾಗತಿಕ ಡೀಫಾಲ್ಟ್ ಮೌಲ್ಯ. ಸಕ್ರಿಯಗೊಳಿಸಿದರೆ, ಪ್ರೊಫೈಲ್ ಸೆಟ್ ಅನ್ನು ಹೊಂದಿರದ ಅಪ್ಲಿಕೇಶನ್ಗಳಿಗಾಗಿ ಸಿಸ್ಟಮ್ಗೆ ಎಲ್ಲಾ ಮಾಡ್ಯೂಲ್ ಮಾರ್ಪಾಡುಗಳನ್ನು ಇದು ತೆಗೆದುಹಾಕುತ್ತದೆ.</string>
|
||||
<string name="settings_susfs_toggle">Disable kprobe hooks</string>
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
<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_working_version">버전: %s</string>
|
||||
<string name="home_unsupported">지원되지 않음</string>
|
||||
<string name="home_unsupported_reason">KernelSU는 현재 GKI 커널만 지원합니다</string>
|
||||
<string name="home_kernel">커널</string>
|
||||
@@ -60,7 +60,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" formatted="false">The current KernelSU version %d is too low for the manager to work properly. Please upgrade to version %d or higher!</string>
|
||||
<string name="require_kernel_version" formatted="false">The current KernelSU version %s is too low for the manager to work properly. Please upgrade to version %s or higher!</string>
|
||||
<string name="settings_umount_modules_default">기본값으로 모듈 사용 해제</string>
|
||||
<string name="settings_umount_modules_default_summary">앱 프로필 메뉴의 \"모듈 마운트 해제\" 설정에 대한 전역 기본값을 설정합니다. 활성화 시, 개별 프로필이 설정되지 않은 앱은 시스템에 대한 모듈의 모든 수정사항이 적용되지 않습니다.</string>
|
||||
<string name="settings_susfs_toggle">Disable kprobe hooks</string>
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
<string name="home_not_installed">Neįdiegta</string>
|
||||
<string name="home_click_to_install">Spustelėkite norėdami įdiegti</string>
|
||||
<string name="home_working">Veikia</string>
|
||||
<string name="home_working_version">Versija: %d</string>
|
||||
<string name="home_working_version">Versija: %s</string>
|
||||
<string name="home_unsupported">Nepalaikoma</string>
|
||||
<string name="home_unsupported_reason">KernelSU dabar palaiko tik GKI branduolius</string>
|
||||
<string name="home_kernel">Branduolys</string>
|
||||
@@ -60,7 +60,7 @@
|
||||
<string name="profile_selinux_context">SELinux kontekstas</string>
|
||||
<string name="profile_umount_modules">Atjungti modulius</string>
|
||||
<string name="failed_to_update_app_profile">Nepavyko atnaujinti programos profilio %s</string>
|
||||
<string name="require_kernel_version" formatted="false">The current KernelSU version %d is too low for the manager to work properly. Please upgrade to version %d or higher!</string>
|
||||
<string name="require_kernel_version" formatted="false">The current KernelSU version %s is too low for the manager to work properly. Please upgrade to version %s or higher!</string>
|
||||
<string name="settings_umount_modules_default">Atjungti modulius pagal numatytuosius parametrus</string>
|
||||
<string name="settings_umount_modules_default_summary">Visuotinė numatytoji „Modulių atjungimo“ reikšmė programų profiliuose. Jei įjungta, ji pašalins visus sistemos modulio pakeitimus programoms, kurios neturi profilio.</string>
|
||||
<string name="settings_susfs_toggle">Disable kprobe hooks</string>
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
<string name="home_not_installed">Nav ieinstalēts</string>
|
||||
<string name="home_click_to_install">Noklikšķiniet, lai instalētu</string>
|
||||
<string name="home_working">Darbojas</string>
|
||||
<string name="home_working_version">Versija: %d</string>
|
||||
<string name="home_working_version">Versija: %s</string>
|
||||
<string name="home_unsupported">Neatbalstīts</string>
|
||||
<string name="home_unsupported_reason">KernelSU atbalsta tikai GKI kodolus</string>
|
||||
<string name="home_kernel">Kodols</string>
|
||||
@@ -60,7 +60,7 @@
|
||||
<string name="profile_selinux_context">SELinux konteksts</string>
|
||||
<string name="profile_umount_modules">Atvienot moduļus</string>
|
||||
<string name="failed_to_update_app_profile">Neizdevās atjaunināt lietotnes profilu %s</string>
|
||||
<string name="require_kernel_version" formatted="false">The current KernelSU version %d is too low for the manager to work properly. Please upgrade to version %d or higher!</string>
|
||||
<string name="require_kernel_version" formatted="false">The current KernelSU version %s is too low for the manager to work properly. Please upgrade to version %s or higher!</string>
|
||||
<string name="settings_umount_modules_default">Pēc noklusējuma atvienot moduļus</string>
|
||||
<string name="settings_umount_modules_default_summary">Globālā noklusējuma vērtība vienumam “Atvienot moduļus” lietotņu profilos. Ja tas ir iespējots, lietojumprogrammām, kurām nav iestatīts profils, tiks noņemtas visas sistēmas moduļu modifikācijas.</string>
|
||||
<string name="settings_susfs_toggle">Disable kprobe hooks</string>
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
<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_working_version">आवृत्ती: %s</string>
|
||||
<string name="home_unsupported">असमर्थित</string>
|
||||
<string name="home_unsupported_reason">KernelSU आता फक्त GKI कर्नलचे समर्थन करते</string>
|
||||
<string name="home_kernel">कर्नल</string>
|
||||
@@ -60,7 +60,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" formatted="false">The current KernelSU version %d is too low for the manager to work properly. Please upgrade to version %d or higher!</string>
|
||||
<string name="require_kernel_version" formatted="false">The current KernelSU version %s is too low for the manager to work properly. Please upgrade to version %s or higher!</string>
|
||||
<string name="settings_umount_modules_default">डीफॉल्टनुसार मॉड्यूल्स उमाउंट करा</string>
|
||||
<string name="settings_umount_modules_default_summary">अॅप प्रोफाइलमधील \"उमाउंट मॉड्यूल्स\" साठी जागतिक डीफॉल्ट मूल्य. सक्षम असल्यास, ते प्रोफाइल सेट नसलेल्या ॲप्लिकेशनचे सिस्टममधील सर्व मॉड्यूल बदल काढून टाकेल.</string>
|
||||
<string name="settings_susfs_toggle">Disable kprobe hooks</string>
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
<string name="home_not_installed">Tidak terpasang</string>
|
||||
<string name="home_click_to_install">Tekan untuk memasang</string>
|
||||
<string name="home_working">Berjalan</string>
|
||||
<string name="home_working_version">Versi: %d</string>
|
||||
<string name="home_working_version">Versi: %s</string>
|
||||
<string name="home_unsupported">Tidak Disokong</string>
|
||||
<string name="home_unsupported_reason">KernelSU ketika ini hanya menyokong kernel GKI</string>
|
||||
<string name="home_kernel">Kernel</string>
|
||||
@@ -60,7 +60,7 @@
|
||||
<string name="profile_selinux_context">SELinux context</string>
|
||||
<string name="profile_umount_modules">Umount modules</string>
|
||||
<string name="failed_to_update_app_profile">Failed to update App Profile for %s</string>
|
||||
<string name="require_kernel_version" formatted="false">The current KernelSU version %d is too low for the manager to work properly. Please upgrade to version %d or higher!</string>
|
||||
<string name="require_kernel_version" formatted="false">The current KernelSU version %s is too low for the manager to work properly. Please upgrade to version %s or higher!</string>
|
||||
<string name="settings_umount_modules_default">Umount modules by default</string>
|
||||
<string name="settings_umount_modules_default_summary">The global default value for \"Umount modules\" in App Profile. If enabled, it will remove all module modifications to the system for apps that don\'t have a profile set.</string>
|
||||
<string name="settings_susfs_toggle">Disable kprobe hooks</string>
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
<string name="home_not_installed">Niet geïnstalleerd</string>
|
||||
<string name="home_click_to_install">Klik om te installeren</string>
|
||||
<string name="home_working">Werkend</string>
|
||||
<string name="home_working_version">Versie: %d</string>
|
||||
<string name="home_working_version">Versie: %s</string>
|
||||
<string name="home_unsupported">Niet ondersteund</string>
|
||||
<string name="home_unsupported_reason">KernelSU ondersteunt alleen GKI kernels</string>
|
||||
<string name="home_kernel">Kernel</string>
|
||||
@@ -60,7 +60,7 @@
|
||||
<string name="profile_selinux_context">SELinux context</string>
|
||||
<string name="profile_umount_modules">Ontkoppel modules</string>
|
||||
<string name="failed_to_update_app_profile">Mislukt om App Profiel te updaten voor %s</string>
|
||||
<string name="require_kernel_version" formatted="false">The current KernelSU version %d is too low for the manager to work properly. Please upgrade to version %d or higher!</string>
|
||||
<string name="require_kernel_version" formatted="false">The current KernelSU version %s is too low for the manager to work properly. Please upgrade to version %s or higher!</string>
|
||||
<string name="settings_umount_modules_default">Ontkoppel standaard de modules</string>
|
||||
<string name="settings_umount_modules_default_summary">De globale standaardwaarde voor \"Umount modules\" in App Profile. Als dit is ingeschakeld, worden alle modulewijzigingen in het systeem verwijderd voor apps waarvoor geen profiel is ingesteld.</string>
|
||||
<string name="settings_susfs_toggle">Disable kprobe hooks</string>
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
<string name="home_not_installed">Nie zainstalowano</string>
|
||||
<string name="home_click_to_install">Kliknij, aby zainstalować</string>
|
||||
<string name="home_working">Działa</string>
|
||||
<string name="home_working_version">Wersja: %d</string>
|
||||
<string name="home_working_version">Wersja: %s</string>
|
||||
<string name="home_unsupported">Nieobsługiwany</string>
|
||||
<string name="home_unsupported_reason">KernelSU obsługuje obecnie tylko jądra GKI</string>
|
||||
<string name="home_kernel">Jądro</string>
|
||||
@@ -60,7 +60,7 @@
|
||||
<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" formatted="false">The current KernelSU version %d is too low for the manager to work properly. Please upgrade to version %d or higher!</string>
|
||||
<string name="require_kernel_version" formatted="false">The current KernelSU version %s is too low for the manager to work properly. Please upgrade to version %s or higher!</string>
|
||||
<string name="settings_umount_modules_default">Domyślnie odmontuj moduły</string>
|
||||
<string name="settings_umount_modules_default_summary">Globalna wartość domyślna opcji \"Odmontuj moduły\" w profilu aplikacji. Jeśli jest włączona, wycofuje wszystkie modyfikacje dokonane przez moduły dla aplikacji, które nie mają ustawionego profilu.</string>
|
||||
<string name="settings_susfs_toggle">Disable kprobe hooks</string>
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
<string name="home_not_installed">Não instalado</string>
|
||||
<string name="home_click_to_install">Clique para instalar</string>
|
||||
<string name="home_working">Em execução</string>
|
||||
<string name="home_working_version">Versão: %d</string>
|
||||
<string name="home_working_version">Versão: %s</string>
|
||||
<string name="home_unsupported">Sem suporte</string>
|
||||
<string name="home_unsupported_reason">KernelSU suporta apenas kernels GKI agora</string>
|
||||
<string name="home_kernel">Kernel</string>
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
<string name="home_not_installed">Não instalado</string>
|
||||
<string name="home_click_to_install">Clique para instalar</string>
|
||||
<string name="home_working">Funcionando</string>
|
||||
<string name="home_working_version">Versão: %d</string>
|
||||
<string name="home_working_version">Versão: %s</string>
|
||||
<string name="home_unsupported">Sem suporte</string>
|
||||
<string name="home_unsupported_reason">KernelSU suporta apenas kernels GKI agora</string>
|
||||
<string name="home_kernel">Kernel</string>
|
||||
@@ -60,7 +60,7 @@
|
||||
<string name="profile_selinux_context">contexto SELinux</string>
|
||||
<string name="profile_umount_modules">Desativar modulos</string>
|
||||
<string name="failed_to_update_app_profile">Falha ao atualizar o perfil do aplicativo para %s</string>
|
||||
<string name="require_kernel_version" formatted="false">A versão atual do KernelSU %d é muito baixa para o gerenciador funcionar corretamente. Atualize para a versão %d ou superior!</string>
|
||||
<string name="require_kernel_version" formatted="false">A versão atual do KernelSU %s é muito baixa para o gerenciador funcionar corretamente. Atualize para a versão %s ou superior!</string>
|
||||
<string name="settings_umount_modules_default">Módulos desativados por padrão</string>
|
||||
<string name="settings_umount_modules_default_summary">O valor padrão global para \"Módulos Umount\" em Perfis de Aplicativos. Se ativado, removerá todas as modificações de módulo do sistema para aplicativos que não possuem um Perfil definido.</string>
|
||||
<string name="settings_susfs_toggle">Desabilitar ganchos de \"Kprobe\"</string>
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
<string name="home_not_installed">Nu este instalat</string>
|
||||
<string name="home_click_to_install">Click pentru a instala</string>
|
||||
<string name="home_working">Funcționează</string>
|
||||
<string name="home_working_version">Versiune: %d</string>
|
||||
<string name="home_working_version">Versiune: %s</string>
|
||||
<string name="home_unsupported">Necompatibil</string>
|
||||
<string name="home_unsupported_reason">KernelSU suportă doar nuclee GKI acum</string>
|
||||
<string name="home_kernel">Nucleu</string>
|
||||
@@ -60,7 +60,7 @@
|
||||
<string name="profile_selinux_context">Context SELinux</string>
|
||||
<string name="profile_umount_modules">Module u-montate</string>
|
||||
<string name="failed_to_update_app_profile">Nu s-a putut actualiza profilul aplicației pentru %s</string>
|
||||
<string name="require_kernel_version" formatted="false">The current KernelSU version %d is too low for the manager to work properly. Please upgrade to version %d or higher!</string>
|
||||
<string name="require_kernel_version" formatted="false">The current KernelSU version %s is too low for the manager to work properly. Please upgrade to version %s or higher!</string>
|
||||
<string name="settings_umount_modules_default">U-montează modulele în mod implicit</string>
|
||||
<string name="settings_umount_modules_default_summary">Valoarea implicită globală pentru „Module u-montate” în Profilurile aplicațiilor. Dacă este activat, va elimina toate modificările modulelor aduse sistemului pentru aplicațiile care nu au un profil setat.</string>
|
||||
<string name="settings_susfs_toggle">Disable kprobe hooks</string>
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
<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_working_version">Версия: %s</string>
|
||||
<string name="home_unsupported">Не поддерживается</string>
|
||||
<string name="home_unsupported_reason">Драйвера KernelSU не найдены в ядре, не то ядро?</string>
|
||||
<string name="home_kernel">Ядро</string>
|
||||
@@ -60,7 +60,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" formatted="false">Текущая версия KernelSU %d слишком низкая для правильной работы менеджера. Пожалуйста, обновите до версии %d или выше!</string>
|
||||
<string name="require_kernel_version" formatted="false">Текущая версия KernelSU %s слишком низкая для правильной работы менеджера. Пожалуйста, обновите до версии %s или выше!</string>
|
||||
<string name="settings_umount_modules_default">Размонтировать модули по умолчанию</string>
|
||||
<string name="settings_umount_modules_default_summary">Глобальное значение по умолчанию для \"Размонтировать модули\" в профиле приложения. При включении будут удалены все модификации модулей в системе для приложений, у которых не задан профиль</string>
|
||||
<string name="settings_susfs_toggle">Отключить kprobe хуки</string>
|
||||
@@ -113,6 +113,7 @@
|
||||
\n Продолжить?</string>
|
||||
<string name="install_next">Далее</string>
|
||||
<string name="select_file_tip">Образ раздела %1$s рекомендуется</string>
|
||||
<string name="select_file_tip_vendor">(нестабильный)</string>
|
||||
<string name="select_kmi">Выбрать KMI</string>
|
||||
<string name="settings_uninstall">Удалить</string>
|
||||
<string name="settings_uninstall_temporary">Удалить на время</string>
|
||||
@@ -180,6 +181,8 @@
|
||||
<string name="hide_susfs_status_summary">Скрывать информацию о статусе SuSFS на главной странице</string>
|
||||
<string name="hide_link_card">Скрыть карточки со ссылками</string>
|
||||
<string name="hide_link_card_summary">Скрывать карточки со ссылками на главной странице</string>
|
||||
<string name="hide_tag_card">Скрыть строки модуля</string>
|
||||
<string name="hide_tag_card_summary">Скрывать имя пакета и размер в карточке модуля</string>
|
||||
<string name="theme_mode">Тема</string>
|
||||
<string name="theme_follow_system">Как в системе</string>
|
||||
<string name="theme_light">Светлая</string>
|
||||
@@ -358,12 +361,14 @@
|
||||
<string name="susfs_config_description_text">Эта функция позволяет вам настраивать переменную uname для SuSFS. Впишите значение и нажмите \"Применить\" для изменения.</string>
|
||||
<string name="susfs_uname_label">Значение uname</string>
|
||||
<string name="susfs_uname_placeholder">Пожалуйста, введите пользовательское значение uname</string>
|
||||
<string name="susfs_build_time_label">Подмена времени сборки</string>
|
||||
<string name="susfs_build_time_placeholder">Пожалуйста, введите значение для подмены времени сборки</string>
|
||||
<string name="susfs_current_value">Текущее значение: %s</string>
|
||||
<string name="susfs_current_build_time">Текущее время сборки: %s</string>
|
||||
<string name="susfs_reset_to_default">Значение по умолчанию</string>
|
||||
<string name="susfs_apply">Применить</string>
|
||||
<!-- SuSFS Reset Confirmation -->
|
||||
<string name="susfs_reset_confirm_title">Подтвердить сброс</string>
|
||||
<string name="susfs_reset_confirm">Подтвердить сброс</string>
|
||||
<!-- SuSFS Toast Messages -->
|
||||
<string name="susfs_binary_not_found">Не удалось найти файл ksu_susfs</string>
|
||||
<string name="susfs_command_failed">Выполнение команды SuSFS не удалось</string>
|
||||
@@ -372,17 +377,170 @@
|
||||
<!-- SuSFS Settings Item -->
|
||||
<string name="susfs_config_setting_title">Конфигурация SuSFS</string>
|
||||
<!-- 开机自启动相关 -->
|
||||
<string name="susfs_autostart_title">Автозапуск</string>
|
||||
<string name="susfs_autostart_description">Автоматически применять все конфигурации не по умолчанию при перезагрузке</string>
|
||||
<string name="susfs_autostart_requirement">Для включения необходимо добавить конфигурацию</string>
|
||||
<string name="susfs_autostart_enable_failed">Не удалось включить автозапуск</string>
|
||||
<string name="susfs_autostart_disable_failed">Не удалось отключить автозапуск</string>
|
||||
<string name="susfs_autostart_error">Ошибка автозапуска конфигурации: %s</string>
|
||||
<string name="susfs_no_config_to_autostart">Нет доступных конфигураций для автозапуска</string>
|
||||
<!-- SuSFS Tab Titles -->
|
||||
<!-- SuSFS Dialog Actions -->
|
||||
<string name="susfs_tab_basic_settings">Базовые настройки</string>
|
||||
<string name="susfs_tab_sus_paths">SUS пути</string>
|
||||
<string name="susfs_tab_sus_mounts">SUS монтирование</string>
|
||||
<string name="susfs_tab_try_umount">Попробовать размонтировать</string>
|
||||
<string name="susfs_tab_path_settings">Настройки пути</string>
|
||||
<string name="susfs_tab_enabled_features">Статус включённых функций</string>
|
||||
<!-- SuSFS Path Management -->
|
||||
<string name="susfs_add_sus_path">Добавить SUS путь</string>
|
||||
<string name="susfs_add_sus_mount">Добавить SUS монтирование</string>
|
||||
<string name="susfs_add_try_umount">Добавить попробовать размонтировать</string>
|
||||
<string name="susfs_sus_path_added_success">Путь SUS успешно добавлен</string>
|
||||
<string name="susfs_path_not_found_error">Ошибка пути</string>
|
||||
<string name="susfs_path_label">Путь</string>
|
||||
<string name="susfs_mount_path_label">Путь монтирования</string>
|
||||
<string name="susfs_path_placeholder">например: /system/addon.d</string>
|
||||
<string name="susfs_no_paths_configured">SUS пути не настроены</string>
|
||||
<string name="susfs_no_mounts_configured">SUS монтирование не настроено</string>
|
||||
<string name="susfs_no_umounts_configured">Попытка размонтировать не настроена</string>
|
||||
<!-- SuSFS Umount Mode -->
|
||||
<string name="susfs_umount_mode_label">Режим размонтирования</string>
|
||||
<string name="susfs_umount_mode_normal">Обычное размонтирование (0)</string>
|
||||
<string name="susfs_umount_mode_detach">Размонтирование отсоединением (1)</string>
|
||||
<string name="susfs_umount_mode_normal_short">Нормальный</string>
|
||||
<string name="susfs_umount_mode_detach_short">Отсоединить</string>
|
||||
<string name="susfs_umount_mode_display">Режим: %1$s (%2$s)</string>
|
||||
<string name="susfs_try_umount_added_success">Попытка размонтировать путь успешно добавлена: %s</string>
|
||||
<string name="susfs_try_umount_added_saved">Попытка размонтировать путь успешно сохранена: %s</string>
|
||||
<!-- SuSFS Run Umount -->
|
||||
<string name="susfs_run_umount_confirm_title">Подтверждение запуска попробовать размонтировать</string>
|
||||
<string name="susfs_run_umount_confirm_message">Это немедленно выполнит все настроенные операции размонтирования. Вы уверены, что хотите продолжить?</string>
|
||||
<!-- SuSFS Reset Categories -->
|
||||
<string name="susfs_reset_paths_title">Сбросить SUS пути</string>
|
||||
<string name="susfs_reset_paths_message">Это очистит все конфигурации пути SUS. Вы уверены, что хотите продолжить?</string>
|
||||
<string name="susfs_reset_mounts_title">Сброс SUS монтирования</string>
|
||||
<string name="susfs_reset_mounts_message">Это очистит все конфигурации SUS монтирования. Вы уверены, что хотите продолжить?</string>
|
||||
<string name="susfs_reset_umounts_title">Сбросить Umount</string>
|
||||
<string name="susfs_reset_umounts_message">Это очистит все конфигурации размонтирования. Вы уверены, что хотите продолжить?</string>
|
||||
<string name="susfs_reset_path_title">Сбросить настройки пути</string>
|
||||
<!-- SuSFS Path Settings -->
|
||||
<string name="susfs_android_data_path_label">Путь к данным Android</string>
|
||||
<string name="susfs_sdcard_path_label">Путь к SD-карте</string>
|
||||
<string name="susfs_set_android_data_path">Задать путь к данным Android</string>
|
||||
<string name="susfs_set_sdcard_path">Задать путь к SD-карте</string>
|
||||
<!-- SuSFS Enabled Features -->
|
||||
<string name="susfs_enabled_features_description">Показывать текущее состояние функций SuSFS</string>
|
||||
<string name="susfs_no_features_found">Информация о состоянии объектов не найдена</string>
|
||||
<string name="susfs_feature_enabled">Включено</string>
|
||||
<string name="susfs_feature_disabled">Выключено</string>
|
||||
<!-- Feature Labels -->
|
||||
<string name="sus_path_feature_label">Поддержка SUS пути</string>
|
||||
<string name="sus_mount_feature_label">Поддержка SUS монтирования</string>
|
||||
<string name="try_umount_feature_label">Поддержка размонтирования</string>
|
||||
<string name="spoof_uname_feature_label">Поддержка подмены uname</string>
|
||||
<string name="spoof_cmdline_feature_label">Подмена Cmdline/Bootconfig</string>
|
||||
<string name="open_redirect_feature_label">Поддержка Open Redirect</string>
|
||||
<string name="enable_log_feature_label">Поддержка логов</string>
|
||||
<string name="auto_default_mount_feature_label">Автомонтирование по умолчанию</string>
|
||||
<string name="auto_bind_mount_feature_label">Автоматическое бинд монтирование</string>
|
||||
<string name="auto_try_umount_bind_feature_label">Автоматически попробовать размонтировать привязать монтировать</string>
|
||||
<string name="hide_symbols_feature_label">Скрытие KSU SUSFS Symbols</string>
|
||||
<string name="magic_mount_feature_label">Поддержка Magic Mount</string>
|
||||
<string name="sus_kstat_feature_label">Поддержка SUS Kstat</string>
|
||||
<string name="sus_su_feature_label">Функция переключения режима SUS SU</string>
|
||||
<!-- 可切换状态 -->
|
||||
<string name="susfs_feature_configurable">Настраиваемые функции SuSFS</string>
|
||||
<string name="susfs_enable_log_label">SuSFS включить лог</string>
|
||||
<string name="susfs_log_config_description">Включить или отключить логирование для SuSFS</string>
|
||||
<string name="susfs_log_config_title">SuSFS настройка логирования</string>
|
||||
<string name="susfs_log_enabled">Включить логирование SuSFS</string>
|
||||
<string name="susfs_log_disabled">Выключить логирование SuSFS</string>
|
||||
<string name="module_update_json">JSON обновления</string>
|
||||
<string name="module_update_json_copied">JSON ссылка обновления скопирована в буфер обмена</string>
|
||||
<!-- Settings related strings -->
|
||||
<string name="show_more_module_info">Показать больше информации о модуле</string>
|
||||
<string name="show_more_module_info_summary">Показывать доп. информацию о модулях, такую как JSON ссылку для обновления</string>
|
||||
<string name="susfs_execution_location_label">Место выполнения</string>
|
||||
<string name="susfs_current_execution_location">Текущее место выполнения: %s</string>
|
||||
<string name="susfs_execution_location_service">Сервис</string>
|
||||
<string name="susfs_execution_location_post_fs_data">Post-FS-Data</string>
|
||||
<string name="susfs_execution_location_service_description">Выполнить после запуска системных сервисов</string>
|
||||
<string name="susfs_execution_location_post_fs_data_description">Выполнить после монтирования файловой системы, но перед полной загрузкой. Может вызвать бутлуп</string>
|
||||
<string name="susfs_slot_info_title">Информация о слоте</string>
|
||||
<string name="susfs_slot_info_description">Просмотреть информацию о текущем слоте загрузки и скопировать значения</string>
|
||||
<string name="susfs_current_active_slot">Текущий слот: %s</string>
|
||||
<string name="susfs_slot_uname">Uname: %s</string>
|
||||
<string name="susfs_slot_build_time">Время сборки: %s</string>
|
||||
<string name="susfs_slot_current_badge">Текущее</string>
|
||||
<string name="susfs_slot_use_uname">Использовать Uname</string>
|
||||
<string name="susfs_slot_use_build_time">Использовать время сборки</string>
|
||||
<string name="susfs_slot_info_unavailable">Не удается получить информацию о слоте</string>
|
||||
<!-- SuSFS 自启动相关字符串 -->
|
||||
<string name="susfs_autostart_enabled_success">SuSFS автозапуск модуля включен, путь к модулям: %s</string>
|
||||
<string name="susfs_autostart_disabled_success">SuSFS модуль автозапуска отключен</string>
|
||||
<!-- SuSFS Kstat相关字符串 -->
|
||||
<string name="susfs_tab_kstat_config">Конфигурация Kstat</string>
|
||||
<string name="kstat_static_config_added">Добавлена статическая конфигурация Kstat: %1$s</string>
|
||||
<string name="kstat_config_removed">Конфигурация Kstat удалена: %1$s</string>
|
||||
<string name="kstat_path_added">Путь к Kstat добавлен: %1$s</string>
|
||||
<string name="kstat_path_removed">Путь к Kstat удалён: %1$s</string>
|
||||
<string name="kstat_updated">Kstat обновлен: %1$s</string>
|
||||
<string name="kstat_full_clone_updated">Полный клон Kstat обновлён: %1$s</string>
|
||||
<string name="add_kstat_statically_title">Добавить статическую конфигурацию Kstat</string>
|
||||
<string name="file_or_directory_path_label">Путь к файлу/папке</string>
|
||||
<string name="hint_use_default_value">Подсказка: Вы можете использовать «по умолчанию» для использования оригинального значения</string>
|
||||
<string name="add_kstat_path_title">Добавить путь Kstat</string>
|
||||
<string name="add">Добавить</string>
|
||||
<string name="reset_kstat_config_title">Сбросить конфигурацию Kstat</string>
|
||||
<string name="reset_kstat_config_message">Вы уверены, что хотите очистить все конфигурации Kstat? Это действие нельзя отменить.</string>
|
||||
<string name="kstat_config_description_title">Описание конфигурации Kstat</string>
|
||||
<string name="kstat_config_description_add_statically">• add_sus_kstat_staticall: Статическая статистика информации о файлах/директориях</string>
|
||||
<string name="kstat_config_description_add">• add_sus_kstat: Добавить путь перед привязкой, сохраняя исходную статистику</string>
|
||||
<string name="kstat_config_description_update">• update_sus_kstat: Обновление цели, сохранение размера и блоков без изменений</string>
|
||||
<string name="kstat_config_description_update_full_clone">• update_sus_kstat_full_clone: Обновление только новых, сохранить другие исходные значения</string>
|
||||
<string name="static_kstat_config">Статическая конфигурация Kstat</string>
|
||||
<string name="kstat_path_management">Управление путями Kstat</string>
|
||||
<string name="no_kstat_config_message">Пока нет конфигурации Kstat, нажмите кнопку выше, чтобы добавить</string>
|
||||
<!-- SuSFS Mount Hiding Control Related Strings -->
|
||||
<string name="susfs_hide_mounts_control_title">Контроль скрытия SUS монтирования</string>
|
||||
<string name="susfs_hide_mounts_control_description">Управление режимом скрытия SUS монтирования для процессов</string>
|
||||
<string name="susfs_hide_mounts_for_all_procs_label">Скрыть монтирования SUS для всех процессов</string>
|
||||
<string name="susfs_hide_mounts_for_all_procs_enabled_description">Когда включено, монтирования SUS будут скрыты от всех процессов, включая процессы KSU</string>
|
||||
<string name="susfs_hide_mounts_for_all_procs_disabled_description">Если отключено, монтирования SUS будут скрываться только из процессов, не связанных с KSU, процессы KSU могут видеть монтирования</string>
|
||||
<string name="susfs_hide_mounts_all_enabled">Включено скрытие монтирования SUS для всех процессов</string>
|
||||
<string name="susfs_hide_mounts_all_disabled">Отключено скрытие монтирования SUS для всех процессов</string>
|
||||
<string name="susfs_hide_mounts_recommendation">Рекомендуется отключить после разблокировки экрана или во время service.sh или boot-completed.sh, так как это должно исправить проблему на некоторых root-приложениях, которые опираются на монтирование, смонтированное процессом KSU</string>
|
||||
<string name="susfs_hide_mounts_current_setting">Текущие настройки: %s</string>
|
||||
<string name="susfs_hide_mounts_setting_all">Скрыть для всех процессов</string>
|
||||
<string name="susfs_hide_mounts_setting_non_ksu">Скрыть только для процессов, не связанных с KSU</string>
|
||||
<string name="susfs_run">Запустить</string>
|
||||
<string name="kernel_simple_kernel">Скрыть доп. информацию о ядре</string>
|
||||
<string name="kernel_simple_kernel_summary">Включить или отключить чистый режим, отображаемой версии ядра SukiSU</string>
|
||||
<string name="susfs_android_data_path_set">Путь к данным Android был установлен на: %s</string>
|
||||
<string name="susfs_sdcard_path_set">Путь к SD-карте был установлен на: %s</string>
|
||||
<string name="susfs_path_setup_warning">Установка пути может быть не вполне успешной, но SUS пути будут добавлены</string>
|
||||
<!-- 备份和还原相关字符串 -->
|
||||
<string name="susfs_backup_title">Резервное копирование</string>
|
||||
<string name="susfs_backup_description">Создайте резервную копию всех конфигураций SuSFS. Файл резервной копии будет содержать все настройки, пути и конфигурации.</string>
|
||||
<string name="susfs_backup_create">Создать резервную копию</string>
|
||||
<string name="susfs_backup_success">Резервная копия успешно создана: %s</string>
|
||||
<string name="susfs_backup_failed">Не удалось создать резервную копию: %s</string>
|
||||
<string name="susfs_backup_file_not_found">Файл резервной копии не найден</string>
|
||||
<string name="susfs_backup_invalid_format">Неверный формат файла резервной копии</string>
|
||||
<string name="susfs_backup_version_mismatch">Несоответствие версии резервного копирования</string>
|
||||
<string name="susfs_restore_title">Восстановить</string>
|
||||
<string name="susfs_restore_description">Восстановить настройки SuSFS из файла резервной копии. Это перезапишет все текущие настройки.</string>
|
||||
<string name="susfs_restore_select_file">Выберите файл резервной копии</string>
|
||||
<string name="susfs_restore_success" formatted="false">Конфигурация успешно восстановлена из резервной копии, созданной на %s с устройства: %s</string>
|
||||
<string name="susfs_restore_failed">Ошибка восстановления: %s</string>
|
||||
<string name="susfs_restore_confirm_title">Подтвердить восстановление</string>
|
||||
<string name="susfs_restore_confirm_description">Это очистит все конфигурации размонтирования. Вы уверены, что хотите продолжить?</string>
|
||||
<string name="susfs_restore_confirm">Восстановление</string>
|
||||
<string name="susfs_backup_info_date">Дата резервного копирования: %s</string>
|
||||
<string name="susfs_backup_info_device">Устройство: %s</string>
|
||||
<string name="susfs_backup_info_version">Версия: %s</string>
|
||||
<string name="hide_bl_script">Скрыть BL скрипт</string>
|
||||
<string name="hide_bl_script_description">Включить скрипт Hide Bootloader Unlock Status</string>
|
||||
<string name="cleanup_residue">Очистка</string>
|
||||
<string name="cleanup_residue_description">Очистка остаточных файлов и каталогов различных модулей и инструментов (может быть удален по ошибке, в результате потери и неспособности начаться, используйте с осторожностью)</string>
|
||||
</resources>
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
<string name="home_not_installed">Ni nameščeno</string>
|
||||
<string name="home_click_to_install">Klikni za namestitev</string>
|
||||
<string name="home_working">V obdelavi</string>
|
||||
<string name="home_working_version">Verzija: %d</string>
|
||||
<string name="home_working_version">Verzija: %s</string>
|
||||
<string name="home_unsupported">Ne podpira</string>
|
||||
<string name="home_unsupported_reason">KernelSU podpira samo GKI kernele</string>
|
||||
<string name="home_kernel">Kernel</string>
|
||||
@@ -60,7 +60,7 @@
|
||||
<string name="profile_selinux_context">SELinux kontekst</string>
|
||||
<string name="profile_umount_modules">Izvrzi module</string>
|
||||
<string name="failed_to_update_app_profile">Napaka pri posodobitvi aplikacijskega profila za %s</string>
|
||||
<string name="require_kernel_version" formatted="false">The current KernelSU version %d is too low for the manager to work properly. Please upgrade to version %d or higher!</string>
|
||||
<string name="require_kernel_version" formatted="false">The current KernelSU version %s is too low for the manager to work properly. Please upgrade to version %s or higher!</string>
|
||||
<string name="settings_umount_modules_default">Po privzetem izvrzi module</string>
|
||||
<string name="settings_umount_modules_default_summary">Globalno privzeta vrednost za \"Izvrzi module\" v aplikacijskih profilih. Če je omogočena, bo to odstranilo vse sistemske modifikacije modulov za aplikacije, ki nimajo nastavljenega profila.</string>
|
||||
<string name="settings_susfs_toggle">Disable kprobe hooks</string>
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
<string name="home_click_to_install">Додирните да бисте инсталирали</string>
|
||||
<string name="home">Почетна</string>
|
||||
<string name="home_not_installed">Није инсталирано</string>
|
||||
<string name="home_working_version">Верзија: %d</string>
|
||||
<string name="home_working_version">Верзија: %s</string>
|
||||
<string name="home_working">Ради</string>
|
||||
<string name="save_log">Сачувај Дневнике</string>
|
||||
</resources>
|
||||
@@ -14,6 +14,6 @@
|
||||
<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_working_version">వెర్షన్: %s</string>
|
||||
<string name="save_log">లాగ్లు సేవ్ చేయండి</string>
|
||||
</resources>
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
<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_working_version">เวอร์ชัน: %s</string>
|
||||
<string name="home_unsupported">ไม่รองรับ</string>
|
||||
<string name="home_unsupported_reason">ตอนนี้ KernelSU รองรับเคอร์เนลประเภท GKI เท่านั้น</string>
|
||||
<string name="home_kernel">เคอร์เนล</string>
|
||||
@@ -60,7 +60,7 @@
|
||||
<string name="profile_selinux_context">บริบท SELinux</string>
|
||||
<string name="profile_umount_modules">Umount โมดูล</string>
|
||||
<string name="failed_to_update_app_profile">ไม่สามารถอัปเดตโปรไฟล์แอปสำหรับ %s ได้</string>
|
||||
<string name="require_kernel_version" formatted="false">The current KernelSU version %d is too low for the manager to work properly. Please upgrade to version %d or higher!</string>
|
||||
<string name="require_kernel_version" formatted="false">The current KernelSU version %s is too low for the manager to work properly. Please upgrade to version %s or higher!</string>
|
||||
<string name="settings_umount_modules_default">Umount โมดูลตามค่าเริ่มต้น</string>
|
||||
<string name="settings_umount_modules_default_summary">หากเปิดใช้งานค่าเริ่มต้นโดยทั่วไปสำหรับ \"Umount โมดูล\" ในโปรไฟล์แอป จะเป็นการลบการแก้ไขโมดูลทั้งหมดในระบบสำหรับแอปพลิเคชันที่ไม่มีการตั้งค่าโปรไฟล์</string>
|
||||
<string name="settings_susfs_toggle">Disable kprobe hooks</string>
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
<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="home_working">Çalışıyor</string>
|
||||
<string name="home_working_version">Sürüm: %d</string>
|
||||
<string name="home_working_version">Sürüm: %s</string>
|
||||
<string name="home_unsupported">Desteklenmiyor</string>
|
||||
<string name="home_unsupported_reason">Kernel\'inizde KernelSU sürücüsü algılanmadı, yanlış çekirdek mi?</string>
|
||||
<string name="home_kernel">Kernel sürümü</string>
|
||||
@@ -36,8 +36,6 @@
|
||||
<string name="module_uninstall_confirm">%s modülünü kaldırmak istediğinizden emin misiniz?</string>
|
||||
<string name="module_uninstall_success">%s kaldırıldı</string>
|
||||
<string name="module_uninstall_failed">Kaldırılamadı: %s</string>
|
||||
<string name="module_version">Version</string>
|
||||
<string name="module_author">Author</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>
|
||||
@@ -46,7 +44,6 @@
|
||||
<string name="reboot_to_apply">Etkili olması için yeniden başlatın</string>
|
||||
<string name="module_magisk_conflict">Magisk ile çakışma nedeniyle modüller kullanılamıyor!</string>
|
||||
<string name="home_learn_kernelsu">KernelSU\'yu öğrenin</string>
|
||||
<string name="home_learn_kernelsu_url">https://kernelsu.org/guide/what-is-kernelsu.html</string>
|
||||
<string name="home_click_to_learn_kernelsu">KernelSU\'yu nasıl yükleyeceğinizi ve modülleri nasıl kullanacağınızı öğrenin</string>
|
||||
<string name="home_support_title">Bizi destekleyin</string>
|
||||
<string name="home_support_content">KernelSU, her zaman olduğu gibi ücretsiz ve açık kaynaklıdır. Ancak bir bağış yaparak bizi destekleyebilirsiniz.</string>
|
||||
@@ -60,7 +57,7 @@
|
||||
<string name="profile_selinux_context">SELinux bağlamı</string>
|
||||
<string name="profile_umount_modules">Modülleri bağlamayı kaldır</string>
|
||||
<string name="failed_to_update_app_profile">%s için Uygulama Profili güncellenemedi</string>
|
||||
<string name="require_kernel_version" formatted="false">Mevcut KernelSU sürümü %d, yöneticinin düzgün çalışması için çok düşük. Lütfen sürüm %d veya daha yüksek bir sürüme yükseltin!</string>
|
||||
<string name="require_kernel_version" formatted="false">Mevcut KernelSU sürümü %s, yöneticinin düzgün çalışması için çok düşük. Lütfen sürüm %s veya daha yüksek bir sürüme yükseltin!</string>
|
||||
<string name="settings_umount_modules_default">Modülleri varsayılan olarak bağlamayı kaldır</string>
|
||||
<string name="settings_umount_modules_default_summary">Uygulama Profilindeki \"Modülleri bağlamayı kaldır\" için küresel varsayılan değer. Etkinleştirilirse, profil ayarlanmamış uygulamalar için sistemdeki tüm modül değişikliklerini kaldırır.</string>
|
||||
<string name="settings_susfs_toggle">Kprobe kancalarını devre dışı bırak</string>
|
||||
@@ -101,7 +98,6 @@
|
||||
<string name="settings_check_update">Güncelleme kontrolü</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">Action</string>
|
||||
<string name="close">Kapat</string>
|
||||
<string name="enable_web_debugging">WebView hata ayıklama etkinleştir</string>
|
||||
<string name="enable_web_debugging_summary">WebUI\'yi hata ayıklamak için kullanılabilir. Sadece ihtiyaç duyulduğunda etkinleştirin.</string>
|
||||
@@ -165,7 +161,6 @@
|
||||
<string name="settings_disable_su_summary">Geçici olarak herhangi bir uygulamanın su komutu aracılığıyla root ayrıcalıkları elde etmesini devre dışı bırakır (mevcut root işlemleri etkilenmez).</string>
|
||||
<string name="module_install_multiple_confirm_with_names">Aşağıdaki %1$d modülü yüklemek istediğinizden emin misiniz? \n\n%2$s</string>
|
||||
<string name="more_settings">Daha fazla ayar</string>
|
||||
<string name="selinux">SELinux</string>
|
||||
<string name="selinux_enabled">Etkin</string>
|
||||
<string name="selinux_disabled">Devre dışı</string>
|
||||
<string name="simple_mode">Basit mod</string>
|
||||
@@ -203,10 +198,8 @@
|
||||
<string name="yes">Evet</string>
|
||||
<string name="no">Hayır</string>
|
||||
<string name="failed_reboot">Yeniden başlatma başarısız</string>
|
||||
<string name="kpm_title">KPM</string>
|
||||
<string name="kpm_empty">Şu anda yüklü çekirdek modülü yok</string>
|
||||
<string name="kpm_version">Sürüm</string>
|
||||
<string name="kpm_author">Author</string>
|
||||
<string name="kpm_uninstall">Kaldır</string>
|
||||
<string name="kpm_uninstall_success">Başarıyla kaldırıldı</string>
|
||||
<string name="kpm_uninstall_failed">Kaldırılamadı</string>
|
||||
@@ -266,7 +259,6 @@
|
||||
<string name="flash_failed_message">Flash\'lama başarısız</string>
|
||||
<!-- lkm/gki install -->
|
||||
<string name="Lkm_install_methods">LKM onarımı/yükle</string>
|
||||
<string name="GKI_install_methods">Flashing AnyKernel3</string>
|
||||
<string name="kernel_version_log">Çekirdek sürümü:%1$s</string>
|
||||
<string name="tool_version_log">Kullanılan yama aracı:%1$s</string>
|
||||
<string name="configuration">Yapılandır</string>
|
||||
@@ -324,7 +316,6 @@
|
||||
<string name="kernel_flashing">Çekirdek Yükleniyor</string>
|
||||
<!-- 分类相关 -->
|
||||
<string name="category_all_apps">Tümü</string>
|
||||
<string name="category_root_apps">Root</string>
|
||||
<string name="category_custom_apps">Özel</string>
|
||||
<string name="category_default_apps">Varsayılan</string>
|
||||
<!-- 排序相关 -->
|
||||
@@ -338,7 +329,6 @@
|
||||
<!-- 状态相关 -->
|
||||
<string name="no_apps_in_category">Bu kategoride uygulama yok</string>
|
||||
<!-- 标签相关 -->
|
||||
<!-- FAB菜单相关 -->
|
||||
<string name="deny_authorization">Yetkilendirme reddedildi</string>
|
||||
<string name="grant_authorization">Yetki verildi</string>
|
||||
<string name="unmount_modules">Modül Bağlantıları Kaldırılıyor</string>
|
||||
@@ -359,7 +349,6 @@
|
||||
<string name="susfs_config_description_text">Bu özellik, SuSFS uname değerini ve build time spoofing\'i özelleştirmenize olanak tanır. Ayarlamak istediğiniz değerleri girin ve uygulayın.</string>
|
||||
<string name="susfs_uname_label">Uname Değeri</string>
|
||||
<string name="susfs_uname_placeholder">Lütfen özel uname değeri girin</string>
|
||||
<string name="susfs_build_time_label">Build Time Spoofing</string>
|
||||
<string name="susfs_build_time_placeholder">Lütfen build time spoofing değeri girin</string>
|
||||
<string name="susfs_current_value">Mevcut değer: %s</string>
|
||||
<string name="susfs_current_build_time">Mevcut build time: %s</string>
|
||||
@@ -367,7 +356,6 @@
|
||||
<string name="susfs_apply">Uygula</string>
|
||||
<!-- SuSFS Reset Confirmation -->
|
||||
<string name="susfs_reset_confirm_title">Sıfırlamayı Onayla</string>
|
||||
<string name="susfs_reset_confirm">Sıfırlamayı Onayla</string>
|
||||
<!-- SuSFS Toast Messages -->
|
||||
<string name="susfs_binary_not_found">ksu_susfs dosyası bulunamadı</string>
|
||||
<string name="susfs_command_failed">SuSFS komut çalıştırma başarısız</string>
|
||||
@@ -390,8 +378,6 @@
|
||||
<string name="susfs_tab_try_umount">Bağlamayı Kaldırmayı Dene</string>
|
||||
<string name="susfs_tab_path_settings">Yol Ayarları</string>
|
||||
<string name="susfs_tab_enabled_features">Etkinleştirilen Özellikler Durumu</string>
|
||||
<!-- SuSFS Dialog Actions -->
|
||||
<string name="susfs_add">Ekle</string>
|
||||
<!-- SuSFS Path Management -->
|
||||
<string name="susfs_add_sus_path">SUS Yolu Ekle</string>
|
||||
<string name="susfs_add_sus_mount">SUS Bağlama Noktası Ekle</string>
|
||||
@@ -406,7 +392,6 @@
|
||||
<string name="susfs_umount_mode_label">Bağlamayı Kaldır Modu</string>
|
||||
<string name="susfs_umount_mode_normal">Normal Bağlamayı Kaldır (0)</string>
|
||||
<string name="susfs_umount_mode_detach">Ayrı Bağlamayı Kaldır (1)</string>
|
||||
<string name="susfs_umount_mode_normal_short">Normal</string>
|
||||
<string name="susfs_umount_mode_detach_short">Ayrı</string>
|
||||
<string name="susfs_umount_mode_display">Mod: %1$s (%2$s)</string>
|
||||
<string name="susfs_try_umount_added_success">Bağlamayı kaldırmayı dene yolu başarıyla eklendi: %s</string>
|
||||
@@ -458,4 +443,8 @@
|
||||
<!-- Settings related strings -->
|
||||
<string name="show_more_module_info">Daha Fazla Modül Bilgisi Göster</string>
|
||||
<string name="show_more_module_info_summary">Güncelleme JSON URL\'leri gibi ek modül bilgilerini göster</string>
|
||||
<!-- SuSFS 自启动相关字符串 -->
|
||||
<!-- SuSFS Kstat相关字符串 -->
|
||||
<!-- SuSFS Mount Hiding Control Related Strings -->
|
||||
<!-- 备份和还原相关字符串 -->
|
||||
</resources>
|
||||
|
||||
@@ -1,14 +1,15 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
<string name="app_name" translatable="false">SukiSU Ultra</string>
|
||||
<string name="home">Головна</string>
|
||||
<string name="home_not_installed">Не встановлено</string>
|
||||
<string name="home_click_to_install">Натисніть щоб встановити</string>
|
||||
<string name="home_click_to_install">Натисніть, щоб встановити</string>
|
||||
<string name="home_working">Працює</string>
|
||||
<string name="home_working_version">Версія: %d</string>
|
||||
<string name="home_working_version">Версія: %s</string>
|
||||
<string name="home_unsupported">Не підтримується</string>
|
||||
<string name="home_unsupported_reason">KernelSU підтримує лише GKI ядра на данний момент</string>
|
||||
<string name="home_kernel">Ядро</string>
|
||||
<string name="home_susfs_version">SuSFS Version</string>
|
||||
<string name="home_unsupported_reason">Драйвер KernelSU не виявлено у вашому ядрі. Можливо, у вас неправильне ядро.</string>
|
||||
<string name="home_kernel">Версія ядра</string>
|
||||
<string name="home_susfs_version">Версія SuSFS</string>
|
||||
<string name="home_manager_version">Версія менеджера</string>
|
||||
<string name="home_selinux_status">Статус SELinux</string>
|
||||
<string name="selinux_status_disabled">Вимкнено</string>
|
||||
@@ -20,353 +21,526 @@
|
||||
<string name="module_failed_to_disable">Не вдалося вимкнути модуль: %s</string>
|
||||
<string name="module_empty">Немає встановлених модулів</string>
|
||||
<string name="module">Модулі</string>
|
||||
<string name="module_sort_action_first">Sort (Action first)</string>
|
||||
<string name="module_sort_enabled_first">Sort (Enabled first)</string>
|
||||
<string name="module_sort_action_first">Сортувати (Спочатку дії)</string>
|
||||
<string name="module_sort_enabled_first">Сортувати (Спочатку ввімкнені)</string>
|
||||
<string name="uninstall">Видалити</string>
|
||||
<string name="module_install">Встановити</string>
|
||||
<string name="install">Встановити</string>
|
||||
<string name="reboot">Перезавантажити</string>
|
||||
<string name="settings">Налаштування</string>
|
||||
<string name="reboot_userspace">М\'яке перезавантаження</string>
|
||||
<string name="reboot_recovery">Перезавантажити до Recovery</string>
|
||||
<string name="reboot_bootloader">Перезавантажити до Bootloader</string>
|
||||
<string name="reboot_download">Перезавантажити до Download</string>
|
||||
<string name="reboot_edl">Перезавантажити до EDL</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_version">Версія</string>
|
||||
<string name="module_author">Автор</string>
|
||||
<string name="refresh">Освіжати(Оновити)</string>
|
||||
<string name="refresh">Оновити</string>
|
||||
<string name="show_system_apps">Показати системні додатки</string>
|
||||
<string name="hide_system_apps">Сховати системні додатки</string>
|
||||
<string name="send_log">Надіслати логи</string>
|
||||
<string name="safe_mode">Безпечний режим</string>
|
||||
<string name="reboot_to_apply">Перезавантажте, щоб застосувати</string>
|
||||
<string name="module_magisk_conflict">Модулі вимкнено, оскільки вони конфліктують із модулями Magisk!</string>
|
||||
<string name="home_learn_kernelsu">Дізнайтеся про KernelSU</string>
|
||||
<string name="module_magisk_conflict">Модулі недоступні через конфлікт з Magisk!</string>
|
||||
<string name="home_learn_kernelsu">Дізнатися про KernelSU</string>
|
||||
<string name="home_learn_kernelsu_url">https://kernelsu.org/guide/what-is-kernelsu.html</string>
|
||||
<string name="home_click_to_learn_kernelsu">Дізнайтеся, як інсталювати KernelSU і використовувати модулі</string>
|
||||
<string name="home_click_to_learn_kernelsu">Дізнайтеся, як встановити KernelSU та використовувати модулі</string>
|
||||
<string name="home_support_title">Підтримати нас</string>
|
||||
<string name="home_support_content">KernelSU є, і завжди буде безкоштовним та з відкритим кодом. Однак, якщо вам не байдуже, можете зробити невеличке пожертвування.</string>
|
||||
<string name="about_source_code"><![CDATA[View source code at %1$s<br/>Join our %2$s channel]]></string>
|
||||
<string name="profile_default">Типовий</string>
|
||||
<string name="home_support_content">KernelSU є, і завжди буде, безкоштовним та з відкритим вихідним кодом. Однак ви можете показати нам свою підтримку, зробивши пожертву.</string>
|
||||
<string name="about_source_code"><![CDATA[Переглянути вихідний код на %1$s<br/>Приєднуйтесь до нашого каналу %2$s]]></string>
|
||||
<string name="profile" translatable="false">Профіль додатку</string>
|
||||
<string name="profile_default">За замовчуванням</string>
|
||||
<string name="profile_template">Шаблон</string>
|
||||
<string name="profile_custom">Власний</string>
|
||||
<string name="profile_name">Назва профілю</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" formatted="false">The current KernelSU version %d is too low for the manager to work properly. Please upgrade to version %d or higher!</string>
|
||||
<string name="settings_umount_modules_default">Розмонтувати модулі за замовчуванням</string>
|
||||
<string name="settings_umount_modules_default_summary">Загальне значення за замовчуванням для \"Розмонтувати модулі\" у профілях додатків. Якщо ввімкнено, буде видалено всі модифікації модулів у системі для додатків, які не мають встановленого профілю.</string>
|
||||
<string name="settings_susfs_toggle">Disable kprobe hooks</string>
|
||||
<string name="profile_umount_modules_summary">Увімкнення даної опції дозволить KernelSU відновити для цього додатка будь-які файли, змінені модулями.</string>
|
||||
<string name="profile_umount_modules">Відмонтувати модулі</string>
|
||||
<string name="failed_to_update_app_profile">Не вдалося оновити профіль додатку для %s</string>
|
||||
<string name="require_kernel_version" formatted="false">Поточна версія KernelSU %s занадто низька для коректної роботи менеджера. Будь ласка, оновіться до версії %s або вище!</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="profile_umount_modules_summary">Увімкнення цієї опції дозволить KernelSU відновити будь-які змінені модулями файли для цього додатку.</string>
|
||||
<string name="profile_selinux_domain">Домен</string>
|
||||
<string name="profile_selinux_rules">Правила</string>
|
||||
<string name="module_update">Оновити</string>
|
||||
<string name="module_downloading">Завантаження модуля: %s</string>
|
||||
<string name="module_start_downloading">Початок завантаження: %s</string>
|
||||
<string name="new_version_available">Нова версія: %s доступна, натисніть, щоб завантажити</string>
|
||||
<string name="new_version_available">Доступна нова версія %s, натисніть для оновлення.</string>
|
||||
<string name="launch_app">Запустити</string>
|
||||
<string name="force_stop_app" formatted="false">Примусово зупинити</string>
|
||||
<string name="restart_app">Перезапустити</string>
|
||||
<string name="failed_to_update_sepolicy">Не вдалося оновити правила SELinux для: %s</string>
|
||||
<string name="module_changelog">Журнал змін</string>
|
||||
<string name="settings_profile_template">Шаблон Профілю Додатку</string>
|
||||
<string name="settings_profile_template_summary">Керувати локальними та мережевими шаблонами профілів додатків</string>
|
||||
<string name="failed_to_update_sepolicy">Не вдалося оновити правила SELinux для %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_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">Шаблон з таким ідентифікатором вже існує!</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_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">Action</string>
|
||||
<string name="close">Close</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="close">Закрити</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">Ваш пристрій буде **ПРИМУСОВО** завантажено в поточний неактивний слот після перезавантаження!
|
||||
\n Використовуйте цю опцію тільки після завершення OTA.
|
||||
\n Продовжити?</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="select_file_tip">Рекомендується образ розділу %1$s</string>
|
||||
<string name="select_file_tip_vendor">(нестабільно)</string>
|
||||
<string name="select_kmi">Вибрати KMI</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, відновити початковий стан після наступного перезавантаження.</string>
|
||||
<string name="settings_uninstall_permanent_message">Видалити KernelSU (Root і всі модулі) повністю і назавжди.</string>
|
||||
<string name="settings_restore_stock_image_message">Відновити стоковий заводський образ (якщо є резервна копія), зазвичай використовується перед OTA; якщо вам потрібно видалити KernelSU, використовуйте \"Назавжди видалити\".</string>
|
||||
<string name="settings_uninstall_permanent">Видалити назавжди</string>
|
||||
<string name="settings_restore_stock_image">Відновити стоковий образ</string>
|
||||
<string name="settings_uninstall_temporary_message">Тимчасово видалити KernelSU, відновлення до початкового стану після наступного перезавантаження.</string>
|
||||
<string name="settings_uninstall_permanent_message">Повне та остаточне видалення KernelSU (Root та всі модулі).</string>
|
||||
<string name="settings_restore_stock_image_message">Відновити стоковий заводський образ (якщо існує резервна копія), зазвичай використовується перед OTA; якщо потрібно видалити KernelSU, використовуйте "Видалити назавжди".</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">Logs saved</string>
|
||||
<string name="sus_su_mode">SuS SU mode:</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="sus_su_mode">Режим SuS SU:</string>
|
||||
<!-- Module related -->
|
||||
<string name="module_install_confirm">confirm install module %1$s?</string>
|
||||
<string name="unknown_module">unknown module</string>
|
||||
<string name="module_install_confirm">Підтвердити встановлення модуля %1$s?</string>
|
||||
<string name="unknown_module">невідомий модуль</string>
|
||||
<!-- Restore related -->
|
||||
<string name="restore_confirm_title">Confirm Module Restoration</string>
|
||||
<string name="restore_confirm_message">This operation will overwrite all existing modules. Continue?</string>
|
||||
<string name="confirm">Confirm</string>
|
||||
<string name="cancel">Cancel</string>
|
||||
<string name="restore_confirm_title">Підтвердити відновлення модулів</string>
|
||||
<string name="restore_confirm_message">Ця операція перезапише всі існуючі модулі. Продовжити?</string>
|
||||
<string name="confirm">Підтвердити</string>
|
||||
<string name="cancel">Скасувати</string>
|
||||
<!-- Backup related -->
|
||||
<string name="backup_success">Backup successful (tar.gz)</string>
|
||||
<string name="backup_failed">Backup failed: %1$s</string>
|
||||
<string name="backup_modules">backup modules</string>
|
||||
<string name="restore_modules">restore modules</string>
|
||||
<string name="backup_success">Резервне копіювання успішне (tar.gz)</string>
|
||||
<string name="backup_failed">Не вдалося створити резервну копію: %1$s</string>
|
||||
<string name="backup_modules">резервне копіювання модулів</string>
|
||||
<string name="restore_modules">відновлення модулів</string>
|
||||
<!-- Restore related messages -->
|
||||
<string name="restore_success">Modules restored successfully, restart required</string>
|
||||
<string name="restore_failed">Restore failed: %1$s</string>
|
||||
<string name="restart_now">Restart Now</string>
|
||||
<string name="unknown_error">Unknown error</string>
|
||||
<string name="restore_success">Модулі успішно відновлено, потрібне перезавантаження</string>
|
||||
<string name="restore_failed">Не вдалося відновити: %1$s</string>
|
||||
<string name="restart_now">Перезавантажити зараз</string>
|
||||
<string name="unknown_error">Невідома помилка</string>
|
||||
<!-- Command related -->
|
||||
<string name="command_execution_failed">Command execution failed: %1$s</string>
|
||||
<string name="command_execution_failed">Не вдалося виконати команду: %1$s</string>
|
||||
<!-- Allowlist related -->
|
||||
<string name="allowlist_backup_success">Allowlist backup successful</string>
|
||||
<string name="allowlist_backup_failed">Allowlist backup failed: %1$s</string>
|
||||
<string name="allowlist_restore_confirm_title">Confirm Allowlist Restoration</string>
|
||||
<string name="allowlist_restore_confirm_message">This operation will overwrite the current allowlist. Continue?</string>
|
||||
<string name="allowlist_restore_success">Allowlist restored successfully</string>
|
||||
<string name="allowlist_restore_failed">Allowlist restore failed: %1$s</string>
|
||||
<string name="backup_allowlist">Backup Allowlist</string>
|
||||
<string name="restore_allowlist">Restore Allowlist</string>
|
||||
<string name="settings_custom_background">Custom App Background</string>
|
||||
<string name="settings_custom_background_summary">Select an image as background</string>
|
||||
<string name="settings_card_alpha">Navigation bar transparency</string>
|
||||
<string name="home_android_version">Android version</string>
|
||||
<string name="home_device_model">Device model</string>
|
||||
<string name="su_not_allowed">Granting superuser to %s is not allowed</string>
|
||||
<string name="settings_disable_su">Disable su compatibility</string>
|
||||
<string name="settings_disable_su_summary">Temporarily disable any applications from obtaining root privileges via the su command (existing root processes will not be affected).</string>
|
||||
<string name="module_install_multiple_confirm_with_names">Sure you want to install the following %1$d modules? \n\n%2$s</string>
|
||||
<string name="more_settings">More settings</string>
|
||||
<string name="allowlist_backup_success">Резервне копіювання білого списку успішне</string>
|
||||
<string name="allowlist_backup_failed">Не вдалося створити резервну копію білого списку: %1$s</string>
|
||||
<string name="allowlist_restore_confirm_title">Підтвердити відновлення білого списку</string>
|
||||
<string name="allowlist_restore_confirm_message">Ця операція перезапише поточний білий список. Продовжити?</string>
|
||||
<string name="allowlist_restore_success">Білий список успішно відновлено</string>
|
||||
<string name="allowlist_restore_failed">Не вдалося відновити білий список: %1$s</string>
|
||||
<string name="backup_allowlist">Резервна копія білого списку</string>
|
||||
<string name="restore_allowlist">Відновити білий список</string>
|
||||
<string name="settings_custom_background">Власний фон додатку</string>
|
||||
<string name="settings_custom_background_summary">Вибрати зображення як фон</string>
|
||||
<string name="settings_card_alpha">Прозорість панелі навігації</string>
|
||||
<string name="home_android_version">Версія Android</string>
|
||||
<string name="home_device_model">Модель пристрою</string>
|
||||
<string name="su_not_allowed">Надання прав суперкористувача для %s заборонено</string>
|
||||
<string name="settings_disable_su">Вимкнути сумісність з su</string>
|
||||
<string name="settings_disable_su_summary">Тимчасово заборонити будь-яким додаткам отримувати root-права через команду su (існуючі root-процеси не будуть зачеплені).</string>
|
||||
<string name="module_install_multiple_confirm_with_names">Ви впевнені, що хочете встановити наступні %1$d модулі? \n\n%2$s</string>
|
||||
<string name="more_settings">Більше налаштувань</string>
|
||||
<string name="selinux">SELinux</string>
|
||||
<string name="selinux_enabled">Enabled</string>
|
||||
<string name="selinux_disabled">Disabled</string>
|
||||
<string name="simple_mode">Simplicity mode</string>
|
||||
<string name="simple_mode_summary">Hides unnecessary cards when turned on</string>
|
||||
<string name="hide_kernel_kernelsu_version">Hide kernel version</string>
|
||||
<string name="hide_kernel_kernelsu_version_summary">Hide kernel version</string>
|
||||
<string name="hide_other_info">Hide other info</string>
|
||||
<string name="hide_other_info_summary">Hides information about the number of super users, modules and KPM modules on the home page</string>
|
||||
<string name="hide_susfs_status">Hide SuSFS status</string>
|
||||
<string name="hide_susfs_status_summary">Hide SuSFS status information on the home page</string>
|
||||
<string name="hide_link_card">Hide Link Card Status</string>
|
||||
<string name="hide_link_card_summary">Hide link card information on the home page</string>
|
||||
<string name="theme_mode">Theme</string>
|
||||
<string name="theme_follow_system">Follow system</string>
|
||||
<string name="theme_light">Light</string>
|
||||
<string name="theme_dark">Dark</string>
|
||||
<string name="manual_hook">Manual Hook</string>
|
||||
<string name="dynamic_color_title">Dynamic colours</string>
|
||||
<string name="dynamic_color_summary">Dynamic colours using system themes</string>
|
||||
<string name="choose_theme_color">Choose a theme colour</string>
|
||||
<string name="color_default">Blue</string>
|
||||
<string name="color_green">Green</string>
|
||||
<string name="color_purple">Purple</string>
|
||||
<string name="color_orange">Orange</string>
|
||||
<string name="color_pink">Pink</string>
|
||||
<string name="color_gray">Gray</string>
|
||||
<string name="color_yellow">Yellow</string>
|
||||
<string name="horizon_kernel">Install Anykernel3</string>
|
||||
<string name="horizon_kernel_summary">Flash AnyKernel3 kernel file</string>
|
||||
<string name="root_required">Requires root privileges</string>
|
||||
<string name="reboot_complete_title">Scrubbing complete</string>
|
||||
<string name="reboot_complete_msg">Whether to reboot immediately?</string>
|
||||
<string name="yes">Yes</string>
|
||||
<string name="no">No</string>
|
||||
<string name="failed_reboot">Reboot Failed</string>
|
||||
<string name="selinux_enabled">Увімкнено</string>
|
||||
<string name="selinux_disabled">Вимкнено</string>
|
||||
<string name="simple_mode">Спрощений режим</string>
|
||||
<string name="simple_mode_summary">Приховує непотрібні картки при ввімкненні</string>
|
||||
<string name="hide_kernel_kernelsu_version">Приховати версію ядра</string>
|
||||
<string name="hide_kernel_kernelsu_version_summary">Приховує версію ядра</string>
|
||||
<string name="hide_other_info">Приховати іншу інформацію</string>
|
||||
<string name="hide_other_info_summary">Приховує червону крапку про кількість суперкористувачів, модулів та KPM-модулів на сторінці навігаційної панелі</string>
|
||||
<string name="hide_susfs_status">Приховати статус SuSFS</string>
|
||||
<string name="hide_susfs_status_summary">Приховує інформацію про статус SuSFS на головній сторінці</string>
|
||||
<string name="hide_link_card">Приховати картку посилань</string>
|
||||
<string name="hide_link_card_summary">Приховує інформацію на картці посилань на головній сторінці</string>
|
||||
<string name="hide_tag_card">Приховати рядки тегів модуля</string>
|
||||
<string name="hide_tag_card_summary">Приховує мітки з назвою папки та розміром у картках модулів</string>
|
||||
<string name="theme_mode">Тема</string>
|
||||
<string name="theme_follow_system">Як у системі</string>
|
||||
<string name="theme_light">Світла</string>
|
||||
<string name="theme_dark">Темна</string>
|
||||
<string name="manual_hook">Ручний хук</string>
|
||||
<string name="dynamic_color_title">Динамічні кольори</string>
|
||||
<string name="dynamic_color_summary">Динамічні кольори з використанням системних тем</string>
|
||||
<string name="choose_theme_color">Вибрати колір теми</string>
|
||||
<string name="color_default">Синій</string>
|
||||
<string name="color_green">Зелений</string>
|
||||
<string name="color_purple">Фіолетовий</string>
|
||||
<string name="color_orange">Помаранчевий</string>
|
||||
<string name="color_pink">Рожевий</string>
|
||||
<string name="color_gray">Сірий</string>
|
||||
<string name="color_yellow">Жовтий</string>
|
||||
<string name="horizon_kernel">Встановити Anykernel3</string>
|
||||
<string name="horizon_kernel_summary">Прошити файл ядра AnyKernel3</string>
|
||||
<string name="root_required">Потрібні права суперкористувача</string>
|
||||
<string name="reboot_complete_title">Очищення завершено</string>
|
||||
<string name="reboot_complete_msg">Перезавантажитися негайно?</string>
|
||||
<string name="yes">Так</string>
|
||||
<string name="no">Ні</string>
|
||||
<string name="failed_reboot">Не вдалося перезавантажити</string>
|
||||
<string name="kpm_title">KPM</string>
|
||||
<string name="kpm_empty">No installed kernel modules at this time</string>
|
||||
<string name="kpm_version">Version</string>
|
||||
<string name="kpm_author">Author</string>
|
||||
<string name="kpm_uninstall">Uninstall</string>
|
||||
<string name="kpm_uninstall_success">Uninstalled successfully</string>
|
||||
<string name="kpm_uninstall_failed">Failed to uninstall</string>
|
||||
<string name="kpm_install_success">Load of kpm module successful</string>
|
||||
<string name="kpm_install_failed">Load of kpm module failed</string>
|
||||
<string name="kpm_args">Parameters</string>
|
||||
<string name="kpm_control">Execute</string>
|
||||
<string name="home_kpm_version">KPM Version</string>
|
||||
<string name="close_notice">Close</string>
|
||||
<string name="kernel_module_notice">The following kernel module functions were developed by KernelPatch and modified to include the kernel module functions of SukiSU Ultra</string>
|
||||
<string name="home_ContributionCard_kernelsu">SukiSU Ultra Look forward to</string>
|
||||
<string name="kpm_control_success">Success</string>
|
||||
<string name="kpm_control_failed">Failed</string>
|
||||
<string name="home_click_to_ContributionCard_kernelsu">SukiSU Ultra will be a relatively independent branch of KSU in the future, but we still appreciate the official KernelSU and MKSU etc. for their contributions!</string>
|
||||
<string name="not_supported">Unsupported</string>
|
||||
<string name="supported">Supported</string>
|
||||
<string name="kernel_patched">Kernel not patched</string>
|
||||
<string name="kernel_not_enabled">Kernel not configured</string>
|
||||
<string name="custom_settings">Custom settings</string>
|
||||
<string name="kpm_install_mode">KPM Install</string>
|
||||
<string name="kpm_install_mode_load">Load</string>
|
||||
<string name="kpm_install_mode_embed">Embed</string>
|
||||
<string name="kpm_install_mode_description">Please select: %1\$s Module Installation Mode \n\nLoad: Temporarily load the module \nEmbedded: Permanently install into the system</string>
|
||||
<string name="snackbar_failed_to_check_module_file">Unable to check if module file exists</string>
|
||||
<string name="theme_color">Theme Color</string>
|
||||
<string name="invalid_file_type">Incorrect file type! Please select .kpm file.</string>
|
||||
<string name="confirm_uninstall_title_with_filename">Uninstall</string>
|
||||
<string name="confirm_uninstall_content">The following KPM will be uninstalled: %s</string>
|
||||
<string name="settings_susfs_toggle_summary">Disable kprobe hooks created by KernelSU, using inline hooks instead, which is similar to non-GKI kernel hooking method.</string>
|
||||
<string name="image_editor_hint">Use two fingers to zoom the image, and one finger to drag it to adjust the position</string>
|
||||
<string name="reprovision">Reprovision</string>
|
||||
<string name="kpm_empty">На даний момент немає встановлених модулів ядра</string>
|
||||
<string name="kpm_version">Версія</string>
|
||||
<string name="kpm_author">Автор</string>
|
||||
<string name="kpm_uninstall">Видалити</string>
|
||||
<string name="kpm_uninstall_success">Видалено успішно</string>
|
||||
<string name="kpm_uninstall_failed">Не вдалося видалити</string>
|
||||
<string name="kpm_install_success">Завантаження модуля kpm успішне</string>
|
||||
<string name="kpm_install_failed">Не вдалося завантажити модуль kpm</string>
|
||||
<string name="kpm_args">Параметри</string>
|
||||
<string name="kpm_control">Виконати</string>
|
||||
<string name="home_kpm_version">Версія KPM</string>
|
||||
<string name="close_notice">Закрити</string>
|
||||
<string name="kernel_module_notice">Наступні функції модулів ядра були розроблені KernelPatch та модифіковані для включення функцій модулів ядра SukiSU Ultra</string>
|
||||
<string name="home_ContributionCard_kernelsu">SukiSU Ultra з нетерпінням чекає</string>
|
||||
<string name="kpm_control_success">Успішно</string>
|
||||
<string name="kpm_control_failed">Невдача</string>
|
||||
<string name="home_click_to_ContributionCard_kernelsu">У майбутньому SukiSU Ultra буде відносно незалежною гілкою KSU, але ми все ще вдячні офіційному KernelSU, MKSU та іншим за їхній внесок!</string>
|
||||
<string name="not_supported">Не підтримується</string>
|
||||
<string name="supported">Підтримується</string>
|
||||
<string name="kernel_patched">Ядро не пропатчене</string>
|
||||
<string name="kernel_not_enabled">Ядро не налаштоване</string>
|
||||
<string name="custom_settings">Власні налаштування</string>
|
||||
<string name="kpm_install_mode">Встановлення KPM</string>
|
||||
<string name="kpm_install_mode_load">Завантажити</string>
|
||||
<string name="kpm_install_mode_embed">Вбудувати</string>
|
||||
<string name="kpm_install_mode_description">Будь ласка, оберіть: %1$s режим встановлення модуля \n\nЗавантажити: Тимчасово завантажити модуль \nВбудувати: Постійно встановити в систему</string>
|
||||
<string name="snackbar_failed_to_check_module_file">Не вдалося перевірити існування файлу модуля</string>
|
||||
<string name="theme_color">Колір теми</string>
|
||||
<string name="invalid_file_type">Неправильний тип файлу! Будь ласка, виберіть файл .kpm.</string>
|
||||
<string name="confirm_uninstall_title_with_filename">Видалити</string>
|
||||
<string name="confirm_uninstall_content">Буде видалено наступний KPM: %s</string>
|
||||
<string name="settings_susfs_toggle_summary">Вимкнути хуки kprobe, створені KernelSU, використовуючи натомість інлайн-хуки, що схоже на метод хуків для ядер без GKI.</string>
|
||||
<string name="image_editor_hint">Використовуйте два пальці для масштабування зображення та один палець для перетягування, щоб налаштувати положення</string>
|
||||
<string name="reprovision">Переналаштувати</string>
|
||||
<!-- Kernel Flash Progress Related -->
|
||||
<string name="horizon_flash_title">Kernel Flashing</string>
|
||||
<string name="horizon_logs_label">Logs:</string>
|
||||
<string name="horizon_flash_complete">Flash Complete</string>
|
||||
<string name="horizon_flash_title">Прошивка ядра</string>
|
||||
<string name="horizon_logs_label">Логи:</string>
|
||||
<string name="horizon_flash_complete">Прошивка завершена</string>
|
||||
<!-- Flash Status Related -->
|
||||
<string name="horizon_preparing">Preparing…</string>
|
||||
<string name="horizon_cleaning_files">Cleaning files…</string>
|
||||
<string name="horizon_copying_files">Copying files…</string>
|
||||
<string name="horizon_extracting_tool">Extracting flash tool…</string>
|
||||
<string name="horizon_patching_script">Patching flash script…</string>
|
||||
<string name="horizon_flashing">Flashing kernel…</string>
|
||||
<string name="horizon_flash_complete_status">Flash completed</string>
|
||||
<string name="horizon_preparing">Підготовка…</string>
|
||||
<string name="horizon_cleaning_files">Очищення файлів…</string>
|
||||
<string name="horizon_copying_files">Копіювання файлів…</string>
|
||||
<string name="horizon_extracting_tool">Розпакування інструменту прошивки…</string>
|
||||
<string name="horizon_patching_script">Патчинг скрипту прошивки…</string>
|
||||
<string name="horizon_flashing">Прошивка ядра…</string>
|
||||
<string name="horizon_flash_complete_status">Прошивка завершена</string>
|
||||
<!-- Slot selection related strings -->
|
||||
<string name="select_slot_title">Select Flash Slot</string>
|
||||
<string name="select_slot_description">Please select the target slot for flashing boot</string>
|
||||
<string name="slot_a">Slot A</string>
|
||||
<string name="slot_b">Slot B</string>
|
||||
<string name="selected_slot">Selected slot: %1$s</string>
|
||||
<string name="horizon_getting_original_slot">Getting the original slot</string>
|
||||
<string name="horizon_setting_target_slot">Setting the specified slot</string>
|
||||
<string name="horizon_restoring_original_slot">Restore Default Slot</string>
|
||||
<string name="current_slot">Current Slot:%1$s </string>
|
||||
<string name="select_slot_title">Вибрати слот для прошивки</string>
|
||||
<string name="select_slot_description">Будь ласка, виберіть цільовий слот для прошивки boot</string>
|
||||
<string name="slot_a">Слот A</string>
|
||||
<string name="slot_b">Слот B</string>
|
||||
<string name="selected_slot">Вибраний слот: %1$s</string>
|
||||
<string name="horizon_getting_original_slot">Отримання оригінального слоту</string>
|
||||
<string name="horizon_setting_target_slot">Встановлення вказаного слоту</string>
|
||||
<string name="horizon_restoring_original_slot">Відновити слот за замовчуванням</string>
|
||||
<string name="current_slot">Поточний системний слот за замовчуванням: %1$s</string>
|
||||
<!-- Error Messages -->
|
||||
<string name="horizon_copy_failed">Copy failed</string>
|
||||
<string name="horizon_unknown_error">Unknown error</string>
|
||||
<string name="flash_failed_message">Flash failed</string>
|
||||
<string name="horizon_copy_failed">Не вдалося скопіювати</string>
|
||||
<string name="horizon_unknown_error">Невідома помилка</string>
|
||||
<string name="flash_failed_message">Прошивка не вдалася</string>
|
||||
<!-- lkm/gki install -->
|
||||
<string name="Lkm_install_methods">LKM repair/installation</string>
|
||||
<string name="GKI_install_methods">Flashing AnyKernel3</string>
|
||||
<string name="kernel_version_log">Kernel version:%1$s</string>
|
||||
<string name="tool_version_log">Using the patching tool:%1$s</string>
|
||||
<string name="configuration">Configure</string>
|
||||
<string name="app_settings">Application Settings</string>
|
||||
<string name="tools">Tools</string>
|
||||
<string name="Lkm_install_methods">Відновлення/встановлення LKM</string>
|
||||
<string name="GKI_install_methods">Прошивка AnyKernel3</string>
|
||||
<string name="kernel_version_log">Версія ядра: %1$s</string>
|
||||
<string name="tool_version_log">Використовується інструмент для патчингу: %1$s</string>
|
||||
<string name="configuration">Налаштувати</string>
|
||||
<string name="app_settings">Налаштування додатку</string>
|
||||
<string name="tools">Інструменти</string>
|
||||
<!-- String resources used in SuperUser -->
|
||||
<string name="no_apps_found">Application not found</string>
|
||||
<string name="selinux_enabled_toast">SELinux Enabled</string>
|
||||
<string name="selinux_disabled_toast">SELinux Disabled</string>
|
||||
<string name="selinux_change_failed">SELinux Status change failed</string>
|
||||
<string name="advanced_settings">Advanced Settings</string>
|
||||
<string name="appearance_settings">Customize the toolbar</string>
|
||||
<string name="back">Comeback</string>
|
||||
<string name="susfs_enabled">SuSFS enabled</string>
|
||||
<string name="susfs_disabled">SuSFS disabled</string>
|
||||
<string name="background_set_success">Background set successfully</string>
|
||||
<string name="background_removed">Removed custom backgrounds</string>
|
||||
<string name="icon_switch_title">Alternate icon</string>
|
||||
<string name="icon_switch_summary">Change the launcher icon to KernelSU\'s icon.</string>
|
||||
<string name="icon_switched">Icon switched</string>
|
||||
<string name="no_apps_found">Додаток не знайдено</string>
|
||||
<string name="selinux_enabled_toast">SELinux увімкнено</string>
|
||||
<string name="selinux_disabled_toast">SELinux вимкнено</string>
|
||||
<string name="selinux_change_failed">Не вдалося змінити статус SELinux</string>
|
||||
<string name="advanced_settings">Розширені налаштування</string>
|
||||
<string name="appearance_settings">Налаштувати панель інструментів</string>
|
||||
<string name="back">Повернутися</string>
|
||||
<string name="susfs_enabled">SuSFS увімкнено</string>
|
||||
<string name="susfs_disabled">SuSFS вимкнено</string>
|
||||
<string name="background_set_success">Фон успішно встановлено</string>
|
||||
<string name="background_removed">Видалено власні фони</string>
|
||||
<string name="icon_switch_title">Альтернативна іконка</string>
|
||||
<string name="icon_switch_summary">Змінити іконку запуску на іконку KernelSU.</string>
|
||||
<string name="icon_switched">Іконку змінено</string>
|
||||
<!-- KPM display settings -->
|
||||
<string name="show_kpm_info">Display KPM Function</string>
|
||||
<string name="show_kpm_info_summary">Display KPM information and Function in home and bottom bar (Need to reopen the app)</string>
|
||||
<string name="show_kpm_info">Приховати функцію KPM</string>
|
||||
<string name="show_kpm_info_summary">Приховує інформацію та функцію KPM на головному екрані та в нижній панелі</string>
|
||||
<!-- Webui X settings -->
|
||||
<string name="use_webuix">Select the WebUI engine to use</string>
|
||||
<string name="engine_auto_select">Automatic Selection</string>
|
||||
<string name="engine_force_webuix">Force the use of WebUI X</string>
|
||||
<string name="engine_force_ksu">Mandatory use of KSU WebUI</string>
|
||||
<string name="use_webuix_eruda">Inject Eruda into WebUI X</string>
|
||||
<string name="use_webuix_eruda_summary">Inject a debug console into WebUI X to make debugging easier. Requires web debugging to be on.</string>
|
||||
<string name="use_webuix">Виберіть рушій WebUI для використання</string>
|
||||
<string name="engine_auto_select">Автоматичний вибір</string>
|
||||
<string name="engine_force_webuix">Примусово використовувати WebUI X</string>
|
||||
<string name="engine_force_ksu">Примусово використовувати KSU WebUI</string>
|
||||
<string name="use_webuix_eruda">Впровадити Eruda у WebUI X</string>
|
||||
<string name="use_webuix_eruda_summary">Впровадити консоль налагодження у WebUI X для полегшення налагодження. Потребує увімкненого веб-налагодження.</string>
|
||||
<!-- DPI setting related strings -->
|
||||
<string name="app_dpi_title">Applied DPI</string>
|
||||
<string name="app_dpi_summary">Adjust the screen display density for the current application only</string>
|
||||
<string name="dpi_size_small">Small </string>
|
||||
<string name="dpi_size_medium">Medium </string>
|
||||
<string name="dpi_size_large">Big</string>
|
||||
<string name="dpi_size_extra_large">oversize</string>
|
||||
<string name="dpi_size_custom">customizable</string>
|
||||
<string name="dpi_apply_settings">Applying DPI settings</string>
|
||||
<string name="dpi_confirm_title">Confirm DPI change</string>
|
||||
<string name="dpi_confirm_message">Are you sure you want to change the application DPI from %1$d to %2$d?</string>
|
||||
<string name="dpi_confirm_summary">Application needs to be restarted to apply the new DPI settings, does not affect the system status bar or other applications</string>
|
||||
<string name="dpi_applied_success">DPI has been set to %1$d, effective after restarting the application</string>
|
||||
<string name="app_dpi_title">Застосований DPI</string>
|
||||
<string name="app_dpi_summary">Налаштувати щільність відображення екрана лише для поточного додатку</string>
|
||||
<string name="dpi_size_small">Маленький</string>
|
||||
<string name="dpi_size_medium">Середній</string>
|
||||
<string name="dpi_size_large">Великий</string>
|
||||
<string name="dpi_size_extra_large">Надвеликий</string>
|
||||
<string name="dpi_size_custom">Власний</string>
|
||||
<string name="dpi_apply_settings">Застосування налаштувань DPI</string>
|
||||
<string name="dpi_confirm_title">Підтвердити зміну DPI</string>
|
||||
<string name="dpi_confirm_message">Ви впевнені, що хочете змінити DPI додатку з %1$d на %2$d?</string>
|
||||
<string name="dpi_confirm_summary">Додаток потрібно перезапустити, щоб застосувати нові налаштування DPI; це не вплине на системний рядок стану або інші додатки</string>
|
||||
<string name="dpi_applied_success">DPI встановлено на %1$d, набуде чинності після перезапуску додатку</string>
|
||||
<!-- Language settings related strings -->
|
||||
<string name="language_setting">App Language</string>
|
||||
<string name="language_follow_system">Follow System</string>
|
||||
<string name="language_changed">Language changed, restarting to apply changes</string>
|
||||
<string name="settings_card_dim">Card Darkness Adjustment</string>
|
||||
<string name="language_setting">Мова додатку</string>
|
||||
<string name="language_follow_system">Як у системі</string>
|
||||
<string name="language_changed">Мову змінено, перезапуск для застосування змін</string>
|
||||
<string name="settings_card_dim">Налаштування затемнення карток</string>
|
||||
<!-- Flash related -->
|
||||
<string name="error_code">error code</string>
|
||||
<string name="check_log">Please check the log</string>
|
||||
<string name="installing_module">Module being installed %1$d/%2$d</string>
|
||||
<string name="module_failed_count">%d Failed to install a new module</string>
|
||||
<string name="module_download_error">Module download failed</string>
|
||||
<string name="kernel_flashing">Kernel Flashing</string>
|
||||
<string name="error_code">код помилки</string>
|
||||
<string name="check_log">Будь ласка, перевірте лог</string>
|
||||
<string name="installing_module">Встановлення модуля %1$d/%2$d</string>
|
||||
<string name="module_failed_count">Не вдалося встановити %d новий модуль</string>
|
||||
<string name="module_download_error">Не вдалося завантажити модуль</string>
|
||||
<string name="kernel_flashing">Прошивка ядра</string>
|
||||
<!-- 分类相关 -->
|
||||
<string name="category_all_apps">All</string>
|
||||
<string name="category_all_apps">Всі</string>
|
||||
<string name="category_root_apps">Root</string>
|
||||
<string name="category_custom_apps">Custom</string>
|
||||
<string name="category_default_apps">Default</string>
|
||||
<string name="category_custom_apps">Власні</string>
|
||||
<string name="category_default_apps">За замовчуванням</string>
|
||||
<!-- 排序相关 -->
|
||||
<string name="sort_name_asc">Ascending order of name</string>
|
||||
<string name="sort_name_desc">Name descending</string>
|
||||
<string name="sort_install_time_new">Installation time (new)</string>
|
||||
<string name="sort_install_time_old">Installation time (old)</string>
|
||||
<string name="sort_size_desc">descending order of size</string>
|
||||
<string name="sort_size_asc">ascending order of size</string>
|
||||
<string name="sort_usage_freq">frequency of use</string>
|
||||
<string name="sort_name_asc">Назва за зростанням</string>
|
||||
<string name="sort_name_desc">Назва за спаданням</string>
|
||||
<string name="sort_install_time_new">Час встановлення (нові)</string>
|
||||
<string name="sort_install_time_old">Час встановлення (старі)</string>
|
||||
<string name="sort_size_desc">Розмір за спаданням</string>
|
||||
<string name="sort_size_asc">Розмір за зростанням</string>
|
||||
<string name="sort_usage_freq">Частота використання</string>
|
||||
<!-- 状态相关 -->
|
||||
<string name="no_apps_in_category">No application in this category</string>
|
||||
<string name="no_apps_in_category">Немає додатків у цій категорії</string>
|
||||
<!-- 标签相关 -->
|
||||
<!-- FAB菜单相关 -->
|
||||
<string name="deny_authorization">Delegation of authority</string>
|
||||
<string name="grant_authorization">Authorizations</string>
|
||||
<string name="unmount_modules">Unmounting Module Mounts</string>
|
||||
<string name="disable_unmount">Disable uninstall module mounting</string>
|
||||
<string name="expand_menu">Expand menu</string>
|
||||
<string name="collapse_menu">Put away the menu</string>
|
||||
<string name="scroll_to_top">Top</string>
|
||||
<string name="scroll_to_bottom">Bottom</string>
|
||||
<string name="selected">Selected</string>
|
||||
<string name="select">option</string>
|
||||
<string name="deny_authorization">Заборонити права</string>
|
||||
<string name="grant_authorization">Надати права</string>
|
||||
<string name="unmount_modules">Відмонтувати монтування модулів</string>
|
||||
<string name="disable_unmount">Вимкнути відмонтування модулів</string>
|
||||
<string name="expand_menu">Розгорнути меню</string>
|
||||
<string name="collapse_menu">Згорнути меню</string>
|
||||
<string name="scroll_to_top">Вгору</string>
|
||||
<string name="scroll_to_bottom">Вниз</string>
|
||||
<string name="selected">Вибрано</string>
|
||||
<string name="select">Вибрати</string>
|
||||
<!-- BottomSheet相关 -->
|
||||
<string name="menu_options">Menu Options</string>
|
||||
<string name="sort_options">Sort by</string>
|
||||
<string name="app_categories">Application Type Selection</string>
|
||||
<string name="menu_options">Опції меню</string>
|
||||
<string name="sort_options">Сортувати за</string>
|
||||
<string name="app_categories">Вибір типу додатку</string>
|
||||
<!-- SuSFS Configuration -->
|
||||
<string name="susfs_config_title">Налаштування SuSFS</string>
|
||||
<string name="susfs_config_description">Опис налаштувань</string>
|
||||
<string name="susfs_config_description_text">Ця функція дозволяє налаштовувати підміну значення uname та часу збірки SuSFS. Введіть потрібні значення та натисніть "Застосувати", щоб вони набули чинності.</string>
|
||||
<string name="susfs_uname_label">Значення Uname</string>
|
||||
<string name="susfs_uname_placeholder">Будь ласка, введіть власне значення uname</string>
|
||||
<string name="susfs_build_time_label">Підміна часу збірки</string>
|
||||
<string name="susfs_build_time_placeholder">Будь ласка, введіть значення для підміни часу збірки</string>
|
||||
<string name="susfs_current_value">Поточне значення: %s</string>
|
||||
<string name="susfs_current_build_time">Поточний час збірки: %s</string>
|
||||
<string name="susfs_reset_to_default">Скинути до замовчування</string>
|
||||
<string name="susfs_apply">Застосувати</string>
|
||||
<!-- SuSFS Reset Confirmation -->
|
||||
<string name="susfs_reset_confirm_title">Підтвердити скидання</string>
|
||||
<!-- SuSFS Toast Messages -->
|
||||
<string name="susfs_binary_not_found">Не вдалося знайти файл ksu_susfs</string>
|
||||
<string name="susfs_command_failed">Не вдалося виконати команду SuSFS</string>
|
||||
<string name="susfs_command_error">Помилка виконання команди SuSFS: %s</string>
|
||||
<string name="susfs_uname_set_success" formatted="false">Значення uname та час збірки SuSFS успішно встановлено: %s, %s</string>
|
||||
<!-- SuSFS Settings Item -->
|
||||
<string name="susfs_config_setting_title">Налаштування SuSFS</string>
|
||||
<!-- 开机自启动相关 -->
|
||||
<string name="susfs_autostart_title">Автозапуск</string>
|
||||
<string name="susfs_autostart_description">Автоматично застосовувати всі нестандартні конфігурації при перезавантаженні</string>
|
||||
<string name="susfs_autostart_requirement">Для ввімкнення потрібно додати конфігурацію</string>
|
||||
<string name="susfs_autostart_enable_failed">Не вдалося ввімкнути автозапуск</string>
|
||||
<string name="susfs_autostart_disable_failed">Не вдалося вимкнути автозапуск</string>
|
||||
<string name="susfs_autostart_error">Помилка конфігурації автозапуску: %s</string>
|
||||
<string name="susfs_no_config_to_autostart">Немає доступної конфігурації для автозапуску</string>
|
||||
<!-- SuSFS Tab Titles -->
|
||||
<!-- SuSFS Dialog Actions -->
|
||||
<string name="susfs_tab_basic_settings">Основні налаштування</string>
|
||||
<string name="susfs_tab_sus_paths">Шляхи SUS</string>
|
||||
<string name="susfs_tab_sus_mounts">Монтування SUS</string>
|
||||
<string name="susfs_tab_try_umount">Спроба відмонтування</string>
|
||||
<string name="susfs_tab_path_settings">Налаштування шляхів</string>
|
||||
<string name="susfs_tab_enabled_features">Статус увімкнених функцій</string>
|
||||
<!-- SuSFS Path Management -->
|
||||
<string name="susfs_add_sus_path">Додати шлях SUS</string>
|
||||
<string name="susfs_add_sus_mount">Додати монтування SUS</string>
|
||||
<string name="susfs_add_try_umount">Додати спробу відмонтування</string>
|
||||
<string name="susfs_sus_path_added_success">Шлях SUS успішно додано</string>
|
||||
<string name="susfs_path_not_found_error">Помилка: шлях не знайдено</string>
|
||||
<string name="susfs_path_label">Шлях</string>
|
||||
<string name="susfs_mount_path_label">Шлях монтування</string>
|
||||
<string name="susfs_path_placeholder">напр.: /system/addon.d</string>
|
||||
<string name="susfs_no_paths_configured">Немає налаштованих шляхів SUS</string>
|
||||
<string name="susfs_no_mounts_configured">Немає налаштованих монтувань SUS</string>
|
||||
<string name="susfs_no_umounts_configured">Немає налаштованих спроб відмонтування</string>
|
||||
<!-- SuSFS Umount Mode -->
|
||||
<string name="susfs_umount_mode_label">Режим відмонтування</string>
|
||||
<string name="susfs_umount_mode_normal">Звичайне відмонтування (0)</string>
|
||||
<string name="susfs_umount_mode_detach">Від\'єднане відмонтування (1)</string>
|
||||
<string name="susfs_umount_mode_normal_short">Звичайний</string>
|
||||
<string name="susfs_umount_mode_detach_short">Від\'єднаний</string>
|
||||
<string name="susfs_umount_mode_display">Режим: %1$s (%2$s)</string>
|
||||
<string name="susfs_try_umount_added_success">Шлях для спроби відмонтування успішно додано: %s</string>
|
||||
<string name="susfs_try_umount_added_saved">Спроба збереження шляху відмонтування успішна: %s</string>
|
||||
<!-- SuSFS Run Umount -->
|
||||
<string name="susfs_run_umount_confirm_title">Підтвердити виконання спроби відмонтування</string>
|
||||
<string name="susfs_run_umount_confirm_message">Це негайно виконає всі налаштовані операції спроби відмонтування. Ви впевнені, що хочете продовжити?</string>
|
||||
<!-- SuSFS Reset Categories -->
|
||||
<string name="susfs_reset_paths_title">Скинути шляхи SUS</string>
|
||||
<string name="susfs_reset_paths_message">Це видалить усі конфігурації шляхів SUS. Ви впевнені, що хочете продовжити?</string>
|
||||
<string name="susfs_reset_mounts_title">Скинути монтування SUS</string>
|
||||
<string name="susfs_reset_mounts_message">Це видалить усі конфігурації монтувань SUS. Ви впевнені, що хочете продовжити?</string>
|
||||
<string name="susfs_reset_umounts_title">Скинути спроби відмонтування</string>
|
||||
<string name="susfs_reset_umounts_message">Це видалить усі конфігурації спроб відмонтування. Ви впевнені, що хочете продовжити?</string>
|
||||
<string name="susfs_reset_path_title">Скинути налаштування шляхів</string>
|
||||
<!-- SuSFS Path Settings -->
|
||||
<string name="susfs_android_data_path_label">Шлях до Android Data</string>
|
||||
<string name="susfs_sdcard_path_label">Шлях до SD-карти</string>
|
||||
<string name="susfs_set_android_data_path">Встановити шлях до Android Data</string>
|
||||
<string name="susfs_set_sdcard_path">Встановити шлях до SD-карти</string>
|
||||
<!-- SuSFS Enabled Features -->
|
||||
<string name="susfs_enabled_features_description">Відображення поточного статусу увімкнених функцій SuSFS</string>
|
||||
<string name="susfs_no_features_found">Інформацію про статус функцій не знайдено</string>
|
||||
<string name="susfs_feature_enabled">Увімкнено</string>
|
||||
<string name="susfs_feature_disabled">Вимкнено</string>
|
||||
<!-- Feature Labels -->
|
||||
<string name="sus_path_feature_label">Підтримка шляхів SUS</string>
|
||||
<string name="sus_mount_feature_label">Підтримка монтувань SUS</string>
|
||||
<string name="try_umount_feature_label">Підтримка спроб відмонтування</string>
|
||||
<string name="spoof_uname_feature_label">Підтримка підміни uname</string>
|
||||
<string name="spoof_cmdline_feature_label">Підміна Cmdline/Bootconfig</string>
|
||||
<string name="open_redirect_feature_label">Підтримка Open Redirect</string>
|
||||
<string name="enable_log_feature_label">Підтримка логування</string>
|
||||
<string name="auto_default_mount_feature_label">Автоматичне монтування за замовчуванням</string>
|
||||
<string name="auto_bind_mount_feature_label">Автоматичне прив\'язане монтування</string>
|
||||
<string name="auto_try_umount_bind_feature_label">Автоматична спроба відмонтування прив\'язаного монтування</string>
|
||||
<string name="hide_symbols_feature_label">Приховати символи KSU SUSFS</string>
|
||||
<string name="magic_mount_feature_label">Підтримка Magic Mount</string>
|
||||
<string name="sus_kstat_feature_label">Підтримка SUS Kstat</string>
|
||||
<string name="sus_su_feature_label">Функція перемикання режиму SUS SU</string>
|
||||
<!-- 可切换状态 -->
|
||||
<string name="susfs_feature_configurable">Настроювані функції SuSFS</string>
|
||||
<string name="susfs_enable_log_label">Увімкнути лог SuSFS</string>
|
||||
<string name="susfs_log_config_description">Увімкнути або вимкнути логування для SuSFS</string>
|
||||
<string name="susfs_log_config_title">Налаштування логування SuSFS</string>
|
||||
<string name="susfs_log_enabled">Увімкнення логування SuSFS</string>
|
||||
<string name="susfs_log_disabled">Вимкнення логування SuSFS</string>
|
||||
<string name="module_update_json">Оновити JSON</string>
|
||||
<string name="module_update_json_copied">URL для оновлення JSON скопійовано в буфер обміну</string>
|
||||
<!-- Settings related strings -->
|
||||
<string name="show_more_module_info">Показувати більше інформації про модуль</string>
|
||||
<string name="show_more_module_info_summary">Відображати додаткову інформацію про модуль, як-от URL-адреси для оновлення JSON</string>
|
||||
<string name="susfs_execution_location_label">Місце виконання</string>
|
||||
<string name="susfs_current_execution_location">Поточне місце виконання: %s</string>
|
||||
<string name="susfs_execution_location_service">Сервіс</string>
|
||||
<string name="susfs_execution_location_post_fs_data">Post-FS-Data</string>
|
||||
<string name="susfs_execution_location_service_description">Виконувати після запуску системних сервісів</string>
|
||||
<string name="susfs_execution_location_post_fs_data_description">Виконувати після монтування файлової системи, але до повного завантаження системи. Може спричинити бутлуп</string>
|
||||
<string name="susfs_slot_info_title">Інформація про слот</string>
|
||||
<string name="susfs_slot_info_description">Переглянути інформацію про поточний завантажувальний слот та скопіювати значення</string>
|
||||
<string name="susfs_current_active_slot">Поточний активний слот: %s</string>
|
||||
<string name="susfs_slot_uname">Uname: %s</string>
|
||||
<string name="susfs_slot_build_time">Час збірки: %s</string>
|
||||
<string name="susfs_slot_current_badge">Поточний</string>
|
||||
<string name="susfs_slot_use_uname">Використовувати Uname</string>
|
||||
<string name="susfs_slot_use_build_time">Використовувати час збірки</string>
|
||||
<string name="susfs_slot_info_unavailable">Не вдалося отримати інформацію про слот</string>
|
||||
<!-- SuSFS 自启动相关字符串 -->
|
||||
<string name="susfs_autostart_enabled_success">Модуль автозапуску SuSFS увімкнено, шлях до модуля: %s</string>
|
||||
<string name="susfs_autostart_disabled_success">Модуль автозапуску SuSFS вимкнено</string>
|
||||
<!-- SuSFS Kstat相关字符串 -->
|
||||
<string name="susfs_tab_kstat_config">Налаштування Kstat</string>
|
||||
<string name="kstat_static_config_added">Статичну конфігурацію Kstat додано: %1$s</string>
|
||||
<string name="kstat_config_removed">Конфігурацію Kstat видалено: %1$s</string>
|
||||
<string name="kstat_path_added">Шлях Kstat додано: %1$s</string>
|
||||
<string name="kstat_path_removed">Шлях Kstat видалено: %1$s</string>
|
||||
<string name="kstat_updated">Kstat оновлено: %1$s</string>
|
||||
<string name="kstat_full_clone_updated">Повне клонування Kstat оновлено: %1$s</string>
|
||||
<string name="add_kstat_statically_title">Додати статичну конфігурацію Kstat</string>
|
||||
<string name="file_or_directory_path_label">Шлях до файлу/каталогу</string>
|
||||
<string name="hint_use_default_value">Підказка: Ви можете використовувати "default" для використання оригінального значення</string>
|
||||
<string name="add_kstat_path_title">Додати шлях Kstat</string>
|
||||
<string name="add">Додати</string>
|
||||
<string name="reset_kstat_config_title">Скинути конфігурацію Kstat</string>
|
||||
<string name="reset_kstat_config_message">Ви впевнені, що хочете очистити всі конфігурації Kstat? Цю дію неможливо скасувати.</string>
|
||||
<string name="kstat_config_description_title">Опис конфігурації Kstat</string>
|
||||
<string name="kstat_config_description_add_statically">• add_sus_kstat_statically: Статична інформація про файли/каталоги</string>
|
||||
<string name="kstat_config_description_add">• add_sus_kstat: Додати шлях перед прив\'язаним монтуванням, зберігаючи оригінальну інформацію</string>
|
||||
<string name="kstat_config_description_update">• update_sus_kstat: Оновити цільовий ino, залишивши розмір та блоки без змін</string>
|
||||
<string name="kstat_config_description_update_full_clone">• update_sus_kstat_full_clone: Оновити лише ino, залишивши інші оригінальні значення</string>
|
||||
<string name="static_kstat_config">Статична конфігурація Kstat</string>
|
||||
<string name="kstat_path_management">Керування шляхами Kstat</string>
|
||||
<string name="no_kstat_config_message">Конфігурації Kstat ще немає, натисніть кнопку вище, щоб додати</string>
|
||||
<!-- SuSFS Mount Hiding Control Related Strings -->
|
||||
<string name="susfs_hide_mounts_control_title">Керування приховуванням монтувань SUS</string>
|
||||
<string name="susfs_hide_mounts_control_description">Керуйте поведінкою приховування монтувань SUS для процесів</string>
|
||||
<string name="susfs_hide_mounts_for_all_procs_label">Приховувати монтування SUS для всіх процесів</string>
|
||||
<string name="susfs_hide_mounts_for_all_procs_enabled_description">Якщо увімкнено, монтування SUS будуть приховані від усіх процесів, включно з процесами KSU</string>
|
||||
<string name="susfs_hide_mounts_for_all_procs_disabled_description">Якщо вимкнено, монтування SUS будуть приховані лише від процесів, що не належать KSU; процеси KSU зможуть бачити монтування</string>
|
||||
<string name="susfs_hide_mounts_all_enabled">Увімкнено приховування монтувань SUS для всіх процесів</string>
|
||||
<string name="susfs_hide_mounts_all_disabled">Вимкнено приховування монтувань SUS для всіх процесів</string>
|
||||
<string name="susfs_hide_mounts_recommendation">Рекомендується встановлювати у вимкнений стан після розблокування екрана, або на етапі service.sh чи boot-completed.sh, оскільки це повинно виправити проблему з деякими рутованими додатками, які залежать від монтувань, створених процесом KSU</string>
|
||||
<string name="susfs_hide_mounts_current_setting">Поточне налаштування: %s</string>
|
||||
<string name="susfs_hide_mounts_setting_all">Приховувати для всіх процесів</string>
|
||||
<string name="susfs_hide_mounts_setting_non_ksu">Приховувати лише для процесів, що не належать KSU</string>
|
||||
<string name="susfs_run">Запустити</string>
|
||||
<string name="kernel_simple_kernel">Спрощений режим версії ядра</string>
|
||||
<string name="kernel_simple_kernel_summary">Увімкнути або вимкнути спрощене відображення версії ядра SukiSU</string>
|
||||
<string name="susfs_android_data_path_set">Шлях до Android Data встановлено на: %s</string>
|
||||
<string name="susfs_sdcard_path_set">Шлях до SD-карти встановлено на: %s</string>
|
||||
<string name="susfs_path_setup_warning">Налаштування шляху може бути не повністю успішним, але шляхи SUS будуть додаватися</string>
|
||||
<!-- 备份和还原相关字符串 -->
|
||||
<string name="susfs_backup_title">Резервне копіювання</string>
|
||||
<string name="susfs_backup_description">Створити резервну копію всіх конфігурацій SuSFS. Файл резервної копії включатиме всі налаштування, шляхи та конфігурації.</string>
|
||||
<string name="susfs_backup_create">Створити резервну копію</string>
|
||||
<string name="susfs_backup_success">Резервну копію створено успішно: %s</string>
|
||||
<string name="susfs_backup_failed">Не вдалося створити резервну копію: %s</string>
|
||||
<string name="susfs_backup_file_not_found">Файл резервної копії не знайдено</string>
|
||||
<string name="susfs_backup_invalid_format">Недійсний формат файлу резервної копії</string>
|
||||
<string name="susfs_backup_version_mismatch">Невідповідність версії резервної копії, але буде зроблена спроба відновлення</string>
|
||||
<string name="susfs_restore_title">Відновлення</string>
|
||||
<string name="susfs_restore_description">Відновити конфігурації SuSFS з файлу резервної копії. Це перезапише всі поточні налаштування.</string>
|
||||
<string name="susfs_restore_select_file">Вибрати файл резервної копії</string>
|
||||
<string name="susfs_restore_success" formatted="false">Конфігурацію успішно відновлено з резервної копії, створеної %s на пристрої: %s</string>
|
||||
<string name="susfs_restore_failed">Не вдалося відновити: %s</string>
|
||||
<string name="susfs_restore_confirm_title">Підтвердити відновлення</string>
|
||||
<string name="susfs_restore_confirm_description">Це перезапише всі поточні конфігурації SuSFS. Ви впевнені, що хочете продовжити?</string>
|
||||
<string name="susfs_restore_confirm">Відновити</string>
|
||||
<string name="susfs_backup_info_date">Дата резервної копії: %s</string>
|
||||
<string name="susfs_backup_info_device">Пристрій: %s</string>
|
||||
<string name="susfs_backup_info_version">Версія: %s</string>
|
||||
<string name="hide_bl_script">Приховати скрипт BL</string>
|
||||
<string name="hide_bl_script_description">Увімкнути скрипти для приховування статусу розблокування завантажувача</string>
|
||||
<string name="cleanup_residue">Очистити залишки</string>
|
||||
<string name="cleanup_residue_description">Очищення залишкових файлів та каталогів різних модулів та інструментів (може призвести до випадкового видалення, втрати даних та неможливості завантаження, використовуйте з обережністю)</string>
|
||||
</resources>
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
<string name="home_not_installed">Chưa cài đặt</string>
|
||||
<string name="home_click_to_install">Nhấn để cài đặt</string>
|
||||
<string name="home_working">Đang hoạt động</string>
|
||||
<string name="home_working_version">Phiên bản: %d</string>
|
||||
<string name="home_working_version">Phiên bản: %s</string>
|
||||
<string name="home_unsupported">Không được hỗ trợ</string>
|
||||
<string name="home_unsupported_reason">Không phát hiện được trình điều khiển SukiSU Ultra trên Kernel của bạn, Kernel sai?</string>
|
||||
<string name="home_kernel">Phiên bản Kernel</string>
|
||||
@@ -27,7 +27,7 @@
|
||||
<string name="install">Cài đặt</string>
|
||||
<string name="reboot">Khởi động lại</string>
|
||||
<string name="settings">Cài đặt</string>
|
||||
<string name="reboot_userspace">Khởi động lại không gian người dùng</string>
|
||||
<string name="reboot_userspace">Khởi động lại mềm</string>
|
||||
<string name="reboot_recovery">Khởi động lại vào Recovery</string>
|
||||
<string name="reboot_bootloader">Khởi động lại vào Bootloader</string>
|
||||
<string name="reboot_download">Khởi động lại vào Download Mode</string>
|
||||
@@ -60,10 +60,10 @@
|
||||
<string name="profile_selinux_context">Bối cảnh SELinux</string>
|
||||
<string name="profile_umount_modules">Umount modules</string>
|
||||
<string name="failed_to_update_app_profile">Cập nhật Hồ sơ ứng dụng cho %s thất bại</string>
|
||||
<string name="require_kernel_version" formatted="false">Phiên bản SukiSU Ultra hiện tại %d quá thấp để trình quản lý hoạt động bình thường. Vui lòng cập nhật lên phiên bản %d hoặc cao hơn!</string>
|
||||
<string name="require_kernel_version" formatted="false">Phiên bản SukiSU Ultra hiện tại %s quá thấp để trình quản lý hoạt động bình thường. Vui lòng cập nhật lên phiên bản %s hoặc cao hơn!</string>
|
||||
<string name="settings_umount_modules_default">Umount modules</string>
|
||||
<string name="settings_umount_modules_default_summary">Giá trị mặc định chung cho \"Umount modules\" trong Hồ sơ ứng dụng. Nếu được bật, mọi thay đổi hệ thống do các module gây ra sẽ bị gỡ bỏ khỏi hệ thống và các ứng dụng chưa thiết lập hồ sơ</string>
|
||||
<string name="settings_susfs_toggle">Vô hiệu hóa các hook kprobe</string>
|
||||
<string name="settings_susfs_toggle">Vô hiệu hóa kprobes hook</string>
|
||||
<string name="profile_umount_modules_summary">Bật tùy chọn này sẽ cho phép SukiSU Ultra khôi phục mọi file đã được các module sửa đổi trong ứng dụng này</string>
|
||||
<string name="profile_selinux_domain">Tên miền</string>
|
||||
<string name="profile_selinux_rules">Quy tắc</string>
|
||||
@@ -111,6 +111,7 @@
|
||||
<string name="install_inactive_slot_warning">Thiết bị của bạn sẽ **BUỘC** phải khởi động vào phân vùng chưa được sử dụng!\nChỉ sử dụng tùy chọn này sau khi OTA hoàn tất.\nTiếp tục?</string>
|
||||
<string name="install_next">Kế tiếp</string>
|
||||
<string name="select_file_tip">Phân vùng %1$s được khuyến nghị</string>
|
||||
<string name="select_file_tip_vendor">(Thử nghiệm)</string>
|
||||
<string name="select_kmi">Chọn KMI</string>
|
||||
<string name="settings_uninstall">Gỡ cài đặt</string>
|
||||
<string name="settings_uninstall_temporary">Gỡ cài đặt tạm thời</string>
|
||||
@@ -160,7 +161,7 @@
|
||||
<string name="settings_card_alpha">Độ trong suốt của thanh điều hướng</string>
|
||||
<string name="home_android_version">Phiên bản Android</string>
|
||||
<string name="home_device_model">Model thiết bị</string>
|
||||
<string name="su_not_allowed">Quyền SU cho %s chưa được cấp</string>
|
||||
<string name="su_not_allowed">Không được phép cấp quyền SU cho %s</string>
|
||||
<string name="settings_disable_su">Vô hiệu hoá lệnh SU</string>
|
||||
<string name="settings_disable_su_summary">Vô hiệu hoá khả năng thực thi lệnh SU để lấy quyền root (Những app đã cấp trước đó không bị ảnh hưởng)</string>
|
||||
<string name="module_install_multiple_confirm_with_names">Bạn có chắc muốn cài đặt các module %1$d không? \n\n%2$s</string>
|
||||
@@ -235,7 +236,7 @@
|
||||
<string name="invalid_file_type">Loại file không đúng! Vui lòng chọn file .kpm</string>
|
||||
<string name="confirm_uninstall_title_with_filename">Gỡ cài đặt</string>
|
||||
<string name="confirm_uninstall_content">KPM sau đây sẽ được gỡ cài đặt: %s</string>
|
||||
<string name="settings_susfs_toggle_summary">Vô hiệu hóa các hook kprobe được tạo bởi SukiSU Ultra, thay vào đó sử dụng các hook nội tuyến, tương tự như phương pháp hook kernel không phải GKI</string>
|
||||
<string name="settings_susfs_toggle_summary">Vô hiệu hóa kprobes hook được tạo bởi SukiSU Ultra, thay vào đó sử dụng non-kprobes hook được nhúng, tương tự như phương pháp hook của Kernel non-GKI</string>
|
||||
<string name="image_editor_hint">Sử dụng hai ngón tay để phóng to hình ảnh và một ngón tay kéo nó để điều chỉnh vị trí</string>
|
||||
<string name="reprovision">Chọn lại</string>
|
||||
<!-- Kernel Flash Progress Related -->
|
||||
@@ -366,7 +367,6 @@
|
||||
<string name="susfs_apply">Áp dụng</string>
|
||||
<!-- SuSFS Reset Confirmation -->
|
||||
<string name="susfs_reset_confirm_title">Xác nhận khôi phục</string>
|
||||
<string name="susfs_reset_confirm">Xác nhận khôi phục</string>
|
||||
<!-- SuSFS Toast Messages -->
|
||||
<string name="susfs_binary_not_found">Không tìm thấy file ksu_susfs</string>
|
||||
<string name="susfs_command_failed">Thực hiện lệnh SuSFS thất bại</string>
|
||||
@@ -385,12 +385,10 @@
|
||||
<!-- SuSFS Tab Titles -->
|
||||
<string name="susfs_tab_basic_settings">Cài đặt cơ bản</string>
|
||||
<string name="susfs_tab_sus_paths">Đường dẫn SuS</string>
|
||||
<string name="susfs_tab_sus_mounts">SuS Mounts</string>
|
||||
<string name="susfs_tab_sus_mounts">SuS Mount</string>
|
||||
<string name="susfs_tab_try_umount">SuS Umount</string>
|
||||
<string name="susfs_tab_path_settings">Cài đặt Đường dẫn</string>
|
||||
<string name="susfs_tab_enabled_features">Trạng thái tính năng</string>
|
||||
<!-- SuSFS Dialog Actions -->
|
||||
<string name="susfs_add">Thêm</string>
|
||||
<!-- SuSFS Path Management -->
|
||||
<string name="susfs_add_sus_path">Thêm Đường dẫn SuS</string>
|
||||
<string name="susfs_add_sus_mount">Thêm SuS Mount</string>
|
||||
@@ -401,7 +399,7 @@
|
||||
<string name="susfs_mount_path_label">Đường dẫn Mount</string>
|
||||
<string name="susfs_path_placeholder">Ví dụ: /system/addon.d</string>
|
||||
<string name="susfs_no_paths_configured">Không có Đường dẫn SuS nào được cấu hình</string>
|
||||
<string name="susfs_no_mounts_configured">Không có SuS Mounts nào được cấu hình</string>
|
||||
<string name="susfs_no_mounts_configured">Không có SuS Mount nào được cấu hình</string>
|
||||
<string name="susfs_no_umounts_configured">Không có SuS Umount nào được cấu hình</string>
|
||||
<!-- SuSFS Umount Mode -->
|
||||
<string name="susfs_umount_mode_label">Chế độ Umount</string>
|
||||
@@ -418,16 +416,16 @@
|
||||
<!-- SuSFS Reset Categories -->
|
||||
<string name="susfs_reset_paths_title">Khôi phục Đường dẫn SuS</string>
|
||||
<string name="susfs_reset_paths_message">Thao tác này sẽ xóa tất cả các cấu hình Đường dẫn SuS. Bạn có chắc chắn muốn tiếp tục không?</string>
|
||||
<string name="susfs_reset_mounts_title">Khôi phục SuS Mounts</string>
|
||||
<string name="susfs_reset_mounts_title">Khôi phục SuS Mount</string>
|
||||
<string name="susfs_reset_mounts_message">Thao tác này sẽ xóa tất cả các cấu hình SuS Mount. Bạn có chắc chắn muốn tiếp tục không?</string>
|
||||
<string name="susfs_reset_umounts_title">Khôi phục SuS Umount</string>
|
||||
<string name="susfs_reset_umounts_message">Thao tác này sẽ xóa tất cả các cấu hình SuS Umount. Bạn có chắc chắn muốn tiếp tục không?</string>
|
||||
<string name="susfs_reset_path_title">Reset Cài đặt Đường dẫn</string>
|
||||
<!-- SuSFS Path Settings -->
|
||||
<string name="susfs_android_data_path_label">Đường dẫn Dữ liệu Android</string>
|
||||
<string name="susfs_sdcard_path_label">Đường dẫn Thẻ SD</string>
|
||||
<string name="susfs_set_android_data_path">Đặt Đường dẫn Dữ liệu Android</string>
|
||||
<string name="susfs_set_sdcard_path">Đặt Đường dẫn Thẻ SD</string>
|
||||
<string name="susfs_android_data_path_label">Đường dẫn Android Data</string>
|
||||
<string name="susfs_sdcard_path_label">Đường dẫn SD Card</string>
|
||||
<string name="susfs_set_android_data_path">Đặt Đường dẫn Android Data</string>
|
||||
<string name="susfs_set_sdcard_path">Đặt Đường dẫn SD Card</string>
|
||||
<!-- SuSFS Enabled Features -->
|
||||
<string name="susfs_enabled_features_description">Hiển thị trạng thái tính năng hiện tại của SuSFS</string>
|
||||
<string name="susfs_no_features_found">Không tìm thấy thông tin trạng thái tính năng</string>
|
||||
@@ -449,7 +447,7 @@
|
||||
<string name="sus_kstat_feature_label">Hỗ trợ SuS Kstat</string>
|
||||
<string name="sus_su_feature_label">Chức năng chuyển đổi chế độ SuS SU</string>
|
||||
<!-- 可切换状态 -->
|
||||
<string name="susfs_feature_configurable">Các tính năng SuSFS có thể cấu hình</string>
|
||||
<string name="susfs_feature_configurable">Nhấn để bật/tắt ghi logs</string>
|
||||
<string name="susfs_enable_log_label">Kích hoạt logs SuSFS</string>
|
||||
<string name="susfs_log_config_description">Bật hoặc tắt ghi logs cho SuSFS</string>
|
||||
<string name="susfs_log_config_title">Cấu hình ghi logs SuSFS</string>
|
||||
@@ -480,21 +478,19 @@
|
||||
<string name="susfs_autostart_disabled_success">Module tự động khởi động SuSFS đã bị vô hiệu hóa</string>
|
||||
<!-- SuSFS Kstat相关字符串 -->
|
||||
<string name="susfs_tab_kstat_config">Cấu hình Kstat</string>
|
||||
<string name="kstat_static_config_added">Đã thêm cấu hình tĩnh Kstat: %1$s</string>
|
||||
<string name="kstat_static_config_added">Đã thêm cấu hình Kstat tĩnh: %1$s</string>
|
||||
<string name="kstat_config_removed">Đã xoá cấu hình Kstat: %1$s</string>
|
||||
<string name="kstat_path_added">Đã thêm đường dẫn Kstat: %1$s</string>
|
||||
<string name="kstat_path_removed">Đã xoá đường dẫn Kstat: %1$s</string>
|
||||
<string name="kstat_path_added">Đã thêm Đường dẫn Kstat: %1$s</string>
|
||||
<string name="kstat_path_removed">Đã xoá Đường dẫn Kstat: %1$s</string>
|
||||
<string name="kstat_updated">Đã cập nhật Kstat: %1$s</string>
|
||||
<string name="kstat_full_clone_updated">Bản sao Kstat đầy đủ đã cập nhật: %1$s</string>
|
||||
<string name="add_kstat_statically_title">Thêm cấu hình tĩnh Kstat</string>
|
||||
<string name="add_kstat_statically_title">Thêm cấu hình Kstat tĩnh</string>
|
||||
<string name="file_or_directory_path_label">Đường dẫn File/Folder</string>
|
||||
<string name="hint_use_default_value">Gợi ý: Bạn có thể sử dụng \"default\" để thiết lập giá trị ban đầu</string>
|
||||
<string name="add_kstat_path_title">Thêm Đường dẫn Kstat</string>
|
||||
<string name="kstat_command_description">Lệnh này được sử dụng để thêm trước khi đường dẫn được mount hoặc ghi đè nhằm lưu trữ thông tin trạng thái ban đầu trong bộ nhớ hạt nhân</string>
|
||||
<string name="add">Thêm</string>
|
||||
<string name="reset_kstat_config_title">Khôi phục Cấu hình Kstat</string>
|
||||
<string name="reset_kstat_config_message">Bạn có chắc chắn muốn xóa tất cả cấu hình Kstat không? Không thể hoàn tác hành động này</string>
|
||||
<string name="confirm_reset">Xác nhận khôi phục</string>
|
||||
<string name="kstat_config_description_title">Mô tả cấu hình Kstat</string>
|
||||
<string name="kstat_config_description_add_statically">• add_sus_kstat_statically: Thông tin thống kê cấu hình tĩnh của các File/Folder</string>
|
||||
<string name="kstat_config_description_add">• add_sus_kstat: Thêm đường dẫn trước khi mount để lưu trữ thông tin trạng thái ban đầu</string>
|
||||
@@ -502,5 +498,59 @@
|
||||
<string name="kstat_config_description_update_full_clone">• update_sus_kstat_full_clone: Chỉ cập nhật ino, giữ nguyên các giá trị gốc khác</string>
|
||||
<string name="static_kstat_config">Cấu hình Kstat tĩnh</string>
|
||||
<string name="kstat_path_management">Quản lý Đường dẫn Kstat</string>
|
||||
<string name="no_kstat_config_message">Chưa có cấu hình Kstat, hãy nhấp vào nút bên trên để thêm</string>
|
||||
<string name="no_kstat_config_message">Chưa có cấu hình Kstat, hãy nhấp vào nút bên dưới để thêm</string>
|
||||
<!-- SuSFS Mount Hiding Control Related Strings -->
|
||||
<string name="susfs_hide_mounts_control_title">Điều khiển ẩn SuS Mount</string>
|
||||
<string name="susfs_hide_mounts_control_description">Kiểm soát hành vi ẩn của SuS Mount với các tiến trình</string>
|
||||
<string name="susfs_hide_mounts_for_all_procs_label">Ẩn SuS Mount khỏi tất cả các tiến trình</string>
|
||||
<string name="susfs_hide_mounts_for_all_procs_enabled_description">Khi kích hoạt, SuS Mount sẽ bị ẩn khỏi tất cả các tiến trình, bao gồm cả các tiến trình KSU</string>
|
||||
<string name="susfs_hide_mounts_for_all_procs_disabled_description">Khi bị vô hiệu hóa, SuS Mount sẽ chỉ bị ẩn khỏi các tiến trình không phải KSU, không bị ẩn ở tiến trình KSU</string>
|
||||
<string name="susfs_hide_mounts_all_enabled">Đã kích hoạt ẩn SuS Mount khỏi tất cả các tiến trình</string>
|
||||
<string name="susfs_hide_mounts_all_disabled">Đã vô hiệu hóa việc ẩn SuS Mount cho tất cả các tiến trình</string>
|
||||
<string name="susfs_hide_mounts_recommendation">Nên vô hiệu hóa sau khi màn hình được mở khóa hoặc trong giai đoạn service.sh hoặc boot-completed.sh, vì điều này sẽ khắc phục sự cố trên một số ứng dụng đã root dựa vào mount bởi tiến trình KSU</string>
|
||||
<string name="susfs_hide_mounts_current_setting">Cài đặt hiện tại: %s</string>
|
||||
<string name="susfs_hide_mounts_setting_all">Ẩn khỏi tất cả các tiến trình</string>
|
||||
<string name="susfs_hide_mounts_setting_non_ksu">Chỉ ẩn đối với các tiến trình không phải KSU</string>
|
||||
<string name="susfs_run">Chạy</string>
|
||||
<string name="kernel_simple_kernel">Hiển thị tóm tắt \"Phiên bản Kernel\"</string>
|
||||
<string name="kernel_simple_kernel_summary">Tóm tắt hiển thị phiên bản Kernel cho ngắn gọn</string>
|
||||
<string name="susfs_android_data_path_set">Đường dẫn Android Data đã được đặt thành: %s</string>
|
||||
<string name="susfs_sdcard_path_set">Đường dẫn SD Card đã được đặt thành: %s</string>
|
||||
<string name="susfs_path_setup_warning">Thiết lập đường dẫn có thể không thành công hoàn toàn, nhưng đường dẫn SuS sẽ tiếp tục được thêm vào</string>
|
||||
<!-- 备份和还原相关字符串 -->
|
||||
<string name="susfs_backup_title">Sao lưu</string>
|
||||
<string name="susfs_backup_description">Tạo bản sao lưu cho tất cả các cấu hình SuSFS. File sao lưu sẽ bao gồm tất cả các thiết lập, đường dẫn và thông tin cấu hình</string>
|
||||
<string name="susfs_backup_create">Tạo bản sao lưu</string>
|
||||
<string name="susfs_backup_success">Đã tạo bản sao lưu thành công: %s</string>
|
||||
<string name="susfs_backup_failed">Tạo bản sao lưu thất bại: %s</string>
|
||||
<string name="susfs_backup_file_not_found">Không tìm thấy file sao lưu</string>
|
||||
<string name="susfs_backup_invalid_format">Định dạng file sao lưu không hợp lệ</string>
|
||||
<string name="susfs_backup_version_mismatch">Phiên bản sao lưu không khớp, nhưng sẽ cố gắng khôi phục</string>
|
||||
<string name="susfs_restore_title">Khôi phục</string>
|
||||
<string name="susfs_restore_description">Khôi phục cấu hình SuSFS từ file sao lưu. Thao tác này sẽ ghi đè lên tất cả các cài đặt hiện tại</string>
|
||||
<string name="susfs_restore_select_file">Chọn file sao lưu</string>
|
||||
<string name="susfs_restore_success" formatted="false">Cấu hình đã được khôi phục thành công từ bản sao lưu được tạo trên %s, từ thiết bị: %s</string>
|
||||
<string name="susfs_restore_failed">Khôi phục thất bại: %s</string>
|
||||
<string name="susfs_restore_confirm_title">Xác nhận khôi phục</string>
|
||||
<string name="susfs_restore_confirm_description">Thao tác này sẽ ghi đè lên tất cả các cấu hình SuSFS hiện tại. Bạn có chắc chắn muốn tiếp tục không?</string>
|
||||
<string name="susfs_restore_confirm">Khôi phục</string>
|
||||
<string name="susfs_backup_info_date">Ngày sao lưu: %s</string>
|
||||
<string name="susfs_backup_info_device">Thiết bị: %s</string>
|
||||
<string name="susfs_backup_info_version">Phiên bản: %s</string>
|
||||
<string name="hide_bl_script">Ẩn Script BL</string>
|
||||
<string name="hide_bl_script_description">Ẩn scripts trạng thái Unlock Bootloader</string>
|
||||
<string name="cleanup_residue">Dọn rác</string>
|
||||
<string name="cleanup_residue_description">Dọn dẹp các file và folder còn sót lại của các module và công cụ (Có thể bị xóa nhầm, dẫn đến mất dữ liệu và không khởi động được)</string>
|
||||
<string name="susfs_edit_sus_path">Chỉnh sửa Đường dẫn SuS</string>
|
||||
<string name="susfs_edit_sus_mount">Chỉnh sửa SuS Mount</string>
|
||||
<string name="susfs_edit_try_umount">Chỉnh sửa SuS Umount</string>
|
||||
<string name="edit_kstat_statically_title">Chỉnh sửa cấu hình Kstat tĩnh</string>
|
||||
<string name="edit_kstat_path_title">Chỉnh sửa Đường dẫn Kstat</string>
|
||||
<string name="susfs_save">Lưu</string>
|
||||
<string name="edit">Chỉnh sửa</string>
|
||||
<string name="delete">Xoá</string>
|
||||
<string name="update">Cập nhật</string>
|
||||
<string name="kstat_config_updated">Cập nhật cấu hình Kstat</string>
|
||||
<string name="kstat_path_updated">Cập nhật Đường dẫn Kstat</string>
|
||||
<string name="susfs_update_full_clone">Cập nhật bản sao SuSFS đầy đủ</string>
|
||||
</resources>
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
<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_working_version">版本:%s</string>
|
||||
<string name="home_unsupported">不支持</string>
|
||||
<string name="home_unsupported_reason">内核上未检测到 KernelSU 驱动程序,内核错误?</string>
|
||||
<string name="home_kernel">内核版本</string>
|
||||
@@ -60,7 +60,7 @@
|
||||
<string name="profile_selinux_context">SELinux</string>
|
||||
<string name="profile_umount_modules">卸载模块</string>
|
||||
<string name="failed_to_update_app_profile">为 %s 更新 App Profile 失败</string>
|
||||
<string name="require_kernel_version" formatted="false">当前 KernelSU 版本 %d 过低,管理器无法正常工作,请将内核 KernelSU 版本升级至 %d 或以上!</string>
|
||||
<string name="require_kernel_version" formatted="false">当前 KernelSU 版本 %s 过低,管理器无法正常工作,请将内核 KernelSU 版本升级至 %s 或以上!</string>
|
||||
<string name="settings_umount_modules_default">默认卸载模块</string>
|
||||
<string name="settings_umount_modules_default_summary">App Profile 中\"卸载模块\"的全局默认值,如果启用,将会为没有设置 Profile 的应用移除所有模块针对系统的修改。</string>
|
||||
<string name="settings_susfs_toggle">禁用 kprobe 钩子</string>
|
||||
@@ -111,6 +111,7 @@
|
||||
<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_file_tip_vendor">(实验性的)</string>
|
||||
<string name="select_kmi">选择 KMI</string>
|
||||
<string name="settings_uninstall">卸载</string>
|
||||
<string name="settings_uninstall_temporary">临时卸载</string>
|
||||
@@ -366,7 +367,6 @@
|
||||
<string name="susfs_apply">应用</string>
|
||||
<!-- SuSFS Reset Confirmation -->
|
||||
<string name="susfs_reset_confirm_title">确认重置</string>
|
||||
<string name="susfs_reset_confirm">确认重置</string>
|
||||
<!-- SuSFS Toast Messages -->
|
||||
<string name="susfs_binary_not_found">无法找到 ksu_susfs 文件</string>
|
||||
<string name="susfs_command_failed">SuSFS 命令执行失败</string>
|
||||
@@ -389,8 +389,6 @@
|
||||
<string name="susfs_tab_try_umount">尝试卸载</string>
|
||||
<string name="susfs_tab_path_settings">路径设置</string>
|
||||
<string name="susfs_tab_enabled_features">启用功能状态</string>
|
||||
<!-- SuSFS Dialog Actions -->
|
||||
<string name="susfs_add">添加</string>
|
||||
<!-- SuSFS Path Management -->
|
||||
<string name="susfs_add_sus_path">添加SUS路径</string>
|
||||
<string name="susfs_add_sus_mount">添加SUS挂载</string>
|
||||
@@ -490,11 +488,9 @@
|
||||
<string name="file_or_directory_path_label">文件/目录路径</string>
|
||||
<string name="hint_use_default_value">提示:可以使用 “default” 来使用原始值</string>
|
||||
<string name="add_kstat_path_title">添加 Kstat 路径</string>
|
||||
<string name="kstat_command_description">此命令用于在路径被绑定挂载或覆盖之前添加,用于在内核内存中存储原始 stat 信息</string>
|
||||
<string name="add">添加</string>
|
||||
<string name="reset_kstat_config_title">重置 Kstat 配置</string>
|
||||
<string name="reset_kstat_config_message">确定要清除所有 Kstat 配置吗?此操作不可撤销</string>
|
||||
<string name="confirm_reset">确认重置</string>
|
||||
<string name="kstat_config_description_title">Kstat 配置说明</string>
|
||||
<string name="kstat_config_description_add_statically">• add_sus_kstat_statically: 静态配置文件/目录的 stat 信息</string>
|
||||
<string name="kstat_config_description_add">• add_sus_kstat: 在绑定挂载前添加路径,存储原始 stat 信息</string>
|
||||
@@ -503,7 +499,7 @@
|
||||
<string name="static_kstat_config">静态 Kstat 配置</string>
|
||||
<string name="kstat_path_management">Kstat 路径管理</string>
|
||||
<string name="no_kstat_config_message">暂无 Kstat 配置,点击下方按钮添加配置</string>
|
||||
<!-- SuSFS 挂载隐藏控制相关字符串 -->
|
||||
<!-- SuSFS Mount Hiding Control Related Strings -->
|
||||
<string name="susfs_hide_mounts_control_title">SUS挂载隐藏控制</string>
|
||||
<string name="susfs_hide_mounts_control_description">控制SUS挂载对进程的隐藏行为</string>
|
||||
<string name="susfs_hide_mounts_for_all_procs_label">对所有进程隐藏SUS挂载</string>
|
||||
@@ -516,4 +512,49 @@
|
||||
<string name="susfs_hide_mounts_setting_all">对所有进程隐藏</string>
|
||||
<string name="susfs_hide_mounts_setting_non_ksu">仅对非KSU进程隐藏</string>
|
||||
<string name="susfs_run">运行</string>
|
||||
<string name="kernel_simple_kernel">内核版本简洁模式</string>
|
||||
<string name="kernel_simple_kernel_summary">启用或禁用SukiSU内核版本显示的简洁模式</string>
|
||||
<string name="susfs_android_data_path_set">Android Data路径已设置为: %s</string>
|
||||
<string name="susfs_sdcard_path_set">SD卡路径已设置为: %s</string>
|
||||
<string name="susfs_path_setup_warning">路径设置可能未完全成功,但将继续添加SUS路径</string>
|
||||
<!-- 备份和还原相关字符串 -->
|
||||
<string name="susfs_backup_title">备份</string>
|
||||
<string name="susfs_backup_description">创建所有SuSFS配置的备份。备份文件将包含所有设置、路径和配置信息。</string>
|
||||
<string name="susfs_backup_create">创建备份</string>
|
||||
<string name="susfs_backup_success">备份创建成功:%s</string>
|
||||
<string name="susfs_backup_failed">备份创建失败:%s</string>
|
||||
<string name="susfs_backup_file_not_found">备份文件未找到</string>
|
||||
<string name="susfs_backup_invalid_format">无效的备份文件格式</string>
|
||||
<string name="susfs_backup_version_mismatch">备份版本不匹配,但将尝试还原</string>
|
||||
<string name="susfs_restore_title">还原</string>
|
||||
<string name="susfs_restore_description">从备份文件还原SuSFS配置。这将覆盖所有当前设置。</string>
|
||||
<string name="susfs_restore_select_file">选择备份文件</string>
|
||||
<string name="susfs_restore_success" formatted="false">配置还原成功,备份创建于 %s,来自设备:%s</string>
|
||||
<string name="susfs_restore_failed">还原失败:%s</string>
|
||||
<string name="susfs_restore_confirm_title">确认还原</string>
|
||||
<string name="susfs_restore_confirm_description">这将覆盖所有当前的SuSFS配置。您确定要继续吗?</string>
|
||||
<string name="susfs_restore_confirm">还原</string>
|
||||
<string name="susfs_backup_info_date">备份日期:%s</string>
|
||||
<string name="susfs_backup_info_device">设备:%s</string>
|
||||
<string name="susfs_backup_info_version">版本:%s</string>
|
||||
<string name="hide_bl_script">隐藏BL脚本</string>
|
||||
<string name="hide_bl_script_description">启用隐藏Bootloader解锁状态脚本</string>
|
||||
<string name="cleanup_residue">清理工具残留</string>
|
||||
<string name="cleanup_residue_description">清理各种模块以及工具的残留文件和目录(可能会误删导致丢失以及无法启动,谨慎使用)</string>
|
||||
<string name="susfs_edit_sus_path">编辑 SUS 路径</string>
|
||||
<string name="susfs_edit_sus_mount">编辑 SUS 挂载</string>
|
||||
<string name="susfs_edit_try_umount">编辑尝试卸载</string>
|
||||
<string name="edit_kstat_statically_title">编辑 Kstat 静态配置</string>
|
||||
<string name="edit_kstat_path_title">编辑 Kstat 路径</string>
|
||||
<string name="susfs_save">保存</string>
|
||||
<string name="edit">编辑</string>
|
||||
<string name="delete">删除</string>
|
||||
<string name="update">更新</string>
|
||||
<string name="kstat_config_updated">Kstat 配置更新</string>
|
||||
<string name="kstat_path_updated">Kstat 路径更新</string>
|
||||
<string name="susfs_update_full_clone">Susfs 完整克隆更新</string>
|
||||
<string name="umount_zygote_iso_service">卸载Zygote隔离服务</string>
|
||||
<string name="umount_zygote_iso_service_description">启用此选项将在系统启动时卸载Zygote隔离服务挂载点</string>
|
||||
<string name="umount_zygote_iso_service_enabled">Zygote隔离服务卸载已启用</string>
|
||||
<string name="umount_zygote_iso_service_disabled">Zygote隔离服务卸载已禁用</string>
|
||||
</resources>
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
<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_working_version">版本:%s</string>
|
||||
<string name="home_unsupported">唔支援</string>
|
||||
<string name="home_unsupported_reason">核心上未檢測到 KernelSU 驅動程式,核心錯誤?</string>
|
||||
<string name="home_kernel">核心版本</string>
|
||||
@@ -60,7 +60,7 @@
|
||||
<string name="profile_selinux_context">SELinux</string>
|
||||
<string name="profile_umount_modules">卸載模組</string>
|
||||
<string name="failed_to_update_app_profile">為 %s 更新 App Profile 失敗</string>
|
||||
<string name="require_kernel_version" formatted="false">當前 KernelSU 版本 %d 過低,管理器無法正常工作,請將核心 KernelSU 版本升級至 %d 或以上!</string>
|
||||
<string name="require_kernel_version" formatted="false">當前 KernelSU 版本 %s 過低,管理器無法正常工作,請將核心 KernelSU 版本升級至 %s 或以上!</string>
|
||||
<string name="settings_umount_modules_default">默認卸載模組</string>
|
||||
<string name="settings_umount_modules_default_summary">App Profile 中\"卸載模組\"嘅全局默認值,如果啟用,將會為冇設置 Profile 嘅應用移除所有模組針對系統嘅修改。</string>
|
||||
<string name="settings_susfs_toggle">禁用 Kprobe Hook</string>
|
||||
@@ -366,7 +366,6 @@
|
||||
<string name="susfs_apply">應用</string>
|
||||
<!-- SuSFS Reset Confirmation -->
|
||||
<string name="susfs_reset_confirm_title">確認重置</string>
|
||||
<string name="susfs_reset_confirm">確認重置</string>
|
||||
<!-- SuSFS Toast Messages -->
|
||||
<string name="susfs_binary_not_found">無法找到 ksu_susfs 文件</string>
|
||||
<string name="susfs_command_failed">SuSFS 命令執行失敗</string>
|
||||
@@ -389,8 +388,6 @@
|
||||
<string name="susfs_tab_try_umount">嘗試卸載</string>
|
||||
<string name="susfs_tab_path_settings">路徑設定</string>
|
||||
<string name="susfs_tab_enabled_features">啟用功能狀態</string>
|
||||
<!-- SuSFS Dialog Actions -->
|
||||
<string name="susfs_add">添加</string>
|
||||
<!-- SuSFS Path Management -->
|
||||
<string name="susfs_add_sus_path">添加SUS路徑</string>
|
||||
<string name="susfs_add_sus_mount">添加SUS掛載</string>
|
||||
@@ -490,11 +487,9 @@
|
||||
<string name="file_or_directory_path_label">文件/目錄路徑</string>
|
||||
<string name="hint_use_default_value">提示:可以使用 “default” 來使用原始值</string>
|
||||
<string name="add_kstat_path_title">添加 Kstat 路徑</string>
|
||||
<string name="kstat_command_description">此命令用於在路徑被綁定掛載或覆蓋之前添加,用於在核心內存中存儲原始 stat 信息</string>
|
||||
<string name="add">添加</string>
|
||||
<string name="reset_kstat_config_title">重置 Kstat 配置</string>
|
||||
<string name="reset_kstat_config_message">確定要清除所有 Kstat 配置嗎?此操作不可撤銷</string>
|
||||
<string name="confirm_reset">確認重置</string>
|
||||
<string name="kstat_config_description_title">Kstat 配置說明</string>
|
||||
<string name="kstat_config_description_add_statically">• add_sus_kstat_statically: 靜態配置文件/目錄嘅 stat 信息</string>
|
||||
<string name="kstat_config_description_add">• add_sus_kstat: 在綁定掛載前添加路徑,存儲原始 stat 信息</string>
|
||||
@@ -503,4 +498,6 @@
|
||||
<string name="static_kstat_config">靜態 Kstat 配置</string>
|
||||
<string name="kstat_path_management">Kstat 路徑管理</string>
|
||||
<string name="no_kstat_config_message">暫冇 Kstat 配置,點擊上方按鈕添加配置</string>
|
||||
<!-- SuSFS Mount Hiding Control Related Strings -->
|
||||
<!-- 备份和还原相关字符串 -->
|
||||
</resources>
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
<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_working_version">版本:%s</string>
|
||||
<string name="home_unsupported">不支援</string>
|
||||
<string name="home_unsupported_reason">未在內核上偵測到 KernelSU 驅動程式,內核錯誤?</string>
|
||||
<string name="home_kernel">內核版本</string>
|
||||
@@ -60,7 +60,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" formatted="false">目前 KernelSU 版本 %d 過低,管理器無法正常運作,請將內核 KernelSU 版本升級至 %d 或以上!</string>
|
||||
<string name="require_kernel_version" formatted="false">目前 KernelSU 版本 %s 過低,管理器無法正常運作,請將內核 KernelSU 版本升級至 %s 或以上!</string>
|
||||
<string name="settings_umount_modules_default">預設卸載模組</string>
|
||||
<string name="settings_umount_modules_default_summary">應用程式設定檔中\"卸載模組\"\的全域預設值,若啟用,將為未設定設定檔的應用程式移除所有模組對系統的修改。</string>
|
||||
<string name="settings_susfs_toggle">禁用 kprobe 切換</string>
|
||||
@@ -111,13 +111,14 @@
|
||||
<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_file_tip_vendor">(實驗性的)</string>
|
||||
<string name="select_kmi">選擇 KMI</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,下次重新啟動後恢復至原始狀態。</string>
|
||||
<string name="settings_uninstall_permanent_message">完全且永久解除安裝 KernelSU(包括 Root 權限和所有模組)。</string>
|
||||
<string name="settings_uninstall_permanent_message">完全且永久解除安裝 KernelSU(含 Root 權限和所有模組)。</string>
|
||||
<string name="settings_restore_stock_image_message">還原原廠映像檔(若存在備份),通常在 OTA 前使用;若需解除安裝 KernelSU,請使用\"永久解除安裝\"。</string>
|
||||
<string name="flashing">正在刷寫</string>
|
||||
<string name="flash_success">刷寫完成</string>
|
||||
@@ -127,7 +128,7 @@
|
||||
<string name="log_saved">日誌已儲存</string>
|
||||
<string name="sus_su_mode">SuS SU 模式:</string>
|
||||
<!-- Module related -->
|
||||
<string name="module_install_confirm">確定要安裝模組 %1$s 嗎?</string>
|
||||
<string name="module_install_confirm">確定安裝模組 %1$s?</string>
|
||||
<string name="unknown_module">未知模組</string>
|
||||
<!-- Restore related -->
|
||||
<string name="restore_confirm_title">確定還原模組</string>
|
||||
@@ -366,7 +367,6 @@
|
||||
<string name="susfs_apply">應用</string>
|
||||
<!-- SuSFS Reset Confirmation -->
|
||||
<string name="susfs_reset_confirm_title">確認重設</string>
|
||||
<string name="susfs_reset_confirm">確認重設</string>
|
||||
<!-- SuSFS Toast Messages -->
|
||||
<string name="susfs_binary_not_found">無法找到 ksu_susfs 檔案</string>
|
||||
<string name="susfs_command_failed">SuSFS 指令執行失敗</string>
|
||||
@@ -389,8 +389,6 @@
|
||||
<string name="susfs_tab_try_umount">嘗試卸載</string>
|
||||
<string name="susfs_tab_path_settings">路徑設定</string>
|
||||
<string name="susfs_tab_enabled_features">啟用功能狀態</string>
|
||||
<!-- SuSFS Dialog Actions -->
|
||||
<string name="susfs_add">新增</string>
|
||||
<!-- SuSFS Path Management -->
|
||||
<string name="susfs_add_sus_path">新增 SUS 路徑</string>
|
||||
<string name="susfs_add_sus_mount">新增 SUS 掛載</string>
|
||||
@@ -490,11 +488,9 @@
|
||||
<string name="file_or_directory_path_label">檔案/目錄路徑</string>
|
||||
<string name="hint_use_default_value">提示:可使用「default」來使用原始值</string>
|
||||
<string name="add_kstat_path_title">新增 Kstat 路徑</string>
|
||||
<string name="kstat_command_description">此命令用於在路徑被綁定掛載或覆蓋之前新增,用於在核心記憶體中儲存原始 stat 資訊</string>
|
||||
<string name="add">新增</string>
|
||||
<string name="reset_kstat_config_title">重置 Kstat 設定</string>
|
||||
<string name="reset_kstat_config_message">確定要清除所有 Kstat 設定嗎?此操作不可撤銷</string>
|
||||
<string name="confirm_reset">確認重置</string>
|
||||
<string name="kstat_config_description_title">Kstat 設定說明</string>
|
||||
<string name="kstat_config_description_add_statically">• add_sus_kstat_statically:靜態設定檔案/目錄的 stat 資訊</string>
|
||||
<string name="kstat_config_description_add">• add_sus_kstat:在綁定掛載前新增路徑,儲存原始 stat 資訊</string>
|
||||
@@ -503,4 +499,62 @@
|
||||
<string name="static_kstat_config">靜態 Kstat 設定</string>
|
||||
<string name="kstat_path_management">Kstat 路徑管理</string>
|
||||
<string name="no_kstat_config_message">暫無 Kstat 設定,請點擊上方按鈕新增設定</string>
|
||||
<!-- SuSFS Mount Hiding Control Related Strings -->
|
||||
<string name="susfs_hide_mounts_control_title">SUS掛載隱藏控制</string>
|
||||
<string name="susfs_hide_mounts_control_description">控制SUS掛載對程序的隱藏行為</string>
|
||||
<string name="susfs_hide_mounts_for_all_procs_label">對所有程序隱藏SUS掛載</string>
|
||||
<string name="susfs_hide_mounts_for_all_procs_enabled_description">啟用後,SUS掛載將對所有程序隱藏,包括KSU程序</string>
|
||||
<string name="susfs_hide_mounts_for_all_procs_disabled_description">禁用後,SUS掛載僅對非KSU程序隱藏,KSU程序可以看到掛載</string>
|
||||
<string name="susfs_hide_mounts_all_enabled">已啟用對所有程序隱藏SUS掛載</string>
|
||||
<string name="susfs_hide_mounts_all_disabled">已禁用對所有程序隱藏SUS掛載</string>
|
||||
<string name="susfs_hide_mounts_recommendation">建議在螢幕解鎖後或在service.sh或boot-completed.sh階段設定為禁用,這可以修復一些依賴KSU程序掛載的root應用的問題</string>
|
||||
<string name="susfs_hide_mounts_current_setting">當前設定: %s</string>
|
||||
<string name="susfs_hide_mounts_setting_all">對所有程序隱藏</string>
|
||||
<string name="susfs_hide_mounts_setting_non_ksu">僅對非KSU程序隱藏</string>
|
||||
<string name="susfs_run">執行</string>
|
||||
<string name="kernel_simple_kernel">核心版本簡潔模式</string>
|
||||
<string name="kernel_simple_kernel_summary">啟用或禁用SukiSU核心版本顯示的簡潔模式</string>
|
||||
<string name="susfs_android_data_path_set">Android Data 路徑已設定為:%s</string>
|
||||
<string name="susfs_sdcard_path_set">SD 卡路徑已設定為:%s</string>
|
||||
<string name="susfs_path_setup_warning">路徑設定可能沒有完全成功,但仍會繼續新增 SUS 路徑</string>
|
||||
<!-- 備份和還原相關字串 -->
|
||||
<string name="susfs_backup_title">備份</string>
|
||||
<string name="susfs_backup_description">建立所有 SuSFS 設定的備份。備份檔案會包含所有設定、路徑與配置信息</string>
|
||||
<string name="susfs_backup_create">建立備份</string>
|
||||
<string name="susfs_backup_success">備份成功建立:%s</string>
|
||||
<string name="susfs_backup_failed">備份建立失敗:%s</string>
|
||||
<string name="susfs_backup_file_not_found">找不到備份檔案</string>
|
||||
<string name="susfs_backup_invalid_format">備份檔案格式無效</string>
|
||||
<string name="susfs_backup_version_mismatch">備份版本不相容,將嘗試進行還原</string>
|
||||
<string name="susfs_restore_title">還原</string>
|
||||
<string name="susfs_restore_description">從備份檔案還原 SuSFS 設定,這會覆蓋目前所有設定</string>
|
||||
<string name="susfs_restore_select_file">選取備份檔案</string>
|
||||
<string name="susfs_restore_success" formatted="false">設定還原成功,備份建立於 %s,來源裝置:%s</string>
|
||||
<string name="susfs_restore_failed">還原失敗:%s</string>
|
||||
<string name="susfs_restore_confirm_title">確認還原</string>
|
||||
<string name="susfs_restore_confirm_description">這將會覆蓋目前所有的 SuSFS 設定,確定要繼續嗎?</string>
|
||||
<string name="susfs_restore_confirm">還原</string>
|
||||
<string name="susfs_backup_info_date">備份日期:%s</string>
|
||||
<string name="susfs_backup_info_device">裝置:%s</string>
|
||||
<string name="susfs_backup_info_version">版本:%s</string>
|
||||
<string name="hide_bl_script">隱藏 BL 腳本</string>
|
||||
<string name="hide_bl_script_description">啟用此選項可隱藏 Bootloader 解鎖狀態的腳本</string>
|
||||
<string name="cleanup_residue">清除工具殘留</string>
|
||||
<string name="cleanup_residue_description">清除各種模組與工具殘留的檔案與資料夾(可能會誤刪導致資料遺失或無法開機,請小心使用)</string>
|
||||
<string name="susfs_edit_sus_path">編輯 SUS 路徑</string>
|
||||
<string name="susfs_edit_sus_mount">編輯 SUS 掛載</string>
|
||||
<string name="susfs_edit_try_umount">編輯嘗試卸載</string>
|
||||
<string name="edit_kstat_statically_title">編輯 Kstat 靜態設定</string>
|
||||
<string name="edit_kstat_path_title">編輯 Kstat 路徑</string>
|
||||
<string name="susfs_save">儲存</string>
|
||||
<string name="edit">編輯</string>
|
||||
<string name="delete">刪除</string>
|
||||
<string name="update">更新</string>
|
||||
<string name="kstat_config_updated">Kstat 設定已更新</string>
|
||||
<string name="kstat_path_updated">Kstat 路徑已更新</string>
|
||||
<string name="susfs_update_full_clone">SusFS 完整複製更新</string>
|
||||
<string name="umount_zygote_iso_service">卸載 Zygote 隔離服務</string>
|
||||
<string name="umount_zygote_iso_service_description">啟用此選項後,系統開機時會自動卸載 Zygote 隔離服務的掛載點</string>
|
||||
<string name="umount_zygote_iso_service_enabled">已啟用卸載 Zygote 隔離服務</string>
|
||||
<string name="umount_zygote_iso_service_disabled">已停用卸載 Zygote 隔離服務</string>
|
||||
</resources>
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
<string name="home_not_installed">Not installed</string>
|
||||
<string name="home_click_to_install">Click to install</string>
|
||||
<string name="home_working">Working</string>
|
||||
<string name="home_working_version">Version: %d</string>
|
||||
<string name="home_working_version">Version: %s</string>
|
||||
<string name="home_unsupported">Unsupported</string>
|
||||
<string name="home_unsupported_reason">No KernelSU driver detected on your kernel, wrong kernel?.</string>
|
||||
<string name="home_kernel">Kernel version</string>
|
||||
@@ -62,7 +62,7 @@
|
||||
<string name="profile_selinux_context">SELinux context</string>
|
||||
<string name="profile_umount_modules">Umount modules</string>
|
||||
<string name="failed_to_update_app_profile">Failed to update App Profile for %s</string>
|
||||
<string name="require_kernel_version" formatted="false">The current KernelSU version %d is too low for the manager to work properly. Please upgrade to version %d or higher!</string>
|
||||
<string name="require_kernel_version" formatted="false">The current KernelSU version %s is too low for the manager to work properly. Please upgrade to version %s or higher!</string>
|
||||
<string name="settings_umount_modules_default">Umount modules by default</string>
|
||||
<string name="settings_umount_modules_default_summary">The global default value for \"Umount modules\" in App Profile. If enabled, it will remove all module modifications to the system for apps that don\'t have a profile set.</string>
|
||||
<string name="settings_susfs_toggle">Disable kprobe hooks</string>
|
||||
@@ -113,6 +113,7 @@
|
||||
<string name="install_inactive_slot_warning">Your device will be **FORCED** to boot to the current inactive slot after a reboot!\nOnly use this option after OTA is done.\nContinue?</string>
|
||||
<string name="install_next">Next</string>
|
||||
<string name="select_file_tip">%1$s partition image is recommended</string>
|
||||
<string name="select_file_tip_vendor">(unstable)</string>
|
||||
<string name="select_kmi">Select KMI</string>
|
||||
<string name="settings_uninstall">Uninstall</string>
|
||||
<string name="settings_uninstall_temporary">Uninstall temporarily</string>
|
||||
@@ -368,7 +369,6 @@
|
||||
<string name="susfs_apply">Apply</string>
|
||||
<!-- SuSFS Reset Confirmation -->
|
||||
<string name="susfs_reset_confirm_title">Confirm Reset</string>
|
||||
<string name="susfs_reset_confirm">Confirm Reset</string>
|
||||
<!-- SuSFS Toast Messages -->
|
||||
<string name="susfs_binary_not_found">Cannot find ksu_susfs file</string>
|
||||
<string name="susfs_command_failed">SuSFS command execution failed</string>
|
||||
@@ -391,8 +391,6 @@
|
||||
<string name="susfs_tab_try_umount">Try Umount</string>
|
||||
<string name="susfs_tab_path_settings">Path Settings</string>
|
||||
<string name="susfs_tab_enabled_features">Enabled Features Status</string>
|
||||
<!-- SuSFS Dialog Actions -->
|
||||
<string name="susfs_add">Add</string>
|
||||
<!-- SuSFS Path Management -->
|
||||
<string name="susfs_add_sus_path">Add SUS Path</string>
|
||||
<string name="susfs_add_sus_mount">Add SUS Mount</string>
|
||||
@@ -492,11 +490,9 @@
|
||||
<string name="file_or_directory_path_label">File/Directory Path</string>
|
||||
<string name="hint_use_default_value">Hint: You can use ”default“ to use the original value</string>
|
||||
<string name="add_kstat_path_title">Add Kstat Path</string>
|
||||
<string name="kstat_command_description">This command is used to add before the path is bind-mounted or overlaid, storing the original stat information in kernel memory.</string>
|
||||
<string name="add">Add</string>
|
||||
<string name="reset_kstat_config_title">Reset Kstat Configuration</string>
|
||||
<string name="reset_kstat_config_message">Are you sure you want to clear all Kstat configurations? This action cannot be undone.</string>
|
||||
<string name="confirm_reset">Confirm Reset</string>
|
||||
<string name="kstat_config_description_title">Kstat Configuration Description</string>
|
||||
<string name="kstat_config_description_add_statically">• add_sus_kstat_statically: Static stat info of files/directories</string>
|
||||
<string name="kstat_config_description_add">• add_sus_kstat: Add path before bind mount, storing original stat info</string>
|
||||
@@ -518,4 +514,49 @@
|
||||
<string name="susfs_hide_mounts_setting_all">Hide for all processes</string>
|
||||
<string name="susfs_hide_mounts_setting_non_ksu">Hide only for non-KSU processes</string>
|
||||
<string name="susfs_run">Run</string>
|
||||
<string name="kernel_simple_kernel">Kernel Version Concise Mode</string>
|
||||
<string name="kernel_simple_kernel_summary">Enable or disable the clean mode displayed by the SukiSU kernel version</string>
|
||||
<string name="susfs_android_data_path_set">Android Data path has been set to: %s</string>
|
||||
<string name="susfs_sdcard_path_set">SD card path has been set to: %s</string>
|
||||
<string name="susfs_path_setup_warning">Path setup may not be fully successful, but SUS paths will continue to be added</string>
|
||||
<!-- 备份和还原相关字符串 -->
|
||||
<string name="susfs_backup_title">Backup</string>
|
||||
<string name="susfs_backup_description">Create a backup of all SuSFS configurations. The backup file will include all settings, paths, and configurations.</string>
|
||||
<string name="susfs_backup_create">Create Backup</string>
|
||||
<string name="susfs_backup_success">Backup created successfully: %s</string>
|
||||
<string name="susfs_backup_failed">Backup creation failed: %s</string>
|
||||
<string name="susfs_backup_file_not_found">Backup file not found</string>
|
||||
<string name="susfs_backup_invalid_format">Invalid backup file format</string>
|
||||
<string name="susfs_backup_version_mismatch">Backup version mismatch, but will attempt to restore</string>
|
||||
<string name="susfs_restore_title">Restore</string>
|
||||
<string name="susfs_restore_description">Restore SuSFS configurations from a backup file. This will overwrite all current settings.</string>
|
||||
<string name="susfs_restore_select_file">Select Backup File</string>
|
||||
<string name="susfs_restore_success" formatted="false">Configuration restored successfully from backup created on %s from device: %s</string>
|
||||
<string name="susfs_restore_failed">Restore failed: %s</string>
|
||||
<string name="susfs_restore_confirm_title">Confirm Restore</string>
|
||||
<string name="susfs_restore_confirm_description">This will overwrite all current SuSFS configurations. Are you sure you want to continue?</string>
|
||||
<string name="susfs_restore_confirm">Restore</string>
|
||||
<string name="susfs_backup_info_date">Backup Date: %s</string>
|
||||
<string name="susfs_backup_info_device">Device: %s</string>
|
||||
<string name="susfs_backup_info_version">Version: %s</string>
|
||||
<string name="hide_bl_script">Hide BL Script</string>
|
||||
<string name="hide_bl_script_description">Enable Hide Bootloader Unlock Status Scripts</string>
|
||||
<string name="cleanup_residue">Cleanup Residue</string>
|
||||
<string name="cleanup_residue_description">Clean up the residual files and directories of various modules and tools (may be deleted by mistake, resulting in loss and failure to start, use with caution)</string>
|
||||
<string name="susfs_edit_sus_path">Edit SUS Path</string>
|
||||
<string name="susfs_edit_sus_mount">Edit SUS Mount</string>
|
||||
<string name="susfs_edit_try_umount">Edit Try Umount</string>
|
||||
<string name="edit_kstat_statically_title">Edit Kstat Static Configuration</string>
|
||||
<string name="edit_kstat_path_title">Edit Kstat Path</string>
|
||||
<string name="susfs_save">Save</string>
|
||||
<string name="edit">Edit</string>
|
||||
<string name="delete">Delete</string>
|
||||
<string name="update">Update</string>
|
||||
<string name="kstat_config_updated">Kstat config update</string>
|
||||
<string name="kstat_path_updated">Kstat path update</string>
|
||||
<string name="susfs_update_full_clone">Susfs update full clone</string>
|
||||
<string name="umount_zygote_iso_service">Unmount Zygote Isolation Service</string>
|
||||
<string name="umount_zygote_iso_service_description">Enable this option to unmount Zygote isolation service mount points at system startup</string>
|
||||
<string name="umount_zygote_iso_service_enabled">Zygote isolation service unmount enabled</string>
|
||||
<string name="umount_zygote_iso_service_disabled">Zygote isolation service unmount disabled</string>
|
||||
</resources>
|
||||
@@ -1,5 +1,5 @@
|
||||
[versions]
|
||||
agp = "8.10.1"
|
||||
agp = "8.11.0"
|
||||
gson = "2.11.0"
|
||||
kotlin = "2.1.20"
|
||||
ksp = "2.1.20-2.0.0"
|
||||
|
||||
BIN
manager/gradle/wrapper/gradle-wrapper.jar
vendored
BIN
manager/gradle/wrapper/gradle-wrapper.jar
vendored
Binary file not shown.
@@ -1,6 +1,6 @@
|
||||
distributionBase=GRADLE_USER_HOME
|
||||
distributionPath=wrapper/dists
|
||||
distributionUrl=https\://services.gradle.org/distributions/gradle-8.12.1-bin.zip
|
||||
distributionUrl=https\://services.gradle.org/distributions/gradle-8.14.2-bin.zip
|
||||
networkTimeout=10000
|
||||
validateDistributionUrl=true
|
||||
zipStoreBase=GRADLE_USER_HOME
|
||||
|
||||
6
manager/gradlew
vendored
6
manager/gradlew
vendored
@@ -114,7 +114,7 @@ case "$( uname )" in #(
|
||||
NONSTOP* ) nonstop=true ;;
|
||||
esac
|
||||
|
||||
CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
|
||||
CLASSPATH="\\\"\\\""
|
||||
|
||||
|
||||
# Determine the Java command to use to start the JVM.
|
||||
@@ -205,7 +205,7 @@ fi
|
||||
DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"'
|
||||
|
||||
# Collect all arguments for the java command:
|
||||
# * DEFAULT_JVM_OPTS, JAVA_OPTS, JAVA_OPTS, and optsEnvironmentVar are not allowed to contain shell fragments,
|
||||
# * DEFAULT_JVM_OPTS, JAVA_OPTS, and optsEnvironmentVar are not allowed to contain shell fragments,
|
||||
# and any embedded shellness will be escaped.
|
||||
# * For example: A user cannot expect ${Hostname} to be expanded, as it is an environment variable and will be
|
||||
# treated as '${Hostname}' itself on the command line.
|
||||
@@ -213,7 +213,7 @@ DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"'
|
||||
set -- \
|
||||
"-Dorg.gradle.appname=$APP_BASE_NAME" \
|
||||
-classpath "$CLASSPATH" \
|
||||
org.gradle.wrapper.GradleWrapperMain \
|
||||
-jar "$APP_HOME/gradle/wrapper/gradle-wrapper.jar" \
|
||||
"$@"
|
||||
|
||||
# Stop when "xargs" is not available.
|
||||
|
||||
4
manager/gradlew.bat
vendored
4
manager/gradlew.bat
vendored
@@ -70,11 +70,11 @@ goto fail
|
||||
:execute
|
||||
@rem Setup the command line
|
||||
|
||||
set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
|
||||
set CLASSPATH=
|
||||
|
||||
|
||||
@rem Execute Gradle
|
||||
"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %*
|
||||
"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" -jar "%APP_HOME%\gradle\wrapper\gradle-wrapper.jar" %*
|
||||
|
||||
:end
|
||||
@rem End local scope for the variables with windows NT shell
|
||||
|
||||
@@ -167,6 +167,21 @@ fn do_cpio_cmd(magiskboot: &Path, workdir: &Path, cmd: &str) -> Result<()> {
|
||||
Ok(())
|
||||
}
|
||||
|
||||
fn do_vendor_init_boot_cpio_cmd(magiskboot: &Path, workdir: &Path, cmd: &str) -> Result<()> {
|
||||
let vendor_init_boot_cpio = workdir.join("vendor_ramdisk").join("init_boot.cpio");
|
||||
let status = Command::new(magiskboot)
|
||||
.current_dir(workdir)
|
||||
.stdout(Stdio::null())
|
||||
.stderr(Stdio::null())
|
||||
.arg("cpio")
|
||||
.arg(vendor_init_boot_cpio)
|
||||
.arg(cmd)
|
||||
.status()?;
|
||||
|
||||
ensure!(status.success(), "magiskboot cpio {} failed", cmd);
|
||||
Ok(())
|
||||
}
|
||||
|
||||
fn is_magisk_patched(magiskboot: &Path, workdir: &Path) -> Result<bool> {
|
||||
let status = Command::new(magiskboot)
|
||||
.current_dir(workdir)
|
||||
@@ -179,6 +194,19 @@ fn is_magisk_patched(magiskboot: &Path, workdir: &Path) -> Result<bool> {
|
||||
Ok(status.code() == Some(1))
|
||||
}
|
||||
|
||||
fn is_magisk_patched_vendor_init_boot(magiskboot: &Path, workdir: &Path) -> Result<bool> {
|
||||
let vendor_init_boot_cpio = workdir.join("vendor_ramdisk").join("init_boot.cpio");
|
||||
let status = Command::new(magiskboot)
|
||||
.current_dir(workdir)
|
||||
.stdout(Stdio::null())
|
||||
.stderr(Stdio::null())
|
||||
.args(["cpio", vendor_init_boot_cpio.to_str().unwrap(), "test"])
|
||||
.status()?;
|
||||
|
||||
// 0: stock, 1: magisk
|
||||
Ok(status.code() == Some(1))
|
||||
}
|
||||
|
||||
fn is_kernelsu_patched(magiskboot: &Path, workdir: &Path) -> Result<bool> {
|
||||
let status = Command::new(magiskboot)
|
||||
.current_dir(workdir)
|
||||
@@ -190,6 +218,22 @@ fn is_kernelsu_patched(magiskboot: &Path, workdir: &Path) -> Result<bool> {
|
||||
Ok(status.success())
|
||||
}
|
||||
|
||||
fn is_kernelsu_patched_vendor_init_boot(magiskboot: &Path, workdir: &Path) -> Result<bool> {
|
||||
let vendor_ramdisk_cpio = workdir.join("vendor_ramdisk").join("init_boot.cpio");
|
||||
let status = Command::new(magiskboot)
|
||||
.current_dir(workdir)
|
||||
.stdout(Stdio::null())
|
||||
.stderr(Stdio::null())
|
||||
.args([
|
||||
"cpio",
|
||||
vendor_ramdisk_cpio.to_str().unwrap(),
|
||||
"exists kernelsu.ko",
|
||||
])
|
||||
.status()?;
|
||||
|
||||
Ok(status.success())
|
||||
}
|
||||
|
||||
fn dd<P: AsRef<Path>, Q: AsRef<Path>>(ifile: P, ofile: Q) -> Result<()> {
|
||||
let status = Command::new("dd")
|
||||
.stdout(Stdio::null())
|
||||
@@ -234,8 +278,14 @@ pub fn restore(
|
||||
.status()?;
|
||||
ensure!(status.success(), "magiskboot unpack failed");
|
||||
|
||||
let no_ramdisk = !workdir.join("ramdisk.cpio").exists();
|
||||
let is_kernelsu_patched = is_kernelsu_patched(&magiskboot, workdir)?;
|
||||
ensure!(is_kernelsu_patched, "boot image is not patched by KernelSU");
|
||||
let is_kernelsu_patched_vendor_init_boot =
|
||||
is_kernelsu_patched_vendor_init_boot(&magiskboot, workdir)?;
|
||||
ensure!(
|
||||
is_kernelsu_patched || is_kernelsu_patched_vendor_init_boot,
|
||||
"boot image is not patched by KernelSU"
|
||||
);
|
||||
|
||||
let mut new_boot = None;
|
||||
let mut from_backup = false;
|
||||
@@ -267,9 +317,21 @@ pub fn restore(
|
||||
}
|
||||
|
||||
if new_boot.is_none() {
|
||||
if no_ramdisk {
|
||||
// vendor init_boot restore
|
||||
do_vendor_init_boot_cpio_cmd(&magiskboot, workdir, "rm kernelsu.ko")?;
|
||||
// if init.real exists, restore it
|
||||
let status =
|
||||
do_vendor_init_boot_cpio_cmd(&magiskboot, workdir, "exists init.real").is_ok();
|
||||
if status {
|
||||
do_vendor_init_boot_cpio_cmd(&magiskboot, workdir, "mv init.real init")?;
|
||||
} else {
|
||||
let vendor_init_boot = workdir.join("vendor_ramdisk").join("init_boot.cpio");
|
||||
std::fs::remove_file(vendor_init_boot)?;
|
||||
}
|
||||
} else {
|
||||
// remove kernelsu.ko
|
||||
do_cpio_cmd(&magiskboot, workdir, "rm kernelsu.ko")?;
|
||||
|
||||
// if init.real exists, restore it
|
||||
let status = do_cpio_cmd(&magiskboot, workdir, "exists init.real").is_ok();
|
||||
if status {
|
||||
@@ -278,6 +340,7 @@ pub fn restore(
|
||||
let ramdisk = workdir.join("ramdisk.cpio");
|
||||
std::fs::remove_file(ramdisk)?;
|
||||
}
|
||||
}
|
||||
|
||||
println!("- Repacking boot image");
|
||||
let status = Command::new(&magiskboot)
|
||||
@@ -454,28 +517,51 @@ fn do_patch(
|
||||
ensure!(status.success(), "magiskboot unpack failed");
|
||||
|
||||
let no_ramdisk = !workdir.join("ramdisk.cpio").exists();
|
||||
let no_vendor_init_boot = !workdir
|
||||
.join("vendor_ramdisk")
|
||||
.join("init_boot.cpio")
|
||||
.exists();
|
||||
if no_ramdisk && no_vendor_init_boot {
|
||||
bail!("No compatible ramdisk found.");
|
||||
}
|
||||
let is_magisk_patched = is_magisk_patched(&magiskboot, workdir)?;
|
||||
let is_magisk_patched_vendor_init_boot =
|
||||
is_magisk_patched_vendor_init_boot(&magiskboot, workdir)?;
|
||||
ensure!(
|
||||
no_ramdisk || !is_magisk_patched,
|
||||
!is_magisk_patched || !is_magisk_patched_vendor_init_boot,
|
||||
"Cannot work with Magisk patched image"
|
||||
);
|
||||
|
||||
println!("- Adding KernelSU LKM");
|
||||
let is_kernelsu_patched = is_kernelsu_patched(&magiskboot, workdir)?;
|
||||
let is_kernelsu_patched_vendor_init_boot =
|
||||
is_kernelsu_patched_vendor_init_boot(&magiskboot, workdir)?;
|
||||
|
||||
let mut need_backup = false;
|
||||
if !is_kernelsu_patched {
|
||||
if !is_kernelsu_patched || (no_ramdisk && !is_kernelsu_patched_vendor_init_boot) {
|
||||
if no_ramdisk {
|
||||
// vendor init_boot patching
|
||||
let status = do_vendor_init_boot_cpio_cmd(&magiskboot, workdir, "exists init");
|
||||
if status.is_ok() {
|
||||
do_vendor_init_boot_cpio_cmd(&magiskboot, workdir, "mv init init.real")?;
|
||||
}
|
||||
} else {
|
||||
// kernelsu.ko is not exist, backup init if necessary
|
||||
let status = do_cpio_cmd(&magiskboot, workdir, "exists init");
|
||||
if status.is_ok() {
|
||||
do_cpio_cmd(&magiskboot, workdir, "mv init init.real")?;
|
||||
}
|
||||
|
||||
need_backup = flash;
|
||||
}
|
||||
}
|
||||
|
||||
if no_ramdisk {
|
||||
do_vendor_init_boot_cpio_cmd(&magiskboot, workdir, "add 0755 init init")?;
|
||||
do_vendor_init_boot_cpio_cmd(&magiskboot, workdir, "add 0755 kernelsu.ko kernelsu.ko")?;
|
||||
} else {
|
||||
do_cpio_cmd(&magiskboot, workdir, "add 0755 init init")?;
|
||||
do_cpio_cmd(&magiskboot, workdir, "add 0755 kernelsu.ko kernelsu.ko")?;
|
||||
}
|
||||
|
||||
#[cfg(target_os = "android")]
|
||||
if need_backup {
|
||||
@@ -501,7 +587,7 @@ fn do_patch(
|
||||
let output_dir = out.unwrap_or(std::env::current_dir()?);
|
||||
let now = chrono::Utc::now();
|
||||
let output_image = output_dir.join(format!(
|
||||
"kernelsu_patched_{}.img",
|
||||
"SukiSU_patched_{}.img",
|
||||
now.format("%Y%m%d_%H%M%S")
|
||||
));
|
||||
|
||||
@@ -655,8 +741,12 @@ fn find_boot_image(
|
||||
|
||||
let init_boot_exist =
|
||||
Path::new(&format!("/dev/block/by-name/init_boot{slot_suffix}")).exists();
|
||||
let vendor_boot_exist =
|
||||
Path::new(&format!("/dev/block/by-name/vendor_boot{slot_suffix}")).exists();
|
||||
let boot_partition = if !is_replace_kernel && init_boot_exist && !skip_init {
|
||||
format!("/dev/block/by-name/init_boot{slot_suffix}")
|
||||
} else if !is_replace_kernel && vendor_boot_exist && !skip_init {
|
||||
format!("/dev/block/by-name/vendor_boot{slot_suffix}")
|
||||
} else {
|
||||
format!("/dev/block/by-name/boot{slot_suffix}")
|
||||
};
|
||||
|
||||
@@ -1,11 +1,11 @@
|
||||
use crate::defs::{KSU_MOUNT_SOURCE, NO_MOUNT_PATH, NO_TMPFS_PATH};
|
||||
use crate::kpm;
|
||||
use crate::module::{handle_updated_modules, prune_modules};
|
||||
use crate::{assets, defs, ksucalls, restorecon, utils};
|
||||
use anyhow::{Context, Result};
|
||||
use log::{info, warn};
|
||||
use rustix::fs::{MountFlags, mount};
|
||||
use std::path::Path;
|
||||
use crate::kpm;
|
||||
|
||||
pub fn on_post_data_fs() -> Result<()> {
|
||||
ksucalls::report_post_fs_data();
|
||||
@@ -72,7 +72,13 @@ pub fn on_post_data_fs() -> Result<()> {
|
||||
|
||||
// mount temp dir
|
||||
if !Path::new(NO_TMPFS_PATH).exists() {
|
||||
if let Err(e) = mount(KSU_MOUNT_SOURCE, utils::get_tmp_path(), "tmpfs", MountFlags::empty(), "") {
|
||||
if let Err(e) = mount(
|
||||
KSU_MOUNT_SOURCE,
|
||||
utils::get_tmp_path(),
|
||||
"tmpfs",
|
||||
MountFlags::empty(),
|
||||
"",
|
||||
) {
|
||||
warn!("do temp dir mount failed: {}", e);
|
||||
}
|
||||
} else {
|
||||
|
||||
@@ -1,9 +1,9 @@
|
||||
use anyhow::Result;
|
||||
use notify::{Watcher, RecursiveMode};
|
||||
use std::path::Path;
|
||||
use std::fs;
|
||||
use anyhow::anyhow;
|
||||
use notify::{RecursiveMode, Watcher};
|
||||
use std::ffi::OsStr;
|
||||
use std::fs;
|
||||
use std::path::Path;
|
||||
|
||||
pub const KPM_DIR: &str = "/data/adb/kpm";
|
||||
pub const KPMMGR_PATH: &str = "/data/adb/ksu/bin/kpmmgr";
|
||||
@@ -28,11 +28,9 @@ pub fn start_kpm_watcher() -> Result<()> {
|
||||
return Ok(());
|
||||
}
|
||||
|
||||
let mut watcher = notify::recommended_watcher(|res| {
|
||||
match res {
|
||||
let mut watcher = notify::recommended_watcher(|res| match res {
|
||||
Ok(event) => handle_kpm_event(event),
|
||||
Err(e) => log::error!("monitoring error: {:?}", e),
|
||||
}
|
||||
})?;
|
||||
|
||||
watcher.watch(Path::new(KPM_DIR), RecursiveMode::NonRecursive)?;
|
||||
@@ -80,7 +78,9 @@ fn handle_modify_event(paths: Vec<std::path::PathBuf>) {
|
||||
|
||||
// 加载 KPM 模块
|
||||
pub fn load_kpm(path: &Path) -> Result<()> {
|
||||
let path_str = path.to_str().ok_or_else(|| anyhow!("Invalid path: {}", path.display()))?;
|
||||
let path_str = path
|
||||
.to_str()
|
||||
.ok_or_else(|| anyhow!("Invalid path: {}", path.display()))?;
|
||||
let status = std::process::Command::new(KPMMGR_PATH)
|
||||
.args(["load", path_str, ""])
|
||||
.status()?;
|
||||
@@ -168,7 +168,6 @@ pub fn load_kpm_modules() -> Result<()> {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if path.extension().is_some_and(|ext| ext == "kpm") {
|
||||
match load_kpm(&path) {
|
||||
Ok(()) => log::info!("Successfully loaded KPM module: {}", path.display()),
|
||||
|
||||
@@ -1,6 +1,4 @@
|
||||
use crate::defs::{
|
||||
DISABLE_FILE_NAME, KSU_MOUNT_SOURCE, MODULE_DIR, SKIP_MOUNT_FILE_NAME,
|
||||
};
|
||||
use crate::defs::{DISABLE_FILE_NAME, KSU_MOUNT_SOURCE, MODULE_DIR, SKIP_MOUNT_FILE_NAME};
|
||||
use crate::magic_mount::NodeFileType::{Directory, RegularFile, Symlink, Whiteout};
|
||||
use crate::restorecon::{lgetfilecon, lsetfilecon};
|
||||
use crate::utils::{ensure_dir_exists, get_work_dir};
|
||||
|
||||
@@ -5,6 +5,7 @@ mod cli;
|
||||
mod debug;
|
||||
mod defs;
|
||||
mod init_event;
|
||||
mod kpm;
|
||||
mod ksucalls;
|
||||
#[cfg(target_os = "android")]
|
||||
mod magic_mount;
|
||||
@@ -14,7 +15,6 @@ mod restorecon;
|
||||
mod sepolicy;
|
||||
mod su;
|
||||
mod utils;
|
||||
mod kpm;
|
||||
|
||||
fn main() -> anyhow::Result<()> {
|
||||
cli::run()
|
||||
|
||||
@@ -187,13 +187,7 @@ fn is_ok_empty(dir: &str) -> bool {
|
||||
}
|
||||
|
||||
pub fn get_tmp_path() -> String {
|
||||
let dirs = [
|
||||
"/debug_ramdisk",
|
||||
"/patch_hw",
|
||||
"/oem",
|
||||
"/root",
|
||||
"/sbin",
|
||||
];
|
||||
let dirs = ["/debug_ramdisk", "/patch_hw", "/oem", "/root", "/sbin"];
|
||||
|
||||
// find empty directory
|
||||
for dir in dirs {
|
||||
|
||||
Reference in New Issue
Block a user