使用Appium自动化APK时遭遇SecurityException权限拒绝问题求助
Appium启动APK时遇到SecurityException权限拒绝问题
错误日志
Exception occurred while executing 'start': [debug] [W3C] java.lang.SecurityException: Permission Denial: starting Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x10200000 cmp=com.pnr.engproverbsandsayings/.EngProverbsActivity } from null (pid=10400, uid=2000) not exported from uid 10151 [debug] [W3C] at com.android.server.wm.ActivityTaskSupervisor.checkStartAnyActivityPermission(ActivityTaskSupervisor.java:1047) [debug] [W3C] at com.android.server.wm.ActivityStarter.executeRequest(ActivityStarter.java:975) [debug] [W3C] at com.android.server.wm.ActivityStarter.execute(ActivityStarter.java:665) [debug] [W3C] at com.android.server.wm.ActivityTaskManagerService.startActivityAndWait(ActivityTaskManagerService.java:1441) [debug] [W3C] at com.android.server.am.ActivityManagerService.startActivityAndWait(ActivityManagerService.java:2935)
执行的Java代码
AppiumDriver<MobileElement> driver = null; DesiredCapabilities desiredCapabilities = new DesiredCapabilities(); desiredCapabilities.setCapability(MobileCapabilityType.PLATFORM_NAME, "ANDROID"); desiredCapabilities.setCapability("appPackage", "com.pnr.engproverbsandsayings"); desiredCapabilities.setCapability("appActivity", "com.pnr.engproverbsandsayings.EngProverbsActivity"); try { URL url = new URL("http://127.0.0.1:4723/wd/hub"); driver = new AndroidDriver<MobileElement>(url, desiredCapabilities); System.out.println("Appium started"); } catch (Exception e) { System.out.println(e.getMessage()); }
对应APK的AndroidManifest.xml内容
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.myapplication"> <application android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:roundIcon="@mipmap/ic_launcher_round" android:supportsRtl="true" android:theme="@style/Theme.MyApplication"> <activity android:name=".MainActivity" android:exported="true" android:label="@string/app_name" android:theme="@style/Theme.MyApplication.NoActionBar"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> </manifest>
已尝试情况
已尝试过相关解决方案,但均无效,现寻求有效解决方法。
解决方法
1. 修正目标Activity的导出配置
错误核心是EngProverbsActivity未设置android:exported="true",从你提供的Manifest来看,只有.MainActivity被标记为可导出,而你要启动的目标Activity不在配置列表中。
如果是你自行开发的APK,直接修改Manifest,给EngProverbsActivity添加导出属性:
<activity android:name=".EngProverbsActivity" android:exported="true"> </activity>
2. 改用正确的启动入口Activity
如果无法修改APK,或者EngProverbsActivity并非应用入口,直接使用Manifest中配置的Launcher Activity启动:
修改代码中的appActivity参数:
desiredCapabilities.setCapability("appActivity", "com.pnr.engproverbsandsayings.MainActivity");
注意:你代码中的appPackage是com.pnr.engproverbsandsayings,但Manifest的package是com.example.myapplication,二者存在不一致,必须以APK实际的package为准,可通过aapt工具验证。
3. 用aapt工具确认APK真实信息
如果不确定APK的正确包名和启动Activity,执行以下命令查询:
aapt dump badging 你的APK文件路径.apk | grep "package:" aapt dump badging 你的APK文件路径.apk | grep "launchable-activity:"
将查询结果直接替换代码中的appPackage和appActivity。
4. 添加额外启动参数
如果以上方法无效,尝试添加权限自动授予和不重置应用状态的参数:
desiredCapabilities.setCapability("autoGrantPermissions", true); desiredCapabilities.setCapability("noReset", true);
内容的提问来源于stack exchange,提问作者Steve
相关产品推荐
相关产品推荐

