Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

Android gradle 从入门到gg 1

2,749 views

Published on

Android Gradle系列课程, 课程惟一目的是为魅族培养Android Gradle工程师, 该系列课程涵盖Android Gradle基本使用与自定义, 使用Gradle驱动各种各样的Android需求, Gradle插件开发, Gradle CI集成, 以及Google Android Gradle插件, 魅族Gradle插件

Published in: Mobile
  • Be the first to comment

Android gradle 从入门到gg 1

  1. 1. 2016年4月22日 刘俊 IPD创新产品部 Android Gradle 从入门到GG 第1课: Greet
  2. 2. • 介绍Android Gradle 插件的基本DSL使用 第1课: Greet
  3. 3. 引用插件 buildscript { repositories { jcenter() } dependencies { classpath 'com.android.tools.build:gradle:2.1.0-beta3' // NOTE: Do not place your application dependencies here; // they belong in the individual module build.gradle files } } Gradle每次运行的时候, 初始化之时, 将 android gradle jar包加 载到 Gradle 运行时环境中, 而插件就在这些jar包内 Android Studio新建的工程会自动在rootProject的build.gradle 中生成以上脚本(一般就是根目录的build.gradle中)
  4. 4. 引用插件 apply plugin 之后, 你就可以使用 android { // configurations } DSL入口了 apply plugin: 'com.android.application'
  5. 5. 引用插件 -1. 很可惜, android gradle相关插件并不在GPCR里 -2. 此处的 id 是apply的插件id, 并不是 Artifact Id, 因为一个 Artifact的Jar包, 里面可以有几个插件, 比如android的插件id com.android.application 和 com.android.library 都在'com.android.tools.build:gradle:2.1.0-beta3' 这个artifact里面 plugins { id "com.android.application" version "2.1.0-beta3" } 对于 Gradle Plugin Central Repository(plugins.gradle.org) 里的插件, 可以简化为 plugins { id “Id” version “ver”}
  6. 6. Artifact 'com.android.tools.build:gradle:2.1.0-beta3@jar' • group:id:version:ext • group: 类似android packageName • id: 该jar包的名字, 类似android applicationName • version: 版本号, 类似android versionName • ext: 扩展, 比如 jar, aar, txt等文件扩展, 比如某个 Android库, 既提供了jar包, 也提供了aar包, 这时就 可以通过ext来区分你想要哪一个
  7. 7. Artifact 'com.android.tools.build:gradle:2.1.0-beta3' dependencies { compile 'com.meizu.cloud.pushsdk:internal:3.0.3-beta@aar' proguard 'com.meizu.cloud.pushsdk:internal:3.0.3-beta@pro' ... compile 'io.reactivex:rxjava:1.1.3' compile(group:'io.reactivex', id: 'rxjava', version: '1.1.3') 一个Artifact依赖, 可以使用 group:id:version:ext 来定位到 等价于
  8. 8. Artifact compile 'io.reactivex:rxjava:1.1.3' compile "io.reactivex:rxjava:1.1.+" // 1.1.最新版本** compile "io.reactivex:rxjava:1.+" // 1.最新版本** compile "io.reactivex:rxjava:+" // 最新版本 在Android Studio中, 使用了 + 号的依赖引用, 会被标黄警告 在版本管理中, + 号会导致你的 TAG分支, SNAPSHOT无法百分 百还原当时的编译 所以, 尽量避免使用 +
  9. 9. repositories {} repositories { jcenter() } dependencies { compile fileTree(dir: 'libs', include: ['*.jar']) testCompile 'junit:junit:4.12' compile 'com.android.support:appcompat-v7:23.3.0' compile 'com.android.support:design:23.3.0' } dependencies中的远程模块依赖, 来源在repositories中声明 但是repositories是project的入口, DSL中project可以省略 即 repositories {} 等价于 project.repositories {} 这意味着, 你只能对当前build.gradle配置的project有用 其他模块, 你得重新定义它的 repositories {}
  10. 10. repositories {} 而之前讲到过, buildscript {}是在Gradle初始化的时候首先加载 buildscript { repositories { jcenter() } dependencies { classpath 'com.android.tools.build:gradle:2.1.0-beta3' } } buildscript{} 中配置的运行时环境依赖, 对所有模块都有效 allprojects { repositories { jcenter() } } allprojects{}: 该Gradle DSL入口的意思是 对project(模块)及其子模块都配置 将通用的配置放在rootProject的allprojects 中吧
  11. 11. 休息时间 课程的随堂 Sample 以及 presentation 在如下 git 中 http://git.ipd.meizu.com/AnR/android-gradle-samples [Github用户移步] https://github.com/Jween/android-gradle-samples
  12. 12. 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, 标红的重点讲述
  13. 13. android.defaultConfig { } defaultConfig { applicationId "com.meizu.sample.basicdsl" minSdkVersion 22 targetSdkVersion 23 versionCode 1 versionName "1.0" } 以上是 Android Studio 新建一个工程的时候, 自动配置的, library 模块的话无法配置applicationId, 毕竟 library 不是 application 为了方便理解, 先抛出一些概念 1. defaultConfig 本质上就是 ProductFlavor 2. 把 src/main (android.sourceSets.main) 看作是默认的 flavor source set, 那么, defaultConfig 就是对 main 这个 flavor 的配 置 3. 等会儿讲完 ProductFlavor, 我们再回来看看 defaultConfig
  14. 14. android.productFlavors { } 假设我们开发了一款新产品, 需要区分免费版与旗舰版怎么办? productFlavors { free { // 免费版本 } utlra { // 旗舰版本 } } android.sourceSets.free { } android.sourceSets.ultra { } 上一节课, 我们讲了对 sourceSets.main { } 的一些配置 当我们添加了 free 与 ultra 之后, 你同样可以配置 sourceSets.free { } 以及 sourceSets.ultra { } 默认的路径在 main 文件夹同级目录各 flavor 同名文件夹
  15. 15. android.productFlavors { } 我们希望区分免费版与旗舰版的包名怎么办? productFlavors { free { // 免费版本 applicationIdSuffix ".free" // 免费版包名后缀 .free } utlra { // 旗舰版本 applicationIdSuffix ".ultra" // 旗舰版包名后缀 .ultra } } 同理,你可以区分应用版本, Android min targe版本等, 你可以区 分签名signingConfig, 区分http://google.github.io/android-gradle- dsl/current/com.android.build.gradle.internal.dsl.ProductFlavor.html 中的一切
  16. 16. android.productFlavors { } 与此同时, Gradle会自动生成一个 BuildConfig 类, 包含当前选定 的 variant 的 applicationId, Debug开关, flavor, buildType, 版本等 public final class BuildConfig { public static final boolean DEBUG = Boolean.parseBoolean("true"); public static final String APPLICATION_ID = "com.meizu.sample.basicdsl.free"; public static final String BUILD_TYPE = "debug"; public static final String FLAVOR = "free"; public static final int VERSION_CODE = 1; public static final String VERSION_NAME = "1.0"; } 选择 Build Variant 一般在 Android Studio 左下角
  17. 17. android.buildTypes { } 我们可以看到 Build Variant 选定的是 freeDebug buildTypes 默认有 debug 和 release BuildType 类似 ProductFlavor, 但是多了与编译深度相关的 proguard代码混淆, 资源Shrink, debug开关, 等等 buildTypes { release { minifyEnabled true // 代码混淆 shrinkResources true // 移除没用到的资源和代码 proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } }
  18. 18. Build Variant 我们可以看到 Build Variant 选定的是 freeDebug Build Variant = [flavors, buildTypes].combinations() [['a', 'b'],[1, 2, 3]].combinations() == [['a', 1], ['b', 1], ['a', 2], ['b', 2], ['a', 3], ['b', 3]] [[free, ultra], [debug, release]].combinations() == [[free,debug], [ultra, debug], [free, release], [ultra, release]]  freeDebug, freeRelease, ultraDebug, ultraRelease
  19. 19. Build Variant variant! 想想 groovy 的 combinations! flavor buildType variant free debug freeDebug freeRelease ultra release ultraDebug ultraRelease
  20. 20. Build Variant 记住: 当你在 Build Variant 里面选定了一个 Variant 的时候, 比如, 这里的 freeDebug, Android Studio当前的对项目的配置 就是根据 free 的 flavor 以及 debug 的 buildType 来的, 你需要确保, 所有的 variant 都能正常编译
  21. 21. android.productFlavors { } 现在有免费版和旗舰版了, 要发应用商店了, 需要区分各个应 用商店的渠道怎么办? flavorDimensions "channel", "type" // flavor 维度声明 productFlavors { free { // 免费版本 dimension "type" // type 维度的 free flavor applicationIdSuffix ".free" // 免费版包名后缀 .free } utlra { // 旗舰版本 dimension "type" // type 维度的 ultra flavor applicationIdSuffix ".ultra" // 旗舰版包名后缀 .ultra } flyme { // Flyme 渠道 dimension "channel" // channel 维度的 flyme flavor } tap { // 应用宝 渠道 dimension "channel" // channel 维度的 tap flavor } }
  22. 22. android.productFlavors { } 注意 flavorDimensions 后参数的顺序, 这个顺序就是维度的顺序 flavorDimensions "channel", "type" // flavor 维度声明 命令行编译举例: 编译 flyme 渠道, 免费版本, 正式发布包 >./gradlew –p app/ assembleFlymeFreeRelease 或者偷懒, 省略每个单词后面的字母也可以 >./gradlew –p app/ assFlyFreeRel 后续你还会看到大量驼峰法命名
  23. 23. Build Variant 我们现在有 channel 维度, type 维度, 以及 buildType 维度 了 打包的时候, 对每个维度的 sourceSet 的资源选取顺序, 只要记住 前面的覆盖后面的, 除了buildType, 优先级最高的是 buildType 比如 flymeFreeDebug, debug > flyme > free 即 flyme/中的同名资源会覆盖free/的, debug/的会覆盖flyme/ 小技巧: 永远在后面加上 main 这个默认的基本 sourceSet flymeFreeDebugMain <=> debug > flyme > free > main
  24. 24. Build Variant 各个优先级资源覆盖所涉及的 ResourceMerger, ManifestMerger 在后续课程中详细讲解 例如: 高德地图 key 根据编译类型选择, 不同的渠道包 AndroidManifest 结点数据不一样, 不同 flavor 的资源不一样, 代 码不一样等等, 在讲 ResourceMerger, ManifestMerger 的时候详 解
  25. 25. proguard proguardFiles, proguardFile 指定 proguard 规则文件, 建议对引用的第三方 progaurd 文件, 区分存储 所有 开启了混淆 打包的 retrace 文件在 build/outpus/mappings/ 文件夹下 buildTypes { release { minifyEnabled true // 代码混淆 shrinkResources true // 移除没用到的资源和代码 proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' progaurdFile "proguard-rxjava.pro" proguardFile "proguard-realm.pro" proguardFile "proguard-retrofit.pro" } }
  26. 26. android.sourceSets { } 上节课, 我们已经玩弄过 main source set, 现在我们引入 variant sourceSets { free { // 对 src/free/ source set 进行配置 (flavor) } release { // 对 src/release/ source set 进行配置 (buildType) } freeFlyme { // 对 src/freeFlyme/ 额外 source set 进行配置 } } 我们对 main 可以配置的任何东西, 都可以对其他 source set配置 freeFlyme { }: 按照之前驼峰法顺序, 随意截取一段出来, 都可以 这些额外 source set 一般很少用到, 除非极其针对的业务需求
  27. 27. Demo Demo实战… 2016年4月22日 刘俊 这将是一个系列课程, 每周一节课 IPD创新产品部
  28. 28. 课后任务 samples内有BasicDSL 工程, 对免费和旗舰版的 Application Name 后追加 免费版 以及 旗舰版 tips: string.xml 文件覆盖 http://git.ipd.meizu.com/AnR/android-gradle-samples 记得使用自己的邮箱名作为分支名PR给我 [Github用户移步] https://github.com/Jween/android-gradle-samples

×