一、问题描述

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

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐