Android使用Apktool反编译解包Apk文件
目录
要使用Apktool,需要准备好 apktool.jar 和 apktool.bat。还有java运行环境,自行百度;
一、下载Apktool
官网地址:https://apktool.org/
apktool下载地址:https://bitbucket.org/iBotPeaches/apktool/downloads/apktool_2.9.3.jar
二、下载apktool.bat
这个脚本是官方给出的,能通过简单的命令行执行apktool.jar
官方下载地址:https://apktool.org/docs/install
三、反编译Apk文件(解包)
1.将apktool.jar 和 apktool.bat还有apk放置同一目录,如下:
2.在地址栏输入cmd调出命令行窗口,输入
apktool d app-release.apk
解包后在app-release.apk文件的同级目录下,得到同名文件夹 app-release
然后就可以对apk进行修改了
四、打包Apk
当然有解包也一定会有打包了
1.META-INF文件夹,这里面包含旧的签名文件,用不到该文件夹,因此删除它
2.使用以下命令打包文件夹,生成新的apk文件
apktool b app-release
五、签名Apk文件
当然打包后的apk是不能安装的,会提示解析包错误!!!
此时要对apk进行签名
1.生成密钥库文件,即keystore文件(如果有keystore那么忽略这步)
使用以下命令生成keystore文件:
keytool -genkey -alias android_keystore -keyalg RSA -validity 20000 -keystore android.keystore
以上各个参数的含义如下:
- genkey:这个参数表示keytool要生成一个新的密钥对和一个自签名的证书
- alias android_keystore:这个参数指定了生成的密钥对和证书的别名(alias),此处别名为android_keystore,这个别名在密钥库中用于唯一标识这个特定的密钥对和证书
- keyalg RSA:这个参数指定了用于生成密钥对的算法,即RSA算法。RSA是一种广泛使用的非对称加密算法,它使用一对密钥:一个公钥用于加密数据,另一个私钥用于解密数据
- validity 20000:这个参数设置了证书的有效期,以天为单位,此处证书的有效期是20000天
- keystore android.keystore:这个参数指定了密钥库(keystore)的文件名,即android.keystore。密钥库是一个用于存储密钥对和证书的数据库文件
当使用keytool生成密钥对和证书时,命令执行过程需要输入信息:
- 密钥库的密码:此处我填写为 123456
- 密钥对和证书的所有者姓名、组织单位、城市或地区、省/州/郡、国家代码等,这些信息将被包含在生成的证书中,用于标识证书的所有者。
此时就在当前目录下,生成了一个android.keystore文件:
2.将刚刚生成的android.keystore文件,拷贝到未签名的apk文件同级目录下,切换到该路径下,输入以下命令,进行签名:
jarsigner -verbose -keystore android.keystore -signedjar app-release-signed.apk app-release.apk android_keystore
以上各个参数的含义如下:
- jarsigner:这是 Java 开发工具包 (JDK) 中的一个工具,用于对 JAR 文件、APK 文件等进行签名
- verbose:这个参数用于输出详细的签名过程,当使用这个参数时,jarsigner 会显示更多关于签名步骤的信息,这有助于调试和了解签名过程的具体情况
- keystore android.keystore:这个参数指定了密钥库文件的路径和名称,即 android.keystore
- signedjar app-release-signed.apk app-release.apk:这个参数指定了签名后的 APK 文件的输出路径和名称,即 app-release-signed.apk,这个文件是原始 APK 文件 app-release.apk 经过签名后的结果
- android_keystore:这个参数指定了密钥库中用于签名的密钥对的别名,别名是在使用 keytool 生成密钥对时指定的,它用于在密钥库中唯一标识这个特定的密钥对
此时就在当前目录下,生成了一个app-release-signed.apk文件:
六、可能出现的错误
解包时出现DexBackedDexFile$NotADexFile错误
在命令后加 --only-main-classes 一句话就可以了
如:
apktool d app-release.apk --only-main-classes