APK的构建过程

QuibblerQuibbler 2021-05-10 约 10 分钟 2640 次阅读

APK的构建过程

每当编译项目的时候,看着AS执行一系列的task并输出一堆build日志,就非常好奇AndroidStudio做了哪些工作?

抽空了解一下Android APK的构建过程,这其中涉及到的内容非常多。应用开发者只需要知道大概的流程,了解一些底层工作原理。不是专业的集成构建开发工程师不需要花时间钻太深,深挖的话每一步都能挖出一本书。

从AndroidStudio官方文档 Android Studio > 用户指南 > 配置构建">Android Studio > 用户指南 > 配置构建,可以看到标准的Android 应用模块构建流程如下:

开发者每次点击build菜单构建项目或者编译Apk的时候,AndroidStudio会自动帮开发者完成打包Apk的一系列操作,Google官方文档将Apk构建分为如下七步(加*的步骤应用开发者应该专门去深入理解):

①AAPT资源编译

使用Android SDK提供用aapt.exe生成R.Java文件。打包资源文件(包括res、assets、androidmanifest.xml等),生成资源包文件resources.arsc。

②生成AIDL阶段*

使用Android SDK提供的aidl.exe将.aidl文件生成相应Java文件。AIDL这方面开发者也是必须要掌握的,java文件的生成以后再看。

③Java/Kotlin编译

使用Jdk的javac命令编译Java源文件生成class文件。项目中如果有使用到Kotlin,还会编译Kotlin。

④dex打(分)包阶段

将class文件打包生成classes.dex文件,使用Android SDK提供的dx.bat将class文件转换成classes.dex文件。

⑤ApkBuilder打包

使用Android SDK提供apkbuilder.bat打包资源和classes.dex文件,生成生成未签名的apk。

⑥JarSigner签名处理*

用jarsinger命令对apk认证,生成signed.apk。

⑦zipAlign对齐优化*

使用zipalign对签名后的apk进行优化处理,对齐处理后通过内存映射访问apk文件会更快。

Apk构建中涉及不同工具的详细流程图如下,参考 Building and Running">Building and Running。

回到开头的问题:编译运行项目时,那一系列的输出对应哪些构建操作?


举个例子:新建一个项目,完整编译过程中输出的build信息如下。通过上面的学习,现在应该能知道下面大部分build信息的含义。

Executing tasks: [:app:assembleRelease] in project D:\code\PowerGroup

//预编译
> Task :app:preBuild UP-TO-DATE
> Task :app:preReleaseBuild UP-TO-DATE
> Task :app:compileReleaseAidl NO-SOURCE

//AIDL编译
> Task :app:compileReleaseRenderscript NO-SOURCE
> Task :app:dataBindingMergeDependencyArtifactsRelease UP-TO-DATE
> Task :app:dataBindingMergeGenClassesRelease UP-TO-DATE
> Task :app:generateReleaseResValues UP-TO-DATE
> Task :app:generateReleaseResources UP-TO-DATE
> Task :app:dataBindingTriggerRelease UP-TO-DATE

//生成BuildConfig
> Task :app:generateReleaseBuildConfig UP-TO-DATE
> Task :app:checkReleaseAarMetadata
> Task :app:createReleaseCompatibleScreenManifests
> Task :app:extractDeepLinksRelease UP-TO-DATE
> Task :app:processReleaseMainManifest
> Task :app:processReleaseManifest
> Task :app:javaPreCompileRelease UP-TO-DATE
> Task :app:mergeReleaseNativeDebugMetadata NO-SOURCE
> Task :app:mergeReleaseShaders UP-TO-DATE
> Task :app:compileReleaseShaders NO-SOURCE

//asset资源整合
> Task :app:generateReleaseAssets UP-TO-DATE
> Task :app:mergeReleaseAssets
> Task :app:compressReleaseAssets UP-TO-DATE
> Task :app:desugarReleaseFileDependencies UP-TO-DATE
> Task :app:processReleaseJavaRes NO-SOURCE
> Task :app:collectReleaseDependencies
> Task :app:sdkReleaseDependencyData
> Task :app:mergeReleaseJniLibFolders UP-TO-DATE
> Task :app:checkReleaseDuplicateClasses
> Task :app:mergeReleaseResources
> Task :app:dataBindingGenBaseClassesRelease UP-TO-DATE

//生成APK中Manifest文件
> Task :app:processReleaseManifestForPackage

//生成R.jar文件
> Task :app:processReleaseResources

//编译Kotlin
> Task :app:compileReleaseKotlin

//编译Java
> Task :app:compileReleaseJavaWithJavac
#注: 某些输入文件使用或覆盖了已过时的 API。
#注: 有关详细信息, 请使用 -Xlint:deprecation 重新编译。
> Task :app:compileReleaseSources
> Task :app:lintVitalRelease
> Task :app:dexBuilderRelease
> Task :app:mergeExtDexRelease
> Task :app:mergeReleaseNativeLibs
> Task :app:stripReleaseDebugSymbols
> Task :app:mergeReleaseJavaResource

//合并.dex文件
> Task :app:mergeDexRelease

//将.dex等文件打包进apk文件中并签名,这里编译的是release版本apk
> Task :app:packageRelease

//使用zipalign对apk进行优化
> Task :app:assembleRelease

//成功构建APK
BUILD SUCCESSFUL in 40s

33 actionable tasks: 21 executed, 12 up-to-date
Build Analyzer results available

至此,对Apk的构建流程有一个初步的认识,应用开发者了解一下Apk的构建过程即可,想要了解Apk的构建细节详见更多资料。

更多资料:

        Androiddevnotes > the internals of android apk build process

        How Android Apps are Built and Run

        APKファイルが作られる流れを初心者向けに解説

        APK构建原理由浅入深

        How does the Android build process work?

        Android Build Process

        

相关推荐

精选
ViewPager和PagerAdapter、FragmentPagerAdapter、FragmentStatePager
Android

ViewPager和PagerAdapter、FragmentPagerAdapter、FragmentStatePager

ViewPager1、ViewPagerandroidx.viewpager.widget.ViewPager,Android中使用非常广泛的控件,可以说是APP必备:首次打开引导页、页面Banner广告等。常用方法:setAdapter() 设置适配器setOffscreenPageLimit() 设置缓存的页面个数,默认是 1setCurrentItem() 跳转到特定的页面setOnPage

1.1k
获取Android内置WebView内核版本
Android

获取Android内置WebView内核版本

获取Android内置WebView内核版本竟然能遇到这样奇葩的事情,网页用的技术过于新颖,以至于只支持高版本Chromium内核的,低版本安卓系统中内置的内核版本较低,无法加载前端页面。1、设置查看在系统设置里 > 应用 > 应用管理 > 显示系统应用,查看WebView组件:2、页面查看通过WebView发起的网络请求,都会带上浏览器的UA,通常页面都可以通过UA判断浏览器的内核版本。这里有两

1.1w
Android 14适配总结
Android

Android 14适配总结

Android 14适配总结毕业工作至今已经适配了三个Android大版本,从Android 11到Android 12、再到Android 13。2023年,Google即将推出的Android 14,上半年已经开始第一批适配。现在,第四个Android版本已经适配完,总结记录一下。1、Android 14计划Google一般会在2月份对外发布预告,同时放出开发者预览版。“拉通”各大平台、厂商以

1.1w