使用Gradle構建多版本app

####資源文件個性化處理
res目錄下的都算資源文件(layout、values、drawable、mipmap)java

  1. 在build.gradle中定義productFlavorsandroid

    android {
         compileSdkVersion 23
         buildToolsVersion "24.0.2"
         defaultConfig {
             applicationId "com.atearsan.multiflavors"
     	    minSdkVersion 14
             targetSdkVersion 23
             versionCode 1
     	    versionName "1.0"
         }
         buildTypes {...}
         productFlavors {
             free {
             }
             pro {
             }
         }  
     }
  2. (在src目錄下)建立與productFlavors對應的文件夾git

  3. 將個性化處理的資源文件放到productFlavors對應的資源目錄中(沒有資源目錄就按照main/res的結構建立) "說明"github

  4. 資源文件個性化處理規則
          命名要同樣
          文件路徑要同樣
          好比productFlavors-pro的app_name要改爲"MultiFlavors-PRO", 就在pro下建立strings.xml, 而後添加<string name="app_name">MultiFlavors-PRO</string>就行了
          ![](http://7xqmjb.com1.z0.glb.clouddn.com/2016091810427截圖 2016-09-18 16時57分25秒.png?imageView2/2/w/900)app

####AndroidManifest.xml內容個性化處理ide

  1. 新增屬性 (新增的屬性按照正常的寫法就行了)
        <activity android:name=".view.activity.ProActivity" />
  2. 覆蓋main/AndroidManifest.xml中的屬性 (好比覆蓋meta-data的值)
        文字很差描述, 直接看圖片對比吧.     ![](http://7xqmjb.com1.z0.glb.clouddn.com/2016091866407截圖 2016-09-18 17時32分55秒.png?imageView2/2/w/1100)
        AndroidManifest.xml內容的合併, 關鍵是tools:replace的使用. 更多內容參考: http://tools.android.com/tech-docs/new-build-system/user-guide/manifest-merger

####java文件性化處理
java文件處理起來會麻煩不少, 並且不適合項目大範圍的修改. 由於改起來比較累 :(
假如如今`main`中有一個java類:NextActivity.class, 如今要改爲在`pro`中toast提示"pro", 在`free`中toast提示"free".
1.把NextActivity.class複製到freepro對應的包路徑下 (包路徑保持一致)
2.刪除main中的NextActivity.class類. (不刪除的話, 編譯的時候會提示NextActivity類重複)
3.在freepro中分別實現本身須要的邏輯         ####'包名'個性化處理
首先, 咱們要弄懂Android程序中applicationIdpackageName的區別.
簡單粗暴的理解, packageName是咱們能看到的程序的資源文件的路徑. 好比:com.atearsan.multiflavors, 這個就是程序的包結構, 每一個類的第一句是package com.atearsan.multiflavors.view.activity. 引用某個類的時候會有一句import com.atearsan.multiflavors.R.
applicationId是APK的惟一標識, 在Android系統中, applicationId才表明一個惟一的應用. 建立一個project的時候, applicationId默認就是咱們指定的包結構路徑. 能夠在build.gradle中找到. 經過代碼獲取到的packageName就是applicationId, 可是反編譯APK就會發現看到的目錄結果跟applicationId不一致, 而是咱們編寫代碼的時候的目錄結構.
因此, 本段內容的標題中'包名'實際是指applicationId. 咱們通常說一份代碼發佈多個版本的APK, 修改的也是applicationId.
注意: 程序代碼獲取到的packageName其實是applicationId, 因此第三方服務(好比各類推送、各類分享、各類登陸)要在AndroidManifest.xml中配置包名的時候也是指applicationIdpost

android {
	compileSdkVersion 23
	buildToolsVersion "24.0.2"

    defaultConfig {
	    //applicationId "com.atearsan.multiflavors"     // 默認值. 改爲在productFlavors中定義
        minSdkVersion 14
	    targetSdkVersion 23
    	//versionCode 1                                 // 改爲在productFlavors中定義
        //versionName "1.0"
	}
    buildTypes {...}

	productFlavors {
    	free {
        	applicationId "com.free.xx.oo"
            versionCode 1
	        versionName "v1.0"
    	}

        pro {
	        applicationId "com.atearsan.multiflavors.pro"
    	    versionCode 2
        	versionName "v1.1"
        }
	}
}

####依賴庫(lib)及混淆個性化處理 android { buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } } productFlavors { free { applicationId "com.free.xx.oo" versionCode 1 versionName "v1.0" } pro { applicationId "com.atearsan.multiflavors.pro" versionCode 2 versionName "v1.1" proguardFiles 'proguard-rules-pro.pro' // 混淆個性化處理 } } } dependencies { compile fileTree(dir: 'libs', include: ['*.jar']) testCompile 'junit:junit:4.12' proCompile 'com.android.support:appcompat-v7:23.4.0' // 依賴庫個性化處理 }gradle

####demo源碼 (git.osc) http://git.oschina.net/atearsan/MultiFlavorsDemoui

####參考內容 如何使用Gradle構建不一樣版本的app?
Manifest Merger
android基礎:applicationId與packageName的區別
[Android] 應用的包名:ApplicationId vs PackageName.net

相關文章
相關標籤/搜索