gradle差异化打包

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




你可能感兴趣的:(Android综合)