Gradle實戰:Android多渠道打包方案匯總

來源:互聯網
上載者:User

標籤:

查看原文:http://blog.csdn.net/u010818425/article/details/52319382

Gradle實戰系列文章: 
《Gradle基本知識點與常用配置》 
《Gradle實戰:不同編譯類型的包同裝置共存》 
《Gradle實戰:發布aar包到maven倉庫》 
《Gradle實戰:執行sql操作hive資料庫》

本文將延續之前幾篇部落格的風格,先從基本概念入手,這有助於我們對後文的理解; 在後續的代碼中如果忘了某個概念的具體意義,可以回顧頭來重新查看概念的介紹。

文中先詳細介紹了普通批量打包方案的實現原理,後介紹了美團批量打包的基本實現原理,並引用了幾篇實現方案供大家參考

一、基本概念介紹 1. package
  • AndroidManifest檔案中的包名

    <manifest xmlns:android="http://schemas.android.com/apk/res/android"    package="com.company.appname"    android:versionCode="1"    android:versionName="1.0" >

    包名有兩個作用: 
    一是裝置上應用程式的唯一標識,也是在應用市場上的唯一標識; 
    二是被用來命名你的資源類的包(以及解析任何相關的Activity的類名),如com.company.appname.R

2. PlaceHolder
  • AndroidManifest檔案中的變數表示,通過${PlaceHolder}表示PlaceHolder是可以被賦值的變數,如友盟統計中的渠道:

    <meta-data    android:name="UMENG_CHANNEL"    android:value="${UMENG_CHANNEL_VALUE}"></meta-data>
3. applicationId
  • 對應於AndroidManifest中的package

    android {    defaultConfig {        applicationId "com.company.appname"    }}
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
  • 用於產生不同渠道的包

    android {      productFlavors {        xiaomi {}        baidu {}        wandoujia {}        _360 {}        // 或“"360"{}”,數字需底線開頭或加上雙引號    }}

    執行./gradlew assembleRelease,將會打出所有渠道的release包; 
    執行./gradlew assembleWandoujia,將會打出豌豆莢渠道的release和debug版的包; 
    執行./gradlew assembleWandoujiaRelease將產生豌豆莢的release包。

    因此,可以結合buildType和productFlavor產生不同的Build Variants,即類型與渠道不同的組合

6. signingConfigs
  • 簽名配置,release編譯類型的配置如:

    release {    storeFile file("../yourapp.keystore") //簽署憑證檔案    storePassword "your password"         //簽署憑證密碼    keyAlias "your alias"                 //別名    keyPassword "your password"           //別名密碼}

    當然,簽名資訊可以通過讀設定檔(見上一篇文章)和設定檔ignore的形式來進行隱藏,本文不作詳述。

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多渠道打包方案匯總

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.