2016年5月6日
刘俊
IPD创新产品部
Android Gradle
从入门到GG
第2课:
Hallelujah
• 继续介绍Android Gradle 插件的基本DSL使
用
• 真实 Android 项目中使用 Gradle
第2课: Hallelujah
android { } 回顾
• defaultConfig { }: 默认配置, 所有 flavor 都会继承
• sourceSets { }: 对代码/资源的配置, android 重新对 gradle sourceSets 进行
了针对 Android 的实现, 叫做 AndroidSourceSet
• productFlavors { }: 模块所有 flavor, 不同的 flavor, 可以打包出不同的 apk
• buildTypes { }: 模块所有 build 类型, 不同的类型, 可以打包出不同的 apk
• signingConfig { }: App 模块打包 apk 的签名配置
• splits { }: Apk 分割, 全资源apk, 根据分辨率与abi分割成若干个小apk
• *Options { }: dexOptions { }, packagingOptions { }, aaptOptions { },
lintOptions { }, compileOptions { }, adbOptions { }, testOptions { }
• 你可以在 http://google.github.io/android-gradle-dsl/current/com.android.build.gradle.BaseExtension.html 这里查
看详细的 DSL, 本节课只讲常用到的 android DSL, 标红的重点讲述
android.signingConfigs { }
signingConfigs 配置 keystore 等签名, 用于 apk 签名, 一般而言, 密
码等敏感信息, 应该存储在 local.properties 里面, 或者CI服务器通
过 ./gradlew –PkeyPassword=android –PstorePassword=android 命
令行传参, 传递给 gradle脚本, 此处仅示例就随意咯
signingConfigs {
eng {
keyAlias 'androiddebugkey'
keyPassword ‘android'
storeFile file('./eng.keystore')
storePassword ‘android'
}
}
buildTypes {
debug {
signingConfig signingConfigs.eng
}
}
signingConfigs {
jskConfig {
keyAlias ‘jskKey'
keyPassword ‘jskkey'
storeFile file('./test.jks')
storePassword ‘jkskey_password'
}
}
android.splits { }
Apk分割, 可以对 分辨率 资源, abi 平台 这两个维度, 分割出多个
apk出来, 常用于精简apk大小, 最小化打包等
splits {
density {
enable true // 默认对所有分辨率都分割 (include 列表包含所有 abi)
exclude "ldpi", "tvdpi", "xxxhdpi" // 移除 ldpi, tvdpi, xxxhdpi 分辨率
// 向 AndroidManifest中注入兼容屏幕结点 <compatible-screens><screen ...>
compatibleScreens 'small', 'normal', 'large', 'xlarge'
}
abi {
enable true // 默认对所有 abi 分割 (include 列表包含所有 abi)
reset() // 将 include 列表置空
include 'x86', 'armeabi-v7a', 'mips'
universalApk true // 额外打出一个包含所有 abi 的全包
}
}
android.splits { }
此时, 你可以直接认为多了两个不能使用的 flavor 维度:
density 和 abi
density: hdpi, mdpi, xhdpi, xxhdpi
abi: x86, armeabi-v7a, mips
splits {
density {
enable true // 默认对所有分辨率都分割 (include 列表包含所有 abi)
exclude "ldpi", "tvdpi", "xxxhdpi" // 移除 ldpi, tvdpi, xxxhdpi 分辨率
// 向 AndroidManifest中注入兼容屏幕结点 <compatible-screens><screen ...>
compatibleScreens 'small', 'normal', 'large', 'xlarge'
}
abi {
enable true // 默认对所有 abi 分割 (include 列表包含所有 abi)
reset() // 将 include 列表置空
include 'x86', 'armeabi-v7a', 'mips'
universalApk true // 额外打出一个包含所有 abi 的全包
}
}
android.splits { }
density: hdpi, mdpi, xhdpi, xxhdpi
abi: x86, armeabi-v7a, mips
同样的, gradle任务也会多出很多, 比如:
assembleXhdpiArmeabi-v7aDebug
assembleMdpiX86Release
assembleUniversalRelease // 包含所有分辨率与 abi so文件的包
而使用最新的编译链工具的时候, splits 是与 resConfig 冲突的
还记得我们上节课讲的 resConfigs ‘xxhdpi’, ‘xhdpi’ 么?
resConfigs 对 density 使用的时候, 与 apk 分割的 density 分割是
冲突的, apk分割是对全包分割, resConfig只对当前配置的variant
分割
android { }
• defaultConfig { }: 默认配置, 所有 flavor 都会继承
• sourceSets { }: 对代码/资源的配置, android 重新对 gradle sourceSets 进行
了针对 Android 的实现, 叫做 AndroidSourceSet
• productFlavors { }: 模块所有 flavor, 不同的 flavor, 可以打包出不同的 apk
• buildTypes { }: 模块所有 build 类型, 不同的类型, 可以打包出不同的 apk
• signingConfig { }: App 模块打包 apk 的签名配置
• splits { }: Apk 分割, 全资源apk, 根据分辨率与abi分割成若干个小apk
• *Options { }: dexOptions { }, packagingOptions { }, aaptOptions { },
lintOptions { }, compileOptions { }, adbOptions { }, testOptions { }
• 下面我们来看看实际项目 大鱼 中的 gradle 使用
大鱼
实际应用…
2016年5月6日
刘俊
这将是一个系列课程,
每周一节课
IPD创新产品部
This is an real internal project, apologize for not opening source.

Android gradle 从入门到gg 2

  • 1.
  • 2.
    • 继续介绍Android Gradle插件的基本DSL使 用 • 真实 Android 项目中使用 Gradle 第2课: Hallelujah
  • 3.
    android { }回顾 • defaultConfig { }: 默认配置, 所有 flavor 都会继承 • sourceSets { }: 对代码/资源的配置, android 重新对 gradle sourceSets 进行 了针对 Android 的实现, 叫做 AndroidSourceSet • productFlavors { }: 模块所有 flavor, 不同的 flavor, 可以打包出不同的 apk • buildTypes { }: 模块所有 build 类型, 不同的类型, 可以打包出不同的 apk • signingConfig { }: App 模块打包 apk 的签名配置 • splits { }: Apk 分割, 全资源apk, 根据分辨率与abi分割成若干个小apk • *Options { }: dexOptions { }, packagingOptions { }, aaptOptions { }, lintOptions { }, compileOptions { }, adbOptions { }, testOptions { } • 你可以在 http://google.github.io/android-gradle-dsl/current/com.android.build.gradle.BaseExtension.html 这里查 看详细的 DSL, 本节课只讲常用到的 android DSL, 标红的重点讲述
  • 4.
    android.signingConfigs { } signingConfigs配置 keystore 等签名, 用于 apk 签名, 一般而言, 密 码等敏感信息, 应该存储在 local.properties 里面, 或者CI服务器通 过 ./gradlew –PkeyPassword=android –PstorePassword=android 命 令行传参, 传递给 gradle脚本, 此处仅示例就随意咯 signingConfigs { eng { keyAlias 'androiddebugkey' keyPassword ‘android' storeFile file('./eng.keystore') storePassword ‘android' } } buildTypes { debug { signingConfig signingConfigs.eng } } signingConfigs { jskConfig { keyAlias ‘jskKey' keyPassword ‘jskkey' storeFile file('./test.jks') storePassword ‘jkskey_password' } }
  • 5.
    android.splits { } Apk分割,可以对 分辨率 资源, abi 平台 这两个维度, 分割出多个 apk出来, 常用于精简apk大小, 最小化打包等 splits { density { enable true // 默认对所有分辨率都分割 (include 列表包含所有 abi) exclude "ldpi", "tvdpi", "xxxhdpi" // 移除 ldpi, tvdpi, xxxhdpi 分辨率 // 向 AndroidManifest中注入兼容屏幕结点 <compatible-screens><screen ...> compatibleScreens 'small', 'normal', 'large', 'xlarge' } abi { enable true // 默认对所有 abi 分割 (include 列表包含所有 abi) reset() // 将 include 列表置空 include 'x86', 'armeabi-v7a', 'mips' universalApk true // 额外打出一个包含所有 abi 的全包 } }
  • 6.
    android.splits { } 此时,你可以直接认为多了两个不能使用的 flavor 维度: density 和 abi density: hdpi, mdpi, xhdpi, xxhdpi abi: x86, armeabi-v7a, mips splits { density { enable true // 默认对所有分辨率都分割 (include 列表包含所有 abi) exclude "ldpi", "tvdpi", "xxxhdpi" // 移除 ldpi, tvdpi, xxxhdpi 分辨率 // 向 AndroidManifest中注入兼容屏幕结点 <compatible-screens><screen ...> compatibleScreens 'small', 'normal', 'large', 'xlarge' } abi { enable true // 默认对所有 abi 分割 (include 列表包含所有 abi) reset() // 将 include 列表置空 include 'x86', 'armeabi-v7a', 'mips' universalApk true // 额外打出一个包含所有 abi 的全包 } }
  • 7.
    android.splits { } density:hdpi, mdpi, xhdpi, xxhdpi abi: x86, armeabi-v7a, mips 同样的, gradle任务也会多出很多, 比如: assembleXhdpiArmeabi-v7aDebug assembleMdpiX86Release assembleUniversalRelease // 包含所有分辨率与 abi so文件的包 而使用最新的编译链工具的时候, splits 是与 resConfig 冲突的 还记得我们上节课讲的 resConfigs ‘xxhdpi’, ‘xhdpi’ 么? resConfigs 对 density 使用的时候, 与 apk 分割的 density 分割是 冲突的, apk分割是对全包分割, resConfig只对当前配置的variant 分割
  • 8.
    android { } •defaultConfig { }: 默认配置, 所有 flavor 都会继承 • sourceSets { }: 对代码/资源的配置, android 重新对 gradle sourceSets 进行 了针对 Android 的实现, 叫做 AndroidSourceSet • productFlavors { }: 模块所有 flavor, 不同的 flavor, 可以打包出不同的 apk • buildTypes { }: 模块所有 build 类型, 不同的类型, 可以打包出不同的 apk • signingConfig { }: App 模块打包 apk 的签名配置 • splits { }: Apk 分割, 全资源apk, 根据分辨率与abi分割成若干个小apk • *Options { }: dexOptions { }, packagingOptions { }, aaptOptions { }, lintOptions { }, compileOptions { }, adbOptions { }, testOptions { } • 下面我们来看看实际项目 大鱼 中的 gradle 使用
  • 9.