Android逆向入门篇--编译、打包、安装
字数 1417 2025-08-22 18:37:22
Android逆向入门:APK编译、打包与安装详解
一、APK打包基础
1.1 APK组成结构
APK包主要包含两部分内容:
- 应用模块:开发者编写的源代码、资源文件、AIDL接口文件
- 依赖模块:第三方依赖库(aar、jar、so文件)
典型项目目录结构:
android-project/
AndroidManifest.xml
gen/
lib/
android-support-v4.jar
out/
res/
drawable-xhdpi/
icon.png
drawable-xxhdpi/
icon.png
drawable-xxxhdpi/
icon.png
layout/
activity_main.xml
src/
cn/
androidblog/
testbuild/
MainActivity.java
1.2 打包流程
- 资源打包:生成R.java和编译后的资源文件
- AIDL编译:生成Java接口文件
- 源代码编译:将Java代码编译为DEX文件
- 打包APK:将所有文件打包成APK压缩包
- 签名:对APK进行数字签名
- 对齐:进行zipalign对齐优化
二、资源打包工具详解
2.1 AAPT工具
基本命令格式:
aapt.exe p -M AndroidManifest.xml -S ./main/res -I android.jar -J ./ -F ./out.apk
参数说明:
p:打包操作-M:指定AndroidManifest.xml路径-S:指定res目录路径-I:指定android.jar路径(系统库)-J:指定R.java输出目录-F:指定APK输出路径
2.2 AAPT2工具
AAPT2是AAPT的升级版,支持增量编译。
编译命令:
# 编译整个目录
aapt2.exe compile -o base.apk -dir E:\path\to\res
# 编译单个文件
aapt2.exe compile -o E:\output\path E:\input\file.png
链接命令:
aapt2.exe link -o .\out.apk -I .\Sdk\platforms\android-28\android.jar \
--manifest E:\path\to\AndroidManifest.xml \
.\values_styles.arsc.flat .\mipmap-hdpi_ic_launcher_round.png.flat \
--java ./
三、AIDL文件编译
使用SDK中的aidl.exe工具:
aidl -Iaidl -pD:/Android/Sdk/platforms/android-27/framework.aidl \
-obuild aidl/com/android/vending/billing/IInAppBillingService.aidl
参数说明:
-I:指定import搜索路径-p:指定系统类import路径-o:指定生成Java文件的目录
四、源代码编译
4.1 Java到Class
使用JDK的javac工具:
javac -target 1.8 -bootclasspath platforms\android-28\android.jar \
-d e:/output/path java\com\testjni\*.java
4.2 Class到Dex
使用dx.jar工具:
java -jar dx.jar --dex --output=.\classes.dex .\com\testjni\*.class
五、APK签名
5.1 生成密钥库
keytool -genkey -alias demo.keystore -keyalg RSA \
-validity 40000 -keystore demo.keystore
5.2 查看密钥库信息
keytool -list -keystore demo.keystore -v
5.3 签名APK
使用apksigner:
java -jar apksigner.jar sign --ks demo.keystore demo.apk
使用jarsigner:
jarsigner.exe -verbose -keystore <密钥库> \
-signedjar <签名后的apk名称> <需要被签名的apk文件> <密钥库的别名>
六、Zipalign对齐
对齐命令:
zipalign.exe 4 base.apk aligned.apk
注意事项:
- 使用apksigner签名时,应在签名前进行对齐
- 使用jarsigner签名时,应在签名后进行对齐
七、APK安装机制
7.1 系统安装目录
| 目录 | 说明 |
|---|---|
| /system/app | 系统自带应用,需ROOT权限修改 |
| /data/app | 用户安装的应用 |
| /vendor/app | 设备商应用 |
| /data/app-private | DRM保护的应用 |
| /data/data | 应用数据存储 |
| /data/dalvik-cache | dex文件存放位置 |
7.2 系统自动安装
PackageManagerService负责监听系统目录并自动安装应用:
File systemAppDir = new File(Environment.getRootDirectory(), "app");
mSystemInstallObserver = new AppDirObserver(systemAppDir.getPath(),
OBSERVER_EVENTS, true, false);
mSystemInstallObserver.startWatching();
scanDirLI(systemAppDir,
PackageParser.PARSE_IS_SYSTEM | PackageParser.PARSE_IS_SYSTEM_DIR,
scanMode, 0);
7.3 网络下载安装
调用PackageManagerService的installPackage方法:
public void installPackage(final Uri packageURI,
final IPackageInstallObserver observer, final int flags) {
installPackage(packageURI, observer, flags, null);
}
7.4 ADB安装
- 推送APK到设备:
adb push xxx.apk /data/local/tmp
- 执行安装:
pm install /data/local/tmp/xxx.apk
八、关键工具总结
| 工具 | 用途 |
|---|---|
| aapt/aapt2 | 资源打包 |
| aidl | AIDL文件编译 |
| javac | Java源代码编译 |
| dx.jar | Class转Dex |
| apksigner/jarsigner | APK签名 |
| zipalign | APK对齐优化 |
九、完整打包流程总结
- 使用aapt/aapt2打包资源文件
- 使用aidl编译AIDL文件
- 使用javac编译Java源代码
- 使用dx.jar将class文件转为dex
- 将所有文件打包成APK
- 对APK进行签名
- 执行zipalign对齐优化
- 通过系统安装机制或ADB安装APK