gradle差异化打包

时间:2022-06-03 14:53:43

     前几天碰到这样的需求,需要对当前的项目进行扩展,以其为模板,打包出多个项目来。比如我们的项目是一个养殖的app,现在需要扩展出细分的多个应用:养鱼的,养鸡的,养羊的,养猪的...同一份代码,我们只需要对其差异化的地方单独处理,我们在app下的build.gradle中配置就可以,通过配置差异化渠道来实现。

    

 productFlavors {
ji {
manifestPlaceholders = [icon : "@drawable/ic_launcher_ji",
KEY_UMENG : "53950edd56240ba50c01234",
]
applicationId "com.yang.ji" //定义包名
resValue "string", "app_name", "养鸡宝"
resValue "string", "app_slogen", "养鸡神器"
buildConfigField "int", "appId", '0'
buildConfigField "String", "home_site", '"http://yang.ji.com/"'
}


yu {
manifestPlaceholders = [icon : "@drawable/ic_launcher_yu",
KEY_UMENG : "53950edd56240ba50c05678",
]
applicationId "com.yang.yu"
resValue "string", "app_name", "养鱼宝"
resValue "string", "app_slogen", "养鱼神器"
buildConfigField "int", "appId", '0'
buildConfigField "String", "home_site", '"http://yang.yu.com/"'
}

}
  

  1.productFlavors下定义的ji与yu是打包时用到的变量名,可以随便定义。这里先说下manifestPlaceholders数组中配置的变量,注意用于清单文件中。定义的meta中的变量,可以通过代码获取它的值。

  

 <meta-data
android:name="UMENG_APPKEY"
android:value="${KEY_UMENG}" />

   /**     * 从meta中获取资源     * @name  meta中的key    */    public static int getMetaDataRes(Context mContext, String name) {        try {            ApplicationInfo appInfo = mContext.getApplicationContext().getPackageManager()                    .getApplicationInfo(mContext.getApplicationContext().getPackageName(),                            PackageManager.GET_META_DATA);            return appInfo.metaData.getInt(name);        } catch (Exception e) {            e.printStackTrace();        }        return -1;    }

  2.resValue定义的是资源值,我们可以通过R文件来获取。如:R.String.app.name.不同包下相同的key获取不同的值。这个与做图片适配的时候,非常相似。


 3.buildConfigField中定义的变量会在gradle编译后生产的BuildConfig文件中,我们在不同包名下重写这些变量,获取的时候,就拿到了不同的值。获取的时候,直接BuildConfig.appId就可以拿到配置的值了。

 

public final class BuildConfig {

public static final int appId = 0;
public static final String home_site = "http://yang.x.com/";
}
 

 关于gradle差异化打包记到这里,后期继续学习补充。