APK的打包 与 反编译
apk的本质是一个压缩包,查看一个文件属于什么类型可以通过查看文件的前几个字节进行判断。比如JPRG图片的文件头是FFD8FF PNG图片的文件头是89504E47,ZIP文件头是504B0304
打包apk
打包成apk有两种方式,一种是通过Android studio 工具进行打包,另一种是通过Gradle进行打包
使用Android studio工具打包
- 选择Build ->Generate Signed Bundle/APK
- 使用命令行生成keystore文件,生成过程中可能会遇到报错 密码库格式不对错误
- 生成之后包的位置在app->release目录下
- 最后一步,选中release或者debug包,选中 V1、V2 ,点击完成
如果使用 AS 工具生成 keystore 文件出现下面错误时,使用命令行进行生成
JKS 密钥库使用专用格式。建议使用 "keytool -importkeystore -srckeystore E:\androidstudio\androidstudio_work\CommonDemo\app\fast_keystore.jks -destkeystore E:\androidstudio\androidstudio_work\CommonDemo\app\fast_keystore.jks -deststoretype pkcs12" 迁移到行业标准格式 PKCS12。使用命令行工具生成keystore文件
keytool -genkey -alias testalias -keypass 123456 -keyalg RSA -keysize 2048 -validity 36500 -keystore /Users/mlive/Desktop/test.keystore -storepass 123456
点击确定之后会出现让你输入详细信息的,可以直接回车,最后确定时输入y, keypass和storepass两个密码需要一致,不然打包会有问题2

| column0 | column1 |
|---|---|
| genkey | 生成文件 |
| alias | 别名- testalias |
| keypass | alias文件密码- 123456 |
| keyalg | 加密算法- RSA |
| validity | 有效期,以天为单位 |
| keystore | 文件输出路径,文件名称是- test.keystore |
| storepass | 文件密码- 123456 |
- 查看证书信息
keytool -list -v -keystore "test.keystore" - 修改keystore密码:keytool -storepasswd -keystore 文件名 执行后会提示输入证书的当前密码,和新密码以及重复新密码 确认。
- 修改别名:keytool -changealias -keystore my.keystore 文件名 -alias 别名 -destalias 新别名
使用Gradle打包
- 在项目根目录下的
gradle.properties文件下配置数据
KEY_PATH=/Users/mlive/Desktop/test.keystore //keystore文件路径
KEY_PASS=123456 //keystore密码
ALIAS_NAME=testalias //alias 别名
ALIAS_PASS=123456 //alias密码2
3
4
- 编辑
app/build.gradle文件,在android闭包中添加闭包内容
signingConfigs{ //这个闭包是新添加的配置
config{
storeFile file(KEY_PATH)
storePassword KEY_PASS
keyAlias ALIAS_NAME
keyPassword ALIAS_PASS
}
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
signingConfig signingConfigs.config //这里设置打包的配置
}
}2
3
4
5
6
7
8
9
10
11
12
13
14
15
- 配置完成之后,选择右侧Gradle工具->项目名称->app->Tasks->build. 双击
assembleAndroidTest是只打测试包,双击assemble测试包和正式包都会打,打包之前双击clean,清除掉之前的打包信息
使用Gradle打多个渠道包
- 编辑
app/build.gradle文件,在android闭包中添加闭包内容 添加以下内容
flavorDimensions "default"
productFlavors{
qihoo{
// 这里可以重写defaultConfig里面配置的东西
applicationId "com.beautiful.livephoto"
}
baidu{
// 这里可以重写defaultConfig里面配置的东西
applicationId "com.beautiful.livephoto.baidu"
}
}2
3
4
5
6
7
8
9
10
11
- 配置完成之后,选择右侧Gradle工具->项目名称->app->Tasks->build,可以看到新增了
assembleBaidu和assembleQihoo两个渠道 - 如果是需要差异化的内容,可以在src目录下新建一个baidu文件夹,文件夹下增加res文件和java文件来进行区分
代码混淆
打包的时候为了避免别人轻易破解我们的apk,通常的做法是加上代码混淆,注意混淆有一定的规则,四大组件是不允许被混淆的。minifyEnabled = true是开启混淆,混淆的具体规则是在
<!-- 如果debug的时候没有崩溃,release打包之后崩溃,通过配置debug进行混淆可以检查是否是打包混淆代码时出现问题 -->
buildTypes {
release {
minifyEnabled false
shrinkResources false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
debug{
minifyEnabled false
shrinkResources false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}2
3
4
5
6
7
8
9
10
11
12
13
14
proguard-android.txt:代表系统默认的混淆规则配置文件,该文件在<Android SDK目录>/tools/proguard下,一般不要更改该配置文件,因为也会作用于其它项目。proguard-rules.pro:代码表当前Project的混淆配置文件,在app module下,可以通过修改该文件来添加适用当前项目的混淆规则。
反编译
使用 apktool 工具对 apk 包进行反编译,目前我掌握的方式有两种
第一种方式
jadx: 下载jadx,点击下载
apk包后缀改成.zip,解压之后会看到classes.dex文件 下载文件之后解压,运行bin文件夹下的jadx-gui文件,把classes.dex文件放到对应的界面中,可以直接查看。
第二种方式
apktool: 获取资源文件,提取图片和布局文件, 点击下载dex2jar: 将apk包反编译成java源码 (classes.dex文件转化成jar文件) 点击下载JD-GUI: 查看apk总 classes.dex转化出来的jar文件,即源码文件 点击下载
apktool
- 根据系统不同下载对应的
script,因为是shell语法,文件名改为apktool.sh - 下载和
apktool.jar文件(下载的jar文件名必须是apktool.jar,不能是apktool-2.0.1.jar这样的形式) - 把
apktool.sh和apktool.jar文件放在系统目录/usr/local/bin文件下,给对应的文件赋予运行权限
chmod a+x apktool.sh
chmod a+x apktool.jar2
- 运行
/usr/local/bin/apktool.sh命令查看 apktool是否安装成功 - 执行
apktool.sh d xxx.apk命令,该方法会反编译出资源文件和smail文件,注意日志,反编译出的文件会放在当前目录下
dex2jar
- 解压下载好的
dex2.jar文件 - 将获取的apk文件后缀名改为
.zip,解压之后获取到classes.dex文件 - 运行命令行
./d2j-dex2jar.sh classes.dex - 如果解压成功,会出现
classes-dex2jar.jar文件,运行JD-GUI查看该文件即可
如果出现 Permission Denied 异常,是因为当前运行的文件缺少权限,一般报哪个文件就修改对应文件权限即可
chmod a+x ./dex2jar-2.0/d2j_invoke.sh
如果出现Detail Error Information in File ./classes-error.zipPlease report this file to http://code.google.com/p/dex2jar/issues/entry if possible. 的错误提示,是因为下载的dex2版本不是最新版本. 点击跳转到最新版本
JD-GUI
解压 JD-GUI 压缩包,双击 JD-GUI 图标打开,把classes.dex转化出来的 jar 文件放进去即可