因为国内存在着有众多的应用市场,在不一样的应用市场可能有不一样的统计需求,为此Android开发人员须要为每一个应用市场发布一个安装包,这里就引出了Android的多渠道打包。在安装包中添加不一样的标识,以此区分各个渠道,方便统计app在市场的各类效果。html
所以,每当发新版本时,市场会提供一个渠道列表,Android RD会根据这些渠道相应地生成等量的渠道包。随着渠道愈来愈多,为了提升渠道打包的效率,所以催生了对多渠道打包的方式的研究。python
本篇文章主要总结一下多渠道打包的相关知识以及美团的新旧两种多渠道打包方案。android
Maven方式: 每打一个包都要执行一遍构建过程,效率过低;bash
apktool: 虽然不须要从新构建,但对每一个包都要从新签名;服务器
随着渠道包的增多,每次打包动辄几个小时,以上两种方式的效率过低。网络
关于这两种打包方式详见:美团Android自动化之旅—生成渠道包app
META-INF
添加空文件这是美团为了提升打包效率而提出的一种新的多渠道打包方式,不须要从新构建,也不须要从新签名。工具
经过解压apk,根目录下会有一个META-INF
目录,在该目录下添加空文件,能够不用从新签名应用。所以,经过为不一样渠道的应用添加不一样的空文件,能够惟一标识一个渠道。gradle
利用python代码用来给apk添加空的渠道文件ui
在Java代码中读取空渠道文件名,识别渠道
具体代码在上面美团生成多渠道包的连接中有详细给出。
Walle(瓦力):Android Signature V2 Scheme签名下的新一代渠道包打包神器
瓦力经过在Apk中的APK Signature Block
区块添加自定义的渠道信息来生成渠道包,从而提升了渠道包生成效率,能够做为单机工具来使用,也能够部署在HTTP服务器上来实时处理渠道包Apk的升级网络请求。
Android 7.0(Nougat)引入一项新的应用签名方案APK Signature Scheme v2,它是一个对全文件进行签名的方案,能提供更快的应用安装时间、对未受权APK文件的更改提供更多保护,在默认状况下,Android Gradle 2.2.0插件会使用APK Signature Scheme v2和传统签名方案来签署你的应用。
新应用签名方案的签名信息会被保存在区块(APK Signing Block
)中, 而区块(Contents of ZIP entries
)、区块(ZIP Central Directory
)、区块(ZIP End of Central Directory
)是受保护的,在签名后任何对其的修改都逃不过新的应用签名方案的检查。
以前的渠道包生成方案是经过在META-INF
目录下添加空文件的打包方式在Signature Scheme v2的签名方式下不可以使用了,由于META-INF
已经被列入了保护区了,向META-INF
添加空文件的方案会对上面受保护的三个区块都有影响。
经过上面描述发现区块(APK Signing Block
)是不受签名校验规则保护的,所以Walle正是经过在该区块作文章,写入渠道信息。
对新的应用签名方案生成的APK包中区块(APK Signing Block
)写入渠道信息,并保存在APK中
APK在安装过程当中进行的签名校验,是忽略咱们添加的渠道信息的,这样就能正常安装了
在App运行阶段,能够经过ZIP的End of central directory
、Central directory
等结构中的信息找到咱们本身添加的渠道信息,从而实现获取渠道信息的功能
最终,每打一个渠道包只需复制一个APK,而后在APK中添加一个渠道信息便可,这种打包方式速度很是快。
Gradle插件方式,方便快速集成
命令行方式,最大化知足各类自定义需求
关于Walle两种使用方式的详细步骤,参见:Android使用walle多渠道打包
上述多渠道打包方式解决了打包慢的问题,可是随着渠道愈来愈多,不一样渠道对应用的要求也不尽相同。
例如,有的渠道要求app的应用名不一样,有些渠道要求应用不能使用第三方统计工具,有些渠道要求应用不能自动更新。
以前的作法是为每一个须要适配的渠道建立一个Git分支,发版时再切换到相应的分支,并合并主分支的代码。适配的渠道比较少的话这种方式还能够接受,随着适配渠道的增多,这种方式就变得不可取。
幸亏Gradle flavor,能够知足渠道适配的需求,只须要经过配置Gradle便可以实现多渠道的适配工做,省心省力。
先来看build.gradle
文件中的一段代码:
android {
....
productFlavors {
flavor1 {
minSdkVersion 14
}
}
}
复制代码
上例定义了一个flavor
:flavor1
,并指定了应用的minSdkVersion
为14(固然还能够配置更多的属性,具体可参考相关文档)。与此同时,Gradle还会为该flavor
关联对应的sourceSet
,默认位置为src/<flavorName>
目录,对应到本例就是src/flavor1
。
接下来,要作的就是根据具体的需求在build.gradle
文件中配置flavor
,并添加必要的代码和资源文件。以flavor1
为例,运行gradle assembleFlavor1
命令既可生成所需的适配包。经过适配不一样的flavor
便可以生成不一样的渠道包,但该方式生成渠道包的方式须要重复编译构建。
productFlavors {
qq {
applicationId "com.hello.group.qq"
}
}
复制代码
面的代码添加了一个名为qq
的flavor,并指定了应用的包名为com.hello.group.qq
,运行gradle assembleqq
命令便可生成qq适配包。
Gradle在构建应用时,会优先使用flavor
所属sourceSet
中的同名资源。因此,解决思路就是在flavor
的sourceSet
中添加同名的字符串资源,以覆盖默认的资源。
首先,在build.gradle
配置文件中添加以下flavor:
android {
productFlavors {
wandoujia {
}
}
}
复制代码
上面的配置会默认src/wandoujia
目录为wandoujia
flavor的sourceSet
。
接下来,在src
目录内建立wandoujia
目录,并添加以下应用名字符串资源(src/wandoujia/res/values/appname.xml
):
<resources>
<string name="app_name">wandoujia_app</string>
</resources>
复制代码
默认的应用名字符串资源以下(src/main/res/values/strings.xml
):
<resources>
<string name="app_name">origin_app</string>
</resources>
复制代码
最后,运行gradle assembleWandoujia
命令便可生成应用名为wandoujia_app
的应用了。
wandoujia包下不使用strings.xml 名是由于会出现文件重复,默认的main 文件夹里存在的文件在其余适配目录中不容许出现相同文件名的文件。
更多flavor
适配示例,参见:美团Android自动化之旅—适配渠道包
以上就是最近了解关于多渠道打包的相关知识的总结。
想要实现更多自定义适配多渠道包的需求,还要更多的了解Gradle相关知识。