概念
二次打包的概念,即对已经编译发布的apk文件,即已经使用签名文件进行正式签名的应用文件进行自己的修改之后,再次签名打包发布的过程称为二次打包。
实验
工具准备
环境准备:Java 和 adb
工具准备:
adb/android-sdk
dex2jar
jd-gui
apktool.jar
apktool.bat(需要自己制作,代码如下)
--代码分割线--
@echo off
if "%PATH_BASE%" == "" set PATH_BASE=%PATH%
set PATH=%CD%;%PATH_BASE%;
java -jar -Duser.language=en "%~dp0\apktool.jar" %1 %2 %3 %4 %5 %6 %7 %8 %9
--代码分割线--
keytool(包含在Java/jdk/bin/目录下)
jarsigner(包含在Java/jdk/bin/目录下)
signedjar(包含在Java/jdk/bin/目录下)
查看APK文件目录结构
电脑连接手机,打开手机的开发者模式和usb调试功能,手机切换到APP的界面,在命令行中键入以下命令:
adb shell dumpsys activity activities
查看APK文件目录结构
查看Java源码
下载APP的apk文件,将后缀名apk改为zip,再进行解压缩,其中包含dex文件,它是我们反编译的目标,以classes.dex为例。
将classes.dex置于dex2jar文件夹目录下,在命令行键入以下命令:
d2j-dex2jar classes.dex
其将会生成classes-dex2jar.jar和classes-error.zip两个文件。
使用jd-gui工具打开classes-dex2jar.jar文件,即可查看APK文件的Java源码,并进行分析。
修改smail代码并重新生成dex文件
将原来的APK文件与apktool.jar置于同一目录下,在命令行键入以下命令:
java -jar apktool.jar d [文件名].apk
其将在当前目录下生成一个smail文件夹,根据分析的Java源码修改smail文件。
将修改好的smail文件夹与apktool.bat和apktool.jar置于同一文件夹下,在命令行键入以下命令:
apktool.bat b [文件夹名]
一般来说在其smail文件夹下会生成两个文件夹,分别名为dist和build。
dist中存着修改后的apk,若dist没有生成,可以将build下生成的dex文件替换原先的dex文件(替换方法:将apk文件修改为zip再解压,进行替换)。
重签名
打开zip解压生成的文件夹,找到META-INF文件夹,删除其子目录下MANIFEST.MF之外的所有其他文件。
之后,将所有文件重新压缩成zip文件,然后修改后缀名zip为apk。
将修改后的apk文件置于Java\jdk\bin\目录下,在命令行键入以下命令:
keytool -genkey -alias androidauto.keystore -keyalg RSA -validity 20000 -keystore android.keystore
其将会生成自签名证书,其中密钥库口令和名字必填。
在Java\jdk\bin\目录下的命令行中输入:
jarsigner -keystore android.keystore -storepass [密钥库口令] -signedjar [签名后的文件名].apk [未签名的文件名].apk androidauto.keystore