当前位置: 移动技术网 > IT编程>移动开发>Android > 【Gradle】Android Gradle 多渠道构建

【Gradle】Android Gradle 多渠道构建

2019年09月05日  | 移动技术网IT编程  | 我要评论

迷案记第二季,山东省沂南县,智游防盗

android gradle 多渠道构建

多渠道构建的基本原理

在android gradle中,定义了一个叫build variant的概念,一个build variant=build type+product flavor,build type就是我们构建的类型,比如release和debug;product flavor就是我们构建的渠道,比如baidu,google等,它们加起来就是baidurelease,baidudebug,googlerelease,googledebug,共有这几种组合的构件产出。product flavor也就是我们多渠道构建的基础。以下是新增一个productflavor:

android{
    productflavors{
        google{}
        baidu{}
    }
}

以上的发布渠道配置后,android gradle就会生成很多task。其中,assemble开头的负责生成构件产物(apk)。除此之外,还有compile系列,install系列等。除了生成的task外,每个productflavor还可以有自己的sourceset,还可以有自己的dependencies依赖。

flurry多渠道和友盟多渠道构建

flurry本身没有渠道的概念,它有application,所以可以把一个application当成一个渠道。

android{
    productflavors{
        google{
            buildconfigfield 'string','flurry_key','"abadfassdfas"'
        }
        baidu{
            buildconfigfield 'string','flurry_key','"jkkjkhkjhihiuy"'
        }
    }
}

这样每个渠道的buildconfig类中都会有名字为flurry_key的常量定义,它的值是我们在渠道中使用buildconfigfield指定的值,每个渠道不一样,我们只需要在代码中指定使用这个常量即可,这样每个渠道的统计分析就可以做到了。

flurry.init(this,flurry_key);

友盟本身有渠道的概念。不过它不是在代码中指定的,而是在androidmanifest.xml中配置的,通过配置meta-data标签来设置:

<meta-data android:name="umeng_channel" android:value="channel id"/>

多渠道构建定制

多渠道的定制,其实就是对android gradle插件的productflavor的配置,通过配置productflavor达到灵活控制每一个渠道的目的。

applicaitonid

用于设置渠道的包名

consumerproguardfiles

只对android库项目有用。当我们发布库项目生成一个aar包的时候,使用consumerproguardfiles配置的混淆文件列表也会被打包到aar里一起发布,这样当应用引用这个aar包,并且启用混淆的时候,会自动使用aar包里的混淆文件对aar包里的代码进行混淆,这样我们就不用对该aar包进行混淆配置了。

android{
    productflavors{
        google{
            consumeproguardfiles 'proguard-rules.pro','proguard-android.txt'
        }
    }
}

除了这种方法,还有一种属性设置的方法,区别在于:consumerproguardfiles方法是一直添加,不会清空以前的混淆文件,而consumerproguardfiles属性配置的方式是每次都是新的混淆文件列表,以前配置的会先被清空。

manifestplaceholders

multidexenabled

用来启用多个dex的配置,主要用来突破65535方法的问题

proguardfiles

混淆使用的文件列表

signingconfig

签名配置

testapplicationid

用来适配测试包的包名

testfunctionaltest和testhandleprofiling

testfunctionaltest表示是否为功能测试,testhandleprofiling表示是否启用分析功能

testinstrumentationrunner

用来配置运行测试使用的instrumentation runner的类名,是一个全路径的类名,而且必须是android.app.instrumentation的子类,一般情况下,我们使用android.test.instrumentationtestrunner,当然也可以自定义。

testinstrumentationrunnerarguments

配合上一个属性用的,用来配置instrumentation runner使用的参数,它们最终都是使用adb shell am instrument这个命令。

versioncode和versionname

配置渠道的版本号和版本名称。

usejack

用于标记是否启用jack和jill这个全新的,高性能的编译器。

dimension

dimension是productflavor的一个属性,接受一个字符串,作为该prodoctflavor的维度。可以简单理解为对productflavor进行分组,dimension接受的参数就是我们分组的组名,也就是维度名称。维度名称不能随便指定,在使用前,必须先声明。

flavordimension是我们使用的android{}里面的方法,它和productflavors{}是平级的,一定要先使用flavordimension声明维度,才能在productflavor中使用。

我们同时指定多个维度,但是一定要,这些维度是有顺序的,有优先级的,第一个参数的优先级最大,其实是第二个,以此类推。

android{
    flavordimensions "abi","version"
}

声明维度后,就可以使用了:

android{
    flavordimensions "abi","version"

    productflavors{
        free{
            dimension 'version'
        }
        paid{
            dimension 'version'
        }
        x86{
            dimension 'abi'
        }
        arm{
            dimension 'abi'
        }
    }
}

提高多渠道构建的效率

参考美团方案

利用在apk的meta-inf目录下添加空文件不用重新签名的原理

1、利用android gradle打一个基本包(母包)

2、基于该包复制一个,文件名要能区分出产品、打包时间 、版本、渠道等

3、对复制出来的apk进行修改,在其meta-inf目录下新增空文件,但空文件的文件名要有意义,必须包含能区分渠道的名字

4、重复步骤2、3生成我们所需的所有渠道包apk

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

验证码:
移动技术网