Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> android用aapt命令實現打包時替換資源

android用aapt命令實現打包時替換資源

編輯:關於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中注釋掉不同的配置內容 一個包一個包的來打,略顯麻煩。若有更好方法的友友可以分享給我^ ^

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved