概述

AndroidStudio点击build按钮后,AndroidStudio就会编译整个项目,并将apk安装到手机上,这个过程就是Android工程编译打包过程。下图为主要过程:


APK构建流程

下图是谷歌官网给出的一个典型的APK构建流程。
主要有两个过程:

  • 编译过程。输入是本工程的文件以及依赖的各种库文件,输出是dex文件和编译后的资源文件。
  • 打包过程。配合Keystore对上述的输出进行签名对齐,生成最终的apk文件。

APK构建步骤详解

Android APK构建的详细步骤,请看下图所示


1、打包资源文件,生成R.java文件
输入:
(1)Resource文件(即工程res中的文件)
(2)Assets文件(即工程assets中的文件)
(3)AndroidMainfest.xml文件
(4)Android基础类库(Android.jar文件)
输出:
(1)R.java文件(在model工程的build/generated目录)
(2)打包好的资源
工具:aapt工具

2、处理AIDL文件(没有可以省略),生成对应的.java文件
输入:源码文件、aidl文件、framework.aidl文件
输出:对应的.java文件
工具:aidl工具

3、编译Java文件,生成对应的.class文件
输入:
(1)源码文件(包括第1步的R.java和第2步AIDL生成的.java文件)
(2)库文件(.jar文件)
输出:对应的.class文件
工具:javac工具

4、把.class文件转化成Davik VM支持的.dex文件
输入:
(1)第3步生成的.class文件(包括AIDL、R.java、源代码生成的.class文件)
(2)库文件(.jar文件)
输出:对应的.dex文件
工具:javac工具

5、打包生成未签名的.apk文件
输入:
(1)打包后的资源文件(包括本地和第三方库里的)
(2)打包后的.dex文件
(3)libs文件(包括.so文件,如果涉及C/C++开发的话)
输出:未签名的.apk文件
工具:apkbuilder工具

6、对未签名.apk文件进行签名
输入:未签名的.apk文件
输出:签名的.apk文件
工具:jarsigner工具

7、对签名后.apk文件进行对齐处理
输入:签名的.apk文件
输出:对齐后的.apk文件
工具:zipalign工具

其他

整个过程可以通过命令行./gradlew assembleRelease --info(Mac系统)执行的Task看到。

Tasks to be executed: [task ':app:preBuild', task ':app:preReleaseBuild', task ':app:compileReleaseAidl', task ':app:compileReleaseRenderscript', task ':app:checkReleaseManifest', task ':app:generateReleaseBuildConfig', task ':app:prepareLintJar', task ':app:generateReleaseResValues', task ':app:generateReleaseResources', task ':app:mergeReleaseResources', task ':app:createReleaseCompatibleScreenManifests', task ':app:processReleaseManifest', task ':app:splitsDiscoveryTaskRelease', task ':app:processReleaseResources', task ':app:generateReleaseSources', task ':app:javaPreCompileRelease', task ':app:compileReleaseJavaWithJavac', task ':app:compileReleaseNdk', task ':app:compileReleaseSources', task ':app:mergeReleaseShaders', task ':app:compileReleaseShaders', task ':app:generateReleaseAssets', task ':app:mergeReleaseAssets', task ':app:transformClassesWithPreDexForRelease', task ':app:transformDexWithDexForRelease',task ':app:mergeReleaseJniLibFolders', task ':app:transformNativeLibsWithMergeJniLibsForRelease', task ':app:transformNativeLibsWithStripDebugSymbolForRelease', task ':app:processReleaseJavaRes', task ':app:transformResourcesWithMergeJavaResForRelease', task ':app:packageRelease', task ':app:lintVitalRelease', task ':app:assembleRelease']
通过反编译APK文件,可以间接看到打包流程和APK的组成文件
反编译主要过程
(1)将apk解压(可以变成zip压缩文件再解压)
(2)找到classes.dex文件,用 dex2jar工具 ,将dex文件转换成jar文件,命令 d2j-dex2jar classes.dex
(3)用 jd-gui 工具,将jar文件转换成java代码
(4)用 apktool 这个工具用于最大幅度地还原APK文件中的9-patch图片、布局、字符串等等一系列的资源。命令 apktool d Demo.apk

解压APK文件后,文件目录如下图:



参考文件

https://developer.android.com/studio/build/?hl=zh-cn

https://www.jianshu.com/p/e86aadcb19e0

更多相关文章

  1. [Android(安卓)Studio 权威教程]打包、生成jks密钥、签名Apk、多渠
  2. Android(安卓)studio Gradle home can not be found - Android(
  3. 系统总结归纳一下android
  4. android中JNI使用探究
  5. android 调用系统文件管理器
  6. Android菜鸟实训的第一天
  7. 分享几点Android(安卓)开发中的小技巧
  8. Android开发环境迁移到Android(安卓)Stdio 3.5.2
  9. NPM 和webpack 的基础使用

随机推荐

  1. androidx升级注意事项
  2. 低版本android project在高版本ADK中运行
  3. android 截取验证码的两种实现方式
  4. 创建Android(安卓)虚拟机AVD(Android(安卓
  5. 详细整理iOS中UITableView的性能优化
  6. android 利用adb连接手机调试程序
  7. Android依赖注入:Google Guice on Android
  8. android下的MVP架构
  9. Kotlin~基本语法
  10. Android Studio入门体验