同时构建许多类似的Android .apk文件?

时间:2011-11-10 09:00:47

标签: android eclipse

我有一个Android项目,我需要构建许多.apk来自。 .apk只有几个方面彼此不同:

  1. Android清单文件中有一些值彼此不同
  2. 某些.apk可能会排除/ res文件夹中的某些文件
  3. 不同的包名称
  4. 自动构建所有这些不同的.apk的最佳方法是什么?

    谢谢!

3 个答案:

答案 0 :(得分:4)

使用Android Maven plugin。它支持android library projects

  1. 创建一个多模块项目。
  2. 将所有常用类放在一个模块(库)中。
  3. 为要分发的每个应用创建一个模块,并使其依赖于lib模块。
  4. 以下是一个示例:https://github.com/jayway/maven-android-plugin-samples/tree/master/libraryprojects

    (您需要创建几个'libraryprojects-mainapp'模块)

答案 1 :(得分:0)

如果您使用git,您可以在构建之前制作不同的分支并结帐。如果您使用的是Mac或Linux,也可以编写一个shell脚本来自动执行此操作。

开发可以在集成分支上完成,该分支将合并到您的三个不同分支中。

我不知道这是否会让你更容易,但这只是一种方式。

答案 2 :(得分:0)

2011很久以前..但似乎没有Eclipse / Netbeans解决方案。我最近在Netbeans的一个cordova项目上遇到了同样的问题。

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

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

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

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

├── build.xml                           < - ant script file
├── main                                < - original project
├── flavors
│     ├── freeVersion                   < - files related with a freeVersion app
│     └── paidVersion                   < - files related with a paidVersion app
└── 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="Witch Flavor?" 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集成的插入。