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

bling8090 · 2019年04月09日 · 最后由 在路上 回复于 2019年12月03日 · 7933 次阅读

使用 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

a2021 回复

添加配置文件

<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 的时候,并且指定模拟随机事件为一次,即可查看:

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册