2013-04-12 39 views
2

我正在開發一個應用程序,我希望爲不同的客戶端提供皮膚。 (標題標誌圖像,背景圖像,文本字符串等)Android:組織不同的構建目標/讀取資源文件運行時

我想運行時讀取配置文件以某種方式切換它的設計時或編譯時。如果運行時,應用程序會在啓動時讀取配置文件來配置自身。 (開關事物,圖形,文本等)

如果運行時:是否有任何方式來發布.apk文件與不同的.zip文件(包含像圖像資源),然後解壓縮內存中的.zip文件和代替可繪製+文本+ SharedPreferences?

如果設計時:在Eclipse/ADT中有沒有一種方法可以在編譯時或運行時輕鬆切換不同的資源集?就像有不同的文件夾與不同的圖像,字符串等?我還是ADT/Eclipse的新手,所以我不確定是否有一種行之有效的方式來做我想做的事情?

+2

使用外部構建工具螞蟻/ Maven的/搖籃可以幫助你在項目生成時間管理這個,看看[本Q&A](http://stackoverflow.com/questions/10143352/eclipse-multiple-project-from-single來源)對這個主題的一些想法。 – yorkw

回答

3

不,你不能這樣做。您最好的選擇是安卓圖書館項目,以及針對每個「客戶端/應用」的另一個項目。請參閱官方Android文檔以獲取有關Android庫項目的更多信息:https://stackoverflow.com/a/1986071/198996

+0

雖然這曾經是正確的,我會建議由@ChrLipp提供的解決方案。 – GrkEngineer

7

查看「Build Variants」和「Product Flavor」 here

它可以用新的搖籃構建Android來完成。你可以使用搖籃從全新的Android工作室(在谷歌IO 2013呈現)命令行或進行建造,看到here

在Google IO主題演講已將產品口味作爲預告片呈現,會話爲this one,視頻可爲fou nd here。跳轉到14:10討論構建變體。詳細的介紹是The New Android SDK Build System

總之,對於不同的風味,你可以有不同的源集(目錄)。就像你上面提到的一個共同的目錄和一個風味。

2

ChrLipp說,在Android Studio的出血性邊緣,有一個方便的解決方案稱爲「flavours」。

它基於鏡像目錄層次結構。包含「main」版本和「flavors」目錄層次結構的所有文件的「main」目錄層次結構,每個flavor目錄包含的文件將在構建時覆蓋或補充這些「主要」目錄。

對於我的使用(我無法遷移到Android Studio),我寫了一個簡單的ant腳本來模仿「flavours」功能。它適用於Netbeans和Eclipse,我認爲這是某種獨立於項目的方式。

要使用它,完整的項目文件夾必須退後一層的層次結構,原始的文件夾需要放在「主」目錄。一個build目錄必須創建,以及多個「口味」的文件夾放在「口味」裏面,因爲這樣:

├── build.xml       < - ant script file above 
├── main        < - original project 
├── flavors 
│  └── freeVersion     < - files related with a freeVersion 'skin' 
└── build        < - temporary build folder 

運行腳本($螞蟻變化的味道),它會問巫婆味道目錄要建立。用戶輸入後,它會檢查flavor目錄是否存在,並將所有主目錄複製到build文件夾中,加上最終的「flavors」文件,覆蓋「main」文件。

得到的build文件夾是一個完整的新的原生Android /科爾多瓦/什麼項目,可以正常打開,編譯通過IDE。

<?xml version="1.0" encoding="UTF-8"?> 

<project name="Flavors" basedir="." > 

<property name="flavors.dir" value="flavors"/> 
<property name="flavors.build.dir" value="build"/> 
<property name="flavors.main.dir" value="main"/> 

<target name="change-flavor"> 
    <input message="Which Flavor to build?" addproperty="flavor.dir" /> 

    <fail message="Empty flavor not allowed"> 
     <condition> 
       <equals arg1="${flavor.dir}" arg2=""/> 
     </condition> 
    </fail>  

    <fail message="Directory ${flavors.dir}/${flavor.dir} not exists"> 
     <condition> 
      <not> 
       <available file="${flavors.dir}/${flavor.dir}" type="dir" /> 
      </not> 
     </condition> 
    </fail> 

    <echo message="Deleting build dir ${flavors.build.dir}"/> 
    <delete includeemptydirs="true"> 
     <fileset dir="${flavors.build.dir}" includes="**/*"/> 
    </delete> 

    <echo message="Copying from main ${flavors.build.dir}"/> 
    <copy todir="${flavors.build.dir}" includeemptydirs="true" > 
      <fileset dir="${flavors.main.dir}" includes="**"/> 
    </copy>   

    <echo message="Copying from flavor ${flavors.build.dir}"/> 
    <copy todir="${flavors.build.dir}" includeemptydirs="true" overwrite="true" > 
      <!-- exclude folder is here because my flavors directories are also netbeans 
       projects. If similar approach is used on eclipse, maybe put here .project 
       and .settings folders --> 
      <fileset dir="${flavors.dir}/${flavor.dir}" includes="**" excludes="nbproject/**"/> 
    </copy>   

    </target>  
</project> 

有一個懲罰時間針對每種口味的身材,因爲沒有預編譯的東西,也沒有很好地整合在主項目構建系統,但對我來說,我認爲它的價值,因爲唯一的東西,從風格到另一個變化是屬性文件和資產。大部分開發過程可以在「主」項目上完成,風味只是皮膚。除此之外,它避免了cordova自身構建系統/ netbeans集成的問題。

+0

但是,這並不爲每個單獨的香味包名還是我失去了一些東西? 在需要單獨的包名稱,以便我們的銷售傢伙可以在同一設備上同時安裝演示,和一個真正的版本。 所以我們可以託管在App Store多個版本。 – Knarf