mirror of
https://github.com/topjohnwu/Magisk.git
synced 2025-08-22 12:27:44 +00:00
Compare commits
23 Commits
manager-v5
...
manager-v5
Author | SHA1 | Date | |
---|---|---|---|
![]() |
3f38579529 | ||
![]() |
4d5a9f6e15 | ||
![]() |
41f47acd76 | ||
![]() |
821dcaa7c7 | ||
![]() |
7135d26419 | ||
![]() |
f7fd354dce | ||
![]() |
0c69a65bc4 | ||
![]() |
2f2ca5eab4 | ||
![]() |
df9c40c035 | ||
![]() |
25b67017e4 | ||
![]() |
bc9c3346f3 | ||
![]() |
1db7e19fe8 | ||
![]() |
102c03ce2b | ||
![]() |
ec19eb4455 | ||
![]() |
6d9924d50e | ||
![]() |
16c4d74274 | ||
![]() |
e4af5fd36a | ||
![]() |
702775493a | ||
![]() |
b2ae826066 | ||
![]() |
cc3e9990fa | ||
![]() |
271cbddd5e | ||
![]() |
c1423ca9ad | ||
![]() |
74379150a1 |
2
.gitignore
vendored
2
.gitignore
vendored
@@ -6,7 +6,7 @@
|
||||
app/release
|
||||
*.hprof
|
||||
.externalNativeBuild/
|
||||
*.sh
|
||||
src/main/assets
|
||||
public.certificate.x509.pem
|
||||
private.key.pk8
|
||||
*.apk
|
||||
|
@@ -8,8 +8,8 @@ android {
|
||||
applicationId "com.topjohnwu.magisk"
|
||||
minSdkVersion 21
|
||||
targetSdkVersion 27
|
||||
versionCode 100
|
||||
versionName "5.6.0"
|
||||
versionCode 105
|
||||
versionName "5.6.1"
|
||||
javaCompileOptions {
|
||||
annotationProcessorOptions {
|
||||
argument('butterknife.debuggable', 'false')
|
||||
@@ -46,7 +46,7 @@ repositories {
|
||||
dependencies {
|
||||
implementation fileTree(include: ['*.jar'], dir: 'libs')
|
||||
implementation project(':utils')
|
||||
implementation 'com.github.topjohnwu:libsu:1.1.0'
|
||||
implementation 'com.github.topjohnwu:libsu:1.1.1'
|
||||
implementation 'com.android.support:recyclerview-v7:27.0.2'
|
||||
implementation 'com.android.support:cardview-v7:27.0.2'
|
||||
implementation 'com.android.support:design:27.0.2'
|
||||
@@ -54,6 +54,5 @@ dependencies {
|
||||
implementation 'com.jakewharton:butterknife:8.8.1'
|
||||
implementation 'com.atlassian.commonmark:commonmark:0.10.0'
|
||||
implementation 'org.kamranzafar:jtar:2.3'
|
||||
implementation 'com.google.code.gson:gson:2.8.2'
|
||||
annotationProcessor 'com.jakewharton:butterknife-compiler:8.8.1'
|
||||
}
|
||||
|
@@ -1,5 +0,0 @@
|
||||
### v5.6.0
|
||||
- Remove JNI requirement, Magisk Manager is now pure Java
|
||||
- Update the method of handling su database, may fix the issue that root requests won't save
|
||||
- Add the option to restore Magisk Manager after repackaging with random package name
|
||||
- Massive under-the-hood optimizations
|
@@ -14,8 +14,6 @@ import com.topjohnwu.magisk.components.AboutCardRow;
|
||||
import com.topjohnwu.magisk.components.Activity;
|
||||
import com.topjohnwu.magisk.utils.Const;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
import java.util.Locale;
|
||||
|
||||
import butterknife.BindView;
|
||||
@@ -56,12 +54,8 @@ public class AboutActivity extends Activity {
|
||||
|
||||
appChangelog.removeSummary();
|
||||
appChangelog.setOnClickListener(v -> {
|
||||
try {
|
||||
InputStream is = getAssets().open("changelog.md");
|
||||
new MarkDownWindow(this, getString(R.string.app_changelog), is).exec();
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
new MarkDownWindow(this, getString(R.string.app_changelog),
|
||||
getResources().openRawResource(R.raw.changelog)).exec();
|
||||
});
|
||||
|
||||
String translators = getString(R.string.translators);
|
||||
|
@@ -1,5 +1,8 @@
|
||||
package com.topjohnwu.magisk;
|
||||
|
||||
import android.app.job.JobInfo;
|
||||
import android.app.job.JobScheduler;
|
||||
import android.content.ComponentName;
|
||||
import android.content.Intent;
|
||||
import android.content.SharedPreferences;
|
||||
import android.content.pm.PackageManager;
|
||||
@@ -14,6 +17,7 @@ import android.widget.Toast;
|
||||
import com.topjohnwu.magisk.container.Module;
|
||||
import com.topjohnwu.magisk.database.RepoDatabaseHelper;
|
||||
import com.topjohnwu.magisk.database.SuDatabaseHelper;
|
||||
import com.topjohnwu.magisk.services.UpdateCheckService;
|
||||
import com.topjohnwu.magisk.utils.Const;
|
||||
import com.topjohnwu.magisk.utils.Topic;
|
||||
import com.topjohnwu.magisk.utils.Utils;
|
||||
@@ -101,8 +105,10 @@ public class MagiskManager extends Shell.ContainerApp {
|
||||
Shell.setInitializer(new Shell.Initializer() {
|
||||
@Override
|
||||
public void onRootShellInit(@NonNull Shell shell) {
|
||||
try (InputStream in = MagiskManager.get().getAssets().open(Const.UTIL_FUNCTIONS)) {
|
||||
shell.loadInputStream(null, null, in);
|
||||
try (InputStream utils = getAssets().open(Const.UTIL_FUNCTIONS);
|
||||
InputStream sudb = getResources().openRawResource(R.raw.sudb)) {
|
||||
shell.loadInputStream(null, null, utils);
|
||||
shell.loadInputStream(null, null, sudb);
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
@@ -205,7 +211,8 @@ public class MagiskManager extends Shell.ContainerApp {
|
||||
try {
|
||||
magiskVersionString = Utils.cmd("magisk -v").split(":")[0];
|
||||
magiskVersionCode = Integer.parseInt(Utils.cmd("magisk -V"));
|
||||
String s = Utils.cmd((magiskVersionCode > 1435 ? "resetprop -p " : "getprop ") + Const.MAGISKHIDE_PROP);
|
||||
String s = Utils.cmd((magiskVersionCode > 1435 ? "resetprop -p " : "getprop ")
|
||||
+ Const.MAGISKHIDE_PROP);
|
||||
magiskHide = s == null || Integer.parseInt(s) != 0;
|
||||
} catch (Exception ignored) {}
|
||||
|
||||
@@ -223,4 +230,23 @@ public class MagiskManager extends Shell.ContainerApp {
|
||||
public void setPermissionGrantCallback(Runnable callback) {
|
||||
permissionGrantCallback = callback;
|
||||
}
|
||||
|
||||
public void setupUpdateCheck() {
|
||||
JobScheduler scheduler = (JobScheduler) getSystemService(JOB_SCHEDULER_SERVICE);
|
||||
|
||||
if (prefs.getBoolean(Const.Key.CHECK_UPDATES, true)) {
|
||||
if (scheduler.getAllPendingJobs().isEmpty() ||
|
||||
Const.UPDATE_SERVICE_VER > prefs.getInt(Const.Key.UPDATE_SERVICE_VER, -1)) {
|
||||
ComponentName service = new ComponentName(this, UpdateCheckService.class);
|
||||
JobInfo info = new JobInfo.Builder(Const.ID.UPDATE_SERVICE_ID, service)
|
||||
.setRequiredNetworkType(JobInfo.NETWORK_TYPE_ANY)
|
||||
.setPersisted(true)
|
||||
.setPeriodic(8 * 60 * 60 * 1000)
|
||||
.build();
|
||||
scheduler.schedule(info);
|
||||
}
|
||||
} else {
|
||||
scheduler.cancel(Const.UPDATE_SERVICE_VER);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@@ -23,9 +23,6 @@ import com.topjohnwu.magisk.utils.Topic;
|
||||
import com.topjohnwu.magisk.utils.Utils;
|
||||
import com.topjohnwu.superuser.Shell;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
|
||||
import butterknife.BindView;
|
||||
import butterknife.ButterKnife;
|
||||
|
||||
@@ -99,12 +96,8 @@ public class MainActivity extends Activity
|
||||
|
||||
if (mm.prefs.getInt(Const.Key.APP_VER, -1) < BuildConfig.VERSION_CODE) {
|
||||
prefs.edit().putInt(Const.Key.APP_VER, BuildConfig.VERSION_CODE).apply();
|
||||
try {
|
||||
InputStream is = getAssets().open("changelog.md");
|
||||
new MarkDownWindow(this, getString(R.string.app_changelog), is).exec();
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
new MarkDownWindow(this, getString(R.string.app_changelog),
|
||||
getResources().openRawResource(R.raw.changelog)).exec();
|
||||
}
|
||||
}
|
||||
|
||||
|
@@ -150,9 +150,10 @@ public class SettingsActivity extends Activity implements Topic.Subscriber {
|
||||
reauth.setSummary(R.string.android_o_not_support);
|
||||
}
|
||||
|
||||
// Remove fingerprint option if not possible
|
||||
// Disable fingerprint option if not possible
|
||||
if (!FingerprintHelper.canUseFingerprint()) {
|
||||
suCategory.removePreference(fingerprint);
|
||||
fingerprint.setEnabled(false);
|
||||
fingerprint.setSummary(R.string.disable_fingerprint);
|
||||
}
|
||||
|
||||
if (mm.magiskVersionCode >= 1440) {
|
||||
@@ -298,6 +299,9 @@ public class SettingsActivity extends Activity implements Topic.Subscriber {
|
||||
case Const.Key.UPDATE_CHANNEL:
|
||||
new CheckUpdates().exec();
|
||||
break;
|
||||
case Const.Key.CHECK_UPDATES:
|
||||
mm.setupUpdateCheck();
|
||||
break;
|
||||
}
|
||||
mm.loadConfig();
|
||||
setSummary();
|
||||
|
@@ -2,10 +2,6 @@ package com.topjohnwu.magisk;
|
||||
|
||||
import android.app.NotificationChannel;
|
||||
import android.app.NotificationManager;
|
||||
import android.app.job.JobInfo;
|
||||
import android.app.job.JobScheduler;
|
||||
import android.content.ComponentName;
|
||||
import android.content.Context;
|
||||
import android.content.Intent;
|
||||
import android.os.Build;
|
||||
import android.os.Bundle;
|
||||
@@ -15,7 +11,6 @@ import com.topjohnwu.magisk.asyncs.LoadModules;
|
||||
import com.topjohnwu.magisk.asyncs.ParallelTask;
|
||||
import com.topjohnwu.magisk.asyncs.UpdateRepos;
|
||||
import com.topjohnwu.magisk.components.Activity;
|
||||
import com.topjohnwu.magisk.services.UpdateCheckService;
|
||||
import com.topjohnwu.magisk.utils.Const;
|
||||
import com.topjohnwu.magisk.utils.Utils;
|
||||
import com.topjohnwu.superuser.Shell;
|
||||
@@ -50,31 +45,18 @@ public class SplashActivity extends Activity {
|
||||
LoadModules loadModuleTask = new LoadModules();
|
||||
|
||||
if (Utils.checkNetworkStatus()) {
|
||||
|
||||
// Fire update check
|
||||
new CheckUpdates().exec();
|
||||
|
||||
// Add repo update check
|
||||
loadModuleTask.setCallBack(() -> new UpdateRepos(false).exec());
|
||||
}
|
||||
|
||||
// Magisk working as expected
|
||||
if (Shell.rootAccess() && mm.magiskVersionCode > 0) {
|
||||
|
||||
// Add update checking service
|
||||
if (Const.UPDATE_SERVICE_VER > mm.prefs.getInt(Const.Key.UPDATE_SERVICE_VER, -1)) {
|
||||
ComponentName service = new ComponentName(this, UpdateCheckService.class);
|
||||
JobInfo info = new JobInfo.Builder(Const.ID.UPDATE_SERVICE_ID, service)
|
||||
.setRequiredNetworkType(JobInfo.NETWORK_TYPE_ANY)
|
||||
.setPersisted(true)
|
||||
.setPeriodic(8 * 60 * 60 * 1000)
|
||||
.build();
|
||||
((JobScheduler) getSystemService(Context.JOB_SCHEDULER_SERVICE)).schedule(info);
|
||||
}
|
||||
|
||||
// Update check service
|
||||
mm.setupUpdateCheck();
|
||||
// Fire asynctasks
|
||||
loadModuleTask.exec();
|
||||
|
||||
// Check dtbo status
|
||||
Utils.patchDTBO();
|
||||
}
|
||||
|
@@ -54,7 +54,7 @@ public class CheckUpdates extends ParallelTask<Void, Void, Void> {
|
||||
@Override
|
||||
protected void onPostExecute(Void v) {
|
||||
MagiskManager mm = MagiskManager.get();
|
||||
if (showNotification && mm.prefs.getBoolean(Const.Key.UPDATE_NOTIFICATION, true)) {
|
||||
if (showNotification) {
|
||||
if (BuildConfig.VERSION_CODE < mm.remoteManagerVersionCode) {
|
||||
ShowUI.managerUpdateNotification();
|
||||
} else if (mm.magiskVersionCode < mm.remoteMagiskVersionCode) {
|
||||
|
@@ -136,7 +136,6 @@ public class HideManager extends ParallelTask<Void, Void, Boolean> {
|
||||
repack.delete();
|
||||
|
||||
mm.suDB.setStrings(Const.Key.SU_REQUESTER, pkg);
|
||||
mm.suDB.flush();
|
||||
Utils.dumpPrefs();
|
||||
Utils.uninstallPkg(Const.ORIG_PKG_NAME);
|
||||
|
||||
|
@@ -54,11 +54,13 @@ public class MarkDownWindow extends ParallelTask<Void, Void, String> {
|
||||
}
|
||||
String css;
|
||||
try (
|
||||
InputStream in = mm.getAssets().open(mm.isDarkTheme ? "dark.css" : "light.css");
|
||||
InputStream in = mm.getResources().openRawResource(
|
||||
mm.isDarkTheme ? R.raw.dark : R.raw.light);
|
||||
ByteArrayOutputStream out = new ByteArrayOutputStream()
|
||||
) {
|
||||
ShellUtils.pump(in, out);
|
||||
css = out.toString();
|
||||
in.close();
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
return "";
|
||||
|
@@ -7,6 +7,7 @@ import android.database.Cursor;
|
||||
import android.database.sqlite.SQLiteDatabase;
|
||||
import android.os.Build;
|
||||
import android.os.Process;
|
||||
import android.support.annotation.NonNull;
|
||||
import android.text.TextUtils;
|
||||
import android.widget.Toast;
|
||||
|
||||
@@ -17,6 +18,7 @@ import com.topjohnwu.magisk.container.SuLogEntry;
|
||||
import com.topjohnwu.magisk.utils.Const;
|
||||
import com.topjohnwu.magisk.utils.Utils;
|
||||
import com.topjohnwu.superuser.Shell;
|
||||
import com.topjohnwu.superuser.io.SuFile;
|
||||
|
||||
import java.io.File;
|
||||
import java.text.DateFormat;
|
||||
@@ -37,27 +39,17 @@ public class SuDatabaseHelper {
|
||||
private SQLiteDatabase mDb;
|
||||
private File DB_FILE;
|
||||
|
||||
@NonNull
|
||||
public static SuDatabaseHelper getInstance(MagiskManager mm) {
|
||||
try {
|
||||
return new SuDatabaseHelper(mm);
|
||||
} catch (Exception e) {
|
||||
// Let's cleanup everything and try again
|
||||
cleanup("*");
|
||||
Shell.Sync.su("sudb_clean '*'");
|
||||
return new SuDatabaseHelper(mm);
|
||||
}
|
||||
}
|
||||
|
||||
public static void cleanup() {
|
||||
cleanup(String.valueOf(Const.USER_ID));
|
||||
}
|
||||
|
||||
public static void cleanup(String s) {
|
||||
Shell.Sync.su(
|
||||
"umount -l /data/user*/*/*/databases/su.db",
|
||||
"umount -l /sbin/.core/db-" + s + "/magisk.db",
|
||||
"rm -rf /sbin/.core/db-" + s);
|
||||
}
|
||||
|
||||
private SuDatabaseHelper(MagiskManager mm) {
|
||||
pm = mm.getPackageManager();
|
||||
mDb = openDatabase(mm);
|
||||
@@ -72,11 +64,11 @@ public class SuDatabaseHelper {
|
||||
}
|
||||
|
||||
private SQLiteDatabase openDatabase(MagiskManager mm) {
|
||||
String GLOBAL_DB = "/data/adb/magisk.db";
|
||||
final SuFile GLOBAL_DB = new SuFile("/data/adb/magisk.db", true);
|
||||
DB_FILE = new File(Utils.fmt("/sbin/.core/db-%d/magisk.db", Const.USER_ID));
|
||||
Context de = Build.VERSION.SDK_INT >= Build.VERSION_CODES.N
|
||||
? mm.createDeviceProtectedStorageContext() : mm;
|
||||
if (!DB_FILE.exists()) {
|
||||
if (!DB_FILE.canWrite()) {
|
||||
if (!Shell.rootAccess()) {
|
||||
// We don't want the app to crash, create a db and return
|
||||
DB_FILE = mm.getDatabasePath("su.db");
|
||||
@@ -84,7 +76,7 @@ public class SuDatabaseHelper {
|
||||
}
|
||||
mm.loadMagiskInfo();
|
||||
// Cleanup
|
||||
cleanup();
|
||||
Shell.Sync.su("sudb_clean " + Const.USER_ID);
|
||||
if (mm.magiskVersionCode < 1410) {
|
||||
// Super old legacy mode
|
||||
DB_FILE = mm.getDatabasePath("su.db");
|
||||
@@ -100,22 +92,23 @@ public class SuDatabaseHelper {
|
||||
mm.deleteDatabase("su.db");
|
||||
de.deleteDatabase("su.db");
|
||||
if (mm.magiskVersionCode < 1460) {
|
||||
// v14.5 global DB location
|
||||
GLOBAL_DB = new File(de.getFilesDir().getParentFile().getParentFile(),
|
||||
"magisk.db").getPath();
|
||||
// We need some additional policies on old versions
|
||||
Shell.Sync.su("magiskpolicy --live 'create su_file' 'allow * su_file file *'");
|
||||
// Link to new path
|
||||
File oldDB = new File(de.getFilesDir().getParentFile().getParentFile(),
|
||||
"magisk.db");
|
||||
Shell.Sync.su(Utils.fmt("mv -f %s %s; ln -s %s %s",
|
||||
oldDB, GLOBAL_DB, GLOBAL_DB, oldDB));
|
||||
}
|
||||
// Touch global DB and setup db in tmpfs
|
||||
Shell.Sync.su(Utils.fmt("touch %s; mkdir -p %s; touch %s; touch %s-journal;" +
|
||||
"mount -o bind %s %s;" +
|
||||
"chcon u:object_r:su_file:s0 %s/*; chown %d.%d %s;" +
|
||||
"chmod 666 %s/*; chmod 700 %s;",
|
||||
GLOBAL_DB, DB_FILE.getParent(), DB_FILE, DB_FILE,
|
||||
GLOBAL_DB, DB_FILE,
|
||||
DB_FILE.getParent(), Process.myUid(), Process.myUid(), DB_FILE.getParent(),
|
||||
DB_FILE.getParent(), DB_FILE.getParent()
|
||||
));
|
||||
if (mm.magiskVersionCode < 1550) {
|
||||
// We need some additional policies on old versions
|
||||
Shell.Sync.su("magiskpolicy --live " +
|
||||
"'create su_file' 'allow * su_file file *' 'allow * su_file dir *'");
|
||||
}
|
||||
if (!GLOBAL_DB.exists()) {
|
||||
Shell.Sync.su("sudb_init");
|
||||
SQLiteDatabase.openOrCreateDatabase(GLOBAL_DB, null).close();
|
||||
Shell.Sync.su("sudb_restore");
|
||||
}
|
||||
Shell.Sync.su("sudb_setup " + Process.myUid());
|
||||
}
|
||||
}
|
||||
// Not using legacy mode, open the mounted global DB
|
||||
@@ -123,42 +116,37 @@ public class SuDatabaseHelper {
|
||||
}
|
||||
|
||||
public void onUpgrade(SQLiteDatabase db, int oldVersion) {
|
||||
try {
|
||||
if (oldVersion == 0) {
|
||||
createTables(db);
|
||||
oldVersion = 3;
|
||||
}
|
||||
if (oldVersion == 1) {
|
||||
// We're dropping column app_name, rename and re-construct table
|
||||
db.execSQL(Utils.fmt("ALTER TABLE %s RENAME TO %s_old", POLICY_TABLE));
|
||||
if (oldVersion == 0) {
|
||||
createTables(db);
|
||||
oldVersion = 3;
|
||||
}
|
||||
if (oldVersion == 1) {
|
||||
// We're dropping column app_name, rename and re-construct table
|
||||
db.execSQL(Utils.fmt("ALTER TABLE %s RENAME TO %s_old", POLICY_TABLE));
|
||||
|
||||
// Create the new tables
|
||||
createTables(db);
|
||||
// Create the new tables
|
||||
createTables(db);
|
||||
|
||||
// Migrate old data to new tables
|
||||
db.execSQL(Utils.fmt("INSERT INTO %s SELECT " +
|
||||
"uid, package_name, policy, until, logging, notification FROM %s_old",
|
||||
POLICY_TABLE, POLICY_TABLE));
|
||||
db.execSQL(Utils.fmt("DROP TABLE %s_old", POLICY_TABLE));
|
||||
// Migrate old data to new tables
|
||||
db.execSQL(Utils.fmt("INSERT INTO %s SELECT " +
|
||||
"uid, package_name, policy, until, logging, notification FROM %s_old",
|
||||
POLICY_TABLE, POLICY_TABLE));
|
||||
db.execSQL(Utils.fmt("DROP TABLE %s_old", POLICY_TABLE));
|
||||
|
||||
MagiskManager.get().deleteDatabase("sulog.db");
|
||||
++oldVersion;
|
||||
}
|
||||
if (oldVersion == 2) {
|
||||
db.execSQL(Utils.fmt("UPDATE %s SET time=time*1000", LOG_TABLE));
|
||||
++oldVersion;
|
||||
}
|
||||
if (oldVersion == 3) {
|
||||
db.execSQL(Utils.fmt("CREATE TABLE IF NOT EXISTS %s (key TEXT, value TEXT, PRIMARY KEY(key))", STRINGS_TABLE));
|
||||
++oldVersion;
|
||||
}
|
||||
if (oldVersion == 4) {
|
||||
db.execSQL(Utils.fmt("UPDATE %s SET uid=uid%%100000", POLICY_TABLE));
|
||||
++oldVersion;
|
||||
}
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
onDowngrade(db);
|
||||
MagiskManager.get().deleteDatabase("sulog.db");
|
||||
++oldVersion;
|
||||
}
|
||||
if (oldVersion == 2) {
|
||||
db.execSQL(Utils.fmt("UPDATE %s SET time=time*1000", LOG_TABLE));
|
||||
++oldVersion;
|
||||
}
|
||||
if (oldVersion == 3) {
|
||||
db.execSQL(Utils.fmt("CREATE TABLE IF NOT EXISTS %s (key TEXT, value TEXT, PRIMARY KEY(key))", STRINGS_TABLE));
|
||||
++oldVersion;
|
||||
}
|
||||
if (oldVersion == 4) {
|
||||
db.execSQL(Utils.fmt("UPDATE %s SET uid=uid%%100000", POLICY_TABLE));
|
||||
++oldVersion;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -320,9 +308,4 @@ public class SuDatabaseHelper {
|
||||
}
|
||||
return value;
|
||||
}
|
||||
|
||||
public void flush() {
|
||||
mDb.close();
|
||||
mDb = SQLiteDatabase.openOrCreateDatabase(DB_FILE, null);
|
||||
}
|
||||
}
|
||||
|
@@ -120,7 +120,7 @@ public class Const {
|
||||
public static final String FLASH_SET_BOOT = "boot";
|
||||
|
||||
// others
|
||||
public static final String UPDATE_NOTIFICATION = "notification";
|
||||
public static final String CHECK_UPDATES = "check_update";
|
||||
public static final String UPDATE_CHANNEL = "update_channel";
|
||||
public static final String CUSTOM_CHANNEL = "custom_channel";
|
||||
public static final String BOOT_FORMAT = "boot_format";
|
||||
|
@@ -19,27 +19,29 @@ import android.support.annotation.StringRes;
|
||||
import android.support.design.widget.Snackbar;
|
||||
import android.support.v4.app.ActivityCompat;
|
||||
import android.support.v4.content.ContextCompat;
|
||||
import android.util.Xml;
|
||||
import android.widget.Toast;
|
||||
|
||||
import com.google.gson.Gson;
|
||||
import com.google.gson.reflect.TypeToken;
|
||||
import com.topjohnwu.magisk.MagiskManager;
|
||||
import com.topjohnwu.magisk.R;
|
||||
import com.topjohnwu.magisk.SplashActivity;
|
||||
import com.topjohnwu.magisk.components.SnackbarMaker;
|
||||
import com.topjohnwu.magisk.database.SuDatabaseHelper;
|
||||
import com.topjohnwu.magisk.receivers.DownloadReceiver;
|
||||
import com.topjohnwu.superuser.Shell;
|
||||
import com.topjohnwu.superuser.ShellUtils;
|
||||
import com.topjohnwu.superuser.io.SuFile;
|
||||
import com.topjohnwu.superuser.io.SuFileInputStream;
|
||||
|
||||
import org.xmlpull.v1.XmlPullParser;
|
||||
import org.xmlpull.v1.XmlPullParserException;
|
||||
|
||||
import java.io.File;
|
||||
import java.io.IOException;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collections;
|
||||
import java.util.HashSet;
|
||||
import java.util.List;
|
||||
import java.util.Locale;
|
||||
import java.util.Map;
|
||||
|
||||
public class Utils {
|
||||
|
||||
@@ -50,8 +52,7 @@ public class Utils {
|
||||
}
|
||||
|
||||
public static void uninstallPkg(String pkg) {
|
||||
SuDatabaseHelper.cleanup();
|
||||
Shell.Sync.su("pm uninstall " + pkg);
|
||||
Shell.Sync.su("sudb_clean " + Const.USER_ID, "pm uninstall " + pkg);
|
||||
}
|
||||
|
||||
public static void dlAndReceive(Context context, DownloadReceiver receiver, String link, String filename) {
|
||||
@@ -215,35 +216,71 @@ public class Utils {
|
||||
}
|
||||
|
||||
public static void dumpPrefs() {
|
||||
Gson gson = new Gson();
|
||||
Map<String, ?> prefs = MagiskManager.get().prefs.getAll();
|
||||
prefs.remove("App Restrictions");
|
||||
String json = gson.toJson(prefs, new TypeToken<Map<String, ?>>(){}.getType());
|
||||
Shell.Sync.su(fmt("for usr in /data/user/*; do echo '%s' > ${usr}/%s; done", json, Const.MANAGER_CONFIGS));
|
||||
MagiskManager mm = MagiskManager.get();
|
||||
// Flush prefs to disk
|
||||
mm.prefs.edit().commit();
|
||||
File xml = new File(mm.getFilesDir().getParent() + "/shared_prefs",
|
||||
mm.getPackageName() + "_preferences.xml");
|
||||
Shell.Sync.su(fmt("for usr in /data/user/*; do cat %s > ${usr}/%s; done", xml, Const.MANAGER_CONFIGS));
|
||||
}
|
||||
|
||||
public static void loadPrefs() {
|
||||
SuFile config = new SuFile(fmt("/data/user/%d/%s", Const.USER_ID, Const.MANAGER_CONFIGS), true);
|
||||
List<String> ret = Shell.Sync.su("cat " + config);
|
||||
if (ShellUtils.isValidOutput(ret)) {
|
||||
SharedPreferences.Editor editor = MagiskManager.get().prefs.edit();
|
||||
String json = ret.get(0);
|
||||
Gson gson = new Gson();
|
||||
Map<String, ?> prefMap = gson.fromJson(json, new TypeToken<Map<String, ?>>(){}.getType());
|
||||
editor.clear();
|
||||
for (Map.Entry<String, ?> entry : prefMap.entrySet()) {
|
||||
Object value = entry.getValue();
|
||||
if (value instanceof String) {
|
||||
editor.putString(entry.getKey(), (String) value);
|
||||
} else if (value instanceof Boolean) {
|
||||
editor.putBoolean(entry.getKey(), (boolean) value);
|
||||
} else if (value instanceof Number) {
|
||||
editor.putInt(entry.getKey(), ((Number) value).intValue());
|
||||
if (config.exists()) {
|
||||
MagiskManager mm = MagiskManager.get();
|
||||
SharedPreferences.Editor editor = mm.prefs.edit();
|
||||
try {
|
||||
SuFileInputStream is = new SuFileInputStream(config);
|
||||
XmlPullParser parser = Xml.newPullParser();
|
||||
parser.setFeature(XmlPullParser.FEATURE_PROCESS_NAMESPACES, false);
|
||||
parser.setInput(is, "UTF-8");
|
||||
parser.nextTag();
|
||||
parser.require(XmlPullParser.START_TAG, null, "map");
|
||||
while (parser.next() != XmlPullParser.END_TAG) {
|
||||
if (parser.getEventType() != XmlPullParser.START_TAG)
|
||||
continue;
|
||||
String key = parser.getAttributeValue(null, "name");
|
||||
String value = parser.getAttributeValue(null, "value");
|
||||
switch (parser.getName()) {
|
||||
case "string":
|
||||
parser.require(XmlPullParser.START_TAG, null, "string");
|
||||
editor.putString(key, parser.nextText());
|
||||
parser.require(XmlPullParser.END_TAG, null, "string");
|
||||
break;
|
||||
case "boolean":
|
||||
parser.require(XmlPullParser.START_TAG, null, "boolean");
|
||||
editor.putBoolean(key, Boolean.parseBoolean(value));
|
||||
parser.nextTag();
|
||||
parser.require(XmlPullParser.END_TAG, null, "boolean");
|
||||
break;
|
||||
case "int":
|
||||
parser.require(XmlPullParser.START_TAG, null, "int");
|
||||
editor.putInt(key, Integer.parseInt(value));
|
||||
parser.nextTag();
|
||||
parser.require(XmlPullParser.END_TAG, null, "int");
|
||||
break;
|
||||
case "long":
|
||||
parser.require(XmlPullParser.START_TAG, null, "long");
|
||||
editor.putLong(key, Long.parseLong(value));
|
||||
parser.nextTag();
|
||||
parser.require(XmlPullParser.END_TAG, null, "long");
|
||||
break;
|
||||
case "float":
|
||||
parser.require(XmlPullParser.START_TAG, null, "int");
|
||||
editor.putFloat(key, Float.parseFloat(value));
|
||||
parser.nextTag();
|
||||
parser.require(XmlPullParser.END_TAG, null, "int");
|
||||
break;
|
||||
default:
|
||||
parser.next();
|
||||
}
|
||||
}
|
||||
} catch (IOException | XmlPullParserException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
editor.remove(Const.Key.ETAG_KEY);
|
||||
editor.apply();
|
||||
MagiskManager.get().loadConfig();
|
||||
mm.loadConfig();
|
||||
config.delete();
|
||||
}
|
||||
}
|
||||
|
4
src/main/res/raw/changelog.md
Normal file
4
src/main/res/raw/changelog.md
Normal file
@@ -0,0 +1,4 @@
|
||||
### v5.6.1
|
||||
- Fix database crashes on F2FS with SQLite 3.21.0+
|
||||
- Optimize several settings options
|
||||
- Use native XML for settings migration
|
32
src/main/res/raw/sudb.sh
Normal file
32
src/main/res/raw/sudb.sh
Normal file
@@ -0,0 +1,32 @@
|
||||
sudb_clean() {
|
||||
local USERID=$1
|
||||
local DIR="/sbin/.core/db-${USERID}"
|
||||
umount -l /data/user*/*/*/databases/su.db $DIR $DIR/*
|
||||
rm -rf $DIR
|
||||
[ "$USERID" = "*" ] && rm -f /data/adb/magisk.db
|
||||
}
|
||||
|
||||
sudb_init() {
|
||||
ADB_CONTEXT=`/system/bin/ls -dZ /data/adb | awk '{print $1}'`
|
||||
chcon u:object_r:su_file:s0 /data/adb
|
||||
chmod 777 /data/adb
|
||||
}
|
||||
|
||||
sudb_restore() {
|
||||
chcon $ADB_CONTEXT /data/adb
|
||||
chmod 700 /data/adb
|
||||
}
|
||||
|
||||
sudb_setup() {
|
||||
local USER=$1
|
||||
local USERID=$(($USER / 100000))
|
||||
local DIR=/sbin/.core/db-${USERID}
|
||||
mkdir -p $DIR
|
||||
touch $DIR/magisk.db
|
||||
mount -o bind /data/adb/magisk.db $DIR/magisk.db
|
||||
rm -f /data/adb/magisk.db-journal
|
||||
chcon u:object_r:su_file:s0 $DIR $DIR/*
|
||||
chmod 700 $DIR
|
||||
chown $USER.$USER $DIR
|
||||
chmod 666 $DIR/*
|
||||
}
|
@@ -135,6 +135,8 @@
|
||||
<string name="settings_clear_cache_summary">Löscht die zwischengespeicherten Informationen der Online-Repos. Erzwingt eine Online-Aktualisierung</string>
|
||||
<string name="settings_hide_manager_title">Magisk Manager verbergen</string>
|
||||
<string name="settings_hide_manager_summary">Magisk Manager mit zufälligem Paketnamen neu packen</string>
|
||||
<string name="settings_restore_manager_title">Stelle Magisk Manager wieder her</string>
|
||||
<string name="settings_restore_manager_summary">Stelle Magisk Manager mit ursprünglichem Paket wieder her</string>
|
||||
<string name="language">Sprache</string>
|
||||
<string name="system_default">(Systemstandard)</string>
|
||||
<string name="settings_update">Aktualisierungs-Einstellungen</string>
|
||||
|
@@ -132,9 +132,13 @@
|
||||
<string name="settings_clear_cache_summary">Limpiar la información en caché para los repositorios en línea, fuerza a la aplicación a actualizar en línea</string>
|
||||
<string name="settings_hide_manager_title">Ocultar Magisk Manager</string>
|
||||
<string name="settings_hide_manager_summary">Re-empaquetar Magisk Manager con un nombre de paquete al azar</string>
|
||||
<string name="settings_restore_manager_title">Restaurar Magisk Manager</string>
|
||||
<string name="settings_restore_manager_summary">Restaura Magisk Manager con el paquete original</string>
|
||||
<string name="language">Idioma</string>
|
||||
<string name="system_default">(Idioma del sistema)</string>
|
||||
<string name="settings_update">Ajustes de Actualización</string>
|
||||
<string name="settings_check_update_title">Comprobar Actualizaciones</string>
|
||||
<string name="settings_check_update_summary">Comprobar periódicamente en segundo plano si existen actualizaciones</string>
|
||||
<string name="settings_update_channel_title">Canal de Actualización</string>
|
||||
<string name="settings_update_stable">Estable</string>
|
||||
<string name="settings_update_beta">Beta</string>
|
||||
@@ -184,6 +188,7 @@
|
||||
<string name="requester_summary">Las sesiones de root heredarán las peticiones Namespace</string>
|
||||
<string name="isolate_summary">Cada sesión root tendrá su propia Namespace</string>
|
||||
<string name="android_o_not_support">No es compatible con Android 8.0+</string>
|
||||
<string name="disable_fingerprint">No se establecieron huellas dactilares o no existe soporte del dispositivo</string>
|
||||
|
||||
<!--Superuser-->
|
||||
<string name="su_request_title">Petición de superusuario</string>
|
||||
|
@@ -132,6 +132,8 @@
|
||||
<string name="settings_clear_cache_summary">Bersihkan informasi ter-cache untuk repo online, memaksa apl untuk menyegarkan online</string>
|
||||
<string name="settings_hide_manager_title">Sembunyikan Magisk Manager</string>
|
||||
<string name="settings_hide_manager_summary">Pak ulang Magisk Manager dengan nama paket acak</string>
|
||||
<string name="settings_restore_manager_title">Pulihkan Magisk Manager</string>
|
||||
<string name="settings_restore_manager_summary">Pulihkan Magisk Manager dengan paket asli</string>
|
||||
<string name="language">Bahasa</string>
|
||||
<string name="system_default">(Default Sistem)</string>
|
||||
<string name="settings_update">Pengaturan Pembaruan</string>
|
||||
|
@@ -132,9 +132,13 @@
|
||||
<string name="settings_clear_cache_summary">Svuota la cache delle repository e forza l\'aggiornamento online dell\'app</string>
|
||||
<string name="settings_hide_manager_title">Nascondi Magisk Manager</string>
|
||||
<string name="settings_hide_manager_summary">Reinstalla Magisk Manager con un nome pacchetto casuale</string>
|
||||
<string name="settings_restore_manager_title">Ripristina Magisk Manager</string>
|
||||
<string name="settings_restore_manager_summary">Ripristina Magisk Manager con il nome pacchetto originale</string>
|
||||
<string name="language">Lingua</string>
|
||||
<string name="system_default">(Sistema)</string>
|
||||
<string name="settings_update">Impostazioni aggiornamento</string>
|
||||
<string name="settings_check_update_title">Controlla aggiornamenti</string>
|
||||
<string name="settings_check_update_summary">Controlla automaticamente gli aggiornamenti in background</string>
|
||||
<string name="settings_update_channel_title">Canale di aggiornamento</string>
|
||||
<string name="settings_update_stable">Stabile</string>
|
||||
<string name="settings_update_beta">Beta</string>
|
||||
@@ -183,6 +187,7 @@
|
||||
<string name="requester_summary">Le sessioni di root erediteranno il namespace del loro richiedente</string>
|
||||
<string name="isolate_summary">Ogni sessione di root avrà il suo namespace isolato</string>
|
||||
<string name="android_o_not_support">Non è supportato da Android 8.0+</string>
|
||||
<string name="disable_fingerprint">Non è presente alcuna impronta o il dispositivo non è supportato</string>
|
||||
|
||||
<!--Superuser-->
|
||||
<string name="su_request_title">Richiesta Superuser</string>
|
||||
|
@@ -2,10 +2,10 @@
|
||||
<!--Universal-->
|
||||
|
||||
<!--Welcome Activity-->
|
||||
<string name="modules">Moduliai</string>
|
||||
<string name="modules">Papildiniai</string>
|
||||
<string name="downloads">Atsisiuntimai</string>
|
||||
<string name="superuser">Super Naudotojas</string>
|
||||
<string name="log">Surašyti (Log)</string>
|
||||
<string name="log">Surašymai</string>
|
||||
<string name="settings">Nustatymai</string>
|
||||
<string name="install">Instaliuoti</string>
|
||||
|
||||
@@ -30,21 +30,21 @@
|
||||
<string name="install_magisk_title">Naujausia versija: %1$s</string>
|
||||
<string name="uninstall">Ištrinti</string>
|
||||
<string name="uninstall_magisk_title">Ištrinti Magisk</string>
|
||||
<string name="uninstall_magisk_msg">Visi moduliai bus išjungti/panaikinti. Roo bus panaikintas ir duomenys bus potencialiai užšifruoti, jeigu jie nėra užšifruoti.</string>
|
||||
<string name="uninstall_magisk_msg">Visi papildiniai bus išjungti/panaikinti. Root bus panaikintas. Jei duomenys nėra užšifruoti, yra galimybė, kad jie taps užšifruotais..</string>
|
||||
<string name="update">Atnaujinti %1$s</string>
|
||||
|
||||
<!--Module Fragment-->
|
||||
<string name="no_info_provided">(Nėra informacijos)</string>
|
||||
<string name="no_modules_found">Modulių nesurasta</string>
|
||||
<string name="update_file_created">Perkrovus sistemą modulis bus atnaulintas</string>
|
||||
<string name="remove_file_created">Perkrovus sistemą modulis bus panaikintas</string>
|
||||
<string name="remove_file_deleted">Perkrovus sistemą modulis nebus panaikintas</string>
|
||||
<string name="disable_file_created">Perkrovus sistemą modulis bus išjungtas, bet ne panaikintas</string>
|
||||
<string name="disable_file_removed">Perkrovus sistemą modulis bus įjungtas</string>
|
||||
<string name="no_modules_found">Papildinių nesurasta</string>
|
||||
<string name="update_file_created">Perkrovus sistemą papildinys bus atnaujintas</string>
|
||||
<string name="remove_file_created">Perkrovus sistemą papildinys bus panaikintas</string>
|
||||
<string name="remove_file_deleted">Perkrovus sistemą papildinys nebus panaikintas</string>
|
||||
<string name="disable_file_created">Perkrovus sistemą papildinys bus išjungtas, bet ne panaikintas</string>
|
||||
<string name="disable_file_removed">Perkrovus sistemą papildinys bus įjungtas</string>
|
||||
<string name="author">Sukūrė %1$s</string>
|
||||
<string name="reboot_recovery">Perkrauti į Recovery</string>
|
||||
<string name="reboot_bootloader">Perkrauti į Bootloader</string>
|
||||
<string name="reboot_download">Perkraukite, į Download režimą</string>
|
||||
<string name="reboot_download">Perkrauti į Download režimą</string>
|
||||
|
||||
<!--Repo Fragment-->
|
||||
<string name="update_available">Galimas atnaujinimas</string>
|
||||
@@ -52,14 +52,14 @@
|
||||
<string name="not_installed">Ne instaliuota</string>
|
||||
<string name="updated_on">Atnaujinta: %1$s</string>
|
||||
<string name="sorting_order">Išdėliojimo tvarka</string>
|
||||
<string name="sort_by_name">Išdėlioti pagal pavadinimą</string>
|
||||
<string name="sort_by_update">Išdėlioti pagal paskutinį atnaujinimą</string>
|
||||
<string name="sort_by_name">Išdėlioti pagal pavadinimą (A-Z)</string>
|
||||
<string name="sort_by_update">Išdėlioti pagal atnaujinimo datą (Naujausi-Seniausi)</string>
|
||||
|
||||
<!--Log Fragment-->
|
||||
<string name="menuSaveLog">Išsauguti surašymus (log)</string>
|
||||
<string name="menuSaveLog">Išsaugoti surašymus</string>
|
||||
<string name="menuReload">Iš naujo</string>
|
||||
<string name="menuClearLog">Išvalyti surašymus (log)</string>
|
||||
<string name="logs_cleared">Surašymas (log) sėkmingai užrašytas</string>
|
||||
<string name="menuClearLog">Išvalyti surašymus</string>
|
||||
<string name="logs_cleared">Surašymas sėkmingai užrašytas</string>
|
||||
<string name="log_is_empty">Surašymas yra tuščias</string>
|
||||
<string name="logs_save_failed">Nesugebėjome įrašyti surašymų į SD kortelę:</string>
|
||||
|
||||
@@ -69,7 +69,7 @@
|
||||
<string name="translators">Vv2233Bb</string>
|
||||
<string name="app_version">Versija</string>
|
||||
<string name="app_source_code">Prisidėkite</string>
|
||||
<string name="donation">Auka</string>
|
||||
<string name="donation">Paaukoti</string>
|
||||
<string name="app_translators">Vertėjai</string>
|
||||
<string name="support_thread">Mūsų XDA puslapis</string>
|
||||
|
||||
@@ -87,7 +87,7 @@
|
||||
<string name="downloading_toast">Atsisiunčiamas %1$s</string>
|
||||
<string name="magisk_update_title">Naujas Magisk atnaujinimas egzistuoja!</string>
|
||||
<string name="settings_reboot_toast">Nustatymų įgalinimui prašome perkrauti telefoną</string>
|
||||
<string name="release_notes">Šios versijos naujos įpatybės</string>
|
||||
<string name="release_notes">Šios versijos pakeitimai</string>
|
||||
<string name="repo_cache_cleared">Repo failai išvalyti</string>
|
||||
<string name="safetyNet_hide_notice">Ši programėlė naudoja SafetyNet\nMagiskHide tai automatiškai sutvarko</string>
|
||||
<string name="process_error">Proceso klaida</string>
|
||||
@@ -143,7 +143,7 @@
|
||||
<string name="settings_boot_format_title">Boot failo formatas</string>
|
||||
<string name="settings_boot_format_summary">Pasirinkite boot failo formatą.\nPasirinkite .img įdiegimui per fastboot/download; Pasirinkite .img.tar įdiegimui per ODIN.</string>
|
||||
<string name="settings_core_only_title">Magisk Pagrindinis režimas</string>
|
||||
<string name="settings_core_only_summary">Įgalintos bus tik pagrindines funkcijos, visi moduliai bus išjungti. MagiskSU, Magisk Hide ir Sistemos pedejėjai liks įgalinti</string>
|
||||
<string name="settings_core_only_summary">Įgalintos bus tik pagrindines funkcijos, visi papildiniai bus išjungti. MagiskSU, Magisk Hide ir Sistemos pedejėjai liks įgalinti</string>
|
||||
<string name="settings_magiskhide_summary">Paslėpti Magisk nuo įvairių susekimų</string>
|
||||
<string name="settings_hosts_title">Sistemos padejėjai</string>
|
||||
<string name="settings_hosts_summary">Sistemų padejėjų įgalinimas Adblock programėlėms</string>
|
||||
|
@@ -135,7 +135,9 @@
|
||||
<string name="settings_clear_cache_summary">Wymusza na aplikacji odświeżenie online repozytorium</string>
|
||||
<string name="settings_hide_manager_title">Ukryj Magisk Manager</string>
|
||||
<string name="settings_hide_manager_summary">Przepakowanie Magisk Manager z losową nazwą pakietu</string>
|
||||
<string name="language">Język</string>
|
||||
<string name="settings_restore_manager_title">Przywróć Magisk Manager</string>
|
||||
<string name="settings_restore_manager_summary">Przywróć oryginalną paczkę Magisk Manager</string>
|
||||
<string name="language">Język</string>
|
||||
<string name="system_default">(Domyślny Systemu)</string>
|
||||
<string name="settings_update">Aktualizacja Ustawień</string>
|
||||
<string name="settings_update_channel_title">Kanał Aktualizacji</string>
|
||||
|
@@ -124,6 +124,8 @@
|
||||
<string name="settings_clear_cache_summary">Ștergeți informațiile memorate în cache, forțează actualizarea aplicației online</string>
|
||||
<string name="settings_hide_manager_title">Ascundeţi Magisk Manager</string>
|
||||
<string name="settings_hide_manager_summary">Reîmpachetare Magisk Manager cu nume de pachet aleatoriu</string>
|
||||
<string name="settings_restore_manager_title">Restabilire Magisk Manager</string>
|
||||
<string name="settings_restore_manager_summary">Restabilire Magisk Manager cu pachetul original</string>
|
||||
<string name="language">Limbă</string>
|
||||
<string name="system_default">(Implicit)</string>
|
||||
<string name="settings_update">Setări actualizare</string>
|
||||
@@ -155,6 +157,8 @@
|
||||
<string name="request_timeout_summary">%1$s secunde</string>
|
||||
<string name="settings_su_reauth_title">Reautentificare după actualizare</string>
|
||||
<string name="settings_su_reauth_summary">Reautentificare permisiuni pentru superuser după o actualizare a aplicației</string>
|
||||
<string name="settings_su_fingerprint_title">Activați autentificarea cu amprenta digitală</string>
|
||||
<string name="settings_su_fingerprint_summary">Utilizați scanerul de amprentă pentru a permite solicitările superuser</string>
|
||||
|
||||
<string name="multiuser_mode">Mod Multiutilizator</string>
|
||||
<string name="settings_owner_only">Numai proprietarul dispozitivului</string>
|
||||
@@ -201,6 +205,7 @@
|
||||
<string name="su_revoke_msg">Confirmați revocarea drepturilor pentru %1$s?</string>
|
||||
<string name="toast">Mesaj</string>
|
||||
<string name="none">Nimic</string>
|
||||
<string name="auth_fail">Autentificare eşuată</string>
|
||||
|
||||
<!--Superuser logs-->
|
||||
<string name="pid">PID:\u0020</string>
|
||||
|
@@ -16,24 +16,24 @@
|
||||
<string name="magisk_version_error">Magisk не установлен</string>
|
||||
<string name="checking_for_updates">Проверка обновлений…</string>
|
||||
<string name="magisk_update_available">Доступен Magisk v%1$s!</string>
|
||||
<string name="invalid_update_channel">Неверный канал обновлений</string>
|
||||
<string name="invalid_update_channel">Некорректный канал обновлений</string>
|
||||
<string name="safetyNet_check_text">Проверить статус SafetyNet</string>
|
||||
<string name="checking_safetyNet_status">Проверка статуса SafetyNet…</string>
|
||||
<string name="safetyNet_check_success">Результат проверки SafetyNet</string>
|
||||
<string name="safetyNet_api_error">Ошибка SafetyNet API</string>
|
||||
<string name="safetyNet_network_loss">Нет подключения к сети</string>
|
||||
<string name="safetyNet_service_disconnected">Служба была остановлена</string>
|
||||
<string name="safetyNet_res_invalid">Неверный ответ</string>
|
||||
<string name="safetyNet_res_invalid">Некорректный ответ</string>
|
||||
|
||||
<!--Install Fragment-->
|
||||
<string name="advanced_settings_title">Расширенные настройки</string>
|
||||
<string name="advanced_settings_title">Расширенные опции</string>
|
||||
<string name="keep_force_encryption">Сохранить шифрование</string>
|
||||
<string name="keep_dm_verity">Сохранить AVB 2.0/dm-verity</string>
|
||||
<string name="current_magisk_title">Установлена версия: %1$s</string>
|
||||
<string name="install_magisk_title">Последняя версия: %1$s</string>
|
||||
<string name="uninstall">Удаление</string>
|
||||
<string name="uninstall_magisk_title">Удаление Magisk</string>
|
||||
<string name="uninstall_magisk_msg">Все модули будут отключены/удалены. Root-права будут удалены. Данные будут зашифрованы.</string>
|
||||
<string name="uninstall_magisk_msg">Все модули будут отключены/удалены. Root-права будут удалены. Шифрование будет активировано.</string>
|
||||
<string name="update">Обновить %1$s</string>
|
||||
|
||||
<!--Module Fragment-->
|
||||
@@ -53,6 +53,10 @@
|
||||
<string name="update_available">Доступно обновление</string>
|
||||
<string name="installed">Установлены</string>
|
||||
<string name="not_installed">Не установлены</string>
|
||||
<string name="updated_on">Обновлено: %1$s</string>
|
||||
<string name="sorting_order">Сортировка</string>
|
||||
<string name="sort_by_name">По имени</string>
|
||||
<string name="sort_by_update">По дате обновления</string>
|
||||
|
||||
<!--Log Fragment-->
|
||||
<string name="menuSaveLog">Сохранить лог</string>
|
||||
@@ -65,12 +69,12 @@
|
||||
<!--About Activity-->
|
||||
<string name="about">О приложении</string>
|
||||
<string name="app_changelog">Список изменений</string>
|
||||
<string name="translators">Displax</string>
|
||||
<string name="translators">Displax [4PDA]</string>
|
||||
<string name="app_version">Версия</string>
|
||||
<string name="app_source_code">Исходный код</string>
|
||||
<string name="donation">Поддержать проект</string>
|
||||
<string name="app_translators">Переводчики</string>
|
||||
<string name="support_thread">Страница поддержки</string>
|
||||
<string name="support_thread">Домашняя страница</string>
|
||||
|
||||
<!--Toasts, Dialogs-->
|
||||
<string name="permissionNotGranted">Требуется разрешение на запись во внешнее хранилище.</string>
|
||||
@@ -88,7 +92,7 @@
|
||||
<string name="settings_reboot_toast">Для применения настроек перезагрузите устройство</string>
|
||||
<string name="release_notes">О версии</string>
|
||||
<string name="repo_cache_cleared">Кэш репозитория очищен</string>
|
||||
<string name="safetyNet_hide_notice">Приложение использует SafetyNet.\nПо умолчанию обработано MagiskHide.</string>
|
||||
<string name="safetyNet_hide_notice">Приложение использует SafetyNet API.\nПо умолчанию добавлено в MagiskHide.</string>
|
||||
<string name="process_error">Ошибка обработки</string>
|
||||
<string name="internal_storage">Расположение архива:\n[Внутреннее Хранилище]%1$s</string>
|
||||
<string name="zip_download_title">Загрузка</string>
|
||||
@@ -98,54 +102,58 @@
|
||||
<string name="manager_update_title">Доступно обновление Magisk Manager!</string>
|
||||
<string name="manager_download_install">Нажмите для установки</string>
|
||||
<string name="dtbo_patched_title">DTBO пропатчен!</string>
|
||||
<string name="dtbo_patched_reboot">Magisk Manager пропатчил dtbo.img. Перезагрузитесь.</string>
|
||||
<string name="dtbo_patched_reboot">Magisk Manager пропатчил dtbo.img. Перезагрузите устройство.</string>
|
||||
<string name="magisk_updates">Обновления Magisk</string>
|
||||
<string name="flashing">Прошивка…</string>
|
||||
<string name="hide_manager_toast">Скрытие Magisk Manager…</string>
|
||||
<string name="hide_manager_toast2">Может занять некоторое время…</string>
|
||||
<string name="hide_manager_fail_toast">Скрытие Magisk Manager неудачно!</string>
|
||||
<string name="download_zip_only">Только загрузка архива</string>
|
||||
<string name="patch_boot_file">Пропатчить образ ядра</string>
|
||||
<string name="direct_install">Прямая установка (рекомендуется)</string>
|
||||
<string name="install_second_slot">Установка во Второй Слот (после OTA)</string>
|
||||
<string name="download_zip_only">Загрузка установочного ZIP</string>
|
||||
<string name="patch_boot_file">Пропатчить образ ядра (boot.img)</string>
|
||||
<string name="direct_install">Прямая установка (Рекомендуется)</string>
|
||||
<string name="install_second_slot">Установка во Второй Слот (После OTA)</string>
|
||||
<string name="select_method">Выбор способа</string>
|
||||
<string name="no_boot_file_patch_support">Целевая версия Magisk не поддерживает патчинг boot-образов</string>
|
||||
<string name="boot_file_patch_msg">Выберите файл ядра (boot), .img либо .img.tar формата</string>
|
||||
<string name="complete_uninstall">Удалить</string>
|
||||
<string name="restore_img">Восстановить образы</string>
|
||||
<string name="boot_file_patch_msg">Выберите файл ядра (boot), *.img либо *.img.tar формата</string>
|
||||
<string name="complete_uninstall">Полное удаление</string>
|
||||
<string name="restore_img">Восстановить разделы</string>
|
||||
<string name="uninstall_app">Удалить приложение</string>
|
||||
<string name="restore_done">Восстановление завершено!</string>
|
||||
<string name="restore_fail">Резервная копия отсутствует!</string>
|
||||
<string name="uninstall_toast">Удаление Magisk Manager в течении 5 секунд. Выполните перезагрузку.</string>
|
||||
<string name="uninstall_toast">Удаление Magisk Manager в течении 5 секунд. Перезагрузите устройство.</string>
|
||||
<string name="proprietary_title">Загрузка SafetyNet</string>
|
||||
<string name="proprietary_notice">Magisk Manager — свободно распространяемый продукт, он не содержит собственный код SafetyNet API от Google.\n\nРазрешить Magisk Manager загрузить расширение (содержит GoogleApiClient) для проверки SafetyNet?</string>
|
||||
<string name="su_db_corrupt">База данных SU повреждена, будет создана новая</string>
|
||||
|
||||
<!--Settings Activity -->
|
||||
<string name="settings_general_category">Основные</string>
|
||||
<string name="settings_dark_theme_title">Темная тема</string>
|
||||
<string name="settings_dark_theme_title">Тёмная тема</string>
|
||||
<string name="settings_dark_theme_summary">Включить темное оформление</string>
|
||||
<string name="settings_notification_title">Уведомление об обновлении</string>
|
||||
<string name="settings_notification_summary">Показывать уведомления о выходе новой версии</string>
|
||||
<string name="settings_clear_cache_title">Очистка кэша репозитория</string>
|
||||
<string name="settings_clear_cache_summary">Очистить сохранённую информацию о репозиториях. Список будет обновлен принудительно.</string>
|
||||
<string name="settings_hide_manager_title">Скрыть Magisk Manager</string>
|
||||
<string name="settings_clear_cache_summary">Очистить сохранённую информацию о репозитории. Будет обновлено принудительно</string>
|
||||
<string name="settings_hide_manager_title">Скрытие Magisk Manager</string>
|
||||
<string name="settings_hide_manager_summary">Пересобрать Magisk Manager со случайным именем пакета</string>
|
||||
<string name="settings_restore_manager_title">Восстановление Magisk Manager</string>
|
||||
<string name="settings_restore_manager_summary">Восстановить Magisk Manager с оригинальным именем пакета</string>
|
||||
<string name="language">Язык</string>
|
||||
<string name="system_default">По умолчанию (системный)</string>
|
||||
<string name="system_default">По умолчанию (Системный)</string>
|
||||
<string name="settings_update">Настройки обновления</string>
|
||||
<string name="settings_check_update_title">Проверка обновлений</string>
|
||||
<string name="settings_check_update_summary">Периодически проверять обновления в фоне</string>
|
||||
<string name="settings_update_channel_title">Источник обновлений</string>
|
||||
<string name="settings_update_stable">Стабильный канал</string>
|
||||
<string name="settings_update_beta">Beta канал</string>
|
||||
<string name="settings_update_custom">Сторонний канал</string>
|
||||
<string name="settings_update_custom_msg">Вставьте ссылку</string>
|
||||
<string name="settings_boot_format_title">Формат образа ядра</string>
|
||||
<string name="settings_boot_format_summary">Выберите формат патченого образа ядра.\n.img - для прошивки через fastboot/download режим.\n.img.tar - для прошивки через ODIN.</string>
|
||||
<string name="settings_core_only_title">Режим Magisk Core</string>
|
||||
<string name="settings_core_only_summary">Включает возможности только Core уровня, модули не будут загружены. MagiskSU, MagiskHide и внесистемные хосты останутся активными.</string>
|
||||
<string name="settings_magiskhide_summary">Скрыть Magisk от различных проверок</string>
|
||||
<string name="settings_update_custom_msg">Укажите ссылку</string>
|
||||
<string name="settings_boot_format_title">Тип образа ядра</string>
|
||||
<string name="settings_boot_format_summary">Выберите тип патченого образа ядра:\n*.img - для прошивки через fastboot/download режимы\n*.img.tar - для прошивки через ODIN (Samsung)</string>
|
||||
<string name="settings_core_only_title">Magisk Core режим</string>
|
||||
<string name="settings_core_only_summary">Включить только основные (Core) возможности. Модули не будут загружены. MagiskSU, MagiskHide и внесистемные хосты останутся активными</string>
|
||||
<string name="settings_magiskhide_summary">Скрывать Magisk от различных проверок</string>
|
||||
<string name="settings_hosts_title">Внесистемные хосты</string>
|
||||
<string name="settings_hosts_summary">Поддержка внесистемных хостов для приложений блокировки рекламы</string>
|
||||
<string name="settings_hosts_summary">Поддержка внесистемных хостов для приложений, блокирующих рекламу</string>
|
||||
|
||||
<string name="settings_su_app_adb">Приложения и ADB</string>
|
||||
<string name="settings_su_app">Только приложения</string>
|
||||
@@ -157,30 +165,33 @@
|
||||
<string name="settings_su_request_60">60 секунд</string>
|
||||
<string name="superuser_access">Уровень доступа</string>
|
||||
<string name="auto_response">Автоматический ответ</string>
|
||||
<string name="request_timeout">Период запроса</string>
|
||||
<string name="request_timeout">Ожидание ответа</string>
|
||||
<string name="superuser_notification">Уведомление Суперпользователя</string>
|
||||
<string name="request_timeout_summary">%1$s секунд</string>
|
||||
<string name="settings_su_reauth_title">Повторная аутентификация</string>
|
||||
<string name="settings_su_reauth_summary">Повторный запрос прав Суперпользователя после обновления приложения</string>
|
||||
<string name="settings_su_reauth_summary">Повторный запрос прав Суперпользователя после обновления приложений</string>
|
||||
<string name="settings_su_fingerprint_title">Биометрическая аутентификация</string>
|
||||
<string name="settings_su_fingerprint_summary">Использовать дактилоскопический сканер для подтверждения запросов Суперпользователя</string>
|
||||
|
||||
<string name="multiuser_mode">Многопользовательский режим</string>
|
||||
<string name="settings_owner_only">Только владелец</string>
|
||||
<string name="settings_owner_manage">Регулировка владельцем</string>
|
||||
<string name="settings_user_independent">Независимый пользователь</string>
|
||||
<string name="settings_user_independent">Правила пользователей</string>
|
||||
<string name="owner_only_summary">Только владелец имеет Root-доступ</string>
|
||||
<string name="owner_manage_summary">Только владелец может управлять root-доступом и обрабатывать запросы на предоставление</string>
|
||||
<string name="user_indepenent_summary">Каждый пользователь имеет свои собственные правила root-доступа</string>
|
||||
<string name="multiuser_hint_owner_request">Запрос был отправлен владельцу устройства. Пожалуйста, переключитесь на профиль владельца и предоставьте разрешение</string>
|
||||
<string name="owner_manage_summary">Только владелец может управлять Root-доступом и обрабатывать запросы</string>
|
||||
<string name="user_indepenent_summary">Каждый пользователь имеет свои собственные правила Root-доступа</string>
|
||||
<string name="multiuser_hint_owner_request">Запрос отправлен владельцу устройства. Переключитесь на профиль владельца для обработки запроса</string>
|
||||
|
||||
<string name="mount_namespace_mode">Режим монтирования пространства имён</string>
|
||||
<string name="settings_ns_global">Глобальное пространство имён</string>
|
||||
<string name="settings_ns_requester">Наследуемое пространство имён</string>
|
||||
<string name="settings_ns_isolate">Изолированное пространство имён</string>
|
||||
<string name="global_summary">Все сеансы Суперпользователя используют глобальное пространство имён</string>
|
||||
<string name="requester_summary">Сессии Суперпользователя наследуют пространство имен запрашивающего</string>
|
||||
<string name="isolate_summary">Каждая сессия Суперпользователя будет иметь собственное изолированное пространство имен</string>
|
||||
<string name="mount_namespace_mode">Настройка именных пространств</string>
|
||||
<string name="settings_ns_global">Общее именное пространство</string>
|
||||
<string name="settings_ns_requester">Наследуемое именное пространство</string>
|
||||
<string name="settings_ns_isolate">Изолированное именное пространство</string>
|
||||
<string name="global_summary">Сессии Суперпользователя используют общее именное пространство</string>
|
||||
<string name="requester_summary">Сессии Суперпользователя наследуют именное пространство запрашивающего</string>
|
||||
<string name="isolate_summary">Сессии Суперпользователя будут иметь изолированные именные пространства</string>
|
||||
<string name="android_o_not_support">Не поддерживается в Android 8.0+</string>
|
||||
|
||||
<string name="disable_fingerprint">Не поддерживается устройством или не заданы опечатки</string>
|
||||
|
||||
<!--Superuser-->
|
||||
<string name="su_request_title">Запрос прав Суперпользователя</string>
|
||||
<string name="deny_with_str">Отказать %1$s</string>
|
||||
@@ -189,7 +200,7 @@
|
||||
<string name="grant">Предоставить</string>
|
||||
<string name="su_warning">Предоставить полный доступ к устройству.\nЕсли не уверены, что желаете продолжить, отклоните данное действие!</string>
|
||||
<string name="forever">Навсегда</string>
|
||||
<string name="once">Единожды</string>
|
||||
<string name="once">Сейчас</string>
|
||||
<string name="tenmin">10 мин.</string>
|
||||
<string name="twentymin">20 мин.</string>
|
||||
<string name="thirtymin">30 мин.</string>
|
||||
@@ -201,13 +212,14 @@
|
||||
<string name="su_snack_deny">%1$s отказано в правах Суперпользователя</string>
|
||||
<string name="su_snack_notif_on">Уведомления для %1$s включены</string>
|
||||
<string name="su_snack_notif_off">Уведомления для %1$s отключены</string>
|
||||
<string name="su_snack_log_on">История событий для %1$s включена</string>
|
||||
<string name="su_snack_log_off">История событий для %1$s отключена</string>
|
||||
<string name="su_snack_revoke">Права для %1$s отозваны</string>
|
||||
<string name="su_revoke_title">Отозвать?</string>
|
||||
<string name="su_revoke_msg">Подтвердить отзыв прав для %1$s?</string>
|
||||
<string name="su_snack_log_on">Логирование для %1$s включено</string>
|
||||
<string name="su_snack_log_off">Логирование для %1$s отключено</string>
|
||||
<string name="su_snack_revoke">Настройки для %1$s сброшены</string>
|
||||
<string name="su_revoke_title">Сброс настроек</string>
|
||||
<string name="su_revoke_msg">Сбросить настройки для %1$s?</string>
|
||||
<string name="toast">Всплывающее уведомление</string>
|
||||
<string name="none">Ничего</string>
|
||||
<string name="auth_fail">Ошибка аутентификации</string>
|
||||
|
||||
<!--Superuser logs-->
|
||||
<string name="pid">PID:\u0020</string>
|
||||
|
@@ -130,10 +130,14 @@
|
||||
<string name="settings_clear_cache_title">Repo Önbelleğini Temizle</string>
|
||||
<string name="settings_clear_cache_summary">Çevrimiçi repolar için önbellek bilgilerini temizle, uygulamayı çevrimiçi yenilemeye zorla</string>
|
||||
<string name="settings_hide_manager_title">Magisk Manager\'ı Gizle</string>
|
||||
<string name="settings_hide_manager_summary">Rastgele seçilen bir paket adı ile Magisk Manager yeniden paketlenecek</string>
|
||||
<string name="settings_hide_manager_summary">Rastgele paket adı ile Magisk Manager\'ı yeniden paketle</string>
|
||||
<string name="settings_restore_manager_title">Magisk Manager\'ı Geri Yükle</string>
|
||||
<string name="settings_restore_manager_summary">Orijinal paket adı ile Magisk Manager\'ı geri yükle</string>
|
||||
<string name="language">Dil</string>
|
||||
<string name="system_default">(Sistem Varsayılanı)</string>
|
||||
<string name="settings_update">Güncelleme Ayarları</string>
|
||||
<string name="settings_check_update_title">Güncellemeleri denetle</string>
|
||||
<string name="settings_check_update_summary">Arka planda düzenli olarak güncellemeleri denetle</string>
|
||||
<string name="settings_update_channel_title">Güncelleme Kanalı</string>
|
||||
<string name="settings_update_stable">Kararlı</string>
|
||||
<string name="settings_update_beta">Beta</string>
|
||||
@@ -160,8 +164,8 @@
|
||||
<string name="request_timeout">İstek Zaman Aşımı</string>
|
||||
<string name="superuser_notification">Yetkili Kullanıcı Bildirimi</string>
|
||||
<string name="request_timeout_summary">%1$s saniye</string>
|
||||
<string name="settings_su_reauth_title">Yükseltmeden sonra yeniden kimlik doğrulama</string>
|
||||
<string name="settings_su_reauth_summary">Uygulama yükseltmeleri sonrasında yetkili kullanıcı izinlerini yeniden doğrulama</string>
|
||||
<string name="settings_su_reauth_title">Yükseltmeden sonra yeniden kimlik doğrula</string>
|
||||
<string name="settings_su_reauth_summary">Uygulama yükseltmeleri sonrasında yetkili kullanıcı izinlerini yeniden doğrula</string>
|
||||
<string name="settings_su_fingerprint_title">Parmak İzi Kimlik Doğrulamayı Etkinleştir</string>
|
||||
<string name="settings_su_fingerprint_summary">Yetkili kullanıcı isteklerine izin vermek için parmak izi tarayıcısını kullan</string>
|
||||
|
||||
@@ -182,6 +186,7 @@
|
||||
<string name="requester_summary">Kök oturumları, istekte bulunanın ad alanını devralır</string>
|
||||
<string name="isolate_summary">Her bir kök oturumunun kendi izole ad alanı olacaktır</string>
|
||||
<string name="android_o_not_support">Android 8.0 ve üzerinde desteklenmiyor</string>
|
||||
<string name="disable_fingerprint">Parmak izi ayarlanmadı veya cihaz desteği yok</string>
|
||||
|
||||
<!--Superuser-->
|
||||
<string name="su_request_title">Yetkili Kullanıcı İsteği</string>
|
||||
|
@@ -14,7 +14,7 @@
|
||||
<string name="checking_for_updates">正在检查更新…</string>
|
||||
<string name="magisk_update_available">Magisk 可更新到 v%1$s!</string>
|
||||
<string name="invalid_update_channel">无效的更新通道</string>
|
||||
<string name="safetyNet_check_text">点击启动 SafetyNet 检查</string>
|
||||
<string name="safetyNet_check_text">点按启动 SafetyNet 检查</string>
|
||||
<string name="checking_safetyNet_status">正在检查 SafetyNet 状态…</string>
|
||||
<string name="safetyNet_check_success">SafetyNet 检查成功</string>
|
||||
<string name="safetyNet_api_error">SafetyNet API 错误</string>
|
||||
@@ -59,7 +59,7 @@
|
||||
<string name="menuSaveLog">保存日志</string>
|
||||
<string name="menuReload">刷新</string>
|
||||
<string name="menuClearLog">清除日志</string>
|
||||
<string name="logs_cleared">日志已成功清除</string>
|
||||
<string name="logs_cleared">日志已清除</string>
|
||||
<string name="log_is_empty">日志为空</string>
|
||||
<string name="logs_save_failed">无法将日志写入内置存储:</string>
|
||||
|
||||
@@ -97,7 +97,7 @@
|
||||
<string name="zip_process_title">正在处理</string>
|
||||
<string name="zip_process_msg">正在处理 zip 文件…</string>
|
||||
<string name="manager_update_title">Magisk Manager 有更新!</string>
|
||||
<string name="manager_download_install">点击以下载并安装</string>
|
||||
<string name="manager_download_install">点按以下载并安装</string>
|
||||
<string name="dtbo_patched_title">已修补 DTBO!</string>
|
||||
<string name="dtbo_patched_reboot">Magisk Manager 为 dtbo 分区进行了修补,请立即重新启动</string>
|
||||
<string name="magisk_updates">Magisk 更新</string>
|
||||
@@ -124,17 +124,21 @@
|
||||
|
||||
<!--Settings Activity -->
|
||||
<string name="settings_general_category">常规</string>
|
||||
<string name="settings_dark_theme_title">深色主题</string>
|
||||
<string name="settings_dark_theme_summary">使用深色主题</string>
|
||||
<string name="settings_dark_theme_title">暗色主题</string>
|
||||
<string name="settings_dark_theme_summary">使用暗色主题</string>
|
||||
<string name="settings_notification_title">更新通知</string>
|
||||
<string name="settings_notification_summary">当有新版本时显示更新通知</string>
|
||||
<string name="settings_clear_cache_title">清除仓库缓存</string>
|
||||
<string name="settings_clear_cache_summary">清除已缓存的在线仓库信息,强制刷新在线数据</string>
|
||||
<string name="settings_hide_manager_title">隐藏 Magisk Manager</string>
|
||||
<string name="settings_hide_manager_summary">用随机包名重新安装 Magisk Manager</string>
|
||||
<string name="settings_restore_manager_title">还原 Magisk Manager</string>
|
||||
<string name="settings_restore_manager_summary">用原安装包还原 Magisk Manager</string>
|
||||
<string name="language">语言</string>
|
||||
<string name="system_default">(系统默认)</string>
|
||||
<string name="settings_update">更新设定</string>
|
||||
<string name="settings_check_update_title">检查更新</string>
|
||||
<string name="settings_check_update_summary">在后台定期检查更新</string>
|
||||
<string name="settings_update_channel_title">更新通道</string>
|
||||
<string name="settings_update_stable">稳定版</string>
|
||||
<string name="settings_update_beta">测试版</string>
|
||||
@@ -163,6 +167,8 @@
|
||||
<string name="request_timeout_summary">%1$s 秒</string>
|
||||
<string name="settings_su_reauth_title">更新后重新认证</string>
|
||||
<string name="settings_su_reauth_summary">应用更新后重新认证超级用户权限</string>
|
||||
<string name="settings_su_fingerprint_title">启用指纹验证</string>
|
||||
<string name="settings_su_fingerprint_summary">使用指纹识别来允许超级用户请求</string>
|
||||
|
||||
<string name="multiuser_mode">多用户模式</string>
|
||||
<string name="settings_owner_only">仅设备所有者</string>
|
||||
@@ -181,6 +187,7 @@
|
||||
<string name="requester_summary">ROOT 会话继承原程序的命名空间</string>
|
||||
<string name="isolate_summary">每一个 ROOT 会话使用自己独立的命名空间</string>
|
||||
<string name="android_o_not_support">不支持 Android 8.0+</string>
|
||||
<string name="disable_fingerprint">没有设置指纹或设备不支持</string>
|
||||
|
||||
<!--Superuser-->
|
||||
<string name="su_request_title">超级用户请求</string>
|
||||
@@ -209,6 +216,7 @@
|
||||
<string name="su_revoke_msg">确认撤销 %1$s 的权限?</string>
|
||||
<string name="toast">消息提示</string>
|
||||
<string name="none">无</string>
|
||||
<string name="auth_fail">验证失败</string>
|
||||
|
||||
<!--Superuser logs-->
|
||||
<string name="pid">PID:\u0020</string>
|
||||
|
@@ -217,5 +217,10 @@
|
||||
<string name="settings_su_fingerprint_title">啟用指紋認證</string>
|
||||
<string name="settings_su_fingerprint_summary">用指紋辨識來允許超級用戶權限</string>
|
||||
<string name="auth_fail">認證失敗</string>
|
||||
<string name="settings_restore_manager_title">還原 Magisk Manager</string>
|
||||
<string name="settings_restore_manager_summary">以原安裝包還原 Magisk Manager</string>
|
||||
<string name="settings_check_update_title">檢查更新</string>
|
||||
<string name="settings_check_update_summary">在背景定期檢查更新</string>
|
||||
<string name="disable_fingerprint">沒有指紋加入或是裝置不支援</string>
|
||||
|
||||
</resources>
|
||||
|
@@ -140,6 +140,8 @@
|
||||
<string name="language">Language</string>
|
||||
<string name="system_default">(System Default)</string>
|
||||
<string name="settings_update">Update Settings</string>
|
||||
<string name="settings_check_update_title">Check Updates</string>
|
||||
<string name="settings_check_update_summary">Check updates in the background periodically</string>
|
||||
<string name="settings_update_channel_title">Update Channel</string>
|
||||
<string name="settings_update_stable">Stable</string>
|
||||
<string name="settings_update_beta">Beta</string>
|
||||
@@ -188,6 +190,7 @@
|
||||
<string name="requester_summary">Root sessions will inherit its requester\'s namespace</string>
|
||||
<string name="isolate_summary">Each root session will have its own isolated namespace</string>
|
||||
<string name="android_o_not_support">Does not support Android 8.0+</string>
|
||||
<string name="disable_fingerprint">No fingerprints were set or no device support</string>
|
||||
|
||||
<!--Superuser-->
|
||||
<string name="su_request_title">Superuser Request</string>
|
||||
|
@@ -32,9 +32,10 @@
|
||||
android:title="@string/settings_update">
|
||||
|
||||
<SwitchPreference
|
||||
android:key="notification"
|
||||
android:title="@string/settings_notification_title"
|
||||
android:summary="@string/settings_notification_summary" />
|
||||
android:key="check_update"
|
||||
android:defaultValue="true"
|
||||
android:title="@string/settings_check_update_title"
|
||||
android:summary="@string/settings_check_update_summary" />
|
||||
|
||||
<ListPreference
|
||||
android:key="update_channel"
|
||||
|
Reference in New Issue
Block a user