Gradle常用技巧

原创 2017年03月02日 14:44:25

转载请说明出处!
作者:kqw攻城狮
出处:个人站 | CSDN


Gradle

http://google.github.io/android-gradle-dsl/current/index.html

https://docs.gradle.org/current/userguide/java_plugin.html

打包多个版本

开发过程中我们经常需要打包多个版本的apk,最为常见的,一个是release版本,一个是debug版本,他们可能使用的api也有所区别,手动改起来总是很麻烦。
我们可以通过Gradle,配置多个版本,他们有各自的参数来区分不同的版本。如下,在 app/build.gradle 系统默认会给我生成release版本,我们可以手动自己添加一个版本,我这里命名为debug,分别添加了三种类型的参数。

apply plugin: 'com.android.application'

android {
    ……
    buildTypes {
        release {
            ……
            buildConfigField("boolean", "isDebug", "false")
        }
        debug {
            // 添加了boolean类型的参数
            buildConfigField("boolean", "isDebug", "true")
            // 添加了String类型的参数
            buildConfigField("String", "coder", "\"kongqw\"")
            // 添加了int类型的参数
            buildConfigField("int", "age", "26")
        }
    }
}

……

dependencies {
   ……
}

添加完成后Rebuild,会在 BuildConfig 下看到我们添加的参数

P1

因为是静态变量,取值时直接用类名点变量名即可

P2

上述属于在Java代码中添加字段,同样的,Gradle也支持添加xml属性,类似这样

apply plugin: 'com.android.application'

android {
    ……
    defaultConfig {
        ……
    }
    buildTypes {
        release {
            ……
        }
        debug {
            ……
            resValue("bool", "is_debug", "true")
            resValue("string", "coder", "\"kongqw\"")
            resValue("integer", "age", "26")
        }
    }
}

dependencies {
    ……
}

添加完以后Rebuild,会在generated.xml 下生产如下字段

P3

但是要避免和string.xml文件里的字段重复

在xml中使用

android:text="@string/coder"

或者再Java中使用

String coder = getString(R.string.coder);

添加工程build时间

有时候,测试和产品总是会拿着手机跑过来问你,“有没有更新?”、“帮我看一下我装的是不是最新的版本?”,总是很烦,我们可以利用Gradle,获取到工程的Build时间,在测试版本打印出来,可以为工程师节省不少时间。

Gradle支持直接添加方法

apply plugin: 'com.android.application'

android {
    ……
    defaultConfig {
        ……
        resValue("string", "build_time", getDate())
        // BuildTime
         buildConfigField("String", "buildTime", "\"" + getDate() + "\"")
    }
    buildTypes {
        release {
            ……
        }
        debug {
            ……
        }
    }
}

def getDate() {
    return new Date().format("yyyy-MM-dd HH:mm:ss")
}

dependencies {
    ……
}

判断的时候调用

BuildConfig.buildTime

或者

getString(R.string.build_time)

P4

不同版本包名不同

我们都知道,相同包名,不同签名,在一台手机上是无法同时安装的。前面我们配置了两个不同的版本,release版本肯定是用正式签名,debug版本我们通常都会使用测试签名。那么问题来了,测试人员如果已经在手机上安装了上线的版本,再装测试版,就会有冲突,必须要卸载一个,那么最好的办法就是修改测试版包名。这样包名不同,两个版本同时安装,也不会有冲突。

同样的,Gradle依然可以轻松的帮我们做到。

apply plugin: 'com.android.application'

android {
    ……
    defaultConfig {
        ……
    }
    buildTypes {
        release {
            ……
        }
        debug {
            ……
            applicationIdSuffix ".debug"
        }
    }
}

dependencies {
    ……
}

可以看到我们在 debug 版本添加了applicationIdSuffix,其值为 .debug,顾名思义,是debug版本在包名后面添加.debug后缀。

多渠道打包

多渠道打包,打包多个市场的apk,用来统计。

首先在AndroidManifest文件添加meta-data

<?xml version="1.0" encoding="utf-8"?>
<manifest ……>

    <application
        ……>

        <meta-data
            android:name="PRODUCT"
            android:value="${CHANNEL_VALUE}"/>

        <activity ……>
            ……
        </activity>
    </application>

</manifest>

app/build.gradle添加productFlavors,如下所示,添加 XIAO_MIGOOGLE_PLAY两个渠道

apply plugin: 'com.android.application'

android {
    ……
    defaultConfig {
        ……
    }
    buildTypes {
        release {
            ……
        }
        debug {
            ……
        }
    }

    productFlavors {
        xiaomi {
            manifestPlaceholders = [CHANNEL_VALUE: "XIAO_MI"]
        }
        googlePlay {
            manifestPlaceholders = [CHANNEL_VALUE: "GOOGLE_PLAY"]
        }
    }
}

dependencies {
    ……
}

获取渠道

try {
    ApplicationInfo applicationInfo = getPackageManager().getApplicationInfo(getPackageName(), PackageManager.GET_META_DATA);
    String channel = applicationInfo.metaData.getString("PRODUCT");
    Log.i(TAG, "onCreate: 渠道 :" + channel);
} catch (PackageManager.NameNotFoundException e) {
    e.printStackTrace();
}
版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

Android的Gradle技巧 3.2产品风格和变体

3.2产品风格和变体 问题 你想构建本质上相同的应用程序,但使用不同的资源和/或类。 解 产品风格允许您创建同一个应用程序的多个不同版本。 讨论 构建类型是开发过程的一部分,通常用作一个从开发到生产的...

Gradle技巧

通过 --offline ,离线编译,免去检测的网络耗时通过 gradle --stop ,停止所有的gradle编译,包括IDE中的需要配置分离api、impl包可以参考 gradle-sample...

Android的Gradle技巧 1.2配置SDK版本和其他默认值

1.2配置SDK版本和其他默认值 问题 您要指定最低和目标Android SDK版本和其他默认属性。 解 在模块Gradle构建文件中,在android块中设置值。 讨论 顶层Android构建文件通...

Android中gradle的一些技巧

Android中gradle的一些技巧 技巧一:Android中经常导入别人的项目,都需要编译很久,其实原因在与这个项目使用的gradle与你本地的不匹配,需要联网去下载,有时候还必须要去下载的时候,...

Android的Gradle技巧 4.3排除任务

4.3排除任务 问题 您希望从构建过程中排除某些任务。 解 使用-x标志排除单个任务。通过修改任务图排除多个任务。 讨论 Gradle构建过程涉及许多按顺序执行的任务。它们中的大多数依赖于在过程中较早...

6个技巧加速你的gradle编译

最近我们都在讨论build系统,我们看了一些技巧可以让你的Maven build更快。结论和反映都势不可挡。由于我们提供的技巧,更多的人都很高兴能加快他们完成自己的项目。现在,让我们看一下怎么处理gr...
  • lyhhj
  • lyhhj
  • 2016-02-22 19:49
  • 6863

8个技巧倍速提升Gradle构建

8个技巧倍速提升Gradle构建,提升开发效率,当然对心情也有好处的吗。

Android的Gradle技巧 4.5使用Android库

4.5使用Android库 问题 您要向应用程序添加库模块。 解 使用库插件并将库模块添加为依赖关系。 讨论 您可以使用Java库(以jar文件的形式)为应用程序添加大量附加功能。 Recipe 1....

Gradle使用技巧

Gradle peer not authenticated 在更新Gradle的依赖包时,经常会发生peer not authenticated的异常,导致Gradle无法编译。解决方法有两个,一个...

安卓Studio的gradle使用技巧

安卓Studio的gradle使用技巧1,productFlavors配置不同版本时manifestPlaceholders的一些坑在新版本的AndroidStudio中,为Gradle新增了多渠道打...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)