Android的 - 我如何动态设置在制作的时候包名称为一个开源的项目?(Android - How

2019-06-24 09:34发布

我工作的一个开源项目。 因为它的目标,任何人都可以下载源,并建立它自己,我不想硬编码的包名的任何地方 -包括目录结构。

我用ant构建。 显然,我可以修改build.xml ,但我相信这是由覆盖android update 。 无论是用来将致力于Git的回购协议,它不应该是太复杂了。

目前,从Git的回购直构建代码的过程相当简单。 下面是来自摘录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.properties ,因为这是.gitignore “d。 作为包名称中不会有其他任何地方,构建就会失败没有这样做。 因此,有需要在至少1额外的步骤README ,但我想它保持在最低限度。

编辑:当然,还有一个要求是的diff意义 - 他们不如果您手动重命名包名。

Answer 1:

我做了类似(但不是这个原因),这需要在编译的时候更新清单的东西。 我做到了这一点的方式是通过使第二AndroidManifest,并把它命名的目录下的配置。 因此,在配置/ 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" />

在构建脚本,你应该看到一个名为“ - 预构建”的任务,改变这样的:

<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

现在你只需要确保你的清单,你完全符合所有的活动/服务/广播监听器等..这意味着你总是指定完整的包的源代码。 如果你想包你自己的源代码是动态的,你可以替换出每个前缀每个类的..但是,这似乎有点傻了..这是很容易在你自己的包名和它们套餐代码可以通过简单地包括源或在他们的项目罐子使用它从任何项目。

- 更新 - 哦,你可以做,通知他们必须定义一个包名用户一件事是使用故障标记在构建这样的XML:

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

它读取local.properties文件中的行之后将这个



Answer 2:

与感谢马特·沃尔夫对他的帮助,我张贴与到目前为止,我努力了部分答案。

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

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

所以我创造了这个文件,并开始摆弄。 这是我想出迄今:

<?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/目录。 但是,我找不到任何办法cd “ING。



Answer 3:

最简单的方法可能会被尽可能晚地更换包名。 通过这种方式,你甚至不必碰你的代码。 有一个名为一个很好的文章重命名Android清单包 ( http://www.piwai.info/renaming-android-manifest-package/ )。 摘要:

  • 您可以使用aapt --rename-manifest-package修改包名

  • 另外,如果你想包的名称更换为Ant构建过程的一部分,您可以覆盖-package-resources的目标:

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


文章来源: Android - How do I dynamically set the package name at build time for an Open-source project?