Request Shizuku permission before enter Shizuku screen

Bind Shizuku service automatically after enter Shizuku functions page
This commit is contained in:
BinTianqi
2024-12-15 12:01:09 +08:00
parent 867668832e
commit 3fb4fb078f
10 changed files with 84 additions and 155 deletions

View File

@@ -1,7 +1,6 @@
package com.bintianqi.owndroid; package com.bintianqi.owndroid;
interface IUserService { interface IUserService {
void destroy() = 16777114;
String execute(String command) = 1; String execute(String command) = 1;
int getUid() = 2; int getUid() = 2;
} }

View File

@@ -210,7 +210,7 @@ fun Home(activity: FragmentActivity, vm: MyViewModel) {
composable(route = "HomePage") { HomePage(navCtrl) } composable(route = "HomePage") { HomePage(navCtrl) }
composable(route = "Permissions") { Permissions(navCtrl) } composable(route = "Permissions") { Permissions(navCtrl) }
composable(route = "Shizuku") { Shizuku(navCtrl) } composable(route = "Shizuku") { Shizuku(vm, navCtrl) }
composable(route = "DeviceAdmin") { DeviceAdmin(navCtrl) } composable(route = "DeviceAdmin") { DeviceAdmin(navCtrl) }
composable(route = "ProfileOwner") { ProfileOwner(navCtrl) } composable(route = "ProfileOwner") { ProfileOwner(navCtrl) }
composable(route = "DeviceOwner") { DeviceOwner(navCtrl) } composable(route = "DeviceOwner") { DeviceOwner(navCtrl) }

View File

@@ -2,6 +2,7 @@ package com.bintianqi.owndroid
import android.content.Context import android.content.Context
import android.os.Build import android.os.Build
import android.os.IBinder
import androidx.lifecycle.ViewModel import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope import androidx.lifecycle.viewModelScope
import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.MutableStateFlow
@@ -9,6 +10,7 @@ import kotlinx.coroutines.launch
class MyViewModel: ViewModel() { class MyViewModel: ViewModel() {
val theme = MutableStateFlow(ThemeSettings()) val theme = MutableStateFlow(ThemeSettings())
val shizukuBinder = MutableStateFlow<IBinder?>(null)
var initialized = false var initialized = false
fun initialize(context: Context) { fun initialize(context: Context) {

View File

@@ -37,6 +37,8 @@ import com.bintianqi.owndroid.yesOrNo
import com.rosan.dhizuku.api.Dhizuku import com.rosan.dhizuku.api.Dhizuku
import com.rosan.dhizuku.api.DhizukuRequestPermissionListener import com.rosan.dhizuku.api.DhizukuRequestPermissionListener
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
import rikka.shizuku.Shizuku
import rikka.sui.Sui
@SuppressLint("NewApi") @SuppressLint("NewApi")
@Composable @Composable
@@ -76,7 +78,30 @@ fun Permissions(navCtrl: NavHostController) {
operation = { navCtrl.navigate("DeviceOwner") } operation = { navCtrl.navigate("DeviceOwner") }
) )
} }
FunctionItem(R.string.shizuku,"") { navCtrl.navigate("Shizuku") } FunctionItem(R.string.shizuku,"") {
try {
if(Shizuku.checkSelfPermission() == PackageManager.PERMISSION_GRANTED) { navCtrl.navigate("Shizuku") }
else if(Shizuku.shouldShowRequestPermissionRationale()) {
Toast.makeText(context, R.string.permission_denied, Toast.LENGTH_SHORT).show()
} else {
Sui.init(context.packageName)
val listener = object: Shizuku.OnRequestPermissionResultListener {
override fun onRequestPermissionResult(requestCode: Int, grantResult: Int) {
if(grantResult == PackageManager.PERMISSION_GRANTED) {
navCtrl.navigate("Shizuku")
} else {
Toast.makeText(context, R.string.permission_denied, Toast.LENGTH_SHORT).show()
}
Shizuku.removeRequestPermissionResultListener(this)
}
}
Shizuku.addRequestPermissionResultListener(listener)
Shizuku.requestPermission(0)
}
} catch(_: IllegalStateException) {
Toast.makeText(context, R.string.shizuku_not_started, Toast.LENGTH_SHORT).show()
}
}
FunctionItem(R.string.device_info, "", R.drawable.perm_device_information_fill0) { navCtrl.navigate("DeviceInfo") } FunctionItem(R.string.device_info, "", R.drawable.perm_device_information_fill0) { navCtrl.navigate("DeviceInfo") }
if((VERSION.SDK_INT >= 26 && deviceOwner) || (VERSION.SDK_INT>=24 && profileOwner)) { if((VERSION.SDK_INT >= 26 && deviceOwner) || (VERSION.SDK_INT>=24 && profileOwner)) {
FunctionItem(R.string.org_name, "", R.drawable.corporate_fare_fill0) { dialog = 2 } FunctionItem(R.string.org_name, "", R.drawable.corporate_fare_fill0) { dialog = 2 }

View File

@@ -3,7 +3,6 @@ package com.bintianqi.owndroid.dpm
import android.content.ComponentName import android.content.ComponentName
import android.content.Context import android.content.Context
import android.content.ServiceConnection import android.content.ServiceConnection
import android.content.pm.PackageManager
import android.os.Binder import android.os.Binder
import android.os.Build.VERSION import android.os.Build.VERSION
import android.os.IBinder import android.os.IBinder
@@ -13,14 +12,14 @@ import androidx.compose.foundation.horizontalScroll
import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.Spacer
import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.wrapContentWidth
import androidx.compose.foundation.rememberScrollState import androidx.compose.foundation.rememberScrollState
import androidx.compose.foundation.text.selection.SelectionContainer import androidx.compose.foundation.text.selection.SelectionContainer
import androidx.compose.material3.Button import androidx.compose.material3.Button
import androidx.compose.material3.CircularProgressIndicator
import androidx.compose.material3.ExperimentalMaterial3Api
import androidx.compose.material3.Text import androidx.compose.material3.Text
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.collectAsState
import androidx.compose.runtime.getValue import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember import androidx.compose.runtime.remember
@@ -32,74 +31,53 @@ import androidx.compose.ui.Modifier
import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.res.stringResource import androidx.compose.ui.res.stringResource
import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.dp
import androidx.compose.ui.window.Dialog
import androidx.lifecycle.compose.collectAsStateWithLifecycle
import androidx.navigation.NavHostController import androidx.navigation.NavHostController
import com.bintianqi.owndroid.IUserService import com.bintianqi.owndroid.IUserService
import com.bintianqi.owndroid.MyViewModel
import com.bintianqi.owndroid.R import com.bintianqi.owndroid.R
import com.bintianqi.owndroid.ui.MyScaffold import com.bintianqi.owndroid.ui.MyScaffold
import kotlinx.coroutines.delay import kotlinx.coroutines.delay
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
import rikka.shizuku.Shizuku import rikka.shizuku.Shizuku
private var waitGrantPermission = false @OptIn(ExperimentalMaterial3Api::class)
@Composable @Composable
fun Shizuku(navCtrl: NavHostController) { fun Shizuku(vm: MyViewModel, navCtrl: NavHostController) {
val context = LocalContext.current val context = LocalContext.current
val dpm = context.getDPM() val dpm = context.getDPM()
val receiver = context.getReceiver() val receiver = context.getReceiver()
val coScope = rememberCoroutineScope() val coScope = rememberCoroutineScope()
val outputTextScrollState = rememberScrollState() val outputTextScrollState = rememberScrollState()
var enabled by remember { mutableStateOf(false) }
var bindShizuku by remember { mutableStateOf(false) }
var outputText by rememberSaveable { mutableStateOf("") } var outputText by rememberSaveable { mutableStateOf("") }
var showDeviceAdminButton by remember { mutableStateOf(!context.isDeviceAdmin) } var showDeviceAdminButton by remember { mutableStateOf(!context.isDeviceAdmin) }
var showDeviceOwnerButton by remember { mutableStateOf(!context.isDeviceOwner) } var showDeviceOwnerButton by remember { mutableStateOf(!context.isDeviceOwner) }
var showOrgProfileOwnerButton by remember { mutableStateOf(true) } var showOrgProfileOwnerButton by remember { mutableStateOf(true) }
val service by shizukuService.collectAsState() val binder by vm.shizukuBinder.collectAsStateWithLifecycle()
LaunchedEffect(service) { var service by remember { mutableStateOf<IUserService?>(null) }
if(service == null) { var loading by remember { mutableStateOf(true) }
enabled = false LaunchedEffect(binder) {
bindShizuku = checkShizukuStatus() == 1 if(binder != null && binder!!.pingBinder()) {
service = IUserService.Stub.asInterface(binder)
loading = false
} else { } else {
enabled = true service = null
bindShizuku = false
} }
} }
LaunchedEffect(service) {
if(service == null && !loading) navCtrl.navigateUp()
}
LaunchedEffect(Unit) { LaunchedEffect(Unit) {
shizukuService.value = null if(binder == null) bindShizukuService(context, vm.shizukuBinder)
userServiceControl(context, true)
} }
MyScaffold(R.string.shizuku, 0.dp, navCtrl, false) { MyScaffold(R.string.shizuku, 0.dp, navCtrl, false) {
AnimatedVisibility(visible = bindShizuku, modifier = Modifier.fillMaxWidth()) { if(loading) {
Button( Dialog(onDismissRequest = { navCtrl.navigateUp() }) {
onClick = { CircularProgressIndicator()
userServiceControl(context, true)
outputText = ""
},
modifier = Modifier.wrapContentWidth(Alignment.CenterHorizontally)
) {
Text(stringResource(R.string.bind_shizuku))
} }
} }
Button(
onClick = {
outputText = checkPermission(context)
if(service != null) {
enabled = true
bindShizuku = false
} else {
enabled = false
bindShizuku = checkShizukuStatus() == 1
}
coScope.launch {
outputTextScrollState.animateScrollTo(0)
}
},
modifier = Modifier.align(Alignment.CenterHorizontally)
) {
Text(text = stringResource(R.string.check_shizuku))
}
Button( Button(
onClick = { onClick = {
@@ -108,7 +86,6 @@ fun Shizuku(navCtrl: NavHostController) {
outputTextScrollState.animateScrollTo(0) outputTextScrollState.animateScrollTo(0)
} }
}, },
enabled = enabled,
modifier = Modifier.align(Alignment.CenterHorizontally) modifier = Modifier.align(Alignment.CenterHorizontally)
) { ) {
Text(text = stringResource(R.string.list_owners)) Text(text = stringResource(R.string.list_owners))
@@ -120,7 +97,6 @@ fun Shizuku(navCtrl: NavHostController) {
outputTextScrollState.animateScrollTo(0) outputTextScrollState.animateScrollTo(0)
} }
}, },
enabled = enabled,
modifier = Modifier.align(Alignment.CenterHorizontally) modifier = Modifier.align(Alignment.CenterHorizontally)
) { ) {
Text(text = stringResource(R.string.list_users)) Text(text = stringResource(R.string.list_users))
@@ -132,7 +108,6 @@ fun Shizuku(navCtrl: NavHostController) {
outputTextScrollState.animateScrollTo(0) outputTextScrollState.animateScrollTo(0)
} }
}, },
enabled = enabled,
modifier = Modifier.align(Alignment.CenterHorizontally) modifier = Modifier.align(Alignment.CenterHorizontally)
) { ) {
Text(text = stringResource(R.string.list_accounts)) Text(text = stringResource(R.string.list_accounts))
@@ -149,7 +124,6 @@ fun Shizuku(navCtrl: NavHostController) {
showDeviceAdminButton = !context.isDeviceAdmin showDeviceAdminButton = !context.isDeviceAdmin
} }
}, },
enabled = enabled,
modifier = Modifier.align(Alignment.CenterHorizontally) modifier = Modifier.align(Alignment.CenterHorizontally)
) { ) {
Text(text = stringResource(R.string.activate_device_admin)) Text(text = stringResource(R.string.activate_device_admin))
@@ -166,7 +140,6 @@ fun Shizuku(navCtrl: NavHostController) {
showDeviceOwnerButton = !context.isDeviceOwner showDeviceOwnerButton = !context.isDeviceOwner
} }
}, },
enabled = enabled,
modifier = Modifier.align(Alignment.CenterHorizontally) modifier = Modifier.align(Alignment.CenterHorizontally)
) { ) {
Text(text = stringResource(R.string.activate_device_owner)) Text(text = stringResource(R.string.activate_device_owner))
@@ -187,7 +160,6 @@ fun Shizuku(navCtrl: NavHostController) {
showOrgProfileOwnerButton = !dpm.isOrganizationOwnedDeviceWithManagedProfile showOrgProfileOwnerButton = !dpm.isOrganizationOwnedDeviceWithManagedProfile
} }
}, },
enabled = enabled,
modifier = Modifier.align(Alignment.CenterHorizontally) modifier = Modifier.align(Alignment.CenterHorizontally)
) { ) {
Text(text = stringResource(R.string.activate_org_profile)) Text(text = stringResource(R.string.activate_org_profile))
@@ -201,63 +173,24 @@ fun Shizuku(navCtrl: NavHostController) {
} }
} }
private fun checkPermission(context: Context): String { fun bindShizukuService(context: Context, shizukuBinder: MutableStateFlow<IBinder?>) {
if(checkShizukuStatus() == -1) { return context.getString(R.string.shizuku_not_started) }
return shizukuService.value.let {
if(it == null) {
context.getString(R.string.shizuku_not_bind)
} else {
when(it.uid) {
2000 -> context.getString(R.string.shizuku_activated_shell)
0 -> context.getString(R.string.shizuku_activated_root)
else -> context.getString(R.string.unknown_status) + "\nUID: ${it.uid}"
}
}
}
}
fun checkShizukuStatus(): Int {
val status = try {
if(Shizuku.checkSelfPermission() == PackageManager.PERMISSION_GRANTED) { waitGrantPermission = false; 1 }
else if(Shizuku.shouldShowRequestPermissionRationale()) { 0 }
else{
if(!waitGrantPermission) { Shizuku.requestPermission(0) }
waitGrantPermission = true
0
}
} catch(_: Exception) { -1 }
return status
}
fun userServiceControl(context:Context, status:Boolean) {
if(checkShizukuStatus() != 1) { return }
val userServiceConnection = object : ServiceConnection { val userServiceConnection = object : ServiceConnection {
override fun onServiceConnected(componentName: ComponentName, binder: IBinder) { override fun onServiceConnected(componentName: ComponentName, binder: IBinder) {
if (binder.pingBinder()) { shizukuBinder.value = binder
shizukuService.value = IUserService.Stub.asInterface(binder)
} else {
Toast.makeText(context, R.string.invalid_binder, Toast.LENGTH_SHORT).show()
}
} }
override fun onServiceDisconnected(componentName: ComponentName) { override fun onServiceDisconnected(componentName: ComponentName) {
shizukuService.value = null shizukuBinder.value = null
Toast.makeText(context, R.string.shizuku_service_disconnected, Toast.LENGTH_SHORT).show() Toast.makeText(context, R.string.shizuku_service_disconnected, Toast.LENGTH_SHORT).show()
} }
} }
val userServiceArgs = Shizuku.UserServiceArgs( val userServiceArgs = Shizuku.UserServiceArgs(ComponentName(context, ShizukuService::class.java))
ComponentName(
context.packageName,ShizukuService::class.java.name
)
)
.daemon(false) .daemon(false)
.processNameSuffix("service") .processNameSuffix("shizuku-service")
.debuggable(true) .debuggable(false)
.version(26) .version(26)
try { try {
if(status) { Shizuku.bindUserService(userServiceArgs, userServiceConnection)
Shizuku.bindUserService(userServiceArgs, userServiceConnection) } catch(e: Exception) {
}else{ e.printStackTrace()
Shizuku.unbindUserService(userServiceArgs, userServiceConnection, false) }
}
} catch(_: Exception) { }
} }

View File

@@ -3,23 +3,18 @@ package com.bintianqi.owndroid.dpm
import android.system.Os import android.system.Os
import androidx.annotation.Keep import androidx.annotation.Keep
import com.bintianqi.owndroid.IUserService import com.bintianqi.owndroid.IUserService
import kotlinx.coroutines.flow.MutableStateFlow
import java.io.BufferedReader import java.io.BufferedReader
import java.io.InputStreamReader import java.io.InputStreamReader
val shizukuService = MutableStateFlow<IUserService?>(null)
@Keep @Keep
class ShizukuService: IUserService.Stub() { class ShizukuService: IUserService.Stub() {
override fun destroy() { }
override fun execute(command: String): String { override fun execute(command: String): String {
var result = "" var result = ""
val process: Process val process: Process
try { try {
process = Runtime.getRuntime().exec(command) process = Runtime.getRuntime().exec(command)
val exitCode = process.waitFor() val exitCode = process.waitFor()
if(exitCode != 0){ result += "Error: $exitCode" } if(exitCode != 0) { result += "Error: $exitCode" }
} catch(e: Exception) { } catch(e: Exception) {
e.printStackTrace() e.printStackTrace()
return e.toString() return e.toString()
@@ -34,11 +29,8 @@ class ShizukuService: IUserService.Stub() {
} catch(e: NullPointerException) { } catch(e: NullPointerException) {
e.printStackTrace() e.printStackTrace()
} }
if(result == "") { return "No result" }
return result return result
} }
override fun getUid(): Int { override fun getUid(): Int = Os.getuid()
return Os.getuid()
}
} }

View File

@@ -43,7 +43,6 @@
<string name="copy_command">Копировать команду</string> <string name="copy_command">Копировать команду</string>
<string name="package_name">Имя пакета</string> <string name="package_name">Имя пакета</string>
<string name="not_exist">Не существует</string> <string name="not_exist">Не существует</string>
<string name="unknown_status">Неизвестный статус</string>
<string name="copy">Копировать</string> <string name="copy">Копировать</string>
<string name="file_not_exist">Файл не существует</string> <string name="file_not_exist">Файл не существует</string>
<string name="io_exception">Ошибка ввода/вывода</string> <string name="io_exception">Ошибка ввода/вывода</string>
@@ -58,10 +57,12 @@
<string name="no">Нет</string> <string name="no">Нет</string>
<string name="previous">Предыдущий</string> <string name="previous">Предыдущий</string>
<string name="next">Следующий</string> <string name="next">Следующий</string>
<string name="on">On</string> <!--TODO--> <!--TODO-->
<string name="off">Off</string> <!--TODO--> <string name="on">On</string>
<string name="alias">Alias</string> <!--TODO--> <string name="off">Off</string>
<string name="unknown_error">Unknown error</string> <!--TODO--> <string name="alias">Alias</string>
<string name="unknown_error">Unknown error</string>
<string name="permission_denied">Permission denied</string>
<!--Разрешения--> <!--Разрешения-->
@@ -109,19 +110,13 @@
<string name="dhizuku_permission_not_granted">Разрешение Dhizuku не предоставлено</string> <string name="dhizuku_permission_not_granted">Разрешение Dhizuku не предоставлено</string>
<string name="dhizuku_mode_disabled">Режим Dhizuku отключен</string> <string name="dhizuku_mode_disabled">Режим Dhizuku отключен</string>
<!--Shizuku--> <!--Shizuku-->
<string name="check_shizuku">Проверить разрешение</string>
<string name="list_owners">Список владельцев</string> <string name="list_owners">Список владельцев</string>
<string name="list_users">Список пользователей</string> <string name="list_users">Список пользователей</string>
<string name="list_accounts">Список аккаунтов</string> <string name="list_accounts">Список аккаунтов</string>
<string name="shizuku_not_started">Shizuku не запущен. </string> <string name="shizuku_not_started">Shizuku не запущен. </string>
<string name="shizuku_activated_shell">Разрешение предоставлено (Shell)</string>
<string name="shizuku_activated_root">Разрешение предоставлено (Root)</string>
<string name="activate_device_owner">Активировать владельца устройства</string> <string name="activate_device_owner">Активировать владельца устройства</string>
<string name="activate_org_profile">Активировать рабочий профиль, принадлежащий организации</string> <string name="activate_org_profile">Активировать рабочий профиль, принадлежащий организации</string>
<string name="shizuku_service_disconnected">Служба Shizuku отключена</string> <string name="shizuku_service_disconnected">Служба Shizuku отключена</string>
<string name="invalid_binder">Неверный binder</string>
<string name="bind_shizuku">Подключить Shizuku</string>
<string name="shizuku_not_bind">Shizuku отключен</string>
<!--Системные--> <!--Системные-->

View File

@@ -44,7 +44,6 @@
<string name="copy_command">Komutu Kopyala</string> <string name="copy_command">Komutu Kopyala</string>
<string name="package_name">Paket Adı</string> <string name="package_name">Paket Adı</string>
<string name="not_exist">Mevcut Değil</string> <string name="not_exist">Mevcut Değil</string>
<string name="unknown_status">Bilinmeyen Durum</string>
<string name="copy">Kopyala</string> <string name="copy">Kopyala</string>
<string name="file_not_exist">Dosya Mevcut Değil</string> <string name="file_not_exist">Dosya Mevcut Değil</string>
<string name="io_exception">G/Ç Hatası</string> <string name="io_exception">G/Ç Hatası</string>
@@ -53,16 +52,18 @@
<string name="allow_all">Tümünü İzin Ver</string> <string name="allow_all">Tümünü İzin Ver</string>
<string name="use_policy">Politika Kullan</string> <string name="use_policy">Politika Kullan</string>
<string name="account">Hesap</string> <string name="account">Hesap</string>
<string name="warning">Warning</string> <!--TODO--> <!--TODO-->
<string name="delete">Delete</string> <!--TODO--> <string name="warning">Warning</string>
<string name="yes">Yes</string> <!--TODO--> <string name="delete">Delete</string>
<string name="no">No</string> <!--TODO--> <string name="yes">Yes</string>
<string name="previous">Previous</string> <!--TODO--> <string name="no">No</string>
<string name="next">Next</string> <!--TODO--> <string name="previous">Previous</string>
<string name="on">On</string> <!--TODO--> <string name="next">Next</string>
<string name="off">Off</string> <!--TODO--> <string name="on">On</string>
<string name="alias">Alias</string> <!--TODO--> <string name="off">Off</string>
<string name="unknown_error">Unknown error</string> <!--TODO--> <string name="alias">Alias</string>
<string name="unknown_error">Unknown error</string>
<string name="permission_denied">Permission denied</string>
<!--Permissions--> <!--Permissions-->
<string name="click_to_activate">Etkinleştirmek İçin Tıklayın</string> <string name="click_to_activate">Etkinleştirmek İçin Tıklayın</string>
@@ -111,19 +112,13 @@
<string name="dhizuku_mode_disabled">Dhizuku mode disabled</string> <string name="dhizuku_mode_disabled">Dhizuku mode disabled</string>
<!--Shizuku--> <!--Shizuku-->
<string name="check_shizuku">İzni Kontrol Et</string>
<string name="list_owners">Sahipleri Listele</string> <string name="list_owners">Sahipleri Listele</string>
<string name="list_users">List users</string> <!--TODO--> <string name="list_users">List users</string> <!--TODO-->
<string name="list_accounts">List accounts</string> <!--TODO--> <string name="list_accounts">List accounts</string> <!--TODO-->
<string name="shizuku_not_started">Shizuku Başlatılmadı. </string> <string name="shizuku_not_started">Shizuku Başlatılmadı. </string>
<string name="shizuku_activated_shell">İzin Verildi (Kabuk)</string>
<string name="shizuku_activated_root">İzin Verildi (Root)</string>
<string name="activate_device_owner">Cihaz Sahibini Etkinleştir</string> <string name="activate_device_owner">Cihaz Sahibini Etkinleştir</string>
<string name="activate_org_profile">Kuruluş Profili Sahibini Etkinleştir</string> <string name="activate_org_profile">Kuruluş Profili Sahibini Etkinleştir</string>
<string name="shizuku_service_disconnected">Shizuku Hizmeti Bağlantısı Kesildi</string> <string name="shizuku_service_disconnected">Shizuku Hizmeti Bağlantısı Kesildi</string>
<string name="invalid_binder">Geçersiz Bağlayıcı</string>
<string name="bind_shizuku">Shizuku\'ya Bağlan</string>
<string name="shizuku_not_bind">Shizuku Bağlantısı Kesildi</string>
<!--System--> <!--System-->
<string name="system">Sistem</string> <string name="system">Sistem</string>

View File

@@ -41,7 +41,6 @@
<string name="developing">功能开发中</string> <string name="developing">功能开发中</string>
<string name="options">选项</string> <string name="options">选项</string>
<string name="copy_command">复制代码</string> <string name="copy_command">复制代码</string>
<string name="unknown_status">未知状态</string>
<string name="copy">复制</string> <string name="copy">复制</string>
<string name="file_not_exist">文件不存在</string> <string name="file_not_exist">文件不存在</string>
<string name="io_exception">IO异常</string> <string name="io_exception">IO异常</string>
@@ -60,6 +59,7 @@
<string name="off">关闭</string> <string name="off">关闭</string>
<string name="alias">别名</string> <string name="alias">别名</string>
<string name="unknown_error">未知错误</string> <string name="unknown_error">未知错误</string>
<string name="permission_denied">无权限</string>
<!--Permissions--> <!--Permissions-->
<string name="click_to_activate">点击以激活</string> <string name="click_to_activate">点击以激活</string>
@@ -106,19 +106,13 @@
<string name="dhizuku_mode_disabled">Dhizuku模式已禁用</string> <string name="dhizuku_mode_disabled">Dhizuku模式已禁用</string>
<!--Shizuku--> <!--Shizuku-->
<string name="check_shizuku">检查Shizuku</string>
<string name="list_owners">列出Owners</string> <string name="list_owners">列出Owners</string>
<string name="list_users">列出用户</string> <string name="list_users">列出用户</string>
<string name="list_accounts">列出账号</string> <string name="list_accounts">列出账号</string>
<string name="shizuku_not_started">服务未启动</string> <string name="shizuku_not_started">服务未启动</string>
<string name="shizuku_activated_shell">已授权Shell</string>
<string name="shizuku_activated_root">已授权Root</string>
<string name="activate_device_owner">激活Device owner</string> <string name="activate_device_owner">激活Device owner</string>
<string name="activate_org_profile">激活由组织拥有的工作资料</string> <string name="activate_org_profile">激活由组织拥有的工作资料</string>
<string name="shizuku_service_disconnected">Shizuku服务断开连接</string> <string name="shizuku_service_disconnected">Shizuku服务断开连接</string>
<string name="shizuku_not_bind">Shizuku未连接</string>
<string name="invalid_binder">无效Binder</string>
<string name="bind_shizuku">连接Shizuku</string>
<!--System--> <!--System-->
<string name="system">系统</string> <string name="system">系统</string>

View File

@@ -44,7 +44,6 @@
<string name="copy_command">Copy Command</string> <string name="copy_command">Copy Command</string>
<string name="package_name">Package name</string> <string name="package_name">Package name</string>
<string name="not_exist">Not exist</string> <string name="not_exist">Not exist</string>
<string name="unknown_status">Unknown status</string>
<string name="copy">Copy</string> <string name="copy">Copy</string>
<string name="file_not_exist">File not exist</string> <string name="file_not_exist">File not exist</string>
<string name="io_exception">IO Exception</string> <string name="io_exception">IO Exception</string>
@@ -63,6 +62,7 @@
<string name="off">Off</string> <string name="off">Off</string>
<string name="alias">Alias</string> <string name="alias">Alias</string>
<string name="unknown_error">Unknown error</string> <string name="unknown_error">Unknown error</string>
<string name="permission_denied">Permission denied</string>
<!--Permissions--> <!--Permissions-->
<string name="click_to_activate">Click to activate</string> <string name="click_to_activate">Click to activate</string>
@@ -114,21 +114,15 @@
<string name="dhizuku_mode_disabled">Dhizuku mode disabled</string> <string name="dhizuku_mode_disabled">Dhizuku mode disabled</string>
<!--Shizuku--> <!--Shizuku-->
<string name="shizuku" translatable="false">Shizuku</string> <string name="shizuku" translatable="false">Shizuku</string>
<string name="check_shizuku">Check permission</string>
<string name="list_owners">List owners</string> <string name="list_owners">List owners</string>
<string name="list_users">List users</string> <string name="list_users">List users</string>
<string name="list_accounts">List accounts</string> <string name="list_accounts">List accounts</string>
<string name="shizuku_not_started">Shizuku not started. </string> <string name="shizuku_not_started">Shizuku not started. </string>
<string name="dpm_activate_do_command" translatable="false">dpm set-device-owner com.bintianqi.owndroid/com.bintianqi.owndroid.Receiver</string> <string name="dpm_activate_do_command" translatable="false">dpm set-device-owner com.bintianqi.owndroid/com.bintianqi.owndroid.Receiver</string>
<string name="dpm_activate_da_command" translatable="false">dpm set-active-admin com.bintianqi.owndroid/com.bintianqi.owndroid.Receiver</string> <string name="dpm_activate_da_command" translatable="false">dpm set-active-admin com.bintianqi.owndroid/com.bintianqi.owndroid.Receiver</string>
<string name="shizuku_activated_shell">Permission granted (Shell)</string>
<string name="shizuku_activated_root">Permission granted (Root)</string>
<string name="activate_device_owner">Activate Device owner</string> <string name="activate_device_owner">Activate Device owner</string>
<string name="activate_org_profile">Activate organization-owned work profile</string> <string name="activate_org_profile">Activate organization-owned work profile</string>
<string name="shizuku_service_disconnected">Shizuku service disconnected</string> <string name="shizuku_service_disconnected">Shizuku service disconnected</string>
<string name="invalid_binder">Invalid binder</string>
<string name="bind_shizuku">Connect Shizuku</string>
<string name="shizuku_not_bind">Shizuku disconnected</string>
<!--System--> <!--System-->
<string name="system">System</string> <string name="system">System</string>