详细研究,把代码编译成一个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类。
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文件。
(1)Resource文件(即工程res中的文件)
(2)Assets文件(即工程assets中的文件)
(3)AndroidMainfest.xml文件
(4)Android基础类库(Android.jar文件)
(1)R.java文件(在model工程的build/generated目录)
(2)打包好的资源
(1)appt工具
(1)aidl文件
(2)framework.aidl文件
(1)可用于进程通信的C/S端java代码,位于build/generated/source/aidl
(1)aidl工具
(1)源码文件(包括第1步的R.java和第2步AIDL生成的.java文件)
(2)库文件(.jar文件)
(1)对应的.class文件(对于gradle编译,在build/intermediates/classes里,看到输出的class文件)
(1)javac工具(使用javac进行正常的java编译生成class文件)
(1)第3步生成的.class文件(包括AIDL、R.java、源代码生成的.class文件)
(2)库文件(.jar文件)
(1)对应的.dex文件
(1)javac工具(调用dx.bat将所有的.class文件转化为classes.dex文件,dx会将class转换为Dalvik字节码,生成常量池,消除冗余数据等。)
(1)第1步打包后的资源文件(包含resources.arcs的.ap_文件,包括本地和第三方库里的)
(2)第4步打包后的.dex文件
(3)其他资源:libs文件(包括:jni开发生成的.so文件,如果涉及C/C++开发的话)
(1)未签名的.apk文件
(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());
(1)未签名的.apk文件
(1)签名的.apk文件
(1)Jarsigner工具
(1)签名的.apk文件
(1)对齐后的.apk文件
(1)zipalign工具。使得apk中的资源文件偏离文件起始位置为4字节的整数倍,从而可以通过内存映射直接访问apk文件,从而减少RAM占用。
AndroidStudio Build过程解析
Android App 构建流程分析