背景:想要在android apk中直接使用adb指令,从而不需要把手机通过数据线方式连接到电脑,在电脑端执行adb指令。
一、权限相关
想要在apk代码中执行adb命令,涉及到执行权限。
- 首先手机需要有root权限。
- 其次就算手机已经root了,但默认运行所有命令时都仍然是普通用户身份,除非显式地切换到root用户。
所以就需要对手机进行刷root,并在apk代码中执行“su root”提权。
二、demo
demo中演示的是在apk中执行通过adb启动某个应用的页面,即“adb shell am start -n packagename”。
1、没有root权限的手机 & 没有提权“su root”
printLog.setOnClickListener {
Log.e("liuqinhou", "按钮被点击了")
//Runtime.getRuntime().exec("su root") //提升到root权限
Runtime.getRuntime().exec("am start --user 0 -n com.crland.androiddemo2/com.crland.androiddemo2.MainActivity")
}
执行后,app无响应,相关log如下:
2、没有root权限的手机 & 提权“su root”
printLog.setOnClickListener {
Log.e("liuqinhou", "按钮被点击了")
Runtime.getRuntime().exec("su root") //提升到root权限
Runtime.getRuntime().exec("am start --user 0 -n com.crland.androiddemo2/com.crland.androiddemo2.MainActivity")
}
执行后,app闪退,报错内容如下
3、root权限的手机 & 提权“su root”
printLog.setOnClickListener {
Log.e("liuqinhou", "按钮被点击了")
Runtime.getRuntime().exec("su root") //提升到root权限
Runtime.getRuntime().exec("am start --user 0 -n com.crland.androiddemo2/com.crland.androiddemo2.MainActivity")
}
adb指令执行成功,可以通过adb方式正常打开页面com.crland.androiddemo2/com.crland.androiddemo2.MainActivity
三、--user 0介绍
你应该注意到了,上面的adb指令使用了参数--user 0。假如不加这个参数,点击按钮无响应,详细log如下:
printLog.setOnClickListener {
Log.e("liuqinhou", "按钮被点击了")
//Runtime.getRuntime().exec("su root") //提升到root权限
Runtime.getRuntime().exec("am start -n com.crland.androiddemo2/com.crland.androiddemo2.MainActivity\n")
}
W/ActivityManager: Permission Denial: startActivityAsUser asks to run as user -2 but is calling from user 0; this requires android.permission.INTERACT_ACROSS_USERS_FULL
在stackoverflow上查询“Permission Denial: startActivity asks to run as user -2 but is calling from user 0; this requires android.permission.INTERACT_ACROSS_USERS_FULL”找到了一篇帖子,里面介绍了解决方案:
看log还需要配置"android.permission.INTERACT_ACROSS_USERS_FULL"权限,但是我实际运行的时候不配置也没关系。所以这个感觉可加可不加吧。
<uses-permission android:name="android.permission.INTERACT_ACROSS_USERS_FULL"
tools:ignore="ProtectedPermissions" />
而且看介绍,这个权限似乎只有系统应用apk才有权限。
参考文章:
1、在Android中使用adb命令时关于权限方面的一些总结
2、https://stackoverflow.com/questions/18179159/permission-denial-startactivity-asks-to-run-as-user-2-but-is-calling-from-user