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 打包流程

  1. 资源打包:生成R.java和编译后的资源文件
  2. AIDL编译:生成Java接口文件
  3. 源代码编译:将Java代码编译为DEX文件
  4. 打包APK:将所有文件打包成APK压缩包
  5. 签名:对APK进行数字签名
  6. 对齐:进行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安装

  1. 推送APK到设备:
adb push xxx.apk /data/local/tmp
  1. 执行安装:
pm install /data/local/tmp/xxx.apk

八、关键工具总结

工具 用途
aapt/aapt2 资源打包
aidl AIDL文件编译
javac Java源代码编译
dx.jar Class转Dex
apksigner/jarsigner APK签名
zipalign APK对齐优化

九、完整打包流程总结

  1. 使用aapt/aapt2打包资源文件
  2. 使用aidl编译AIDL文件
  3. 使用javac编译Java源代码
  4. 使用dx.jar将class文件转为dex
  5. 将所有文件打包成APK
  6. 对APK进行签名
  7. 执行zipalign对齐优化
  8. 通过系统安装机制或ADB安装APK
Android逆向入门:APK编译、打包与安装详解 一、APK打包基础 1.1 APK组成结构 APK包主要包含两部分内容: 应用模块 :开发者编写的源代码、资源文件、AIDL接口文件 依赖模块 :第三方依赖库(aar、jar、so文件) 典型项目目录结构: 1.2 打包流程 资源打包 :生成R.java和编译后的资源文件 AIDL编译 :生成Java接口文件 源代码编译 :将Java代码编译为DEX文件 打包APK :将所有文件打包成APK压缩包 签名 :对APK进行数字签名 对齐 :进行zipalign对齐优化 二、资源打包工具详解 2.1 AAPT工具 基本命令格式: 参数说明: p :打包操作 -M :指定AndroidManifest.xml路径 -S :指定res目录路径 -I :指定android.jar路径(系统库) -J :指定R.java输出目录 -F :指定APK输出路径 2.2 AAPT2工具 AAPT2是AAPT的升级版,支持增量编译。 编译命令 : 链接命令 : 三、AIDL文件编译 使用SDK中的aidl.exe工具: 参数说明: -I :指定import搜索路径 -p :指定系统类import路径 -o :指定生成Java文件的目录 四、源代码编译 4.1 Java到Class 使用JDK的javac工具: 4.2 Class到Dex 使用dx.jar工具: 五、APK签名 5.1 生成密钥库 5.2 查看密钥库信息 5.3 签名APK 使用apksigner : 使用jarsigner : 六、Zipalign对齐 对齐命令: 注意事项: 使用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负责监听系统目录并自动安装应用: 7.3 网络下载安装 调用PackageManagerService的installPackage方法: 7.4 ADB安装 推送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