2

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

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

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

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

4

3 回答 3

7

在此处查看“构建变体”和“产品风味”

可以使用适用于 Android 的新 Gradle 构建来完成。您可以从命令行或从新的 Android Studio 中使用 Gradle 构建(在 Google IO 2013 上展示),请参见此处

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

简而言之,您可以为不同的风格拥有不同的源集(目录),例如,一个通用目录和一个用于上面提到的每种风格的目录。

于 2013-05-16T19:53:09.760 回答
3

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

于 2013-04-28T12:00:20.227 回答
2

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

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

为了我的使用(我无法迁移到 Android Studio),我编写了一个简单的 ant 脚本来模仿“ flavors ”功能。它适用于 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),它会询问你想要构建的witch flavor 目录。用户输入后,它检查风味目录是否存在,并将所有主目录复制到构建文件夹中,加上最终的“风味”文件,覆盖“主”文件。

生成的 build 文件夹是一个全新的原生 Android/Cordova/whatever 项目,可以通过 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 集成的介绍。

于 2014-07-01T11:51:46.783 回答