Android – 如何在构build时为开源项目dynamic设置包名?

我正在开发一个开源项目。 因为任何人都可以下载源代码并自己构build它,所以我不想在任何地方对包名称进行硬编码,包括目录结构。

我使用antbuild设。 显然,我可以修改build.xml ,但我相信这是由android update覆盖。 无论使用什么,都将致力于Git回购,并且不应该太复杂。

目前,从Git仓库直接构build代码的过程相当简单。 以下是README文件的摘录:

 $ cd ~/src/isokeys/IsoKeys $ android list targets # I build against API level 10. $ android update project --name IsoKeys --target 1 --path ./ # Only needed first time. $ ant debug && adb -d install -r bin/IsoKeys-debug.apk 

对我来说,把包名称放在local.propertieslocal.properties ,因为这是.gitignore 。 由于软件包名称不在其他地方,因此构build将会失败,而不会执行此操作。 所以在README中至less需要一个额外的步骤,但是我想把它保持在最低限度。

编辑:当然,另一个要求是差异是有道理的 – 如果你手动重命名包名,他们不会。

Solutions Collecting From Web of "Android – 如何在构build时为开源项目dynamic设置包名?"

我做了类似的事情(但不是因为这个原因),它需要在构build时更新清单。 我完成这个的方法是制作第二个AndroidManifest并将其放在名为config的目录下。 所以在config / AndroidManifest你可以有这样的东西:

 <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="@CONFIG.APP_PACKAGE_NAME@" android:versionCode="@CONFIG.APP_VERSION_CODE@" android:versionName="@CONFIG.APP_VERSION@"> <!-- EVERYTHING ELSE GOES HERE --> </manifest> 

然后你可以使用常规的裸骨骼build.xml ant脚本,只需要一些修改(不需要从android构build系统复制整个脚本,因为它们添加了一些钩子供您使用,而不需要重新发明轮子)。 构build脚本默认应该读取local.properties,但是如果不添加(或取消注释)如下的行:

 <property file="local.properties" /> 

在您的构build脚本中,您应该看到名为“-pre-build”的任务,将其更改为如下所示:

 <target name="-pre-build"> <copy file="config/AndroidManifest.xml" todir="." overwrite="true" encoding="utf-8"> <filterset> <filter token="CONFIG.APP_PACKAGE_NAME" value="${app.packagename}" /> <filter token="CONFIG.APP_VERSION" value="${app.version}" /> <filter token="CONFIG.APP_VERSION_CODE" value="${app.versioncode}" /> </filterset> </copy> </target> 

然后你的local.properties文件,你会把包名称,版本名称/代码如下所示:

 app.version=1.0 app.versioncode=1 app.packagename=com.mypackage.name 

现在你只需要在你的清单中确保你完全符合你的所有活动/服务/广播监听器等等。这意味着你总是指定你的源代码的完整包。 如果你想为你自己的源代码包是dynamic的,你可以将每个类的前缀都replace掉。但是这看起来有些愚蠢..很容易把你的代码打包到你自己的包名下,可以在任何项目中使用它,只需在项目中包含源代码或jar。

– 更新 – 哦,还有一件事你可以做,以通知用户,他们必须定义一个包名是使用失败标签在你的构buildXML这样的:

 <fail message="app.packagename is missing. This must be defined in your local.properties file" unless="app.packagename" /> 

把它放在读取local.properties文件的那一行之后

感谢Matt Wolfe的帮助,迄今为止,我正在给出一个部分答案。

我注意到默认的准系统build.xml也会导入custom_rules.xml

 <import file="custom_rules.xml" optional="true" /> 

所以我创build了这个文件,并开始修补。 这是我到目前为止所提出的:

 <?xml version="1.0" encoding="UTF-8"?> <project name="custom_rules" default="debug"> <target name="-pre-build"> <fail message="Please define app.packagename in your local.properties file." unless="app.packagename" /> <taskdef resource="net/sf/antcontrib/antcontrib.properties"> <classpath> <pathelement location="/usr/share/java/ant-contrib.jar"/> </classpath> </taskdef> <!-- How do I check for propertyregex? <fail message="Depends on ant-contrib's propertyregex for app.packagename.path." unless="propertyregex" /> --> <propertyregex property="app.packagename.path" input="${app.packagename}/" regexp="\." replace="/" global="true" /> <copy todir="build/" overwrite="true" encoding="utf-8"> <fileset dir="./"> <include name="AndroidManifest.xml" /> <include name="res/**" /> <include name="lib/**" /> </fileset> <filterset> <filter token="CONFIG.APP_PACKAGE_NAME" value="${app.packagename}" /> </filterset> </copy> <copy todir="build/src/${app.packagename.path}" overwrite="true" encoding="utf-8"> <fileset dir="./src/isokeys/"> <include name="**" /> </fileset> <filterset> <filter token="CONFIG.APP_PACKAGE_NAME" value="${app.packagename}" /> </filterset> </copy> </target> <target name="-pre-clean" description="Removes output files created by -pre-build."> <delete file="build/AndroidManifest.xml" verbose="${verbose}" /> <delete dir="build/res/" verbose="${verbose}" /> <delete dir="build/lib/" verbose="${verbose}" /> <delete dir="build/src/" verbose="${verbose}" /> </target> <!-- NOW CHANGE DIRECTORY TO build/ BEFORE HANDING BACK OVER TO build.xml!!! --> </project> 

这将所有的东西放在build/ (这有助于保持内容整洁) ,现在我们的目的是让sdk工具build.xml从这个build/目录运行。 但是,我找不到任何方法。

最简单的方法可能是尽快更换包名称。 这样,你甚至不必碰触你的代码。 有一篇很好的文章,名为Android Manifest包的重命名 ( http://www.piwai.info/renaming-android-manifest-package/ )。 概要:

  • 您可以使用aapt --rename-manifest-package来修改软件包名称

  • 或者,如果要将包名replace为ant构build过程的一部分,则可以覆盖-package-resources目标:

    • 从SDK的build.xml复制-package-resources目标
    • 添加manifestpackage参数