Android进阶之Android build构建流程

1 Apk构建基本流程

  详细研究,把代码编译成一个apk文件并安装到手机上的这个过程中,是怎么把代码和资源文件打包成一个apk文件,并安装到手机上的?
这里写图片描述
  此图描述了:Android Project经过编译打包后生成apk文件,然后再经过签名,就可以安装到设备上。编译过程:输入是本工程的文件以及依赖的各种库文件;输出是dex文件和编译后的资源文件打包过程:配合Keystore对上述的输出进行签名对齐,生成最终的apk文件。将一个实际的apk文件后缀改为zip并解压后,得到的内容如下:

 - classes.dex…
 - resources.arsc
 - assets
 - res
 - AndroidManifest.xml
 - META-INF

  res中图片和raw文件下内容保持原样,res中其他xml文件内容均转化为二进制形式;assets文件内容保持原样。res中的文件会被映射到R.java文件中,访问的时候直接使用资源ID即R.id.filename;assets文件夹下的文件不会被映射到R.java中,访问的时候需要AssetManager类。

2 gradle assembleRelease打印的日志

Run build   26s 273ms   
Configure settings  319ms   
Configure build 9s 438ms    
Calculate task graph    222ms   
Run tasks   15s 245ms   
    :app:preBuild   46ms    
    :app:preReleaseBuild    1ms 
    :app:checkReleaseManifest   6ms 
    :app:preDebugBuild  2ms 
    :app:prepareComAndroidSupportAnimatedVectorDrawable2531Library  93ms    
    :app:prepareComAndroidSupportAppcompatV72531Library 187ms   
    :app:prepareComAndroidSupportSupportCompat2531Library   15ms    
    :app:prepareComAndroidSupportSupportCoreUi2531Library   10ms    
    :app:prepareComAndroidSupportSupportCoreUtils2531Library    12ms    
    :app:prepareComAndroidSupportSupportFragment2531Library 15ms    
    :app:prepareComAndroidSupportSupportMediaCompat2531Library  31ms    
    :app:prepareComAndroidSupportSupportV42531Library   11ms    
    :app:prepareComAndroidSupportSupportVectorDrawable2531Library   20ms    
    :app:prepareReleaseDependencies 3ms 
    :app:compileReleaseAidl 142ms   
    :app:compileReleaseRenderscript 33ms    
    :app:generateReleaseBuildConfig 70ms    
    :app:generateReleaseResValues   10ms    
    :app:generateReleaseResources   1ms 
    :app:mergeReleaseResources  3s 997ms    
    :app:processReleaseManifest 155ms   
    :app:processReleaseResources    1s 10ms 
    :app:generateReleaseSources 1ms 
    :app:incrementalReleaseJavaCompilationSafeguard 31ms    
    :app:compileReleaseJavaWithJavac    2s 310ms    
    :app:compileReleaseNdk  4ms 
    :app:compileReleaseSources  1ms 
    :app:lintVitalRelease   4s 49ms 
    :app:mergeReleaseShaders    21ms    
    :app:compileReleaseShaders  28ms    
    :app:generateReleaseAssets  1ms 
    :app:mergeReleaseAssets 25ms    
    :app:transformClassesWithDexForRelease  1s 420ms    
    :app:mergeReleaseJniLibFolders  13ms    
    :app:transformNative_libsWithMergeJniLibsForRelease 32ms    
    :app:processReleaseJavaRes  2ms 
    :app:transformResourcesWithMergeJavaResForRelease   27ms    
    :app:packageRelease 1s 195ms    
    :app:assembleRelease    1ms 

  总结大概如下:

 - 预编译,如果主module依赖了其他module,那么被依赖的module也会进行编译。
 - 打包资源文件
 - 处理配置清单文件和资源文件
 - 编译,源码被编译成字节码
 - 执行所有transform开头的任务
 - 依赖的library生成.aar文件,application生成.apk文件。

3 Apk构建详细流程图

这里写图片描述

2.1 application resources通过aapt执行生成R.java

2.1.1 输入

1)Resource文件(即工程res中的文件)
(2)Assets文件(即工程assets中的文件)
(3)AndroidMainfest.xml文件
(4)Android基础类库(Android.jar文件)

2.1.2 输出

1)R.java文件(在model工程的build/generated目录)
(2)打包好的资源

2.1.3 工具

(1)appt工具

2.2 aidl文件(没有可以省略)通过aidl工具生成aidl.java

2.2.1 输入

1)aidl文件
(2)framework.aidl文件

2.2.2 输出

1)可用于进程通信的C/S端java代码,位于build/generated/source/aidl

2.2.3 工具

(1)aidl工具

2.3 通过Java Compiler编译R.java、Java接口文件、Java源文件,生成.class文件

2.3.1 输入

1)源码文件(包括第1步的R.java和第2步AIDL生成的.java文件)
(2)库文件(.jar文件)

2.3.2 输出

1)对应的.class文件(对于gradle编译,在build/intermediates/classes里,看到输出的class文件)

2.3.3 工具

1)javac工具(使用javac进行正常的java编译生成class文件)

2.4 通过dex命令,将.class文件和第三方库中的.class文件处理生成Davik VM支持的classes.dex

2.4.1 输入

1)第3步生成的.class文件(包括AIDL、R.java、源代码生成的.class文件)
(2)库文件(.jar文件)

2.4.2 输出

1)对应的.dex文件

2.4.3 工具

1)javac工具(调用dx.bat将所有的.class文件转化为classes.dex文件,dx会将class转换为Dalvik字节码,生成常量池,消除冗余数据等。)

2.5 通过apkbuilder工具,将aapt生成的resources.arsc和res文件、assets文件和classes.dex一起打包生成apk

2.5.1 输入

1)第1步打包后的资源文件(包含resources.arcs.ap_文件,包括本地和第三方库里的)
(2)第4步打包后的.dex文件
(3)其他资源:libs文件(包括:jni开发生成的.so文件,如果涉及C/C++开发的话)

2.5.2 输出

1)未签名的.apk文件

2.5.3 工具

1)apkbuilder工具

(2)步骤
// 以包含resources.arcs.ap_文件为基础,new一个ApkBuilder,设置debugMode
apkBuilder.addZipFile(f);
apkBuilder.addSourceFolder(f);
apkBuilder.addResourcesFromJar(f);
apkBuilder.addNativeLibraries(nativeFileList);
apkBuilder.sealApk(); // 关闭apk文件
generateDependencyFile(depFile, inputPaths, outputFile.getAbsolutePath());

2.6 通过Jarsigner工具对生成的apk进行签名

2.6.1 输入

1)未签名的.apk文件

2.6.2 输出

1)签名的.apk文件

2.6.3 工具

(1)Jarsigner工具

2.7 通过zipalign工具,将签名后的apk进行对齐处理

2.7.1 输入

1)签名的.apk文件

2.7.2 输出

1)对齐后的.apk文件

2.7.3 工具

(1)zipalign工具。使得apk中的资源文件偏离文件起始位置为4字节的整数倍,从而可以通过内存映射直接访问apk文件,从而减少RAM占用。

3 参考链接

AndroidStudio Build过程解析

Android App 构建流程分析

猜你喜欢

转载自blog.csdn.net/chenliguan/article/details/80727826