Android 使用Gradle加Android Studio 多渠道打包

转载请注明出处:

   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 String
gradle支持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了


补充一个引用远程jar包的操作,见下图:

技术分享




郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。