Gradle多版本差异化管理

今天我们来说一说Gradle多版本差异化管理,在实际开发中我们往往经常需要打不同的APK来满足我们不同需求。不用手动改来改去一些多余的需求,用我们AS+Gradle就可以完美解决。废话不多说,开车。

先看图,我们通过切换不同的Build Variant,生成我们需要的APK

下面我们来看看在AS中我们要如何展开这项工作的,在我们app的gradle配置中我们只需要这么做,首先我们要明确两个概念

  1. buildTypes
    可以为不同的用户、不同的渠道打包不同的apk包,以便在程序行为上针对不同使用需求做少量定制(如是否可以更改远程服务器地址等)
  2. productFlavors
    productFlavors主要针对于”不同的版本之间差异非常小,本质上是同一应用”这种情况。可以根据渠道不同在版本名中增加相应后缀,可以根据特殊客户要求打包不同 ApplicationID 的apk包,并可分别使用不同的资源文件(如不同的应用图标等)
1
2
3
4
5
6
7
8
9
10
defaultConfig {
applicationId "android.com.test"
}
productFlavors {
pro {
applicationId "android.com.test.pro"
}
free {
}
}

这里可以看到我们加了productFlavors,里面一个pro版,一个free版,我们为高级版的定了不同的applicationId,而普通版的就是使用我们默认的applicationId,gradle中简单配置就先这样了。
然后我们需要在src目录下面新建我们刚刚加的两个渠道

快速生成我们的java,res目录,新建一个空Activity就好了,然后在里面植入我们需要的代码,下面贴上代码。

这里我在pro,free文件中各自新建了一个自定义的MyView,里面代码很简单

free:

1
2
3
4
5
6
public MyView(Context context){
super(context);
LayoutInflater inflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View inflate = inflater.inflate(R.layout.free, null);
setContentView(inflate);
}

pro:

1
2
3
4
5
6
public MyView(Context context) {
super(context);
LayoutInflater inflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View inflate = inflater.inflate(R.layout.pro, null);
setContentView(inflate);
}

然后我们就可以在main文件中的Activity去调用他们了。

1
2
3
4
5
6
7
viewById.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
MyView myView = new MyView(Activity.this);
myView.show();
}
});

这里自定义的一个dialog,你自定义啥都行,你也可以写Activity,然后main里面跳转,都是可以的。
如果想把pro的apk名字改一下也和简单,正常处理就好了,在strings.xml目录中加入app_name就好了,然后下面到了最后一步

可以看到这里有四个版本,分别对应我们设置的debug,release版本,选择运行,这样就可以在手机上面显示我们自己的两个apk了!!!

这里需要注意的是我们新建flavors文件要看好了,注意它们的依赖关系,我们新建的布局文件记得依赖当前文件,不是依赖main文件哦。不然会出问题的!

参考文章
利用 Android Studio 和 Gradle 打包多版本APK

版权声明:



除非注明,本博文章均为原创,转载请以链接形式标明本文地址。

坚持原创技术分享,您的支持将鼓励我继续创作!