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
  • 前言 本文介紹一款使用 C# 與 WPF 開發的音頻播放器,其界面簡潔大方,操作體驗流暢。該播放器支持多種音頻格式(如 MP4、WMA、OGG、FLAC 等),並具備標記、實時歌詞顯示等功能。 另外,還支持換膚及多語言(中英文)切換。核心音頻處理採用 FFmpeg 組件,獲得了廣泛認可,目前 Git ...
  • OAuth2.0授權驗證-gitee授權碼模式 本文主要介紹如何筆者自己是如何使用gitee提供的OAuth2.0協議完成授權驗證並登錄到自己的系統,完整模式如圖 1、創建應用 打開gitee個人中心->第三方應用->創建應用 創建應用後在我的應用界面,查看已創建應用的Client ID和Clien ...
  • 解決了這個問題:《winForm下,fastReport.net 從.net framework 升級到.net5遇到的錯誤“Operation is not supported on this platform.”》 本文內容轉載自:https://www.fcnsoft.com/Home/Sho ...
  • 國內文章 WPF 從裸 Win 32 的 WM_Pointer 消息獲取觸摸點繪製筆跡 https://www.cnblogs.com/lindexi/p/18390983 本文將告訴大家如何在 WPF 裡面,接收裸 Win 32 的 WM_Pointer 消息,從消息裡面獲取觸摸點信息,使用觸摸點 ...
  • 前言 給大家推薦一個專為新零售快消行業打造了一套高效的進銷存管理系統。 系統不僅具備強大的庫存管理功能,還集成了高性能的輕量級 POS 解決方案,確保頁面載入速度極快,提供良好的用戶體驗。 項目介紹 Dorisoy.POS 是一款基於 .NET 7 和 Angular 4 開發的新零售快消進銷存管理 ...
  • ABP CLI常用的代碼分享 一、確保環境配置正確 安裝.NET CLI: ABP CLI是基於.NET Core或.NET 5/6/7等更高版本構建的,因此首先需要在你的開發環境中安裝.NET CLI。這可以通過訪問Microsoft官網下載並安裝相應版本的.NET SDK來實現。 安裝ABP ...
  • 問題 問題是這樣的:第三方的webapi,需要先調用登陸介面獲取Cookie,訪問其它介面時攜帶Cookie信息。 但使用HttpClient類調用登陸介面,返回的Headers中沒有找到Cookie信息。 分析 首先,使用Postman測試該登陸介面,正常返回Cookie信息,說明是HttpCli ...
  • 國內文章 關於.NET在中國為什麼工資低的分析 https://www.cnblogs.com/thinkingmore/p/18406244 .NET在中國開發者的薪資偏低,主要因市場需求、技術棧選擇和企業文化等因素所致。歷史上,.NET曾因微軟的閉源策略發展受限,儘管後來推出了跨平臺的.NET ...
  • 在WPF開發應用中,動畫不僅可以引起用戶的註意與興趣,而且還使軟體更加便於使用。前面幾篇文章講解了畫筆(Brush),形狀(Shape),幾何圖形(Geometry),變換(Transform)等相關內容,今天繼續講解動畫相關內容和知識點,僅供學習分享使用,如有不足之處,還請指正。 ...
  • 什麼是委托? 委托可以說是把一個方法代入另一個方法執行,相當於指向函數的指針;事件就相當於保存委托的數組; 1.實例化委托的方式: 方式1:通過new創建實例: public delegate void ShowDelegate(); 或者 public delegate string ShowDe ...