Android开发之Gradle笔记整理2——Gradle常用命令及UMeng多渠道打包实战

一 06 四月 2015

在前一篇博客里我们简单快速的学习了一下Gradle的基本安装和配置,以及解决了其中遇到的一些小的错误,这篇文章里我们来小小的实践一下,本身也是在Android开发中必不可少的技能。

修改build.gradle文件

接着之前的项目继续看,我们修改一下Module中的build.gradle文件,这里也不做过多讲解了,注释都在文件中,慢慢看,还是比较容易懂的:

apply plugin: 'com.android.application'

repositories {
    jcenter()
}

android {
    compileSdkVersion 19
    buildToolsVersion "21.1.1"

    defaultConfig {
        applicationId "com.aiscot.gradle.test"
        minSdkVersion 9
        targetSdkVersion 19
        versionCode 1
        versionName "1.0"

        // 修改dex 65536的限制
        multiDexEnabled true
        // AndroidManifest.xml文件中UMENG_CHANNEL的value为${UMENG_CHANNEL_VALUE}
        manifestPlaceholders = [UMENG_CHANNEL_VALUE: "channel_name"]
    }

    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_7
        targetCompatibility JavaVersion.VERSION_1_7
    }
    // 签名文件
    signingConfigs {
        debug {
            // debug签名
            storeFile file("/path/xx-debug.jks")
            storePassword "密码"
            keyAlias "别名"
            keyPassword "签名密钥的密码"
        }
        release {
            // relase签名
            storeFile file("/path/xx-release.jks")
            storePassword "密码"
            keyAlias "别名"
            keyPassword "签名密钥的密码"
        }
    }

    // 构建类型
    buildTypes {
        debug {
            // debug模式下,显示log
            buildConfigField("boolean", "LOG_DEBUG", "true")

            // 版本名前缀
            versionNameSuffix "-debug"
            // 不开启混淆
            minifyEnabled false
            // 不开启ZipAlign优化
            zipAlignEnabled false
            // 不移除无用的resource文件
            shrinkResources false
            // 使用debug签名
            signingConfig signingConfigs.debug

        }
        release {
            // release模式下,不显示log
            buildConfigField("boolean", "LOG_DEBUG", "false")

            // 版本名前缀
            versionNameSuffix "-relase"
            // 开启混淆
            minifyEnabled true
            // 开启ZipAlign优化
            zipAlignEnabled true
            // 移除无用的resource文件
            shrinkResources true
            // 使用release签名
            signingConfig signingConfigs.release
            // 混淆文件位置
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }

    // 渠道Flavors,配置不同的渠道
    productFlavors {
        GooglePaly {}
        xiaomi {}
        umeng {}
        _360 {}
        wandoujia {}
        yingyongbao {}
        whatever {}
    }

    // 批量配置渠道
    productFlavors.all {
        flavor -> flavor.manifestPlaceholders = [UMENG_CHANNEL_VALUE: name]
    }

    applicationVariants.all {
        variant ->
            variant.outputs.each {
                output ->
                    def outputFile = output.outputFile
                    if (outputFile != null && outputFile.name.endsWith('.apk')) {
                        def fileName = outputFile.name.replace(".apk", "-${defaultConfig.versionName}.apk")
                        output.outputFile = new File(outputFile.parent, fileName)
                    }
            }
    }
}

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    compile 'com.android.support:appcompat-v7:19.+'
}

重点需要讲解的地方:

  1. signingConfigs中的debug签名和release签名,都可以写绝对路径,当然,也可以通过指定形如debug{storeFile file("xx-debug.jks")}这样儿的配置,只不过需要注意,如果使用这样儿的方式,签名文件需要放在项目中

  2. UMeng官方的多渠道打包集成文档中指定,如果使用Gradle打包的方式的话,需要在build.gradle文件中的dependencies中添加如下的依赖:

    dependencies {
        compile 'com.umeng.analytics:analytics:latest.integration'
    }

这里我的想法是,build.grade文件中已经包含了libs目录下所有的jar包了

    compile fileTree(dir: 'libs', include: ['*.jar'])

所以我们其实可以直接把UMeng的jar包丢到这个目录下即可(写这篇博客的时候,我并不是很确定,写完了之后,测试完了,是正常的,所以这里应该是没有问题的,暂时没有做进一步的研究)

集成UMeng统计
  1. 配置manifest文件,UMeng的渠道统计需要在manifest文件中添加权限,注意,需要跟应用中已有的全选做下对比,避免重复
    <!-- UMeng统计所需权限 -->
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
    <uses-permission android:name="android.permission.INTERNET"/>
    <uses-permission android:name="android.permission.READ_PHONE_STATE"/>
    <!-- UMeng统计所需权限 -->

同时,还需要加入UMeng的AppKey,和Channel ID,需要注意的是,这里的UMENG_CHANNEL的value需要写成 ${UMENG_CHANNEL_VALUE},因为我们需要在build.gradle文件中对其进行操作,自动替换的

    <!-- UMeng统计的Key和Channel -->
    <meta-data android:name=“UMENG_APPKEY” android:value="APPKEY"/>
    <meta-data android:name="UMENG_CHANNEL" android:value="${UMENG_CHANNEL_VALUE}"/>
    <!-- UMeng统计的Key和Channel -->

然后需要在每个Activity的onResume方法中调用MobclickAgent.onResume(Context), onPause方法中调用MobclickAgent.onPause(Context)

  1. 然后看我们在build.gradle文件中的配置:
    // 渠道Flavors,配置不同的渠道
    productFlavors {
        GooglePaly {}
        xiaomi {}
        umeng {}
        _360 {}
        wandoujia {}
        yingyongbao {}
    }
    // 批量配置渠道
    productFlavors.all {
        flavor -> flavor.manifestPlaceholders = [UMENG_CHANNEL_VALUE: name]
    }

然后关于UMeng的多渠道配置就基本完成了,接下来我们需要做的,就是了解Gradle的常用命令,并且进行打包操作了。

Gradle自动打包

打开终端,cd到Gradle项目所在的目录,啊?等下,我们用的是Idea啊,没必要的啊,来,跟我来,找到Idea项目界面最下方:

img

看到Terminal的字样了么?点它

img

自然就已经在项目的根目录下了

这时候,我们只需要执行 ./gradlew assembleRelease 命令,就可以完成release版本的各渠道的打包工作了,这里需要注意的是,如果是第一次执行该命令的话,会自动去下载Gradle。。额,没错儿,是自动去下载,即使是我们已经下载安装过Gradle了。。所以第一次的话,可能时间稍长,当时我测试的情况是6个渠道包,大概耗时3分35秒左右的样子,后面的话就会快很多了,大概耗时10秒左右。

其他的命令还有:

  1. ./gradlew assembleDebug —— 打包debug版本

  2. ./gradlew assembleXiaomiRelease —— 单独打包小米应用市场渠道的release版本

  3. ./gradlew assembleXiaomi —— 单独打包小米应用市场渠道的debug和release版本

关于Gradle多渠道打包的就暂时先写到这里,如果到时候渠道包太多,觉得Gradle速度太慢每次都要构建一次的话,也确实可以参考美团的打包方案,也是可行的。

Category: Android Develop

Comments