Gradle 是一个能通过插件形式自定义构建逻辑的优秀构建工具。
以下的一些特性让我们选择了 Gradle:
- 使用领域专用语言(DSL)来描述和控制构建逻辑
- 构建文件基于 Groovy,并允许通过 DSL 来声明元素、使用代码操作 DSL 元素这样的混
合方式来自定义构建逻辑 - 内置了 Maven 和 Ivy 来进行依赖管理
- 相当灵活。允许使用最好的实现,但是不会强制实现的形式
- 插件可以提供它们的 DSL 和 API 来定义构建文件
- 优秀的 API 工具与 IDE 集成
这里主要记录几个比较常用,重要的点。
android Task
assemble
组合项目所有输出,他可以细分成assemableDebug
和assembleRelease
。check
执行所有检查,他拥有lint
依赖connectedCheck
在一个连接的设备或者模拟器上执行检查,他们可以在所有连接的设备上并行执行检查,他拥有connectedAndroidTest
依赖deviceCheck
通过APIs连接远程设备来执行检查,主要用于CI(持续集成)服务上。build
执行assemle
和check
的所有工作clean
清空项目的输出。installDebug
安装测试版的apkinstallRelease
安装发布版的apkuninstall
卸载安装,他包含三个动作uninstallDebug
卸载测试版本,uninstallRelease
卸载发行版本和uninstallDebugAndroidTest
卸载android测试。
gradle 添加依赖
gradle的依赖主要分成本地包依赖和远程包依赖。
依赖的关键字主要包括:
compile
源代码(src/main/java)编译时的依赖runtime
源代码(src/main/java)执行时的依赖testCompile
测试代码(src/main/test)编译时的依赖testRuntime
测试代码(src/main/test)执行时的依赖archives
项目打包时的依赖provided
只编译,并不将jar包导入到apk中。
依赖格式:
1 | dependencies { |
其中的group表示组织,name表示要依赖的库,vesion表示版本。
我们可以简写成
1 | dependencies { |
当然,不单只有对jar包的依赖,还可以有对文件的依赖,对项目的依赖,他们的写法依次如下:
1 |
|
##本地依赖
上面讲到的就是本地依赖的方式:
1 | dependencies { |
外部依赖
首先需要添加远程仓库,android中至少添加一个远程仓库,例如使用开放的maven仓库。
1 | repositories{ |
然后,就对添加具体依赖。
1 | dependencies{ |
混淆
启动混淆非常简单,只需要在build.gradle
中启动即可。
1 | buildTypes { |
其中的minfyEnabled
默认是false,即不混淆,因为启动混淆编译速度会比较慢。
与混淆相关的还有一个shrinkResources
属性,可以通过将其设置为true
,设置资不打包没用的资源。
混淆通用规则:
1 | #指定压缩级别 |
补充的混淆规则:
第三方库混淆规则。这个比较常见,直接接入官方说明文档。
model实体类,典型在转化json的时候,必须保证model不被混淆,因此需加入–keep public class
JNI中调用的类以及方法不可被混淆
WebView中JavaScript调用的接口不混淆
AndroidMainfest、四大组件以及Application的子类不混淆
Parcelable的子类和Creator静态成员变量不混淆,否则会产生Android.os.BadParcelableException异常
Layout布局使用的View构造函数、android:onClick等。
apk打包流程
- aapt打包res资源文件,生成R文件。
- 处理aidl,生成java文件
- 编译java 生成class文件
- 通过dex命令,将class文件生成dex文件
- apkbuilder阶段,将资源、dex、so合并成apk
- 对apk进行签名
- zipalign阶段,将签名后的apk进行对齐