特定情况下,我们需要将出好的安装包解开替换某些资源和代码,这种情况一般在游戏行业以及聚合SDK情况比较多,这里不考虑分包和混淆情况。主要流程:
1.将更新的代码转换成smali格式;
2.使用apktool将apk反编译;
3.添加1中生成的smali、资源等;
4.使用apktool、jarsigner、zipalign等工具和包、加密、对齐。
一、反编译
方法1:
1.将apktool脚本和apktool.jar文件移动到/usr/local/bin文件夹下;
2.使用命令chmod +x 分别对apktool和apktool.jar文件进行提取权限;
cd /usr/local/bin
chmod +x apktool
chmod +x apktool.jar
3.终端输入./apktool测试是否成功(或/usr/local/bin/apktool);
4.cd到apk所在目录;
5.运行apktool脚本进行反编译。
apktool d demo.apk -o [输出目录]
解包之后目录结构如下(这里原工程未包含assets,libs):
这里源码为.smali格式,如果需要查看源码,需要做转换
6.smali2dex
java -jar smali.jar -o 目标dex文件 [smali文件夹]
7.dex2jar
d2j-dex2jar.bat classes.dex
将生成的jar包导入JD-GUI查看源码
方法2:
将apk更改为zip,拷贝其classes.dex等dex到dex2jar-2.0文件夹
双击dex2jar-2.0文件夹下的d2j-jar2dex.bat,再打开cmd,进入当前dex2jar-2.0目录,执行d2j-dex2jar classes.dex,得到的是classes-dex2jar.jar包。
获得classes-dex2jar.jar,使用GUI工具打开jar包。
方法3:
使用dex2jar-2.0工具,将apk种的dex文件转换成jar,使用JD_GUI工具查看源码。
1.将dex2jar里的d2j_invoke.sh和d2j-dex2jar.sh增加可执行权限。
sudo chmod +x d2j_invoke.sh
sudo chmod +x d2j-dex2jar.sh
2.然后进到dex2jar这个文件夹下执行:
d2j-dex2jar.sh test.apk
得到test-dex2jar.jar文件,使用GUI工具查看源码。
二、重新打包
解包的方式有很多,但如果需要更改代码,一般解包时使用apktool将源码转换成smali格式。将写好的代码.java文件转换成smali格式,然后合包,如下:
第一步:javac命令编译java文件为class文件
第二步:dx命令将class文件转化成dex文件
第三步:使用baksmali工具将dex文件转化成smali文件
1.终端输入命令:
apktool b demo unsigned-demo.apk -o [输出目录]
此时生成的是未签名的安装包,需要签名后才能安装使用。
2.APK签名
格式:jarsigner -verbose -keystore [签名文件名称] -signedjar [签名后apk名称] [待签名apk名称] [签名别名],如下:
jarsigner -verbose -keystore android_release.keystore -signedjar signed-demo.apk unsigned-demo.apk android.keystore
验证应用是否已签名
jarsigner -verify [待验证的apk]
- zipalign
zipalign 是一种归档对齐工具,可对 Android 应用 (APK) 文件提供重要的优化。其目的是要确保所有未压缩数据的开头均相对于文件开头部分执行特定的对齐。具体来说,它会使 APK 中的所有未压缩数据(例如图片或原始文件)在 4 字节边界上对齐。这样一来,即可使用 mmap() 直接访问所有部分,即使其中包含具有对齐限制的二进制数据也没关系。这样做的好处是可以减少运行应用时消耗的 RAM 容量。
注意:您必须在应用构建过程中的两个特定时间点之一使用 zipalign,具体在哪个时间点使用,取决于您所使用的应用签名工具:
- 如果您使用的是 apksigner,则只能在为 APK 文件签名之前执行 zipalign。如果您在使用 apksigner 为 APK 签名之后对 APK 做出了进一步更改,签名便会失效。
- 如果您使用的是 jarsigner,则只能在为 APK 文件签名之后执行 zipalign。
要对齐 infile.apk 并将其保存为 outfile.apk,请运行以下命令:
zipalign [-f] [-v] infile.apk outfile.apk
要确认 existing.apk 的对齐方式,请运行以下命令:
zipalign -c -v existing.apk
zipalign说明
Copyright (C) 2009 The Android Open Source Project
Usage: zipalign [-f] [-p] [-v] [-z] infile.zip outfile.zip
zipalign -c [-p] [-v] infile.zip
是一个整数,用于定义字节对齐边界。此值必须始终为 4(可提供 32 位对齐),否则实际将不会执行任何操作
-c: check alignment only (确认给定文件的对齐方式)
-f: overwrite existing outfile.zip (覆盖现有的 outfile.zip)
-p: memory page alignment for stored shared object files(outfile.zip 应对 infile.zip 中的所有共享对象文件使用相同的页面对齐方式)
-v: verbose output(详细输出)
-z: recompress using Zopfli
使用adb安装
adb -d install -r test.apk
打开应用
adb shell am start com.android.test/.MainActivity