将apk中AndroidManifest.xml中的allowBackup属性改为true,重新打包并签名,便于adb备份数据
有个手机单机游戏的安装包,想通关后保存游戏的本体和数据,就可以卸掉,来节省手机空间,若再想玩就不用从头开始,但手机没有备份应用数据的功能,于是尝试用adb备份。
文中用到的工具 android-studio 的 SDK 中大多都有,其他使用到的工具也有下载链接。
备份测试
先将手机连接电脑后,打开USB调试。 (下载adb工具 for windows)
查看adb连接的设备
adb devices
查看所有包名
adb shell pm list package
找到包名后备份应用数据
adb backup -f appbackup.ab -noapk 包名
备份下来的appbackup.ab为1KB的文件,显然没有成功。
尝试备份其他应用数据可以正常备份,说明是app的问题。
查看并修改 AndroidManifest
apk 下 AndroidManifest.xml 中有个属性 allowBackup 是否允许 adb 备份。
AndroidManifest.xml 为二进制文件,不能直接查看修改内容。
用aapt工具可以查看。 (下载aapt工具)
aapt dump xmltree AndroidManifest.xml > AndroidManifest.txt
但不知什么原因,我使用这条命令一直报错,便干脆寻找使用其他工具解决。
可以使用 AndroidManifest.xml 解码小工具md。 (去原网页下载:androidmanifest.xml 解码工具又来一发 md_v1.1.zip)
使用方法在命令行中输入 (会在命令行中输出解码后的 xml):
md.exe AndroidManifest.xml
可以看到allowBackup="false"
allowBackup="false"
使用 AXMLEditor.jar 直接对二进制的 AndroidManifest.xml 进行修改,作者网页中有使用方法。
直接使用
java -jar AXMLEditor.jar -attr -r application allowBackup AndroidManifest.xml AndroidManifest_out.xml
删除属性失败,经过各种尝试后发现,只能修改最后一个属性。
删除 resizeableActivity
java -jar AXMLEditor.jar -attr -r application package resizeableActivity AndroidManifest.xml AndroidManifest_out.xml
修改 allowBackup
java -jar AXMLEditor.jar -attr -m application package allowBackup true AndroidManifest.xml AndroidManifest_out.xml
再把 resizeableActivity 插入就行了
java -jar AXMLEditor.jar -attr -i application package resizeableActivity true AndroidManifest.xml
allowBackup="true" 成功修改。
二次签名,并对齐优化
将 AndroidManifest.xml 直接替换是不能安装的,需要对修改后的 apk 文件进行二次签名。
首先使用 apktool 工具生成签名文件 my.keystore 。
(下载apktool工具)
keytool -genkey -alias alias.keystore -keyalg RSA -validity 30000 -keystore my.keystore
-alias alias.keystore 为签名文件的别名,后面会用到
-keyalg RSA 使用RSA算法对签名加密
-validity 30000 有效期限30000天
-keystore my.keystore 文件名
然后根据提示填写密码等即可。
查看签名文件:
keytool -list -v -keystore my.keystore -storepass password
删除apk中的 META-INF 目录,然后使用 apksigner.jar 工具,my.keystore 对 apk 签名
jarsigner -keystore my.keystore -storepass password -signedjar demo_signed.apk demo.apk alias.keystore
alias.keystore 为签名文件的别名,不是签名文件的名称,否则会出现找不到证书链的错误。
最后,用 zipalign 做对齐优化,不这么做也能用,影响不大。
zipalign -v 4 源文件名 生成的文件名
再次测试备份
更改后的app不能与原app同时安装,将原app使用 adb shell pm uninstall -k 包名
保留数据卸载后,也会安装失败,将原app完全卸载后才可安装。
备份数据
adb backup -f appbackup.ab -noapk 包名
恢复数据
adb restore appbackup.ab
参考资料
androidmanifest.xml 解码工具又来一发
AndroidManifest ARSC 二进制文件原始修改器
Android中对apk文件进行二次签名