使用ADB命令启动应用失败,解决办法
一、问题描述
使用 adb shell am start -W com.tpshop.malls/com.tpshop.malls.SPMainActivity 启动应用时报错
Starting: Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] cmp=com.tpshop.malls/.SPMainActivity } Exception occurred while executing 'start': java.lang.SecurityException: Permission Denial: starting Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x10000000 cmp=com.tpshop.malls/.SPMainActivity } from null (pid=5230, uid=2000) not exported from uid 10044 at com.android.server.wm.ActivityTaskSupervisor.checkStartAnyActivityPermission(ActivityTaskSupervisor.java:1147) at com.android.server.wm.ActivityStarter.executeRequest(ActivityStarter.java:1038) at com.android.server.wm.ActivityStarter.execute(ActivityStarter.java:696) at com.android.server.wm.ActivityTaskManagerService.startActivityAndWait(ActivityTaskManagerService.java:1512) at com.android.server.am.ActivityManagerService.startActivityAndWait(ActivityManagerService.java:2976) at com.android.server.am.ActivityManagerShellCommand.runStartActivity(ActivityManagerShellCommand.java:567) at com.android.server.am.ActivityManagerShellCommand.onCommand(ActivityManagerShellCommand.java:201) at com.android.modules.utils.BasicShellCommandHandler.exec(BasicShellCommandHandler.java:97) at android.os.ShellCommand.exec(ShellCommand.java:38) at com.android.server.am.ActivityManagerService.onShellCommand(ActivityManagerService.java:8765) at android.os.Binder.shellCommand(Binder.java:950) at android.os.Binder.onTransact(Binder.java:834) at android.app.IActivityManager$Stub.onTransact(IActivityManager.java:5181) at com.android.server.am.ActivityManagerService.onTransact(ActivityManagerService.java:2534) at android.os.Binder.execTransactInternal(Binder.java:1184) at android.os.Binder.execTransact(Binder.java:1143)
当测试页面不是在AndroidManifest.xml里声明的Action.MAIN时,有可能会报出安全异常。这是因为启动的Activity设置了外部启动权限,在AndroidManifest声明该Activity处增加配置android:exported="true"即可。
二、使用 apktool 反编译 apk
由于我的apk安装包是一个完整的包,所以需要将它反编译,然后编译为新的apk,重新安装。
1.下载 apktool 工具
需要修改文件内容需要反编译工具,使用网盘下载。
链接:https://pan.quark.cn/s/c1cce429e0ff
提取码:6pub
2.反编译 apk
下载完成后,将 apk 安装包和下载的 apktool 放在同一目录,在该目录下打开命令行
假如我的安装包叫 soubaoShopMobile-release.apk,我想把它反编译到 test 文件夹下,反编译命令如下:
java -jar apktool_3.0.2.jar d soubaoShopMobile-release.apk -o test
该命令将会自动新建一个 test 文件夹, 反编译后的所有文件都将被放到里面。
修改 AndroidManifest.xml 文件,Ctrl +F搜索SPMainActivity找到如下行,添加android:exported="true"
说明:
启动失败的是com.tpshop.malls/com.tpshop.malls.SPMainActivity,所以要找到对应的Activity标签进行修改
3.编译为 apk
假如你修改了 test 文件夹里的代码 或者 修改了 versionCode 、versionName 等其他内容,可用下面的命令将 test 文件夹编译为 apk 。
# 该命令将 test 文件夹编译为 test.apk
java -jar apktool_3.0.2.jar b test -o test.apk
到这里你已经得到了一个修改后的 apk,但是这个编译后的 apk 还无法安装到手机上,因为修改了文件,在安装时手机会对安装包里的签名进行比对签名,如果签名对不上说明apk被篡改了,就不会进行安装。
所以,如果现在要对修改后的 apk 重新进行签名,才能安装。
三、apk 签名
1.生成密钥库
使用如下命令生成 keystore 格式的密钥库:
keytool -genkey -alias new.keystore -keyalg RSA -validity 20000 -keystore new.keystore
输入两次密钥口令,我设置了123456,之后一直回车,最后输入y
2.使用v1签名
使用如下命令进行签名:
jarsigner -verbose -keystore new.keystore -signedjar "C:\Users\dell\Desktop\软件测试\安装软件\APP软件包\02-app tools\apk\sign1.apk" "C:\Users\dell\Desktop\软件测试\安装软件\APP软件包\02-app tools\apk\test.apk" new.keystore
说明:
该命令使用上面生成的 new.keystore 密钥库对 C:\Users\dell\Desktop\软件测试\安装软件\APP软件包\02-app tools\apk\test.apk 进行签名,最后生成 C:\Users\dell\Desktop\软件测试\安装软件\APP软件包\02-app tools\apk\sign1.apk
3.使用v2签名
先下载 apksigner.jar(上面网盘链接有)并解压
执行如下命令进行v2签名
java -jar "C:\Users\dell\Desktop\软件测试\安装软件\APP软件包\02-app tools\apk\d12be-main\apksigner.jar" sign --ks new.keystore --out sign2.apk sign1.apk
需要输入Keystore密码,不要用小键盘输入,我的是123456(上面已设置)
说明:
使用 apksigner.jar 然后用 new.keystore 密钥库对 sign1.apk进行签名,最后生成 sign2.apk
四、验证
使用adb执行启动应用命令
adb shell am start -W com.tpshop.malls/com.tpshop.malls.SPMainActivity
启动成功
五、参考文章
本文有引用,参考文章如下:
原文链接:https://blog.csdn.net/qq_33697094/article/details/135225275
原文链接:https://blog.csdn.net/kiba_zwei/article/details/118631462
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐



所有评论(0)