我想使用一个Apache ant
文件构建两个版本的Android
应用程序。问题是,除了精简版的广告,两个版本都是一样的。我读到关于使用Configurations
与ant到build
调试版本。
下面的类定义了一些可以在应用程序中引用的常量。
public class Config {
// Whether or not to include logging in the app.
public final static boolean LOGGING = true;
}
下面是一个关于如何使用这些常量来确定是否启用日志记录的示例。
if (Config.LOGGING) {
Log.d(TAG, "[onCreate] Success");
}
现在我可以在我的属性文件中启用和禁用登录。
# Turn on or off logging.
config.logging=true
这不起作用,因为在使用此配置之前,我必须创建第二个配置文件并使用filterset
和复制。
public class Config {
// Whether or not to include logging in the app.
public final static boolean LOGGING = @CONFIG.LOGGING@;
}
这很简单,但是我如何使用它来构建有和没有广告的两个版本的应用程序呢?我如何使用ant更改包名,以便android market
可以接受两个包(Full和Lite)。
谢谢你的建议,但我仍有一些问题。
我设法写了一些基本的目标来清理我的构建,并将构建应用程序所需的所有文件复制到/full和/life两个文件夹中。所以我有两个内容相同的目录。现在我重命名所有*.java文件和AndroidManifest文件(目标准备)中所有匹配的应用程序包名称。
要真正构建两个不同的版本,我现在必须包含我第一篇文章中的代码。但是,我该如何做到这一点,以及如何在发布目标中构建两个版本,并将生成的*.apk文件写入构建目录?
最后……这就是我所要做的构建running *。会被android市场接受的apk ?
<?xml version="1.0" encoding="UTF-8"?>
<project name="my.application" default="help" basedir=".">
<!-- Load the custom property files -->
<property file="build.properties" />
<property file="passwords.properties" />
<!-- Set global properties for this build -->
<property name="my.application.pkg" value="my.application"/>
<property name="my.application.pkg.full" value="my.application.full"/>
<property name="my.application.pkg.lite" value="my.application.lite"/>
<property name="my.application" location="."/>
<property name="my.application.build" location="build"/>
<property name="my.application.src" location="src"/>
<property name="my.application.res" location="res"/>
<property name="my.application.gen" location="gen"/>
<property name="my.application.full" location="full"/>
<property name="my.application.full.src" location="full/src"/>
<property name="my.application.full.res" location="full/res"/>
<property name="my.application.full.gen" location="full/gen"/>
<property name="my.application.full.build" location="full/build"/>
<property name="my.application.lite" location="lite"/>
<property name="my.application.lite.build" location="lite/build"/>
<property name="my.application.lite.src" location="lite/src"/>
<property name="my.application.lite.res" location="lite/res"/>
<property name="my.application.lite.gen" location="lite/gen"/>
<!-- Create and update the local.properties file -->
<loadproperties srcFile="local.properties" />
<!-- Load the ant.properties file -->
<property file="ant.properties" />
<!-- Load the project.properties file -->
<loadproperties srcFile="project.properties" />
<!-- Quick check on sdk.dir. -->
<fail
message="sdk.dir is missing."
unless="sdk.dir" />
<!-- Version-tag: 1 -->
<import file="${sdk.dir}/tools/ant/build.xml" />
<target name="release" depends="report, prepare">
<echo>Building the target!</echo>
</target>
<target name="prepare" depends="cleanup" >
<!-- Copy the Manifest.xml to the full copy -->
<copyfile src="${my.application}/AndroidManifest.xml"
dest="${my.application.full}/AndroidManifest.xml" />
<!-- Copy the source files to the full copy -->
<copy todir="${my.application.full.src}" overwrite="true">
<fileset dir="${my.application.src}" />
</copy>
<!-- Copy the resources to the full copy -->
<copy todir="${my.application.full.res}" overwrite="true">
<fileset dir="${my.application.res}" />
</copy>
<!-- Copy the generated to the full copy -->
<copy todir="${my.application.full.gen}" overwrite="true">
<fileset dir="${my.application.gen}" />
</copy>
<!-- Replace the package name in the full manifest file -->
<replaceregexp file="${my.application.full}/AndroidManifest.xml"
match='package="(.*)"'
replace='package="${my.application.pkg.full}"'
byline="false" />
<!-- Change the package name in all Java files -->
<replaceregexp flags="g" byline="false">
<regexp pattern="${my.application.pkg}" />
<substitution expression="${my.application.pkg.full}" />
<fileset dir="${my.application.full.src}" includes="**/*.java" />
</replaceregexp>
<!-- Copy the Manifest.xml to the lite copy -->
<copyfile src="${my.application}/AndroidManifest.xml"
dest="${my.application.lite}/AndroidManifest.xml" />
<!-- Copy the source files to the lite copy -->
<copy todir="${my.application.lite.src}" overwrite="true">
<fileset dir="${my.application.src}" />
</copy>
<!-- Copy the resources to the lite copy -->
<copy todir="${my.application.lite.res}" overwrite="true">
<fileset dir="${my.application.res}" />
</copy>
<!-- Copy the generated to the lite copy -->
<copy todir="${my.application.lite.gen}" overwrite="true">
<fileset dir="${my.application.gen}" />
</copy>
<!-- Replace the package name in the lite manifest file -->
<replaceregexp file="${my.application.lite}/AndroidManifest.xml"
match='package="(.*)"'
replace='package="${my.application.pkg.lite}"'
byline="false" />
<!-- Change the package name in all Java files -->
<replaceregexp flags="g" byline="false">
<regexp pattern="${my.application.pkg}" />
<substitution expression="${my.application.pkg.lite}" />
<fileset dir="${my.application.lite.src}" includes="**/*.java" />
</replaceregexp>
</target>
<!-- Deletes all directories, not needed anymore after compiling the source files -->
<target name="cleanup">
<!-- Delete the full version build dir -->
<delete dir="${my.application.full}"/>
<!-- Delete the lite version build dir -->
<delete dir="${my.application.lite}"/>
<!-- Delete the *.apk file -->
<delete file="my.application.full.apk"/>
<!-- Delete the *.apk file -->
<delete file="my.application.lite.apk"/>
</target>
</project>
有很多方法可以达到你的要求。
这是我过去用过的一些想法,
1)有两个应用程序的"头",在一个共同的Android库。每个头初始化静态数据,将库设置为应用程序的精简版或完整版。这样做的好处是,您可以从Eclipse项目中执行构建,也可以使用Ant执行构建。
2)有两个独立的构建目标,它们共享共同的构建目标来创建两个独立的apk文件。在Ant构建脚本中,让它构建两个版本的APK。一个是完整版本,另一个是构建精简版本。这两个目标之间的区别在于它们使用略微不同的文件进行构建(通过复制、指向不同的目录或使用脚本进行修改)。这些都可以在Ant中使用目标和属性来完成。
如果在构建的顶层,您有一个依赖于其他两个目标的发布目标。
。
<target name="release"
depends="release-Full, release-Lite">
</target>
<target name="release-Full">
<ant antfile="thisbuild.xml" inheritAll="true" target="full">
<property name="MyCustomProperty" value="Full" />
</ant>
</target>
<target name="release-Lite">
<ant antfile="thisbuild.xml" inheritAll="true" target="lite">
<property name="MyCustomProperty" value="Lite" />
</ant>
</target>
然后,您可以使用这些目标和属性来修改您的构建,以执行构建每个APK文件所需的任何操作。