首页 > 代码库 > 替换APK文件内容后重新打包签名脚本

替换APK文件内容后重新打包签名脚本

由于业务需求,需要替换APK文件内容后重新打包签名,调研后发现使用JDK里提供的命令可以很方便地实现。关键命令如下:

jar -uf:替换apk文件内的某个文件或文件夹。

jarsigner:为apk文件签名

zipalign:对签名后的apk文件进行字节对齐优化

下面以替换某apk包中assets目录下的1.ini和2.ini文件,并重新打包签名优化为例,先放上脚本代码:

start.bat(windows版本)

SET KEYSTORE_NAME=.\data\signature.keystore
SET KEYSTORE_ALIAS=xxx
SET KEYSTORE_STOREPASS=xxx
SET KEYSTORE_KEYPASS=xxx

SET INPUT_APK=.\input.apk
SET META-INF=.\META-INF
SET ASSETS=.\assets

SET UNSIGNED=.\output\Unsinged.apk
SET SIGNED=.\output\Signed.apk
SET OPT=.\output\output.apk

copy %INPUT_APK% %UNSIGNED%

jar -uf %UNSIGNED% %META-INF%
jar -uf %UNSIGNED% %ASSETS%
@echo 替换文件完成!

jarsigner -sigalg MD5withRSA -digestalg SHA1 -keystore %KEYSTORE_NAME% -storepass %KEYSTORE_STOREPASS% -keypass %KEYSTORE_KEYPASS% -signedjar %SIGNED% %UNSIGNED% %KEYSTORE_ALIAS%
@echo 签名完成!

del /F /Q %OPT%
zipalign  4 %SIGNED% %OPT%
@echo 优化完成!

del /F /Q %UNSIGNED%
del /F /Q %SIGNED%
@echo 操作完成!

@pause

start.sh(Linux版本)

#!/bin/bash

KEYSTORE_NAME=./data/signature.keystore
KEYSTORE_ALIAS=xxx
KEYSTORE_STOREPASS=xxx
KEYSTORE_KEYPASS=xxx

INPUT_APK=./input.apk
META_INF=./META-INF
ASSETS=./assets

OUTPUT=./output/
UNSIGNED=./output/input.apk
SIGNED=./output/Signed.apk
OPT=./output/output.apk

cp $INPUT_APK $OUTPUT

jar -uf $UNSIGNED $META_INF
jar -uf $UNSIGNED $ASSETS
echo Replace OK!

jarsigner -sigalg MD5withRSA -digestalg SHA1 -keystore $KEYSTORE_NAME -storepass $KEYSTORE_STOREPASS -keypass $KEYSTORE_KEYPASS -signedjar $SIGNED $UNSIGNED $KEYSTORE_ALIAS
echo Signe OK!

rm -r $OPT
zipalign 4 $SIGNED $OPT
echo Zipalign ok!

rm -r $UNSIGNED
rm -r $SIGNED
echo Operate OK!

操作如下:

1、将apk包放在根目录下,命名为input.apk。将要替换的1.ini和2.ini文件放在assets目录下。

2、双击根目录下的start.bat(windows)或start.sh(linux or mac)。

3、待操作完成后,进入output目录即可看到生成的新apk包:output.apk。

注意事项:
1、必须安装JDK,配置好JDK的相关环境变量。
2、必须将zipalign加入到环境变量中,zipalign在Android SDK的build tool下。

3、将上述脚本里的相应参数改为实际的参数值,并在data目录下放入相应签名文件。

整个脚本执行的环境如图所示:

技术分享

此外,需要在根目录下新建一个META-INF目录,并在里面放入原apk中META-INF目录对应的空文件(新建空文件并重命名为对应的名称即可),用于在重签名之前替换清空原签名文件。META-INF目录如下所示(不同的apk可能不同):

技术分享

全文完!

替换APK文件内容后重新打包签名脚本