Android Studio 多個編譯環境配置 多渠道打包 APK輸出配置

来源:http://www.cnblogs.com/chenrui7/archive/2017/01/06/6257315.html
-Advertisement-
Play Games

看完這篇你學到什麼: 熟悉gradle的構建配置 熟悉代碼構建環境的目錄結構,你知道的不僅僅是只有src/main 開發、生成環境等等環境可以任意切換打包 多渠道打包 APK輸出文件配置 需求 一般我們開發的環境分為:debug 和 release,但是你想再分內測1環境、內測2環境等等怎麼辦呢? ...


看完這篇你學到什麼:

  • 熟悉gradle的構建配置
  • 熟悉代碼構建環境的目錄結構,你知道的不僅僅是只有src/main
  • 開發、生成環境等等環境可以任意切換打包
  • 多渠道打包
  • APK輸出文件配置

需求

一般我們開發的環境分為:debug 和 release,但是你想再分內測1環境、內測2環境等等怎麼辦呢?

這就需要依賴強大的gradle 來配置了。

相關的配置也可以參考谷歌官方文檔

配置構建類型 buildTypes

您可以在模塊級 build.gradle 文件的 android {} 代碼塊內部創建和配置構建類型。當您創建新模塊時,Android Studio 會自動為您創建調試和發佈這兩種構建類型。儘管調試構建類型不會出現在構建配置文件中,Android Studio 會將其配置為 debuggable true。這樣,您可以在安全的 Android 設備上調試應用並使用通用調試密鑰庫配置 APK 簽署。

如果您希望添加或更改特定設置,您可以將調試構建類型添加到您的配置中。以下示例為調試構建類型指定了 applicationIdSuffix,並配置了一個使用調試構建類型中的設置進行初始化的jnidebug構建類型。

applicationIdSuffix: 欄位表示,在不改變你預設的程式ID(包名)的情況下,為其添加尾碼。比如你的包名是com.rae.app,但你想區分測試包和正式包的情況,這個時候將applicationIdSuffix設置為.debug,那麼你的應用程式對應的包名就變成了com.rae.app.debug

android {
    ...
    defaultConfig {...}
    buildTypes {
        release {
            minifyEnabled true
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }

        debug {
            applicationIdSuffix ".debug"
        }

        /**
         * The 'initWith' property allows you to copy configurations from other build types,
         * so you don't have to configure one from the beginning. You can then configure
         * just the settings you want to change. The following line initializes
         * 'jnidebug' using the debug build type, and changes only the
         * applicationIdSuffix and versionNameSuffix settings.
         */

        jnidebug {

            // This copies the debuggable attribute and debug signing configurations.
            initWith debug

            applicationIdSuffix ".jnidebug"
            jniDebuggable true
        }
    }
}

構建源集

我們都知道,源代碼是放在src/main 文件夾下的,但是由於配置了不同的構建類型像想要區分不同的源文件怎麼辦呢?這個時候就可以在src對應你的buildTypes來建立文件夾了 ,更多參考谷歌源集

Android Studio 按邏輯關係將每個模塊的源代碼和資源分組為源集。模塊的 main/ 源集包括其所有構建變體共用的代碼和資源。其他源集目錄為可選項,在您配置新的構建變體時,Android Studio 不會自動為您創建這些目錄。不過,創建類似於 main/ 的源集有助於讓 Gradle 只應在構建特定應用版本時使用的文件和資源井然有序:

productFlavor 表示渠道包,可以看下麵的多渠道打包

src/main/

此源集包括所有構建變體共用的代碼和資源。

src/<buildType>/

創建此源集可加入特定構建類型專用的代碼和資源。示例:src/jnidebug

src/<productFlavor>/

創建此源集可加入特定產品風味專用的代碼和資源。比如百度渠道包:src/baidu

src/<productFlavorBuildType>/

創建此源集可加入特定構建變體專用的代碼和資源。
例如,要生成應用的“完全調試”版本,構建系統需要合併來自以下源集的代碼、設置和資源。比如:百度的開發環境包:src/baiduDebug

構建類型依賴配置

很多時候我們會把sdk或者api介面單獨做成一個庫,一般會有生產環境和測試環境之分,但在依賴的時候往往我們會像這樣去引用:compile project(':sdk'),這樣依賴的環境就是release,在開發調試的時候測試環境的時候就不行了。我們得換另外一種方式:

<buildType>Compile project()

這樣會根據不同的構建類型去依賴不同的包,比如我們測試環境的依賴包:debugCompile project(':sdk'),再比如上面的jnidebugjnidebugCompile project(':sdk')

那麼問題來了,我當前的構建類型怎麼對應到其他的module去呢?比如你的app要依賴sdk module 的debug 環境,那麼你可以這麼做:

configuration:目標module<buildType>,比如你sdk 中<buildType>debug構建類型

debugCompile project(path: ':sdk', configuration: 'debug')

綜合示例:

1、先看app這邊的build.gradle配置:

apply plugin: 'com.android.application'

android {
    buildTypes {
        release {
            minifyEnabled true
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
        debug {
            applicationIdSuffix '.debug'
            minifyEnabled false
        }
        
        // 自定義的構建類型,名字隨便取,一定要有意義
        raedebug {
            initWith debug
            applicationIdSuffix '.raedebug'
        }
    }
}

dependencies {
    // 生成環境依賴
    releaseCompile project(path: ':sdk', configuration: 'release')
    // 測試環境依賴
    debugCompile project(path: ':sdk', configuration: 'debug')
    // 自定義構建類型依賴
    raedebugCompile project(path: ':sdk', configuration: 'uutest')
}

2、sdk module的build.gradle配置:

apply plugin: 'com.android.library'

android {
       buildTypes {
        debug {
            debuggable true
            minifyEnabled false
        }
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
        
        // 註意這裡,跟第一點的 raedebugCompile project的configuration要匹配。
        uutest {
            initWith debug
        }
    }
}

多渠道打包 productFlavors

先看看build.gradle配置你就懂了

android{

    // 渠道包定義,預設定義的名稱就是渠道名稱
    productFlavors {
 
        dev {} // 測試
        baidu {}        // 百度手機助手
        yinyongbao {}   // 應用寶
        m360 {}         // 360手機助手
        pp {}           // PP助手
        anzhi{}         // 安智市場
        xiaomi {}       // 小米商店
        letv {}         // 樂視商店
        huawei {}       // 華為商店
        lenovomm {}     // 聯想樂商店
        other {}        // 其他市場
        official{}      // 官方版本
 
    }
 
    // 批量渠道包值替換
    productFlavors.all { flavor ->
        // 友盟、極光推送渠道包, UMENG_CHANNEL 是根據你AndroidManifest.xml來配置的,請看下麵。
        flavor.manifestPlaceholders = [UMENG_CHANNEL: name, JPUSH_CHANNEL: name]
    }
}

AndroidManifest.xml 配置:


<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
          package="com.rae.demo">

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
       
       <!--變數採用${變數名}這樣來替換,不僅限與<meta-data /> 標簽,任何你想替換的都行。-->
         <meta-data
            android:name="UMENG_APPKEY"
            android:value="${UMENG_APPKEY}"/>
        
        <meta-data
            android:name="UMENG_CHANNEL"
            android:value="${UMENG_CHANNEL}"/>
        
        <!--${變數隨變換}-->   
        <activity
            android:name=".DemoActivity"
            android:label="${變數隨變換}"/>
            
    </application>

</manifest>

sync gradle之後看看gradle projects 面板列表就多出了好到渠道的任務了,Build Variants 面板也相對應多了這些構建類型。

APK輸出配置

在結合到多渠道打包後,運營的那邊希望我們給的渠道包是這種格式的app-{版本號}-{渠道名稱}.apk,那我們來看看怎麼來滿足這個多渠道打包輸出apk文件名修改的。

android{

    // 輸出文件配置
   applicationVariants.all { variant ->
        variant.outputs.each { output ->
            def outputFile = output.outputFile
            if (outputFile != null && outputFile.name.endsWith('.apk')) {
                def dirName = outputFile.parent // 輸出文件夾所在的位置
            
                // 文件名修改
                def fileName = "app-${output.processResources.variantName}-${defaultConfig.versionName}-${variant.flavorName}.apk"
                
                // 比如不想這麼麻煩,直接在後面加上版本號也行:
                // def fileName = outputFile.name.replace(".apk", "-${defaultConfig.versionName}.apk")
                
                
                output.outputFile = new File(dirName, fileName)
            }
        }
    }
}




您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 該文為閱讀高級程式設計(第三本)p144-p164的理解與總結! 接受指導與批評。 對於我,我一直是使用字面量的方式創建對象,然而體繫上的創建對象的方法卻並不局限於此。 創建對象的方法 1 工廠模式: 定義工廠函數創建並返回包含特定屬性的對象, 2 構造函數模式: 先貼出代碼 2.1 new Per ...
  • 本系列將從以下三個方面對Tinker進行源碼解析: 轉載請標明本文來源:http://www.cnblogs.com/yyangblog/p/6252855.html更多內容歡迎star作者的github:https://github.com/LaurenceYang/article如果發現本文有什 ...
  • 地址 MD5 https://dl-ssl.google.com/android/repository/android_m2repository_r08.zip 8C8EC4C731B7F55E6467914871AB8802 https://dl-ssl.google.com/android/re ...
  • service—Android的四大組件之一。人稱“後臺服務”指其本身的運行並不依賴於用戶可視的UI界面 實際開發中我們經常需要service和activity之間可以相互傳遞數據維持程式的運行。 先瞭解Service的生命周期吧。 新建一個類繼Service: 新建以上類並繼承Service後只會 ...
  • Android Butterknife 8.4.0 使用方法總結 ...
  • Android SDK版本號 與 API Level 對應關係如下表: Code nameVersionAPI level (no code name) 1.0 API level 1 (no code name) 1.1 API level 2 2008 年9月發佈的Android第一版 Cupc ...
  • APP簡介 律師查詢是基於聚合數據的律師查詢介面做的,這個介面目前處於停用狀態,但是,由於我是之前申請的,所以,還可以用,應該是無法再申請了。 效果圖 開發 一、HttpHelper 既然是請求介面的,那就少不了請求方式,這裡是比較常用的HttpClient,用起來也比較方便,單獨封裝一個HttpH ...
  • 作者:Antonio Leiva 時間:Jan 5, 2017 原文鏈接:https://antonioleiva.com/lambdas-kotlin/ 由於Lambda表達式允許更簡單的方式建模式函數,所以它是Kotlin和任何其他現代開發語言的最強工具之一。 在Java6中,我們僅能下麵方法這 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...