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包的操作,见下图:

时间: 2024-11-16 14:37:11

Android 使用Gradle加Android Studio 多渠道打包的相关文章

Android studio 使用心得(四)—android studio 多渠道打包(二)

Android studio 使用心得(四)—android studio 多渠道打包 这篇文章讲了一种打包方式.是直接在android studio 里面可视化操作,结合配置文件.我个人觉得严格上来讲是不完全正确的操作,因为配置文件里面的签名文件根本没有用到.但是,打出来的包绝对没问题的.这篇主要是介绍直接在dos命令里面使用gradle命令打包.两行命令,简单gradle clean ,gradle build. 1,配置文件还是和之前的一样,我才贴一次代码 ? 1 2 3 4 5 6 7

Android studio 使用心得(十)---android studio 多渠道打包(三)

关于使用android studio 如何打包  大家可以看这两篇文章 Android studio 使用心得(四)---android studio 多渠道打包 Android studio 使用心得(四)---android studio 多渠道打包(二) 真正的项目开发,当然是建议 Android studio 使用心得(四)---android studio 多渠道打包(二) 其实,android studio 对上面这种打包方式还有更简单的方法,就是使用as 里面自带的Terminal

android Studio 使用gradle 参数解释及多渠道打包

Gradle 基本语法 build.gradle  buildscript { //设置脚本的运行环境 repositories {//支持java 依赖库管理(maven),用于项目的依赖 mavenCentral() } dependencies {//依赖包的定义.支持maven/ivy,远程,本地库,也支持单文件,如果前面定义了repositories{}maven 库,使用maven的依赖 //的时候只需要按照用类似于com.android.tools.build:gradle:2.1

android studio 多渠道打包,调试正式包,build.gradle解析

1,讲解build.gradle文件. 1.1根目录Android 1.1.1 defaultConfig是Android的根目录,可以配置包名等信息,若AndroidMainfest.xml也配置了,以defaultConfig的为准. 1.1.2 signingConfigs是Android的根目录,可以配置签名,如下图: 调试时若想直接用正式的签名包可以在buildType里配置. buildTypes { debug { signingConfig signingConfigs.rele

android studio 多渠道打包

第一就是配置:在项目的build.gradle里面配置  先上图,再上代码. 第二步,就是打包.(网上有介绍用命令打包,可是我这人太懒,发现了个小窍门,直接在android studio 里面进行.)上图(另外,后面我还是补上了gradle命令打包的介绍.大家可以看看http://my.oschina.net/aibenben/blog/370985) 如果没有keystore,先创建一个,默认为.jks文件,一样的. 大家这里创建完后,可以再回头看看前面配置的build.gradle里面sig

[Android Studio] Android studio 多渠道打包(超简洁版)

转载:http://xuyazhou.com/archives/461 http://relex.me/using-manifestplaceholders/ 最近一直用android studio 进行开发,在开发和发版的时候,遇到一个多渠道打包的问题,由于公司里是有七个渠道的包进行分发,由于每次去AndroidManifest.xml修改渠道的值,甚是麻烦... 最后去google了一番,发现有些方法,是在gradle文件里切换各种不同的AndroidManifest.xml文件,感觉这样也

Android Studio多渠道打包

本文所讲述的多渠道打包是基于友盟统计实施的. 多渠道打包的步骤: 1.在AndroidManifest.xml里设置动态渠道变量 <meta-data android:name="UMENG_CHANNEL" android:value="${UMENG_CHANNEL_VALUE}" /> 2.在build.gradle设置productFlavors 这里采用批量修改: android { productFlavors { default_chann

Android Studio 多渠道打包遇到的问题总结

使用gradle构建android的默认project结构: src/main        ----java/        ----res/        ----assets/        ----aidl/        ----rs/        ----jni/        ----AndroidManifest.xml src/androidTest/        ----java/ 问题一.因为sourceSets配置而导致的:specified for property

android产品研发(五)--&gt;多渠道打包

国内的Android开发者还是很苦逼的,由于众所周知的原因,google play无法再国内打开,所以android系的应用市场,群雄争霸,而后果就是国内存在着有众多的应用市场,产品在不同的渠道可能有这不同的统计需求,为此android开发人员需要为每个应用市场发布一个安装包,这里就涉及到了android的多渠道打包. 本文主要讲解的就是几种主流的多渠道打包方式,以及其优劣势. 通过配置gradle脚本实现多渠道打包 这种打包方式是使用android Studio的编译工具gradle配合使用的