Android构建系统是你用于构建,测试,运行及打包你的apps的工具包。构建系统既可以作为一个集成工具通过Android Studio的菜单运行,也可以在命令行中独立地运行。你可以使用构建系统的功能来做这些事情:

  • 定制,配置,及扩展构建过程
  • 使用相同的项目及模块,为你具有不同功能的app创建多个APKs。
  • 在源码集合间复用代码和资源。

Android构建系统的灵活性使得你能够在不改变你的app的核心源代码文件的情况下达成所有这些目标。要编译一个Android Studio项目,请参考Building and Running from Android Studio。要对Android Studio项目配置特别的构建设置,请参考Configuring Gradle Builds。

构建过程详解

构建过程包含了在产生.apk的过程中用到的许多工具及有中间文件产生的子过程。如果你在使用Android Studio做开发,则在你每次为你的项目或模块运行Gradle build task时,都会完成完整的构建过程。构建过程是非常灵活的,而由于许多构建过程是可配置并可扩展的,因而理解构建过程背后都发生了什么是很有用的。下图描述了包含在一次构建中的不同工具及过程:


一次典型构建的常规过程大体如下。构建系统从配置的product flavors,build types,和dependencies合并所有的资源。如果不同目录下包含的资源具有相同的名字或设定,则遵循的覆盖优先级顺序为:dependencies覆盖build types,build types覆盖product flavors,product flavors覆盖main source目录:

  • Android Asset Packaging Tool (aapt)获取你的应用程序的资源文件,比如AndroidManifest.xml文件及你的Activities的XML文件,并编译它们。同时会产生R.java文件,以便于你可以在你的Java代码中引用你的资源。
  • aidl工具将你所有的.aidl接口转换为Java接口。
  • 你所有的Java代码,包括R.java和.aidl文件,被Java编译器编译为.class文件输出。
  • dex工具将.class文件转换为Dalvik字节码。你的模块中包含的所有第3方库及.class文件也会被转换为.dex文件,以便于它们可以被打包进最后的.apk文件。
  • 所有没有被编译的资源(比如图片),已编译的资源,及.dex文件被发送给apkbuilder工具来打包成一个.apk文件。
  • 一旦构建了.apk,则在它能够被安装到一个设备之前必须用一个debug或release key来签名。
  • 最后,如果应用以release模式签名,则你必须用zipalign工具来align你的.apk。Aligning最后的.apk在应用程序运行于一个设备上时可以降低内存的用量。

注意:Apps有一个限制,引用的method数被限制在64K以内。如果你的app达到了这个限制,构建过程将输出如下的错误消息:

Unable to execute dex: method ID not in [0, 0xffff]: 65536.

要避免这个错误,请参考Building Apps with Over 65K Methods。

构建输出

构建过程为每次构建在app/build目录下产生一个不同的APK:app/build/outputs/apk/目录包含名为app-<flavor>-<buildtype>.apk的包;比如app-full-release.apk和app-demo-debug.apk。

Done

原文。

更多相关文章

  1. Android中的拿来主义
  2. Android(安卓)Studio 3.6.2 | 使用内置文件浏览器查看文件
  3. 在Android中嵌入C语言程序----Android(安卓)JNI详述
  4. Android(安卓)定制EditText 改变 底线颜色
  5. Proguard混淆器Android
  6. Android(安卓)Root分析及防范
  7. Android(安卓)studio中TextView改变字体的两种方式(如仿宋、隶书)
  8. Android(Java)加载SO文件
  9. Android之Android(安卓)studio如何解决Multiple dex files defin

随机推荐

  1. 如何用DWR返回一个html页面?
  2. HTML-HTML5+CSS3权威指南阅读(五、深入理
  3. Why wont .html() work on class=“error
  4. 如何让父母与孩子一起成长?
  5. link标签和script标签跑到body下面,网页顶
  6. HTML高级标签之窗口分帧(前台界面演示)
  7. easyui-tree根据叶子节点获取父节点值(N
  8. HTML中的attribute和property的区别
  9. 夜灵的Html笔记Day04——CSS3basic
  10. 网页局部打印