在日常开发中,可能会遇到同一份代码,需求依据运营需求打出不同包名、不同图标、不同称号的Apk,发布到不同的途径中。Android Studio供给了快捷的多途径打包完成办法productFlavors
。
本文介绍一下运用productFlavors
来完成多途径打包。
创立productFlavors
- 增加Dimension
在app包下的build.gradle中的android闭包下,增加flavorDimension
,代码如下:
android {
...
// 方法1
getFlavorDimensionList().add('example_value')
// 方法2
flavorDimensions "example_value"
}
两种方法选择一种即可,方法1有代码补全提示,方法2没有。
- 创立productFlavor
在app包下的build.gradle中的android闭包下,创立productFlavors
,代码如下:
android {
...
productFlavors {
// 原始途径
origin{
// 这儿的值与前面flavorDimensions设置的值保持一致
dimension 'example_value'
}
// 示例途径
exampleFlavor {
// 这儿的值与前面flavorDimensions设置的值保持一致
dimension 'example_value'
}
}
}
网上找到的相关文章都说productFlavor
中需求装备dimension
,但是在尝试的过程中发现,假如只增加了一个flavorDimensions
,那么productFlavor
中的dimension
能够不必特别声明(我的gradle版别为7.6,AGP为7.4.1)。
构建完后能够在Build Variants中看到已装备的变体,如图:
途径包参数装备
打途径包时,依据需求可能会需求装备不同参数,例如App的称号、图标、版别信息,服务器地址等。
- 装备不同的签名信息
假如需求运用不同的签名文件,能够在app包下的build.gradle中的android闭包下装备signingConfigs
,代码如下:
android {
signingConfigs {
origin {
keyAlias 'expampledemo'
keyPassword '123456'
storeFile file('ExampleDemo')
storePassword '123456'
}
exampleFlavor {
keyAlias 'exampledemoflavor'
keyPassword '123456'
storeFile file('ExampleDemoFlavor.jks')
storePassword '123456'
}
}
flavorDimensions "example_value"
productFlavors {
origin{
signingConfig signingConfigs.origin
}
exampleFlavor {
signingConfig signingConfigs.exampleFlavor
}
}
buildTypes {
debug {
// 需求移除默认签名
signingConfig null
}
release {
// 需求移除默认签名
signingConfig null
}
}
}
需求注意的是signingConfigs
必须在productFlavors
前面声明,否则构建会失利。
- 装备包名、版别号
在productFlavors
中能够装备途径包的包名、版别信息,代码如下:
android {
...
defaultConfig {
applicationId "com.chenyihong.exampledemo"
versionCode 1
versionName "1.0"
...
}
productFlavors {
origin{
...
}
exampleFlavor {
applicationId "com.chenyihong.exampledflavordemo"
versionCode 2
versionName "1.0.2-flavor"
}
}
}
origin途径表明的是原始包,不进行额定装备,运用的便是defaultConfig中声明的包名以及版别号。
作用如图:
origin
exampleFlavor
- 装备BuildConfig,字符串资源
在productFlavors
中装备BuildConfig或者resValue,能够让同名字段,在打不同的途径包时有不同的值,代码如下:
android {
...
productFlavors {
origin{
buildConfigField("String", "example_value", "\"origin server address\"")
resValue("string", "example_value", "origin tips")
}
exampleFlavor {
buildConfigField("String", "example_value", "\"flavor server address\"")
resValue("string", "example_value", "flavor tips")
}
}
}
装备完后从头构建一下项目,就能够经过BuildConfig.example_value
以及getString(R.string.example_value)
来运用装备的字段。
作用如图:
origin
exampleFlavor
- 装备manifestPlaceholders
有些三方SDK,会在Manifest中装备meta-data
,并且这些值跟包名大概率是绑定的,因而不同途径包需求替换不同的值,代码如下:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools">
<application
...
>
<meta-data
android:name="channel_value"
android:value="${channel_value}"/>
....
</application>
</manifest>
android {
...
productFlavors {
origin{
manifestPlaceholders = [channel_value: "origin channel"]
}
exampleFlavor {
manifestPlaceholders = [channel_value: "flavor channel"]
}
}
}
作用如图:
origin
exampleFlavor
- 装备不同的依靠
不同途径包可能会引证不同的三方SDK,装备了productFlavors
后,能够在dependencies
中区别依靠包,代码如下:
dependencies {
// origin 包依靠
originImplementation("com.google.code.gson:gson:2.10.1")
// exampleFlavor包依靠
exampleFlavorImplementation("com.google.android.gms:play-services-auth:20.4.1")
}
示例:
在FlavorExampleActivity
中同时导入Gson包和Google登录包,作用如下:
origin
exampleFlavor
- 装备不同的资源
在app/src目录下,创立exampleFlavor文件夹,创立与main包下相同的资源文件夹,打途径包时,相同目录下同名的文件会自动替换,能够经过这种方法来完成替换应用称号和应用图标。
作用如图:
示例Demo
依照常规,在示例Demo中增加了相关的演示代码。
ExampleDemo github
ExampleDemo gitee