首页 > 解决方案 > 如何在 android 代码中运行特定的 adb 命令?我有权限问题

问题描述

我想在我的应用程序中运行特定的命令(adb)。

    override fun onReceive(context: Context?, intent: Intent?) {
        intent?.let {
            if (it.action.equals(Intent.ACTION_BOOT_COMPLETED)) {
                with(Intent(context, MainService::class.java)) {
                    logger.warn("riorio - android boot completed")

                    var process = Runtime.getRuntime()
                        .exec("adb shell app_process -Djava.class.path=/data/local/tmp/classes.dex /system/bin com.sds.agent.Main #")
                    process.waitFor()
                    logger.warn("riorio - shell server start")

                }
            }
        }
    }


此代码会导致错误。查看错误日志,该命令似乎存在权限问题。

下面是错误日志。

2019-09-16 19:50:07.826 8518-8518/com.sds.agent W/com.sds.agent.receiver.AutorunReceiver: riorio - android boot completed
2019-09-16 19:50:07.832 8518-8518/com.sds.agent E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.sds.agent, PID: 8518
    java.lang.RuntimeException: Unable to start receiver com.sds.agent.receiver.AutorunReceiver: java.io.IOException: Cannot run program "adb": error=13, Permission denied
        at android.app.ActivityThread.handleReceiver(ActivityThread.java:3313)
        at android.app.ActivityThread.-wrap20(ActivityThread.java)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1719)
        at android.os.Handler.dispatchMessage(Handler.java:102)
        at android.os.Looper.loop(Looper.java:154)
        at android.app.ActivityThread.main(ActivityThread.java:6692)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1468)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1358)
     Caused by: java.io.IOException: Cannot run program "adb": error=13, Permission denied
        at java.lang.ProcessBuilder.start(ProcessBuilder.java:983)
        at java.lang.Runtime.exec(Runtime.java:691)
        at java.lang.Runtime.exec(Runtime.java:524)
        at java.lang.Runtime.exec(Runtime.java:421)
        at com.sds.agent.receiver.AutorunReceiver.onReceive(AutorunReceiver.kt:31)
        at android.app.ActivityThread.handleReceiver(ActivityThread.java:3306)
        at android.app.ActivityThread.-wrap20(ActivityThread.java) 
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1719) 
        at android.os.Handler.dispatchMessage(Handler.java:102) 
        at android.os.Looper.loop(Looper.java:154) 
        at android.app.ActivityThread.main(ActivityThread.java:6692) 
        at java.lang.reflect.Method.invoke(Native Method) 
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1468) 
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1358) 
     Caused by: java.io.IOException: error=13, Permission denied
        at java.lang.UNIXProcess.forkAndExec(Native Method)
        at java.lang.UNIXProcess.<init>(UNIXProcess.java:133)
        at java.lang.ProcessImpl.start(ProcessImpl.java:128)
        at java.lang.ProcessBuilder.start(ProcessBuilder.java:964)
        at java.lang.Runtime.exec(Runtime.java:691) 
        at java.lang.Runtime.exec(Runtime.java:524) 
        at java.lang.Runtime.exec(Runtime.java:421) 
        at com.sds.agent.receiver.AutorunReceiver.onReceive(AutorunReceiver.kt:31) 
        at android.app.ActivityThread.handleReceiver(ActivityThread.java:3306) 
        at android.app.ActivityThread.-wrap20(ActivityThread.java) 
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1719) 
        at android.os.Handler.dispatchMessage(Handler.java:102) 
        at android.os.Looper.loop(Looper.java:154) 
        at android.app.ActivityThread.main(ActivityThread.java:6692) 
        at java.lang.reflect.Method.invoke(Native Method) 
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1468) 
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1358) 

如何获得在 android 应用程序中运行“adb”的访问权限?可能吗?

标签: androidpermissionsadb

解决方案


我认为您不必指定它是 adb 命令。像这样的东西可以解决问题

var process = Runtime.getRuntime().exec("app_process -Djava.class.path=/data/local/tmp/classes.dex /system/bin com.sds.agent.Main #")
process.waitFor()

推荐阅读