1. 程式人生 > >gradle差異化打包

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-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差異化打包記到這裡,後期繼續學習補充。