gradle
迁移到3.0
,新增属性风味维度感知,如果您的项目中存在多个module、多个渠道,并且相互依赖,风味维度将会带来一些困扰,简单聊一聊如何将3.0
之前的module渠道依赖使用3.0
之后的风味维度感知来实现
假设我们的项目中有这样两个module:app
、sdk
,app
作为演示demo,sdk
作为功能主体。sdk
需要提供给很多客户,所以sdk
中会有很多渠道。
下面分别用gradle2.3.3
和gradle3.1.4
做演示
项目结构如下:
gradle2.3.3
gradle 2.3.3 示例
apply plugin: 'com.android.library'
android {
...
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
debug {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
publishNonDefault true
// sdk渠道,定义了下面三个渠道
productFlavors {
// 测试渠道
don {}
// 小米
mi {}
// 海信
hisense {}
}
}
上面是sdk
的gradle
文件,上面在gradle
中声明了三个渠道,分别是 don
、mi
、hisense
,编译类型有 release
和 debug
这种情况下,app
如何直接引用sdk
?
apply plugin: 'com.android.application'
android {
...
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
debug {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
}
dependencies {
compile fileTree(include: ['*.jar'], dir: 'libs')
// 设置依赖sdk,并设置sdk的渠道和编译类型
compile project(path: ':sdk', configuration: 'donRelease')
}
跟依赖没有渠道的moudle不同是,直接依赖有渠道配置的module的时候需要指定所依赖moudle的渠道和编译类型.
例如上面app
依赖sdk
,并指定了渠道为don
,编译类型为release
,运行app
,打印出sdk
的渠道和编译类型,看对不对?
package com.don.gradle2;
import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.widget.TextView;
import com.don.sdk.BuildConfig;
import gradle2.don.com.gradle2.R;
public class MainActivity extends Activity {
private final String TAG = "MainActivity";
private TextView mBuildText;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView();
}
private void initView() {
mBuildText = (TextView) findViewById(R.id.buildText);
mBuildText.setText(BuildConfig.FLAVOR + " " + BuildConfig.BUILD_TYPE);
Log.i(TAG, "BuildConfig.FLAVOR: " + BuildConfig.FLAVOR
+ " BuildConfig.BUILD_TYPE:" + BuildConfig.BUILD_TYPE);
}
}
运行结果如下
I/MainActivity: BuildConfig.FLAVOR: don BuildConfig.BUILD_TYPE:release
gradle3.1.4 示例
gradle
版本升级到3.0
之后变化很大,引入了风味维度的概念,在sdk
中声明渠道信息就要修改
apply plugin: 'com.android.library'
android {
...
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
debug {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
publishNonDefault true
// 定义维度,渠道
flavorDimensions "channel"
productFlavors {
// 测试
don {
dimension "channel"
}
// 小米
mi {
dimension "channel"
}
// 海信
hisense {
dimension "channel"
}
}
}
从上面可以看出,如果想要定义渠道,需要先声明一个维度,这里我们起名为 channel
,紧接着在productFlavors
中声明类型变量,并指明改变量所属的维度。
值得一提的是在gradle3.0
之后可以声明多个维度,不过此功能与本篇主题无关,感兴趣的同学可以自己了解
相应的app
依赖sdk
的方式也要做出修改
apply plugin: 'com.android.application'
android {
...
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
debug {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
publishNonDefault true
flavorDimensions "channel"
productFlavors {
don {
dimension "channel"
}
mi {
dimension "channel"
}
hisense {
dimension "channel"
}
}
}
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation project(path: ':sdk')
}
这里可以看到与gradle2.3.3
不同的地方,依赖sdk
的时候,不需要指明sdk
的渠道
和编译类型
gradle2.3.3
compile project(path: ':sdk', configuration: 'donRelease')
gradle3.1.4
implementation project(path: ':sdk')
那么app
依赖的sdk
的时候,app
如何指定引入哪个渠道
和哪种编译类型
的sdk
呢?
gradle3.0
之后靠风味感知来实现这个功能。细心的同学可以看到app
的gradle
文件中声明了和sdk
一样的渠道信息,这种情况下我们只需要在编译app
的时候指定app
的渠道
和编译类型
, sdk
的渠道
和编译类型
就会跟app
的渠道
和编译类型
保持一致。
在Android Studio
的terminal
工具中输入下面两个指令
// 编译app,并指定渠道为don,编译类型为debug
./gradlew assembleDonDebug
// 启动app主界面
adb shell am start com.don.gradle3/.MainActivity
可以看到在logcat
中的输出
I/MainActivity: BuildConfig.FLAVOR: don BuildConfig.BUILD_TYPE:debug
代码下载
PS: 不想要积分的,CSDN上传代码,不让修改积分,有需要下载代码但没有积分的,可以在这里留言,我发给你
参考:
https://developer.android.google.cn/studio/build/build-variants#flavor-dimensions
网友评论