apk解包与打包

345 阅读1分钟

使用uniapp云打包来打包apk很方便, 但在推送播放较长的铃声(自定义铃声)的场景下,例如语音通话时需要较长的铃声来提醒用户. 在这样的场景下需要把铃声的文件放到 /res/raw/ 下面, 而uniapp云打包并不提供这样的功能,离线打包又太过复杂, 这时候就想到先解包放铃声进去再重新打包的方法.

以下示例为macos

首先先安装apktool

brew install apktool

接下来就可以将你的APK进行解包

apktool -r d --only-main-classe hello.apk
# d 解包
# -r Do not decode resources.
# --only-main-classe 避免decode assets下面的dex

解包后会得到hello文件夹, 进到hello/res/raw里面把你的铃声放里面即可, 推荐mp3格式.

文件放好后我们就可以将apk重新打包

apktool b hello -o hello.apk
# b 打包
# -o 指定输出的apk名字

重新打包后apk就失去了签名, 需要重新签名, 签名需要用到keytool和jarsigner, 这两个工具需要安装jdk, 推荐使用openjdk AdoptOpenJDK

安装jdk后要通过keytool生成keystore

keytool -genkey -alias ruinb0w -keyalg RSA -validity 20000 -keystore hello.keystore
# -genkey 要生成keystore
# -alias 任意字符串 别名
# -keyalg RSA 加密算法, 固定RSA即可
# -validity 天数 keystore有效期
# -keystore xxx.keystore 指定输出的keystore的名字

生成玩keystore后对重新打包的apk进行签名即可

jarsigner -keystore hello.keystore -signedjar hello_signed.apk hello.apk ruinb0w
# -keystore 路径 指定签名用的keystore的路径
# -signedjar 签名后的apk的名字 要签名的apk 别名

步骤很简单只用到了4行命令就完成了整个流程, 相较于离线打包要方便很多.