1. 程式人生 > >廈門之旅第一篇Gradle多渠道打包(動態設定App名稱,應用圖示,背景圖片,狀態列顏色)

廈門之旅第一篇Gradle多渠道打包(動態設定App名稱,應用圖示,背景圖片,狀態列顏色)

我不是詩人,寫不出廈門的美;我不是歌手,唱不出廈門的情;我不是畫家,畫不出廈門的景。

我只是一名程式設計師,我只能用我的眼,我的心去看去感受,那久違的海風吹拂著臉頰,好似內心那一份煩躁與沉重也隨著海風飄向了遠方 . . . . . .

一、Gradle多渠道打包之緣由

時間要追溯到兩年前,當時我還在使用 eclipse 開發工具。兄弟事業部有款產品需要封包(使用webview打包成app),並提出了相關的需求:

  • 針對不同商家地址(webview載入url),App名稱,應用圖示,歡迎頁背景,狀態列顏色(背景同色)都不同,以及版本號不同。

  • 針對不同的商家都必須打包成獨立的App,不會出現覆蓋安裝。

針對以上的需求每次打包都需要替換App名稱,應用圖示,背景等資源,還必須修改包名(帶來的一系列報錯)。後期又提出了升級功能,又得把資源、包名修改回去,一番折騰真的欲仙欲死。後來我乾脆每次都新建專案打包,業務邏輯沒有變化只是資源發生了改變,程式碼是拷貝了一份又一份,而且商家一多,維護起來真的是找得死去活來的,加之客戶提出新功能,我每個商家都需要擼一遍 . . . 神啊,誰來拯救我啊

二、自我拯救之路

在後來接觸到AndroidStudio(簡稱AS),逐漸的轉到了AS開發,確實比 eclipse高效快速方便。 gradle 構建功能真心非常強大,預設有 debug ,release 版本,我們可以針對不同版本做不同配置,這不正好解決我所遇到的問題。gradle

提供了productFlavors節點針對不同的版本做不同的配置。

比如有【四季易購】【仁仁家】【庫樂購】商家需要打包。

flavors

我在每個分支下面都重新配置applicationId這個屬性,從而使打包出來的apk的包名不一樣,避免了覆蓋安裝。

當然針對不同的商家 App名稱,圖示不一樣。這個時候我們就需要配置manifestPlaceholders屬性,manifestPlaceholders是一個類似HashMap的容器,因此在manifestPlaceholders可以配置多個屬性。如下我們可以這樣配置:

gradle配置:

flavors

AndroidManifest配置:

flavors

注意:節點 meta-data 的配置。

${icon}${app_name} 引用 manifestPlaceholders 容器中 iconapp_name 的值。

客戶的需求不僅僅更改App名稱與圖示,還需要修改webview載入地址,歡迎頁背景圖片等等,具體配置如下圖:

flavors

注意:新增的配置同樣需要在清單檔案中新增 meta-data節點。

        <meta-data
            android:name="welcome_bg"
            android:value="${welcome_bg}"/>

        <meta-data
            android:name="tint_color"
            android:value="${tint_color}"/>

        <meta-data
            android:name="load_url"
            android:value="${load_url}"/>

我們可以通過 Java 程式碼獲取到 meta-data節點下 android:value的值。

一般在 MyApplication 獲取節點的值:

    ApplicationInfo info = null;
    try {
        info = this.getPackageManager().getApplicationInfo(getPackageName(), PackageManager
                .GET_META_DATA);
        int tintColor = info.metaData.getInt("tint_color");
        String loadUrl=info.metaData.getString("load_url");
        String welcomePath = info.metaData.getString("welcome_bg");

    } catch (PackageManager.NameNotFoundException e) {
        e.printStackTrace();
    }

注意:設定welcome_bg:"@mipmap/klg_welcome",我這裡以int welcomeRes = info.metaData.getInt("welcome_bg");去取值,每次都返回0,但tint_color的值就正常。按正常思維@mipmap/klg_welcome返回的是 int 值,後來我換成getString還真獲取到了值:res/mipmap-hdpi-v4/sjyg_welcome.png。獲取到路徑值,背景的圖片資源就不能直接使用。

那麼我們把路徑資源轉換成int資源,這裡就用到了 Java 的反射。具體程式碼如下:

    Class c = R.mipmap.class;
    Field[] fields = c.getFields();
    for (Field field : fields) {
        if (field.getName().equals(welcomePath.substring(welcomePath.lastIndexOf("/") + 1,
                welcomePath.lastIndexOf(".")))) {
            this.welcomeBgRes = (int) field.get(c.newInstance());
            break;
        }
    }

擷取路徑字串獲取圖片的【名稱】,根據【名稱】在【R.mipmap.class】類中查詢,找到則返回該屬性的值。

這樣我們就把不同的配置資訊儲存到了MyApplication中,使用的時候直接呼叫。

還有一種方式在Java程式碼中可以方便獲取到gradle配置檔案的資料:

flavors

通過程式碼:context.getResources().getString(R.string.key);獲取值。

注意通過此方式 strings.xml 檔案下不能有同名的 key 屬性。不然會報相同資源引用錯誤。

三、生成APK

如果你想生成所有渠道的包:

Terminal命令輸入如下指令:

gradlew assembleRelease

構建成功請在以下目錄檢視:

flavors

如果你想針對某個渠道打包:

方式一:

flavors

配置不同渠道基礎資訊。

方式二:

flavors

更改 applicationId ,新增 manifestPlaceholders集合。

多渠道打包,並不需要更改百度、高德等第三方的key

多渠道打包,解決了以往深深的憂傷。

app

原始碼地址

相關推薦

廈門第一Gradle多渠道打包(動態設定App名稱應用圖示背景圖片狀態顏色)

我不是詩人,寫不出廈門的美;我不是歌手,唱不出廈門的情;我不是畫家,畫不出廈門的景。 我只是一名程式設計師,我只能用我的眼,我的心去看去感受,那久違的海風吹拂著臉頰,好似內心那一份煩躁與沉重也隨著海風飄向了遠方 . . . . . . 一、Grad

mybatis第一-初識mybatis

stream 事務 多條 如果 模糊查詢 user uid exceptio ring 一、JDBC的問題 為什麽我們要使用mybatis,是因為JDBC存在以下問題 1、 數據庫連接創建、釋放頻繁造成系統資源浪費,從而影響系統性能。如果使用數據庫連接池可解決此問題。

SpringBoot第一-初探

正常 方便 ice 功能 分享 hello 新建項目 ng- control 目錄 一、SpringBoot是什麽?二、SpringBoot的優勢三、hello world四、原理探究 一、SpringBoot是什麽? 微服務,應該是近年來最火的概念,越來越多的公司開始使用

Spring第一-初識Spring

一、概述 只要用框架開發java,一定躲不過spring,Spring是一個輕量級的Java開源框架,存在的目的是用於構建輕量

SpringCloud第一-微服務概念

一、單體架構的問題 微服務為什麼會出現?在學習Springboot的時候知道Springboot極大的簡化了我們的開發,我們可以快速的進行業務開發,Springboot單體應用在專案的開發初期能夠滿足我們需求,這種單體架構優點非常的明顯: 容易測試:本地就可以起完整的系統,不需要外部依賴。

Linux第一-目錄結構及操作目錄

一、引言 Linux對java開發來說也是一項必備的技能,因為專案基本都是部署在Linux作業系統的伺服器中,雖然專案不一定需要我們去部署,但不管是自己測試環境部署,還是一些生產環境中日誌的檢視,Linux作業系統都是免不了要去接觸的。對於我們開發來說懂得基礎的命令及簡單shell指令碼編寫是必須的。 跳

ANDROID STUDIO系列教程六--GRADLE多渠道打包

tor 等待 time() utf 腳本 manifest file resource 一個 由於國內Android市場眾多渠道,為了統計每個渠道的下載及其它數據統計,就需要我們針對每個渠道單獨打包,如果讓你打幾十個市場的包豈不煩死了,不過有了Gradle,這再也不是事了。

gradle學習(四) 使用gradle構建簡單的java web項目

compile jdk return resp 內容 mave name throws pan 本節通過一個簡單的javaweb項目來體會gradle的使用 需求 構建一個javaweb項目,搭建jsp+servlet開發環境 可以將需求分解為兩步: 使用gradle構建

Python (基礎二 1-25)

body 函數 closed 技術分享 items pop img -s 之間 字典:   字典是python中唯一的映射類型,采用鍵值對(key-value)的形式存儲數據。python對key進行哈希函數運算,根據計算的結果決定value的存儲地址,所以字典是無序存儲

Python人工智能路 - 第一 : 你得會點兒Python基礎

序列 但是 入參 而不是 username 定義函數 json序列化 並且 color Python 號稱是最接近人工智能的語言,因為它的動態便捷性和靈活的三方擴展,成就了它在人工智能領域的豐碑 走進Python,靠近人工智能 一.編程語言Python的基礎 之 "淺入淺出

STLvector--第一部落格

  STL(Standard Template Library)是C++的標準模板庫,方便靈活地使用STL將節省大量工作,減少不必要寫的程式碼。接下來我們來看看STL裡動態陣列vector的使用。 當我們不確定陣列的大小,開個大陣列又擔心浪費空間時,我們就需要了解了解神奇的動態陣列了。而STL裡

Gradle多渠道打包

Gradle多渠道打包 多渠道打包基本實現 不同的渠道包顯示不同的APP_NAME 不同的渠道包顯示的res資源不一樣 簡單的多渠道打包 1.在AndroidMainfest.xml的application中配置自定義項

Web 探索 | 第一

             本文純屬個人閱讀後的筆記,如有不足之處,請多多指教 Client-Server 模型 我們去餐廳用餐,服務我們的服務生英語也是“Server”(或者也叫 waiter) 在資訊科技領域,這種模型就是最著名和使用最廣泛“客戶機-伺服器” (也有稱

java多執行緒系列模式|第一-Guarded Suspension pattern

Guarded Suspension pattern模式 作者注:該系列文章基於《java執行緒設計模式》撰寫,只用於學習和交流。 定義:多執行緒執行,當前執行緒沒有達到警戒條件時,執行緒會進入等待直到

python第一

一 程式語言: 1.機器語言:直接用二進位制程式設計,直接操作硬體。   優點:執行效率快   缺點:學習難度大,開發效率低 2.組合語言:用英文標籤來代替一串特定意義的二進位制,直接操作硬體   優點:執行效率快,不如機器語言快   缺點:學習難度大,開發效率低,比機器語言降一個難度 3.高階語言:站在人的

恭喜你!在28歲前看見了騰訊頂級產品經理的進階路——第一《使用者》

隨著我國新媒體網路技術的飛速發展,許多新興產業也隨之誕生,增加了許多的就業機會,例如新媒體推廣運營工作。在紛繁複雜的網路環境下,如何通過平臺的推薦機制,如何使其精準的抵達至你的目標使用者群體呢?藝形藝意工作室創始人黎想將以騰訊為例,系統分享一位頂級產品經理正確的

我的前端第一彈--SeaJs基礎和spm編譯工具運用[圖文]

1. 概述 本文章來源於本人在專案的實際應用中寫下的記錄。因初期在安裝和使用Seajs和SPM的時候,有點不知所措的經歷。為此,我們編寫本文件,通過圖文並茂的方式來為大家講解seajs和spm編譯環境的搭建和基本使用方法。 2. 認識SEAJS seajs是一種前端模組化

【spark你媽喊你回家吃飯-05】RDD程式設計基礎-01

1.RDD工作流程 1.1 RDD理解 RDD是spark特有的資料模型,談到RDD就會提到什麼彈性分散式資料集,什麼有向無環圖,本文暫時不去展開這些高深概念,在閱讀本文時候,大家可以就把RDD當作一個數組,這樣的理解對我們學習RDD的API是非常有幫助的。本文所有示例程式

我的Unity 3D——第一人稱射擊遊戲(2)

三、主角 因為是第一人稱射擊遊戲,所以主角在視野中是不可見的,但我們依然需要為主角建立碰撞體並控制其移動。 1. 在選單欄選擇【GameObject】→【Create Empty】建立一個空的遊戲體,在Inspector視窗將它的Tag設為Player,這就是我們的主角。

安卓第一站--第一次Android Studio2.3搭建過程總結

關於Android Studio的安裝包可以從官方網站下載對應的版本,但是官方網站的安裝包是隨時更新的有可能會出現一些問題,所以可以去國內一些較好的網站下載映象檔案,比較穩定,這裡我給大家推薦一個網站http://www.androiddevtools.cn/index.ht