> 文档中心 > 全命令行打包APK

全命令行打包APK


全命令打包AP体验

进行一次安卓手动打包,全程命令行操作

APK构建流程

先看看Google给出的构建流程
全命令行打包APK

典型 Android 应用模块的构建流程(如图 1 所示)按照以下常规步骤执行:

  • 编译器将您的源代码转换成 DEX 文件(Dalvik 可执行文件,其中包括在 Android 设备上运行的字节码),并将其他所有内容转换成编译后的资源
  • 打包器将 DEX 文件和编译后的资源组合成 APK 或 AAB(具体取决于所选的 build 目标)。 必须先为 APK 或 AAB 签名,然后才能将应用安装到 Android 设备或分发到 Google Play 等商店。
  • 打包器使用调试或发布密钥库为 APK 或 AAB 签名:
    • 如果您构建的是调试版应用(即专门用来测试和分析的应用),则打包器会使用调试密钥库为应用签名。Android Studio 会自动使用调试密钥库配置新项目。
    • 如果您构建的是打算对外发布的发布版应用,则打包器会使用发布密钥库(您需要进行配置)为应用签名。如需创建发布密钥库,请参阅在 Android Studio 中为应用签名。
  • 在生成最终 APK 之前,打包器会使用 zipalign 工具对应用进行优化,以减少其在设备上运行时所占用的内存。
    构建流程结束时,您将获得应用的调试版或发布版 APK/AAB,以用于部署、测试或向外部用户发布。

准备工作

  1. 开启AndroidStudio新建项目Empty工程
  2. 删除无用用资源文件 仅保留可支行的资源文件(方便后面操作)

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