前言
记得之前做过一个电梯的项目,分为监管端和客户端。两端的数据基本相同,仅仅是页面的布局和文字信息不同。当初为了省事在代码里控制了不同角色使用不同的文字和布局,现在想来耦合度很高,很不利于以后的维护。今天在《巧用gradle构建Android应用》的书中看到了,使用gradle来构建不同的变种来解决一个项目不同的体现效果。
官方文档的讲解
https://developer.android.com/studio/build/build-variants?utm_source=android-studio#product-flavors
开工
假如项目需要构建A,B,C这个不同风格的App。A端是监管端,B端是商家端,C端是用户端。使用gradle的DSL里的productFlavors来为三个不同的App进行配置
android{
...
productFlavors{
a{
applicationId "com.bigademo.a"
}
b{
applicationId "com.bigademo.b"
}
c{
applicationId "com.bigademo.c"
}
}
}
或者使用applicationIdSuffix来简化applicationId,这样最后生成的applicationId就是applicationId + applicationIdSuffix
android{
...
defaultConfig{
applicationId "com.bigademo"
}
productFlavors{
a{
applicationIdSuffix ".a"
}
b{
applicationId ".b"
}
c{
applicationId ".c"
}
}
}
有了App的ApplicaiotnId以后,设置每个端的布局和文字,甚至代码。首先按照下图新建文件夹。

当创建完以后会发现类似a和c文件夹的情况,都是灰色的,和main的目录文件夹图片不一样。好像只是普通的文件夹,怎么可能生成Apk呢。接下来看下图的操作。点击AS左侧的Build Varinat,然后在Build Variant的面板里选择。当选择a的时候,a的目录就变成了和main目录一样的文件夹图片了。

接下来就是让app变种的时候了。在a,b,c文件夹下的res下创建 values/string.xml的文件,(和main/res/values/string.xml一样),新建一个名叫title_name的string。
a/res/values/string.xml
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="title_name">AA</string>
</resources>
b/res/values/string.xml
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="title_name">BB</string>
</resources>
c/res/values/string.xml
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="title_name">CC</string>
</resources>
然后在main/res/layout/activity_main.xml中引用@string/title_name,最后切换Build Variants中的a,b,c,当构建的时候,会发现布局文件里的文本已经发生了变化。



到这里基本的变种算是实现了,但是我们会开发版的经常碰到最低版本号多少合适的问题。试想一下,现在的手机更新换代这么快,如果是直播类的app那么使用的群体必然是80年以后的人了,手机的更新程度也应该是比较快的,所以直播类的app,一般都会把最低版本设置在5.0,或者4.4。而对于有些商家来说,只要手机能打电话,发短信,微信,日常的基本使用就行了,一般两到三年才会换手机,甚至需要更久的时间,那么,我们在设置最低版本的时候,设置在4.0,是比较合适。那么现在对a,b两个变种使用最低4.0的版本,c变种使用5.0的最低版本。
android{
...
defaultConfig{
applicationId "com.bigademo"
}
flavorDimensions "api","mode"
productFlavors{
a{
applicationIdSuffix ".a"
dimension "mode"
}
b{
applicationId ".b"
dimension "mode"
}
c{
applicationId ".c"
dimension "mode"
}
minApi14{
dimension "api"
minSdkVersion 14
}
minApi18{
dimension "api"
minSdkVersion 19
}
}
}
当gradle同步完以后,会发现在Build Variant里会发现变的更丰富了。

。那么现在可以在一个设备上安装不同类型的app了。
网友评论