由于业务需求,需要替换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可能不同):
全文完!
时间: 2024-10-14 08:29:11