在library中使用productFlavors

因为公司的app是医生端和患者端,在app开发中会很多模块是相似的只有一部分逻辑不同,比如登录模块,IM模块。

library使用productFlavors

在library的 build.gradle中如下配置,

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
flavorDimensions "type"
publishNonDefault true
productFlavors {
doctor {
buildConfigField("String", "appType", "\"1\"")
}
patient {
buildConfigField("String", "appType", "\"2\"")
}
}

定义一个维度为 type类型的,分android和patient,定义了appType,1为医生端,2为患者端,在library中可以使用如下来区分是哪个渠道,BuildConfig.appType,但是当很大一部分代码不一样的时候,可以在src目录下建立两个doctor和patient的包,这样在打包的时候就不会把对方渠道的代码打进去,可以减少app的体积。

1
2
3
4
5
6
7
8
9
10
public class LoginActivity extends AppCompatActivity {
private TextView mTvType;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.login_activity_login);
mTvType = findViewById(R.id.tv_login_type);
mTvType.setText(BuildConfig.appType);
}
}

app中使用

app是分两个的,在doctor的app下我们只想要doctor渠道,patient也是类型,但是我在doctor的app下面是不想要这两个渠道的,我只需要其中的一中而且是确定的,app下有自己的渠道,这种情况就是library中有,但是app中没有,这个时候可以使用missingDimensionStrategy选择策,在defaultConfig下,意思就是我当前app下没有和library相同渠道的时候,都采用你设置的渠道,这样不管app自己有什么渠道,都会采用library中你所选择的渠道。(还有很多其它场景可以使用matchingFallbacks属性来设置回退策略)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
defaultConfig {
applicationId "com.github.wkw.doctor"
minSdkVersion 21
targetSdkVersion 28
versionCode 1
versionName "1.0"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
missingDimensionStrategy "type", "doctor"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
flavorDimensions "app"
productFlavors {
preProd {
}
}
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation project(':module_login')
}
}

总结

这样login模块就不用维护两份代码,当出现bug的时候还要修改两份,这种办法非常适合两个高度相似的app。