我做了类似的事情(但不是出于这个原因),需要在构建时更新清单。我实现这一点的方法是制作第二个 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 构建系统复制整个脚本,因为它们添加了一些钩子供您使用,而无需重新发明轮子)。默认情况下,构建脚本应该读取 local.properties,但如果不添加(或取消注释)这样的行:
<property file="local.properties" />
在您的构建脚本中,您应该看到一个名为“-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
现在,您只需要确保在清单中完全限定所有活动/服务/广播侦听器等。这意味着您始终指定源代码的完整包。如果您希望您自己的源代码的包是动态的,您可以替换每个类的每个前缀。但这似乎有点愚蠢。将您的代码打包到您自己的包名下很容易,它们只需在项目中包含源代码或 jar,就可以从任何项目中使用它。
-- 更新 -- 哦,你可以做的另一件事来通知用户他们必须定义一个包名是在你的构建 xml 中使用失败标记,如下所示:
<fail message="app.packagename is missing. This must be defined in your local.properties file" unless="app.packagename" />
将其放在读取 local.properties 文件的行之后