Android编译过程
Android Studio是用gradle编译Android项目的代码和资源。
我们先来了解下编译Android应用的过程

过程如下:
- 首先源码会转化为dex文件,Dex文件包含运用应用需要的字节码,dex文件就是.class文件
- 这些dex文件和资源文件相结合构建成APK包
- APK包会使用debug或release版本的keystore来签名
- 如果编译的app用于测试和分析,Apk packager会使用debug的keystore签名生成APK包
- 如果编译的app是用于发布的版本,Apk packager会使用release的keystore签名生成APK包
- 在生成APK包之前,Apk packager会优化App和删除没引用的代码
完成这些过程后,会得到一个可运用的APK包
配置文件
当创建一个新的Android Studio项目时,会自动创建一些文件,下面我们先了解下Android项目的目录结构

- Gradle setting文件: setting.gradle是在根目录下的文件,它包含App所需的modules
- Top-level的build文件: top-level build.gradle是也是在根目录下的文件,它是一个全局配置文件,如果配置用于全部的modules,则可以在此文件配置
- Module-level的build文件: module-level build.gradle是在project/module目录下的文件,它的配置只对当前目录的module有效
- Gradle properties文件: 该文件下的配置用于gradle
技巧地使用Gradle
下面列举一些使用gradle的使用技巧
-
添加构建依赖:
Android项目可以添加多个module或library作为依赖,此时可以module-level的build文件中添加apply plugin: 'com.android.application' android { ... } dependencies { // 添加本地库 implementation project(":mylibrary") // 添加本地二进制库 implementation fileTree(dir: 'libs', include: ['*.jar']) // 添加远程二进制库 implementation 'com.example.android:app-magic:12.3' } -
管理依赖的版本:
在有几个module项目中,有很多依赖库,最麻烦的是有很多依赖库版本号冲突,类似于如下的build.gradle文件apply plugin:'com.android.application' android{ defaultConfig{...} buildTypes{...} ProductFlavours{...} } dependencies{ //android support库 implementation'com.android.support:appcompat-v7:28.0.0' implementation'com.android.support:design:28.0.0' implementation'com.android.support:cardview-v7:28.0.0' //其他的依赖库 }这样很难管理依赖库的版本,解决的办法是在gradle的ext中定义变量值
apply plugin: 'com.android.application' android { defaultConfig{...} buildTypes{...} ProductFlavours{...} } ext { supportLibraryVersion = '28.0.0' } dependencies { //android support库 implementation "com.android.support:appcompat-v7:$supportLibraryVersion" implementation "com.android.support:design:$supportLibraryVersion" implementation "com.android.support:cardview-v7:$supportLibraryVersion" //其他库 }如果作用于多个module项目中,可以在top-level的build文件中定义变量值
buildscript { } allprojects { } ext { supportLibraryVersion = '28.0.0' }在module-level文件中添加
com.android.support:appcompatv7:$rootProject.supportLibraryVersion -
加快编译速度:
有时我们编译项目,会花费很多时间在编译中,大大降低了开发过程速度。现在我们忽略硬件设备来提高编译速度。- 实时更新Android Studio。每次Android Studio更新,都会优化工具和加快编译速度
- 避免编译一些暂时不需要的资源文件,可以在module-level的build文件中定义flavor来指定某些资源文件
android { ... productFlavors { dev { ... // 这里指定使用xxhdpi的资源文件 resConfigs "xxhdpi" } ... } }- 如果不使用Crashlytics报告,可以停止使用,加快编译速度
android { ... buildTypes { debug { ext.enableCrashlytics = false } } }-
避免使用动态的版本号来管理依赖库,类似
'com.android.tools.build:gradle:2.+',这样会每次编译都会检查最新版本,之后下载更新,使得编译更慢 -
如果你网络本身慢的,也会影响编译速度,gradle每次编译会尝试使用网络资源的依赖库,因此使用离线模式(offline model)。这个可以在首选项(Preference)->Build->Gradle中设置,这里不详细写。
-
优化和瘦身App
如果使你的App更小,则你可以使用shrinking来瘦身的App,它会删除不使用的代码和资源文件。很多时候,我们只是使用依赖库的某些功能我,而不需要加载整个依赖库,我们只保留使用的功能。ProGuard可以做到瘦身优化,减少不使用的我代码和资源文件。可以阅读如下资源
总结
如果我们掌握Gradle的开发技巧,可以极大提升编译速度,不用浪费更多的时间在等待中,同时Gradle也是很好的构建编译工具,需要了解更多可以阅读官方的Gradle文档


1452

被折叠的 条评论
为什么被折叠?



