廈門之旅第一篇Gradle多渠道打包(動態設定App名稱,應用圖示,背景圖片,狀態列顏色)
我不是詩人,寫不出廈門的美;我不是歌手,唱不出廈門的情;我不是畫家,畫不出廈門的景。
我只是一名程式設計師,我只能用我的眼,我的心去看去感受,那久違的海風吹拂著臉頰,好似內心那一份煩躁與沉重也隨著海風飄向了遠方 . . . . . .
一、Gradle多渠道打包之緣由
時間要追溯到兩年前,當時我還在使用 eclipse
開發工具。兄弟事業部有款產品需要封包(使用webview打包成app),並提出了相關的需求:
針對不同商家地址(webview載入url),App名稱,應用圖示,歡迎頁背景,狀態列顏色(背景同色)都不同,以及版本號不同。
針對不同的商家都必須打包成獨立的App,不會出現覆蓋安裝。
針對以上的需求每次打包都需要替換App名稱,應用圖示,背景等資源,還必須修改包名(帶來的一系列報錯)。後期又提出了升級功能,又得把資源、包名修改回去,一番折騰真的欲仙欲死。後來我乾脆每次都新建專案打包,業務邏輯沒有變化只是資源發生了改變,程式碼是拷貝了一份又一份,而且商家一多,維護起來真的是找得死去活來的,加之客戶提出新功能,我每個商家都需要擼一遍 . . . 神啊,誰來拯救我啊
二、自我拯救之路
在後來接觸到AndroidStudio
(簡稱AS),逐漸的轉到了AS
開發,確實比 eclipse
高效快速方便。 gradle
構建功能真心非常強大,預設有 debug ,release 版本,我們可以針對不同版本做不同配置,這不正好解決我所遇到的問題。gradle
productFlavors
節點針對不同的版本做不同的配置。
比如有【四季易購】【仁仁家】【庫樂購】商家需要打包。
我在每個分支下面都重新配置applicationId
這個屬性,從而使打包出來的apk的包名不一樣,避免了覆蓋安裝。
當然針對不同的商家 App名稱,圖示不一樣。這個時候我們就需要配置manifestPlaceholders
屬性,manifestPlaceholders
是一個類似HashMap
的容器,因此在manifestPlaceholders
可以配置多個屬性。如下我們可以這樣配置:
gradle配置:
AndroidManifest配置:
注意:節點 meta-data 的配置。
${icon}
,${app_name}
引用 manifestPlaceholders
容器中 icon
, app_name
的值。
客戶的需求不僅僅更改App名稱與圖示,還需要修改webview
載入地址,歡迎頁背景圖片等等,具體配置如下圖:
注意:新增的配置同樣需要在清單檔案中新增 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
配置檔案的資料:
通過程式碼:context.getResources().getString(R.string.key);
獲取值。
注意通過此方式 strings.xml
檔案下不能有同名的 key
屬性。不然會報相同資源引用錯誤。
三、生成APK
如果你想生成所有渠道的包:
Terminal命令輸入如下指令:
gradlew assembleRelease
構建成功請在以下目錄檢視:
如果你想針對某個渠道打包:
方式一:
配置不同渠道基礎資訊。
方式二:
更改 applicationId
,新增 manifestPlaceholders
集合。
多渠道打包,並不需要更改百度、高德等第三方的key
。
多渠道打包,解決了以往深深的憂傷。
相關推薦
廈門之旅第一篇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的基礎 之 "淺入淺出
STL之vector--第一篇部落格
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