本文出自: http://blog.csdn.net/jjwwmlp456/article/details/45057067 -----------------匆忙拥挤repeat


Gradle,这个东西好复杂,不过在Android中,我们知道它大概怎么用,它的依据何来,就够了。

Gradle的DSL,领域特定语言(domain-specific languages,简称DSL),地址:http://gradle.org/docs/2.3/dsl/

Gradle的用户指南,地址:http://gradle.org/docs/2.3/userguide/userguide.html

Android-Gradle-DSL Android结合Gradle的DSL

下载地址:https://developer.android.com/shareables/sdk-tools/android-gradle-plugin-dsl.zip

简单介绍Android-Gradle构建插件的官方地址:https://developer.android.com/tools/building/plugin-for-gradle.html

详细介绍Android-Gradle构建插件的官方地址:http://tools.android.com/tech-docs/new-build-system


build.gradle的基本形式

Android Studio 建立project,可在其下建立多个moudle。

一个project自动生成一个build.gradle,每个module下也自动生成一个build.gradle (本文主要讨论module中的build.gradle构建)

module/build.gradle:

[plain] view plain copy print ?
  1. applyplugin:'com.android.application'//启用android应用插件
  2. android{
  3. compileSdkVersion22
  4. buildToolsVersion"22.0.1"
  5. defaultConfig{
  6. applicationId"com.stone.testbuild"
  7. minSdkVersion8
  8. targetSdkVersion22
  9. versionCode1
  10. versionName"1.0"
  11. }
  12. buildTypes{
  13. release{
  14. minifyEnabledfalse
  15. proguardFilesgetDefaultProguardFile('proguard-android.txt'),'proguard-rules.pro'
  16. }
  17. }
  18. }
  19. dependencies{
  20. compilefileTree(dir:'libs',include:['*.jar'])
  21. compile'com.android.support:appcompat-v7:22.0.0'
  22. }

Android-Gradle DSL 简介

上面示例中的android{ },就是我们需要主了解的,在android{}块中可以包含以下直接配置项:

  • defaultConfig{}默认配置,是ProductFlavor类型。它共享给其他ProductFlavor使用
  • sourceSets{}源文件目录设置,是AndroidSourceSet类型。
  • buildTypes{}BuildType类型
  • signingConfigs{}签名配置,SigningConfig类型
  • productFlavors{}产品风格配置,ProductFlavor类型
  • testOptions{}测试配置,TestOptions类型
  • aaptOptions{}aapt配置,AaptOptions类型
  • lintOptions{}lint配置,LintOptions类型
  • dexOptions{}dex配置,DexOptions类型
  • compileOptions{}编译配置,CompileOptions类型
  • packagingOptions{}PackagingOptions类型
  • jacoco{}JacocoExtension类型。 用于设定 jacoco版本
  • splits{}Splits类型。

在DSL文档中,以上每个类型都有它的详细配置选项


多渠道打包

自动签名、混淆、打包、注入多个渠道。

例,module>build.gradle:

[plain] view plain copy print ?
  1. applyplugin:'com.android.application'
  2. /*
  3. 定义一个方法,仅def声明时,返回类型任意(自动判断)
  4. 可以将返回值直接写成String或defString
  5. gradle支持groovy语言,groovy默认引入的包有:
  6. java.io.*java.lang.*java.math.BigDecimaljava.math.BigInteger
  7. java.net.*java.util.*groovy.lang.*groovy.util.*
  8. */
  9. defStringcomputeVersionName(){
  10. return"8.8.8"
  11. }
  12. android{
  13. compileSdkVersion22
  14. buildToolsVersion"22.0.1"
  15. defaultConfig{
  16. applicationId"com.stone.myapplication"
  17. minSdkVersion8
  18. targetSdkVersion22
  19. versionCode1
  20. versionNamecomputeVersionName()//使用外部定义的方法
  21. /*
  22. manifestPlaceholders
  23. manifest中使用占位符,如:<...android:name="${YOUR_APP_KEY}">
  24. 以[key-value]形式替换:[YOUR_APP_KEY:"value"]
  25. */
  26. manifestPlaceholders=[YOUR_APP_KEY:"友盟后台的appkey"]
  27. }
  28. signingConfigs{//gradleassembleRelease
  29. /*
  30. 可以定义多个签名配置项,如下面的myConfig
  31. */
  32. myConfig{
  33. storeFilefile("stone.keystore")
  34. storePassword"mypasswd"
  35. //storePasswordSystem.console().readLine("\nKeystorepassword:")
  36. keyAlias"stone"
  37. keyPassword"mypasswd"
  38. //keyPasswordSystem.console().readLine("\nKeypassword:")
  39. }
  40. }
  41. buildTypes{
  42. /*
  43. 可以配置多个buildType项,如下面的release,debug,aabbcc
  44. */
  45. release{
  46. minifyEnabledtrue//译:使变小enabled。即启用混淆器
  47. //混淆文件:sdk/tools/proguard/proguard-android.txt和当前module下的proguard-rules.pro
  48. //proguardFilesgetDefaultProguardFile('proguard-android-optimize.txt'),'proguard-rules.pro'
  49. //getDefaultProguardFile('proguard-android.txt'),
  50. //getDefaultProguardFile('proguard-android-optimize.txt'),
  51. signingConfigsigningConfigs.myConfig
  52. zipAlignEnabledtrue//混淆后的zip优化,默认为true,可不写。当不显示配置为true时,不会生成unaligned.apk
  53. }
  54. debug{
  55. debuggabletrue//启用debug的buildType配置
  56. }
  57. aabbcc{//自定义配置,未配置签名项,所以会生成未签名apk
  58. multiDexEnabledtrue
  59. }
  60. }
  61. productFlavors{
  62. /*
  63. productFlavors-产品风格:
  64. 即不同产品的配置,它会基于上面的公共配置项defaultConfig
  65. 下面的配置项与buildTypes{}中的配置项,成类似sql中的全联(fulljoin)关系
  66. 当执行$gradlebuild命令后,会生成:
  67. module-flavor1-release-unaligned.apk
  68. module-flavor1-release.apk
  69. module-flavor1-debug-unaligned.apk
  70. module-flavor1-debug.apk
  71. module-flavor1-aabbcc.apk
  72. ...flavor2...apk
  73. applicationId用于标识在谷歌Play商店上的唯一标识默认不配置,则与app的AndroidManifest.xml中的package一致
  74. 仅替换<manifest>中的package属性值,其它不受影响
  75. */
  76. flavor1{
  77. proguardFiles'proguard-rules.pro'
  78. applicationId"com.stone.myapplication.pro"//比如专业版
  79. manifestPlaceholders=[channelID:"百度应用平台"]
  80. }
  81. flavor2{
  82. proguardFile'proguard-rules.pro'
  83. applicationId"com.stone.myapplication.free"//比如免费版
  84. manifestPlaceholders=[channelID:"豌豆夹"]
  85. }
  86. }
  87. }
  88. dependencies{
  89. //Localbinarydependency本地jar包
  90. compilefileTree(dir:'libs',include:['*.jar'])
  91. //Moduledependency引用android-library项目
  92. compileproject(':eventbuslib')
  93. /*
  94. Remotebinarydependencydownloadtolocalgroup:name:version
  95. 配置远程仓库中的jar包,打包时,检查本地有没有,若没有则下载到本地。
  96. */
  97. compile'com.android.support:appcompat-v7:22.0.0'
  98. compile'com.android.support:support-v4:22.0.0'
  99. compile'com.android.support:cardview-v7:22.0.0'
  100. compile'com.android.support:recyclerview-v7:22.0.0'
  101. }
关于多渠道,其实就是定义了多个flavor。用manifestPlaceholders配置,替换manifest中的占位符${}。

manifest.xml:

[html] view plain copy print ?
  1. <?xmlversion="1.0"encoding="utf-8"?>
  2. <manifestxmlns:android="http://schemas.android.com/apk/res/android"
  3. package="com.stone.myapplication">
  4. <application
  5. android:allowBackup="true"
  6. android:icon="@mipmap/ic_launcher"
  7. android:label="@string/app_name"
  8. android:theme="@style/AppTheme">
  9. <activity
  10. android:name=".MainActivity"
  11. android:label="@string/app_name">
  12. <intent-filter>
  13. <actionandroid:name="android.intent.action.MAIN"/>
  14. <categoryandroid:name="android.intent.category.LAUNCHER"/>
  15. </intent-filter>
  16. <meta-data
  17. android:name="UMENG_APPKEY"
  18. android:value="${YOUR_APP_KEY}"/>
  19. <meta-data
  20. android:name="channelName"
  21. android:value="${channelID}"/>
  22. </activity>
  23. </application>
  24. </manifest>

最后,执行 $ gradle build 命令 , 就ok了


完整示例:https://github.com/aa86799/ProguardPack


更多相关文章

  1. 通过Titanium Studio为Android(安卓)APK签名
  2. Java/Android引用类型及其使用分析
  3. Android(安卓)为【apk】文件签名,增加修改系统时间等权限
  4. ANDROID应用程序的混淆打包
  5. Android(安卓)jni中数组参数的传递方式
  6. Android(安卓)权限的一些细节
  7. Base64编解码Android和ios的例子,补充JNI中的例子
  8. Base64编解码Android和ios的例子,补充JNI中的例子
  9. android 重力传感器的使用

随机推荐

  1. 【android】当数据库需要更新时我们该怎
  2. Android源码大放送(实战开发必备)
  3. Android 中进度计算--百分比显示
  4. Androidの异常总结
  5. android 呼入电话的监听(来电监听)转
  6. android自带Base64加密解密
  7. 全志A64 Android7.1屏蔽使用按键进入安全
  8. android应用中去掉标题栏的方法
  9. Android下如何防止横竖屏切换的时候进度
  10. Linux 命令行更新指定版本 android sdk