在Eclipse中构建多个(测试/生产)版本的Android APK

在Eclipse中构建多个(测试/生产)版本的Android APK,android,eclipse,build,settings,Android,Eclipse,Build,Settings,我希望优化同一个Android应用程序中稍微不同的APK的生成,唯一的区别是它使用的http API服务器(dev/staging/prod) 理想情况下,我只希望我的Eclipse构建2个APK,一个使用prod服务器,另一个使用dev服务器 我甚至可以使用2个运行配置,但我还没有弄清楚如何将参数传递给应用程序并从代码中读取它们 顺便说一句,我想以1.5为目标,并且我想使用Eclipse自动构建工具,所以我正在寻找最通用的解决方案 谢谢。要传递参数,您可以在android的目录系统中创建一个文

我希望优化同一个Android应用程序中稍微不同的APK的生成,唯一的区别是它使用的http API服务器(dev/staging/prod)

理想情况下,我只希望我的Eclipse构建2个APK,一个使用prod服务器,另一个使用dev服务器

我甚至可以使用2个运行配置,但我还没有弄清楚如何将参数传递给应用程序并从代码中读取它们

顺便说一句,我想以1.5为目标,并且我想使用Eclipse自动构建工具,所以我正在寻找最通用的解决方案


谢谢。

要传递参数,您可以在android的目录系统中创建一个文件,并让代码从中读取

这不是你真正想要的:

private static Boolean isSignedWithDebugKey = null;
    protected boolean signedWithDebug() {
        if(isSignedWithDebugKey == null) {
            PackageManager pm = getPackageManager();
            try {
                PackageInfo pi = pm.getPackageInfo(getPackageName(), 0);
                isSignedWithDebugKey = (pi.applicationInfo.flags & ApplicationInfo.FLAG_DEBUGGABLE) != 0;
            }
            catch(NameNotFoundException nnfe) {
                nnfe.printStackTrace();
                isSignedWithDebugKey = false;
            }
        }

        return isSignedWithDebugKey;
    }

然后,如果应用程序使用调试密钥进行了签名,并且生产系统使用了发布证书,则可以点击开发/登台服务器。

将所有代码移动到库项目中,请参见

然后在eclipse中为测试和生产创建单独的项目,每个项目都有一个唯一的包名。然后可以使用包名称来区分版本

比如:

public static boolean isProductionVersion(){
  return context.getPackageName().toLowerCase().contains("production");
}
对于管理不同的http端点来说,这似乎有些过分,但它会使代码更易于管理。您还可以做一些有用的事情,如:

  • 使用不同的应用程序图标标记测试版本
  • 在一台设备上并排运行测试和生产版本

这一切都可以在eclipse中完成,而无需使用和第三方工具。

我认为使用ant构建脚本将是最简单的解决方案。Eclipse支持ant构建,所以您可以在Eclipse中运行ant命令

你可以像这样用ant解决你的问题

  • 准备两个xml android资源文件
  • 使用资源#1构建包
  • 用资源2的内容覆盖资源1
  • 构建另一个包
  • xml应该是这样的:

    <project>
      <target name="build_all">
         <copy file="res1.xml" to="res/values/target.xml"/>
         <ant antfile="build.xml" target="debug"/>
         <copy file="res2.xml" to="res/values/target.xml"/>
         <ant antfile="build.xml" target="debug"/>
      </target>
    </project>
    
    资源#1:

    <resources>
        <string name="target">dev</string>
    </resources>
    
    <resources>
        <string name="target">staging</string>
    </resources>
    
    
    发展
    
    资源#2:

    <resources>
        <string name="target">dev</string>
    </resources>
    
    <resources>
        <string name="target">staging</string>
    </resources>
    
    
    登台
    
    ant脚本是这样的:

    <project>
      <target name="build_all">
         <copy file="res1.xml" to="res/values/target.xml"/>
         <ant antfile="build.xml" target="debug"/>
         <copy file="res2.xml" to="res/values/target.xml"/>
         <ant antfile="build.xml" target="debug"/>
      </target>
    </project>
    

    在我的例子中,我只想在不同版本之间更改
    strings.xml
    中的一些值

    首先,我必须加载
    ant contrib
    库,为
    循环任务定义

    <taskdef resource="net/sf/antcontrib/antcontrib.properties">
        <classpath>
            <pathelement location="lib/ant-contrib-1.0b5-SNAPSHOT.jar" />
        </classpath>
    </taskdef>
    
    并定义一个
    buildall
    目标,该目标在
    config.names
    上循环:

    <target name="build-all">
        <for param="config.name" trim="true" list="${config.names}">
            <sequential>
    
    删除它,并将全局资源从
    res
    复制到其中:

    <delete dir="${config.resources}" />
    
    <copy todir="${config.resources}">
        <fileset dir="res"/>
    </copy>
    
    运行XSLT转换以修改
    strings.xml
    文件:

    config.url.root=http://projectserver.aptivate.org/
    config.names=student-production, teacher-production, student-testing, teacher-testing
    
    <xslt in="res/values/strings.xml"
        out="${config.resources}/values/strings.xml"
        style="ant/create_xml_configs.xslt"
        force="true">
        <param name="config.url.root" expression="${config.url.root}" />
        <param name="config.name" expression="@{config.name}" />
        <param name="config.path" expression="${config.path}" />
    </xslt>
    
    并使用
    antcall
    任务调用
    debug
    build:

    <antcall target="debug">
        <param name="resource.absolute.dir" value="${config.resources}" />
        <param name="out.final.file" value="${out.absolute.dir}/${ant.project.name}-${resources.strings.app_version}-@{config.name}.apk" />
    </antcall>
    

    可能重复[Android–同一应用程序的多个自定义版本]()据我所知,没有一个解决方案能够与Eclipse很好地集成。我真的很困惑,为什么这么简单的任务看起来这么复杂。不是要启动flamewar,但我已经查看了我们的iPhone开发者的iPhone开发环境,从外部向应用程序传递参数是非常简单的。这让我很难过。我知道如何使用maven android插件来实现这一点,其实很简单。但是,它需要将您的应用程序与maven绑定,此外,maven Android插件/m2e Android中的最新Android SDK(r14和r15)似乎存在一些不兼容之处,这可能不是您想要的。您是否考虑过在初始编码阶段使用Eclipse,然后在初始发布和测试阶段切换到Ant构建?设置批处理/脚本文件以向Ant传递参数非常容易,Ant将指定源目录和输出目录,然后您只需稍微修改build.xml的目标以考虑这些目录。如果您控制服务器,你的另一个选择是让你的应用程序先点击一个众所周知的URL,然后下载一个包含要应用的设置的策略,“targetUrl”就是其中之一。您也可以通过这种方式对客户端进行版本控制。但是如何将文件名参数传递给代码?如果我可以传递一个文件名,我也可以传递一个服务器url——问题是如何传递。这仍然会生成1个文件——我希望Eclipse生成2个(或N个)文件,并创建多个配置,以便轻松地构建登台、开发等。这对我来说就像是版本控制的噩梦,每个文件的顶部都有不同的包名。我错了吗?版本控制没有问题。包名在清单中设置一次,所有代码都保留在库项目中。我的包名也是,但它不需要更改,只是为了改进解决方案-我不需要使用包名,而是创建一个库项目,其中包含所有代码,并有一个带有URL的字符串资源。这样,您可以为不同的环境创建多个项目,在单个库项目中维护代码(所有其他项目都会引用该库项目),并且只更改字符串资源值,以便根据需要为每个环境构建项目为每个目标应用创建项目是一个非常不完善的解决方案,因为这意味着必须在所有目标上手动复制对清单等的更改。你真的需要一些脚本来同步所有目标的清单,只需要更改包名之类的东西。您能否进一步说明如何在Eclipse中设置此功能?请参见:-1。创建新的ant构建文件/2。在eclipse/3中打开ant视图。将ant构建添加到视图(拖放)/4。运行它。小心:android需要Ant1.8或更高版本。eclipse内置了ant,但它的版本是1.7。您应该手动安装ant,然后在eclipse属性中将您的ant二进制文件设置为默认ant二进制文件。请允许我问一下-您过去是否成功地设置了此方法并使其正常工作?是的。我正在建设两个图书馆项目
    <antcall target="debug">
        <param name="resource.absolute.dir" value="${config.resources}" />
        <param name="out.final.file" value="${out.absolute.dir}/${ant.project.name}-${resources.strings.app_version}-@{config.name}.apk" />
    </antcall>
    
    <echo message="Output packages:" />
    <for param="config.name" trim="true" list="${config.names}">
        <sequential>
            <echo message="${out.absolute.dir}/${ant.project.name}-${resources.strings.app_version}-@{config.name}.apk" />
        </sequential>
    </for>