標籤:
查看原文:http://blog.csdn.net/u010818425/article/details/52319382
Gradle實戰系列文章:
《Gradle基本知識點與常用配置》
《Gradle實戰:不同編譯類型的包同裝置共存》
《Gradle實戰:發布aar包到maven倉庫》
《Gradle實戰:執行sql操作hive資料庫》
本文將延續之前幾篇部落格的風格,先從基本概念入手,這有助於我們對後文的理解; 在後續的代碼中如果忘了某個概念的具體意義,可以回顧頭來重新查看概念的介紹。
文中先詳細介紹了普通批量打包方案的實現原理,後介紹了美團批量打包的基本實現原理,並引用了幾篇實現方案供大家參考
一、基本概念介紹
1. package
2. PlaceHolder
3. applicationId
4. buildTypes
用於產生不同編譯類型的包,如debug和release包
android{ buildTypes { debug { ... } release { ... } }}
debug和release是gradle預設內建的兩個build type,在工程自動產生的BuildConfig中,其區別如下:
// release版本產生的BuildConfig特性資訊public final class BuildConfig { public static final boolean DEBUG = false; public static final String BUILD_TYPE = "release";}// debug版本產生的BuildConfig特性資訊public final class BuildConfig { public static final boolean DEBUG = true; public static final String BUILD_TYPE = "debug";}
自訂不同的build type,如
android{ buildTypes { debug { ... } release { ... } beta { ... } }}
5. productFlavors
6. signingConfigs
7. META-INF檔案
- 用於儲存簽名的一些相關資訊,在META-INF目錄內添加空檔案,應用無需重新簽名。
二、多渠道打包配置
1. 一般打包方案
//產生打包時間 def releaseTime() { return new Date().format("yyyy-MM-dd", TimeZone.getTimeZone("UTC")) } android { compileSdkVersion 23 buildToolsVersion "23.0.3" defaultConfig { applicationId "com.company.appname" minSdkVersion 15 targetSdkVersion 23 versionCode 1 versionName "1.0" //預設渠道為官網 manifestPlaceholders = [UMENG_CHANNEL_VALUE: "official"] } lintOptions { checkReleaseBuilds false abortOnError false } //配置編譯的jdk版本 compileOptions { sourceCompatibility org.gradle.api.JavaVersion.VERSION_1_7 targetCompatibility org.gradle.api.JavaVersion.VERSION_1_7 } //簽名配置 signingConfigs { debug { // No debug config storeFile file("${rootDir}/keystores/xqsg_debug.jks") //debug認證 } release { storeFile file("${rootDir}/keystores/xqsg.jks") //release認證 storePassword "test" //簽署憑證密碼 keyAlias "test" //別名 keyPassword "test" //別名密碼 } } buildTypes { debug { buildConfigField("boolean", "LOG_ON", "true")//通過編譯類型配置日誌開關 versionNameSuffix "-debug" //包名尾碼為“-debug” minifyEnabled false //是否混淆 zipAlignEnabled false //Zipalign最佳化 shrinkResources false // 移除無用的resource檔案 signingConfig signingConfigs.debug //使用debug認證簽名 } release { buildConfigField "boolean", "LOG_ON", "false" //不顯示Log minifyEnabled true //開啟混淆 zipAlignEnabled true //開啟Zipalign最佳化 shrinkResources true //移除無用的resource檔案,此項只有在開啟混淆時才生效 proguardFiles getDefaultProguardFile(‘proguard-android.txt‘), ‘proguard-rules.pro‘ signingConfig signingConfigs.release //使用release認證簽名 //多渠道打包配置 applicationVariants.all { variant -> variant.outputs.each { output -> def outputFile = output.outputFile if (outputFile != null && outputFile.name.endsWith(‘.apk‘)) { // 輸出apk名稱為test_v1.0_2016-08-15_wandoujia.apk def fileName = "test_v${defaultConfig.versionName}_${releaseTime()}_${variant.productFlavors[0].name}.apk" output.outputFile = new File(outputFile.parent, fileName) } } } } } // 渠道配置 productFlavors { wandoujia {} _360 {} baidu {} xiaomi {} } productFlavors.all { flavor -> flavor.manifestPlaceholders = [UMENG_CHANNEL_VALUE: name] //動態地修改AndroidManifest中的渠道名 } }
註:上述日誌開關,可以在java代碼中擷取該變數值,如:
if(BuildConfig.LOG_ON){ Log.d("test","xxx"); }
2. 美團打包方案
實現原理:Android應用安裝包apk檔案是一個壓縮檔,可以將其尾碼改為zip直接解壓。解壓後會發現根目錄下有一個META-INF目錄。如果在META-INF目錄內添加空檔案,應用無需重新簽名。因此,通過為不同渠道的應用添加不同的空檔案,可以唯一標識一個渠道。
採用這種方式,每打一個渠道包只需複製一個apk,在META-INF中添加一個使用渠道號命名的空檔案即可。
- 美團Android自動化之旅—產生渠道包
- 美團Android自動化之旅—適配渠道包
- 實現參考1
- 實現參考2
深入學習Android Studio系列教程六–Gradle多渠道打包Android產品研發(五)–>多渠道打包更便捷的 Android 多渠道打包方式Android打包系列——多渠道快速打包
查看原文:http://blog.csdn.net/u010818425/article/details/52319382
Gradle實戰:Android多渠道打包方案匯總