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


Android开发之Gradle笔记整理1

日 05 四月 2015

在Android开发中,我们经常会涉及到打包的问题,不管是debug包还是release包或者是beta包,又或是形形色色的各种国内的应用市场,即使是常见的应用市场,也不下几十个,所以打包的时候尤其痛苦,好在我们有Gradle。当然,看过美团的Android项目打包方案,也是一个不错的选择,感兴趣的同学也同样可以研究一下:美团Android自动化之旅—生成渠道包

Gradle是啥?

Gradle是一个依赖管理工具,基于Groovy语言,面向java应用为主,它抛弃了各种基于XML的繁琐配置,取而代之的时基于Groovy的内部领域特定语言,即DSL语言。

Gradle安装

在Mac下,安装了Idea并且启用了Gradle支持的话,首次创建Gradle: Android Module的时候会自动下载Gradle,最好翻墙下载,速度会快一些,当然不翻墙也可以成功下载。

img

下载之后的Gradle保存在 shell /Users/EricTang/.gradle

Gradle快速入门

我们随便新建一个项目,命名为GradleTest,然后我们看一下Gradle的相关配置文件,跟Gradle配置相关的文件主要有: 一、 GradleTest/GradleTest/build.gradle

img

此处的build.gradle是整个Module的Gradle配置文件,也是主要的Gradle配置文件,然后我们看一下主Gradle配置文件的内容以及注释 ...

Category: Android Develop

comments

Read More

Android性能分析工具——TraceView

四 05 三月 2015
起因

最近一直都是在忙活后台的东西,然后突然客户那边儿说你们的App做好了没?唔,好像还没有,然后就赶紧开始调试之前扔掉的Android应用,由于这个App是通过WiFi控制LED灯的,所以并不是由我们独立来做的,首先是由硬件团队做出硬件控制板以及相应的SDK,我们在他们的基础上做上层应用。

但是一直有个问题,我写的Demo中,只要发现了LED设备,可以进行很快速的操控,十秒钟内基本上可以进行7到8次左右的开关灯操作,但是由我们的Android小伙伴集成到我们之前做好的UI界面中,效果就完全不一样了,卡得要死要死的了,很明显这样儿的产品客户是不会同意的,所以我就准备赶紧解决掉这个问题,避免客户爆豆。。。

既然要分析性能了,那就肯定要借助工具来了,Android性能分析的工具有很多,而且是内置了也有好多,今天我们这里用到的是TraceView,因为熟悉我的同学也都知道我只是个打酱油的,所以边学边总结。

TraceView如何使用

TraceView有两种使用方式。

一种方式是直接打开DDMS

不管你用的是Idea还是Eclipse,都可以,大致如图所示:

img

等“Start Method Profiling”按钮编程一个黑色的小方块了之后,就表示它正在记录,点击停止之后,你就可以看到如下图所示的效果了:

img

然后你就可以好好分析一下为啥各项指标是否达标以及哪里出了问题了,当然需要注意的是这种方式使用起来虽然比较方便但是范围过大,不够精确,如果要实现对一个方法的略为精准的分析的同学可以继续往下看。

另一种方式是直接在你个人觉得可能比较耗时的地方写上如下代码,例如,我们现在怀疑onCreate()方法耗时严重 ...

Category: Android Develop

comments

Read More
Page 1 of 1