java.lang.SecurityException 使用 appium 和 adb 绑定启动某些应用程序时会发生

java.lang.SecurityException will occur when tying to launch some applications with appium and adb

我使用 appium 编写了一个启动应用程序的基本脚本,它对某些应用程序非常有用,但当我尝试启动某些应用程序时它会出错 我用两个应用程序尝试了我的脚本

  1. Angry Birds Rio
  2. Medium App

我通过 adb(android debug bridge) 工具找到了 appPackage 和 appActivity 值

愤怒的小鸟应用程序

mCurrentFocus=Window{11fff76 u0 com.rovio.angrybirdsrio/com.rovio.fusion.App}

中等应用程序

mCurrentFocus=Window{af3c82 u0 com.medium.reader/com.medium.android.donkey.read.HomeActivity5}

这是我写的脚本

public static void main(String[] args) throws MalformedURLException,InterruptedException {

    DesiredCapabilities capabilities = new DesiredCapabilities();
    capabilities.setCapability("platformName", "Android"); 
    capabilities.setCapability("platformVersion", "8.1.0");
    capabilities.setCapability("deviceName", "Android SDK built for x86");
    capabilities.setCapability("udid", "emulator-5554");
    capabilities.setCapability("appPackage", "com.medium.reader");
    capabilities.setCapability("appActivity", "com.medium.android.donkey.read.HomeActivity5 t69");
    capabilities.setCapability("noReset", "true");
    capabilities.setCapability("autoWebview", "true");

    URL url = new URL("http://0.0.0.0:4723/wd/hub");

    AppiumDriver<WebElement> driver  = new AndroidDriver<WebElement>(url,capabilities); 
    driver.context("com.medium.android.donkey.read.HomeActivity5");

} 

当我为 Angry Birds 应用程序使用 appPackage 和 appActivity 时,该应用程序将毫无问题地在模拟器中启动,但如果我为中型应用程序使用 appPackage 和 appActivity,脚本将给出 java.lang.SecurityException:权限被拒绝:启动 Intent 错误

在尝试解决问题后 I found out that 我必须在 AndroidManifest.xml 中设置 android:exported="true" ,我不确定我是否可以这样做,因为我可以没有我试图自动化的任何应用程序的源代码

另一个建议是尝试通过 adb(android 设备桥)启动应用程序,我尝试通过 adb 启动这两个应用程序应用程序,结果相同 Angry birds 应用程序启动时没有任何问题,但 Medium app was not launched 这里是错误

java.lang.SecurityException: Permission Denial: starting Intent { flg=0x10000000 cmp=com.medium.reader/com.medium.android.donkey.read.HomeActivity5 } from null (pid=16084, uid=2000) not exported from uid 10084
at com.android.server.am.ActivityStackSupervisor.checkStartAnyActivityPermission(ActivityStackSupervisor.java:1632)
at com.android.server.am.ActivityStarter.startActivity(ActivityStarter.java:438)
at com.android.server.am.ActivityStarter.startActivityLocked(ActivityStarter.java:278)
at com.android.server.am.ActivityStarter.startActivityMayWait(ActivityStarter.java:817)
at com.android.server.am.ActivityManagerService.startActivityAndWait(ActivityManagerService.java:4625)
at com.android.server.am.ActivityManagerShellCommand.runStartActivity(ActivityManagerShellCommand.java:412)
at com.android.server.am.ActivityManagerShellCommand.onCommand(ActivityManagerShellCommand.java:141)
at android.os.ShellCommand.exec(ShellCommand.java:96)
at com.android.server.am.ActivityManagerService.onShellCommand(ActivityManagerService.java:15014)
at android.os.Binder.shellCommand(Binder.java:594)
at android.os.Binder.onTransact(Binder.java:492)
at android.app.IActivityManager$Stub.onTransact(IActivityManager.java:4243)
at com.android.server.am.ActivityManagerService.onTransact(ActivityManagerService.java:2919)
at android.os.Binder.execTransact(Binder.java:697)

我可以通过 adb 或 appium 启动任何应用程序吗?

当您尝试启动非主应用程序Activity时,您会遇到这种错误Activity。

You must put the main appActivity in your desired capability.

您可以通过以下方式找到应用 activity:

>adb shell 
>dumpsys package | grep -i "app Package name here" | grep Activity

//对于你的情况,你可以使用:

>dumpsys package | grep -i com.rovio.angrybirdsrio | grep Activity
>dumpsys package | grep -i com.medium.reader | grep Activity