修改Android apk的二进制文件AndroidManifest.xml,并重新签名打包apk
最近使用uni-app混合式框架开发一个App,需要把Android App 隐藏图标并隐式启动。有三种方案:
1. 使用uni-app离线打包。
2. 在不改源码的情况下,只修改apk的二进制文件AndroidManifest.xml,并重新签名打包apk。
3. 对apk进行反编译,回编译再重新签名打包。
说明:本文选择方案2,使用《Android App 隐藏图标(Android 10除外)并隐式启动》里的隐藏App图标并隐式启动方法,只修改apk 的AndroidManifest.xml并重新签名打包,实现隐藏图标并隐式启动。至于对apk进行反编译,回编译再重新签名打包的,请查阅别的博客或等我出另一篇的博客详细介绍。
需要准备以下3个jar包:
1. AXMLEditor2.jar,对二进制文件AndroidManifest.xml进行修改。
2. AXMLPrinter2.jar,输出二进制文件AndroidManifest.xml里的内容。方便我们在用AXMLEditor2.jar修改AndroidManifest.xml后,查看其内容。
3. signapk.jar(签名文件:testkey.pk8,testkey.x509.pem),对apk重新签名打包。
先简单说明一下AXMLEditor2.jar的功能及语法,AXMLEditor2.jar是在AXMLEditor.jar基础上做了修改。
本版功能:
1、旧版会对@引用、#色值设置固定值:7F000000、FFFFFFFF。
2、本版保留@引用、#色值传过来的值,传什么值就设置什么值,传过来的值只能是十六进制的字符串。
语法介绍(摘自https://github.com/fourbrother/AXMLEditor):
1>插入属性
java -jar AXMLEditor.jar -attr -i [标签名] [标签唯一标识] [属性名] [属性值] [输入xml] [输出xml]
案例:java -jar AXMLEditor.jar -attr -i application package debuggable true AndroidManifest.xml AndroidManifest_out.xml
application的标签中插入android:debuggable="true"属性,让程序处于可调式状态
2>删除属性
java -jar AXMLEditor.jar -attr -r [标签名] [标签唯一标识] [属性名] [输入xml] [输出xml]
案例:java -jar AXMLEditor.jar -attr -r application allowBackup AndroidManifest.xml AndroidManifest_out.xml
application标签中删除allowBackup属性,这样此app就可以进行沙盒数据备份
3>更改属性
java -jar AXMLEditor.jar -attr -m [标签名] [标签唯一标识] [属性名] [属性值] [输入xml] [输出xml]
案例:java -jar AXMLEditor.jar -attr -m application package debuggable true AndroidManifest.xml AndroidManifest_out.xml
application的标签中修改android:debuggable="true"属性,让程序处于可调式状态
4>插入标签
java -jar AXMLEditor.jar -tag -i [需要插入标签内容的xml文件] [输入xml] [输出xml]
案例:java -jar AXMLEditor.jar -tag -i [insert.xml] AndroidManifest.xml AndroidManifest_out.xml
因为插入标签时一个标签内容比较多,所以命令方式不方便,而是输入一个需要插入标签内容的xml文件即可。
5>删除标签
java -jar AXMLEditor.jar -tag -r [标签名] [标签唯一标识] [输入xml] [输出xml]
案例:java -jar AXMLEditor.jar -tag -r activity cn.wjdiankong.demo.MainActivity AndroidManifest.xml AndroidManifest_out.xml
删除android:name="cn.wjdiankong.demo.MainActivity"的标签内容
操作开始:
1. 创建一个文件夹,把test.apk包、AXMLEditor2.jar、AXMLPrinter2.jar、signapk.jar,testkey.pk8,testkey.x509.pem都放在这个文件夹,如下图:
2. 修改test.apk后缀,改成test.zip。
3. 解压test.zip 里的AndroidManifest.xml文件到当前文件夹。
4. 鼠标放在当前文件夹,按下键盘shift,鼠标点击右键,打开cmd命令窗口,如下图:
5. 先查看一下AndroidManifest.xml的内容,在cmd窗口输入:java -jar AXMLPrinter2.jar AndroidManifest.xml >> AndroidManifest.txt,然后回车,执行完成后,文件夹里多了个AndroidManifest.txt文件。用编辑器打开查看输出的AndroidManifest.txt文件。如下图:
6. 先删除名为io.dcloud.PandoraEntry 的activity。在cmd窗口输入:java -jar AXMLEditor2.jar -tag -r activity io.dcloud.PandoraEntry AndroidManifest.xml AndroidManifest1.xml,然后回车,执行完成后,文件夹里多了个AndroidManifest1.xml文件。在cmd窗口输入:java -jar AXMLPrinter2.jar AndroidManifest1.xml >> AndroidManifest1.txt,然后回车,执行完成后,文件夹里多了个AndroidManifest1.txt文件。用编辑器打开查看输出的AndroidManifest1.txt文件,AndroidManifest1.txt里已经没有名为io.dcloud.PandoraEntry 的activity了,说明删除成功了。
7. 在test文件夹下创建一个insert.xml文件,insert.xml内容见如下图:
8. 插入名为io.dcloud.PandoraEntry 的activity。在cmd窗口输入:java -jar AXMLEditor2.jar -tag -i insert.xml AndroidManifest1.xml AndroidManifest2.xml,然后回车,执行完成后,文件夹里多了个AndroidManifest2.xml文件。在cmd窗口输入:java -jar AXMLPrinter2.jar AndroidManifest2.xml >> AndroidManifest2.txt,然后回车,执行完成后,文件夹里多了个AndroidManifest2txt文件。用编辑器打开查看输出的AndroidManifest2.txt文件,AndroidManifest2.txt里多了名为io.dcloud.PandoraEntry 的activity了,其内容和insert.xml内容一样,说明插入成功了。
9. 删除test.zip包里的AndroidManifest.xml文件和META-INF文件夹,把AndroidManifest2.xml放入到test.zip包里,并将test.zip包里的AndroidManifest2.xml重命名为AndroidManifest.xml。修改test.zip后缀,改成test.apk。
10. 对test.apk重新签名。在cmd窗口输入:java -jar signapk.jar testkey.x509.pem testkey.pk8 test.apk test_signed.apk,然后回车,执行完成后,文件夹里多了个test_signed.apk。安装test_signed.apk,App图标不显示了,并能通过其他App(或浏览器)拉起。
操作结束。
原文链接:https://blog.csdn.net/u014460354/article/details/107601422