转载请注明出处:

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:

apply plugin: 'com.android.application'  //启用android 应用插件android {    compileSdkVersion 22    buildToolsVersion "22.0.1"    defaultConfig {        applicationId "com.stone.testbuild"        minSdkVersion 8        targetSdkVersion 22        versionCode 1        versionName "1.0"    }    buildTypes {        release {            minifyEnabled false            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'        }    }}dependencies {    compile fileTree(dir: 'libs', include: ['*.jar'])    compile 'com.android.support:appcompat-v7:22.0.0'}

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:

apply plugin: 'com.android.application'/*定义一个方法,仅def声明时,返回类型任意(自动判断)   可以将返回值直接写成String 或def Stringgradle支持groovy语言,groovy默认引入的包有:  java.io.* java.lang.* java.math.BigDecimal java.math.BigInteger  java.net.* java.util.* groovy.lang.* groovy.util.* */def String computeVersionName() {    return "8.8.8"}android {    compileSdkVersion 22    buildToolsVersion "22.0.1"    defaultConfig {        applicationId "com.stone.myapplication"        minSdkVersion 8        targetSdkVersion 22        versionCode 1        versionName computeVersionName() //使用外部定义的方法        /*        manifestPlaceholders         manifest中使用占位符,如:<... android:name="${YOUR_APP_KEY}" >        以[key-value]形式替换:[YOUR_APP_KEY:"value"]        */        manifestPlaceholders = [YOUR_APP_KEY: "友盟后台的appkey"]    }    signingConfigs { //gradle assembleRelease        /*           可以定义多个签名配置项,如下面的myConfig         */        myConfig {            storeFile file("stone.keystore")            storePassword "mypasswd"//storePassword System.console().readLine("\nKeystore password: ")            keyAlias "stone"            keyPassword "mypasswd"//keyPassword System.console().readLine("\nKey password: ")        }    }    buildTypes {        /*            可以配置多个buildType项,如下面的release,debug,aabbcc         */        release {            minifyEnabled true  //译:使变小enabled。   即启用混淆器            //混淆文件:sdk/tools/proguard/proguard-android.txt 和 当前module下的proguard-rules.pro//            proguardFiles  getDefaultProguardFile('proguard-android-optimize.txt'),'proguard-rules.pro'            //getDefaultProguardFile('proguard-android.txt'),            //getDefaultProguardFile('proguard-android-optimize.txt'),            signingConfig signingConfigs.myConfig            zipAlignEnabled true    //混淆后的zip优化,默认为true,可不写。当不显示配置为true时,不会生成unaligned.apk        }        debug {            debuggable true  //启用debug的buildType配置        }        aabbcc {//自定义配置,未配置签名项,所以会生成未签名apk            multiDexEnabled true        }    }    productFlavors {        /*          productFlavors-产品风格:          即不同产品的配置,它会基于上面的公共配置项defaultConfig          下面的配置项与buildTypes{}中的配置项,成类似sql中的全联(full join)关系           当执行 $gradle build   命令后,会生成:           module-flavor1-release-unaligned.apk           module-flavor1-release.apk           module-flavor1-debug-unaligned.apk           module-flavor1-debug.apk           module-flavor1-aabbcc.apk           ...flavor2...apk          applicationId 用于标识 在谷歌Play商店上的唯一标识 默认不配置,则与app的AndroidManifest.xml中的package一致          仅替换<manifest>中的package属性值,其它不受影响         */        flavor1 {            proguardFiles 'proguard-rules.pro'            applicationId "com.stone.myapplication.pro" //比如 专业版            manifestPlaceholders = [channelID: "百度应用平台"]        }        flavor2 {            proguardFile 'proguard-rules.pro'            applicationId "com.stone.myapplication.free" //比如 免费版            manifestPlaceholders = [channelID: "豌豆夹"]        }    }}dependencies {    //Local binary dependency  本地jar包    compile fileTree(dir: 'libs', include: ['*.jar'])    // Module dependency 引用android-library项目    compile project(':eventbuslib')    /*      Remote binary dependency  download to local   group:name:version       配置远程仓库中的jar包,打包时,检查本地有没有,若没有则下载到本地。     */    compile 'com.android.support:appcompat-v7:22.0.0'    compile 'com.android.support:support-v4:22.0.0'    compile 'com.android.support:cardview-v7:22.0.0'    compile 'com.android.support:recyclerview-v7:22.0.0'}
关于多渠道,其实就是定义了多个flavor。用manifestPlaceholders配置,替换manifest中的占位符${}。

manifest.xml:

<?xml version="1.0" encoding="utf-8"?><manifest xmlns:android="http://schemas.android.com/apk/res/android"    package="com.stone.myapplication">    <application        android:allowBackup="true"        android:icon="@mipmap/ic_launcher"        android:label="@string/app_name"        android:theme="@style/AppTheme">        <activity            android:name=".MainActivity"            android:label="@string/app_name">            <intent-filter>                <action android:name="android.intent.action.MAIN" />                <category android:name="android.intent.category.LAUNCHER" />            </intent-filter>            <meta-data                android:name="UMENG_APPKEY"                android:value="${YOUR_APP_KEY}" />            <meta-data                android:name="channelName"                android:value="${channelID}" />        </activity>    </application></manifest>

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


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


更多相关文章

  1. android:inputType标签
  2. Android(安卓)混淆打包
  3. android 打开各种文件(setDataAndType)
  4. [置顶] Android(安卓)代码混淆 选项说明
  5. android 申请移动应用的签名生成方法
  6. Android实用小技巧
  7. [转」android中的数据库操作
  8. android中的数据库操作ZZ
  9. Android中的签名机制

随机推荐

  1. Android核心技术——Android入门-威哥_马
  2. android 在子线程中使用Toast等功能
  3. Android(安卓)数据存数---SQLite数据库
  4. 升级Android内置apk版本
  5. Android(安卓)7.0 FileProvider简单使用
  6. 错误ava.lang.RuntimeException: Unable
  7. Android中网络框架简单封装的实例方法
  8. 批量反编译Android XML文件Python脚本
  9. 深入理解Android WebView
  10. android activity开发文档翻译 - 1 - 基