前几天碰到这样的需求,需要对当前的项目进行扩展,以其为模板,打包出多个项目来。比如我们的项目是一个养殖的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差异化打包记到这里,后期继续学习补充。