打包APK体验
进行一次安卓手动打包,全程命令行操作
APK构建流程
先看看Google给出的构建流程
典型 Android 应用模块的构建流程(如图 1 所示)按照以下常规步骤执行:
- 编译器将您的源代码转换成 DEX 文件(Dalvik 可执行文件,其中包括在 Android 设备上运行的字节码),并将其他所有内容转换成编译后的资源。
- 打包器将 DEX 文件和编译后的资源组合成 APK 或 AAB(具体取决于所选的 build 目标)。 必须先为 APK 或 AAB 签名,然后才能将应用安装到 Android 设备或分发到 Google Play 等商店。
- 打包器使用调试或发布密钥库为 APK 或 AAB 签名:
- 如果您构建的是调试版应用(即专门用来测试和分析的应用),则打包器会使用调试密钥库为应用签名。Android Studio 会自动使用调试密钥库配置新项目。
- 如果您构建的是打算对外发布的发布版应用,则打包器会使用发布密钥库(您需要进行配置)为应用签名。如需创建发布密钥库,请参阅在 Android Studio 中为应用签名。
- 在生成最终 APK 之前,打包器会使用 zipalign 工具对应用进行优化,以减少其在设备上运行时所占用的内存。
构建流程结束时,您将获得应用的调试版或发布版 APK/AAB,以用于部署、测试或向外部用户发布。
准备工作
- 开启AndroidStudio新建项目Empty工程
- 删除无用用资源文件 仅保留可支行的资源文件(方便后面操作)
打包APK流程
1. 编译资源文件
新版本已经使用aapt2来替代appt工具
aapt2支持单个文件修改生成中间文件,可以做到增量修改
使用appt2 compile转义资源文件,将资源文件转成flat的文件,可以单个文件进行处理,这样当单个文件发生变化时可以再将单个文件进行处理,不需要每次全量
这里为操作方便对文件夹进行统一编译
语法:
aapt2 compile path-to-input-files [options] -o output-directory/
命令:
aapt2 compile --dir app/src/main/res -o compiled/
-o指定生成文件的存储路径 如果生成失败或不是文件夹 可以手动创建compiled文件夹
操作完成会在执行目录下生成所有资源文件的中转文件: (删除过很多资源文件,仅保留可让apk运行的文件)
compiled/----
|---- compiled/drawable_ic_launcher.webp.flat
|---- compiled/drawable_ic_launcher_background.xml.flat
|---- compiled/layout_activity_main.xml.flat
|---- compiled/values_colors.arsc.flat
|---- compiled/values_strings.arsc.flat
2. 生成R文件和apk文件
在链接阶段,AAPT2 会合并在编译阶段生成的所有中间文件(如资源表、二进制 XML 文件和处理过的 PNG 文件),并将它们打包成一个 APK。此外,在此阶段还会生成其他辅助文件,如 R.java 和 ProGuard 规则文件。不过,生成的 APK 不包含 DEX 字节码且未签名。也就是说,您无法将此 APK 部署到设备。如果您不使用 Android Gradle 插件从命令行构建应用,则可以使用其他命令行工具,如使用 d8 将 Java 字节码编译为 DEX 字节码,以及使用 apksigner 为 APK 签名。
语法 :
aapt2 link path-to-input-files [options] -o outputdirectory/outputfilename.apk --manifest AndroidManifest.xml
命令 :
aapt2 link -o resourece.apk -I /Users/chao/Library/Android/sdk/platforms/android-29/android.jar compiled/drawable_ic_launcher.webp.flat compiled/drawable_ic_launcher_background.xml.flat compiled/layout_activity_main.xml.flat compiled/values_colors.arsc.flat compiled/values_strings.arsc.flat --java app/src/main/java --manifest app/src/main/AndroidManifest.xml --min-sdk-version 21
-o 指向的文件就是生成的apk文件,
-I 指向的是资源文件生成的所有flat文件
--java 指向生成的R文件位置即java文件的位置
--manifest 指向应用的AndroidManifest文件
--min-sdk-version 指定最小版本号
完成后会在 java代码中生成R.class
在生成-o指定的apk文件
3. 生成class文件
将上一步生成的R.java和其他java文件编译成class文件
命令 :
javac -d build -cp /Users/chao/Library/Android/sdk/platforms/android-29/android.jar app/src/main/java/com/chao/buildapk/*.java
-cp 告诉jvm,需要用到的类路径可以在对应路径下查找
完成后会在build目录下生成对应的class文件
4. 转dex文件
将class文件转译打包成dex文件
命令 :
/Users/chao/Library/Android/sdk/build-tools/29.0.2/dx --dex --output=classes.dex build
5. dex文件打包进apk
使用zip命令将dex文件放入apk中
命令 :
zip resourece.apk classes.dex
6. 签名apk
因为方便直接使用自带的debug.keystore签名apk
命令 :
jarsigner -verbose -keystore ~/.android/debug.keystore -signedjar resource_sign.apk resourece.apk androiddebugkey -digestalg SHA1 -sigalg MD5withRSA
密码: android
最后安卓文件
adb install -t resourece.apk