代码之家  ›  专栏  ›  技术社区  ›  Tom

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

  •  2
  • Tom  · 技术社区  · 13 年前

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

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

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

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

    3 回复  |  直到 13 年前
        1
  •  7
  •   ChrLipp    13 年前

    查看“构建变体”和“产品口味” here

    这可以通过新的Gradle Android版本来完成。您可以从命令行或从新的Android Studio(在Google IO 2013上展示)中使用Gradle构建,请参阅 here

    在谷歌IO主题演讲中,产品口味被作为预告片呈现,会议是 this one ,可以找到视频 here 。跳到14:10进行构建变体的讨论。详细介绍如下 The New Android SDK Build System .

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

        2
  •  3
  •   Community Mohan Dere    9 年前

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

        3
  •  2
  •   Community Mohan Dere    9 年前

    喜欢 ChrLipp 说,在尖端的Android Studio上,有一个方便的解决方案,叫做“ flavours ".

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

    为了我的使用(我不能迁移到Android Studio),我写了一个简单的蚂蚁脚本来模仿“ 风味 “功能。它适用于Netbeans和Eclipse,我认为它是某种独立于项目的。

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

    ├── 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目录。用户输入后,它会检查风味目录是否存在,并将所有主目录复制到构建文件夹中,再加上最终的“风味”文件,覆盖“主”文件。

    生成的构建文件夹是一个全新的原生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集成。