gradle差異化打包
阿新 • • 發佈:2018-12-08
前幾天碰到這樣的需求,需要對當前的專案進行擴充套件,以其為模板,打包出多個專案來。比如我們的專案是一個養殖的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差異化打包記到這裡,後期繼續學習補充。