編輯:關於Android編程
實際開發中經常遇到這樣的需求:一個應用打不同的包時,不同的包 的logo、 應用名,或者應用中的某些標志性的圖片、顯示的文字內容、歡迎語什麼的都要做出相應的改變。 對此,我們不可能將原工程復制出來再重新建立一個工程,然後替換成不同的資源再打包。 那麼本文為讀者提供一種相對簡便的方法,有這種需求的友友就可以接著看下去了...
編譯時合並與替換資源,主要用到aapt命令工具:
先看一下aapt命令 跟不同參數時的作用:
命令行界面切換到 aapt 命令所在目錄,輸入aapt 如下:
可以看出, -s 可以指定尋找資源的目錄,而 overlay 可以合並資源:
比如 ,工程中原有的res 裡面有個字符串 :app_name(Menifest.xml中配置的應用名)
九秀美女直播string>,
在工程中新建兩個資源文件夾res2和res3,裡面分別有兩個字符串: app_name,more
//res2
9秀直播string>
更多2string>,
//res3
MM直播string>
更多3string>,
並在build.grandle裡配置如下
aaptOptions { additionalParameters '-S', 'G:/wkplace/AS/NineShow3.0/res2', '-S', 'G:/wkplace/AS/NineShow3.0/res3', '--auto-add-overlay' noCompress 'foo', 'bar' ignoreAssetsPattern '!.svn:!.git:!.ds_store:!*.scc:.*:
_*:!CVS:!thumbs.db:!picasa.ini:!*~' }
運行後,應用名會顯示res裡的app_name:“九秀美女直播”。這是因為: -s 可以指定多個資源目錄,我們通過-s 將 res2,res3都指定為了資源目錄,尋找資源時會先尋找系統默認的res目錄,若找不到,就會接著去尋找-s指定的目錄尋找。系統會加載最先找到的那個同名資源。 如果刪除res裡的app_name 則應用名會顯示“9秀直播”;若把 build.grandle裡的配置順序 res2與res3顛倒一下,則運行後會顯示“MM直播”。 如果應用中需要加載一個textView="@String/more",則會顯示“更多2”<-s res2 -s res3>。
如果沒有 -auto-add-overlay ,即配置改為如下:
aaptOptions { additionalParameters '-S', 'G:/wkplace/AS/NineShow3.0/res2',//9秀直播 '-S', 'G:/wkplace/AS/NineShow3.0/res3'//MM直播 // '--auto-add-overlay' // noCompress 'foo', 'bar' // ignoreAssetsPattern '!.svn:!.git:!.ds_store:!*.scc:.*:
_*:!CVS:!thumbs.db:!picasa.ini:!*~' }
則 build工程的時候會報錯,比如:
類似上面錯誤種種,大致意思就是說 找不到某些資源,關於出現這種情況的原因,很多開發者都說是因為-s指定的資源目錄中存在基礎包(res)裡沒有定義的資源id,其實這樣說並不全面,根據筆者全方位無死角的測試證明,只要基礎包與overlay指定的資源目錄中存在不同的資源 都會報類似錯誤。 解決辦法就是 加上
-auto-add-overlay
就會自動得把voerlay指定的資源目錄中出現的基礎包中不存在的資源增加進去(官方文檔字面意思)。
這樣說不貼切,實際上 有了-auto-add-overly命令後 ,可以理解為:
打包的時候,把基礎包中所有的資源(res) + overlay資源目錄中(即-s指定目錄)第一份出現的新資源id = 最終的資源包(取所有資源目錄的並集,相同資源只取第一份)
比如:
res中存在anim、drawable、values/dimens、values/string等文件 其中,string中定義了 app_name,tittle,text_show 三個變量,
res2中只有values/string ,string中定義了 text_show,text_hello 兩個變量
res3中只有values/string ,string中定義了 app_name,text_show,text_hello,message 四個個變量
則根據前面overlay配置的順序 res2 在前,res3在後,
則最終打包時候生成的資源包中 包含了res中的所有資源,並在string中增加 res2的text_hello 與 res3的message。
所以,我們多途徑打包時候 想要實現 不途徑的apk用不同的包名與資源的效果,可以 將共同的資源放在基礎包中的資源目錄(res),需要替換的資源放在不同路徑對應的資源目錄中。
最後上實例如下:
需求 打包時需要打兩個不同的渠道包:
其一,包名為com.ninexiu.sixninexiu 的apk,手機上顯示的圖標為
,應用名為:九秀美女直播;
其二,包名為 com.show.mmlive 的apk,手機上顯示的圖標為
,應用名為:MM直播 。
實現:
Menifest.xml配置文件如下:
刪除工程目錄中 res/values/string中的label的定義,與res/drawble 目錄中的logo圖片
新建兩個與res同等級的資源目錄:res2資源文件為:drawable中名字為logo的圖片
,string中九秀美女直播string>;
res3資源文件為:drawable中名字為logo的圖片
,string中MM直播string>;
打渠道一包:
build.gradle 中相關的配置如下時
productFlavors{ nineshow{ applicationId "com.ninexiu.sixninexiu" } // mmlive{ // applicationId "com.show.mmlive" // } } aaptOptions { additionalParameters '-S', 'G:/wkplace/AS/NineShow3.0/res2',//9秀直播 '-S', 'G:/wkplace/AS/NineShow3.0/res3',//MM直播 '--auto-add-overlay' noCompress 'foo', 'bar' ignoreAssetsPattern '!.svn:!.git:!.ds_store:!*.scc:.*:
_*:!CVS:!thumbs.db:!picasa.ini:!*~' }
打包出來的apk為
包名為com.ninexiu.sixninexiu 的apk,手機上顯示的圖標為
,應用名為:九秀美女直播;
打渠道二包:
build.gradle 中相關的配置如下時:
productFlavors{ // nineshow{ // applicationId "com.ninexiu.sixninexiu" // } mmlive{ applicationId "com.show.mmlive" } } aaptOptions { additionalParameters '-S', // 'G:/wkplace/AS/NineShow3.0/res2',//9秀直播 // '-S', 'G:/wkplace/AS/NineShow3.0/res3',//MM直播 '--auto-add-overlay' noCompress 'foo', 'bar' ignoreAssetsPattern '!.svn:!.git:!.ds_store:!*.scc:.*:
_*:!CVS:!thumbs.db:!picasa.ini:!*~' }
打包出來的apk為
包名為 com.show.mmlive的apk,手機上顯示的圖標為
,應用名為:MM直播 。
替換其他更多的資源,做法同上。
多渠道打包時合並與替換資源,以上只是一種做法,看到過網上似乎還有其他做法,當時沒看太明白,就先分享出這一種;但由於該方法每次打包時都需要在gradle中注釋掉不同的配置內容 一個包一個包的來打,略顯麻煩。若有更好方法的友友可以分享給我^ ^
首先我們知道,在Android中,Adapter本身是一個接口,他 派生了很多子接口,這些子接口又被很多具體的類實現,來實現具體的顯示效果。本次我們主要介紹的是Simpl
進度框import android.content.Context; import android.graphics.Canvas; import android.gra
一、背景這個選題很大,但並不是一開始就有這麼高大上的追求。最初之時,只是源於對Xposed的好奇。Xposed幾乎是定制ROM的神器軟件技術架構或者說方法了。它到底是怎麼
ListView是Android開發中比較常用的一個組件,它以列表的形式展示信息,並能根據信息的長度自適應顯示。比如說我們手機裡的通訊錄就用到了ListView顯示聯系人