From 2582116a9d3fca0d627f73743d74504a255eaeae Mon Sep 17 00:00:00 2001 From: BinTianqi <1220958406@qq.com> Date: Sun, 3 Mar 2024 14:56:39 +0800 Subject: [PATCH] remove shizuku-api dependency --- Guide.md | 7 +- app/build.gradle.kts | 19 +++--- app/src/main/AndroidManifest.xml | 7 -- .../com/binbin/androidowner/MainActivity.kt | 14 ---- .../binbin/androidowner/ShizukuActivate.kt | 66 ++++++------------- .../com/binbin/androidowner/ShizukuUtil.java | 16 ----- app/src/main/res/values/strings.xml | 9 +-- 7 files changed, 35 insertions(+), 103 deletions(-) delete mode 100644 app/src/main/java/com/binbin/androidowner/ShizukuUtil.java diff --git a/Guide.md b/Guide.md index 49242b9..928b0e9 100644 --- a/Guide.md +++ b/Guide.md @@ -146,7 +146,7 @@ adb shell dpm remove-active-admin com.binbin.androidowner/com.binbin.androidowne 请自己学习如何启动[Shizuku](https://github.com/RikkaApps/Shizuku) -检查权限时如果返回“请更新Shizuku”,说明你的Shizuku版本小于v11,建议更新Shizuku。如果你的安卓版本不支持新的Shizuku,你仍然可以尝试使用下面这些功能 +如果Shizuku正在运行但是Android owner无法申请权限,请关闭Shizuku和Android owner的电池优化(这种情况在非原生系统中比较常见) 功能: @@ -154,12 +154,13 @@ adb shell dpm remove-active-admin com.binbin.androidowner/com.binbin.androidowne - 激活Profile owner - 激活Device admin - 激活[由组织拥有的工作资料](#由组织拥有的工作资料) +- 列出所有Device owner和Profile owner Shizuku的本质是ADB。在安卓10或以下,你还是要连接电脑激活Shizuku -不能在非主用户中使用,即使检查权限返回“已授权” +不能在非主用户中使用 -因为作者懒得研究Shizuku-API,所以直接套壳了rish。因为是套壳的rish,所以不支持Sui +因为作者懒得研究Shizuku-API,所以Android owner没有添加任何Shizuku相关依赖。以上功能均是通过rish实现。因为是套壳的rish,所以不支持Sui ### 设备唯一标识码 diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 4e8db25..15bb4c3 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -11,8 +11,8 @@ android { applicationId = "com.binbin.androidowner" minSdk = 21 targetSdk = 34 - versionCode = 17 - versionName = "4.0" + versionCode = 18 + versionName = "4.1" testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" vectorDrawables { @@ -55,23 +55,20 @@ android { dependencies { implementation("org.apache.commons:commons-io:1.3.2") - val shizukuVersion = "13.1.5" - implementation("dev.rikka.shizuku:api:$shizukuVersion") - implementation("dev.rikka.shizuku:provider:$shizukuVersion") implementation("androidx.core:core-ktx:1.12.0") - implementation("androidx.lifecycle:lifecycle-runtime-ktx:2.6.2") + implementation("androidx.lifecycle:lifecycle-runtime-ktx:2.7.0") implementation("androidx.activity:activity-compose:1.8.2") - implementation(platform("androidx.compose:compose-bom:2023.08.00")) + implementation(platform("androidx.compose:compose-bom:2024.02.01")) implementation("androidx.compose.ui:ui") implementation("androidx.compose.ui:ui-graphics") debugImplementation("androidx.compose.ui:ui-tooling-preview") - implementation("androidx.compose.material3:material3:1.1.2") - implementation("androidx.navigation:navigation-compose:2.7.6") + implementation("androidx.compose.material3:material3:1.2.0") + implementation("androidx.navigation:navigation-compose:2.7.7") testImplementation("junit:junit:4.13.2") androidTestImplementation("androidx.test.ext:junit:1.1.5") androidTestImplementation("androidx.test.espresso:espresso-core:3.5.1") - androidTestImplementation(platform("androidx.compose:compose-bom:2023.08.00")) + androidTestImplementation(platform("androidx.compose:compose-bom:2024.02.01")) androidTestImplementation("androidx.compose.ui:ui-test-junit4") debugImplementation("androidx.compose.ui:ui-tooling") - debugImplementation("androidx.compose.ui:ui-test-manifest:1.6.0") + debugImplementation("androidx.compose.ui:ui-test-manifest:1.6.2") } \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index b12fe85..712b992 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -73,12 +73,5 @@ - diff --git a/app/src/main/java/com/binbin/androidowner/MainActivity.kt b/app/src/main/java/com/binbin/androidowner/MainActivity.kt index 2074f9b..5ca7153 100644 --- a/app/src/main/java/com/binbin/androidowner/MainActivity.kt +++ b/app/src/main/java/com/binbin/androidowner/MainActivity.kt @@ -40,7 +40,6 @@ import androidx.navigation.compose.composable import androidx.navigation.compose.currentBackStackEntryAsState import androidx.navigation.compose.rememberNavController import com.binbin.androidowner.ui.theme.AndroidOwnerTheme -import rikka.shizuku.Shizuku import java.io.FileNotFoundException import java.io.IOException import java.io.InputStream @@ -57,22 +56,9 @@ var caCert = byteArrayOf() @ExperimentalMaterial3Api class MainActivity : ComponentActivity() { - override fun onDestroy() { - super.onDestroy() - if(VERSION.SDK_INT>=24){ - Shizuku.removeBinderReceivedListener(ShizukuUtil.binderReceivedListener) - Shizuku.removeBinderDeadListener(ShizukuUtil.binderDeadListener) - Shizuku.removeRequestPermissionResultListener(ShizukuUtil.requestPermissionListener) - } - } override fun onCreate(savedInstanceState: Bundle?) { WindowCompat.setDecorFitsSystemWindows(window, false) super.onCreate(savedInstanceState) - if(VERSION.SDK_INT>=24){ - Shizuku.addBinderReceivedListenerSticky(ShizukuUtil.binderReceivedListener) - Shizuku.addBinderDeadListener(ShizukuUtil.binderDeadListener) - Shizuku.addRequestPermissionResultListener(ShizukuUtil.requestPermissionListener) - } getUserIcon = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { userIconUri = it.data?.data if(userIconUri==null){ Toast.makeText(applicationContext, "空URI", Toast.LENGTH_SHORT).show() } diff --git a/app/src/main/java/com/binbin/androidowner/ShizukuActivate.kt b/app/src/main/java/com/binbin/androidowner/ShizukuActivate.kt index 45db6fe..bb14026 100644 --- a/app/src/main/java/com/binbin/androidowner/ShizukuActivate.kt +++ b/app/src/main/java/com/binbin/androidowner/ShizukuActivate.kt @@ -4,7 +4,6 @@ import android.app.admin.DevicePolicyManager import android.content.ComponentName import android.content.Context import android.content.Context.MODE_PRIVATE -import android.content.pm.PackageManager import android.os.Binder import android.os.Build.VERSION import android.widget.Toast @@ -40,7 +39,6 @@ import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch import kotlinx.coroutines.withContext import org.apache.commons.io.IOUtils -import rikka.shizuku.Shizuku import java.io.* @Composable @@ -57,7 +55,7 @@ fun ShizukuActivate(){ val coScope = rememberCoroutineScope() val scrollState = rememberScrollState() val outputTextScrollState = rememberScrollState() - Column(modifier = Modifier.verticalScroll(scrollState)){ + Column(modifier = Modifier.fillMaxSize().verticalScroll(scrollState), horizontalAlignment = Alignment.CenterHorizontally){ var outputText by remember{mutableStateOf("")} if(Binder.getCallingUid()/100000!=0){ Row(modifier = sections(colorScheme.errorContainer), verticalAlignment = Alignment.CenterVertically){ @@ -66,19 +64,25 @@ fun ShizukuActivate(){ } } - var launchPermissionCheck by remember{mutableStateOf(false)} - LaunchedEffect(launchPermissionCheck){ - if(launchPermissionCheck){ - outputText = checkPermission(myContext) - scrollState.animateScrollTo(scrollState.maxValue, scrollAnim()) - launchPermissionCheck=false - } - } Button( - onClick = {launchPermissionCheck=true}, - enabled = VERSION.SDK_INT>=24, modifier = Modifier.fillMaxWidth().padding(horizontal = 8.dp) + onClick = { + coScope.launch { + scrollState.animateScrollTo(scrollState.maxValue, scrollAnim()) + outputTextScrollState.animateScrollTo(0, scrollAnim()) + val getUid = executeCommand(myContext, "sh rish.sh","id -u",null,filesDir) + outputText = if(getUid.contains("2000")){ + myContext.getString(R.string.shizuku_activated_shell) + }else if(getUid.contains("0")){ + myContext.getString(R.string.shizuku_activated_root) + }else if(getUid.contains("Error: 1")){ + myContext.getString(R.string.shizuku_not_started) + }else{ + getUid + } + } + } ) { - Text(text = stringResource(R.string.check_permission)) + Text(text = stringResource(R.string.check_shizuku)) } if(!isDeviceOwner(myDpm)&&!isProfileOwner(myDpm)){ @@ -160,7 +164,6 @@ fun ShizukuActivate(){ } } - Button( onClick = { coScope.launch{ @@ -168,27 +171,12 @@ fun ShizukuActivate(){ scrollState.animateScrollTo(scrollState.maxValue, scrollAnim()) outputTextScrollState.animateScrollTo(0, scrollAnim()) } - }, - modifier = Modifier.fillMaxWidth().padding(horizontal = 8.dp) + } ) { Text(text = stringResource(R.string.list_owners)) } - Button( - onClick = { - coScope.launch { - outputText= myContext.getString(R.string.should_contain_2000_or_0) - scrollState.animateScrollTo(scrollState.maxValue, scrollAnim()) - outputTextScrollState.animateScrollTo(0, scrollAnim()) - outputText+=executeCommand(myContext, "sh rish.sh","id",null,filesDir) - } - }, - modifier = Modifier.align(Alignment.CenterHorizontally) - ) { - Text(text = stringResource(R.string.test_rish)) - } - - SelectionContainer(modifier = Modifier.horizontalScroll(outputTextScrollState)){ + SelectionContainer(modifier = Modifier.align(Alignment.Start).horizontalScroll(outputTextScrollState)){ Text(text = outputText, style = bodyTextStyle, softWrap = false, modifier = Modifier.padding(4.dp)) } @@ -218,20 +206,6 @@ fun extractRish(myContext:Context){ if(VERSION.SDK_INT>=34){ Runtime.getRuntime().exec("chmod 400 rish_shizuku.dex",null,myContext.filesDir) } } -private fun checkPermission(myContext: Context):String { - return if(Shizuku.isPreV11()) { - myContext.getString(R.string.please_update_shizuku) - }else{ - try{ - if(Shizuku.checkSelfPermission()==PackageManager.PERMISSION_GRANTED) { - val permission = when(Shizuku.getUid()){ 0->"Root"; 2000->"Shell"; else->myContext.getString(R.string.unknown) } - myContext.getString(R.string.shizuku_permission_granted, Shizuku.getVersion().toString(), permission) - }else if(Shizuku.shouldShowRequestPermissionRationale()){ myContext.getString(R.string.denied) } - else{ Shizuku.requestPermission(0); myContext.getString(R.string.request_permission) } - }catch(e: Throwable){ myContext.getString(R.string.shizuku_not_started) } - } -} - suspend fun executeCommand(myContext: Context, command: String, subCommand:String, env: Array?, dir:File?): String { var result = "" val tunnel:ByteArrayInputStream diff --git a/app/src/main/java/com/binbin/androidowner/ShizukuUtil.java b/app/src/main/java/com/binbin/androidowner/ShizukuUtil.java deleted file mode 100644 index 8b8a668..0000000 --- a/app/src/main/java/com/binbin/androidowner/ShizukuUtil.java +++ /dev/null @@ -1,16 +0,0 @@ -package com.binbin.androidowner; - -import android.content.pm.PackageManager; -import android.util.Log; -import rikka.shizuku.Shizuku; - -public class ShizukuUtil { - private static void onRequestPermissionsResult(int requestCode, int grantResult) { - boolean granted = PackageManager.PERMISSION_GRANTED == grantResult; - Log.d("ShizukuUtil","RequestCode: "+requestCode); - Log.d("ShizukuUtil","GrantState: "+granted); - } - static final Shizuku.OnRequestPermissionResultListener requestPermissionListener = ShizukuUtil::onRequestPermissionsResult; - static final Shizuku.OnBinderReceivedListener binderReceivedListener = () -> Log.d("ShizukuUtil","Binder received"); - static final Shizuku.OnBinderDeadListener binderDeadListener = () -> Log.e("ShizukuUtil","Binder dead"); -} diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 43c0fd8..4a7a202 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -80,14 +80,9 @@ Shizuku 暂不支持在非主用户中使用Shizuku - 检查权限 + 检查Shizuku 请输入工作资料的UserID 列出Owners - 下面应该出现一行包含“2000”或“0”的文本\n - 测试rish - 请更新Shizuku - Shizuku v%1$s\n已授权(%2$s) - 请求授权 服务未启动 dpm mark-profile-owner-on-organization-owned-device --user %1$s com.binbin.androidowner/com.binbin.androidowner.MyDeviceAdminReceiver @@ -95,6 +90,8 @@ dpm set-device-owner com.binbin.androidowner/com.binbin.androidowner.MyDeviceAdminReceiver dpm set-profile-owner com.binbin.androidowner/com.binbin.androidowner.MyDeviceAdminReceiver dpm set-active-admin com.binbin.androidowner/com.binbin.androidowner.MyDeviceAdminReceiver + 已授权(Shell) + 已授权(Root) 系统