Android中.apk文件的编译流程

本文详细介绍了APK文件从源代码到最终可安装文件的整个编译过程,包括生成R.java文件、编译Java源码、转换为DEX格式、资源打包、签名等步骤。

http://www.claudxiao.net/2011/04/compile_apk/


apk文件的编译流程图如下:


下面逐一说明:

项目的源文件结构如下:

E:\Example\
│  AndroidManifest.xml
│  
├─assets
├─res
│  ├─drawable-hdpi
│  │      icon.png
│  │      
│  ├─drawable-ldpi
│  │      icon.png
│  │      
│  ├─drawable-mdpi
│  │      icon.png
│  │      
│  ├─layout
│  │      main.xml
│  │      
│  └─values
│          strings.xml
│          
└─src
    └─net
        └─claudxiao
            └─example
                    Example.java

1、从res生成R.java

mkdir gen

aapt package -f -m -J gen -S res -I “E:\Program Files\Android\android-sdk-windows\platforms\android-7\android.jar” -M AndroidManifest.xml

其中,-f将覆盖已有结果,-m -J gen指定输出路径,-S指定资源文件目录,-I指定要包含的包,-M指定AndroidMenifest.xml文件。

2、将.java编译为.class

mkdir bin

javac -encoding GB18030 -target 1.6 -bootclasspath “E:\Program Files\Android\android-sdk-windows\platforms\android-7\android.jar” -d bin src\net\claudxiao\example\Example.java gen\net\claudxiao\Example\R.java

其中,-target指定类文件的虚拟机版本,-bootclasspath覆盖引导类文件的位置,-d指定输出路径。

3、将.class编译为classes.dex

dx.bat –dex –output=E:\Example\bin\classes.dex E:\Example\bin

注意这里必须用绝对路径。

4、将资源文件打包

aapt package -f -M AndroidManifest.xml -S res -A assets -I “E:\Program Files\Android\android-sdk-windows\platforms\android-7\android.jar” -F bin\resources.ap_

-F指定输出的apk文件。

5、打包成未签名apk文件

apkbuilder.bat E:\Example\bin\Example_unsigned.apk -u -z E:\Example\bin\resources.ap_ -f E:\Example\bin\classes.dex -rf E:\Example\src

这个命令的常用格式为:

apkbuilder ${output.apk.file} -u -z ${packagedresource.file} -f ${dex.file} -rf ${source.dir} -rj ${libraries.dir}

参数必须使用绝对路径。

此外,运行后提示这一工具即将被废弃,但我没有找到新的替代工具是什么。

6、生成一个签名

keytool -genkey -alias android.keystore -keyalg RSA -validity 20000 -keystore android.keystore

当前目录下生成了一个android.keystore文件

7、对apk文件签名

jarsigner -keystore E:\Example\android.keystore -storepass claudxiao -keypass claudxiao -signedjar E:\Example\bin\Example.apk E:\Example\bin\Example_unsigned.apk android.keystore

这个命令的常用格式为:

jarsigner -keystore ${keystore} -storepass ${keystore.password} -keypass ${keypass} -signedjar ${signed.apkfile} ${unsigned.apkfile} ${keyalias}

至此,bin\Example.apk就是一个可以安装的apk文件了。作为对比,现在的目录结构如下:

E:\Example\
│  android.keystore
│  AndroidManifest.xml
│  
├─assets
├─bin
│  │  classes.dex
│  │  Example.apk
│  │  Example_unsigned.apk
│  │  resources.ap_
│  │  
│  └─net
│      └─claudxiao
│          └─example
│                  Example.class
│                  R$attr.class
│                  R$drawable.class
│                  R$layout.class
│                  R$string.class
│                  R.class
│                  
├─gen
│  └─net
│      └─claudxiao
│          └─example
│                  R.java
│                  
├─res
│  ├─drawable-hdpi
│  │      icon.png
│  │      
│  ├─drawable-ldpi
│  │      icon.png
│  │      
│  ├─drawable-mdpi
│  │      icon.png
│  │      
│  ├─layout
│  │      main.xml
│  │      
│  └─values
│          strings.xml
│          
└─src
    └─net
        └─claudxiao
            └─example
                    Example.java

编译 Android CTS 中的 `CtsCameraTestCases.apk` 涉及对 Android 源码中测试模块的构建流程。以下是详细的步骤说明: ### 准备工作 在开始编译之前,需要确保已经完成以下准备工作: - 获取 Android 源码,并切换到对应的版本分支(如 Android 13、14 等)。 - 确保编译环境已正确配置,包括安装必要的依赖库、工具链等。 - 确保已执行过 `source build/envsetup.sh` 和 `lunch` 命令,选择合适的设备目标。 ### 编译步骤 1. **定位到测试模块目录** `CtsCameraTestCases.apk` 是 Android CTS 测试套件的一部分,其源码通常位于以下路径中: ``` cts/tests/camera/CtsCameraTestCases ``` 2. **单独编译测试模块** 使用 `mm` 命令可以仅编译当前目录下的模块: ```bash cd cts/tests/camera/CtsCameraTestCases mm ``` 编译完成后,生成的 APK 文件会位于: ``` $OUT/data/app/CtsCameraTestCases/CtsCameraTestCases.apk ``` 3. **通过完整 CTS 构建流程编译** 如果希望构建整个 CTS 测试包,可以使用以下命令: ```bash make cts ``` 这将构建所有 CTS 相关的测试用例,包括 `CtsCameraTestCases.apk`。构建完成后,APK 文件将包含在 CTS 测试包中: ``` out/host/linux-x86/cts/android-cts/testcases/CtsCameraTestCases.apk ``` 4. **将 APK 安装到设备进行测试** 编译完成后,可以使用 `adb` 工具将 APK 安装到设备上并运行测试: ```bash adb install -r $OUT/data/app/CtsCameraTestCases/CtsCameraTestCases.apk adb shell pm grant android.camera.cts android.permission.CAMERA ``` 5. **运行测试用例** 使用如下命令运行特定测试类或方法: ```bash adb shell am instrument -e class android.hardware.camera2.cts.ZoomCaptureTest#testRawZoomCapture -w android.camera.cts/androidx.test.runner.AndroidJUnitRunner ``` ### 注意事项 - 编译时应确保 Android 源码版本与目标设备的系统版本一致,以避免兼容性问题。 - 部分测试用例可能依赖特定权限或设备特性,如摄像头硬件支持,需确保设备满足测试要求[^4]。 - 若测试失败,需结合日志分析问题,如修改驱动逻辑以满足 CTS 测试的精度要求等。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值