({ it }, {
+ Log.e(TAG, "ignore invalid rule: $it", it)
+ }).orEmpty()
+ )
+ templateInfo
+ }.onFailure {
+ Log.e(TAG, "ignore invalid template: $it", it)
+ }.getOrNull()
+}
+
+fun TemplateViewModel.TemplateInfo.toJSON(): JSONObject {
+ val template = this
+ return JSONObject().apply {
+
+ put("id", template.id)
+ put("name", template.name.ifBlank { template.id })
+ put("description", template.description.ifBlank { template.id })
+ if (template.author.isNotEmpty()) {
+ put("author", template.author)
+ }
+ put("namespace", Natives.Profile.Namespace.entries[template.namespace].name)
+ put("uid", template.uid)
+ put("gid", template.gid)
+
+ if (template.groups.isNotEmpty()) {
+ put("groups", JSONArray(
+ Groups.entries.filter {
+ template.groups.contains(it.gid)
+ }.map {
+ it.name
+ }
+ ))
+ }
+
+ if (template.capabilities.isNotEmpty()) {
+ put("capabilities", JSONArray(
+ Capabilities.entries.filter {
+ template.capabilities.contains(it.cap)
+ }.map {
+ it.name
+ }
+ ))
+ }
+
+ if (template.context.isNotEmpty()) {
+ put("context", template.context)
+ }
+
+ if (template.rules.isNotEmpty()) {
+ put("rules", JSONArray(template.rules))
+ }
+ }
+}
+
+@Suppress("unused")
+fun generateTemplates() {
+ val templateJson = JSONObject()
+ templateJson.put("id", "com.example")
+ templateJson.put("name", "Example")
+ templateJson.put("description", "This is an example template")
+ templateJson.put("local", true)
+ templateJson.put("namespace", Natives.Profile.Namespace.INHERITED.name)
+ templateJson.put("uid", 0)
+ templateJson.put("gid", 0)
+
+ templateJson.put("groups", JSONArray().apply { put(Groups.INET.name) })
+ templateJson.put("capabilities", JSONArray().apply { put(Capabilities.CAP_NET_RAW.name) })
+ templateJson.put("context", "u:r:su:s0")
+ Log.i(TAG, "$templateJson")
+}
\ No newline at end of file
diff --git a/manager/app/src/main/java/me/weishu/kernelsu/ui/webui/MimeUtil.java b/manager/app/src/main/java/me/weishu/kernelsu/ui/webui/MimeUtil.java
new file mode 100644
index 000000000000..1fc2f4a4ceab
--- /dev/null
+++ b/manager/app/src/main/java/me/weishu/kernelsu/ui/webui/MimeUtil.java
@@ -0,0 +1,88 @@
+/*
+ * Copyright 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package me.weishu.kernelsu.ui.webui;
+
+import java.net.URLConnection;
+
+class MimeUtil {
+
+ public static String getMimeFromFileName(String fileName) {
+ if (fileName == null) {
+ return null;
+ }
+
+ // Copying the logic and mapping that Chromium follows.
+ // First we check against the OS (this is a limited list by default)
+ // but app developers can extend this.
+ // We then check against a list of hardcoded mime types above if the
+ // OS didn't provide a result.
+ String mimeType = URLConnection.guessContentTypeFromName(fileName);
+
+ if (mimeType != null) {
+ return mimeType;
+ }
+
+ return guessHardcodedMime(fileName);
+ }
+
+ // We should keep this map in sync with the lists under
+ // //net/base/mime_util.cc in Chromium.
+ // A bunch of the mime types don't really apply to Android land
+ // like word docs so feel free to filter out where necessary.
+ private static String guessHardcodedMime(String fileName) {
+ int finalFullStop = fileName.lastIndexOf('.');
+ if (finalFullStop == -1) {
+ return null;
+ }
+
+ final String extension = fileName.substring(finalFullStop + 1).toLowerCase();
+
+ return switch (extension) {
+ case "webm" -> "video/webm";
+ case "mpeg", "mpg" -> "video/mpeg";
+ case "mp3" -> "audio/mpeg";
+ case "wasm" -> "application/wasm";
+ case "xhtml", "xht", "xhtm" -> "application/xhtml+xml";
+ case "flac" -> "audio/flac";
+ case "ogg", "oga", "opus" -> "audio/ogg";
+ case "wav" -> "audio/wav";
+ case "m4a" -> "audio/x-m4a";
+ case "gif" -> "image/gif";
+ case "jpeg", "jpg", "jfif", "pjpeg", "pjp" -> "image/jpeg";
+ case "png" -> "image/png";
+ case "apng" -> "image/apng";
+ case "svg", "svgz" -> "image/svg+xml";
+ case "webp" -> "image/webp";
+ case "mht", "mhtml" -> "multipart/related";
+ case "css" -> "text/css";
+ case "html", "htm", "shtml", "shtm", "ehtml" -> "text/html";
+ case "js", "mjs" -> "application/javascript";
+ case "xml" -> "text/xml";
+ case "mp4", "m4v" -> "video/mp4";
+ case "ogv", "ogm" -> "video/ogg";
+ case "ico" -> "image/x-icon";
+ case "woff" -> "application/font-woff";
+ case "gz", "tgz" -> "application/gzip";
+ case "json" -> "application/json";
+ case "pdf" -> "application/pdf";
+ case "zip" -> "application/zip";
+ case "bmp" -> "image/bmp";
+ case "tiff", "tif" -> "image/tiff";
+ default -> null;
+ };
+ }
+}
diff --git a/manager/app/src/main/java/me/weishu/kernelsu/ui/webui/SuFilePathHandler.java b/manager/app/src/main/java/me/weishu/kernelsu/ui/webui/SuFilePathHandler.java
new file mode 100644
index 000000000000..ff450e8e9cfe
--- /dev/null
+++ b/manager/app/src/main/java/me/weishu/kernelsu/ui/webui/SuFilePathHandler.java
@@ -0,0 +1,191 @@
+package me.weishu.kernelsu.ui.webui;
+
+import android.content.Context;
+import android.util.Log;
+import android.webkit.WebResourceResponse;
+
+import androidx.annotation.NonNull;
+import androidx.annotation.WorkerThread;
+import androidx.webkit.WebViewAssetLoader;
+
+import com.topjohnwu.superuser.Shell;
+import com.topjohnwu.superuser.io.SuFile;
+import com.topjohnwu.superuser.io.SuFileInputStream;
+
+import java.io.File;
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.zip.GZIPInputStream;
+
+/**
+ * Handler class to open files from file system by root access
+ * For more information about android storage please refer to
+ * Android Developers
+ * Docs: Data and file storage overview.
+ *
+ * To avoid leaking user or app data to the web, make sure to choose {@code directory}
+ * carefully, and assume any file under this directory could be accessed by any web page subject
+ * to same-origin rules.
+ *
+ * A typical usage would be like:
+ *
+ * File publicDir = new File(context.getFilesDir(), "public");
+ * // Host "files/public/" in app's data directory under:
+ * // http://appassets.androidplatform.net/public/...
+ * WebViewAssetLoader assetLoader = new WebViewAssetLoader.Builder()
+ * .addPathHandler("/public/", new InternalStoragePathHandler(context, publicDir))
+ * .build();
+ *
+ */
+public final class SuFilePathHandler implements WebViewAssetLoader.PathHandler {
+ private static final String TAG = "SuFilePathHandler";
+
+ /**
+ * Default value to be used as MIME type if guessing MIME type failed.
+ */
+ public static final String DEFAULT_MIME_TYPE = "text/plain";
+
+ /**
+ * Forbidden subdirectories of {@link Context#getDataDir} that cannot be exposed by this
+ * handler. They are forbidden as they often contain sensitive information.
+ *
+ * Note: Any future addition to this list will be considered breaking changes to the API.
+ */
+ private static final String[] FORBIDDEN_DATA_DIRS =
+ new String[] {"/data/data", "/data/system"};
+
+ @NonNull
+ private final File mDirectory;
+
+ private final Shell mShell;
+
+ /**
+ * Creates PathHandler for app's internal storage.
+ * The directory to be exposed must be inside either the application's internal data
+ * directory {@link Context#getDataDir} or cache directory {@link Context#getCacheDir}.
+ * External storage is not supported for security reasons, as other apps with
+ * {@link android.Manifest.permission#WRITE_EXTERNAL_STORAGE} may be able to modify the
+ * files.
+ *
+ * Exposing the entire data or cache directory is not permitted, to avoid accidentally
+ * exposing sensitive application files to the web. Certain existing subdirectories of
+ * {@link Context#getDataDir} are also not permitted as they are often sensitive.
+ * These files are ({@code "app_webview/"}, {@code "databases/"}, {@code "lib/"},
+ * {@code "shared_prefs/"} and {@code "code_cache/"}).
+ *
+ * The application should typically use a dedicated subdirectory for the files it intends to
+ * expose and keep them separate from other files.
+ *
+ * @param context {@link Context} that is used to access app's internal storage.
+ * @param directory the absolute path of the exposed app internal storage directory from
+ * which files can be loaded.
+ * @throws IllegalArgumentException if the directory is not allowed.
+ */
+ public SuFilePathHandler(@NonNull Context context, @NonNull File directory, Shell rootShell) {
+ try {
+ mDirectory = new File(getCanonicalDirPath(directory));
+ if (!isAllowedInternalStorageDir(context)) {
+ throw new IllegalArgumentException("The given directory \"" + directory
+ + "\" doesn't exist under an allowed app internal storage directory");
+ }
+ mShell = rootShell;
+ } catch (IOException e) {
+ throw new IllegalArgumentException(
+ "Failed to resolve the canonical path for the given directory: "
+ + directory.getPath(), e);
+ }
+ }
+
+ private boolean isAllowedInternalStorageDir(@NonNull Context context) throws IOException {
+ String dir = getCanonicalDirPath(mDirectory);
+
+ for (String forbiddenPath : FORBIDDEN_DATA_DIRS) {
+ if (dir.startsWith(forbiddenPath)) {
+ return false;
+ }
+ }
+ return true;
+ }
+
+ /**
+ * Opens the requested file from the exposed data directory.
+ *
+ * The matched prefix path used shouldn't be a prefix of a real web path. Thus, if the
+ * requested file cannot be found or is outside the mounted directory a
+ * {@link WebResourceResponse} object with a {@code null} {@link InputStream} will be
+ * returned instead of {@code null}. This saves the time of falling back to network and
+ * trying to resolve a path that doesn't exist. A {@link WebResourceResponse} with
+ * {@code null} {@link InputStream} will be received as an HTTP response with status code
+ * {@code 404} and no body.
+ *
+ * The MIME type for the file will be determined from the file's extension using
+ * {@link java.net.URLConnection#guessContentTypeFromName}. Developers should ensure that
+ * files are named using standard file extensions. If the file does not have a
+ * recognised extension, {@code "text/plain"} will be used by default.
+ *
+ * @param path the suffix path to be handled.
+ * @return {@link WebResourceResponse} for the requested file.
+ */
+ @Override
+ @WorkerThread
+ @NonNull
+ public WebResourceResponse handle(@NonNull String path) {
+ try {
+ File file = getCanonicalFileIfChild(mDirectory, path);
+ if (file != null) {
+ InputStream is = openFile(file, mShell);
+ String mimeType = guessMimeType(path);
+ return new WebResourceResponse(mimeType, null, is);
+ } else {
+ Log.e(TAG, String.format(
+ "The requested file: %s is outside the mounted directory: %s", path,
+ mDirectory));
+ }
+ } catch (IOException e) {
+ Log.e(TAG, "Error opening the requested path: " + path, e);
+ }
+ return new WebResourceResponse(null, null, null);
+ }
+
+ public static String getCanonicalDirPath(@NonNull File file) throws IOException {
+ String canonicalPath = file.getCanonicalPath();
+ if (!canonicalPath.endsWith("/")) canonicalPath += "/";
+ return canonicalPath;
+ }
+
+ public static File getCanonicalFileIfChild(@NonNull File parent, @NonNull String child)
+ throws IOException {
+ String parentCanonicalPath = getCanonicalDirPath(parent);
+ String childCanonicalPath = new File(parent, child).getCanonicalPath();
+ if (childCanonicalPath.startsWith(parentCanonicalPath)) {
+ return new File(childCanonicalPath);
+ }
+ return null;
+ }
+
+ @NonNull
+ private static InputStream handleSvgzStream(@NonNull String path,
+ @NonNull InputStream stream) throws IOException {
+ return path.endsWith(".svgz") ? new GZIPInputStream(stream) : stream;
+ }
+
+ public static InputStream openFile(@NonNull File file, @NonNull Shell shell) throws IOException {
+ SuFile suFile = new SuFile(file.getAbsolutePath());
+ suFile.setShell(shell);
+ InputStream fis = SuFileInputStream.open(suFile);
+ return handleSvgzStream(file.getPath(), fis);
+ }
+
+ /**
+ * Use {@link MimeUtil#getMimeFromFileName} to guess MIME type or return the
+ * {@link #DEFAULT_MIME_TYPE} if it can't guess.
+ *
+ * @param filePath path of the file to guess its MIME type.
+ * @return MIME type guessed from file extension or {@link #DEFAULT_MIME_TYPE}.
+ */
+ @NonNull
+ public static String guessMimeType(@NonNull String filePath) {
+ String mimeType = MimeUtil.getMimeFromFileName(filePath);
+ return mimeType == null ? DEFAULT_MIME_TYPE : mimeType;
+ }
+}
diff --git a/manager/app/src/main/java/me/weishu/kernelsu/ui/webui/WebUIActivity.kt b/manager/app/src/main/java/me/weishu/kernelsu/ui/webui/WebUIActivity.kt
new file mode 100644
index 000000000000..d926d7eada35
--- /dev/null
+++ b/manager/app/src/main/java/me/weishu/kernelsu/ui/webui/WebUIActivity.kt
@@ -0,0 +1,98 @@
+package me.weishu.kernelsu.ui.webui
+
+import android.annotation.SuppressLint
+import android.app.ActivityManager
+import android.os.Build
+import android.os.Bundle
+import android.view.ViewGroup.MarginLayoutParams
+import android.webkit.WebResourceRequest
+import android.webkit.WebResourceResponse
+import android.webkit.WebView
+import android.webkit.WebViewClient
+import androidx.activity.ComponentActivity
+import androidx.activity.enableEdgeToEdge
+import androidx.core.view.ViewCompat
+import androidx.core.view.WindowInsetsCompat
+import androidx.core.view.updateLayoutParams
+import androidx.webkit.WebViewAssetLoader
+import com.topjohnwu.superuser.Shell
+import me.weishu.kernelsu.ui.util.createRootShell
+import java.io.File
+
+@SuppressLint("SetJavaScriptEnabled")
+class WebUIActivity : ComponentActivity() {
+ private lateinit var webviewInterface: WebViewInterface
+
+ private var rootShell: Shell? = null
+
+ override fun onCreate(savedInstanceState: Bundle?) {
+
+ // Enable edge to edge
+ enableEdgeToEdge()
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
+ window.isNavigationBarContrastEnforced = false
+ }
+
+ super.onCreate(savedInstanceState)
+
+ val moduleId = intent.getStringExtra("id")!!
+ val name = intent.getStringExtra("name")!!
+ if (Build.VERSION.SDK_INT < Build.VERSION_CODES.TIRAMISU) {
+ @Suppress("DEPRECATION")
+ setTaskDescription(ActivityManager.TaskDescription("KernelSU - $name"))
+ } else {
+ val taskDescription = ActivityManager.TaskDescription.Builder().setLabel("KernelSU - $name").build()
+ setTaskDescription(taskDescription)
+ }
+
+ val prefs = getSharedPreferences("settings", MODE_PRIVATE)
+ WebView.setWebContentsDebuggingEnabled(prefs.getBoolean("enable_web_debugging", false))
+
+ val moduleDir = "/data/adb/modules/${moduleId}"
+ val webRoot = File("${moduleDir}/webroot")
+ val rootShell = createRootShell(true).also { this.rootShell = it }
+ val webViewAssetLoader = WebViewAssetLoader.Builder()
+ .setDomain("mui.kernelsu.org")
+ .addPathHandler(
+ "/",
+ SuFilePathHandler(this, webRoot, rootShell)
+ )
+ .build()
+
+ val webViewClient = object : WebViewClient() {
+ override fun shouldInterceptRequest(
+ view: WebView,
+ request: WebResourceRequest
+ ): WebResourceResponse? {
+ return webViewAssetLoader.shouldInterceptRequest(request.url)
+ }
+ }
+
+ val webView = WebView(this).apply {
+ ViewCompat.setOnApplyWindowInsetsListener(this) { view, insets ->
+ val inset = insets.getInsets(WindowInsetsCompat.Type.systemBars())
+ view.updateLayoutParams {
+ leftMargin = inset.left
+ rightMargin = inset.right
+ topMargin = inset.top
+ bottomMargin = inset.bottom
+ }
+ return@setOnApplyWindowInsetsListener insets
+ }
+ settings.javaScriptEnabled = true
+ settings.domStorageEnabled = true
+ settings.allowFileAccess = false
+ webviewInterface = WebViewInterface(this@WebUIActivity, this, moduleDir)
+ addJavascriptInterface(webviewInterface, "ksu")
+ setWebViewClient(webViewClient)
+ loadUrl("https://mui.kernelsu.org/index.html")
+ }
+
+ setContentView(webView)
+ }
+
+ override fun onDestroy() {
+ super.onDestroy()
+ runCatching { rootShell?.close() }
+ }
+}
\ No newline at end of file
diff --git a/manager/app/src/main/java/me/weishu/kernelsu/ui/webui/WebViewInterface.kt b/manager/app/src/main/java/me/weishu/kernelsu/ui/webui/WebViewInterface.kt
new file mode 100644
index 000000000000..00fcde653b60
--- /dev/null
+++ b/manager/app/src/main/java/me/weishu/kernelsu/ui/webui/WebViewInterface.kt
@@ -0,0 +1,209 @@
+package me.weishu.kernelsu.ui.webui
+
+import android.app.Activity
+import android.content.Context
+import android.os.Handler
+import android.os.Looper
+import android.text.TextUtils
+import android.view.Window
+import android.webkit.JavascriptInterface
+import android.webkit.WebView
+import android.widget.Toast
+import androidx.core.view.WindowInsetsCompat
+import androidx.core.view.WindowInsetsControllerCompat
+import com.topjohnwu.superuser.CallbackList
+import com.topjohnwu.superuser.ShellUtils
+import com.topjohnwu.superuser.internal.UiThreadHandler
+import me.weishu.kernelsu.ui.util.createRootShell
+import me.weishu.kernelsu.ui.util.listModules
+import me.weishu.kernelsu.ui.util.withNewRootShell
+import org.json.JSONArray
+import org.json.JSONObject
+import java.io.File
+import java.util.concurrent.CompletableFuture
+
+class WebViewInterface(
+ val context: Context,
+ private val webView: WebView,
+ private val modDir: String
+) {
+
+ @JavascriptInterface
+ fun exec(cmd: String): String {
+ return withNewRootShell(true) { ShellUtils.fastCmd(this, cmd) }
+ }
+
+ @JavascriptInterface
+ fun exec(cmd: String, callbackFunc: String) {
+ exec(cmd, null, callbackFunc)
+ }
+
+ private fun processOptions(sb: StringBuilder, options: String?) {
+ val opts = if (options == null) JSONObject() else {
+ JSONObject(options)
+ }
+
+ val cwd = opts.optString("cwd")
+ if (!TextUtils.isEmpty(cwd)) {
+ sb.append("cd ${cwd};")
+ }
+
+ opts.optJSONObject("env")?.let { env ->
+ env.keys().forEach { key ->
+ sb.append("export ${key}=${env.getString(key)};")
+ }
+ }
+ }
+
+ @JavascriptInterface
+ fun exec(
+ cmd: String,
+ options: String?,
+ callbackFunc: String
+ ) {
+ val finalCommand = StringBuilder()
+ processOptions(finalCommand, options)
+ finalCommand.append(cmd)
+
+ val result = withNewRootShell(true) {
+ newJob().add(finalCommand.toString()).to(ArrayList(), ArrayList()).exec()
+ }
+ val stdout = result.out.joinToString(separator = "\n")
+ val stderr = result.err.joinToString(separator = "\n")
+
+ val jsCode =
+ "javascript: (function() { try { ${callbackFunc}(${result.code}, ${
+ JSONObject.quote(
+ stdout
+ )
+ }, ${JSONObject.quote(stderr)}); } catch(e) { console.error(e); } })();"
+ webView.post {
+ webView.loadUrl(jsCode)
+ }
+ }
+
+ @JavascriptInterface
+ fun spawn(command: String, args: String, options: String?, callbackFunc: String) {
+ val finalCommand = StringBuilder()
+
+ processOptions(finalCommand, options)
+
+ if (!TextUtils.isEmpty(args)) {
+ finalCommand.append(command).append(" ")
+ JSONArray(args).let { argsArray ->
+ for (i in 0 until argsArray.length()) {
+ finalCommand.append(argsArray.getString(i))
+ finalCommand.append(" ")
+ }
+ }
+ } else {
+ finalCommand.append(command)
+ }
+
+ val shell = createRootShell(true)
+
+ val emitData = fun(name: String, data: String) {
+ val jsCode =
+ "javascript: (function() { try { ${callbackFunc}.${name}.emit('data', ${
+ JSONObject.quote(
+ data
+ )
+ }); } catch(e) { console.error('emitData', e); } })();"
+ webView.post {
+ webView.loadUrl(jsCode)
+ }
+ }
+
+ val stdout = object : CallbackList(UiThreadHandler::runAndWait) {
+ override fun onAddElement(s: String) {
+ emitData("stdout", s)
+ }
+ }
+
+ val stderr = object : CallbackList(UiThreadHandler::runAndWait) {
+ override fun onAddElement(s: String) {
+ emitData("stderr", s)
+ }
+ }
+
+ val future = shell.newJob().add(finalCommand.toString()).to(stdout, stderr).enqueue()
+ val completableFuture = CompletableFuture.supplyAsync {
+ future.get()
+ }
+
+ completableFuture.thenAccept { result ->
+ val emitExitCode =
+ "javascript: (function() { try { ${callbackFunc}.emit('exit', ${result.code}); } catch(e) { console.error(`emitExit error: \${e}`); } })();"
+ webView.post {
+ webView.loadUrl(emitExitCode)
+ }
+
+ if (result.code != 0) {
+ val emitErrCode =
+ "javascript: (function() { try { var err = new Error(); err.exitCode = ${result.code}; err.message = ${
+ JSONObject.quote(
+ result.err.joinToString(
+ "\n"
+ )
+ )
+ };${callbackFunc}.emit('error', err); } catch(e) { console.error('emitErr', e); } })();"
+ webView.post {
+ webView.loadUrl(emitErrCode)
+ }
+ }
+ }.whenComplete { _, _ ->
+ runCatching { shell.close() }
+ }
+ }
+
+ @JavascriptInterface
+ fun toast(msg: String) {
+ webView.post {
+ Toast.makeText(context, msg, Toast.LENGTH_SHORT).show()
+ }
+ }
+
+ @JavascriptInterface
+ fun fullScreen(enable: Boolean) {
+ if (context is Activity) {
+ Handler(Looper.getMainLooper()).post {
+ if (enable) {
+ hideSystemUI(context.window)
+ } else {
+ showSystemUI(context.window)
+ }
+ }
+ }
+ }
+
+ @JavascriptInterface
+ fun moduleInfo(): String {
+ val moduleInfos = JSONArray(listModules())
+ var currentModuleInfo = JSONObject()
+ currentModuleInfo.put("moduleDir", modDir)
+ val moduleId = File(modDir).getName()
+ for (i in 0 until moduleInfos.length()) {
+ val currentInfo = moduleInfos.getJSONObject(i)
+
+ if (currentInfo.getString("id") != moduleId) {
+ continue
+ }
+
+ var keys = currentInfo.keys()
+ for (key in keys) {
+ currentModuleInfo.put(key, currentInfo.get(key))
+ }
+ break
+ }
+ return currentModuleInfo.toString()
+ }
+}
+
+fun hideSystemUI(window: Window) =
+ WindowInsetsControllerCompat(window, window.decorView).let { controller ->
+ controller.hide(WindowInsetsCompat.Type.systemBars())
+ controller.systemBarsBehavior = WindowInsetsControllerCompat.BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE
+ }
+
+fun showSystemUI(window: Window) =
+ WindowInsetsControllerCompat(window, window.decorView).show(WindowInsetsCompat.Type.systemBars())
diff --git a/manager/app/src/main/jniLibs/arm64-v8a/libmagiskboot.so b/manager/app/src/main/jniLibs/arm64-v8a/libmagiskboot.so
new file mode 100644
index 000000000000..451ca81c42d8
Binary files /dev/null and b/manager/app/src/main/jniLibs/arm64-v8a/libmagiskboot.so differ
diff --git a/manager/app/src/main/res/drawable/ic_launcher_background.xml b/manager/app/src/main/res/drawable/ic_launcher_background.xml
deleted file mode 100644
index 900e2d8c829e..000000000000
--- a/manager/app/src/main/res/drawable/ic_launcher_background.xml
+++ /dev/null
@@ -1,15 +0,0 @@
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/manager/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml b/manager/app/src/main/res/mipmap-anydpi/ic_launcher.xml
similarity index 79%
rename from manager/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml
rename to manager/app/src/main/res/mipmap-anydpi/ic_launcher.xml
index b070c763da32..f30783b21028 100644
--- a/manager/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml
+++ b/manager/app/src/main/res/mipmap-anydpi/ic_launcher.xml
@@ -1,6 +1,6 @@
-
+
\ No newline at end of file
diff --git a/manager/app/src/main/res/resources.properties b/manager/app/src/main/res/resources.properties
new file mode 100644
index 000000000000..d5a3ddc92a9b
--- /dev/null
+++ b/manager/app/src/main/res/resources.properties
@@ -0,0 +1 @@
+unqualifiedResLocale=en-US
\ No newline at end of file
diff --git a/manager/app/src/main/res/values-ar/strings.xml b/manager/app/src/main/res/values-ar/strings.xml
index 297249d749ed..e47b8e22c053 100644
--- a/manager/app/src/main/res/values-ar/strings.xml
+++ b/manager/app/src/main/res/values-ar/strings.xml
@@ -5,8 +5,8 @@
إضغط للتثبيت
يعمل
الإصدار: %d
- المستخدمين الخارقين: %d
- الوحدات: %d
+ مستخدمين الجذر: %d
+ الإضافات: %d
غير مدعوم
KernelSU يدعم GKI kernels فقط
إصدار النواة
@@ -18,10 +18,10 @@
متساهل
مجهول
مستخدم خارق
- فشل في تمكين الوحدة: %s
- فشل تعطيل الوحدة : %s
- لا توجد وحدة مثبتة
- الوحدات
+ فشل في تمكين الإضافة: %s
+ فشل تعطيل الإضافة : %s
+ لا توجد إضافات مثبتة
+ الإضافات
إلغاء التثبيت
تثبيت الوحدة
تثبيت
@@ -33,30 +33,30 @@
إعادة تشغيل إلى وضع Download
إعادة تشغيل إلى وضع EDL
من نحن
- هل أنت متأكد أنك تريد إلغاء تثبيت الوحدة %s ?
- تم إلغاء التثبيت %s
+ هل أنت متأكد أنك تريد إلغاء تثبيت الإضافة %s ?
+ تم إلغاء تثبيتها %s
فشل إلغاء التثبيت: %s
الإصدار
المطور
- التراكبات غير متوفرة ، لا يمكن للوحدة أن تعمل!
+ الوحدات غير متوفرة حيث يتم تعطيل نظام الملفات المتراكب بواسطة النواة.
إنعاش
إظهار تطبيقات النظام
إخفاء تطبيقات النظام
إرسال السجلات
الوضع الآمن
إعادة التشغيل لتطبيق التغييرات
- تم تعطيل الوحدات النمطية لأنها تتعارض مع Magisk!
+ الوحدات غير متاحة بسبب تعارضها مع Magisk!
تعلم KernelSU
https://kernelsu.org/guide/what-is-kernelsu.html
- تعرف على كيفية تثبيت KernelSU واستخدام الوحدات
+ تعرف على كيفية تثبيت KernelSU واستخدام الإضافات
إدعمنا
KernelSU سيظل دائماً مجانياً ومفتوح المصدر. مع ذلك، يمكنك أن تظهر لنا أنك تهتم بالتبرع.
إنضم إلى قناتنا في %2$s ]]>
القدرات
تحديث
- تحمبل الوحدة : %s
+ تحميل الإضافة: %s
ابدأ التنزيل: %s
- الإصدار الجديد: %s متاح ، انقر للتحديث
+ الإصدار الجديد: %s متاح ، انقر للتحديث.
تشغيل
الإفتراضي
نموذج
@@ -66,13 +66,13 @@
مجموعات
مُخصّص
تركيب مساحة الاسم
- الغاء تحميل الوحدات
+ الغاء تحميل الإضافات
فشل تحديث ملف تعريف التطبيق لـ %s
سياق SELinux
ايقاف إجباري
- الغاء تحميل الوحدات بشكل افتراضي
- القيمة الافتراضية العامة ل \"إلغاء تحميل الوحدات \" في ملفات تعريف التطبيقات. إذا تم تمكينه ، إزالة جميع تعديلات الوحدة النمطية على النظام للتطبيقات التي لا تحتوي على مجموعة ملف تعريف.
- سيسمح تمكين هذا الخيار ل KernelSU باستعادة أي ملفات معدلة بواسطة الوحدات النمطية لهذا التطبيق.
+ الغاء تحميل الإضافات بشكل افتراضي
+ القيمة الافتراضية العامة لـ\"إلغاء تحميل الإضافات\" في ملفات تعريف التطبيقات. إذا تم تمكينه، إزالة جميع تعديلات الإضافات على النظام للتطبيقات التي لا تحتوي على مجموعة ملف تعريف.
+ سيسمح تمكين هذا الخيار لـKernelSU باستعادة أي ملفات معدلة بواسطة الإضافات لهذا التطبيق.
المجال
القواعد
إعادة تشغيل التطبيق
@@ -80,4 +80,59 @@
اسم الملف الشخصي
إصدار KernelSU الحالي %d منخفض جدًا بحيث لا يعمل المدير بشكل صحيح. الرجاء الترقية إلى الإصدار %d أو أعلى!
سجل التغييرات
+ تم الاستيراد بنجاح
+ تصدير إلى الحافظة
+ لا يمكن العثور على القالب المحلي للتصدير!
+ معرف القالب موجود بالفعل!
+ استيراد من الحافظة
+ فشل في جلب سجل التغيير: %s
+ الاسم
+ معرف القالب غير صالح
+ مزامنة القوالب عبر الإنترنت
+ إنشاء قالب
+ للقراءة فقط
+ استيراد / تصدير
+ فشل في حفظ القالب
+ تحرير القالب
+ المعرف
+ قالب ملف تعريف التطبيق
+ الوصف
+ حفظ
+ إدارة القالب المحلي وعبر الإنترنت لملف تعريف التطبيق
+ حذف
+ الحافظة فارغة!
+ عرض القالب
+ فشل في منح صلاحية الجذر!
+ فتح
+ التحقق تلقائيًا من وجود تحديثات عند فتح التطبيق
+ التحقق من التحديث
+ تمكين تصحيح أخطاء WebView
+ يمكن استخدامه لتصحيح أخطاء WebUI، يرجى تمكينه فقط عند الحاجة.
+ التالي
+ اختيار ملف
+ تثبيت مباشر (موصى به)
+ التثبيت على فتحة غير نشطة (بعد OTA)
+ سيتم **إجبار** جهازك على التمهيد إلى الفتحة غير النشطة الحالية بعد إعادة التشغيل!
+\nاستخدم هذا الخيار فقط بعد انتهاء التحديث.
+\nأستمرار؟
+ اختر KMI
+ يوصى باستخدام صورة القسم %1$s
+ تصغير الصورة المتفرقة
+ قم بتغيير حجم الصورة المتفرقة حيث توجد الإضافة إلى حجمها الفعلي. لاحظ أن هذا قد يتسبب في عمل الإضافة بشكل غير طبيعي، لذا يرجى استخدامها فقط عند الضرورة (مثل النسخ الاحتياطي).
+ إلغاء التثبيت
+ إلغاء التثبيت مؤقتًا
+ إلغاء التثبيت بشكل دائم
+ استعادة الصورة الاصلية
+ إلغاء تثبيت KernelSU .(الجذر وجميع الوحدات) بشكل كامل ودائم.
+ تركيب
+ نجح التركيب
+ فشل التركيب
+ LKM المحددة: %s
+ استعادة صورة المصنع المخزنة (في حالة وجود نسخة احتياطية)، والتي تُستخدم عادة قبل OTA؛ إذا كنت بحاجة إلى إلغاء تثبيت KernelSU، فيرجى استخدام \"إلغاء التثبيت الدائم\".
+ قم بإلغاء تثبيت KernelSU مؤقتًا، واستعد إلى حالته الأصلية بعد إعادة التشغيل التالية.
+ حفظ السجلات
+ إجراء
+ السجلات محفوظة
+ فرز (الممكن أولاً)
+ فرز (الإجراء أولاً)
\ No newline at end of file
diff --git a/manager/app/src/main/res/values-az/strings.xml b/manager/app/src/main/res/values-az/strings.xml
index d6931962972a..21ec189f55c4 100644
--- a/manager/app/src/main/res/values-az/strings.xml
+++ b/manager/app/src/main/res/values-az/strings.xml
@@ -78,4 +78,5 @@
Məcburi dayandır
Yenidən başlat
%s görə SELinux qaydalarını güncəlləmək mümkün olmadı
+ Girişləri Saxla
\ No newline at end of file
diff --git a/manager/app/src/main/res/values-bn-rBD/strings.xml b/manager/app/src/main/res/values-bn-rBD/strings.xml
index 8d5248cfba24..078d88fee7ca 100644
--- a/manager/app/src/main/res/values-bn-rBD/strings.xml
+++ b/manager/app/src/main/res/values-bn-rBD/strings.xml
@@ -31,7 +31,7 @@
পারমিসিভ
মোডিউল ডিসেবল করা যায়নি: %s
কোনো মোডিউল ইন্সটল করা নেই
- ভারসন: %d
+ সংস্করণ: %d
সুপার ইউজার: %d
নেইম স্পেস মাউন্ট
ইনহেরিটেড
@@ -48,4 +48,5 @@
%s আনইনস্টল করা যায়নি
ভার্সন
অথার
+ লগ সংরক্ষণ করুন
\ No newline at end of file
diff --git a/manager/app/src/main/res/values-bn/strings.xml b/manager/app/src/main/res/values-bn/strings.xml
index 676175c99b22..312672c8715a 100644
--- a/manager/app/src/main/res/values-bn/strings.xml
+++ b/manager/app/src/main/res/values-bn/strings.xml
@@ -8,15 +8,15 @@
সুপার ইউজার: %d
মডিউল: %d
অসমর্থিত
- কার্নেলএসইউ শুধুমাত্র জিকেআই কার্নেল সমর্থন করে
+ KernelSU শুধুমাত্র GKI কার্নেল সমর্থন করে
কার্নেল
ম্যানেজার সংস্করণ
ফিঙ্গারপ্রিন্ট
- সেলিনাক্স স্ট্যাটাস
+ SELinux স্টেটাস
ডিজেবল
- এনফোর্সিং
+ কার্যকর
অনুমতিমূলক
- অপরিচিত
+ অজানা
সুপার ইউজার
মডিউল সক্ষম করতে ব্যর্থ হয়েছে: %s
মডিউল নিষ্ক্রিয় করতে ব্যর্থ হয়েছে: %s
@@ -63,4 +63,6 @@
গ্লোবাল
আলাদাভাবে
আনমাউন্ট মোডিউল
+ ম্যানেজার সঠিকভাবে কাজ করার জন্য বর্তমান KernelSU সংস্করণ %d খুবই কম। অনুগ্রহ করে %d বা উচ্চতর সংস্করণে আপগ্রেড করুন!
+ লগ সংরক্ষণ করুন
\ No newline at end of file
diff --git a/manager/app/src/main/res/values-bs/strings.xml b/manager/app/src/main/res/values-bs/strings.xml
index d8b86b1090bd..da07863193fe 100644
--- a/manager/app/src/main/res/values-bs/strings.xml
+++ b/manager/app/src/main/res/values-bs/strings.xml
@@ -79,4 +79,5 @@
Šablon
Prilagođeno
Naziv profila
+ Sačuvaj Dnevnike
\ No newline at end of file
diff --git a/manager/app/src/main/res/values-da/strings.xml b/manager/app/src/main/res/values-da/strings.xml
index 4767311c659a..6ab022567f4c 100644
--- a/manager/app/src/main/res/values-da/strings.xml
+++ b/manager/app/src/main/res/values-da/strings.xml
@@ -79,4 +79,5 @@
Regler
Genstart
Den nuværende KernelSU version %d er for lav til manageren for at fungere ordentligt. Opgrader til version %d eller højere!
+ Gem Logfiler
\ No newline at end of file
diff --git a/manager/app/src/main/res/values-de/strings.xml b/manager/app/src/main/res/values-de/strings.xml
index eeafc04a6e58..b7412cc87898 100644
--- a/manager/app/src/main/res/values-de/strings.xml
+++ b/manager/app/src/main/res/values-de/strings.xml
@@ -6,78 +6,131 @@
Funktioniert
Version: %d
Superuser
- Tippen zum Installieren
+ Tippe zum Installieren
Superuser: %d
Unbekannt
Erzwingen
- Neustart mit Bootloader
- Neustart mit Download-Modus
- Neustart mit EDL-Modus
+ In den Bootloader-Modus neustarten
+ In den Download-Modus neustarten
+ In den EDL-Modus neustarten
Autor
- overlayfs nicht verfügbar, Modul kann nicht funktionieren!
- Über
- Module sind deaktiviert, weil es einen Konflikt mit Magisk gibt!
+ Module sind nicht verfügbar, da OverlayFS vom Kernel deaktiviert ist.
+ Über KernelSU
+ Module sind aufgrund eines Konfliktes mit Magisk nicht verfügbar!
https://kernelsu.org/guide/what-is-kernelsu.html
- Verstehe, wie du KernelSU installieren und Module verwendest
+ Erfahre, wie KernelSU installiert wird und wie Module verwendet werden
Unterstütze uns
- KernelSU ist und wird immer frei und quelloffen sein. Du kannst uns jedoch zeigen, dass du dich für uns interessierst, indem du eine Spende tätigst.
+ KernelSU ist und wird immer frei und quelloffen sein. Du kannst uns jedoch deine Unterstützung zeigen, indem du eine Spende tätigst.
SELinux-Kontext
Module standardmäßig aushängen
- Globaler Standardwert für \'Module aushängen\' in App-Profilen. Wenn er aktiviert ist, werden alle Moduländerungen im App-System entfernt, für die kein Profil festgelegt ist.
+ 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.
Standard
Vorlage
Benutzerdefiniert
App-Profilaktualisierung für %s fehlgeschlagen
- Vererbt
+ Geerbt
Global
Individuell
- Domain
+ Domäne
Aktualisieren
Wenn du diese Option aktivierst, kann KernelSU alle von den Modulen für diese App geänderten Dateien wiederherstellen.
Regeln
- Herunterladen starten: %s
- Fehler beim Aktualisieren der SELinux-Regeln für: %s
+ Starte Download: %s
+ Aktualisieren der SELinux-Regeln schlug fehl für: %s
Starten
- Neue Version: %s verfügbar, tippen zum Aktualisieren
+ Neue Version %s verfügbar, tippen zum Aktualisieren.
Stopp erzwingen
- Neustart
+ Neustarten
Module: %d
- Verwalter-Version
- SELinux-Status
+ Manager-Version
+ SELinux Status
Deaktiviert
Modulaktivierung fehlgeschlagen: %s
Moduldeaktivierung fehlgeschlagen: %s
- Kein Modul installiert
+ Keine Modul installiert
Modul
Deinstallieren
Installieren
- Neustart
+ Neustarten
Einstellungen
- Neustart mit Recovery
+ In den Recovery-Modus neustarten
%s deinstalliert
Version
- Neu laden
+ Aktualisieren
System-Apps anzeigen
System-Apps ausblenden
Protokoll senden
KernelSU verstehen
Sicherer Modus
- Neu starten, damit die Effekte auftreten
- Quellcode unter %1$s ansehen
Unserem %2$s-Kanal beitreten
+ Neustarten, damit Änderungen wirksam werden
+ Unserem %2$s-Kanal beitreten]]>
Profilname
Namespace einhängen
Gruppen
Fähigkeiten
Module aushängen
- Modul herunterladen: %s
+ Lädt Modul %s herunter
Nicht unterstützt
KernelSU unterstützt derzeit nur GKI-Kernel
Kernel
Fingerabdruck
Installieren
- Leichter Neustart
- Sicher, dass du das Modul %s deinstallieren möchtest\?
+ Soft-Reboot
+ Möchtest du wirklich Modul %s deinstallieren?
Deinstallation fehlgeschlagen: %s
- Die aktuelle Kernel-Version %d ist zu alt für diese Manager-Version. Bitte auf Version %d oder höher upgraden!
+ Die aktuelle KernelSU-Version %d ist zu alt für diese Manager-Version. Bitte auf Version %d oder höher aktualisieren!
Änderungsprotokoll
+ Erfolgreich importiert
+ In Zwischenablage exportieren
+ Kann lokale Vorlage nicht finden!
+ Vorlagen-ID existiert bereits!
+ Aus Zwischenablage importieren
+ Konnte Veränderungs-Protokoll nicht laden: %s
+ Name
+ Ungültige Vorlagen-ID
+ Online-Vorlagen synchronisieren
+ Vorlage erstellen
+ Schreibgeschützt
+ Import/Export
+ Schlug beim Speichern der Vorlage fehl
+ Vorlage bearbeiten
+ ID
+ App-Profil-Vorlage
+ Beschreibung
+ Speichern
+ Verwalte die lokale und online Vorlage des App-Profils
+ Löschen
+ Zwischenablage ist leer!
+ Vorlage ansehen
+ WebView-Debugging aktivieren
+ Kann zum Fehlerbeheben der WebUI verwendet werden, bitte nur im Notfall aktivieren.
+ %1$s Partitionsabbild empfohlen
+ KMI auswählen
+ Weiter
+ Direkte Installation (empfohlen)
+ Datei auswählen
+ In inaktiven Slot installieren (nach OTA)
+ Nach einem Neustart wird dein Gerät **GEZWUNGEN** in den derzeit inaktiven Slot zu starten!
+\nBenutze dies nur nach Fertigstellung des OTA.
+\nFortfahren?
+ Root-Zugriff konnte nicht gewährt werden!
+ Öffnen
+ Auf Aktualisierung prüfen
+ Prüfe automatisch auf Aktualisierungen, wenn die App geöffnet wird
+ Temporär deinstallieren
+ Deinstallieren
+ KernelSU (Root und alle Module) vollständig und dauerhaft deinstallieren.
+ Ändert die Größe des Sparse-Images, in dem sich das Modul befindet, auf seine tatsächliche Größe. Beachten Sie, dass dies dazu führen kann, dass das Modul nicht ordnungsgemäß funktioniert; verwenden Sie es daher nur, wenn es notwendig ist (Wie für ein Backup).
+ Protokolle Speichern
+ Permanent deinstallieren
+ Standard-Abbild wiederherstellen
+ KernelSU temporär deinstallieren, originalen Status nach dem nächsten Neustart wiederherstellen.
+ Das Standard Werksabbild wiederherstellen (falls ein Backup existiert), normalerweise vor einem OTA zu verwenden; falls Sie KernelSU deinstallieren müssen, nutzen Sie bitte \"Permanent deinstallieren\".
+ Schreibt
+ Schreiben erfolgreich
+ Schreiben fehlgeschlagen
+ Wähle LKM: %s
+ Spärliches Bild minimieren
+ Aktion
+ Protokolle gespeichert
\ No newline at end of file
diff --git a/manager/app/src/main/res/values-es/strings.xml b/manager/app/src/main/res/values-es/strings.xml
index e29c1417e551..a630db99d132 100644
--- a/manager/app/src/main/res/values-es/strings.xml
+++ b/manager/app/src/main/res/values-es/strings.xml
@@ -2,83 +2,131 @@
Inicio
No instalado
- Haga clic para instalar
- Activo
+ Haz clic para instalar
+ Funcionando
Versión: %d
Superusuarios: %d
Módulos: %d
- No soportado
- Por el momento, KernelSU solo es compatible con kernels genéricos (GKIs)
+ Sin soporte
+ KernelSU solo admite kernels GKI por ahora
Versión del kernel
- Versión del manager
+ Versión del gestor
Huella del dispositivo
Estado de SELinux
- Disabled
- Enforcing
- Permissive
- Unknown
+ Desactivado
+ Estricto
+ Permisivo
+ Desconocido
Superusuario
- No se pudo habilitar el módulo \"%s\"
- No se pudo deshabilitar el módulo \"%s\"
- No hay ningún módulo instalado
+ Error al activar el módulo: %s
+ Error al desactivar el módulo: %s
+ Ningún módulo instalado
Módulo
Desinstalar
- Instalar módulo
+ Instalar
Instalar
Reiniciar
Ajustes
Reinicio suave
- Reiniciar en modo recovery
- Reiniciar en modo bootloader
- Reiniciar en modo download
+ Reiniciar en modo de recuperación
+ Reiniciar en modo de arranque
+ Reiniciar en modo Download
Reiniciar en modo EDL
Acerca de
- ¿Estás seguro de que quieres desinstalar el módulo \"%s\"?
- \"%s\" desinstalado
- No se pudo desinstalar \"%s\"
+ ¿Está seguro de que desea desinstalar el módulo %s?
+ %s desinstalado
+ Fallo al desinstalar: %s
Versión
Autor
- El módulo no puede funcionar ya que OverlayFS no está disponible!
- Recargar
- Mostrar apps del sistema
- Ocultar apps del sistema
- Enviar registro
+ Los módulos no están disponibles ya que OverlayFS está desactivado por el kernel.
+ Refrescar
+ Mostrar aplicaciones del sistema
+ Ocultar aplicaciones del sistema
+ Enviar registros
Modo seguro
- Reiniciar para aplicar cambios
- Se deshabilitaron los módulos ya que entran en conflicto con Magisk!
- Descubre KernelSU
+ Reinicia para aplicar cambios
+ ¡Los módulos no están disponibles debido a un conflicto con Magisk!
+ Aprende KernelSU
https://kernelsu.org/guide/what-is-kernelsu.html
- Descubre cómo instalar KernelSU y utilizar módulos
+ Aprende a instalar KernelSU y a utilizar módulos
Apóyanos
- KernelSU es y siempre será, libre y de código abierto. De todas formas, puedes mostrarnos tu apoyo mediante una donación.
- Únete a nuestro canal de %2$s]]>
+ KernelSU es, y siempre será, gratuito y de código abierto. Sin embargo, puedes demostrarnos que te importamos haciendo una donación.
+ Ver código fuente en %1$s
Únete a nuestro canal %2$s
Predeterminado
Plantilla
Personalizado
Nombre de perfil
- Modo de montaje del espacio de nombres
+ Montaje del espacio de nombres
Heredado
Global
Individual
Grupos
Capacidades
- Contexto de SELinux
+ Contexto SELinux
Desmontar módulos
- No se pudo actualizar el perfil de la app para %s
+ Error al actualizar el perfil de la aplicación para %s
Desmontar módulos por defecto
- El valor global predeterminado para \"Desmontar módulos\" en los perfiles de las aplicaciones. Si la habilitas, se desharán todas las modificaciones al sistema hechas por el módulo para las apps que no tengan un perfil establecido.
- Si habilitas esta opción, KernelSU podrá restaurar cualquier archivo modificado por los módulos para esta app.
+ 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.
+ Activar esta opción permitirá a KernelSU restaurar cualquier archivo modificado por los módulos para esta aplicación.
Dominio
Reglas
Actualizar
- Descargando módulo: \"%s\"
+ Descargando módulo: %s
Iniciar descarga: %s
- Nueva versión: %s está disponible, haga clic para actualizar
- Lanzar Aplicacion
- Forzar cierre de la aplicacion
- Reiniciar aplicacion
- Falló al actualizar reglas de SEpolicy por: %s
- La versión actual de KernelSU %d es demasiado baja para que el gestor funcione correctamente. ¡Por favor actualiza a la versión %d o superior!
+ La nueva versión %s está disponible, haga clic para actualizar.
+ Iniciar
+ Forzar detención
+ Reiniciar
+ Error al actualizar las reglas SELinux para: %s
+ 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!
Registro de cambios
+ Importado con éxito
+ Exportar al portapapeles
+ ¡No se encuentra la plantilla local para exportar!
+ ¡El ID de plantilla ya existe!
+ Importar desde el portapapeles
+ Fallo en la obtención del registro de cambios: %s
+ Nombre
+ ID de plantilla no válida
+ Sincronizar plantillas en línea
+ Crear plantilla
+ Sólo lectura
+ Importar/Exportar
+ No se ha podido guardar la plantilla
+ Editar plantilla
+ ID
+ Plantilla de perfil de aplicación
+ Descripción
+ Guardar
+ Gestionar la plantilla local y en línea de App Profile
+ Eliminar
+ ¡El portapapeles está vacío!
+ Ver plantilla
+ Guardar registros
+ Activar la depuración de WebView
+ Se recomienda la imagen de partición %1$s
+ Selecciona KMI
+ Siguiente
+ Instalación directa (Recomendada)
+ ¡Su dispositivo será **FORZADO** a arrancar en la ranura inactiva actual después de un reinicio!\nUtilice esta opción sólo después de que la OTA se haya realizado.\n¿Continuar?
+ Desinstalar
+ Restaurar imagen de archivo
+ Desinstalar temporalmente KernelSU, restaurar al estado original tras el siguiente reinicio.
+ LKM seleccionado: %s
+ Flash falló
+ Éxito de Flash
+ ¡No se ha podido conceder el acceso root!
+ Abrir
+ Seleccione un archivo
+ Instalar en ranura inactiva (Después de OTA)
+ Desinstalar temporalmente
+ Desinstalar permanentemente
+ Desinstalar KernelSU (Root y todos los módulos) completa y permanentemente.
+ Redimensiona la imagen dispersa donde se encuentra el módulo a su tamaño real. Tenga en cuenta que esto puede hacer que el módulo funcione de forma anormal, por lo que sólo debe utilizarlo cuando sea necesario (por ejemplo, para realizar copias de seguridad).
+ Comprobar actualización
+ Comprobación automática de actualizaciones al abrir la aplicación
+ Minimizar la imagen dispersa
+ Puede ser usado para depurar WebUI, por favor habilítalo sólo cuando sea necesario.
+ Restaurar la imagen de fábrica stock (Si existe una copia de seguridad), por lo general se utiliza antes de OTA; si necesita desinstalar KernelSU, por favor, utilice \"Desinstalar permanentemente\".
\ No newline at end of file
diff --git a/manager/app/src/main/res/values-et/strings.xml b/manager/app/src/main/res/values-et/strings.xml
new file mode 100644
index 000000000000..4f177ff884a7
--- /dev/null
+++ b/manager/app/src/main/res/values-et/strings.xml
@@ -0,0 +1,130 @@
+
+
+ Töötamine
+ Versioon: %d
+ Mooduleid: %d
+ Tuum
+ Manageri versioon
+ Sõrmejälg
+ Lubav
+ Mooduli lubamine ebaõnnestus: %s
+ Mooduleid pole paigaldatud
+ Taaskäivita
+ Taaskäivita taastusesse
+ Kas soovid kindlasti eemaldada mooduli %s?
+ %s eemaldatud
+ Saada logid
+ Turvarežiim
+ Muudatuste rakendamiseks taaskäivita
+ Õpi KernelSUd
+ https://kernelsu.org/guide/what-is-kernelsu.html
+ Vaikimisi
+ Haagi nimeruum
+ Lahtihaagitud moodulid
+ Rakenduseprofiili uuendamine %s jaoks ebaõnnestus
+ Haagi moodulid vaikimisi lahti
+ Allalaadimise alustamine: %s
+ SELinux reeglite uuendamine ebaõnnestus: %s
+ Muuda malli
+ Rakenduseprofiili mall
+ ID
+ Vaid lugemiseks
+ Malli ID juba eksisteerib!
+ Ekspordi lõikelauale
+ Sünkrooni võrgumallid
+ Muudatuste logi hankimine ebaõnnestus: %s
+ Kodu
+ Klõpsa paigaldamiseks
+ Pole paigaldatud
+ Mittetoetatud
+ Superkasutajaid: %d
+ KernelSU toetab hetkel vaid GSI tuumasid
+ SELinuxi olek
+ Keelatud
+ Jõustav
+ Teadmata
+ Superkasutaja
+ Mooduli keelamine ebaõnnestus: %s
+ Moodul
+ Taaskäivita käivituslaadurisse
+ Eemalda
+ Paigalda
+ Teave
+ Paigalda
+ Seaded
+ Pehme taaskäivitus
+ Taaskäivita allalaadimisrežiimi
+ Taaskäivita EDL-i
+ Värskenda
+ Autor
+ Eemaldamine ebaõnnestus: %s
+ Versioon
+ Moodulid pole saadaval, kuna OverlayFS on kernelis keelatud.
+ Kuva süsteemirakendused
+ Peida süsteemirakendused
+ Moodulid pole saadaval Magiski konflikti tõttu!
+ Õpi KernelSUd paigaldama ja mooduleid kasutama
+ Toeta meid
+ Grupid
+ KernelSU on, ja alati jääb, tasuta ning avatud lähtekoodiga kättesaadavaks. Sellegipoolest võid sa näidata, et hoolid, ning teha annetuse.
+ Mall
+ Vaata lähtekoodi %1$sis
Liitu meie %2$si kanaliga
+ Profiili nimi
+ Kohandatud
+ Päritud
+ Globaalne
+ Individuaalne
+ Võimekused
+ Sobimatu malli ID
+ SELinux kontekst
+ Praegune KernelSU versioon %d on liiga madal, haldur ei saa korrektselt töötada. Palun täienda versioonile %d või kõrgem!
+ Domeen
+ Käivita
+ Sundpeata
+ Reeglid
+ Uuenda
+ Mooduli allalaadimine: %s
+ Uus versioon %s on saadaval, klõpsa täiendamiseks.
+ Taaskäivita
+ Muudatuste logi
+ Nimi
+ Kirjeldus
+ Edukalt imporditud
+ Salvesta
+ Lõikelaud on tühi!
+ Kustuta
+ Vaata malli
+ Impordi/ekspordi
+ Impordi lõikelaualt
+ Malli salvestamine ebaõnnestus
+ Loo mall
+ Halda kohalikke ja võrgusolevaid rakenduseprofiili malle
+ Selle valiku lubamine lubab KernelSU-l taastada selle rakenduse moodulite poolt mistahes muudetud faile.
+ Ei saa eksportida, kohalikku malli ei leitud!
+ Globaalne vaikeväärtus \"Lahtihaagitud moodulitele\" rakenduseprofiilis. Lubamisel eemaldab see kõik moodulite süsteemimuudatused rakendustele, millel ei ole profiili määratud.
+ Saab kasutada WebUI silumiseks, palun luba ainult vajadusel.
+ Juurkasutaja andmine ebaõnnestus!
+ Kontrolli uuendusi
+ Rakenduse avamisel kontrolli automaatselt uuendusi
+ Ava
+ Luba WebView silumine
+ Salvesta Logid
+ Vali KMI
+ %1$s partitsioonitõmmis on soovitatud
+ Edasi
+ Sinu seade **SUNNITAKSE** pärast taaskäivitust ebaaktiivsesse lahtrisse käivituma!\nKasuta seda valikut vaid siis, kui tegid üle-õhu uuenduse.\nJätkad?
+ Eemalda
+ Eemalda KernelSU ajutiselt, taasta pärast taaskäivitust algseisu.
+ KernelSU eemaldamine (juurkasutaja ja kõik moodulid) täielikult ja püsivalt.
+ Taasta tehase-vaiketõmmis (kui varundus eksisteerib), tavaliselt kasutatakse enne üle-õhu uuendust; kui soovid KernelSU-d eemaldada, palun kasuta \"Eemalda püsivalt\".
+ Välgutamine
+ Välgutamine õnnestus
+ Välgutamine ebaõnnestus
+ Valitud LKM: %s
+ Otsene paigaldus (soovitatud)
+ Vali fail
+ Paigalda ebaaktiivsesse lahtrisse (pärast üle-õhu uuendust)
+ Eemalda ajutiselt
+ Eemalda püsivalt
+ Taasta vaikimisi tõmmis
+
\ No newline at end of file
diff --git a/manager/app/src/main/res/values-fa/strings.xml b/manager/app/src/main/res/values-fa/strings.xml
index 6a6cf2a4b5a4..17469cc8a892 100644
--- a/manager/app/src/main/res/values-fa/strings.xml
+++ b/manager/app/src/main/res/values-fa/strings.xml
@@ -1,66 +1,68 @@
+
-خانه
-نصب نشده است
-برای نصب ضربه بزنید
-به درستی کار میکند
-نسخه: %d
-برنامه های با دسترسی روت: %d
-ماژولها: %d
-پشتیبانی نشده
-کرنل اس یو فقط هسته های gki را پشتیبانی میکند
+ خانه
+ نصب نشده است
+ برای نصب ضربه بزنید
+ به درستی کار میکند
+ نسخه: %d
+ برنامه های با دسترسی روت: %d
+ ماژولها: %d
+ پشتیبانی نشده
+ کرنل اس یو فقط هسته های gki را پشتیبانی میکند
هسته
نسخه برنامه
اثرانگشت
وضعیت SELinux
-غیرفعال
-قانونمند
-آزاد
-ناشناخته
-دسترسی روت
+ غیرفعال
+ قانونمند
+ آزاد
+ ناشناخته
+ دسترسی روت
فعال کردن ماژول ناموفق بود: %s
-غیرفعال کردن ماژول ناموفق بود: %s
-هیچ ماژولی نصب نشده است
-ماژول
-لغو نصب
-نصب
-نصب
-راه اندازی دوباره
-تنظیمات
-راه اندازی نرم
-راه اندازی به ریکاوری
-راه اندازی به بوتلودر
-راه اندازی به حالت دانلود
-راه اندازی به EDL
-درباره
+ غیرفعال کردن ماژول ناموفق بود: %s
+ هیچ ماژولی نصب نشده است
+ ماژول
+ لغو نصب
+ نصب
+ نصب
+ راه اندازی دوباره
+ تنظیمات
+ راه اندازی نرم
+ راه اندازی به ریکاوری
+ راه اندازی به بوتلودر
+ راه اندازی به حالت دانلود
+ راه اندازی به EDL
+ درباره
آیا مطمئنید که میخواهید ماژول %s را پاک کنید؟
-%s پاک شد
-پاک کردن ناموفق بود: %s
-نسخه
-سازنده
-overlayfs موجود نیست. مازول کار نمیکند!!
-تازهسازی
-نمایش برنامه های سیستمی
-مخفی کردن برنامه های سیستمی
-ارسال وقایع
-حالت امن
-راهاندازی مجدد برای تاثیرگذاری
-مازول به دلیل تعارض با مجیسک غیرفعال شده اند\'s!
-یادگیری کرنل اس یو
-https://kernelsu.org/guide/what-is-kernelsu.html
-یاد بگیرید چگونه از کرنل اس یو و ماژول ها استفاده کنید
-از ما حمایت کنید
-KernelSU رایگان است و همیشه خواهد بود و منبع باز است. با این حال، می توانید با اهدای کمک مالی به ما نشان دهید که برایتان مهم است.
-
+ %s پاک شد
+ پاک کردن ناموفق بود: %s
+ نسخه
+ سازنده
+ overlayfs موجود نیست. مازول کار نمیکند!!
+ تازهسازی
+ نمایش برنامه های سیستمی
+ مخفی کردن برنامه های سیستمی
+ ارسال وقایع
+ حالت امن
+ راهاندازی مجدد برای تاثیرگذاری
+ مازول به دلیل تعارض با مجیسک غیرفعال شده اند\'s!
+ یادگیری کرنل اس یو
+ https://kernelsu.org/guide/what-is-kernelsu.html
+ یاد بگیرید چگونه از کرنل اس یو و ماژول ها استفاده کنید
+ از ما حمایت کنید
+ KernelSU رایگان است و همیشه خواهد بود و منبع باز است. با این حال، می توانید با اهدای کمک مالی به ما نشان دهید که برایتان مهم است.
+
Join our %2$s channel ]]>
-پروفایل برنامه
-پیشفرض
-قالب
-شخصی سازی شده
-اسم پروفایل
-Mount namespace
-اثر گرفته
-گلوبال
-تکی
-جداکردن ماژول ها
-
+ پروفایل برنامه
+ پیشفرض
+ قالب
+ شخصی سازی شده
+ اسم پروفایل
+ Mount namespace
+ اثر گرفته
+ گلوبال
+ تکی
+ جداکردن ماژول ها
+ ذخیره گزارشها
+
\ No newline at end of file
diff --git a/manager/app/src/main/res/values-fil/strings.xml b/manager/app/src/main/res/values-fil/strings.xml
index f708f0b71ca1..fc527bf30627 100644
--- a/manager/app/src/main/res/values-fil/strings.xml
+++ b/manager/app/src/main/res/values-fil/strings.xml
@@ -66,4 +66,5 @@
Pangalan ng profile
Minana
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.
+ I-save ang mga Log
\ No newline at end of file
diff --git a/manager/app/src/main/res/values-fr/strings.xml b/manager/app/src/main/res/values-fr/strings.xml
index a2d63632fb2b..93668235ce99 100644
--- a/manager/app/src/main/res/values-fr/strings.xml
+++ b/manager/app/src/main/res/values-fr/strings.xml
@@ -5,10 +5,10 @@
Version : %d
Super-utilisateurs : %d
Modules : %d
- Actuellement, KernelSU ne supporte que les noyaux GKI
+ KernelSU ne prend désormais en charge que les noyaux GKI
Noyau
Empreinte digitale
- Statut de SELinux
+ Mode SELinux
Désactivé
Permissive
Inconnu
@@ -16,12 +16,12 @@
Aucun module installé
Accueil
Appuyez ici pour installer
- Non supporté
- Échec de la désinstallation : %s
+ Non pris en charge
+ Échec de la désinstallation : %s
Version
Version du gestionnaire
Enforcing
- Échec de l\'activation du module : %s
+ Échec de l\'activation du module : %s
Modules
Désinstaller
Installer
@@ -29,30 +29,29 @@
Redémarrer
Installer
Paramètres
- Redémarrer vers le bootloader
- Redémarrage logiciel
- Redémarrer en mode récupération
+ Redémarrer en mode bootloader
+ Redémarrage progressif
+ Redémarrer en mode de récupération
Redémarrer en mode EDL
À propos
- %s désinstallé
- Redémarrer en mode téléchargement
+ %s a été désinstallé
+ Redémarrer en mode de téléchargement
Auteur
Êtes-vous sûr(e) de vouloir désinstaller le module %s \?
Découvrir KernelSU
- OverlayFS n\'est pas disponible, impossible de faire fonctionner le module !
+ Les modules sont indisponibles car OverlayFS est désactivé par le noyau.
Rafraîchir
Afficher les applications système
Masquer les applications système
Mode sans échec
- Envoyer les logs
+ Envoyer les journaux
Redémarrez pour appliquer les modifications
- Les modules sont désactivés car ils sont en conflit avec ceux de Magisk !
+ Les modules sont indisponibles en raison d\'un conflit avec Magisk !
https://kernelsu.org/guide/what-is-kernelsu.html
Soutenez-nous
Découvrez comment installer KernelSU et utiliser les modules
- KernelSU est et restera toujours gratuit et open source. Vous pouvez cependant nous témoigner de votre soutien en nous faisant un don.
- Voir le code source sur %1$s
-\nRejoindre notre canal %2$s
+ KernelSU est, et restera toujours, gratuit et open source. Vous pouvez cependant nous témoigner de votre soutien en nous faisant un don.
+ Voir le code source sur %1$s
\nRejoindre notre canal %2$s
Modèle
Par défaut
Personnalisé
@@ -66,18 +65,70 @@
Capacités
Démonter les modules
Échec de la modification du profil d\'application de %s
- L\'activation de cette option permettra à KernelSU de restaurer tous les fichiers modifiés par les modules de cette application.
+ L\'activation de cette option permettra à KernelSU de restaurer tous les fichiers modifiés par les modules pour cette application.
Démonter les modules par défaut
- Valeur globale par défaut pour « Démonter les modules » dans les profils d\'application. Si l\'option est activée, les modifications apportées au système par les modules seront supprimées pour les applications qui n\'ont pas de profil défini.
+ Valeur globale par défaut pour l\'option « Démonter les modules » dans les profils d\'application. Lorsqu\'elle est activée, les modifications apportées au système par les modules seront supprimées pour les applications qui n\'ont pas de profil défini.
Domaine
Règles
Mettre à jour
Téléchargement du module : %s
Lancer
- Nouvelle version : la %s est disponible, appuyez ici pour la télécharger
+ La nouvelle version %s est disponible, appuyez ici pour mettre à jour.
Début du téléchargement de : %s
Forcer l\'arrêt
Relancer l\'application
- Échec de la mise à jour des règles de SELinux pour : %s
- La version actuelle (%d) de KernelSU est trop ancienne pour que le gestionnaire fonctionne correctement. Veuillez passer à la version %d ou à une version supérieure !
+ Échec de la mise à jour des règles SELinux pour : %s
+ 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 !
+ Importation réussie
+ Exporter vers le presse-papiers
+ Impossible de trouver un modèle local à exporter !
+ L\'ID du modèle existe déjà !
+ Journal des modifications
+ Importer à partir du presse-papiers
+ Échec de récupération du journal des modifications : %s
+ Nom
+ ID de modèle invalide
+ Synchroniser les modèles en ligne
+ Créer un modèle
+ Lecture seule
+ Importer/exporter
+ Échec de l\'enregistrement du modèle
+ Modifier le modèle
+ ID
+ Modèles de profils d\'application
+ Description
+ Enregistrer
+ Gérer les modèles de profils d\'application locaux et en ligne
+ Supprimer
+ Le presse-papiers est vide !
+ Voir le modèle
+ Vérifier automatiquement les mises à jour à l\'ouverture de l\'application
+ Vérifier les mises à jour
+ Activer le débogage WebView
+ Peut être utilisé pour déboguer WebUI, n\'activez cette option que si nécessaire.
+ Échec de l\'octroi des privilèges root !
+ Ouvrir
+ Installation directe (recommandé)
+ Sélectionner un fichier
+ Installer dans l\'emplacement inactif (après OTA)
+ Votre appareil sera **FORCÉ** à démarrer sur l\'emplacement inactif actuel après un redémarrage !
+\nN\'utilisez cette option qu\'une fois la mise à jour OTA terminée.
+\nContinuer ?
+ Suivant
+ L\'image de la partition %1$s est recommandée
+ Sélectionner une KMI
+ Minimiser la taille de l\'image creuse
+ Redimensionne l\'image creuse où le module est situé à sa taille réelle. Notez que cela peut entraîner un dysfonctionnement du module, veuillez utiliser cette option uniquement lorsque cela est nécessaire (par exemple pour la sauvegarde de l\'appareil).
+ Désinstaller
+ Désinstaller temporairement
+ Désinstaller définitivement
+ Restaurer l\'image d\'origine
+ Restaurer l\'image d\'origine d\'usine (s\'il en existe une sauvegarde), option généralement utilisée avant une mise à jour OTA ; si vous avez besoin de désinstaller KernelSU, utilisez plutôt l\'option « Désinstaller définitivement ».
+ Flash en cours
+ Flash réussi
+ Échec du flash
+ LKM sélectionné : %s
+ Désinstallation complète et permanente de KernelSU (root et tous les modules).
+ Désinstaller KernelSU temporairement et rétablir l\'état original au redémarrage suivant.
+ Enregistrer les journaux
\ No newline at end of file
diff --git a/manager/app/src/main/res/values-gl/strings.xml b/manager/app/src/main/res/values-gl/strings.xml
new file mode 100644
index 000000000000..89956f2306d6
--- /dev/null
+++ b/manager/app/src/main/res/values-gl/strings.xml
@@ -0,0 +1,4 @@
+
+
+ Inicio
+
\ No newline at end of file
diff --git a/manager/app/src/main/res/values-hi/strings.xml b/manager/app/src/main/res/values-hi/strings.xml
index 899b327cf265..f930446936f3 100644
--- a/manager/app/src/main/res/values-hi/strings.xml
+++ b/manager/app/src/main/res/values-hi/strings.xml
@@ -80,4 +80,5 @@
%1$s पर स्रोत कोड देखें
हमारे %2$s चैनल से जुड़ें
मैनेजर वर्जन
नया वर्जन: %s उपलब्ध है,अपग्रेड के लिए क्लिक करें
+ लॉग सहेजें
\ No newline at end of file
diff --git a/manager/app/src/main/res/values-hr/strings.xml b/manager/app/src/main/res/values-hr/strings.xml
index e57b3a201df5..9fb1e4c67460 100644
--- a/manager/app/src/main/res/values-hr/strings.xml
+++ b/manager/app/src/main/res/values-hr/strings.xml
@@ -79,4 +79,5 @@
Pokrenite
Prisilno Zaustavite
Resetujte
+ Spremi Zapise
\ No newline at end of file
diff --git a/manager/app/src/main/res/values-hu/strings.xml b/manager/app/src/main/res/values-hu/strings.xml
index e4e85643f177..765cf9ebca17 100644
--- a/manager/app/src/main/res/values-hu/strings.xml
+++ b/manager/app/src/main/res/values-hu/strings.xml
@@ -3,80 +3,132 @@
Működik
Verzió: %d
Modulok: %d
- KernelSU csak GKI kerneleket támogat jelenleg
+ A KernelSU jelenleg csak GKI kerneleket támogat
Kernel
- App verziója
- Build Fingerprint
- Kikapcsolt
+ Alkalmazás verziója
+ Ujjlenyomat
+ Letiltva
Újraindítás letöltő módba
Újraindítás EDL-be
Névjegy
- Biztos vagy benne hogy eltávolítod a következő modult: %s\?
+ Biztos benne hogy eltávolítja a következő modult: %s?
Nem sikerült eltávolítani: %s
Készítő
- Overlayfs nem elérhető, a modul nem tud enélkül működni!
- Újratöltés
- Mutasd a rendszer alkalmazásokat
- Rejtsd el a rendszer alkalmazásokat
+ A modulok nem érhetők el, mivel az OverlayFS-t a kernel letiltotta.
+ Frissítés
+ Rendszeralkalmazások megjelenítése
+ Rendszeralkalmazások elrejtése
Biztonságos mód
- A modul letiltva mert ütközik a Magisk verziójával!
- Tudj meg többet a KernelSU-ról
- Tudd meg hogyan telepítsd a KernelSU-t és használd moduljait
- Támogass minket
- Tekintsd meg a forráskódot a %1$s-n
Csatlakozz a %2$s csatornánkhoz
+ A modulok nem érhetők el a Magiskkel való ütközés miatt!
+ Tudjon meg többet a KernelSU-ról
+ Ismerje meg a KernelSU telepítését és a modulok használatát
+ Támogasson minket
+ Tekintse meg a forráskódot a %1$s-on
Csatlakozzon a %2$s csatornánkhoz
Alapértelmezett
Sablon
Egyedi
Profil neve
- Mountold a névteret
+ Névtér csatlakoztatása
Örökölt
https://kernelsu.org/guide/what-is-kernelsu.html
Különálló
Csoportok
Jogosultságok
- SElinux kontextus
- Umountold a modulokat alpértelmezés szerint
- Ennek az opciónak az engedélyezése lehetővé teszi, hogy a KernelSU visszaállítsa az alkalmazás moduljai által módosított fájlokat.
+ SELinux kontextus
+ Modulok leválasztása alapértelmezetten
+ Ha engedélyezi ezt az opciót, a KernelSU visszaállíthatja az alkalmazás moduljai által módosított fájlokat.
Tartomány
Szabályok
Frissítés
- A %s modul letöltése folyamatban
- Indítsd el a letöltést: %s
+ Modul letöltése: %s
+ Letöltés indítása: %s
Indítás
Kényszerített leállítás
újraindítás
Kezdőlap
Nincs telepítve
- Kattints a telepítéshez
+ Kattintson a telepítéshez
Engedélyezett alkalmazások: %d
Nem támogatott
- SELinux státusz
- Érvényesítés
- Megengedő
+ SELinux állapot
+ Kényszerített
+ Engedélyezett
Ismeretlen
Superuser
Nem sikerült engedélyezni a következő modult: %s
- Nem sikerült letiltani a következő modulokat: %s
- Nincs modul telepítve
+ Nem sikerült letiltani a következő modult: %s
+ Nincs telepített modul
Modulok
Eltávolítás
Telepítés
Telepítés
Újraindítás
Beállítások
- Android felület újraindítása
+ Rendszerfelület újraindítása
Újraindítás recovery-módba
Újraindítás bootloader-módba
%s eltávolítva
Verzió
- Fejlesztői napló küldése
- Indítsd újra a készüléket hogy érvényesítsd a változást
- A KernelSU ingyenes és nyílt forráskódú és mindig is az lesz. Te viszont meg tudod mutatni azt, hogy törődsz ennek a projektnek a sorsával egy adomány formájában.
+ Naplók küldése
+ Indítsa újra a készüléket a változások érvényesítéséhez
+ A KernelSU ingyenes, nyílt forráskódú és mindig is az lesz. Ön azonban adományozással megmutathatja, hogy törődik a projekttel.
Globális
- Unmountold a modulokat
- Nem sikerült frissíteni az App Profilt ehhez %s
- A „Modulok csatlakoztatása” globális alapértelmezett értéke az alkalmazásprofilokban. Ha engedélyezve van, eltávolítja a rendszer összes modul-módosítását azoknál az alkalmazásoknál, amelyeknek nincs beállított profilja.
- Új verzió: %s elérhető, kattints a letöltéséhez
- Nem sikerült frissíteni a SELinux szabályait a következőhöz: %s
- A jelenlegi KernelSU verzió %d túlságosan elavult. Kérlek frissíts a %d verzióra vagy újabbra!
+ Modulok leválasztása
+ Nem sikerült frissíteni az App Profilt ehhez: %s
+ 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.
+ Elérhető az új, %s verzió, kattintson a frissítéshez.
+ Nem sikerült frissíteni az SELinux szabályokat a következőhöz: %s
+ A jelenlegi KernelSU verzió %d túlságosan elavult a megfelelő működéshez. Kérjük frissítsen a %d verzióra vagy újabbra!
+ Sikeresen importálva
+ Exportálás a vágólapról
+ Nem található helyi sablon az exportáláshoz!
+ A sablon ID már létezik!
+ Változások
+ Importálás a vágólapról
+ A változásnapló lekérése nem sikerült: %s
+ Név
+ Hibás sablon ID
+ Online sablonok szinkronizálása
+ Sablon készítése
+ Csak olvasható
+ Import/Export
+ A sablon mentése sikertelen
+ Sablon szerkesztése
+ ID
+ App Profile sablon
+ Leírás
+ Mentés
+ Az App Profile helyi és online sablonjának kezelése
+ Törlés
+ A vágólap üres!
+ Sablon megtekintése
+ Naplók mentése
+ A WebUI hibakeresésére használható, csak szükség esetén engedélyezze.
+ WebView hibakeresés engedélyezése
+ Megnyitás
+ Végleges eltávolítás
+ %1$s partíció képfájl ajánlott
+ KMI kiválasztása
+ Következő
+ Ideiglenes eltávolítás
+ A KernelSU ideiglenes eltávolítása, az eredeti állapot visszaállítása a következő újraindítás után.
+ Eltávolítás
+ Telepítés
+ Sikeres telepítés
+ Kiválasztott LKM: %s
+ Sikertelen telepítés
+ A root jog megadása sikertelen!
+ Telepítés inaktív helyre (OTA után)
+ Fájl kiválasztása
+ A KernelSU eltávolítása (root és az összes modul) teljesen és véglegesen.
+ Eredeti képfájl visszaállítása
+ Művelet
+ Közvetlen telepítés (Ajánlott)
+ Az eszköze **KÉNYSZERÍTETTEN** a jelenleg inaktív helyről fog indulni újraindítás után!\nCsak az OTA befejezése után használja.\nFolytatja?
+ Átméretezi a sparse képfájlt, ahol a modul található, a tényleges méretére. Vegye figyelembe, hogy ez a modul rendellenes működését okozhatja, ezért kérjük, hogy csak akkor használja, ha szükséges (például biztonsági mentéshez).
+ Állítsa vissza a gyári képfájlt (ha létezik biztonsági mentés). Általában OTA előtt használják. Ha a KernelSU-t szeretné eltávolítani, használja a végleges eltávolítás opciót.
+ Frissítés ellenőrzése
+ Automatikusan keressen frissítéseket az alkalmazás megnyitásakor
+ Mentett naplók
+ Sparse képfájl minimalizálása
\ No newline at end of file
diff --git a/manager/app/src/main/res/values-in/strings.xml b/manager/app/src/main/res/values-in/strings.xml
index 8eead48dc813..b2291e9280ba 100644
--- a/manager/app/src/main/res/values-in/strings.xml
+++ b/manager/app/src/main/res/values-in/strings.xml
@@ -1,84 +1,139 @@
Beranda
- Tidak terpasang
- Klik untuk memasang
- Bekerja
+ Tidak terinstal
+ Klik untuk menginstal
+ Berfungsi
Versi: %d
- Superusers: %d
+ SuperUser: %d
Modul: %d
Tidak didukung
- KernelSU hanya mendukung kernel GKI saat ini
+ KernelSU saat ini hanya mendukung kernel GKI
Kernel
- Versi Manager
- Sidik jari
+ Versi manager
+ Identitas
Status SELinux
- Dinonaktifkan
+ Nonaktif
Enforcing
- Permasif
- Tidak dikenal
- Superuser
+ Permisif
+ Tidak diketahui
+ SuperUser
Gagal mengaktifkan modul: %s
Gagal menonaktifkan modul: %s
Tidak ada modul yang terpasang
Modul
- Copot
- Pasang
- Pasang
- Mulai ulang
+ Hapus
+ Instal
+ Instal
+ Reboot
Pengaturan
Soft Reboot
- Mulai ulang ke Recovery
- Mulai ulang ke Bootloader
- Mulai ulang ke Download
- Mulai ulang ke EDL
+ Reboot ke Recovery
+ Reboot ke Bootloader
+ Reboot ke Download
+ Reboot ke EDL
Tentang
- Apakah Anda yakin ingin mencopot modul %s?
- %s Tercopot
- Gagal untuk mencopot: %s
+ Yakin menghapus modul %s?
+ %s berhasil dihapus
+ Gagal menghapus: %s
Versi
- Pembuat
- overlayfs tidak tersedia, modul tidak dapat bekerja!
- Segarkan
- Tampilkan apl sistem
- Sembunyikan apl sistem
+ Oleh
+ Kernel tidak mendukung OverlayFS, modul tidak akan berfungsi.
+ Muat ulang
+ Tampilkan aplikasi sistem
+ Sembunyikan aplikasi sistem
Kirim Log
Mode aman
- Mulai ulang untuk menerapkan
- Modul dinonaktifkan karena bertentangan dengan Magisk!
+ Reboot agar berfungsi
+ Konflik dengan Magisk, fungsi modul ditiadakan!
Pelajari KernelSU
https://kernelsu.org/id_ID/guide/what-is-kernelsu.html
- Pelajari cara memasang KernelSU dan menggunakan modul
+ Pelajari cara instal KernelSU dan menggunakan modul
Dukung Kami
- KernelSU gratis dan bersumber terbuka, dan akan selalu seperti itu. Bagaimanapun juga Anda dapat menunjukan kepedulian Anda kepada kami dengan mengirimkan sedikit donasi.
- Gabung kanal %2$s kami]]>
+ KernelSU akan selalu menjadi aplikasi gratis dan terbuka. Anda dapat memberikan donasi sebagai bentuk dukungan.
+ Gabung kanal %2$s kami]]>
Profil Apl
Bawaan
Templat
Khusus
Nama profil
- Ikat ruang-nama
+ Mount Namespace
Diwariskan
Universal
- Personal
+ Individual
Kelompok
Kemampuan
Konteks SELinux
- Lepas modul
- Gagal memperbarui Profil Apl untuk %s
- Lepas modul secara bawaan
- Nilai bawaan universal untuk \"Lepas modul\" di Profil-profil Apl. Jika diaktifkan, ini akan menghapus semua modifikasi modul pada sistem untuk aplikasi yang tidak memiliki set Profil.
- Mengaktifkan opsi ini akan mengizinkan KernelSU memulihkan file-file yang dimodifikasi oleh modul untuk aplikasi ini.
+ Umount Modul
+ Gagal membarui Profil pada %s
+ Melepas Modul secara bawaan
+ Menggunakan \"Umount Modul\" secara universal pada Profil Aplikasi. Jika diaktifkan, akan menghapus semua modifikasi sistem untuk aplikasi yang tidak memiliki set profil.
+ Aktifkan opsi ini agar KernelSU dapat memulihkan kembali berkas termodifikasi oleh modul pada aplikasi ini.
Domain
Aturan
- Perbarui
- Mengunduh module: %s
+ Membarui
+ Mengunduh modul: %s
Mulai mengunduh: %s
- Versi baru: %s sudah tersedia, tap untuk mengunduh
+ Tersedia versi terbaru %s, Klik untuk membarui.
Jalankan
- Paksa Berhenti
+ Paksa berhenti
Mulai ulang
- Gagal memperbarui aturan SELinux untuk: %s
- Versi KernelSU saat ini %d terlalu rendah bagi manajer untuk dapat berfungsi dengan baik. Harap tingkatkan ke versi %d atau yang lebih tinggi!
+ Gagal membarui aturan SELinux pada: %s
+ Versi KernelSU %d terlalu rendah agar manajer berfungsi normal. Harap membarui ke versi %d atau di atasnya!
Catatan Perubahan
+ Berhasil diimpor
+ Ekspor ke papan klip
+ Tidak ditemukan templat lokal untuk diekspor!
+ ID templat sudah ada!
+ Impor dari papan klip
+ Gagal mengambil Changelog: %s
+ Nama
+ ID template tidak valid
+ Sinkronkan templat daring
+ Buat templat
+ Impor/Ekspor
+ Gagal menyimpan templat
+ Edit templat
+ ID
+ Templat Profil Aplikasi
+ Deskripsi
+ Simpan
+ Atur templat Profil yang lokal dan daring
+ Hapus
+ Papan klip kosong!
+ Lihat templat
+ readonly
+ Pengawakutuan WebView
+ Dapat digunakan untuk men-debug WebUI. Harap aktifkan hanya bila diperlukan.
+ %1$s image partisi terekomendasi
+ Pilih KMI
+ Selanjutnya
+ Gawai akan **DIPAKSA** untuk but ke slot nonaktif!
+\nHANYA gunakan setelah proses OTA selesai.
+\nLanjutkan?
+ Instal langsung (rekomendasi)
+ Pilih berkas
+ Instal ke slot nonaktif (setelah OTA)
+ Gagal memberikan akses root!
+ Buka
+ Cek terbaru
+ Cek terbaru setiap membuka aplikasi
+ Minimalkan ukuran sparse image
+ Mengembalikan ukuran sparse image, lokasi modul disimpan, ke ukuran sebenarnya. Dapat menyebabkan modul bekerja abnormal, gunakan saat dibutuhkan saja (mis. untuk pencadangan).
+ Hapus permanen KernelSU (root dan modul).
+ Hapus sementara
+ Pulihkan image bawaan
+ Hapus
+ Sementara menghapus KernelSU, memulihkan ke kondisi asal setelah reboot berikutnya.
+ Hapus permanen
+ Pulihkan image bawaan ROM (jika cadangan tersedia), umumnya dilakukan sebelum OTA; jika ingin menghapus KernelSU, gunakan fungsi \"Hapus permanen\".
+ Pemasangan Berhasil
+ LKM dipilih: %s
+ Pasang
+ Pemasangan Gagal
+ Simpan Log
+ Action
+ Log disimpan
+ Urut (Diaktifkan terlebih dahulu)
+ Urut (Tindakan pertama)
\ No newline at end of file
diff --git a/manager/app/src/main/res/values-it/strings.xml b/manager/app/src/main/res/values-it/strings.xml
index 436023aecead..642640b3cff4 100644
--- a/manager/app/src/main/res/values-it/strings.xml
+++ b/manager/app/src/main/res/values-it/strings.xml
@@ -5,14 +5,14 @@
Clicca per installare
In esecuzione
Versione: %d
- Superuser: %d
- Moduli: %d
+ Applicazioni con accesso root: %d
+ Moduli installati: %d
Non supportato
KernelSU ora supporta solo i kernel GKI
Kernel
Versione del manager
- Fingerprint
- Stato SELinux
+ Impronta della build di Android
+ Stato di SELinux
Disabilitato
Enforcing
Permissive
@@ -21,14 +21,14 @@
Impossibile abilitare il modulo: %s
Impossibile disabilitare il modulo: %s
Nessun modulo installato
- Moduli
+ Modulo
Disinstalla
Installa
Installa
Riavvia
Impostazioni
- Riavvio veloce
- Riavvia in Recovery
+ Riavvio rapido
+ Riavvia in modalità Recovery
Riavvia in modalità Bootloader
Riavvia in modalità Download
Riavvia in modalità EDL
@@ -38,14 +38,14 @@
Impossibile disinstallare: %s
Versione
Autore
- overlayfs non è disponibile, il modulo non può funzionare!
- Aggiorna
+ overlayfs non è disponibile, i moduli non possono funzionare!
+ Ricarica
Mostra app di sistema
Nascondi app di sistema
Invia log
Modalità provvisoria
Riavvia per applicare la modifica
- I moduli sono disabilitati perché in conflitto con quelli di Magisk!
+ I moduli sono disabilitati perché in conflitto con Magisk!
Scopri KernelSU
https://kernelsu.org/guide/what-is-kernelsu.html
Scopri come installare KernelSU e utilizzare i moduli
@@ -53,17 +53,17 @@
KernelSU è, e sempre sarà, gratuito e open source. Puoi comunque mostrarci il tuo apprezzamento facendo una donazione.
Unisciti al nostro canale %2$s]]>
Nome profilo
- Namespace di mount
+ Spazio dei nomi del mount
Globale
Gruppi
Ereditato
Individuale
Predefinito
Personalizzato
- Template
+ Modello
Scollega moduli
Contesto SELinux
- Aggiornamento Profilo per %s fallito
+ Aggiornamento App Profile per %s fallito
Aggiorna
Apri
Capacità
@@ -71,12 +71,64 @@
Regole
Sto scaricando il modulo: %s
Inizia a scaricare:%s
- Nuova versione: %s disponibile, tocca per scaricare
+ Nuova versione: %s disponibile, tocca per aggiornare
Arresto forzato
Riavvia
Aggiornamento regole SELinux per %s fallito
Attivando questa opzione permetterai a KernelSU di ripristinare ogni file modificato dai moduli per questa app.
Dominio
- Il valore predefinito per \"Scollega moduli\" in Profili App. Se attivato, rimuoverà tutte le modifiche al sistema da parte dei moduli per le applicazioni che non hanno un profilo impostato.
+ 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.
La versione attualmente installata di KernelSU (%d) è troppo vecchia ed il gestore non può funzionare correttamente. Si prega di aggiornare alla versione %d o successiva!
+ Registro aggiornamenti
+ Crea modello
+ Modifica modello
+ identificatore
+ Identificativo modello non valido
+ Nome
+ Visualizza modello
+ Sola lettura
+ L\'identificatore del modello è già in uso!
+ Importa/Esporta
+ Importa dagli appunti
+ Esporta negli appunti
+ Impossibile trovare un modello locale da esportare!
+ Importato con successo
+ Sincronizza i modelli remoti
+ Gli appunti sono vuoti!
+ Impossibile ottenere l\'accesso root!
+ Modelli App Profile
+ Gestisci i modelli locali e remoti di App Profile
+ Elimina
+ Descrizione
+ Salva
+ Impossibile salvare il modello
+ Apri
+ Impossibile reperire il changelog: %s
+ Controlla aggiornamenti
+ Controlla automaticamente la disponibilità di aggiornamenti all\'apertura dell\'applicazione
+ Abilita il debug di WebView
+ Può essere usato per svolgere il debug di WebUI, è consigliato attivarlo solo quando necessario.
+ È consigliato usare immagine della partizione %1$s
+ Scegli il KMI
+ Avanti
+ Installazione diretta (Raccomandata)
+ Scegli un file
+ Installa nello slot inattivo (dopo OTA)
+ Il tuo dispositivo sarà **FORZATO** ad avviarsi nello slot inattivo dopo il riavvio!
+\nUsa questa opzione solo quando l\'applicazione dell\'aggiornamento OTA è terminata.
+\nProcedere?
+ Riduci la dimensione dell\'immagine moduli sparse al minimo
+ Riduci la dimensione dell\'immagine sparse dei moduli alla sua reale dimensione. Nota che questo potrebbe causare malfunzionamenti dei moduli quindi utilizzala solo quando necessario (ad esempio in caso di backup)
+ Disinstalla
+ Disinstalla temporaneamente
+ Disinstalla permanentemente
+ Ripristina immagine originale del produttore
+ Disinstalla temporaneamente KernelSU, ripristina lo stato originale dopo il prossimo riavvio.
+ Disinstalla KernelSU (root e tutti i moduli) completamente e permanentemente.
+ Installazione
+ Installazione completata
+ Installazione fallita
+ LKM selezionato: %s
+ Ripristina l\'immagine di fabbrica del produttore (se il backup è presente), solitamente usato prima di applicare l\'OTA; se devi disinstallare KernelSU, utilizza invece \"Disinstalla permanentemente\".
+ Salva Registri
\ No newline at end of file
diff --git a/manager/app/src/main/res/values-iw/strings.xml b/manager/app/src/main/res/values-iw/strings.xml
index eee70a9bbccf..18cfc638eb9d 100644
--- a/manager/app/src/main/res/values-iw/strings.xml
+++ b/manager/app/src/main/res/values-iw/strings.xml
@@ -80,4 +80,5 @@
ראה את קוד המקור ב%1$s
הצטרף אלינו %2$s בערוץ
גרסת מנהל
גרסה חדשה עבור: %s זמינה, לחץ כדי לשדרג
+ שמור יומנים
\ No newline at end of file
diff --git a/manager/app/src/main/res/values-ja/strings.xml b/manager/app/src/main/res/values-ja/strings.xml
index 40c4a545a71c..beb0dac0e9c0 100644
--- a/manager/app/src/main/res/values-ja/strings.xml
+++ b/manager/app/src/main/res/values-ja/strings.xml
@@ -10,7 +10,7 @@
非対応
現在、 KernelSU は GKI カーネルにのみ対応しています
カーネル
- バージョン
+ アプリのバージョン
Fingerprint
SELinux の状態
Disabled
@@ -20,7 +20,7 @@
スーパーユーザー
モジュールの有効化に失敗: %s
モジュールの無効化に失敗: %s
- モジュールをインストールしていません
+ モジュールがインストールされていません
モジュール
アンインストール
インストール
@@ -31,26 +31,26 @@
リカバリーへ再起動
ブートローダー へ再起動
ダウンロードモードへ再起動
- EDLへ再起動
+ EDL へ再起動
アプリについて
- モジュール %s をアンインストールしますか?
- %sをアンインストールしました
+ モジュール %s をアンインストールしますか?
+ %s はアンインストールされました
アンインストールに失敗: %s
バージョン
制作者
- OverlayFS が有効でないためモジュールは動作しません!
+ カーネルによって OverlayFS が無効になっているため、モジュールが利用できません。
更新
システムアプリを表示
システムアプリを非表示
ログを送信
セーフモード
再起動すると有効化されます
- Magisk と競合しているためモジュールは無効になっています!
- KernelSU の詳細
+ モジュールが Magisk との競合により利用できません!
+ KernelSU について
https://kernelsu.org/ja_JP/guide/what-is-kernelsu.html
KernelSU のインストール方法やモジュールの使い方はこちら
支援する
- KernelSU はこれからもずっとフリーでオープンソースです。寄付をすることで私たちを気にかけていることを示せます。
+ KernelSU はこれからもずっと無料でオープンソースです。寄付をして頂くことで、開発を支援していただけます。
%2$s チャンネルに参加]]>
アプリのプロファイル
既定
@@ -64,12 +64,12 @@
モジュールのアンマウント
グループ
SELinux コンテキスト
- %sのアプリのプロファイルの更新をできませでした
+ %s のアプリのプロファイルの更新をできませでした
ドメイン
ルール
- 新しいバージョン: %s が利用可能です。タップしてダウンロード
+ 新しいバージョン %s が利用可能です。タップしてダウンロード。
アップデート
- ダウンロードを開始:%s
+ ダウンロードを開始: %s
起動
強制停止
再起動
@@ -78,7 +78,62 @@
モジュールをダウンロード中: %s
このオプションを有効にすると、KernelSU はこのアプリのモジュールによって変更されたファイルを復元できるようになります。
既定でモジュールのマウントを解除
- アプリプロファイルの「モジュールのマウント解除」の共通既定値です。 有効にすると、プロファイル セットを持たないアプリでのシステムに対するすべてのモジュール変更が削除されます。
+ アプリプロファイルの「モジュールのアンマウント」の共通のデフォルト値です。 有効にすると、プロファイルセットを持たないアプリのシステムに対するすべてのモジュールの変更が削除されます。
現在の KernelSU バージョン %d はマネージャーが適切に機能するには低すぎます。 バージョン %d 以降にアップグレードしてください!
変更履歴
+ インポート成功
+ クリップボードからエクスポート
+ エクスポートするローカル テンプレートが見つかりません!
+ テンプレート ID はすでに存在します!
+ クリップボードからインポート
+ 変更ログの取得に失敗しました: %s
+ 名前
+ 無効なテンプレート ID
+ オンラインテンプレートの同期
+ テンプレートの作成
+ 読み取り専用
+ インポート/エクスポート
+ テンプレートの保存に失敗しました
+ テンプレートの編集
+ ID
+ アプリプロファイルのテンプレート
+ 説明
+ 保存
+ アプリプロファイルのローカルおよびオンラインテンプレートを管理する
+ 消去
+ クリップボードが空です!
+ テンプレートを表示
+ アップデートを確認
+ アプリを開いたときにアップデートを自動的に確認する
+ root の付与に失敗しました!
+ 開く
+ WebView デバッグを有効にする
+ WebUI のデバッグに使用できます。必要な場合にのみ有効にしてください。
+ %1$s パーティション イメージが推奨されます
+ KMI を選択してください
+ 次に
+ 非アクティブなスロットにインストール (OTA 後)
+ 再起動後、デバイスは**強制的に**、現在非アクティブなスロットから起動します。
+\nこのオプションは、OTA が完了した後にのみ使用してください。
+\n続く?
+ 直接インストール (推奨)
+ ファイルを選択してください
+ スパースイメージを最小化
+ モジュールが配置されているスパースイメージのサイズを実際のサイズに変更します。 モジュールが正常に動作しなくなる可能性がありますので、必要な場合にのみご使用ください。
+ 完全にアンインストールする
+ ストックイメージを復元
+ 一時的にアンインストールする
+ アンインストール
+ KernelSU を一時的にアンインストールし、次回の再起動後に元の状態に戻します。
+ KernelSU (ルートおよびすべてのモジュール) を完全かつ永久にアンインストールします。
+ バックアップが存在する場合、工場出荷時のイメージを復元できます (OTA の前に使用してください)。KernelSU をアンインストールする必要がある場合は、「完全にアンインストールする」を使用してください。
+ フラッシュ
+ フラッシュ成功
+ フラッシュ失敗
+ 選択された LKM: %s
+ ログを保存
+ アクション
+ 保存されたログ
+ 並べ替え(最初に有効)
+ 並べ替え(アクション優先)
\ No newline at end of file
diff --git a/manager/app/src/main/res/values-kn/strings.xml b/manager/app/src/main/res/values-kn/strings.xml
index 564ceb544c49..3c4e79fe639f 100644
--- a/manager/app/src/main/res/values-kn/strings.xml
+++ b/manager/app/src/main/res/values-kn/strings.xml
@@ -66,4 +66,5 @@
%1$s ನಲ್ಲಿ ಮೂಲ ಕೋಡ್ ಅನ್ನು ವೀಕ್ಷಿಸಿ
ನಮ್ಮ %2$s ಚಾನಲ್ಗೆ ಸೇರಿ
ಮ್ಯಾನೇಜರ್ ವರ್ಷನ್
ಹೊಸ ಆವೃತ್ತಿ: %s ಲಭ್ಯವಿದೆ, ಅಪ್ಗ್ರೇಡ್ ಮಾಡಲು ಕ್ಲಿಕ್ ಮಾಡಿ
+ ಲಾಗ್ಗಳನ್ನು ಉಳಿಸಿ
\ No newline at end of file
diff --git a/manager/app/src/main/res/values-ko/strings.xml b/manager/app/src/main/res/values-ko/strings.xml
index 75de3a0f2c9c..3cd6d90f7702 100644
--- a/manager/app/src/main/res/values-ko/strings.xml
+++ b/manager/app/src/main/res/values-ko/strings.xml
@@ -38,24 +38,24 @@
모듈 삭제 실패: %s
버전
제작자
- overlayfs 사용 불가, 모듈을 사용할 수 없습니다!
+ 커널에서 OverlayFS를 비활성화하여 모듈을 사용할 수 없습니다.
새로고침
시스템 앱 보이기
시스템 앱 숨기기
로그 보내기
안전 모드
다시 시작하여 변경 사항 적용
- Magisk와의 충돌로 인해 모듈을 사용할 수 없습니다!
+ Magisk와 충돌로 모듈을 사용할 수 없습니다!
KernelSU 알아보기
KernelSU 설치 방법과 모듈 사용 방법을 확인합니다
지원이 필요합니다
KernelSU는 지금도, 앞으로도 항상 무료이며 오픈 소스로 유지됩니다. 기부를 통해 여러분의 관심을 보여주세요.
%2$s 채널 참가하기]]>
https://kernelsu.org/guide/what-is-kernelsu.html
- 앱 프로필 메뉴의 \"모듈 사용 해제\" 설정에 대한 전역 기본값을 설정합니다. 활성화 시, 개별 프로필이 설정되지 않은 앱은 시스템에 대한 모듈의 모든 수정사항이 적용되지 않습니다.
+ 앱 프로필 메뉴의 \"모듈 마운트 해제\" 설정에 대한 전역 기본값을 설정합니다. 활성화 시, 개별 프로필이 설정되지 않은 앱은 시스템에 대한 모듈의 모든 수정사항이 적용되지 않습니다.
다시 시작
규칙
- 새 버전: %s 사용 가능, 여기를 눌러서 받기
+ 새 버전: %s이 사용 가능합니다, 여기를 눌러 업그레이드하세요.
다운로드 시작: %s
강제 중지
기본값
@@ -72,10 +72,65 @@
권한
%s에 대한 앱 프로필 업데이트 실패
기본값으로 모듈 사용 해제
- 이 옵션이 활성화되면, KernelSU는 이 애플리케이션에 대한 모듈의 모든 수정사항을 복구합니다.
+ 이 옵션이 활성화되면, KernelSU는 이 앱에 대한 모듈의 모든 수정사항을 복구합니다.
업데이트
모듈 받는 중: %s
도메인
실행
다음 앱에 대한 SELinux 규칙 업데이트 실패: %s
+ 로그 저장
+ 업데이트 내역
+ WebUI 디버깅에 사용 가능, 필요할 때만 활성화해주세요.
+ 스파스 이미지 최소화
+ 플래시 중
+ 선택된 LKM: %s
+ %1$s 파티션 이미지 권장됨
+ KMI 선택
+ 다음
+ 완전히, 그리고 영구히 KernelSU (루트 및 모든 모듈)를 삭제합니다.
+ WebView 디버깅 활성화
+ 현재 KernelSU 버전 %d는 매니저가 올바르게 작동하기에 너무 낮습니다. 버전 %d 이상으로 업그레이드해 주세요!
+ 모듈이 위치한 스파스 이미지의 크기를 실제 크기로 조정합니다. 모듈이 비정상적으로 작동할 수 있으니, 필요할 때만 (예: 백업) 사용해 주세요.
+ 동작
+ 임시적 삭제
+ 업데이트 내역 가져오기 실패: %s
+ 열기
+ 재부팅 후 기기는 **강제로** 비활성 슬롯으로 부팅합니다!\nOTA를 진행한 후에만 이 옵션을 사용하세요.\n진행할까요?
+ 플래시 성공
+ 플래시 실패
+ 삭제
+ 영구적 삭제
+ 임시적으로 KernelSU를 삭제하고, 다음 재부팅에 원래대로 복구합니다.
+ 앱 프로필 템플레이트
+ 앱 프로필의 로컬 및 온라인 템플레이트 관리
+ ID
+ 올바르지 않은 템플레이트 id
+ 이름
+ 설명
+ 저장
+ 삭제
+ 읽기 전용
+ 템플레이트 ID가 이미 존재합니다!
+ 불러오기/내보내기
+ 클립보드에서 불러오기
+ 클립보드로 내보내기
+ 불러오기 성공
+ 온라인 템플레이트 동기화
+ 템플레이트 저장 실패
+ 클립보드가 비었습니다!
+ 루트 부여 실패!
+ 템플레이트 생성
+ 템플레이트 편집
+ 템플레이트 보기
+ 내보낼 로컬 템플레이트가 없습니다!
+ 파일 선택
+ 직접 설치 (권장)
+ 비활성 슬롯에 설치 (OTA 이후)
+ 순정 이미지 복구
+ 순정 이미지 복구 (백업이 존재한다면), OTA 전에 사용합니다; KernelSU를 삭제해야 한다면, \"영구적 삭제\"를 사용해 주세요.
+ 업데이트 확인
+ 앱 실행시 자동으로 업데이트 확인
+ 로그 저장됨
+ 정렬 (활성화됨 우선)
+ 정렬 (동작이 있는 것 우선)
\ No newline at end of file
diff --git a/manager/app/src/main/res/values-lt/strings.xml b/manager/app/src/main/res/values-lt/strings.xml
index a5ba9efca62f..cba5f5b18c25 100644
--- a/manager/app/src/main/res/values-lt/strings.xml
+++ b/manager/app/src/main/res/values-lt/strings.xml
@@ -80,4 +80,5 @@
Visuotinė numatytoji „Modulių atjungimo“ reikšmė programų profiliuose. Jei įjungta, ji pašalins visus sistemos modulio pakeitimus programoms, kurios neturi profilio.
Keitimų žurnalas
Ši KernelSU versija %d yra per žema, kad šis vadybininkas galėtų tinkamai funkcionuoti. Prašome atsinaujinti į versiją %d ar aukščiau!
+ Saglabāt Žurnālus
\ No newline at end of file
diff --git a/manager/app/src/main/res/values-lv/strings.xml b/manager/app/src/main/res/values-lv/strings.xml
new file mode 100644
index 000000000000..c264b76a650d
--- /dev/null
+++ b/manager/app/src/main/res/values-lv/strings.xml
@@ -0,0 +1,134 @@
+
+
+ Iespējojot šo opciju, KernelSU varēs atjaunot visus moduļos šīs lietojumprogrammas modificētos failus.
+ Neizdevās atjaunināt SELinux noteikumus: %s
+ Pārvaldiet vietējo un tiešsaistes lietotņu profila veidni
+ Nederīgs veidnes id
+ veidnes id jau pastāv!
+ Eksportēt starpliktuvē
+ Importēt no starpliktuves
+ Importēts veiksmīgi
+ Sinhronizēt tiešsaistes veidnes
+ Sākums
+ Nav ieinstalēts
+ Noklikšķiniet, lai instalētu
+ Darbojas
+ Versija: %d
+ Superlietotāji: %d
+ Moduļi: %d
+ Neatbalstīts
+ KernelSU atbalsta tikai GKI kodolus
+ Kodols
+ Pārvaldnieka versija
+ Pirkstu nospiedums
+ SELinux statuss
+ Izpildīšana
+ Atspējots
+ Nezināms
+ SuperLietotājs
+ Neizdevās atspējot moduli: %s
+ Nav instalētu moduļu
+ Moduļi
+ Atinstalēt
+ Instalēt
+ Restartēt
+ Iestatījumi
+ Ātri restartēt
+ Restartēt uz Bootloaderu
+ Restartēt uz Recovery
+ Restartēt uz Download
+ Restartēt uz EDL
+ Par
+ %s ir atinstalēts
+ Neizdevās atinstalēt: %s
+ Autors
+ Atjaunot
+ Rādīt sistēmas lietotnes
+ Slēpt sistēmas lietotnes
+ Ziņot žurnālu
+ Restartējiet, lai stātos spēkā
+ Uzzināt par KernelSU
+ https://kernelsu.org/guide/what-is-kernelsu.html
+ Uzzināt, kā instalēt KernelSU un izmantot moduļus
+ Atbalsti mūs
+ Skatiet avota kodu vietnē %1$s
Pievienojies mūsu %2$s kanālam
+ Noklusējums
+ Veidne
+ Pielāgots
+ Profila vārds
+ Mount nosaukumvieta
+ Individuāls
+ Iespējas
+ SELinux konteksts
+ Atvienot moduļus
+ Neizdevās atjaunināt lietotnes profilu %s
+ Pēc noklusējuma atvienot moduļus
+ 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.
+ Domēns
+ Noteikumi
+ Atjaunināt
+ Lejupielādē moduli: %s
+ Sākt lejupielādi: %s
+ Jaunā versija: %s ir pieejama, noklikšķiniet, lai atjauninātu
+ Palaist
+ Piespiedu apstāšana
+ Restartēt aplikāciju
+ Izmaiņu žurnāls
+ Lietotnes profila veidne
+ Izveidot veidni
+ Rediģēt veidni
+ id
+ Vārds
+ Apraksts
+ Saglabāt
+ Dzēst
+ Skatīt veidni
+ tikai lasīt
+ Importēt/Eksportēt
+ Nevar atrast vietējo eksportējamo veidni!
+ Neizdevās saglabāt veidni
+ Starpliktuve ir tukša!
+ Izmaiņu žurnāla iegūšana neizdevās: %s
+ Visatļautība
+ Neizdevās iespējot moduli: %s
+ Instalēt
+ Vai tiešām vēlaties atinstalēt moduli %s?
+ Versija
+ overlayfs nav pieejams, modulis nevar darboties!
+ Drošais režīms
+ Moduļi ir atspējoti, jo tie konfliktē ar Magisk!
+ KernelSU ir un vienmēr būs bezmaksas un atvērtā koda. Tomēr jūs varat parādīt mums, ka jums rūp, veicot ziedojumu.
+ Grupas
+ Globāli
+ Pašreizējā KernelSU versija %d ir pārāk zema, lai pārvaldnieks darbotos pareizi. Lūdzu, atjauniniet uz versiju %d vai jaunāku!
+ Iespējot WebView atkļūdošanu
+ Ieteicams %1$s nodalījuma attēls
+ Nākamais
+ Mantots
+ Izvēlieties failu
+ Instalēt neaktīvajā slotā (pēc OTA)
+ Pēc restartēšanas jūsu ierīce tiks **PIESPIESTI** palaista pašreizējā neaktīvajā slotā!
+\nIzmantojiet šo opciju tikai pēc OTA pabeigšanas
+\nTurpināt?
+ Tiešā instalēšana (Ieteicams)
+ Atinstalēt
+ Pagaidu atinstalēšana
+ Atjaunot oriģinālo attēlu
+ Īslaicīgi atinstalēt KernelSU, pēc nākamās restartēšanas atjaunot sākotnējo stāvokli.
+ KernelSU (saknes un visu moduļu) pilnīga atinstalēšana.
+ Atjaunojot rūpnīcas attēlu (ja ir dublējums), ko parasti izmanto pirms OTA; ja nepieciešams atinstalēt KernelSU, lūdzu, izmantojiet \"Neatgriezeniski atinstalēt\".
+ Izvēlētais lkm: %s
+ Neizdevās piešķirt sakni!
+ Atvērt
+ Pārbaudīt atjauninājumus
+ Automātiski pārbaudīt atjauninājumus atverot aplikāciju
+ Var izmantot WebUI atkļūdošanai, lūdzu, izmantot tikai tad, kad tas ir nepieciešams.
+ Izvēlieties KMI
+ Neatgriezeniski atinstalēt
+ Instalē
+ Instalēts veiksmīgi
+ Instalēšana neizdevās
+ Samazināt reto attēlu
+ Mainīt retā attēla izmēru, kurā atrodas modulis, līdz tā faktiskajam izmēram. Ņemiet vērā, ka tas var izraisīt moduļa neparastu darbību, tāpēc, lūdzu, izmantojiet tikai nepieciešamības gadījumā (piemēram, dublēšanai)
+ Išsaugoti Žurnalus
+
\ No newline at end of file
diff --git a/manager/app/src/main/res/values-mr/strings.xml b/manager/app/src/main/res/values-mr/strings.xml
index fad70307d03a..eaaf2a255b44 100644
--- a/manager/app/src/main/res/values-mr/strings.xml
+++ b/manager/app/src/main/res/values-mr/strings.xml
@@ -78,4 +78,5 @@
सक्तीने थांबा
लाँच करा
पुन्हा सुरू करा
+ लॉग जतन करा
\ No newline at end of file
diff --git a/manager/app/src/main/res/values-ms/strings.xml b/manager/app/src/main/res/values-ms/strings.xml
new file mode 100644
index 000000000000..4a8d2ba4c748
--- /dev/null
+++ b/manager/app/src/main/res/values-ms/strings.xml
@@ -0,0 +1,38 @@
+
+
+ Tidak Diketahui
+ Lumpuhkan
+ Permisif
+ Reboot ke Download
+ Modul tidak berjaya diaktifkan: %s
+ Reboot ke EDL
+ Superusers: %d
+ Modul: %d
+ Enforcing
+ Cap Jari
+ Reboot ke Recovery
+ Soft Reboot
+ Padam
+ Pasang
+ Tekan untuk memasang
+ Modul
+ Tentang
+ Versi: %d
+ Reboot
+ KernelSU ketika ini hanya menyokong kernel GKI
+ Status SELinux
+ Tidak Disokong
+ Layar Utama
+ Apakah anda pasti ingin membuang modul %s\?
+ Superuser
+ Tetapan
+ Berjalan
+ Gagal mematikan modul: %s
+ Tiada modul dipasang
+ Pasang
+ Kernel
+ Tidak terpasang
+ Reboot ke Bootloader
+ Versi manager
+ Simpan Log
+
\ No newline at end of file
diff --git a/manager/app/src/main/res/values-night/themes.xml b/manager/app/src/main/res/values-night/themes.xml
new file mode 100644
index 000000000000..d76ba8e6852b
--- /dev/null
+++ b/manager/app/src/main/res/values-night/themes.xml
@@ -0,0 +1,10 @@
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/manager/app/src/main/res/values-nl/strings.xml b/manager/app/src/main/res/values-nl/strings.xml
index 3beda53f3616..0fabc05a6c83 100644
--- a/manager/app/src/main/res/values-nl/strings.xml
+++ b/manager/app/src/main/res/values-nl/strings.xml
@@ -10,7 +10,7 @@
Niet ondersteund
KernelSU ondersteunt alleen GKI kernels
Kernel
- Manager Versie
+ Manager versie
Fingerprint
SELinux status
Uitgeschakeld
@@ -20,7 +20,7 @@
Supergebruiker
Mislukt om module in te schakelen: %s
Mislukt om module uit te schakelen: %s
- Geen module geïnstalleerd
+ Geen module geïnstalleerde
Module
Verwijderen
Installeren
@@ -38,14 +38,14 @@
Mislukt om te verwijderen: %s
Versie
Auteur
- overlayfs is niet beschikbaar, module kan niet werken!
+ Modules zijn niet beschikbaar omdat OverlayFS door de kernel is uitgeschakeld.
Vernieuwen
Toon systeem apps
Verberg systeem apps
- Stuur Log
+ Verzenden Logs
Safe mode
Herstart om effect te hebben
- Modules zijn uitgeschakeld omdat ze in conflict zijn met magisk!
+ Modules zijn niet beschikbaar vanwege een conflict met Magisk!
Leer KernelSU
https://kernelsu.org/guide/what-is-kernelsu.html
Leer hoe KernelSU te installeren en modules te gebruiken
@@ -67,17 +67,73 @@
Ontkoppel modules
Mislukt om App Profiel te updaten voor %s
Ontkoppel standaard de modules
- De globale standaard waarde voor \"Ontkoppel modules\" in App Profielen. Indien geactiveerd, zal het alle module wijzigingen tot het systeem verwijderen voor applicaties die geen Profiel ingesteld hebben.
- Met deze optie ingeschakeld zal KernelSU toelaten om alle gewijzigde bestanden door de modules voor deze applicatie te herstellen.
+ 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.
+ Met deze optie ingeschakeld zal KernelSU toelaten om alle gewijzigde bestanden door de modules voor deze app te herstellen.
Domein
Regels
Update
Downloaden van module: %s
- Nieuwe versie: %s is beschikbaar, klik om te downloaden
+ Nieuwe versie %s is beschikbaar,klik om te upgraden.
Start
- Forceer Stop
+ Forceer stop
Herstart
Begin met downloaden: %s
Kan SELinux-regels niet bijwerken voor: %s
- De huidige KernelSU-versie %d is te laag om de manager correct te laten functioneren. Upgrade naar versie %d of hoger!
+ De huidige KernelSU-versie %d is te laag voor de manager om goed te werken. Upgrade naar versie %d of hoger!
+ wijzigings logboek
+ App-profiel Sjabloon
+ Maken sjabloon
+ Bewerkin sjabloon
+ ID
+ Ongeldige sjabloon ID
+ Naam
+ Redde
+ Bekijken sjabloon
+ Beschrijving
+ Beheer lokale en online sjabloon van app-profiel
+ Verwijderen
+ Alleen lezen
+ Sjabloon ID bestaat al!
+ Synchroniseer online-sjablonen
+ Mislukt naar opslaan sjabloon
+ Klembord is leeg!
+ Importeren/Exporteren
+ Importeren vanaf klembord
+ Ophalen van wijzigingslogboek mislukt: %s
+ Exporteren naar klembord
+ Controleer update
+ Schakel WebView-foutopsporing
+ Kan worden gebruikt om WebUI te debuggen. Schakel dit alleen in als dat nodig is.
+ Kan niet geen lokale sjabloon vinden om te exporteren!
+ Succesvol geïmporteerd
+ Open
+ Controleer automatisch op updates bij het openen van de app
+ Directe installatie (aanbevolen)
+ Selecteer een bestand
+ Kan geen root verlenen!
+ Minimaliseer schaarse afbeeldingen
+ Wijzig het formaat van de beperkte afbeelding waar de module zich bevindt naar de werkelijke grootte. Houd er rekening mee dat dit ervoor kan zorgen dat de module abnormaal werkt, dus gebruik deze alleen wanneer dit nodig is (zoals voor back-up).
+ %1$s partitie-image wordt aanbevolen
+ Naast
+ Uw apparaat wordt **GEFORCEERD** om na een herstart op te starten naar het huidige inactieve slot!
+\nGebruik deze optie alleen nadat OTA is voltooid.
+\nDoorgaan?
+ Installeren in inactief slot (na OTA)
+ KMI selecteren
+ Desinstalleren
+ Tijdelijk verwijderen
+ Permanent verwijderen
+ Herstel stockafbeelding
+ Verwijder KernelSU tijdelijk en herstel het naar de oorspronkelijke staat na de volgende herstart.
+ Het verwijderen van KernelSU (Root en alle modules) volledig en permanent.
+ Herstel de standaard fabrieksimage (als er een back-up bestaat), die normaal gesproken vóór OTA wordt gebruikt. Als u KernelSU moet verwijderen, gebruikt u permanent verwijderen.
+ Knipperen
+ Logboeken Opslaan
+ Flash-succes
+ Flash is mislukt
+ Geselecteerde LKM: %s
+ Actie
+ Logs opgeslagen
+ Sorteren (eerst ingeschakeld)
+ Sorteren (actie eerst)
\ No newline at end of file
diff --git a/manager/app/src/main/res/values-pl/strings.xml b/manager/app/src/main/res/values-pl/strings.xml
index 30e531f970ed..22807c4a627d 100644
--- a/manager/app/src/main/res/values-pl/strings.xml
+++ b/manager/app/src/main/res/values-pl/strings.xml
@@ -6,8 +6,8 @@
Kliknij, aby zainstalować
Działa
Wersja: %d
- Superużytkowników: %d
- Modułów: %d
+ Superużytkownicy: %d
+ Moduły: %d
Nieobsługiwany
KernelSU obsługuje obecnie tylko jądra GKI
Jądro
@@ -16,7 +16,7 @@
Status SELinux
Wyłączony
Enforcing
- Permissive
+ Dozwolony
Nieznany
Superużytkownik
Nie udało się włączyć modułu: %s
@@ -39,17 +39,17 @@
Nie udało się odinstalować:: %s
Wersja
Autor
- overlayfs jest niedostępny, moduł nie zadziała!
+ Moduły są niedostępne, ponieważ OverlayFS jest wyłączony przez jądro.
Odśwież
Pokaż aplikacje systemowe
Ukryj aplikacje systemowe
- Wyślij log
+ Wyślij logi
Tryb bezpieczny
Uruchom ponownie, aby zastosować zmiany
- Moduły są wyłączone, ponieważ są w konflikcie z modułami Magiska!
+ Moduły są niedostępne z powodu konfliktu z Magiskiem!
Poznaj KernelSU
https://kernelsu.org/guide/what-is-kernelsu.html
- Dowiedz się jak zainstalować KernelSU i jak korzystać z modułów.
+ Dowiedz się jak zainstalować KernelSU i jak korzystać z modułów
Wesprzyj nas
KernelSU jest i zawsze będzie darmowy oraz otwarty. Niemniej jednak możesz nam pokazać, że Ci zależy, wysyłając darowiznę.
Dołącz do kanału %2$s]]>
@@ -68,18 +68,73 @@
Odmontuj moduły
Nie udało się zaktualizować profilu aplikacji dla %s
Domyślnie odmontuj moduły
- Globalna wartość domyślna opcji \"Odmontuj moduły\" w profilach aplikacji. Jeśli jest włączona, odwraca wszystkie modyfikacje dokonane przez moduły dla aplikacji, które nie mają ustawionego profilu.
+ 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.
Włączenie tej opcji umożliwi KernelSU przywrócenie wszelkich zmodyfikowanych plików przez moduły dla tej aplikacji.
Domena
Reguły
Zaktualizuj
Pobieranie modułu: %s
Rozpocznij pobieranie: %s
- Nowa wersja: %s jest dostępna, kliknij, aby zaktualizować
+ Nowa wersja %s jest dostępna. Kliknij, aby zaktualizować.
Uruchom
Wymuś zatrzymanie
Restartuj
Nie udało się zaktualizować reguł SELinux dla: %s
Obecna wersja KernelSU %d jest zbyt stara, aby menedżer działał poprawnie. Prosimy o aktualizację do wersji %d lub nowszej!
Dziennik zmian
+ Włącz debugowanie WebView
+ Może być użyte do debugowania WebUI. Włącz tylko w razie potrzeby.
+ Obraz partycji %1$s jest zalecany
+ Wybierz KMI
+ Dalej
+ Instalacja bezpośrednia (zalecane)
+ Wybierz plik
+ Zainstaluj do nieaktywnego slotu (po aktualizcji OTA)
+ Po ponownym uruchomieniu Twoje urządzenie zostanie **ZMUSZONE** do uruchomia się z obecnie nieaktywnego slotu!
+\nUżyj tej opcji dopiero po zakończeniu aktualizacji OTA.
+\nCzy chcesz kontynuować?
+ Stwórz szablon
+ Edytuj szablon
+ Nazwa
+ Opis
+ Zapisz
+ Usuń
+ Tylko do odczytu
+ Importuj/Eksportuj
+ Importuj ze schowka
+ Eksportuj do schowka
+ Nie można znaleźć lokalnego szablonu do eksportu!
+ Zaimportowano pomyślnie
+ Nie udało się zapisać szablonu
+ Schowek jest pusty!
+ Zarządzaj lokalnym i internetowym szablonem profilu aplikacji
+ Synchronizuj internetowe szablony
+ Zobacz szablon
+ Błędny identyfikator szablonu
+ Szablon profilu aplikacji
+ Identyfikator
+ Szablon o takim identyfikatorze już istnieje!
+ Nie udało się przyznać roota!
+ Otwórz
+ Pobranie dziennika zmian nie powiodło się: %s
+ Wyszukaj aktualizacje
+ Wyszukuj aktualizacje automatycznie przy otwieraniu aplikacji
+ Minimalizuj rozrzedzony (sparse) obraz
+ Zmienia rozmiar obrazu rozrzedzonego(sparse), w którym znajduje się moduł, do jego rzeczywistego rozmiaru. Należy pamiętać, że może to spowodować nieprawidłowe działanie modułu, więc należy go używać tylko wtedy, gdy jest to konieczne (np. do tworzenia kopii zapasowych).
+ Odinstaluj zupełnie
+ Przywróć obraz fabryczny
+ Odinstaluj tymczasowo
+ Odinstaluj
+ Tymczasowo odinstaluj KernelSU, przywróć do oryginalnego stanu po następnym ponownym uruchomieniu.
+ Całkowite i trwałe odinstalowanie KernelSU (Root i wszystkich modułów).
+ Przywróć obraz fabryczny (jeśli istnieje kopia zapasowa), zwykle używany przed OTA; jeśli chcesz odinstalować KernelSU, użyj opcji \"Odinstaluj całkowicie\".
+ Flashowanie
+ Flashowanie ukończone pomyślnie
+ Flashowanie nieudane
+ Wybrano LKM: %s
+ Zapisz dzienniki
+ Akcja
+ Dzienniki zapisane
+ Sortuj (najpierw działania)
+ Sortuj (najpierw włączone)
\ No newline at end of file
diff --git a/manager/app/src/main/res/values-pt-rBR/strings.xml b/manager/app/src/main/res/values-pt-rBR/strings.xml
index 5c4be3fe16a6..9e6abf921d5b 100644
--- a/manager/app/src/main/res/values-pt-rBR/strings.xml
+++ b/manager/app/src/main/res/values-pt-rBR/strings.xml
@@ -5,7 +5,7 @@
Clique para instalar
Em execução
Versão: %d
- Superusuários: %d
+ SuperUsuários: %d
Módulos: %d
Sem suporte
KernelSU suporta apenas kernels GKI agora
@@ -13,15 +13,15 @@
Versão do gerenciador
Impressão digital
Status do SELinux
- Desabilitado
- Execução
+ Desativado
+ Impondo
Permissivo
Desconhecido
- Superusuário
- Falha ao ativar o módulo: %s
- Falha ao desativar o módulo: %s
+ SuperUsuário
+ Falha ao ativar o módulo %s
+ Falha ao desativar o módulo %s
Nenhum módulo instalado
- Módulos
+ Módulo
Desinstalar
Instalar
Instalar
@@ -33,24 +33,24 @@
Reiniciar em modo Download
Reiniciar em modo EDL
Sobre
- Tem certeza de que deseja desinstalar o módulo %s?
+ Tem certeza que deseja desinstalar o módulo %s?
%s desinstalado
- Falha ao desinstalar: %s
+ Falha ao desinstalar %s
Versão
Autor
- overlayfs não está disponível, o módulo não pode funcionar!
+ Os módulos estão indisponíveis porque OverlayFS está desabilitado pelo kernel!
Atualizar
Mostrar apps do sistema
Ocultar apps do sistema
- Enviar Log
+ Reportar registros
Modo de segurança
Reinicie para entrar em vigor
- Os módulos estão desativados porque estão em conflito com os do Magisk!
- Leia mais sobre o KernelSU
- https://kernelsu.org/guide/what-is-kernelsu.html
- Aprenda a instalar o KernelSU e usar os módulos
+ Os módulos estão indisponíveis devido a um conflito com Magisk!
+ Saiba mais sobre o KernelSU
+ https://kernelsu.org/pt_BR/guide/what-is-kernelsu.html
+ Saiba como instalar o KernelSU e usar os módulos
Apoie-nos
- KernelSU sempre foi e sempre será, gratuito e de código aberto. No entanto, você pode agradecer enviando uma pequena doação.
+ KernelSU sempre foi e sempre será, gratuito e de código aberto. No entanto, você pode nos ajudar enviando uma pequena doação.
Junte-se ao nosso canal do %2$s]]>
Perfil do Aplicativo
Padrão
@@ -64,21 +64,76 @@
Grupos
Capacidades
Contexto do SELinux
- Módulos não montados
+ Desmontar módulos
Falha ao atualizar o Perfil do Aplicativo para %s
- Não montar módulos por padrão
- O valor padrão global para \"Módulos não montados\" em Perfis de Aplicativos. Se ativado, removerá todas as modificações do módulo do sistema para apps que não possuem um Perfil definido.
+ Desmontar módulos por padrão
+ O valor padrão global para \"Desmontar módulos\" em Perfil do Aplicativo. Se ativado, ele removerá todas as modificações do módulo no sistema para apps que não possuem um perfil definido.
Ativar esta opção permitirá que o KernelSU restaure quaisquer arquivos modificados pelos módulos para este app.
Domínio
Regras
Atualizar
- Baixando módulo: %s
- Iniciar o download: %s
- Nova versão: %s está disponível, clique para atualizar
+ Baixando módulo %s
+ Começando a baixar %s
+ Nova versão %s está disponível, clique para atualizar.
Iniciar
Forçar parada
Reiniciar
Falha ao atualizar as regras do SELinux para: %s
A versão atual do KernelSU %d é muito baixa para o gerenciador funcionar corretamente. Por favor, atualize para a versão %d ou superior!
Registro de alterações
+ Importado com sucesso
+ Exportar para a área de transferência
+ Não foi possível encontrar o modelo local para exportar!
+ O ID do modelo já existe!
+ Importar da área de transferência
+ Falha ao buscar o registro de alterações: %s
+ Nome
+ ID do modelo inválido
+ Sincronizar modelos online
+ Criar modelo
+ Somente leitura
+ Importar/Exportar
+ Falha ao salvar o modelo
+ Editar modelo
+ ID
+ Modelo do Perfil do Aplicativo
+ Descrição
+ Salvar
+ Gerencie o modelo local e online do Perfil do Aplicativo
+ Excluir
+ A área de transferência está vazia!
+ Ver modelo
+ Verificar por atualização
+ Verifique automaticamente se há atualizações ao abrir o app
+ Falha ao conceder acesso root!
+ Abrir
+ Ativar depuração do WebView
+ Pode ser usado para depurar o WebUI. Por favor, ative somente quando necessário.
+ Selecione um arquivo
+ Instalação direta (recomendada)
+ Instalar no slot inativo (após o OTA)
+ Seu dispositivo será **FORÇADO** a inicializar no slot inativo atual após uma reinicialização!
+\nSó use esta opção após a conclusão do OTA.
+\nDeseja continuar?
+ Próximo
+ A imagem da partição %1$s é recomendada
+ Selecionar KMI
+ Minimizar imagem esparsa
+ Redimensione a imagem esparsa onde o módulo está localizado para seu tamanho real. Observe que isso pode fazer com que o módulo funcione de forma anormal, portanto, use-o somente quando necessário (como um backup).
+ Desinstalar
+ Desinstalar temporariamente
+ Desinstalar permanentemente
+ Restaurar imagem de fábrica
+ Restaure a imagem de fábrica (se existir um backup), geralmente usada antes do OTA. Se você precisar desinstalar o KernelSU, use \"Desinstalar permanentemente\".
+ Desinstale temporariamente o KernelSU e restaure ao estado original após a próxima reinicialização.
+ Desinstale o KernelSU (root e todos os módulos) completamente e permanentemente.
+ LKM selecionado: %s
+ Flash falhou
+ Flashando
+ Flash bem-sucedido
+ Salvar registros
+ Ação
+ Registros salvos
+ Ordenar (Ação primeiro)
+ Ordenar (Ativado primeiro)
\ No newline at end of file
diff --git a/manager/app/src/main/res/values-pt/strings.xml b/manager/app/src/main/res/values-pt/strings.xml
index 590f487f5314..ea1547db49b6 100644
--- a/manager/app/src/main/res/values-pt/strings.xml
+++ b/manager/app/src/main/res/values-pt/strings.xml
@@ -79,4 +79,5 @@
Forçar parada
Nova versão: %s está disponível, clique para baixar
A versão atual do KernelSU %d é muito baixa para o gerenciador funcionar corretamente. Atualize para a versão %d ou superior!
+ Salvar Registros
\ No newline at end of file
diff --git a/manager/app/src/main/res/values-ro/strings.xml b/manager/app/src/main/res/values-ro/strings.xml
index 4031c403df3f..fea3ffb6958d 100644
--- a/manager/app/src/main/res/values-ro/strings.xml
+++ b/manager/app/src/main/res/values-ro/strings.xml
@@ -17,7 +17,7 @@
Obligatoriu
Permisiv
Necunoscut
- Super-utilizator
+ Super-Utilizator
Activarea modulului %s a eșuat
Dezactivarea modulului %s a eșuat
Niciun modul instalat
@@ -42,7 +42,7 @@
Reîmprospătează
Arată aplicațiile de sistem
Ascunde aplicațiile de sistem
- Trimite jurnal
+ Raportează jurnal
Mod sigur
Repornește pentru ca modificările să intre în vigoare
Modulele sunt dezactivate deoarece sunt în conflict cu cele ale Magisk-ului!
@@ -80,4 +80,53 @@
Repornește
Versiunea actuală a KernelSU %d este prea mică pentru ca managerul să funcționeze corect. Actualizează la versiunea %d sau o versiune superioară!
Jurnalul modificărilor
+ Importat cu succes
+ Export în clipboard
+ Nu există șabloane locale de exportat!
+ ID-ul șablonului există deja!
+ Import din clipboard
+ Preluarea jurnalului de modificări a eșuat: %s
+ Nume
+ ID șablon nevalid
+ Sincronizează șabloanele online
+ Creează un șablon
+ doar citire
+ Import/Export
+ Nu s-a salvat șablonul
+ Editează șablonul
+ ID
+ Șablon de profil al aplicației
+ Descriere
+ Salvează
+ Gestionează șablonul local și online al Profilului aplicației
+ Șterge
+ Clipboard-ul este gol!
+ Vizualizare șablon
+ Verifică actualizarea
+ Se verifică automat actualizările când deschizi aplicația
+ Activează depanarea WebView
+ Poate fi folosit pentru a depana WebUI, activează numai când este necesar.
+ Nu s-a acordat acces root!
+ Deschide
+ Se recomandă imaginea partiției %1$s
+ Înainte
+ Dispozitivul va fi **FORȚAT** să pornească în slot-ul inactiv curent după o repornire!
+\nFolosește această opțiune numai după finisarea OTA.
+\nContinui?
+ Selectează KMI
+ Instalare directă (recomandat)
+ Selectează un fișier
+ Instalează într-un slot inactiv (după OTA)
+ Dezinstalează
+ Restaurare imagine stoc
+ Dezinstalează temporar KernelSU, se revine la starea inițială după următoarea repornire.
+ Lkm selectat: %s
+ Dezinstalează temporar
+ Dezinstalează definitiv
+ Dezinstalare KernelSU (Root și toate modulele) complet și permanent.
+ Restaurează imaginea stoc din fabrică (dacă există o copie de rezervă), utilizată de obicei înainte de OTA; dacă trebuie să dezinstalezi KernelSU, utilizează „Dezinstalare permanentă”.
+ Instalare
+ Instalare reușită
+ Instalarea a eșuat
+ Salvează Jurnale
\ No newline at end of file
diff --git a/manager/app/src/main/res/values-ru/strings.xml b/manager/app/src/main/res/values-ru/strings.xml
index 7a2c4f13a38c..de46aa3dc33a 100644
--- a/manager/app/src/main/res/values-ru/strings.xml
+++ b/manager/app/src/main/res/values-ru/strings.xml
@@ -5,7 +5,7 @@
Нажмите, чтобы установить
Работает
Версия: %d
- Superusers: %d
+ Суперпользователи: %d
Модули: %d
Не поддерживается
@@ -18,7 +18,7 @@
Принудительный
Разрешающий
Неизвестно
- Superuser
+ SU пользователь
Не удалось включить модуль: %s
Не удалось отключить модуль: %s
@@ -36,18 +36,18 @@
Перезагрузить в EDL
О приложении
Вы уверены, что хотите удалить модуль %s?
- %s удален
+ %s удалён
Не удалось удалить: %s
Версия
Автор
- overlayfs недоступен, модуль не может работать!
- Обновить
+ Модули недоступны, так как OverlayFS отключен ядром.
+ Обновить страницу
Показать системные приложения
Скрыть системные приложения
- Отправить лог
+ Отправить логи
Безопасный режим
Перезагрузите, чтобы изменения вступили в силу
- Модули отключены, потому что они конфликтуют с Magisk!
+ Модули недоступны из-за конфликта с Magisk!
Узнайте о KernelSU
https://kernelsu.org/ru_RU/guide/what-is-kernelsu.html
Узнайте, как установить KernelSU и использовать модули
@@ -77,11 +77,66 @@
Обновить
Скачивание модуля: %s
Начало скачивания: %s
- Новая версия: %s доступна, нажмите, чтобы скачать
- Принудительно остановить
+ Новая версия: %s доступна, нажмите чтобы скачать.
+ Остановить принудительно
Не удалось обновить правила SELinux для %s
Запустить
Перезапустить
Текущая версия KernelSU %d слишком низкая для правильной работы менеджера. Пожалуйста, обновите до версии %d или выше!
Список изменений
+ Успешный импорт
+ Экспортировать в буфер обмена
+ Нет локальных шаблонов для экспорта!
+ Шаблон с таким ID уже существует!
+ Импортировать из буфера обмена
+ Не удалось получить список изменений: %s
+ Название
+ Неверный ID шаблона
+ Синхронизировать онлайн-шаблоны
+ Создать шаблон
+ Только чтение
+ Импорт/Экспорт
+ Не удалось сохранить шаблон
+ Редактирование шаблона
+ Идентификационный номер
+ Шаблон профиля приложения
+ Описание
+ Сохранить
+ Управление локальным и онлайн-шаблоном профиля приложения
+ Удалить
+ Буфер обмена пуст!
+ Просмотр шаблона
+ Проверка обновлений
+ Автоматическая проверка обновлений при открытии приложения
+ Не удалось выдать root!
+ Открыть
+ Включить отладку WebView
+ Используется для отладки WebUI. Пожалуйста, включайте только при необходимости.
+ Прямая установка (Рекомендуется)
+ Установка в неактивный слот (После OTA)
+ Далее
+ Выбрать файл
+ Ваше устройство будет **ПРИНУДИТЕЛЬНО** загружено в текущий неактивный слот после перезагрузки!
+\n Используйте эту опцию только после завершения OTA.
+\n Продолжить?
+ Выбрать KMI
+ %1$s образ раздела рекомендуется
+ Минимизировать разреженный образ
+ Изменить размер разреженного образа в котором находятся модули, до его фактического размера. Обратите внимание, что это может вызвать ненормальную работу модулей, поэтому используйте это только при необходимости (например, для резервного копирования).
+ Удалить на время
+ Удалить KernelSU (Root и все модули) полностью.
+ Удалить полностью
+ Временно удалить KernelSU, восстановить исходное состояние после следующей перезагрузки.
+ Удалить
+ Восстановить сток образ
+ Восстановить исходный заводской образ (если существует резервная копия), обычно используется перед OTA; если вам нужно удалить KernelSU, используйте «Удалить полностью».
+ Установка выполнена
+ Установка
+ Установка не выполнена
+ Выбран LKM: %s
+ Сохранить логи
+ Действие
+ Логи сохранены
+ Сортировать (Сначала с действием)
+ Сортировать (Сначала включённые)
\ No newline at end of file
diff --git a/manager/app/src/main/res/values-sl/strings.xml b/manager/app/src/main/res/values-sl/strings.xml
new file mode 100644
index 000000000000..ae02e596c582
--- /dev/null
+++ b/manager/app/src/main/res/values-sl/strings.xml
@@ -0,0 +1,106 @@
+
+
+ Klikni za namestitev
+ V obdelavi
+ Verzija: %d
+ Superuporabniki: %d
+ KernelSU podpira samo GKI kernele
+ Kernel
+ Verzija upravitelja
+ Prstni odtis
+ SELinux status
+ Onemogočeno
+ Neznano
+ Napaka pri onemogočanju modula: %s
+ Ni nameščenih modulov
+ Modul
+ Odmesti
+ Namesti
+ Namesti
+ Mehki ponovni zagon
+ Ponovni zagon v Recovery
+ Ponovni zagon v Bootloader
+ Ponovni zagon v EDL
+ Ste prepričani, da želite odstraniti modul %s?
+ %s je odmeščen
+ Avtor
+ overlayfs ni na voljo, modul ne more delovati!
+ Skrij prikaz sistemskih aplikacij
+ Prijavite dnevnik
+ Naučite se KernelSU
+ https://kernelsu.org/guide/what-is-kernelsu.html
+ Naučite se, kako namestiti KernelSU in uporabiti module
+ Glej odprto kodo na %1$s
Pridružite se našem %2$s kanalu
+ Privzeto
+ Predloga
+ Imenski prostor vmestitve
+ Podedovano
+ Globalno
+ Pozameznik
+ Zmožnosti
+ Izvrzi module
+ Po privzetem izvrzi module
+ Domena
+ Posodobitev
+ Nalaganje modula: %s
+ Zaženi
+ Ponovni zagon
+ Dnevnik sprememb
+ Predloga za aplikacijski profil
+ Domov
+ Moduli: %d
+ Ne podpira
+ SuperUporabnik
+ Napaka pri omogočanju modula: %s
+ Znova zaženi
+ Nastavitve
+ Ponovni zagon v Download
+ O nas
+ Verzija
+ Napaka pri odmeščanju: %s
+ Osveži
+ Varni način
+ Za uveljavitev je potreben ponovni zagon
+ Prikaz sistemskih aplikacij
+ Moduli so onemogočeni, ker so v konfliktu z Magiskovimi!
+ Podprite nas
+ Po meri
+ Ime profila
+ Skupine
+ SELinux kontekst
+ KernelSU je, in bo vedno brezplačen in odprtokoden. Kljub temu, nam lahko z donacijo pokažete, da vam je mar.
+ Napaka pri posodobitvi aplikacijskega profila za %s
+ Za pravilno funkionalnost upravitelja je trenutna KernelSU verzija %d prenizka. Potrebna je nadgradnja na verzijo %d ali več!
+ 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.
+ Omogočanje te opcije bo dovolilo KernelSU, da obnovi vse zaradi modulov spremenjene datoteke za to aplikacijo.
+ Prisilna ustavitev
+ Pravila
+ Začni z nalaganjem: %s
+ Na voljo je nova verzija: %s, kliknite za nadgradnjo
+ Napaka pri posodobitvi SELinux pravil za: %s
+ Ni nameščeno
+ Enforcing
+ Permissive
+ Ustvari predlogo
+ Uredi predlogo
+ Neveljaven id predloge
+ Opis
+ Shrani
+ Odstrani
+ le za branje
+ id predloge že obstaja!
+ Uvoz iz odložišča
+ Izvoz v odložišče
+ Lokalna predloga za izvoz ni bila najdena!
+ Napaka pri shranjevanju predloge
+ Odložišče je prazno!
+ Upravljaj z lokalnimi in spletnimi predlogami za aplikacijski profil
+ id
+ Ime
+ Ogled predloge
+ Uvoz uspešen
+ Sinhroniziraj predloge iz spleta
+ Uvoz/Izvoz
+ Napaka pri pridobivanju dnevnika sprememb: %s
+ Shrani Dnevnike
+
\ No newline at end of file
diff --git a/manager/app/src/main/res/values-sr/strings.xml b/manager/app/src/main/res/values-sr/strings.xml
index 1576a9cb398c..73920b6fb542 100644
--- a/manager/app/src/main/res/values-sr/strings.xml
+++ b/manager/app/src/main/res/values-sr/strings.xml
@@ -2,7 +2,10 @@
Superkorisnici
Moduli: %d
- Kliknite da instalirate
- дом
- Nije instalirano
+ Додирните да бисте инсталирали
+ Почетна
+ Није инсталирано
+ Верзија: %d
+ Ради
+ Сачувај Дневнике
\ No newline at end of file
diff --git a/manager/app/src/main/res/values-te/strings.xml b/manager/app/src/main/res/values-te/strings.xml
index 827da7b7f305..f609542692f3 100644
--- a/manager/app/src/main/res/values-te/strings.xml
+++ b/manager/app/src/main/res/values-te/strings.xml
@@ -12,4 +12,10 @@
మాడ్యూల్ని నిలిపివేయడంలో విఫలమైంది: %s
మాడ్యూల్ ఏదీ ఇన్స్టాల్ చేయబడలేదు
ఇన్స్టాల్ చేయలేదు
+ ఇన్స్టాల్ చేయడానికి క్లిక్ చేయండి
+ పని చేస్తోంది
+ వెర్షన్: %d
+ సూపర్యూజర్లు: %d
+ మాడ్యూల్స్: %d
+ లాగ్లు సేవ్ చేయండి
\ No newline at end of file
diff --git a/manager/app/src/main/res/values-th/strings.xml b/manager/app/src/main/res/values-th/strings.xml
index 712189ddfb74..8e3115df7e0e 100644
--- a/manager/app/src/main/res/values-th/strings.xml
+++ b/manager/app/src/main/res/values-th/strings.xml
@@ -4,8 +4,8 @@
ยังไม่ได้ติดตั้ง
กดเพื่อติดตั้ง
กำลังทำงาน
- เวอร์ชั่น: %d
- เวอร์ชั่นตัวจัดการ
+ เวอร์ชัน: %d
+ เวอร์ชันตัวจัดการ
สิทธิ์ผู้ใช้ขั้นสูง: %d
โมดูล: %d
ไม่รองรับ
@@ -35,34 +35,34 @@
รีบูตเข้าสู่โหมด EDL
%s ถอนการติดตั้งสำเร็จ
ล้มเหลวในการถอนการติดตั้ง: %s
- overlayfs ไม่สามารถใช้งานได้ โมดูลหยุดทำงาน!
+ โมดูลไม่สามารถใช้งานได้เนื่องจาก OverlayFS ถูกปิดใช้งานโดยเคอร์เนล
คุณแน่ใจว่าจะถอนการติดตั้งโมดูล %s หรือไม่\?
ผู้สร้าง
- เวอร์ชั่น
+ เวอร์ชัน
แสดงแอประบบ
ซ่อนแอประบบ
รีเฟรช
- ส่ง Log
+ ส่ง logs
โหมดปลอดภัย
รีบูตเพื่อให้มีผล
- โมดูลถูกปิดใช้งานเนื่องจากขัดแย้งกับ Magisk!
+ โมดูลไม่สามารถใช้งานได้ เนื่องจากขัดแย้งกับ Magisk!
เรียนรู้เกี่ยวกับ KernelSU
https://kernelsu.org/guide/what-is-kernelsu.html
เรียนรู้วิธีการติดตั้ง KernelSU และวิธีใช้งานโมดูลต่าง ๆ
สนับสนุนพวกเรา
KernelSU เป็นโอเพ่นซอร์สฟรีทั้งจากนี้และตลอดไป อย่างไรก็ตาม คุณสามารถแสดงความห่วงใยได้ด้วยการบริจาค
- ดูซอร์สโค้ดที่ %1$s
และเข้าร่วมช่อง %2$s ของเรา
+ และเข้าร่วมช่อง %2$s channel]]>
กำหนดเอง
ค่าเริ่มต้น
เทมเพลต
ชื่อโปรไฟล์
Mount เนมสเปซ
ทั่วไป
- การสืบทอด
+ สืบทอด
ส่วนบุคคล
หมวดหมู่
ความสามารถของแอป
- การเปิดใช้งานตัวเลือกนี้จะทำให้ KernelSU สามารถกู้คืนไฟล์ที่แก้ไขโดยโมดูลสำหรับแอปพลิเคชั่นนี้ได้
+ การเปิดใช้งานตัวเลือกนี้จะทำให้ KernelSU สามารถกู้คืนไฟล์ที่แก้ไขโดยโมดูลสำหรับแอปนี้ได้
บริบท SELinux
Umount โมดูล
ไม่สามารถอัปเดตโปรไฟล์แอปสำหรับ %s ได้
@@ -72,12 +72,67 @@
กฎ
กำลังดาวน์โหลดโมดูล: %s
กำลังเริ่มดาวน์โหลด: %s
- เวอร์ชั่นใหม่: %s พร้อมใช้งาน โปรดคลิกเพื่ออัปเกรด
+ เวอร์ชันใหม่: %s พร้อมใช้งาน คลิกเพื่ออัปเกรด
บังคับหยุด
รีสตาร์ท
- หากเปิดใช้งานค่าเริ่มต้นโดยทั่วไปสำหรับ \"Umount โมดูล\" ในโปรไฟล์แอป จะเป็นการลบการแก้ไขโมดูลทั้งหมดในระบบสำหรับแอปพลิเคชั่นที่ไม่มีการตั้งค่าโปรไฟล์
+ หากเปิดใช้งานค่าเริ่มต้นโดยทั่วไปสำหรับ \"Umount โมดูล\" ในโปรไฟล์แอป จะเป็นการลบการแก้ไขโมดูลทั้งหมดในระบบสำหรับแอปพลิเคชันที่ไม่มีการตั้งค่าโปรไฟล์
เปิด
ไม่สามารถอัปเดตกฎ SElinux สำหรับ: %s ได้
- KernelSU เวอร์ชั่น %d ต่ำเกินไป ทำให้ตัวจัดการไม่สามารถใช้งานได้อย่างถูกต้อง โปรดอัปเกรดเป็นเวอร์ชั่น %d หรือที่สูงกว่า!
+ KernelSU เวอร์ชัน %d ต่ำเกินไป ทำให้ตัวจัดการไม่สามารถทำงานได้อย่างถูกต้อง โปรดอัปเกรดเป็นเวอร์ชัน %d หรือสูงกว่า!
บันทึกการเปลี่ยนแปลง
+ นำเข้าเสร็จสิ้น
+ ส่งออกไปยังคลิปบอร์ด
+ ไม่พบเทมเพลตในเครื่องที่จะส่งออก!
+ มีไอดีเทมเพลตนี้อยู่แล้ว!
+ นำเข้าจากคลิปบอร์ด
+ ชื่อ
+ ไอดีเทมเพลตไม่ถูกต้อง
+ ซิงค์เทมเพลตออนไลน์
+ สร้างเทมเพลต
+ อ่านเท่านั้น
+ นำเข้า/ส่งออก
+ ไม่สามารถบันทึกเทมเพลต
+ แก้ไขเทมเพลต
+ ไอดี
+ เทมเพลตโปรไฟล์แอป
+ คำอธิบาย
+ บันทึก
+ จัดการเทมเพลตโปรไฟล์แอปในเครื่องและเทมเพลตออนไลน์
+ ลบ
+ คลิปบอร์ดว่างเปล่า!
+ ดูเทมเพลต
+ ดึงข้อมูลบันทึกการเปลี่ยนแปลงล้มเหลว: %s
+ เปิด
+ ไม่สามารถให้สิทธิ์รูทได้!
+ ตรวจสอบการอัปเดต
+ ตรวจสอบการอัปเดตโดยอัตโนมัติเมื่อเปิดแอป
+ เปิดใช้งานการแก้ไขข้อบกพร่อง WebView
+ เลือก KMI
+ ต่อไป
+ เลือกไฟล์
+ ติดตั้งลงในสล็อตที่ไม่ใช้งาน (หลังจาก OTA)
+ ติดตั้งโดยตรง (แนะนำ)
+ แนะนำให้ใช้อิมเมจพาร์ติชัน %1$s
+ ใช้เพื่อดีบัก WebUI เท่านั้น โปรดเปิดใช้งานเมื่อจำเป็น
+ อุปกรณ์ของคุณจะถูก **บังคับ** ให้บูตไปยังสล็อตที่ไม่ได้ใช้งานหลังจากรีบูต!
+\nโปรดใช้ตัวเลือกนี้หลังจาก OTA เสร็จแล้วเท่านั้น
+\nดำเนินการต่อหรือไม่?
+ ลดความกระจายของอิมเมจ
+ ปรับขนาดความกระจายของอิมเมจในโมดูลให้เป็นขนาดจริง โปรดทราบว่านี่อาจทำให้โมดูลทำงานผิดปกติ โปรดใช้เมื่อจำเป็นเท่านั้น (เช่น การสำรองข้อมูล)
+ ถอนการติดตั้งถาวร
+ เรียกคืนอิมเมจดั้งเดิม
+ ถอนการติดตั้ง KernelSU ชั่วคราว จะคืนค่าเป็นสถานะดั้งเดิมหลังจากรีบูตในครั้งถัดไป
+ กำลังแฟลช
+ แฟลชสำเร็จ
+ แฟลชล้มเหลว
+ เลือก LKM: %s
+ ถอนการติดตั้ง
+ ถอนการติดตั้งชั่วคราว
+ การถอนการติดตั้ง KernelSU (การรูทและโมดูลทั้งหมด) อย่างสมบูรณ์โดยถาวร
+ คืนค่าโรงงานอิมเมจดั้งเดิม (หากมีข้อมูลสำรอง) ส่วนใหญ่มักใช้ก่อนทำการ OTA ซึ่งหากคุณต้องการถอนการติดตั้ง KernelSU โปรดใช้ \"ถอนการติดตั้งถาวร\"
+ บันทึกบันทึก
+ คำสั่ง
+ บันทึก Log แล้ว
+ เรียงลำดับ (แบบรันคำสั่งก่อน)
+ เรียงลำดับ (แบบเปิดใช้งานก่อน)
\ No newline at end of file
diff --git a/manager/app/src/main/res/values-tr/strings.xml b/manager/app/src/main/res/values-tr/strings.xml
index 5be6c5c69547..46a235f15720 100644
--- a/manager/app/src/main/res/values-tr/strings.xml
+++ b/manager/app/src/main/res/values-tr/strings.xml
@@ -1,60 +1,61 @@
- Ana menü
- Yüklü değil
- Yüklemek için tıkla
+ KernelSU
+ Ana Sayfa
+ Kurulmadı
+ Kurmak için tıklayın
Çalışıyor
Sürüm: %d
Süper kullanıcılar: %d
Modüller: %d
Desteklenmiyor
- KernelSU şu an yalnızca GKI çekirdeklerini destekliyor
- Kernel
- Yönetici Sürümü
- Parmak İzi
- SELinux Durumu
+ KernelSU şimdilik sadece GKI çekirdeklerini destekliyor
+ Çekirdek
+ Yönetici sürümü
+ Parmak izi
+ SELinux durumu
Devre dışı
- Enforcing
- Permissive
+ Etkin (Enforcing)
+ Serbest (Permissive)
Bilinmiyor
Süper kullanıcı
Modül etkinleştirilemedi: %s
Modül devre dışı bırakılamadı: %s
- Yüklü modül yok
+ Kurulu modül yok
Modül
Kaldır
- Yükle
- Yükle
+ Kur
+ Kur
Cihazı yeniden başlat
Ayarlar
Hızlı yeniden başlat
- Kurtarma modunda başlat
- Bootloader modunda başlat
- İndirme modunda başlat
- EDL modunda başlat
+ Kurtarma modunda yeniden başlat
+ Önyükleyici modunda yeniden başlat
+ İndirme modunda yeniden başlat
+ EDL modunda yeniden başlat
Hakkında
%s modülünü kaldırmak istediğinizden emin misiniz?
%s kaldırıldı
- %s kaldırılamadı
+ Kaldırma başarısız: %s
Sürüm
Geliştirici
- overlayfs mevcut değil, modül çalışamaz!
+ OverlayFS çekirdek tarafından devre dışı bırakıldığı için modüller kullanılamıyor.
Yenile
Sistem uygulamalarını göster
Sistem uygulamalarını gizle
- Log gönder
+ Günlükleri gönder
Güvenli mod
- Değişiklilerin kaydedilmesi için cihazı yeniden başlat
- Modüller Magisk ile çakıştığı için devre dışı bırakıldı!
- KernelSU\'yu öğren
+ Değişikliklerin uygulanması için cihazı yeniden başlat
+ Magisk ile çakışma nedeniyle modüller kullanılamıyor!
+ KernelSU\'yu öğrenin
https://kernelsu.org/guide/what-is-kernelsu.html
- KernelSU\'yu nasıl kuracağınızı ve modülleri nasıl kullanacağınızı öğrenin
- Bizi destekle
- KernelSU ücretsiz ve açık kaynaktır ve her zaman öyle kalacaktır. Ancak bağış yaparak bize değer verdiğinizi gösterebilirsiniz.
- %2$s kanalımıza katılın]]>
- Uygulama profili
+ KernelSU\'nun nasıl kurulacağını ve modüllerin nasıl kullanılacağını öğrenin
+ Bizi destekleyin
+ KernelSU ücretsiz ve açık kaynaklı bir yazılımdır ve her zaman öyle kalacaktır. Ancak bağış yaparak bize destek olduğunuzu gösterebilirsiniz.
+ %2$s kanalımıza katılın.]]>
+ Uygulama profili
Varsayılan
- Örnek
+ Şablon
Özel
Profil adı
Ad alanını bağla
@@ -62,23 +63,76 @@
Küresel
Bireysel
Gruplar
- Yetkiler
+ Yetkinlikler
SELinux içeriği
Modüllerin bağlantısını kes
%s için uygulama profili güncellenemedi.
- Varsayılan olarak modüllerin bağlantısını kesin
- Uygulama profillerindeki \"Modüllerin bağlantısını kes\" seçeneği için varsayılan değer. Etkinleştirilirse, profil ayarı yapılmamış uygulamalar için modüllerin sistemde yaptığı tüm değişiklikler kaldırılacaktır.
- Bu seçeneğin etkinleştirilmesi ile, bu uygulama için modüller tarafından değiştirilen tüm dosyaların KernelSU tarafından geri alınmasına izin verilecektir.
- Ad alanı
+ Mevcut KernelSU sürümü %d, yöneticinin düzgün çalışabilmesi için çok düşük. Lütfen %d sürümüne veya daha yüksek bir sürüme güncelleyin!
+ Varsayılan olarak modüllerin bağlantısını kes
+ Uygulama profilindeki \"Modüllerin bağlantısını kes\" seçeneği için varsayılan değer. Etkinleştirilirse, profil ayarı yapılmamış uygulamalar için modüllerin sistemde yaptığı tüm değişiklikler kaldırılacaktır.
+ Bu seçeneği etkinleştirmek, KernelSU\'nun bu uygulama için modüller tarafından değiştirilen dosyaları geri yüklemesine izin verir.
+ İsim alanı
Kurallar
Güncelle
Modül indiriliyor: %s
İndirme başladı: %s
- Yeni sürüm: %s mevcut, güncellemek için tıklayın
- Uygulamayı çalıştır
+ Yeni sürüm: %s var, güncellemek için tıklayın.
+ Uygulamayı başlat
Uygulamayı durmaya zorla
Uygulamayı yeniden başlat
- %s için SELinux kuralları güncellenemedi
- Mevcut KernelSU sürümü %d, yöneticinin düzgün çalışması için çok düşük. Lütfen %d veya daha yüksek bir sürüme yükseltin!
- Değişiklik listesi
+ %s için SELinux kuralları güncellenemedi.
+ Değişiklik geçmişi
+ Uygulama profili şablonu
+ Yerel ve çevrimiçi uygulama profili şablonlarını yönetin
+ Şablon oluştur
+ Şablonu düzenle
+ Kimlik
+ Geçersiz şablon kimliği
+ İsim
+ Açıklama
+ Kaydet
+ Sil
+ Şablonu görüntüle
+ Salt okunur
+ Şablon kimliği zaten var!
+ İçe aktar/Dışa aktar
+ Panodan içe aktar
+ Panodan dışa aktar
+ Dışa aktarmak için yerel şablon bulunamadı!
+ Başarıyla içe aktarıldı
+ Çevrimiçi şablonları senkronize et
+ Şablon kaydedilemedi
+ Pano boş!
+ Değişiklik geçmişi alınamadı: %s
+ Güncellemeleri denetle
+ Uygulamayı açarken güncellemeleri otomatik denetle
+ Root izni verilemedi!
+ Aç
+ Web görünümü hata ayıklamasını etkinleştir
+ Web kullanıcı arayüzünde hata ayıklamak için kullanılabilir, lütfen yalnızca gerektiğinde etkinleştirin.
+ Doğrudan kur (Tavsiye edilen)
+ Bir dosya seçin
+ Etkin olmayan yuvaya kur (OTA\'dan sonra)
+ Cihazınız geçerli etkin olmayan yuvaya **ZORLA** yeniden başlatılacaktır!
+\nBu seçeneği yalnızca OTA tamamlandıktan sonra kullanın.
+\nDevam edilsin mi?
+ Sonraki
+ KMI seçin
+ %1$s bölüm imajı önerilir
+ Sparse imajını küçültün
+ Modülün bulunduğu sparse imajını gerçek boyutuna yeniden boyutlandırın. Bunun modülün anormal çalışmasına neden olabileceğini unutmayın, bu nedenle lütfen yalnızca gerekli olduğunda kullanın (yedekleme gibi).
+ Geçici olarak kaldır
+ Kalıcı olarak kaldır
+ Stok imajı geri yükle
+ KernelSU\'yu geçici olarak kaldır, bir sonraki yeniden başlatmadan sonra orijinal durumuna geri yükle.
+ Kaldır
+ KernelSU (Root ve tüm modüller) tamamen ve kalıcı olarak kaldırılıyor.
+ Stok fabrika imajını geri yükler (eğer yedek varsa), genellikle OTA\'dan önce kullanılır; KernelSU\'yu kaldırmanız gerekiyorsa, lütfen \"Kalıcı olarak kaldır\" seçeneğini kullanın.
+ Flaşlama başarılı
+ Seçili LKM: %s
+ Flaşlanıyor
+ Flaşlama başarısız
+ Günlükleri Kaydet
+ Aksiyon
+ Günlükler kaydedildi
\ No newline at end of file
diff --git a/manager/app/src/main/res/values-uk/strings.xml b/manager/app/src/main/res/values-uk/strings.xml
index a276604915ba..919ac133c712 100644
--- a/manager/app/src/main/res/values-uk/strings.xml
+++ b/manager/app/src/main/res/values-uk/strings.xml
@@ -8,7 +8,7 @@
Суперкористувачі: %d
Модулі: %d
Не підтримується
- KernelSU підтримує лише ядра GKI
+ KernelSU підтримує лише GKI ядра на данний момент
Ядро
Версія менеджера
Відбиток
@@ -17,7 +17,7 @@
Примусовий
Дозвільний
Невідомо
- Суперкористувачі
+ Суперкористувач
Не вдалося ввімкнути модуль: %s
Не вдалося вимкнути модуль: %s
Немає встановлених модулів
@@ -39,10 +39,10 @@
Версія
Автор
overlayfs не доступний, модуль не може працювати!
- освіжати(Оновити)
+ Освіжати(Оновити)
Показати системні додатки
Сховати системні додатки
- Надіслати лог
+ Надіслати логи
Безпечний режим
Перезавантажте, щоб застосувати
Модулі вимкнено, оскільки вони конфліктують із модулями Magisk!
@@ -57,7 +57,7 @@
Шаблон
Власний
Назва профілю
- Монтування простору імен
+ Змонтувати простір імен
Наслідуваний
Глобальний
Індивідуальний
@@ -81,4 +81,55 @@
Не вдалося оновити правила SELinux для: %s
Журнал змін
Поточна версія KernelSU %d занадто низька, щоб менеджер міг працювати належним чином. Будь ласка, оновіть до версії %d або вище!
+ Успішно імпортовано
+ Експортувати в буфер обміну
+ Неможливо знайти локальні шаблони для експорту!
+ Шаблон з таким ідентифікатором вже існує!
+ Імпортувати з буферу обміну
+ Невдача при завантаженні списку змін: %s
+ Ім\'я
+ Невірний ідентифікатор шаблону
+ Синхронізувати мережеві шаблони
+ Створити шаблон
+ Тільки читання
+ Імпорт/Експорт
+ Помилка при збереженні шаблону
+ Редагувати шаблон
+ Ідентифікатор
+ Шаблон Профілю Додатку
+ Опис
+ Зберегти
+ Керувати локальними та мережевими шаблонами профілів додатків
+ Видалити
+ Буфер обміну пустий!
+ Переглянути шаблон
+ Увімкнути налагодження WebView
+ Виберіть KMI
+ Далі
+ Перевірка оновлень
+ Автоматична перевірка оновлень під час відкриття програми
+ Використовується для налагодження WebUI. Будь ласка, вмикайте тільки за потреби.
+ Пряме встановлення (рекомендовано)
+ Виберіть файл
+ Встановлення в неактивний слот (Після OTA)
+ Ваш пристрій буде **ПРИМУСОВО** завантажено в поточний неактивний слот після перезавантаження!
+\n Використовуйте цю опцію тільки після завершення OTA.
+\n Продовжити?
+ %1$s образ розділу рекомендується
+ Не вдалося отримати root!
+ Відкрити
+ Мінімізувати розріджений образ
+ Змінити розмір розрідженого образу, в якому знаходяться модулі, до його фактичного розміру. Зверніть увагу, що це може спричинити ненормальну роботу модулів, тому використовуйте це лише за потреби (наприклад, для резервного копіювання)
+ Тимчасово видалити
+ Назавжди видалити
+ Відновити Стоковий образ
+ Тимчасово видалити KernelSU, відновити початковий стан після наступного перезавантаження.
+ Видалити
+ Прошивка
+ Прошивку виконано
+ Прошивка не виконана
+ Обрано lkm: %s
+ Видалити KernelSU (Root і всі модулі) повністю і назавжди.
+ Відновити стоковий заводський образ (якщо є резервна копія), зазвичай використовується перед OTA; якщо вам потрібно видалити KernelSU, використовуйте \"Назавжди видалити\".
+ Зберегти Журнали
\ No newline at end of file
diff --git a/manager/app/src/main/res/values-vi/strings.xml b/manager/app/src/main/res/values-vi/strings.xml
index 1a669208e97d..04d878381f78 100644
--- a/manager/app/src/main/res/values-vi/strings.xml
+++ b/manager/app/src/main/res/values-vi/strings.xml
@@ -13,7 +13,7 @@
Cập nhật
Đang tải xuống mô-đun: %s
Bắt đầu tải xuống: %s
- Đã có phiên bản mới: %s, nhấn để tải xuống
+ Phiên bản mới: %s đã có, bấm để nâng cấp
Tìm hiểu KernelSU
Tìm hiểu cách cài đặt KernelSU và sử dụng các mô-đun
Hỗ trợ chúng tôi
@@ -21,10 +21,10 @@
Tham gia kênh %2$s của chúng tôi]]>
Các mô-đun bị vô hiệu hóa vì chúng xung đột với Magisk!
Bạn có muốn gỡ cài đặt mô-đun %s không\?
- Gửi nhật ký
+ Nhật ký báo cáo
Trang chủ
Chưa cài đặt
- Nhấn để cài dặt
+ Nhấn để cài đặt
Đang hoạt động
Phiên bản: %d
Không được hỗ trợ
@@ -37,23 +37,23 @@
Thực thi
Cho phép
Không rõ
- Superuser
+ SuperUser
Không thể kích hoạt mô-đun: %s
Không thể vô hiệu hóa mô-đun: %s
- Chưa có mô-đun nào được cài đặt
+ Chưa cài đặt mô-đun nào
Mô-đun
Gỡ cài đặt
Cài đặt
Cài đặt
Khởi động lại
- Cài đặt
+ Thiết đặt
Khởi động mềm
Khởi động lại vào Recovery
Khởi động lại vào Bootloader
Khởi động lại vào Download Mode
Khởi động lại vào EDL
- Về ứng dụng
- %s đã được gỡ cài đặt
+ Giới thiệu
+ %s được gỡ cài đặt
Lỗi khi gỡ cài đặt: %s
Phiên bản
Tác giả
@@ -68,16 +68,68 @@
Số mô-đun: %d
Phạm vi
Quy định
- Mở
+ Khởi chạy
Khởi động lại
- Danh sách mount
+ Gắn namespace
Quyền
Không thể cập nhật quy định SELinux cho: %s
Buộc dừng
Thừa hưởng
Chung
Riêng
- SELinux context
+ Bối cảnh SELinux
Ngắt mô-đun
KernelSU phiên bản %d quá thấp để trình quản lý hoạt động, hãy cập nhật lên %d hoặc mới hơn!
+ Đã nhập thành công
+ Xuất từ khay nhớ tạm
+ Không thể tìm thấy mẫu cục bộ để xuất!
+ id bản mẫu đã tồn tại!
+ Nhật ký thay đổi
+ Nhập từ khay nhớ tạm
+ Không nạp được nhật ký thay đổi: %s
+ Tên
+ Id mẫu không hợp lệ
+ Đồng bộ hóa các mẫu trực tuyến
+ Tạo Bản Mẫu
+ Nhập/Xuất
+ Không lưu được mẫu
+ Sửa Bản Mẫu
+ Mẫu Hồ Sơ Ứng Dụng
+ Mô tả
+ Lưu
+ Quản lý mẫu Hồ sơ Ứng dụng cục bộ và trực tuyến
+ Xóa
+ Clipboard trống!
+ Xem Bản Mẫu
+ chỉ đọc
+ id
+ Bật gỡ lỗi WebView
+ Có thể được sử dụng để gỡ lỗi WebUI, vui lòng chỉ bật khi cần.
+ Không cấp được quyền root!
+ Kiểm tra cập nhật
+ Tự động kiểm tra cập nhật khi mở ứng dụng
+ Mở
+ Cài đặt vào khe không hoạt động (Sau OTA)
+ Thiết bị của bạn sẽ **BẮT BUỘC** khởi động vào khe không hoạt động hiện tại sau khi khởi động lại!
+\nChỉ sử dụng tùy chọn này sau khi OTA hoàn tất.
+\nTiếp tục?
+ Tạm thời gỡ cài đặt KernelSU, khôi phục về trạng thái ban đầu sau lần khởi động lại tiếp theo.
+ Chọn KMI
+ Kế tiếp
+ Cài đặt trực tiếp (Được khuyến nghị)
+ Chọn một tệp
+ Gỡ cài đặt
+ Gỡ cài đặt tạm thời
+ Gỡ cài đặt vĩnh viễn
+ Khôi phục hình ảnh gốc
+ Gỡ cài đặt KernelSU (Root và tất cả các mô-đun) hoàn toàn và vĩnh viễn.
+ Khôi phục hình ảnh gốc của nhà máy (nếu có bản sao lưu), thường được sử dụng trước OTA; nếu bạn cần gỡ cài đặt KernelSU, vui lòng sử dụng \"Gỡ cài đặt vĩnh viễn\".
+ Đang cài
+ Cài thành công
+ Cài thất bại
+ Đã chọn lkm: %s
+ Nên sử dụng hình ảnh phân vùng %1$s
+ Giảm thiểu hình ảnh thưa thớt
+ Thay đổi kích thước hình ảnh thưa nơi đặt mô-đun theo kích thước thực tế của nó. Lưu ý điều này có thể khiến module hoạt động không bình thường nên vui lòng chỉ sử dụng khi cần thiết (chẳng hạn như để sao lưu)
+ Lưu Nhật Ký
\ No newline at end of file
diff --git a/manager/app/src/main/res/values-zh-rCN/strings.xml b/manager/app/src/main/res/values-zh-rCN/strings.xml
index 376924fcbb65..555b1ac948f4 100644
--- a/manager/app/src/main/res/values-zh-rCN/strings.xml
+++ b/manager/app/src/main/res/values-zh-rCN/strings.xml
@@ -4,7 +4,7 @@
未安装
点击安装
工作中
- 版本: %d
+ 版本:%d
超级用户数:%d
不支持
KernelSU 现在只支持 GKI 内核
@@ -17,10 +17,12 @@
宽容模式
未知
超级用户
- 无法启用模块: %s
- 无法禁用模块: %s
+ 无法启用模块:%s
+ 无法禁用模块:%s
没有安装模块
模块
+ 排序(有Action优先)
+ 排序(已启用优先)
卸载
安装
安装
@@ -34,23 +36,23 @@
关于
确定要卸载模块 %s 吗?
%s 已卸载
- 卸载失败: %s
+ 卸载失败:%s
版本
作者
- 内核不支持 overlayfs,模块功能无法运作!
+ OverlayFS 被内核禁用,模块不可用。
刷新
显示系统应用
隐藏系统应用
发送日志
安全模式
重启生效
- 所有模块已被禁用,因为它与 Magisk 的模块系统有冲突!
+ 因与 Magisk 有冲突,所有模块不可用!
模块数:%d
了解 KernelSU
https://kernelsu.org/zh_CN/guide/what-is-kernelsu.html
了解如何安装 KernelSU 以及如何开发模块
支持开发
- KernelSU 将保持免费和开源,向开发者捐赠以表示支持。
+ KernelSU 将保持免费开源,向开发者捐赠以表示支持。
加入我们的 %2$s 频道
加入我们的 QQ 频道]]>
默认
模版
@@ -65,19 +67,70 @@
SELinux
卸载模块
为 %s 更新 App Profile 失败
- 当前 KernelSU 版本 %d 过低,管理器无法正常工作,请升级内核 KernelSU 版本至 %d 或以上!
+ 当前 KernelSU 版本 %d 过低,管理器无法正常工作,请将内核 KernelSU 版本升级至 %d 或以上!
默认卸载模块
- App Profile 中\"卸载模块\"的全局默认值,如果启用,将会为没有设置 Profile 的应用移除所有模块针对系统的修改。
- 启用后将允许 KernelSU 为本应用还原被模块修改过的文件。
+ App Profile 中“卸载模块”的全局默认值,如果启用,将会为没有设置 Profile 的应用移除所有模块针对系统的修改。
+ 启用该选项后将允许 KernelSU 为本应用还原被模块修改过的文件。
域
规则
更新
正在下载模块:%s
开始下载:%s
- 发现新版本:%s,点击升级
+ 发现新版本:%s,点击升级。
启动
强制停止
重新启动
为:%s 更新翻译失败
更新日志
-
\ No newline at end of file
+ App Profile 模版
+ 管理本地和在线的 App Profile 模版
+ 创建模版
+ 编辑模版
+ 模版 ID
+ 模版 ID 不合法
+ 名字
+ 描述
+ 保存
+ 删除
+ 查看模版
+ 只读
+ 模版 ID 已存在!
+ 导入/导出
+ 从剪切板导入
+ 导出到剪切板
+ 没有可以导出的本地模板!
+ 导入成功
+ 同步在线规则
+ 模版保存失败
+ 剪切板为空!
+ 获取更新日志失败:%s
+ 检查更新
+ 在应用启动后自动检查是否有最新版
+ 获取 root 失败!
+ 执行
+ 打开
+ 启用 WebView 调试
+ 可用于调试 WebUI 。请仅在需要时启用。
+ 直接安装(推荐)
+ 选择一个文件
+ 安装到未使用的槽位(OTA 后)
+ 将在重启后强制切换到另一个槽位!\n注意只能在 OTA 更新完成后的重启之前使用。\n确认?
+ 下一步
+ 建议选择 %1$s 分区镜像
+ 选择 KMI
+ 最小化稀疏文件
+ 将模块所在的稀疏文件镜像调整为其实际大小。注意该操作可能会导致模块工作异常,请仅在必要时(如备份)使用。
+ 卸载
+ 临时卸载
+ 永久卸载
+ 恢复原厂镜像
+ 临时卸载 KernelSU,下次重启后恢复至原始状态。
+ 完全并永久卸载 KernelSU(Root 权限和所有模块)。
+ 恢复原厂镜像(若存在备份),一般在 OTA 前使用;如果你需要卸载 KernelSU,请使用“永久卸载”。
+ 刷写中
+ 刷写完成
+ 刷写失败
+ 选择的 LKM:%s
+ 保存日志
+ 日志已保存
+
diff --git a/manager/app/src/main/res/values-zh-rHK/strings.xml b/manager/app/src/main/res/values-zh-rHK/strings.xml
index aff53ffc68a8..154ddac9bb8d 100644
--- a/manager/app/src/main/res/values-zh-rHK/strings.xml
+++ b/manager/app/src/main/res/values-zh-rHK/strings.xml
@@ -3,14 +3,14 @@
首頁
未安裝
按一下以安裝
- 正在處理
- 版本:%d
+ 運作中
+ KernelSU 版本:%d
超級使用者:%d 個
- 模組:%d 個
+ 已安裝模組:%d 個
不支援
KernelSU 現在僅支援 GKI 核心
核心
- 管理員版本
+ 管理器版本
指紋
SELinux 狀態
已停用
@@ -48,9 +48,9 @@
模組已停用,因其與 Magisk 的模組存在衝突!
深入瞭解 KernelSU
https://kernelsu.org/zh_TW/guide/what-is-kernelsu.html
- 瞭解如何安裝 KernelSU 和使用模組
- 支持我們
- KernelSU 是免費且開源的,您可以透過捐贈來向我們展示您對我們的關心。
+ 瞭解如何安裝 KernelSU 以及如何開發模組
+ 支援開發
+ KernelSU 將保持免費和開源,您可以考慮向開發人員贊助以表示支持。
加入我們的 %2$s 頻道]]>
預設
設定檔名稱
@@ -61,8 +61,8 @@
卸載模組
無法更新 %s 應用程式設定檔
規則
- 目前 KernelSU 版本 %d 過低,管理員無法正常運作。請升級至 %d 或更高版本!
- 應用程式設定檔中「卸載模組」的全域預設值。如果啟用,將會為沒有設定檔的應用程式移除所有模組對系統的修改。
+ 目前 KernelSU 版本 %d 過低,管理器無法正常運作。請升級至 %d 或更高版本!
+ 應用程式設定檔中「解除安裝模組」的全域預設值,如果啟用,將會為沒有設定檔的應用程式移除所有模組針對系統的修改。
啟用此選項將允許 KernelSU 為這個應用程式還原任何被模組修改過的檔案。
網域
更新
@@ -70,13 +70,55 @@
掛載命名空間
個人
群組
- SELinux 內容
- 預設卸載模組
+ SELinux 環境
+ 預設解除安裝模組
正在下載模組:%s
開始下載:%s
- 新版本:%s 已可供使用,按一下以下載
+ 新版本:%s 已可供使用,按一下以升級
啟動
強制停止
重新啟動
無法為 %s 更新 SELinux 規則
-
+ 變更記錄
+ 成功匯出
+ 導出到剪貼板
+ 本地沒有模板可匯出!
+ 模板 ID 已存在!
+ 從剪貼簿匯入
+ 獲取更新日誌失敗:%s
+ 名字
+ 模板 ID 無效
+ 同步在線規則
+ 創建模板
+ 只讀
+ 匯出 / 匯入
+ 模板儲存失敗
+ 編輯模板
+ 模板 ID
+ App Profile 模板
+ 描述
+ 儲存
+ 管理本地和線上的 App Profile 模板
+ 刪除
+ 剪貼簿沒有內容!
+ 查看模板
+ 啟用 WebView 偵錯
+ 可用於偵錯WebUI,請僅在需要時啟用。
+ 直接安裝(建議)
+ 選擇一個文件
+ 安裝到非活動插槽(OTA 後)
+ 重新啟動後,您的裝置將強制啟動到目前非活動插槽!
+\n僅在 OTA 完成後使用此選項。
+\n繼續?
+ 下一個
+ 選擇KMI
+ 建議使用 %1$s 分割區映像
+ 授予root權限失敗!
+ 打開
+ 檢查更新
+ 開啟應用程式時自動檢查更新
+ 最小化稀疏影像
+ 將模組所在的稀疏影像調整為實際大小。 請注意,這可能會導致模組工作異常,因此請僅在必要時使用(例如備份)
+ 解除安裝
+ 保存日志
+
\ No newline at end of file
diff --git a/manager/app/src/main/res/values-zh-rTW/strings.xml b/manager/app/src/main/res/values-zh-rTW/strings.xml
index 351ae0842c89..46c33f7e12ef 100644
--- a/manager/app/src/main/res/values-zh-rTW/strings.xml
+++ b/manager/app/src/main/res/values-zh-rTW/strings.xml
@@ -1,83 +1,134 @@
首頁
- 未安裝
- 按一下以安裝
- 正在處理
- KernelSU 版本:%d
- 已授權 Root:%d 個
- 不支援
- KernelSU 現在僅支援 GKI 核心
- 核心
- 管理器版本
- 指紋
+ 尚未安裝
+ 點選開始安裝
+ 已開始運作
+ 版本:%d
+ 授權:%d 個應用程式
+ 未受支援
+ KernelSU 目前僅支援 GKI 核心
+ 裝置核心
+ 管理工具
+ 指紋資訊
SELinux 狀態
已停用
- 強制
- 寬鬆
- 未知
- Root 授權
+ 強制執行
+ 容許執行
+ 不明
+ 授權
無法啟用模組:%s
無法停用模組:%s
- 尚未安裝模組
+ 查無已安裝的模組
模組
解除安裝
安裝
安裝
重新啟動
設定
- 軟重新啟動
+ 軟重啟
重新啟動至 Recovery
重新啟動至 Bootloader
重新啟動至 Download
重新啟動至 EDL
關於
- 您確定要解除安裝模組「%s」嗎?
+ 你是否要解除安裝「%s」模組?
「%s」已解除安裝
無法解除安裝:%s
版本
作者
- OverlayFS 無法使用,模組無法正常運作!
- 重新整理
- 顯示系統應用程式
- 隱藏系統應用程式
- 傳送記錄
+ OverlayFS 已遭核心停用,無法使用模組功能。
+ 重新載入
+ 顯示系統程式
+ 隱藏系統程式
+ 發送運作日誌
安全模式
- 重新啟動以生效
- 模組已停用,因其與 Magisk 的模組存在衝突!
- 已安裝模組:%d 個
+ 將在重新啟動時生效
+ 與 Magisk 發生衝突,無法使用模組功能!
+ 掛載:%d 個模組
深入瞭解 KernelSU
https://kernelsu.org/zh_TW/guide/what-is-kernelsu.html
- 瞭解如何安裝 KernelSU 以及如何開發模組
- 支持開發
- KernelSU 將保持免費和開源,您可以考慮向開發人員捐贈以表示支持。
- 加入我們的 %2$s 頻道]]>
- 解除安裝模組
- 無法更新 %s 應用程式設定檔
- 目前安裝的 KernelSU 版本 %d 過低,管理器無法正常工作,請升級核心 KernelSU 版本至 %d 或以上!
- 預設解除安裝模組
- 應用程式設定檔中「解除安裝模組」的全域預設值,如果啟用,將會為沒有設定檔的應用程式移除所有模組針對系統的修改。
- 啟用後將允許 KernelSU 為本應用程式還原被模組修改過的檔案。
+ 知曉安裝、使用 KernelSU 本體與其模組功能的方法
+ 協助發展
+ KernelSU 一向以免費製品與開放原始碼自居,矢志不渝。若想協助我們,請以小額捐款表達你對專案發展的大力支持。
+ 前往 %2$s 加入頻道]]>
+ 解除掛載模組功能
+ 無法更新「%s」App Profile
+ 管理工具無法以老舊的 KernelSU %d 版本正常運作。請升級至 %d 以上的版本!
+ 預設解除掛載模組功能
+ 將 App Profile 的全域預設行為設作「解除掛載模組功能」。啟用後,將向未指派 Profile 的應用程式移除模組功能。
+ 啟用選項後,KernelSU 會將應用程式內遭模組修改的檔案恢復原狀。
預設
自訂
- 功能
+ 權限
規則
正在下載模組:%s
- 重新啟動
+ 重新執行
範本
- 設定檔名稱
- 掛載命名空間
+ Profile 名稱
+ 命名空間掛載
繼承
全域
- 個人
+ 個體
群組
- SELinux 環境
- 網域
+ SELinux 上下文
+ 定域
更新
- 開始下載:%s
- 發現新版本:%s 已可供使用,按一下即可升級
- 啟動
+ 準備下載模組:%s
+ 版本 %s 現已開放下載,點選開始更新。
+ 開始執行
強制停止
- 無法為 %s 更新 SELinux
- 變更記錄
+ 無法為「%s」更新 SELinux 規則
+ 更新說明
+ 範本編號無效
+ 建立範本
+ 編輯範本
+ 編號
+ App Profile 範本
+ 管理 App Profile 的本地、線上範本
+ 已成功匯入
+ 匯出至剪貼簿
+ 查無可供匯出的本地範本!
+ 編號已由其他範本領有!
+ 自剪貼簿匯入
+ 無法提取更新說明:%s
+ 名稱
+ 同步線上範本
+ 唯讀
+ 匯入/匯出
+ 無法儲存範本
+ 說明
+ 儲存
+ 刪除
+ 查無剪貼簿內容!
+ 檢視範本
+ 旨在偵錯 WebUI。請依自身狀況適時啟用。
+ 啟用 WebView 偵錯
+ 無法獲取 Root 權限!
+ 開啟
+ 檢查更新
+ 開啟本應用程式時,自動檢查更新
+ 選擇檔案
+ 安裝至非作用擴充槽(適用於 OTA 更新過後)
+ 你的裝置將在重新啟動時**強制**開機至目前的非作用擴充槽!\n確保僅在 OTA 更新過後選擇此選項。\n是否繼續?
+ 直接安裝(推薦)
+ 繼續
+ 選擇 KMI
+ 建議選擇 %1$s 分區的映像檔
+ 最小化稀疏映像檔
+ 為裝有模組的稀疏映像檔重新分配為實際占用大小。完成最小化後模組或有異常行為,請在非常時刻(如有備份需求)才採非常手段。
+ 解除安裝
+ 暫時性解除安裝
+ 恢復原廠映像檔
+ 暫時解除安裝 KernelSU。會在下次重新啟動時恢復原狀。
+ 永久性解除安裝
+ 徹底解除安裝 KernelSU(含 Root 授權與所有的模組)。
+ 正在閃刷
+ 閃刷成功
+ 若裝置內含有備份檔案,遂以 OTA 更新前的原廠系統映像檔進行復原。若需要解除安裝 KernelSU,請選擇「永久性解除安裝」。
+ 閃刷失敗
+ 已選定 LKM:%s
+ 儲存運作日誌
+ 執行
+ 已儲存運作日誌
\ No newline at end of file
diff --git a/manager/app/src/main/res/values/colors.xml b/manager/app/src/main/res/values/colors.xml
new file mode 100644
index 000000000000..a5b623aa4885
--- /dev/null
+++ b/manager/app/src/main/res/values/colors.xml
@@ -0,0 +1,4 @@
+
+
+ #FFFFFFFF
+
\ No newline at end of file
diff --git a/manager/app/src/main/res/values/strings.xml b/manager/app/src/main/res/values/strings.xml
index 5c1fdbdd0412..38d76be67006 100644
--- a/manager/app/src/main/res/values/strings.xml
+++ b/manager/app/src/main/res/values/strings.xml
@@ -1,6 +1,6 @@
+
KernelSU
-
Home
Not installed
Click to install
@@ -10,11 +10,9 @@
Modules: %d
Unsupported
KernelSU only supports GKI kernels now
-
Kernel
- Manager Version
+ Manager version
Fingerprint
-
SELinux status
Disabled
Enforcing
@@ -24,8 +22,9 @@
Failed to enable module: %s
Failed to disable module: %s
No module installed
-
Module
+ Sort (Action first)
+ Sort (Enabled first)
Uninstall
Install
Install
@@ -42,14 +41,14 @@
Failed to uninstall: %s
Version
Author
- overlayfs is not available, module cannot work!
+ Modules are unavailable as OverlayFS is disabled by the kernel.
Refresh
Show system apps
Hide system apps
- Send Log
+ Send logs
Safe mode
Reboot to take effect
- Modules are disabled because it is conflict with Magisk\'s!
+ Modules are unavailable due to a conflict with Magisk!
Learn KernelSU
https://kernelsu.org/guide/what-is-kernelsu.html
Learn how to install KernelSU and use modules
@@ -70,19 +69,70 @@
SELinux context
Umount modules
Failed to update App Profile for %s
- The current KernelSU version %d is too low for the manager to function properly. Please upgrade to version %d or higher!
+ The current KernelSU version %d is too low for the manager to work properly. Please upgrade to version %d or higher!
Umount modules by default
- The global default value for \"Umount modules\" in App Profiles. If enabled, it will remove all module modifications to the system for applications that do not have a Profile set.
- Enabling this option will allow KernelSU to restore any modified files by the modules for this application.
+ 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.
+ Enabling this option will allow KernelSU to restore any modified files by the modules for this app.
Domain
Rules
Update
Downloading module: %s
Start downloading: %s
- New version: %s is available, click to upgrade
+ New version %s is available, click to upgrade.
Launch
- Force Stop
+ Force stop
Restart
Failed to update SELinux rules for: %s
Changelog
-
+ App Profile Template
+ Manage local and online template of App Profile
+ Create template
+ Edit template
+ ID
+ Invalid template ID
+ Name
+ Description
+ Save
+ Delete
+ View template
+ Read only
+ Template ID already exists!
+ Import/Export
+ Import from clipboard
+ Export to clipboard
+ Cannot find local template to export!
+ Imported successfully
+ Sync online templates
+ Failed to save template
+ Clipboard is empty!
+ Fetch changelog failed: %s
+ Check update
+ Automatically check for updates when opening the app
+ Failed to grant root!
+ Action
+ Open
+ Enable WebView debugging
+ Can be used to debug WebUI. Please enable only when needed.
+ Direct install (Recommended)
+ Select a file
+ Install to inactive slot (After OTA)
+ Your device will be **FORCED** to boot to the current inactive slot after a reboot!\nOnly use this option after OTA is done.\nContinue?
+ Next
+ %1$s partition image is recommended
+ Select KMI
+ Minimize sparse image
+ Resize the sparse image where the module is located to its actual size. Note that this may cause the module to work abnormally, so please only use when necessary (Such as for backup).
+ Uninstall
+ Uninstall temporarily
+ Uninstall permanently
+ Restore stock image
+ Temporarily uninstall KernelSU, restore to original state after next reboot.
+ Uninstalling KernelSU (Root and all modules) completely and permanently.
+ Restore the stock factory image (If a backup exists), usually used before OTA; if you need to uninstall KernelSU, please use \"Uninstall permanently\".
+ Flashing
+ Flash success
+ Flash failed
+ Selected LKM: %s
+ Save logs
+ Logs saved
+
\ No newline at end of file
diff --git a/manager/app/src/main/res/values/themes.xml b/manager/app/src/main/res/values/themes.xml
index bf6e252fa159..31721d39e182 100644
--- a/manager/app/src/main/res/values/themes.xml
+++ b/manager/app/src/main/res/values/themes.xml
@@ -1,6 +1,13 @@
-
+
+
+
+
\ No newline at end of file
diff --git a/manager/app/src/main/res/xml/network_security_config.xml b/manager/app/src/main/res/xml/network_security_config.xml
new file mode 100644
index 000000000000..6dd26ccf046a
--- /dev/null
+++ b/manager/app/src/main/res/xml/network_security_config.xml
@@ -0,0 +1,8 @@
+
+
+
+ 127.0.0.1
+ 0.0.0.0
+ ::1
+
+
diff --git a/manager/build.gradle.kts b/manager/build.gradle.kts
index 030ac9fda115..3bb25ee907cc 100644
--- a/manager/build.gradle.kts
+++ b/manager/build.gradle.kts
@@ -7,6 +7,7 @@ plugins {
alias(libs.plugins.agp.app) apply false
alias(libs.plugins.agp.lib) apply false
alias(libs.plugins.kotlin) apply false
+ alias(libs.plugins.compose.compiler) apply false
alias(libs.plugins.lsplugin.cmaker)
}
@@ -14,38 +15,28 @@ cmaker {
default {
arguments.addAll(
arrayOf(
- "-DANDROID_STL=c++_static",
+ "-DANDROID_STL=none",
)
)
- val flags = arrayOf(
- "-Wno-gnu-string-literal-operator-template",
- "-Wno-c++2b-extensions",
- )
- cFlags.addAll(flags)
- cppFlags.addAll(flags)
- abiFilters("arm64-v8a", "x86_64")
+ abiFilters("arm64-v8a", "x86_64", "riscv64")
}
buildTypes {
if (it.name == "release") {
- arguments += "-DDEBUG_SYMBOLS_PATH=${buildDir.absolutePath}/symbols"
+ arguments += "-DDEBUG_SYMBOLS_PATH=${layout.buildDirectory.asFile.get().absolutePath}/symbols"
}
}
}
val androidMinSdkVersion = 26
-val androidTargetSdkVersion = 33
-val androidCompileSdkVersion = 33
-val androidBuildToolsVersion = "33.0.2"
-val androidCompileNdkVersion = "25.2.9519653"
-val androidSourceCompatibility = JavaVersion.VERSION_17
-val androidTargetCompatibility = JavaVersion.VERSION_17
+val androidTargetSdkVersion = 35
+val androidCompileSdkVersion = 35
+val androidBuildToolsVersion = "35.0.0"
+val androidCompileNdkVersion = "27.0.12077973"
+val androidSourceCompatibility = JavaVersion.VERSION_21
+val androidTargetCompatibility = JavaVersion.VERSION_21
val managerVersionCode by extra(getVersionCode())
val managerVersionName by extra(getVersionName())
-tasks.register("clean") {
- delete(rootProject.buildDir)
-}
-
fun getGitCommitCount(): Int {
val out = ByteArrayOutputStream()
exec {
@@ -88,6 +79,9 @@ subprojects {
versionCode = managerVersionCode
versionName = managerVersionName
}
+ ndk {
+ abiFilters += listOf("arm64-v8a", "x86_64", "riscv64")
+ }
}
lint {
@@ -101,4 +95,4 @@ subprojects {
}
}
}
-}
+}
\ No newline at end of file
diff --git a/manager/gradle/libs.versions.toml b/manager/gradle/libs.versions.toml
index 12b2f2204903..41384e397b79 100644
--- a/manager/gradle/libs.versions.toml
+++ b/manager/gradle/libs.versions.toml
@@ -1,26 +1,38 @@
[versions]
-agp = "8.1.0"
-kotlin = "1.8.10"
-ksp = "1.8.10-1.0.9"
-compose-bom = "2023.06.01"
-lifecycle = "2.6.1"
-accompanist = "0.30.1"
-navigation = "2.6.0"
-compose-destination = "1.9.42-beta"
-libsu = "5.0.5"
-sheets-compose-dialogs = "1.2.0"
+agp = "8.8.0"
+kotlin = "2.1.0"
+ksp = "2.1.0-1.0.29"
+compose-bom = "2025.01.00"
+lifecycle = "2.8.7"
+navigation = "2.8.5"
+activity-compose = "1.10.0"
+kotlinx-coroutines = "1.10.1"
+coil-compose = "2.7.0"
+compose-destination = "2.1.0-beta15"
+sheets-compose-dialogs = "1.3.0"
markdown = "4.6.2"
+webkit = "1.12.1"
+appiconloader-coil = "1.5.0"
+parcelablelist = "2.0.1"
+libsu = "6.0.0"
+apksign = "1.4"
+cmaker = "1.2"
[plugins]
agp-app = { id = "com.android.application", version.ref = "agp" }
agp-lib = { id = "com.android.library", version.ref = "agp" }
+
kotlin = { id = "org.jetbrains.kotlin.android", version.ref = "kotlin" }
+compose-compiler = { id = "org.jetbrains.kotlin.plugin.compose", version.ref = "kotlin" }
+
ksp = { id = "com.google.devtools.ksp", version.ref = "ksp" }
-lsplugin-apksign = { id = "org.lsposed.lsplugin.apksign", version = "1.1" }
-lsplugin-cmaker = { id = "org.lsposed.lsplugin.cmaker", version = "1.1" }
+
+lsplugin-apksign = { id = "org.lsposed.lsplugin.apksign", version.ref = "apksign" }
+lsplugin-cmaker = { id = "org.lsposed.lsplugin.cmaker", version.ref = "cmaker" }
[libraries]
-androidx-activity-compose = { group = "androidx.activity", name = "activity-compose", version = "1.7.1" }
+androidx-activity-compose = { group = "androidx.activity", name = "activity-compose", version.ref = "activity-compose" }
+
androidx-navigation-compose = { group = "androidx.navigation", name = "navigation-compose", version.ref = "navigation" }
androidx-compose-bom = { group = "androidx.compose", name = "compose-bom", version.ref = "compose-bom" }
@@ -36,26 +48,27 @@ androidx-lifecycle-runtime-ktx = { group = "androidx.lifecycle", name = "lifecyc
androidx-lifecycle-runtime-compose = { group = "androidx.lifecycle", name = "lifecycle-runtime-compose", version.ref = "lifecycle" }
androidx-lifecycle-viewmodel-compose = { group = "androidx.lifecycle", name = "lifecycle-viewmodel-compose", version.ref = "lifecycle" }
-com-google-accompanist-drawablepainter = { group = "com.google.accompanist", name = "accompanist-drawablepainter", version.ref = "accompanist" }
-com-google-accompanist-navigation-animation = { group = "com.google.accompanist", name = "accompanist-navigation-animation", version.ref = "accompanist" }
-com-google-accompanist-systemuicontroller = { group = "com.google.accompanist", name = "accompanist-systemuicontroller", version.ref = "accompanist" }
+androidx-webkit = { module = "androidx.webkit:webkit", version.ref = "webkit" }
com-github-topjohnwu-libsu-core = { group = "com.github.topjohnwu.libsu", name = "core", version.ref = "libsu" }
com-github-topjohnwu-libsu-service = { group = "com.github.topjohnwu.libsu", name = "service", version.ref = "libsu" }
+com-github-topjohnwu-libsu-io = { group = "com.github.topjohnwu.libsu", name = "io", version.ref = "libsu" }
-dev-rikka-rikkax-parcelablelist = { module = "dev.rikka.rikkax.parcelablelist:parcelablelist", version = "2.0.1" }
+dev-rikka-rikkax-parcelablelist = { module = "dev.rikka.rikkax.parcelablelist:parcelablelist", version.ref = "parcelablelist" }
-io-coil-kt-coil-compose = { group = "io.coil-kt", name = "coil-compose", version = "2.3.0" }
+io-coil-kt-coil-compose = { group = "io.coil-kt", name = "coil-compose", version.ref = "coil-compose" }
-kotlinx-coroutines-core = { module = "org.jetbrains.kotlinx:kotlinx-coroutines-core", version = "1.7.1" }
+kotlinx-coroutines-core = { module = "org.jetbrains.kotlinx:kotlinx-coroutines-core", version.ref = "kotlinx-coroutines" }
-me-zhanghai-android-appiconloader-coil = { group = "me.zhanghai.android.appiconloader", name = "appiconloader-coil", version = "1.5.0" }
+me-zhanghai-android-appiconloader-coil = { group = "me.zhanghai.android.appiconloader", name = "appiconloader-coil", version.ref = "appiconloader-coil" }
-compose-destinations-animations-core = { group = "io.github.raamcosta.compose-destinations", name = "animations-core", version.ref = "compose-destination" }
+compose-destinations-core = { group = "io.github.raamcosta.compose-destinations", name = "core", version.ref = "compose-destination" }
compose-destinations-ksp = { group = "io.github.raamcosta.compose-destinations", name = "ksp", version.ref = "compose-destination" }
-sheet-compose-dialogs-core = { group = "com.maxkeppeler.sheets-compose-dialogs", name = "core", version.ref = "sheets-compose-dialogs"}
-sheet-compose-dialogs-list = { group = "com.maxkeppeler.sheets-compose-dialogs", name = "list", version.ref = "sheets-compose-dialogs"}
-sheet-compose-dialogs-input = { group = "com.maxkeppeler.sheets-compose-dialogs", name = "input", version.ref = "sheets-compose-dialogs"}
+sheet-compose-dialogs-core = { group = "com.maxkeppeler.sheets-compose-dialogs", name = "core", version.ref = "sheets-compose-dialogs" }
+sheet-compose-dialogs-list = { group = "com.maxkeppeler.sheets-compose-dialogs", name = "list", version.ref = "sheets-compose-dialogs" }
+sheet-compose-dialogs-input = { group = "com.maxkeppeler.sheets-compose-dialogs", name = "input", version.ref = "sheets-compose-dialogs" }
+
+markdown = { group = "io.noties.markwon", name = "core", version.ref = "markdown" }
-markdown = { group = "io.noties.markwon", name = "core", version.ref = "markdown" }
\ No newline at end of file
+lsposed-cxx = { module = "org.lsposed.libcxx:libcxx", version = "27.0.12077973" }
\ No newline at end of file
diff --git a/manager/gradle/wrapper/gradle-wrapper.jar b/manager/gradle/wrapper/gradle-wrapper.jar
index 7f93135c49b7..2c3521197d7c 100644
Binary files a/manager/gradle/wrapper/gradle-wrapper.jar and b/manager/gradle/wrapper/gradle-wrapper.jar differ
diff --git a/manager/gradle/wrapper/gradle-wrapper.properties b/manager/gradle/wrapper/gradle-wrapper.properties
index ac72c34e8acc..df97d72b8b91 100644
--- a/manager/gradle/wrapper/gradle-wrapper.properties
+++ b/manager/gradle/wrapper/gradle-wrapper.properties
@@ -1,6 +1,6 @@
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
-distributionUrl=https\://services.gradle.org/distributions/gradle-8.3-bin.zip
+distributionUrl=https\://services.gradle.org/distributions/gradle-8.10.2-bin.zip
networkTimeout=10000
validateDistributionUrl=true
zipStoreBase=GRADLE_USER_HOME
diff --git a/manager/gradlew b/manager/gradlew
index 0adc8e1a5321..f5feea6d6b11 100755
--- a/manager/gradlew
+++ b/manager/gradlew
@@ -15,6 +15,8 @@
# See the License for the specific language governing permissions and
# limitations under the License.
#
+# SPDX-License-Identifier: Apache-2.0
+#
##############################################################################
#
@@ -55,7 +57,7 @@
# Darwin, MinGW, and NonStop.
#
# (3) This script is generated from the Groovy template
-# https://github.com/gradle/gradle/blob/HEAD/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt
+# https://github.com/gradle/gradle/blob/HEAD/platforms/jvm/plugins-application/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt
# within the Gradle project.
#
# You can find Gradle at https://github.com/gradle/gradle/.
@@ -84,7 +86,8 @@ done
# shellcheck disable=SC2034
APP_BASE_NAME=${0##*/}
# Discard cd standard output in case $CDPATH is set (https://github.com/gradle/gradle/issues/25036)
-APP_HOME=$( cd "${APP_HOME:-./}" > /dev/null && pwd -P ) || exit
+APP_HOME=$( cd -P "${APP_HOME:-./}" > /dev/null && printf '%s
+' "$PWD" ) || exit
# Use the maximum available, or set MAX_FD != -1 to use that value.
MAX_FD=maximum
@@ -145,7 +148,7 @@ if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then
case $MAX_FD in #(
max*)
# In POSIX sh, ulimit -H is undefined. That's why the result is checked to see if it worked.
- # shellcheck disable=SC3045
+ # shellcheck disable=SC2039,SC3045
MAX_FD=$( ulimit -H -n ) ||
warn "Could not query maximum file descriptor limit"
esac
@@ -153,7 +156,7 @@ if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then
'' | soft) :;; #(
*)
# In POSIX sh, ulimit -n is undefined. That's why the result is checked to see if it worked.
- # shellcheck disable=SC3045
+ # shellcheck disable=SC2039,SC3045
ulimit -n "$MAX_FD" ||
warn "Could not set maximum file descriptor limit to $MAX_FD"
esac
@@ -202,11 +205,11 @@ fi
# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"'
-# Collect all arguments for the java command;
-# * $DEFAULT_JVM_OPTS, $JAVA_OPTS, and $GRADLE_OPTS can contain fragments of
-# shell script including quotes and variable substitutions, so put them in
-# double quotes to make sure that they get re-expanded; and
-# * put everything else in single quotes, so that it's not re-expanded.
+# Collect all arguments for the java command:
+# * DEFAULT_JVM_OPTS, JAVA_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.
set -- \
"-Dorg.gradle.appname=$APP_BASE_NAME" \
diff --git a/manager/gradlew.bat b/manager/gradlew.bat
index 6689b85beecd..9d21a21834d5 100644
--- a/manager/gradlew.bat
+++ b/manager/gradlew.bat
@@ -1,92 +1,94 @@
-@rem
-@rem Copyright 2015 the original author or authors.
-@rem
-@rem Licensed under the Apache License, Version 2.0 (the "License");
-@rem you may not use this file except in compliance with the License.
-@rem You may obtain a copy of the License at
-@rem
-@rem https://www.apache.org/licenses/LICENSE-2.0
-@rem
-@rem Unless required by applicable law or agreed to in writing, software
-@rem distributed under the License is distributed on an "AS IS" BASIS,
-@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-@rem See the License for the specific language governing permissions and
-@rem limitations under the License.
-@rem
-
-@if "%DEBUG%"=="" @echo off
-@rem ##########################################################################
-@rem
-@rem Gradle startup script for Windows
-@rem
-@rem ##########################################################################
-
-@rem Set local scope for the variables with windows NT shell
-if "%OS%"=="Windows_NT" setlocal
-
-set DIRNAME=%~dp0
-if "%DIRNAME%"=="" set DIRNAME=.
-@rem This is normally unused
-set APP_BASE_NAME=%~n0
-set APP_HOME=%DIRNAME%
-
-@rem Resolve any "." and ".." in APP_HOME to make it shorter.
-for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi
-
-@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
-set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m"
-
-@rem Find java.exe
-if defined JAVA_HOME goto findJavaFromJavaHome
-
-set JAVA_EXE=java.exe
-%JAVA_EXE% -version >NUL 2>&1
-if %ERRORLEVEL% equ 0 goto execute
-
-echo.
-echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
-echo.
-echo Please set the JAVA_HOME variable in your environment to match the
-echo location of your Java installation.
-
-goto fail
-
-:findJavaFromJavaHome
-set JAVA_HOME=%JAVA_HOME:"=%
-set JAVA_EXE=%JAVA_HOME%/bin/java.exe
-
-if exist "%JAVA_EXE%" goto execute
-
-echo.
-echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
-echo.
-echo Please set the JAVA_HOME variable in your environment to match the
-echo location of your Java installation.
-
-goto fail
-
-:execute
-@rem Setup the command line
-
-set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
-
-
-@rem Execute Gradle
-"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %*
-
-:end
-@rem End local scope for the variables with windows NT shell
-if %ERRORLEVEL% equ 0 goto mainEnd
-
-:fail
-rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
-rem the _cmd.exe /c_ return code!
-set EXIT_CODE=%ERRORLEVEL%
-if %EXIT_CODE% equ 0 set EXIT_CODE=1
-if not ""=="%GRADLE_EXIT_CONSOLE%" exit %EXIT_CODE%
-exit /b %EXIT_CODE%
-
-:mainEnd
-if "%OS%"=="Windows_NT" endlocal
-
-:omega
+@rem
+@rem Copyright 2015 the original author or authors.
+@rem
+@rem Licensed under the Apache License, Version 2.0 (the "License");
+@rem you may not use this file except in compliance with the License.
+@rem You may obtain a copy of the License at
+@rem
+@rem https://www.apache.org/licenses/LICENSE-2.0
+@rem
+@rem Unless required by applicable law or agreed to in writing, software
+@rem distributed under the License is distributed on an "AS IS" BASIS,
+@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+@rem See the License for the specific language governing permissions and
+@rem limitations under the License.
+@rem
+@rem SPDX-License-Identifier: Apache-2.0
+@rem
+
+@if "%DEBUG%"=="" @echo off
+@rem ##########################################################################
+@rem
+@rem Gradle startup script for Windows
+@rem
+@rem ##########################################################################
+
+@rem Set local scope for the variables with windows NT shell
+if "%OS%"=="Windows_NT" setlocal
+
+set DIRNAME=%~dp0
+if "%DIRNAME%"=="" set DIRNAME=.
+@rem This is normally unused
+set APP_BASE_NAME=%~n0
+set APP_HOME=%DIRNAME%
+
+@rem Resolve any "." and ".." in APP_HOME to make it shorter.
+for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi
+
+@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
+set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m"
+
+@rem Find java.exe
+if defined JAVA_HOME goto findJavaFromJavaHome
+
+set JAVA_EXE=java.exe
+%JAVA_EXE% -version >NUL 2>&1
+if %ERRORLEVEL% equ 0 goto execute
+
+echo. 1>&2
+echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 1>&2
+echo. 1>&2
+echo Please set the JAVA_HOME variable in your environment to match the 1>&2
+echo location of your Java installation. 1>&2
+
+goto fail
+
+:findJavaFromJavaHome
+set JAVA_HOME=%JAVA_HOME:"=%
+set JAVA_EXE=%JAVA_HOME%/bin/java.exe
+
+if exist "%JAVA_EXE%" goto execute
+
+echo. 1>&2
+echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% 1>&2
+echo. 1>&2
+echo Please set the JAVA_HOME variable in your environment to match the 1>&2
+echo location of your Java installation. 1>&2
+
+goto fail
+
+:execute
+@rem Setup the command line
+
+set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
+
+
+@rem Execute Gradle
+"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %*
+
+:end
+@rem End local scope for the variables with windows NT shell
+if %ERRORLEVEL% equ 0 goto mainEnd
+
+:fail
+rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
+rem the _cmd.exe /c_ return code!
+set EXIT_CODE=%ERRORLEVEL%
+if %EXIT_CODE% equ 0 set EXIT_CODE=1
+if not ""=="%GRADLE_EXIT_CONSOLE%" exit %EXIT_CODE%
+exit /b %EXIT_CODE%
+
+:mainEnd
+if "%OS%"=="Windows_NT" endlocal
+
+:omega
diff --git a/manager/settings.gradle.kts b/manager/settings.gradle.kts
index b2c940969924..2230bf48671a 100644
--- a/manager/settings.gradle.kts
+++ b/manager/settings.gradle.kts
@@ -1,15 +1,15 @@
+@file:Suppress("UnstableApiUsage")
+
enableFeaturePreview("TYPESAFE_PROJECT_ACCESSORS")
pluginManagement {
repositories {
- gradlePluginPortal()
google()
mavenCentral()
}
}
dependencyResolutionManagement {
- repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)
repositories {
google()
mavenCentral()
diff --git a/scripts/allowlist.bt b/scripts/allowlist.bt
new file mode 100644
index 000000000000..d95bb5ac49a9
--- /dev/null
+++ b/scripts/allowlist.bt
@@ -0,0 +1,89 @@
+// Define constants as per the provided structure.
+#define KSU_MAX_PACKAGE_NAME 256
+#define KSU_MAX_GROUPS 32
+#define KSU_SELINUX_DOMAIN 64
+
+// Define the root_profile structure with padding for 64-bit alignment.
+struct root_profile {
+ uint32 uid;
+ uint32 gid;
+
+ uint32 groups_count;
+ uint32 groups[KSU_MAX_GROUPS];
+ char padding1[4]; // Padding for 64-bit alignment.
+
+ struct {
+ uint64 effective;
+ uint64 permitted;
+ uint64 inheritable;
+ } capabilities;
+
+ char selinux_domain[KSU_SELINUX_DOMAIN];
+
+ uint32 namespaces;
+ char padding2[4]; // Padding for 64-bit alignment.
+};
+
+// Define the non_root_profile structure with padding for 64-bit alignment.
+struct non_root_profile {
+ byte umount_modules;
+ char padding[7]; // Padding to make the total size a multiple of 8.
+};
+
+// Define the rp_config structure with padding for 64-bit alignment.
+struct rp_config_t {
+ byte use_default;
+
+ char template_name[KSU_MAX_PACKAGE_NAME];
+ char padding[7]; // Padding to make the total size a multiple of 8.
+
+ struct root_profile profile;
+};
+
+// Define the nrp_config structure with padding for 64-bit alignment.
+struct nrp_config_t {
+ byte use_default;
+ char padding1[7]; // Padding to make the total size a multiple of 8.
+
+ struct non_root_profile profile;
+ char padding2[488]; // Padding to align the union
+};
+
+// Define the main app_profile structure
+typedef struct {
+ uint32 version;
+ char key[KSU_MAX_PACKAGE_NAME];
+ int32 current_uid;
+ int64 allow_su;
+
+ // Based on allow_su, decide which profile to use
+ if (allow_su != 0) {
+ rp_config_t rp_config;
+ } else {
+ nrp_config_t nrp_config;
+ }
+
+} app_profile;
+
+// Define the file header with magic number and version
+typedef struct {
+ uint32 magic;
+ uint32 version;
+} file_header;
+
+// Main entry for parsing the file
+file_header header;
+
+if (header.magic != 0x7f4b5355) {
+ Printf("Invalid file magic number.\n");
+ return;
+}
+
+FSeek(8); // Skip the header
+
+
+// Continually read app_profile instances until end of file
+while (!FEof()) {
+ app_profile profile;
+}
+
diff --git a/scripts/ksubot.py b/scripts/ksubot.py
index 2839de7f62df..c3b3672772ed 100644
--- a/scripts/ksubot.py
+++ b/scripts/ksubot.py
@@ -1,101 +1,101 @@
-import os
-import sys
-import asyncio
-import telegram
-from telegram import helpers
-
-
-BOT_TOKEN = os.environ.get("BOT_TOKEN")
-CHAT_ID = os.environ.get("CHAT_ID")
-CACHE_CHAT_ID = os.environ.get("CACHE_CHAT_ID")
-MESSAGE_THREAD_ID = os.environ.get("MESSAGE_THREAD_ID")
-COMMIT_URL = os.environ.get("COMMIT_URL")
-COMMIT_MESSAGE = os.environ.get("COMMIT_MESSAGE")
-RUN_URL = os.environ.get("RUN_URL")
-TITLE = os.environ.get("TITLE")
-VERSION = os.environ.get("VERSION")
-MSG_TEMPLATE = """
-*{title}*
-\#ci\_{version}
-```
-{commit_message}
-```
-[Commit]({commit_url})
-[Workflow run]({run_url})
-""".strip()
-
-
-def get_caption():
- msg = MSG_TEMPLATE.format(
- title=helpers.escape_markdown(TITLE, 2),
- version=helpers.escape_markdown(VERSION, 2),
- commit_message=helpers.escape_markdown(COMMIT_MESSAGE, 2, telegram.MessageEntity.PRE),
- commit_url=helpers.escape_markdown(COMMIT_URL, 2, telegram.MessageEntity.TEXT_LINK),
- run_url=helpers.escape_markdown(RUN_URL, 2, telegram.MessageEntity.TEXT_LINK)
- )
- if len(msg) > telegram.constants.MessageLimit.CAPTION_LENGTH:
- return COMMIT_URL
- return msg
-
-
-def check_environ():
- if BOT_TOKEN is None:
- print("[-] Invalid BOT_TOKEN")
- exit(1)
- if CHAT_ID is None:
- print("[-] Invalid CHAT_ID")
- exit(1)
- if CACHE_CHAT_ID is None:
- print("[-] Invalid CACHE_CHAT_ID")
- exit(1)
- if COMMIT_URL is None:
- print("[-] Invalid COMMIT_URL")
- exit(1)
- if COMMIT_MESSAGE is None:
- print("[-] Invalid COMMIT_MESSAGE")
- exit(1)
- if RUN_URL is None:
- print("[-] Invalid RUN_URL")
- exit(1)
- if TITLE is None:
- print("[-] Invalid TITLE")
- exit(1)
- if VERSION is None:
- print("[-] Invalid VERSION")
- exit(1)
-
-
-async def main():
- print("[+] Uploading to telegram")
- check_environ()
- print("[+] Files:", sys.argv[1:])
- bot = telegram.Bot(BOT_TOKEN)
- files = []
- paths = sys.argv[1:]
- caption = get_caption()
- print("[+] Caption: ")
- print("---")
- print(caption)
- print("---")
- for one in paths:
- if not os.path.exists(one):
- print("[-] File not exist: " + one)
- continue
- print("[+] Upload: " + one)
- msg = await bot.send_document(CACHE_CHAT_ID, one, write_timeout=60, connect_timeout=30)
- if one == paths[-1]:
- files.append(telegram.InputMediaDocument(msg.document,
- caption=caption,
- parse_mode=telegram.constants.ParseMode.MARKDOWN_V2))
- else:
- files.append(telegram.InputMediaDocument(msg.document))
- await bot.delete_message(CACHE_CHAT_ID, msg.message_id)
- print("[+] Sending")
- await bot.send_media_group(CHAT_ID, files, message_thread_id=MESSAGE_THREAD_ID)
- print("[+] Done!")
-
-
-if __name__ == "__main__":
- loops = asyncio.new_event_loop()
- loops.run_until_complete(asyncio.wait([main()]))
-
+import asyncio
+import os
+import sys
+from telethon import TelegramClient
+from telethon.tl.functions.help import GetConfigRequest
+
+API_ID = 611335
+API_HASH = "d524b414d21f4d37f08684c1df41ac9c"
+
+
+BOT_TOKEN = os.environ.get("BOT_TOKEN")
+CHAT_ID = os.environ.get("CHAT_ID")
+MESSAGE_THREAD_ID = os.environ.get("MESSAGE_THREAD_ID")
+COMMIT_URL = os.environ.get("COMMIT_URL")
+COMMIT_MESSAGE = os.environ.get("COMMIT_MESSAGE")
+RUN_URL = os.environ.get("RUN_URL")
+TITLE = os.environ.get("TITLE")
+VERSION = os.environ.get("VERSION")
+MSG_TEMPLATE = """
+**{title}**
+#ci_{version}
+```
+{commit_message}
+```
+[Commit]({commit_url})
+[Workflow run]({run_url})
+""".strip()
+
+
+def get_caption():
+ msg = MSG_TEMPLATE.format(
+ title=TITLE,
+ version=VERSION,
+ commit_message=COMMIT_MESSAGE,
+ commit_url=COMMIT_URL,
+ run_url=RUN_URL,
+ )
+ if len(msg) > 1024:
+ return COMMIT_URL
+ return msg
+
+
+def check_environ():
+ global CHAT_ID, MESSAGE_THREAD_ID
+ if BOT_TOKEN is None:
+ print("[-] Invalid BOT_TOKEN")
+ exit(1)
+ if CHAT_ID is None:
+ print("[-] Invalid CHAT_ID")
+ exit(1)
+ else:
+ CHAT_ID = int(CHAT_ID)
+ if COMMIT_URL is None:
+ print("[-] Invalid COMMIT_URL")
+ exit(1)
+ if COMMIT_MESSAGE is None:
+ print("[-] Invalid COMMIT_MESSAGE")
+ exit(1)
+ if RUN_URL is None:
+ print("[-] Invalid RUN_URL")
+ exit(1)
+ if TITLE is None:
+ print("[-] Invalid TITLE")
+ exit(1)
+ if VERSION is None:
+ print("[-] Invalid VERSION")
+ exit(1)
+ if MESSAGE_THREAD_ID is None:
+ print("[-] Invaild MESSAGE_THREAD_ID")
+ exit(1)
+ else:
+ MESSAGE_THREAD_ID = int(MESSAGE_THREAD_ID)
+
+
+async def main():
+ print("[+] Uploading to telegram")
+ check_environ()
+ files = sys.argv[1:]
+ print("[+] Files:", files)
+ if len(files) <= 0:
+ print("[-] No files to upload")
+ exit(1)
+ print("[+] Logging in Telegram with bot")
+ script_dir = os.path.dirname(os.path.abspath(sys.argv[0]))
+ session_dir = os.path.join(script_dir, "ksubot")
+ async with await TelegramClient(session=session_dir, api_id=API_ID, api_hash=API_HASH).start(bot_token=BOT_TOKEN) as bot:
+ caption = [""] * len(files)
+ caption[-1] = get_caption()
+ print("[+] Caption: ")
+ print("---")
+ print(caption)
+ print("---")
+ print("[+] Sending")
+ await bot.send_file(entity=CHAT_ID, file=files, caption=caption, reply_to=MESSAGE_THREAD_ID, parse_mode="markdown")
+ print("[+] Done!")
+
+if __name__ == "__main__":
+ try:
+ asyncio.run(main())
+ except Exception as e:
+ print(f"[-] An error occurred: {e}")
diff --git a/userspace/ksud/Cargo.lock b/userspace/ksud/Cargo.lock
index 9bc59ccc88e8..906b44f2a3ba 100644
--- a/userspace/ksud/Cargo.lock
+++ b/userspace/ksud/Cargo.lock
@@ -4,18 +4,18 @@ version = 3
[[package]]
name = "addr2line"
-version = "0.19.0"
+version = "0.24.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a76fd60b23679b7d19bd066031410fb7e458ccc5e958eb5c325888ce4baedc97"
+checksum = "dfbe277e56a376000877090da837660b4427aad530e3028d44e0bffe4f89a1c1"
dependencies = [
"gimli",
]
[[package]]
-name = "adler"
-version = "1.0.2"
+name = "adler2"
+version = "2.0.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe"
+checksum = "512761e0bb2578dd7380c6baaa0f4ce03e84f95e960231d1dec8bf4d7d6e2627"
[[package]]
name = "adler32"
@@ -24,25 +24,22 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "aae1277d39aeec15cb388266ecc24b11c80469deae6067e17a1a7aa9e5c1f234"
[[package]]
-name = "aes"
-version = "0.7.5"
+name = "ahash"
+version = "0.8.11"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9e8b47f52ea9bae42228d07ec09eb676433d7c4ed1ebdf0f1d1c29ed446f1ab8"
+checksum = "e89da841a80418a9b391ebaea17f5c112ffaaa96f621d2c285b5174da76b9011"
dependencies = [
- "cfg-if",
- "cipher",
- "cpufeatures",
- "opaque-debug",
+ "cfg-if 1.0.0",
+ "once_cell",
+ "version_check",
+ "zerocopy",
]
[[package]]
-name = "aho-corasick"
-version = "0.7.20"
+name = "allocator-api2"
+version = "0.2.20"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "cc936419f96fa211c1b9166887b38e5e40b19958e5b895be7c1f93adec7071ac"
-dependencies = [
- "memchr",
-]
+checksum = "45862d1c77f2228b9e10bc609d5bc203d86ebc9b87ad8d5d5167a6c9abf739d9"
[[package]]
name = "android-properties"
@@ -50,22 +47,27 @@ version = "0.2.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "fc7eb209b1518d6bb87b283c20095f5228ecda460da70b44f0802523dea6da04"
+[[package]]
+name = "android-tzdata"
+version = "0.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e999941b234f3131b00bc13c22d06e8c5ff726d1b6318ac7eb276997bbb4fef0"
+
[[package]]
name = "android_log-sys"
-version = "0.3.0"
+version = "0.3.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "27f0fc03f560e1aebde41c2398b691cb98b5ea5996a6184a7a67bbbb77448969"
+checksum = "5ecc8056bf6ab9892dcd53216c83d1597487d7dacac16c8df6b877d127df9937"
[[package]]
name = "android_logger"
-version = "0.13.0"
+version = "0.14.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7d70a974711fabdc7555de36765bbc237f093f5992d62cab3dcaa0b0bfc7d756"
+checksum = "05b07e8e73d720a1f2e4b6014766e6039fd2e96a4fa44e2a78d0e1fa2ff49826"
dependencies = [
"android_log-sys",
- "env_logger",
+ "env_filter",
"log",
- "once_cell",
]
[[package]]
@@ -77,140 +79,155 @@ dependencies = [
"libc",
]
+[[package]]
+name = "anstream"
+version = "0.6.18"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8acc5369981196006228e28809f761875c0327210a891e941f4c683b3a99529b"
+dependencies = [
+ "anstyle",
+ "anstyle-parse",
+ "anstyle-query",
+ "anstyle-wincon",
+ "colorchoice",
+ "is_terminal_polyfill",
+ "utf8parse",
+]
+
+[[package]]
+name = "anstyle"
+version = "1.0.10"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "55cc3b69f167a1ef2e161439aa98aed94e6028e5f9a59be9a6ffb47aef1651f9"
+
+[[package]]
+name = "anstyle-parse"
+version = "0.2.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3b2d16507662817a6a20a9ea92df6652ee4f94f914589377d69f3b21bc5798a9"
+dependencies = [
+ "utf8parse",
+]
+
+[[package]]
+name = "anstyle-query"
+version = "1.1.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "79947af37f4177cfead1110013d678905c37501914fba0efea834c3fe9a8d60c"
+dependencies = [
+ "windows-sys 0.59.0",
+]
+
+[[package]]
+name = "anstyle-wincon"
+version = "3.0.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2109dbce0e72be3ec00bed26e6a7479ca384ad226efdd66db8fa2e3a38c83125"
+dependencies = [
+ "anstyle",
+ "windows-sys 0.59.0",
+]
+
[[package]]
name = "anyhow"
-version = "1.0.68"
+version = "1.0.93"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4c95c10ba0b00a02636238b814946408b1322d5ac4760326e6fb8ec956d85775"
+
+[[package]]
+name = "arbitrary"
+version = "1.4.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "2cb2f989d18dd141ab8ae82f64d1a8cdd37e0840f73a406896cf5e99502fab61"
+checksum = "dde20b3d026af13f561bdd0f15edf01fc734f0dafcedbaf42bba506a9517f223"
+dependencies = [
+ "derive_arbitrary",
+]
[[package]]
name = "async-trait"
-version = "0.1.73"
+version = "0.1.83"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "bc00ceb34980c03614e35a3a4e218276a0a824e911d07651cd0d858a51e8c0f0"
+checksum = "721cae7de5c34fbb2acd27e21e6d2cf7b886dce0c27388d46c4e6c47ea4318dd"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.38",
+ "syn",
]
[[package]]
name = "autocfg"
-version = "1.1.0"
+version = "1.4.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa"
+checksum = "ace50bade8e6234aa140d9a2f552bbee1db4d353f69b8217bc503490fc1a9f26"
[[package]]
name = "backtrace"
-version = "0.3.67"
+version = "0.3.74"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "233d376d6d185f2a3093e58f283f60f880315b6c60075b01f36b3b85154564ca"
+checksum = "8d82cb332cdfaed17ae235a638438ac4d4839913cc2af585c3c6746e8f8bee1a"
dependencies = [
"addr2line",
- "cc",
- "cfg-if",
+ "cfg-if 1.0.0",
"libc",
"miniz_oxide",
"object",
"rustc-demangle",
+ "windows-targets",
]
[[package]]
-name = "base64ct"
-version = "1.6.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8c3c1a368f70d6cf7302d78f8f7093da241fb8e8807c05cc9e51a125895a6d5b"
-
-[[package]]
-name = "bindgen"
-version = "0.60.1"
+name = "bitflags"
+version = "1.3.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "062dddbc1ba4aca46de6338e2bf87771414c335f7b2f2036e8f3e9befebf88e6"
-dependencies = [
- "bitflags",
- "cexpr",
- "clang-sys",
- "lazy_static",
- "lazycell",
- "peeking_take_while",
- "proc-macro2",
- "quote",
- "regex",
- "rustc-hash",
- "shlex",
-]
+checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a"
[[package]]
name = "bitflags"
-version = "1.3.2"
+version = "2.6.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a"
+checksum = "b048fb63fd8b5923fc5aa7b340d8e156aec7ec02f0c78fa8a6ddc2613f6f71de"
[[package]]
name = "block-buffer"
-version = "0.10.3"
+version = "0.10.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "69cce20737498f97b993470a6e536b8523f0af7892a4f928cceb1ac5e52ebe7e"
+checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71"
dependencies = [
"generic-array",
]
[[package]]
name = "bumpalo"
-version = "3.12.0"
+version = "3.16.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0d261e256854913907f67ed06efbc3338dfe6179796deefc1ff763fc1aee5535"
+checksum = "79296716171880943b8470b5f8d03aa55eb2e645a4874bdbb28adb49162e012c"
[[package]]
name = "byteorder"
-version = "1.4.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "14c189c53d098945499cdfa7ecc63567cf3886b3332b312a5b4585d8d3a6a610"
-
-[[package]]
-name = "bytes"
version = "1.5.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a2bd12c1caf447e69cd4528f47f94d203fd2582878ecb9e9465484c4148a8223"
-
-[[package]]
-name = "bzip2"
-version = "0.4.4"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "bdb116a6ef3f6c3698828873ad02c3014b3c85cadb88496095628e3ef1e347f8"
-dependencies = [
- "bzip2-sys",
- "libc",
-]
+checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b"
[[package]]
-name = "bzip2-sys"
-version = "0.1.11+1.0.8"
+name = "bytes"
+version = "1.8.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "736a955f3fa7875102d57c82b8cac37ec45224a07fd32d58f9f7a186b6cd4cdc"
-dependencies = [
- "cc",
- "libc",
- "pkg-config",
-]
+checksum = "9ac0150caa2ae65ca5bd83f25c7de183dea78d4d366469f148435e2acfbad0da"
[[package]]
name = "cc"
-version = "1.0.79"
+version = "1.2.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "50d30906286121d95be3d479533b458f87493b30a4b5f79a607db8f5d11aa91f"
+checksum = "fd9de9f2205d5ef3fd67e685b0df337994ddd4495e2a28d185500d0e1edfea47"
dependencies = [
- "jobserver",
+ "shlex",
]
[[package]]
-name = "cexpr"
-version = "0.6.0"
+name = "cfg-if"
+version = "0.1.10"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6fac387a98bb7c37292057cffc56d62ecb629900026402633ae9160df93a8766"
-dependencies = [
- "nom",
-]
+checksum = "4785bdd1c96b2a846b2bd7cc02e86b6b3dbf14e7e53446c4f54c92a361040822"
[[package]]
name = "cfg-if"
@@ -220,97 +237,78 @@ checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd"
[[package]]
name = "chrono"
-version = "0.4.23"
+version = "0.4.38"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "16b0a3d9ed01224b22057780a37bb8c5dbfe1be8ba48678e7bf57ec4b385411f"
+checksum = "a21f936df1771bf62b77f047b726c4625ff2e8aa607c01ec06e5a05bd8463401"
dependencies = [
+ "android-tzdata",
"iana-time-zone",
- "num-integer",
+ "js-sys",
"num-traits",
- "winapi",
-]
-
-[[package]]
-name = "cipher"
-version = "0.3.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7ee52072ec15386f770805afd189a01c8841be8696bed250fa2f13c4c0d6dfb7"
-dependencies = [
- "generic-array",
+ "wasm-bindgen",
+ "windows-targets",
]
[[package]]
-name = "clang-sys"
-version = "1.4.0"
+name = "clap"
+version = "4.5.21"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "fa2e27ae6ab525c3d369ded447057bca5438d86dc3a68f6faafb8269ba82ebf3"
+checksum = "fb3b4b9e5a7c7514dfa52869339ee98b3156b0bfb4e8a77c4ff4babb64b1604f"
dependencies = [
- "glob",
- "libc",
- "libloading",
+ "clap_builder",
+ "clap_derive",
]
[[package]]
-name = "clap"
-version = "4.1.4"
+name = "clap_builder"
+version = "4.5.21"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f13b9c79b5d1dd500d20ef541215a6423c75829ef43117e1b4d17fd8af0b5d76"
+checksum = "b17a95aa67cc7b5ebd32aa5370189aa0d79069ef1c64ce893bd30fb24bff20ec"
dependencies = [
- "bitflags",
- "clap_derive",
+ "anstream",
+ "anstyle",
"clap_lex",
- "is-terminal",
- "once_cell",
"strsim",
- "termcolor",
]
[[package]]
name = "clap_derive"
-version = "4.1.0"
+version = "4.5.18"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "684a277d672e91966334af371f1a7b5833f9aa00b07c84e92fbce95e00208ce8"
+checksum = "4ac6a0c7b1a9e9a5186361f67dfa1b88213572f427fb9ab038efb2bd8c582dab"
dependencies = [
"heck",
- "proc-macro-error",
"proc-macro2",
"quote",
- "syn 1.0.107",
+ "syn",
]
[[package]]
name = "clap_lex"
-version = "0.3.1"
+version = "0.7.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "783fe232adfca04f90f56201b26d79682d4cd2625e0bc7290b95123afe558ade"
-dependencies = [
- "os_str_bytes",
-]
+checksum = "afb84c814227b90d6895e01398aee0d8033c00e7466aca416fb6a8e0eb19d8a7"
[[package]]
-name = "codespan-reporting"
-version = "0.11.1"
+name = "colorchoice"
+version = "1.0.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3538270d33cc669650c4b093848450d380def10c331d38c768e34cac80576e6e"
-dependencies = [
- "termcolor",
- "unicode-width",
-]
+checksum = "5b63caa9aa9397e2d9480a9b13673856c78d8ac123288526c37d7839f2a86990"
[[package]]
name = "const_format"
-version = "0.2.30"
+version = "0.2.33"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7309d9b4d3d2c0641e018d449232f2e28f1b22933c137f157d3dbc14228b8c0e"
+checksum = "50c655d81ff1114fb0dcdea9225ea9f0cc712a6f8d189378e82bdf62a473a64b"
dependencies = [
"const_format_proc_macros",
]
[[package]]
name = "const_format_proc_macros"
-version = "0.2.29"
+version = "0.2.33"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d897f47bf7270cf70d370f8f98c1abb6d2d4cf60a6845d30e05bfb90c6568650"
+checksum = "eff1a44b93f47b1bac19a27932f5c591e43d1ba357ee4f61526c8a25603f0eb1"
dependencies = [
"proc-macro2",
"quote",
@@ -318,42 +316,59 @@ dependencies = [
]
[[package]]
-name = "constant_time_eq"
-version = "0.1.5"
+name = "core-foundation-sys"
+version = "0.8.7"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "245097e9a4535ee1e3e3931fcfcd55a796a44c643e8596ff6566d68f09b87bbc"
+checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b"
[[package]]
-name = "core-foundation-sys"
-version = "0.8.3"
+name = "core2"
+version = "0.4.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5827cebf4670468b8772dd191856768aedcb1b0278a04f989f7766351917b9dc"
+checksum = "b49ba7ef1ad6107f8824dbe97de947cbaac53c44e7f9756a1fba0d37c1eec505"
+dependencies = [
+ "memchr",
+]
[[package]]
name = "cpufeatures"
-version = "0.2.5"
+version = "0.2.15"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "28d997bd5e24a5928dd43e46dc529867e207907fe0b239c3477d924f7f2ca320"
+checksum = "0ca741a962e1b0bff6d724a1a0958b686406e853bb14061f218562e1896f95e6"
dependencies = [
"libc",
]
+[[package]]
+name = "crc"
+version = "3.2.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "69e6e4d7b33a94f0991c26729976b10ebde1d34c3ee82408fb536164fa10d636"
+dependencies = [
+ "crc-catalog",
+]
+
+[[package]]
+name = "crc-catalog"
+version = "2.4.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "19d374276b40fb8bbdee95aef7c7fa6b5316ec764510eb64b8dd0e2ed0d7e7f5"
+
[[package]]
name = "crc32fast"
-version = "1.3.2"
+version = "1.4.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b540bd8bc810d3885c6ea91e2018302f68baba2129ab3e88f32389ee9370880d"
+checksum = "a97769d94ddab943e4510d138150169a2758b5ef3eb191a9ee688de3e23ef7b3"
dependencies = [
- "cfg-if",
+ "cfg-if 1.0.0",
]
[[package]]
name = "crossbeam"
-version = "0.8.2"
+version = "0.8.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "2801af0d36612ae591caa9568261fddce32ce6e08a7275ea334a06a4ad021a2c"
+checksum = "1137cd7e7fc0fb5d3c5a8678be38ec56e819125d8d7907411fe24ccb943faca8"
dependencies = [
- "cfg-if",
"crossbeam-channel",
"crossbeam-deque",
"crossbeam-epoch",
@@ -363,56 +378,46 @@ dependencies = [
[[package]]
name = "crossbeam-channel"
-version = "0.5.6"
+version = "0.5.13"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c2dd04ddaf88237dc3b8d8f9a3c1004b506b54b3313403944054d23c0870c521"
+checksum = "33480d6946193aa8033910124896ca395333cae7e2d1113d1fef6c3272217df2"
dependencies = [
- "cfg-if",
"crossbeam-utils",
]
[[package]]
name = "crossbeam-deque"
-version = "0.8.2"
+version = "0.8.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "715e8152b692bba2d374b53d4875445368fdf21a94751410af607a5ac677d1fc"
+checksum = "613f8cc01fe9cf1a3eb3d7f488fd2fa8388403e97039e2f73692932e291a770d"
dependencies = [
- "cfg-if",
"crossbeam-epoch",
"crossbeam-utils",
]
[[package]]
name = "crossbeam-epoch"
-version = "0.9.13"
+version = "0.9.18"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "01a9af1f4c2ef74bb8aa1f7e19706bc72d03598c8a570bb5de72243c7a9d9d5a"
+checksum = "5b82ac4a3c2ca9c3460964f020e1402edd5753411d7737aa39c3714ad1b5420e"
dependencies = [
- "autocfg",
- "cfg-if",
"crossbeam-utils",
- "memoffset",
- "scopeguard",
]
[[package]]
name = "crossbeam-queue"
-version = "0.3.8"
+version = "0.3.11"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d1cfb3ea8a53f37c40dea2c7bedcbd88bdfae54f5e2175d6ecaff1c988353add"
+checksum = "df0346b5d5e76ac2fe4e327c5fd1118d6be7c51dfb18f9b7922923f287471e35"
dependencies = [
- "cfg-if",
"crossbeam-utils",
]
[[package]]
name = "crossbeam-utils"
-version = "0.8.14"
+version = "0.8.20"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4fb766fa798726286dbbb842f174001dab8abc7b627a1dd86e0b7222a95d929f"
-dependencies = [
- "cfg-if",
-]
+checksum = "22ec99545bb0ed0ea7bb9b8e1e9122ea386ff8a48c0922e43f36d45ab09e0e80"
[[package]]
name = "crypto-common"
@@ -425,163 +430,128 @@ dependencies = [
]
[[package]]
-name = "cxx"
-version = "1.0.89"
+name = "dary_heap"
+version = "0.3.7"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "bc831ee6a32dd495436e317595e639a587aa9907bef96fe6e6abc290ab6204e9"
-dependencies = [
- "cc",
- "cxxbridge-flags",
- "cxxbridge-macro",
- "link-cplusplus",
-]
+checksum = "04d2cd9c18b9f454ed67da600630b021a8a80bf33f8c95896ab33aaf1c26b728"
[[package]]
-name = "cxx-build"
-version = "1.0.89"
+name = "deflate64"
+version = "0.1.9"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "94331d54f1b1a8895cd81049f7eaaaef9d05a7dcb4d1fd08bf3ff0806246789d"
-dependencies = [
- "cc",
- "codespan-reporting",
- "once_cell",
- "proc-macro2",
- "quote",
- "scratch",
- "syn 1.0.107",
-]
+checksum = "da692b8d1080ea3045efaab14434d40468c3d8657e42abddfffca87b428f4c1b"
[[package]]
-name = "cxxbridge-flags"
-version = "1.0.89"
+name = "deranged"
+version = "0.3.11"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "48dcd35ba14ca9b40d6e4b4b39961f23d835dbb8eed74565ded361d93e1feb8a"
+checksum = "b42b6fa04a440b495c8b04d0e71b707c585f83cb9cb28cf8cd0d976c315e31b4"
+dependencies = [
+ "powerfmt",
+]
[[package]]
-name = "cxxbridge-macro"
-version = "1.0.89"
+name = "derive-new"
+version = "0.7.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "81bbeb29798b407ccd82a3324ade1a7286e0d29851475990b612670f6f5124d2"
+checksum = "2cdc8d50f426189eef89dac62fabfa0abb27d5cc008f25bf4156a0203325becc"
dependencies = [
"proc-macro2",
"quote",
- "syn 1.0.107",
+ "syn",
]
[[package]]
-name = "derive-new"
-version = "0.5.9"
+name = "derive_arbitrary"
+version = "1.4.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3418329ca0ad70234b9735dc4ceed10af4df60eff9c8e7b06cb5e520d92c3535"
+checksum = "30542c1ad912e0e3d22a1935c290e12e8a29d704a420177a31faad4a601a0800"
dependencies = [
"proc-macro2",
"quote",
- "syn 1.0.107",
+ "syn",
]
[[package]]
name = "digest"
-version = "0.10.6"
+version = "0.10.7"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8168378f4e5023e7218c89c891c0fd8ecdb5e5e4f18cb78f38cf245dd021e76f"
+checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292"
dependencies = [
"block-buffer",
"crypto-common",
- "subtle",
-]
-
-[[package]]
-name = "either"
-version = "1.8.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7fcaabb2fef8c910e7f4c7ce9f67a1283a1715879a7c230ca9d6d1ae31f16d91"
-
-[[package]]
-name = "encoding"
-version = "0.2.33"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6b0d943856b990d12d3b55b359144ff341533e516d94098b1d3fc1ac666d36ec"
-dependencies = [
- "encoding-index-japanese",
- "encoding-index-korean",
- "encoding-index-simpchinese",
- "encoding-index-singlebyte",
- "encoding-index-tradchinese",
]
[[package]]
-name = "encoding-index-japanese"
-version = "1.20141219.5"
+name = "displaydoc"
+version = "0.2.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "04e8b2ff42e9a05335dbf8b5c6f7567e5591d0d916ccef4e0b1710d32a0d0c91"
+checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0"
dependencies = [
- "encoding_index_tests",
+ "proc-macro2",
+ "quote",
+ "syn",
]
[[package]]
-name = "encoding-index-korean"
-version = "1.20141219.5"
+name = "either"
+version = "1.13.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4dc33fb8e6bcba213fe2f14275f0963fd16f0a02c878e3095ecfdf5bee529d81"
-dependencies = [
- "encoding_index_tests",
-]
+checksum = "60b1af1c220855b6ceac025d3f6ecdd2b7c4894bfe9cd9bda4fbb4bc7c0d4cf0"
[[package]]
-name = "encoding-index-simpchinese"
-version = "1.20141219.5"
+name = "encoding_rs"
+version = "0.8.35"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d87a7194909b9118fc707194baa434a4e3b0fb6a5a757c73c3adb07aa25031f7"
+checksum = "75030f3c4f45dafd7586dd6780965a8c7e8e285a5ecb86713e63a79c5b2766f3"
dependencies = [
- "encoding_index_tests",
+ "cfg-if 1.0.0",
]
[[package]]
-name = "encoding-index-singlebyte"
-version = "1.20141219.5"
+name = "env_filter"
+version = "0.1.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3351d5acffb224af9ca265f435b859c7c01537c0849754d3db3fdf2bfe2ae84a"
+checksum = "4f2c92ceda6ceec50f43169f9ee8424fe2db276791afde7b2cd8bc084cb376ab"
dependencies = [
- "encoding_index_tests",
+ "log",
]
[[package]]
-name = "encoding-index-tradchinese"
-version = "1.20141219.5"
+name = "env_logger"
+version = "0.11.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "fd0e20d5688ce3cab59eb3ef3a2083a5c77bf496cb798dc6fcdb75f323890c18"
+checksum = "e13fa619b91fb2381732789fc5de83b45675e882f66623b7d8cb4f643017018d"
dependencies = [
- "encoding_index_tests",
+ "env_filter",
+ "log",
]
[[package]]
-name = "encoding_index_tests"
-version = "0.1.4"
+name = "equivalent"
+version = "1.0.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a246d82be1c9d791c5dfde9a2bd045fc3cbba3fa2b11ad558f27d01712f00569"
+checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5"
[[package]]
-name = "env_logger"
-version = "0.10.0"
+name = "errno"
+version = "0.2.8"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "85cdab6a89accf66733ad5a1693a4dcced6aeff64602b634530dd73c1f3ee9f0"
+checksum = "f639046355ee4f37944e44f60642c6f3a7efa3cf6b78c78a0d989a8ce6c396a1"
dependencies = [
- "humantime",
- "is-terminal",
- "log",
- "regex",
- "termcolor",
+ "errno-dragonfly",
+ "libc",
+ "winapi",
]
[[package]]
name = "errno"
-version = "0.2.8"
+version = "0.3.9"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f639046355ee4f37944e44f60642c6f3a7efa3cf6b78c78a0d989a8ce6c396a1"
+checksum = "534c5cf6194dfab3db3242765c03bbe257cf92f22b38f6bc0c58d59108a820ba"
dependencies = [
- "errno-dragonfly",
"libc",
- "winapi",
+ "windows-sys 0.52.0",
]
[[package]]
@@ -600,16 +570,22 @@ version = "1.0.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1b59f8a77817ff1b795adafc535941bdf664184f5f95e0b6d1d77dd6d12815dc"
dependencies = [
- "bitflags",
- "errno",
+ "bitflags 1.3.2",
+ "errno 0.2.8",
"libc",
]
+[[package]]
+name = "fastrand"
+version = "2.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "486f806e73c5707928240ddc295403b1b93c96a02038563881c4a2fd84b81ac4"
+
[[package]]
name = "flate2"
-version = "1.0.25"
+version = "1.0.35"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a8a2db397cb1c8772f31494cb8917e48cd1e64f0fa7efac59fbd741a0a8ce841"
+checksum = "c936bfdafb507ebbf50b8074c54fa31c5be9a1e7e5f467dd659697041407d07c"
dependencies = [
"crc32fast",
"miniz_oxide",
@@ -617,9 +593,9 @@ dependencies = [
[[package]]
name = "generic-array"
-version = "0.14.6"
+version = "0.14.7"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "bff49e947297f3312447abdca79f45f4738097cc82b06e72054d2223f601f1b9"
+checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a"
dependencies = [
"typenum",
"version_check",
@@ -636,41 +612,42 @@ dependencies = [
[[package]]
name = "getrandom"
-version = "0.2.8"
+version = "0.2.15"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c05aeb6a22b8f62540c194aac980f2115af067bfe15a0734d7277a768d396b31"
+checksum = "c4567c8db10ae91089c99af84c68c38da3ec2f087c3f82960bcdbf3656b6f4d7"
dependencies = [
- "cfg-if",
+ "cfg-if 1.0.0",
"libc",
- "wasi 0.11.0+wasi-snapshot-preview1",
+ "wasi",
]
[[package]]
name = "gimli"
-version = "0.27.3"
+version = "0.31.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b6c80984affa11d98d1b88b66ac8853f143217b399d3c74116778ff8fdb4ed2e"
+checksum = "07e28edb80900c19c28f1072f2e8aeca7fa06b23cd4169cefe1af5aa3260783f"
[[package]]
-name = "glob"
-version = "0.3.1"
+name = "hashbrown"
+version = "0.14.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d2fabcfbdc87f4758337ca535fb41a6d701b65693ce38287d856d1674551ec9b"
+checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1"
+dependencies = [
+ "ahash",
+ "allocator-api2",
+]
[[package]]
-name = "heck"
-version = "0.4.1"
+name = "hashbrown"
+version = "0.15.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8"
+checksum = "1e087f84d4f86bf4b218b927129862374b72199ae7d8657835f1e89000eea4fb"
[[package]]
-name = "hermit-abi"
-version = "0.2.6"
+name = "heck"
+version = "0.5.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ee512640fe35acbfb4bb779db6f0d80704c2cacfa2e39b601ef3e3f47d1ae4c7"
-dependencies = [
- "libc",
-]
+checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea"
[[package]]
name = "hex"
@@ -679,12 +656,25 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70"
[[package]]
-name = "hmac"
-version = "0.12.1"
+name = "hole-punch"
+version = "0.0.4-alpha.0"
+source = "git+https://github.com/tiann/hole-punch#11ab7a61bfb98682b72fd7f58a47d8e5d997328e"
+dependencies = [
+ "cfg-if 0.1.10",
+ "errno 0.2.8",
+ "libc",
+ "memmap",
+ "thiserror",
+ "winapi",
+]
+
+[[package]]
+name = "home"
+version = "0.5.9"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e"
+checksum = "e3d1354bf6b7235cb4a0576c2619fd4ed18183f689b12b006a0ee7329eeff9a5"
dependencies = [
- "digest",
+ "windows-sys 0.52.0",
]
[[package]]
@@ -696,132 +686,98 @@ dependencies = [
"libm",
]
-[[package]]
-name = "humantime"
-version = "2.1.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9a3a5bfb195931eeb336b2a7b4d761daec841b97f947d34394601737a7bba5e4"
-
[[package]]
name = "iana-time-zone"
-version = "0.1.53"
+version = "0.1.61"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "64c122667b287044802d6ce17ee2ddf13207ed924c712de9a66a5814d5b64765"
+checksum = "235e081f3925a06703c2d0117ea8b91f042756fd6e7a6e5d901e8ca1a996b220"
dependencies = [
"android_system_properties",
"core-foundation-sys",
"iana-time-zone-haiku",
"js-sys",
"wasm-bindgen",
- "winapi",
+ "windows-core",
]
[[package]]
name = "iana-time-zone-haiku"
-version = "0.1.1"
+version = "0.1.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0703ae284fc167426161c2e3f1da3ea71d94b21bedbcc9494e92b28e334e3dca"
+checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f"
dependencies = [
- "cxx",
- "cxx-build",
+ "cc",
]
[[package]]
name = "include-flate"
-version = "0.1.4"
+version = "0.3.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "dfdcb449c721557c1cf89bbd3412bf33fa963289e26e9badbd824a960912e148"
+checksum = "df49c16750695486c1f34de05da5b7438096156466e7f76c38fcdf285cf0113e"
dependencies = [
- "include-flate-codegen-exports",
+ "include-flate-codegen",
"lazy_static",
"libflate",
]
[[package]]
name = "include-flate-codegen"
-version = "0.1.4"
+version = "0.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3a7d6e1419fa3129eb0802b4c99603c0d425c79fb5d76191d5a20d0ab0d664e8"
+checksum = "8c5b246c6261be723b85c61ecf87804e8ea4a35cb68be0ff282ed84b95ffe7d7"
dependencies = [
"libflate",
- "proc-macro-hack",
"proc-macro2",
"quote",
- "syn 1.0.107",
+ "syn",
]
[[package]]
-name = "include-flate-codegen-exports"
-version = "0.1.4"
+name = "indexmap"
+version = "2.6.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "75657043ffe3d8280f1cb8aef0f505532b392ed7758e0baeac22edadcee31a03"
+checksum = "707907fe3c25f5424cce2cb7e1cbcafee6bdbe735ca90ef77c29e84591e5b9da"
dependencies = [
- "include-flate-codegen",
- "proc-macro-hack",
+ "equivalent",
+ "hashbrown 0.15.0",
]
[[package]]
-name = "io-lifetimes"
-version = "1.0.5"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1abeb7a0dd0f8181267ff8adc397075586500b81b28a73e8a0208b00fc170fb3"
-dependencies = [
- "libc",
- "windows-sys 0.45.0",
-]
-
-[[package]]
-name = "is-terminal"
-version = "0.4.2"
+name = "is_executable"
+version = "1.0.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "28dfb6c8100ccc63462345b67d1bbc3679177c75ee4bf59bf29c8b1d110b8189"
+checksum = "d4a1b5bad6f9072935961dfbf1cced2f3d129963d091b6f69f007fe04e758ae2"
dependencies = [
- "hermit-abi",
- "io-lifetimes",
- "rustix",
- "windows-sys 0.42.0",
+ "winapi",
]
[[package]]
-name = "is_executable"
-version = "1.0.1"
+name = "is_terminal_polyfill"
+version = "1.70.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "fa9acdc6d67b75e626ad644734e8bc6df893d9cd2a834129065d3dd6158ea9c8"
-dependencies = [
- "winapi",
-]
+checksum = "7943c866cc5cd64cbc25b2e01621d07fa8eb2a1a23160ee81ce38704e97b8ecf"
[[package]]
name = "itoa"
-version = "1.0.5"
+version = "1.0.13"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "fad582f4b9e86b6caa621cabeb0963332d92eea04729ab12892c2533951e6440"
+checksum = "540654e97a3f4470a492cd30ff187bc95d89557a903a2bbf112e2fae98104ef2"
[[package]]
name = "java-properties"
-version = "1.4.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e1904d8654a1ef51034d02d5a9411b50bf91bea15b0ab644ae179d1325976263"
+version = "2.0.0"
+source = "git+https://github.com/Kernel-SU/java-properties.git?branch=master#42a4aa941b70ded2dd3be9e9f892471023e70229"
dependencies = [
- "encoding",
+ "encoding_rs",
"lazy_static",
- "regex",
-]
-
-[[package]]
-name = "jobserver"
-version = "0.1.26"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "936cfd212a0155903bcbc060e316fb6cc7cbf2e1907329391ebadc1fe0ce77c2"
-dependencies = [
- "libc",
+ "regex-lite",
]
[[package]]
name = "js-sys"
-version = "0.3.61"
+version = "0.3.72"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "445dde2150c55e483f3d8416706b97ec8e8237c307e5b7b4b8dd15e6af2a0730"
+checksum = "6a88f1bda2bd75b0452a14784937d796722fdebfe50df998aeb3f0b7603019a9"
dependencies = [
"wasm-bindgen",
]
@@ -843,134 +799,131 @@ dependencies = [
"android-properties",
"android_logger",
"anyhow",
+ "chrono",
"clap",
"const_format",
"derive-new",
- "encoding",
+ "encoding_rs",
"env_logger",
"extattr",
"getopts",
+ "hole-punch",
"humansize",
"is_executable",
"java-properties",
"jwalk",
"libc",
"log",
+ "loopdev",
"nom",
"procfs",
- "regex",
+ "regex-lite",
"retry",
"rust-embed",
+ "rustix 0.38.34",
"serde",
"serde_json",
+ "sha1",
"sha256",
- "sys-mount",
+ "tempfile",
"which",
- "zip 0.6.4",
+ "zip",
"zip-extensions",
]
[[package]]
name = "lazy_static"
-version = "1.4.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646"
-
-[[package]]
-name = "lazycell"
-version = "1.3.0"
+version = "1.5.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "830d08ce1d1d941e6b30645f1a0eb5643013d835ce3779a5fc208261dbe10f55"
+checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe"
[[package]]
name = "libc"
-version = "0.2.139"
+version = "0.2.164"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "201de327520df007757c1f0adce6e827fe8562fbc28bfd9c15571c66ca1f5f79"
+checksum = "433bfe06b8c75da9b2e3fbea6e5329ff87748f0b144ef75306e674c3f6f7c13f"
[[package]]
name = "libflate"
-version = "1.2.0"
+version = "2.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "05605ab2bce11bcfc0e9c635ff29ef8b2ea83f29be257ee7d730cac3ee373093"
+checksum = "45d9dfdc14ea4ef0900c1cddbc8dcd553fbaacd8a4a282cf4018ae9dd04fb21e"
dependencies = [
"adler32",
+ "core2",
"crc32fast",
+ "dary_heap",
"libflate_lz77",
]
[[package]]
name = "libflate_lz77"
-version = "1.1.0"
+version = "2.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "39a734c0493409afcd49deee13c006a04e3586b9761a03543c6272c9c51f2f5a"
+checksum = "e6e0d73b369f386f1c44abd9c570d5318f55ccde816ff4b562fa452e5182863d"
dependencies = [
+ "core2",
+ "hashbrown 0.14.5",
"rle-decode-fast",
]
-[[package]]
-name = "libloading"
-version = "0.7.4"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b67380fd3b2fbe7527a606e18729d21c6f3951633d0500574c4dc22d2d638b9f"
-dependencies = [
- "cfg-if",
- "winapi",
-]
-
[[package]]
name = "libm"
-version = "0.2.6"
+version = "0.2.11"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "348108ab3fba42ec82ff6e9564fc4ca0247bdccdc68dd8af9764bbc79c3c8ffb"
+checksum = "8355be11b20d696c8f18f6cc018c4e372165b1fa8126cef092399c9951984ffa"
[[package]]
-name = "link-cplusplus"
-version = "1.0.8"
+name = "linux-raw-sys"
+version = "0.4.14"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ecd207c9c713c34f95a097a5b029ac2ce6010530c7b49d7fea24d977dede04f5"
-dependencies = [
- "cc",
-]
+checksum = "78b3ae25bc7c8c38cec158d1f2757ee79e9b3740fbc7ccf0e59e4b08d793fa89"
[[package]]
-name = "linux-raw-sys"
-version = "0.1.4"
+name = "lockfree-object-pool"
+version = "0.1.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f051f77a7c8e6957c0696eac88f26b0117e54f52d3fc682ab19397a8812846a4"
+checksum = "9374ef4228402d4b7e403e5838cb880d9ee663314b0a900d5a6aabf0c213552e"
[[package]]
name = "log"
-version = "0.4.17"
+version = "0.4.22"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "abb12e687cfb44aa40f41fc3978ef76448f9b6038cad6aef4259d3c095a2382e"
-dependencies = [
- "cfg-if",
-]
+checksum = "a7a70ba024b9dc04c27ea2f0c0548feb474ec5c54bba33a7f72f873a39d07b24"
[[package]]
name = "loopdev"
version = "0.5.0"
-source = "git+https://github.com/tiann/loopdev?branch=loopfix#b6ca5e3ea163f66239f6a835874fe231b2a9286f"
+source = "git+https://github.com/Kernel-SU/loopdev#7a921f8d966477a645b1188732fac486c71a68ef"
dependencies = [
- "bindgen",
- "errno",
+ "errno 0.2.8",
"libc",
]
+[[package]]
+name = "lzma-rs"
+version = "0.3.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "297e814c836ae64db86b36cf2a557ba54368d03f6afcd7d947c266692f71115e"
+dependencies = [
+ "byteorder",
+ "crc",
+]
+
[[package]]
name = "memchr"
-version = "2.5.0"
+version = "2.7.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "2dffe52ecf27772e601905b7522cb4ef790d2cc203488bbd0e2fe85fcb74566d"
+checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3"
[[package]]
-name = "memoffset"
-version = "0.7.1"
+name = "memmap"
+version = "0.7.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5de893c32cde5f383baa4c04c5d6dbdd735cfd4a794b0debdb2bb1b421da5ff4"
+checksum = "6585fd95e7bb50d6cc31e20d4cf9afb4e2ba16c5846fc76793f11218da9c475b"
dependencies = [
- "autocfg",
+ "libc",
+ "winapi",
]
[[package]]
@@ -981,11 +934,11 @@ checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a"
[[package]]
name = "miniz_oxide"
-version = "0.6.2"
+version = "0.8.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b275950c28b37e794e8c55d88aeb5e139d0ce23fdbbeda68f8d7174abdf9e8fa"
+checksum = "e2d80299ef12ff69b16a84bb182e3b9df68b5a91574d3d4fa6e41b65deec4df1"
dependencies = [
- "adler",
+ "adler2",
]
[[package]]
@@ -999,167 +952,95 @@ dependencies = [
]
[[package]]
-name = "num-integer"
-version = "0.1.45"
+name = "num-conv"
+version = "0.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "225d3389fb3509a24c93f5c29eb6bde2586b98d9f016636dff58d7c6f7569cd9"
-dependencies = [
- "autocfg",
- "num-traits",
-]
+checksum = "51d515d32fb182ee37cda2ccdcb92950d6a3c2893aa280e540671c2cd0f3b1d9"
[[package]]
name = "num-traits"
-version = "0.2.15"
+version = "0.2.19"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "578ede34cf02f8924ab9447f50c28075b4d3e5b269972345e7e0372b38c6cdcd"
+checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841"
dependencies = [
"autocfg",
]
-[[package]]
-name = "num_cpus"
-version = "1.15.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0fac9e2da13b5eb447a6ce3d392f23a29d8694bff781bf03a16cd9ac8697593b"
-dependencies = [
- "hermit-abi",
- "libc",
-]
-
[[package]]
name = "object"
-version = "0.30.4"
+version = "0.36.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "03b4680b86d9cfafba8fc491dc9b6df26b68cf40e9e6cd73909194759a63c385"
+checksum = "aedf0a2d09c573ed1d8d85b30c119153926a2b36dce0ab28322c09a117a4683e"
dependencies = [
"memchr",
]
[[package]]
name = "once_cell"
-version = "1.17.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6f61fba1741ea2b3d6a1e3178721804bb716a68a6aeba1149b5d52e3d464ea66"
-
-[[package]]
-name = "opaque-debug"
-version = "0.3.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "624a8340c38c1b80fd549087862da4ba43e08858af025b236e509b6649fc13d5"
-
-[[package]]
-name = "os_str_bytes"
-version = "6.4.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9b7820b9daea5457c9f21c69448905d723fbd21136ccf521748f23fd49e723ee"
-
-[[package]]
-name = "password-hash"
-version = "0.4.2"
+version = "1.20.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7676374caaee8a325c9e7a2ae557f216c5563a171d6997b0ef8a65af35147700"
-dependencies = [
- "base64ct",
- "rand_core",
- "subtle",
-]
-
-[[package]]
-name = "pbkdf2"
-version = "0.11.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "83a0692ec44e4cf1ef28ca317f14f8f07da2d95ec3fa01f86e4467b725e60917"
-dependencies = [
- "digest",
- "hmac",
- "password-hash",
- "sha2",
-]
-
-[[package]]
-name = "peeking_take_while"
-version = "0.1.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "19b17cddbe7ec3f8bc800887bab5e717348c95ea2ca0b1bf0837fb964dc67099"
+checksum = "1261fe7e33c73b354eab43b1273a57c8f967d0391e80353e51f764ac02cf6775"
[[package]]
name = "pin-project-lite"
-version = "0.2.9"
+version = "0.2.15"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e0a7ae3ac2f1173085d398531c705756c94a4c56843785df85a60c1a0afac116"
+checksum = "915a1e146535de9163f3987b8944ed8cf49a18bb0056bcebcdcece385cece4ff"
[[package]]
-name = "pkg-config"
-version = "0.3.26"
+name = "powerfmt"
+version = "0.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6ac9a59f73473f1b8d852421e59e64809f025994837ef743615c6d0c5b305160"
+checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391"
[[package]]
name = "ppv-lite86"
-version = "0.2.17"
+version = "0.2.20"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de"
-
-[[package]]
-name = "proc-macro-error"
-version = "1.0.4"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "da25490ff9892aab3fcf7c36f08cfb902dd3e71ca0f9f9517bea02a73a5ce38c"
+checksum = "77957b295656769bb8ad2b6a6b09d897d94f05c41b069aede1fcdaa675eaea04"
dependencies = [
- "proc-macro-error-attr",
- "proc-macro2",
- "quote",
- "syn 1.0.107",
- "version_check",
+ "zerocopy",
]
[[package]]
-name = "proc-macro-error-attr"
-version = "1.0.4"
+name = "proc-macro2"
+version = "1.0.91"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a1be40180e52ecc98ad80b184934baf3d0d29f979574e439af5a55274b35f869"
+checksum = "307e3004becf10f5a6e0d59d20f3cd28231b0e0827a96cd3e0ce6d14bc1e4bb3"
dependencies = [
- "proc-macro2",
- "quote",
- "version_check",
+ "unicode-ident",
]
[[package]]
-name = "proc-macro-hack"
-version = "0.5.20+deprecated"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "dc375e1527247fe1a97d8b7156678dfe7c1af2fc075c9a4db3690ecd2a148068"
-
-[[package]]
-name = "proc-macro2"
-version = "1.0.69"
+name = "procfs"
+version = "0.17.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "134c189feb4956b20f6f547d2cf727d4c0fe06722b20a0eec87ed445a97f92da"
+checksum = "cc5b72d8145275d844d4b5f6d4e1eef00c8cd889edb6035c21675d1bb1f45c9f"
dependencies = [
- "unicode-ident",
+ "bitflags 2.6.0",
+ "chrono",
+ "flate2",
+ "hex",
+ "procfs-core",
+ "rustix 0.38.41",
]
[[package]]
-name = "procfs"
-version = "0.15.1"
+name = "procfs-core"
+version = "0.17.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "943ca7f9f29bab5844ecd8fdb3992c5969b6622bb9609b9502fef9b4310e3f1f"
+checksum = "239df02d8349b06fc07398a3a1697b06418223b1c7725085e801e7c0fc6a12ec"
dependencies = [
- "bitflags",
- "byteorder",
+ "bitflags 2.6.0",
"chrono",
- "flate2",
"hex",
- "lazy_static",
- "rustix",
]
[[package]]
name = "quote"
-version = "1.0.33"
+version = "1.0.37"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5267fca4496028628a95160fc423a33e8b2e6af8a5302579e322e4b520293cae"
+checksum = "b5b9d34b8991d19d98081b46eacdd8eb58c6f2b201139f7c5f643cc155a633af"
dependencies = [
"proc-macro2",
]
@@ -1196,9 +1077,9 @@ dependencies = [
[[package]]
name = "rayon"
-version = "1.6.1"
+version = "1.10.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6db3a213adf02b3bcfd2d3846bb41cb22857d131789e01df434fb7e7bc0759b7"
+checksum = "b418a60154510ca1a002a752ca9714984e21e4241e804d32555251faf8b78ffa"
dependencies = [
"either",
"rayon-core",
@@ -1206,32 +1087,19 @@ dependencies = [
[[package]]
name = "rayon-core"
-version = "1.10.2"
+version = "1.12.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "356a0625f1954f730c0201cdab48611198dc6ce21f4acff55089b5a78e6e835b"
+checksum = "1465873a3dfdaa8ae7cb14b4383657caab0b3e8a0aa9ae8e04b044854c8dfce2"
dependencies = [
- "crossbeam-channel",
"crossbeam-deque",
"crossbeam-utils",
- "num_cpus",
]
[[package]]
-name = "regex"
-version = "1.7.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "48aaa5748ba571fb95cd2c85c09f629215d3a6ece942baa100950af03a34f733"
-dependencies = [
- "aho-corasick",
- "memchr",
- "regex-syntax",
-]
-
-[[package]]
-name = "regex-syntax"
-version = "0.6.28"
+name = "regex-lite"
+version = "0.1.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "456c603be3e8d448b072f410900c09faf164fbce2d480456f50eea6e25f9c848"
+checksum = "53a49587ad06b26609c52e423de037e7f57f20d53535d66e08c695f347df952a"
[[package]]
name = "retry"
@@ -1250,9 +1118,9 @@ checksum = "3582f63211428f83597b51b2ddb88e2a91a9d52d12831f9d08f5e624e8977422"
[[package]]
name = "rust-embed"
-version = "6.4.2"
+version = "8.5.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "283ffe2f866869428c92e0d61c2f35dfb4355293cdfdc48f49e895c15f1333d1"
+checksum = "fa66af4a4fdd5e7ebc276f115e895611a34739a9c1c01028383d612d550953c0"
dependencies = [
"include-flate",
"rust-embed-impl",
@@ -1262,22 +1130,22 @@ dependencies = [
[[package]]
name = "rust-embed-impl"
-version = "6.3.1"
+version = "8.5.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "31ab23d42d71fb9be1b643fe6765d292c5e14d46912d13f3ae2815ca048ea04d"
+checksum = "6125dbc8867951125eec87294137f4e9c2c96566e61bf72c45095a7c77761478"
dependencies = [
"proc-macro2",
"quote",
"rust-embed-utils",
- "syn 1.0.107",
+ "syn",
"walkdir",
]
[[package]]
name = "rust-embed-utils"
-version = "7.3.0"
+version = "8.5.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c1669d81dfabd1b5f8e2856b8bbe146c6192b0ba22162edc738ac0a5de18f054"
+checksum = "2e5347777e9aacb56039b0e1f28785929a8a3b709e87482e7442c72e7c12529d"
dependencies = [
"sha2",
"walkdir",
@@ -1285,35 +1153,42 @@ dependencies = [
[[package]]
name = "rustc-demangle"
-version = "0.1.23"
+version = "0.1.24"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d626bb9dae77e28219937af045c257c28bfd3f69333c512553507f5f9798cb76"
+checksum = "719b953e2095829ee67db738b3bfa9fa368c94900df327b3f07fe6e794d2fe1f"
[[package]]
-name = "rustc-hash"
-version = "1.1.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2"
+name = "rustix"
+version = "0.38.34"
+source = "git+https://github.com/Kernel-SU/rustix.git?branch=main#4a53fbc7cb7a07cabe87125cc21dbc27db316259"
+dependencies = [
+ "bitflags 2.6.0",
+ "errno 0.3.9",
+ "itoa",
+ "libc",
+ "linux-raw-sys",
+ "once_cell",
+ "windows-sys 0.52.0",
+]
[[package]]
name = "rustix"
-version = "0.36.7"
+version = "0.38.41"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d4fdebc4b395b7fbb9ab11e462e20ed9051e7b16e42d24042c776eca0ac81b03"
+checksum = "d7f649912bc1495e167a6edee79151c84b1bad49748cb4f1f1167f459f6224f6"
dependencies = [
- "bitflags",
- "errno",
- "io-lifetimes",
+ "bitflags 2.6.0",
+ "errno 0.3.9",
"libc",
"linux-raw-sys",
- "windows-sys 0.42.0",
+ "windows-sys 0.52.0",
]
[[package]]
name = "ryu"
-version = "1.0.12"
+version = "1.0.18"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7b4b9743ed687d4b4bcedf9ff5eaa7398495ae14e61cba0a295704edbc7decde"
+checksum = "f3cb5ba0dc43242ce17de99c180e96db90b235b8a9fdc9543c96d2209116bd9f"
[[package]]
name = "same-file"
@@ -1325,61 +1200,64 @@ dependencies = [
]
[[package]]
-name = "scopeguard"
-version = "1.1.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd"
-
-[[package]]
-name = "scratch"
-version = "1.0.3"
+name = "serde"
+version = "1.0.215"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ddccb15bcce173023b3fedd9436f882a0739b8dfb45e4f6b6002bee5929f61b2"
+checksum = "6513c1ad0b11a9376da888e3e0baa0077f1aed55c17f50e7b2397136129fb88f"
+dependencies = [
+ "serde_derive",
+]
[[package]]
-name = "serde"
-version = "1.0.152"
+name = "serde_derive"
+version = "1.0.215"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "bb7d1f0d3021d347a83e556fc4683dea2ea09d87bccdf88ff5c12545d89d5efb"
+checksum = "ad1e866f866923f252f05c889987993144fb74e722403468a4ebd70c3cd756c0"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn",
+]
[[package]]
name = "serde_json"
-version = "1.0.91"
+version = "1.0.133"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "877c235533714907a8c2464236f5c4b2a17262ef1bd71f38f35ea592c8da6883"
+checksum = "c7fceb2473b9166b2294ef05efcb65a3db80803f0b03ef86a5fc88a2b85ee377"
dependencies = [
"itoa",
+ "memchr",
"ryu",
"serde",
]
[[package]]
name = "sha1"
-version = "0.10.5"
+version = "0.10.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f04293dc80c3993519f2d7f6f511707ee7094fe0c6d3406feb330cdb3540eba3"
+checksum = "e3bf829a2d51ab4a5ddf1352d8470c140cadc8301b2ae1789db023f01cedd6ba"
dependencies = [
- "cfg-if",
+ "cfg-if 1.0.0",
"cpufeatures",
"digest",
]
[[package]]
name = "sha2"
-version = "0.10.6"
+version = "0.10.8"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "82e6b795fe2e3b1e845bafcb27aa35405c4d47cdfc92af5fc8d3002f76cebdc0"
+checksum = "793db75ad2bcafc3ffa7c68b215fee268f537982cd901d132f89c6343f3a3dc8"
dependencies = [
- "cfg-if",
+ "cfg-if 1.0.0",
"cpufeatures",
"digest",
]
[[package]]
name = "sha256"
-version = "1.4.0"
+version = "1.5.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7895c8ae88588ccead14ff438b939b0c569cd619116f14b4d13fdff7b8333386"
+checksum = "18278f6a914fa3070aa316493f7d2ddfb9ac86ebc06fa3b83bffda487e9065b0"
dependencies = [
"async-trait",
"bytes",
@@ -1390,49 +1268,27 @@ dependencies = [
[[package]]
name = "shlex"
-version = "1.1.0"
+version = "1.3.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "43b2853a4d09f215c24cc5489c992ce46052d359b5109343cbafbf26bc62f8a3"
+checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64"
[[package]]
-name = "smart-default"
-version = "0.6.0"
+name = "simd-adler32"
+version = "0.3.7"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "133659a15339456eeeb07572eb02a91c91e9815e9cbc89566944d2c8d3efdbf6"
-dependencies = [
- "proc-macro2",
- "quote",
- "syn 1.0.107",
-]
+checksum = "d66dc143e6b11c1eddc06d5c423cfc97062865baf299914ab64caa38182078fe"
[[package]]
name = "strsim"
-version = "0.10.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623"
-
-[[package]]
-name = "subtle"
-version = "2.4.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6bdef32e8150c2a081110b42772ffe7d7c9032b606bc226c8260fd97e0976601"
-
-[[package]]
-name = "syn"
-version = "1.0.107"
+version = "0.11.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1f4064b5b16e03ae50984a5a8ed5d4f8803e6bc1fd170a3cda91a1be4b18e3f5"
-dependencies = [
- "proc-macro2",
- "quote",
- "unicode-ident",
-]
+checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f"
[[package]]
name = "syn"
-version = "2.0.38"
+version = "2.0.89"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e96b79aaa137db8f61e26363a0c9b47d8b4ec75da28b7d1d614c2303e232408b"
+checksum = "44d46482f1c1c87acd84dea20c1bf5ebff4c757009ed6bf19cfd36fb10e92c4e"
dependencies = [
"proc-macro2",
"quote",
@@ -1440,165 +1296,114 @@ dependencies = [
]
[[package]]
-name = "sys-mount"
-version = "2.0.2"
-source = "git+https://github.com/tiann/sys-mount?branch=loopfix#c7c4048e4a4ffdf8b108a85956363a75f2c554f0"
-dependencies = [
- "bitflags",
- "libc",
- "loopdev",
- "smart-default",
- "thiserror",
- "tracing",
-]
-
-[[package]]
-name = "termcolor"
-version = "1.2.0"
+name = "tempfile"
+version = "3.14.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "be55cf8942feac5c765c2c993422806843c9a9a45d4d5c407ad6dd2ea95eb9b6"
+checksum = "28cce251fcbc87fac86a866eeb0d6c2d536fc16d06f184bb61aeae11aa4cee0c"
dependencies = [
- "winapi-util",
+ "cfg-if 1.0.0",
+ "fastrand",
+ "once_cell",
+ "rustix 0.38.41",
+ "windows-sys 0.52.0",
]
[[package]]
name = "thiserror"
-version = "1.0.38"
+version = "1.0.69"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6a9cd18aa97d5c45c6603caea1da6628790b37f7a34b6ca89522331c5180fed0"
+checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52"
dependencies = [
"thiserror-impl",
]
[[package]]
name = "thiserror-impl"
-version = "1.0.38"
+version = "1.0.69"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1fb327af4685e4d03fa8cbcf1716380da910eeb2bb8be417e7f9fd3fb164f36f"
+checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1"
dependencies = [
"proc-macro2",
"quote",
- "syn 1.0.107",
-]
-
-[[package]]
-name = "time"
-version = "0.1.45"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1b797afad3f312d1c66a56d11d0316f916356d11bd158fbc6ca6389ff6bf805a"
-dependencies = [
- "libc",
- "wasi 0.10.0+wasi-snapshot-preview1",
- "winapi",
+ "syn",
]
[[package]]
name = "time"
-version = "0.3.20"
+version = "0.3.36"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "cd0cbfecb4d19b5ea75bb31ad904eb5b9fa13f21079c3b92017ebdf4999a5890"
+checksum = "5dfd88e563464686c916c7e46e623e520ddc6d79fa6641390f2e3fa86e83e885"
dependencies = [
+ "deranged",
+ "num-conv",
+ "powerfmt",
"serde",
"time-core",
]
[[package]]
name = "time-core"
-version = "0.1.0"
+version = "0.1.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "2e153e1f1acaef8acc537e68b44906d2db6436e2b35ac2c6b42640fff91f00fd"
+checksum = "ef927ca75afb808a4d64dd374f00a2adf8d0fcff8e7b184af886c3c87ec4a3f3"
[[package]]
name = "tokio"
-version = "1.29.1"
+version = "1.41.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "532826ff75199d5833b9d2c5fe410f29235e25704ee5f0ef599fb51c21f4a4da"
+checksum = "22cfb5bee7a6a52939ca9224d6ac897bb669134078daa8735560897f69de4d33"
dependencies = [
- "autocfg",
"backtrace",
"bytes",
"pin-project-lite",
]
-[[package]]
-name = "tracing"
-version = "0.1.37"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8ce8c33a8d48bd45d624a6e523445fd21ec13d3653cd51f681abf67418f54eb8"
-dependencies = [
- "cfg-if",
- "pin-project-lite",
- "tracing-attributes",
- "tracing-core",
-]
-
-[[package]]
-name = "tracing-attributes"
-version = "0.1.23"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4017f8f45139870ca7e672686113917c71c7a6e02d4924eda67186083c03081a"
-dependencies = [
- "proc-macro2",
- "quote",
- "syn 1.0.107",
-]
-
-[[package]]
-name = "tracing-core"
-version = "0.1.30"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "24eb03ba0eab1fd845050058ce5e616558e8f8d8fca633e6b163fe25c797213a"
-dependencies = [
- "once_cell",
-]
-
[[package]]
name = "typenum"
-version = "1.16.0"
+version = "1.17.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "497961ef93d974e23eb6f433eb5fe1b7930b659f06d12dec6fc44a8f554c0bba"
+checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825"
[[package]]
name = "unicode-ident"
-version = "1.0.6"
+version = "1.0.14"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "84a22b9f218b40614adcb3f4ff08b703773ad44fa9423e4e0d346d5db86e4ebc"
+checksum = "adb9e6ca4f869e1180728b7950e35922a7fc6397f7b641499e8f3ef06e50dc83"
[[package]]
name = "unicode-width"
-version = "0.1.10"
+version = "0.1.14"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c0edd1e5b14653f783770bce4a4dabb4a5108a5370a5f5d8cfe8710c361f6c8b"
+checksum = "7dd6e30e90baa6f72411720665d41d89b9a3d039dc45b8faea1ddd07f617f6af"
[[package]]
name = "unicode-xid"
-version = "0.2.4"
+version = "0.2.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f962df74c8c05a667b5ee8bcf162993134c104e96440b663c8daa176dc772d8c"
+checksum = "ebc1c04c71510c7f702b52b7c350734c9ff1295c464a03335b00bb84fc54f853"
+
+[[package]]
+name = "utf8parse"
+version = "0.2.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821"
[[package]]
name = "version_check"
-version = "0.9.4"
+version = "0.9.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f"
+checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a"
[[package]]
name = "walkdir"
-version = "2.3.2"
+version = "2.5.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "808cf2735cd4b6866113f648b791c6adc5714537bc222d9347bb203386ffda56"
+checksum = "29790946404f91d9c5d06f9874efddea1dc06c5efe94541a7d6863108e3a5e4b"
dependencies = [
"same-file",
- "winapi",
"winapi-util",
]
-[[package]]
-name = "wasi"
-version = "0.10.0+wasi-snapshot-preview1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1a143597ca7c7793eff794def352d41792a93c481eb1042423ff7ff72ba2c31f"
-
[[package]]
name = "wasi"
version = "0.11.0+wasi-snapshot-preview1"
@@ -1607,34 +1412,35 @@ checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423"
[[package]]
name = "wasm-bindgen"
-version = "0.2.84"
+version = "0.2.95"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "31f8dcbc21f30d9b8f2ea926ecb58f6b91192c17e9d33594b3df58b2007ca53b"
+checksum = "128d1e363af62632b8eb57219c8fd7877144af57558fb2ef0368d0087bddeb2e"
dependencies = [
- "cfg-if",
+ "cfg-if 1.0.0",
+ "once_cell",
"wasm-bindgen-macro",
]
[[package]]
name = "wasm-bindgen-backend"
-version = "0.2.84"
+version = "0.2.95"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "95ce90fd5bcc06af55a641a86428ee4229e44e07033963a2290a8e241607ccb9"
+checksum = "cb6dd4d3ca0ddffd1dd1c9c04f94b868c37ff5fac97c30b97cff2d74fce3a358"
dependencies = [
"bumpalo",
"log",
"once_cell",
"proc-macro2",
"quote",
- "syn 1.0.107",
+ "syn",
"wasm-bindgen-shared",
]
[[package]]
name = "wasm-bindgen-macro"
-version = "0.2.84"
+version = "0.2.95"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4c21f77c0bedc37fd5dc21f897894a5ca01e7bb159884559461862ae90c0b4c5"
+checksum = "e79384be7f8f5a9dd5d7167216f022090cf1f9ec128e6e6a482a2cb5c5422c56"
dependencies = [
"quote",
"wasm-bindgen-macro-support",
@@ -1642,32 +1448,33 @@ dependencies = [
[[package]]
name = "wasm-bindgen-macro-support"
-version = "0.2.84"
+version = "0.2.95"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "2aff81306fcac3c7515ad4e177f521b5c9a15f2b08f4e32d823066102f35a5f6"
+checksum = "26c6ab57572f7a24a4985830b120de1594465e5d500f24afe89e16b4e833ef68"
dependencies = [
"proc-macro2",
"quote",
- "syn 1.0.107",
+ "syn",
"wasm-bindgen-backend",
"wasm-bindgen-shared",
]
[[package]]
name = "wasm-bindgen-shared"
-version = "0.2.84"
+version = "0.2.95"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0046fef7e28c3804e5e38bfa31ea2a0f73905319b677e57ebe37e49358989b5d"
+checksum = "65fc09f10666a9f147042251e0dda9c18f166ff7de300607007e96bdebc1068d"
[[package]]
name = "which"
-version = "4.4.0"
+version = "7.0.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "2441c784c52b289a054b7201fc93253e288f094e2f4be9058343127c4226a269"
+checksum = "c9cad3279ade7346b96e38731a641d7343dd6a53d55083dd54eadfa5a1b38c6b"
dependencies = [
"either",
- "libc",
- "once_cell",
+ "home",
+ "rustix 0.38.41",
+ "winsafe",
]
[[package]]
@@ -1688,11 +1495,11 @@ checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6"
[[package]]
name = "winapi-util"
-version = "0.1.5"
+version = "0.1.9"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "70ec6ce85bb158151cae5e5c87f95a8e97d2c0c4b001223f33a334e3ce5de178"
+checksum = "cf221c93e13a30d793f7645a0e7762c55d169dbb0a49671918a2319d289b10bb"
dependencies = [
- "winapi",
+ "windows-sys 0.52.0",
]
[[package]]
@@ -1701,39 +1508,43 @@ version = "0.4.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f"
+[[package]]
+name = "windows-core"
+version = "0.52.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "33ab640c8d7e35bf8ba19b884ba838ceb4fba93a4e8c65a9059d08afcfc683d9"
+dependencies = [
+ "windows-targets",
+]
+
[[package]]
name = "windows-sys"
-version = "0.42.0"
+version = "0.52.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5a3e1820f08b8513f676f7ab6c1f99ff312fb97b553d30ff4dd86f9f15728aa7"
+checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d"
dependencies = [
- "windows_aarch64_gnullvm",
- "windows_aarch64_msvc",
- "windows_i686_gnu",
- "windows_i686_msvc",
- "windows_x86_64_gnu",
- "windows_x86_64_gnullvm",
- "windows_x86_64_msvc",
+ "windows-targets",
]
[[package]]
name = "windows-sys"
-version = "0.45.0"
+version = "0.59.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "75283be5efb2831d37ea142365f009c02ec203cd29a3ebecbc093d52315b66d0"
+checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b"
dependencies = [
"windows-targets",
]
[[package]]
name = "windows-targets"
-version = "0.42.1"
+version = "0.52.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8e2522491fbfcd58cc84d47aeb2958948c4b8982e9a2d8a2a35bbaed431390e7"
+checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973"
dependencies = [
"windows_aarch64_gnullvm",
"windows_aarch64_msvc",
"windows_i686_gnu",
+ "windows_i686_gnullvm",
"windows_i686_msvc",
"windows_x86_64_gnu",
"windows_x86_64_gnullvm",
@@ -1742,115 +1553,118 @@ dependencies = [
[[package]]
name = "windows_aarch64_gnullvm"
-version = "0.42.1"
+version = "0.52.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8c9864e83243fdec7fc9c5444389dcbbfd258f745e7853198f365e3c4968a608"
+checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3"
[[package]]
name = "windows_aarch64_msvc"
-version = "0.42.1"
+version = "0.52.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4c8b1b673ffc16c47a9ff48570a9d85e25d265735c503681332589af6253c6c7"
+checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469"
[[package]]
name = "windows_i686_gnu"
-version = "0.42.1"
+version = "0.52.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b"
+
+[[package]]
+name = "windows_i686_gnullvm"
+version = "0.52.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "de3887528ad530ba7bdbb1faa8275ec7a1155a45ffa57c37993960277145d640"
+checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66"
[[package]]
name = "windows_i686_msvc"
-version = "0.42.1"
+version = "0.52.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "bf4d1122317eddd6ff351aa852118a2418ad4214e6613a50e0191f7004372605"
+checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66"
[[package]]
name = "windows_x86_64_gnu"
-version = "0.42.1"
+version = "0.52.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c1040f221285e17ebccbc2591ffdc2d44ee1f9186324dd3e84e99ac68d699c45"
+checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78"
[[package]]
name = "windows_x86_64_gnullvm"
-version = "0.42.1"
+version = "0.52.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "628bfdf232daa22b0d64fdb62b09fcc36bb01f05a3939e20ab73aaf9470d0463"
+checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d"
[[package]]
name = "windows_x86_64_msvc"
-version = "0.42.1"
+version = "0.52.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "447660ad36a13288b1db4d4248e857b510e8c3a225c822ba4fb748c0aafecffd"
+checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec"
[[package]]
-name = "zip"
-version = "0.5.13"
+name = "winsafe"
+version = "0.0.19"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "93ab48844d61251bb3835145c521d88aa4031d7139e8485990f60ca911fa0815"
-dependencies = [
- "byteorder",
- "bzip2",
- "crc32fast",
- "flate2",
- "thiserror",
- "time 0.1.45",
-]
+checksum = "d135d17ab770252ad95e9a872d365cf3090e3be864a34ab46f48555993efc904"
[[package]]
-name = "zip"
-version = "0.6.4"
+name = "zerocopy"
+version = "0.7.35"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0445d0fbc924bb93539b4316c11afb121ea39296f99a3c4c9edad09e3658cdef"
+checksum = "1b9b4fd18abc82b8136838da5d50bae7bdea537c574d8dc1a34ed098d6c166f0"
dependencies = [
- "aes",
"byteorder",
- "bzip2",
- "constant_time_eq",
- "crc32fast",
- "crossbeam-utils",
- "flate2",
- "hmac",
- "pbkdf2",
- "sha1",
- "time 0.3.20",
- "zstd",
+ "zerocopy-derive",
]
[[package]]
-name = "zip-extensions"
-version = "0.6.1"
+name = "zerocopy-derive"
+version = "0.7.35"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a64c3c977bc3434ce2d4bcea8ad3c644672de0f2c402b72b9171ca80a8885d14"
+checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e"
dependencies = [
- "zip 0.5.13",
+ "proc-macro2",
+ "quote",
+ "syn",
]
[[package]]
-name = "zstd"
-version = "0.11.2+zstd.1.5.2"
+name = "zip"
+version = "2.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "20cc960326ece64f010d2d2107537f26dc589a6573a316bd5b1dba685fa5fde4"
+checksum = "dc5e4288ea4057ae23afc69a4472434a87a2495cafce6632fd1c4ec9f5cf3494"
dependencies = [
- "zstd-safe",
+ "arbitrary",
+ "crc32fast",
+ "crossbeam-utils",
+ "deflate64",
+ "displaydoc",
+ "flate2",
+ "indexmap",
+ "lzma-rs",
+ "memchr",
+ "thiserror",
+ "time",
+ "zopfli",
]
[[package]]
-name = "zstd-safe"
-version = "5.0.2+zstd.1.5.2"
+name = "zip-extensions"
+version = "0.8.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1d2a5585e04f9eea4b2a3d1eca508c4dee9592a89ef6f450c11719da0726f4db"
+checksum = "386508a00aae1d8218b9252a41f59bba739ccee3f8e420bb90bcb1c30d960d4a"
dependencies = [
- "libc",
- "zstd-sys",
+ "zip",
]
[[package]]
-name = "zstd-sys"
-version = "2.0.7+zstd.1.5.4"
+name = "zopfli"
+version = "0.8.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "94509c3ba2fe55294d752b79842c530ccfab760192521df74a081a78d2b3c7f5"
+checksum = "e5019f391bac5cf252e93bbcc53d039ffd62c7bfb7c150414d61369afe57e946"
dependencies = [
- "cc",
- "libc",
- "pkg-config",
+ "bumpalo",
+ "crc32fast",
+ "lockfree-object-pool",
+ "log",
+ "once_cell",
+ "simd-adler32",
]
diff --git a/userspace/ksud/Cargo.toml b/userspace/ksud/Cargo.toml
index a6e102d9ac3c..33786366b270 100644
--- a/userspace/ksud/Cargo.toml
+++ b/userspace/ksud/Cargo.toml
@@ -2,49 +2,62 @@
name = "ksud"
version = "0.1.0"
edition = "2021"
-rust-version = "1.65"
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
[dependencies]
-anyhow = "1.0.68"
-clap = { version = "4.0.32", features = ["derive"] }
-const_format = "0.2.30"
-zip = "0.6.3"
-zip-extensions = "0.6.1"
-java-properties = "1.4.1"
-log = "0.4.17"
-env_logger = "0.10.0"
+anyhow = "1.0"
+clap = { version = "4.5", features = ["derive"] }
+const_format = "0.2"
+zip = { version = "2.2", default-features = false }
+zip-extensions = { version = "0.8", features = [
+ "deflate",
+ "deflate64",
+ "time",
+ "lzma",
+ "xz",
+], default-features = false }
+java-properties = { git = "https://github.com/Kernel-SU/java-properties.git", branch = "master", default-features = false }
+log = "0.4"
+env_logger = { version = "0.11", default-features = false }
serde = { version = "1.0" }
serde_json = "1.0"
-regex = "1.5.4"
-encoding = "0.2.33"
-retry = "2.0.0"
-humansize = "2.0.0"
+encoding_rs = "0.8"
+retry = "2.0"
+humansize = "2.1"
libc = "0.2"
-extattr = "1.0.0"
-jwalk = "0.8.1"
-is_executable = "1.0.1"
-nom = "7"
-derive-new = "0.5"
-rust-embed = { version = "6.4.2", features = [
+extattr = "1.0"
+jwalk = "0.8"
+is_executable = "1.0"
+nom = "7.1"
+derive-new = "0.7"
+rust-embed = { version = "8.5", features = [
"debug-embed",
"compression", # must clean build after updating binaries
] }
-which = "4.2.2"
-getopts = "0.2.21"
-sha256 = "1.4.0"
+which = "7.0"
+getopts = "0.2"
+sha256 = "1"
+sha1 = "0.10"
+tempfile = "3.14"
+chrono = "0.4"
+hole-punch = { git = "https://github.com/tiann/hole-punch" }
+regex-lite = "0.1"
[target.'cfg(any(target_os = "android", target_os = "linux"))'.dependencies]
-sys-mount = { git = "https://github.com/tiann/sys-mount", branch = "loopfix" }
+rustix = { git = "https://github.com/Kernel-SU/rustix.git", branch = "main", features = [
+ "all-apis",
+] }
# some android specific dependencies which compiles under unix are also listed here for convenience of coding
-android-properties = { version = "0.2.2", features = ["bionic-deprecated"] }
-procfs = "0.15"
+android-properties = { version = "0.2", features = ["bionic-deprecated"] }
+procfs = "0.17"
+loopdev = { git = "https://github.com/Kernel-SU/loopdev" }
[target.'cfg(target_os = "android")'.dependencies]
-android_logger = "0.13"
+android_logger = { version = "0.14", default-features = false }
[profile.release]
strip = true
opt-level = "z"
lto = true
+codegen-units = 1
diff --git a/userspace/ksud/bin/.gitignore b/userspace/ksud/bin/.gitignore
new file mode 100644
index 000000000000..1464b7ed27b3
--- /dev/null
+++ b/userspace/ksud/bin/.gitignore
@@ -0,0 +1 @@
+**/*.ko
\ No newline at end of file
diff --git a/userspace/ksud/bin/aarch64/bootctl b/userspace/ksud/bin/aarch64/bootctl
new file mode 100644
index 000000000000..cf5c61368467
Binary files /dev/null and b/userspace/ksud/bin/aarch64/bootctl differ
diff --git a/userspace/ksud/bin/aarch64/busybox b/userspace/ksud/bin/aarch64/busybox
index 61b2ec160421..2fd8bcfa56cf 100755
Binary files a/userspace/ksud/bin/aarch64/busybox and b/userspace/ksud/bin/aarch64/busybox differ
diff --git a/userspace/ksud/bin/aarch64/ksuinit b/userspace/ksud/bin/aarch64/ksuinit
new file mode 100755
index 000000000000..8d3ba057f9de
Binary files /dev/null and b/userspace/ksud/bin/aarch64/ksuinit differ
diff --git a/userspace/ksud/bin/aarch64/resetprop b/userspace/ksud/bin/aarch64/resetprop
index b667d2ea7972..305032c90dc9 100644
Binary files a/userspace/ksud/bin/aarch64/resetprop and b/userspace/ksud/bin/aarch64/resetprop differ
diff --git a/userspace/ksud/bin/x86_64/busybox b/userspace/ksud/bin/x86_64/busybox
old mode 100644
new mode 100755
index 87a4d95fce94..3603e741b8e8
Binary files a/userspace/ksud/bin/x86_64/busybox and b/userspace/ksud/bin/x86_64/busybox differ
diff --git a/userspace/ksud/bin/x86_64/ksuinit b/userspace/ksud/bin/x86_64/ksuinit
new file mode 100755
index 000000000000..9517baf915bf
Binary files /dev/null and b/userspace/ksud/bin/x86_64/ksuinit differ
diff --git a/userspace/ksud/bin/x86_64/resetprop b/userspace/ksud/bin/x86_64/resetprop
index 0997f25158a8..80030612649b 100644
Binary files a/userspace/ksud/bin/x86_64/resetprop and b/userspace/ksud/bin/x86_64/resetprop differ
diff --git a/userspace/ksud/src/apk_sign.rs b/userspace/ksud/src/apk_sign.rs
index 9e8dad3fedf7..6d047ccad9be 100644
--- a/userspace/ksud/src/apk_sign.rs
+++ b/userspace/ksud/src/apk_sign.rs
@@ -81,13 +81,10 @@ pub fn get_apk_signature(apk: &str) -> Result<(u32, String)> {
}
if v3_signing_exist || v3_1_signing_exist {
- return Err(anyhow::anyhow!(
- "Unexpected v3 signature found!",
- ));
+ return Err(anyhow::anyhow!("Unexpected v3 signature found!",));
}
v2_signing.ok_or(anyhow::anyhow!("No signature found!"))
-
}
fn calc_cert_sha256(
diff --git a/userspace/ksud/src/assets.rs b/userspace/ksud/src/assets.rs
index 55ffe4c17888..e8255c8204a7 100644
--- a/userspace/ksud/src/assets.rs
+++ b/userspace/ksud/src/assets.rs
@@ -1,28 +1,50 @@
use anyhow::Result;
use const_format::concatcp;
use rust_embed::RustEmbed;
+use std::path::Path;
use crate::{defs::BINARY_DIR, utils};
pub const RESETPROP_PATH: &str = concatcp!(BINARY_DIR, "resetprop");
pub const BUSYBOX_PATH: &str = concatcp!(BINARY_DIR, "busybox");
+pub const BOOTCTL_PATH: &str = concatcp!(BINARY_DIR, "bootctl");
-#[cfg(target_arch = "aarch64")]
+#[cfg(all(target_arch = "x86_64", target_os = "android"))]
#[derive(RustEmbed)]
-#[folder = "bin/aarch64"]
+#[folder = "bin/x86_64"]
struct Asset;
-#[cfg(target_arch = "x86_64")]
+// IF NOT x86_64 ANDROID, ie. macos, linux, windows, always use aarch64
+#[cfg(not(all(target_arch = "x86_64", target_os = "android")))]
#[derive(RustEmbed)]
-#[folder = "bin/x86_64"]
+#[folder = "bin/aarch64"]
struct Asset;
-pub fn ensure_binaries() -> Result<()> {
+pub fn ensure_binaries(ignore_if_exist: bool) -> Result<()> {
for file in Asset::iter() {
- utils::ensure_binary(
- format!("{BINARY_DIR}{file}"),
- &Asset::get(&file).unwrap().data,
- )?
+ if file == "ksuinit" || file.ends_with(".ko") {
+ // don't extract ksuinit and kernel modules
+ continue;
+ }
+ let asset = Asset::get(&file).ok_or(anyhow::anyhow!("asset not found: {}", file))?;
+ utils::ensure_binary(format!("{BINARY_DIR}{file}"), &asset.data, ignore_if_exist)?
}
Ok(())
}
+
+pub fn copy_assets_to_file(name: &str, dst: impl AsRef) -> Result<()> {
+ let asset = Asset::get(name).ok_or(anyhow::anyhow!("asset not found: {}", name))?;
+ std::fs::write(dst, asset.data)?;
+ Ok(())
+}
+
+pub fn list_supported_kmi() -> Result> {
+ let mut list = Vec::new();
+ for file in Asset::iter() {
+ // kmi_name = "xxx_kernelsu.ko"
+ if let Some(kmi) = file.strip_suffix("_kernelsu.ko") {
+ list.push(kmi.to_string());
+ }
+ }
+ Ok(list)
+}
diff --git a/userspace/ksud/src/boot_patch.rs b/userspace/ksud/src/boot_patch.rs
new file mode 100644
index 000000000000..8ce6ee73a186
--- /dev/null
+++ b/userspace/ksud/src/boot_patch.rs
@@ -0,0 +1,714 @@
+#[cfg(unix)]
+use std::os::unix::fs::PermissionsExt;
+use std::path::Path;
+use std::path::PathBuf;
+use std::process::Command;
+use std::process::Stdio;
+
+use anyhow::anyhow;
+use anyhow::bail;
+use anyhow::ensure;
+use anyhow::Context;
+use anyhow::Result;
+use regex_lite::Regex;
+use which::which;
+
+use crate::defs;
+use crate::defs::BACKUP_FILENAME;
+use crate::defs::{KSU_BACKUP_DIR, KSU_BACKUP_FILE_PREFIX};
+use crate::{assets, utils};
+
+#[cfg(target_os = "android")]
+fn ensure_gki_kernel() -> Result<()> {
+ let version = get_kernel_version()?;
+ let is_gki = version.0 == 5 && version.1 >= 10 || version.2 > 5;
+ ensure!(is_gki, "only support GKI kernel");
+ Ok(())
+}
+
+#[cfg(target_os = "android")]
+pub fn get_kernel_version() -> Result<(i32, i32, i32)> {
+ let uname = rustix::system::uname();
+ let version = uname.release().to_string_lossy();
+ let re = Regex::new(r"(\d+)\.(\d+)\.(\d+)")?;
+ if let Some(captures) = re.captures(&version) {
+ let major = captures
+ .get(1)
+ .and_then(|m| m.as_str().parse::().ok())
+ .ok_or_else(|| anyhow!("Major version parse error"))?;
+ let minor = captures
+ .get(2)
+ .and_then(|m| m.as_str().parse::().ok())
+ .ok_or_else(|| anyhow!("Minor version parse error"))?;
+ let patch = captures
+ .get(3)
+ .and_then(|m| m.as_str().parse::().ok())
+ .ok_or_else(|| anyhow!("Patch version parse error"))?;
+ Ok((major, minor, patch))
+ } else {
+ Err(anyhow!("Invalid kernel version string"))
+ }
+}
+
+#[cfg(target_os = "android")]
+fn parse_kmi(version: &str) -> Result {
+ let re = Regex::new(r"(.* )?(\d+\.\d+)(\S+)?(android\d+)(.*)")?;
+ let cap = re
+ .captures(version)
+ .ok_or_else(|| anyhow::anyhow!("Failed to get KMI from boot/modules"))?;
+ let android_version = cap.get(4).map_or("", |m| m.as_str());
+ let kernel_version = cap.get(2).map_or("", |m| m.as_str());
+ Ok(format!("{android_version}-{kernel_version}"))
+}
+
+#[cfg(target_os = "android")]
+fn parse_kmi_from_uname() -> Result {
+ let uname = rustix::system::uname();
+ let version = uname.release().to_string_lossy();
+ parse_kmi(&version)
+}
+
+#[cfg(target_os = "android")]
+fn parse_kmi_from_modules() -> Result {
+ use std::io::BufRead;
+ // find a *.ko in /vendor/lib/modules
+ let modfile = std::fs::read_dir("/vendor/lib/modules")?
+ .filter_map(Result::ok)
+ .find(|entry| entry.path().extension().map_or(false, |ext| ext == "ko"))
+ .map(|entry| entry.path())
+ .ok_or_else(|| anyhow!("No kernel module found"))?;
+ let output = Command::new("modinfo").arg(modfile).output()?;
+ for line in output.stdout.lines().map_while(Result::ok) {
+ if line.starts_with("vermagic") {
+ return parse_kmi(&line);
+ }
+ }
+ anyhow::bail!("Parse KMI from modules failed")
+}
+
+#[cfg(target_os = "android")]
+pub fn get_current_kmi() -> Result {
+ parse_kmi_from_uname().or_else(|_| parse_kmi_from_modules())
+}
+
+#[cfg(not(target_os = "android"))]
+pub fn get_current_kmi() -> Result {
+ bail!("Unsupported platform")
+}
+
+fn parse_kmi_from_kernel(kernel: &PathBuf, workdir: &Path) -> Result