Android 开发基础 adb shell 启动应用时的权限问题

bling8090 · April 09, 2019 · Last by zailushang replied at December 03, 2019 · 6406 hits

使用adb shell am start com.njzx.care/com.njzx.care.activity.MainActivity启动某应用,报错权限问题。

Starting: Intent { act=android.intent.action.MAIN cat=[android.intent.category.L
AUNCHER] cmp=com.njzx.care/.activity.MainActivity }
Security exception: Permission Denial: starting Intent { act=android.intent.acti
on.MAIN cat=[android.intent.category.LAUNCHER] flg=0x10000000 cmp=com.njzx.care/
.activity.MainActivity } from null (pid=16408, uid=2000) not exported from uid 1
1148

java.lang.SecurityException: Permission Denial: starting Intent { act=android.in
tent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x10000000 cmp=com.n
jzx.care/.activity.MainActivity } from null (pid=16408, uid=2000) not exported f
rom uid 11148
at com.android.server.am.ActivityStackSupervisor.checkStartAnyActivityPe
rmission(ActivityStackSupervisor.java:1877)
at com.android.server.am.ActivityStarter.startActivity(ActivityStarter.j
ava:607)
at com.android.server.am.ActivityStarter.startActivityLocked(ActivitySta
rter.java:366)
at com.android.server.am.HwActivityStarter.startActivityLocked(HwActivit
yStarter.java:227)
at com.android.server.am.ActivityStarter.startActivityMayWait(ActivitySt
arter.java:1155)
at com.android.server.am.HwActivityStarter.startActivityMayWait(HwActivi
tyStarter.java:372)
at com.android.server.am.ActivityManagerService.startActivityAsUser(Acti
vityManagerService.java:5036)
at com.android.server.am.ActivityManagerShellCommand.runStartActivity(Ac
tivityManagerShellCommand.java:410)
at com.android.server.am.ActivityManagerShellCommand.onCommand(ActivityM
anagerShellCommand.java:141)
at android.os.ShellCommand.exec(ShellCommand.java:96)
at com.android.server.am.ActivityManagerService.onShellCommand(ActivityM
anagerService.java:16140)
at android.os.Binder.shellCommand(Binder.java:574)
at android.os.Binder.onTransact(Binder.java:474)
at android.app.IActivityManager$Stub.onTransact(IActivityManager.java:42
64)
at com.android.server.am.ActivityManagerService.onTransact(ActivityManag
erService.java:3285)
at com.android.server.am.HwActivityManagerService.onTransact(HwActivityM
anagerService.java:837)
at android.os.Binder.execTransact(Binder.java:675)

网上解决方案说把androidmanifest.xml中添加:android:exported="true"
然而并没有什么用。

共收到 5 条回复 时间 点赞

com.njzx.care.activity.MainActivity可能不是该应用的MainActivity。例如输入adb shell am start com.tencent.mobileqq/.activity.QQSettingSettingActivity 不会启动QQ,因为设置相关的Activity不是QQ的MainActivity。

所以需要先在androidmanifest.xml中指定应用最先启动Activity是com.njzx.care.activity.MainActivity才行。具体格式如下:

<activity
android:name=".activity.MainActivity"
.......
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
</activity>

另外也可以通过monkey的方式,无需Activity启动app

adb shell monkey -p com.tencent.mobileqq 1

首先,确认启动的activity是否是app最先启动的那个activity

确实是这个activity

keke 回复

添加配置文件

<activity   android:name="com.example.android.apis.activity.MainActivity"  android:label="Activity and MainActivity" android:exported="true">
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
</activity>

还是不行。。。

对于此类.activity.MainActivity的只能monkey了。

这个问题主要是没有找到APP正确的启动页Activity,可以通过这种方法查找:
使用Monkey命令 monkey -p com.saj.esolar -vvv 1 可以设置日志的详细程度,当我们指定为 -VVV 的时候,并且指定模拟随机事件为一次,即可查看:

需要 Sign In 后方可回复, 如果你还没有账号请点击这里 Sign Up