Android:组织不同的构建目标/读取资源文件运行时

时间:2013-04-12 12:41:14

标签: android eclipse deployment

我正在开发一款应用程序,我希望为不同的客户提供皮肤。 (标题徽标图像,背景图像,文本字符串等)

我在考虑在配置文件中运行时读取以某种方式切换它的设计时或编译时。如果运行时,应用程序将在启动时读取配置文件以配置自身。 (打开/关闭,图形,文本等。)

如果运行时:有没有办法发送带有不同.zip文件(包含图像等资源)的.apk文件,然后在内存中解压缩.zip文件并替换例如drawable + texts + SharedPreferences?

如果是设计时间:有没有办法在Eclipse / ADT中的不同资源集之间轻松切换编译时或运行时?喜欢有不同的文件夹,不同的图像,字符串等?我还是ADT / Eclipse的新手,所以我不确定是否有一种既定的方式来做我想做的事情呢?

3 个答案:

答案 0 :(得分:7)

查看“Build Variants”和“Product flavors”here

可以使用适用于Android的新Gradle构建完成。您可以从命令行使用Gradle版本,也可以从新的Android Studio(在Google IO 2013中展示)中使用Gradle版本,请参阅here

在Google IO主题演讲中,产品风格已作为预告片呈现,会话为this one,可以找到视频here。跳转到14:10以讨论构建变体。详细介绍是The New Android SDK Build System

简而言之,您可以拥有不同风格的不同源集(目录),例如:如上所述,一个公共目录和每个风格的目录。

答案 1 :(得分:3)

不,你不能这样做。您最好的选择是Android库项目,以及每个“客户端/应用程序”的另一个项目。有关Android库项目的更多信息,请参阅官方Android文档:https://stackoverflow.com/a/1986071/198996

答案 2 :(得分:2)

就像ChrLipp所说,在最前沿的Android Studio上,有一个名为“flavours”的便捷解决方案。

它基于镜像目录层次结构。一个“主”目录层次结构,包含“main”构建的所有文件和“flavors”目录层次结构,每个flavor目录包含将在构建时覆盖或补充那些“主要”文件的文件。

对于我的使用(我无法迁移到Android Studio),我写了一个简单的蚂蚁脚本来模仿“flavours”功能。它适用于Netbeans和Eclipse,我认为它是某种与项目无关的。

要使用它,完整的项目文件夹必须退回一级层次结构,原始的文件夹需要放在“主”目录上。必须创建一个构建目录,并将多个“flavors”文件夹放在“flavors”中,如下所示:

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

运行脚本($ ant change-flavor),它会询问你想要构建的女巫味道目录。用户输入后,它会检查flavor目录是否存在,并将所有主目录复制到build文件夹中,加上最终的“flavors”文件,覆盖“main”文件。

生成的构建文件夹是一个全新的原生Android / Cordova /无论什么项目,可以通过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集成的插入。