用于重命名清单包的自定义Android build.xml

我想创build一个应用程序到2版本,一个支付,一个免费的,我知道aapt有一个选项“–rename-manifest-package”应该帮助,但我不知道如何在build.xml中使用它。 我find了2个我可以修改的地方:

<!-- first --> <target name="-resource-src" depends="-dirs"> <echo>Generating R.java / Manifest.java from the resources...</echo> <exec executable="${aapt}" failonerror="true"> <arg value="package" /> <arg line="${v.option}" /> <arg value="-m" /> <arg value="-J" /> <arg path="${gen.absolute.dir}" /> <arg value="-M" /> <arg path="AndroidManifest.xml" /> <arg value="-S" /> <arg path="${resource.absolute.dir}" /> <arg value="-I" /> <arg path="${android.jar}" /> </exec> </target> <!-- sencod --> <target name="-package-resources"> <echo>Packaging resources</echo> <aaptexec executable="${aapt}" command="package" manifest="AndroidManifest.xml" resources="${resource.absolute.dir}" assets="${asset.absolute.dir}" androidjar="${android.jar}" outfolder="${out.absolute.dir}" basename="${ant.project.name}" > </aaptexec> </target> 

这篇文章( http://blog.uncommons.org/2010/07/19/building-two-versions-of-the-same-android-app/ )说我应该添加“–rename-manifest-package”在第二位,但如何?

Solutions Collecting From Web of "用于重命名清单包的自定义Android build.xml"

选项–rename-manifest-package不能与aaptexec ant任务一起使用。 这是一个选项,需要直接进入aapt可执行文件,就像这样;

 <exec executable="${aapt}" failonerror="true"> <arg value="package" /> <arg value="-f" /> <arg value="-v" /> <arg value="--version-code" /> <arg value="${version.code}" /> <arg value="--debug-mode" /> <arg value="-M" /> <arg path="AndroidManifest.xml" /> <arg value="-A" /> <arg path="${asset.absolute.dir}" /> <arg value="-I" /> <arg path="${android.jar}" /> <arg value="-F" /> <arg path="${out.absolute.dir}/${resource.package.file.name}" /> <arg value="-S" /> <arg path="${resource.absolute.dir}" /> <arg value="--rename-manifest-package" /> <arg value="com.example.pro" /> </exec> 

我发现没有办法编辑实际上改变Eclipse构build方式的文件。 所以我把这段代码放在build.xml中,把它放在项目的根目录下,然后通过input框从控制台上build立起来;

 ant debug 

如果你依赖任何图书馆,他们也需要进入包装。 看看你的default.properties文件,你会看到对lib的引用。 然后把这个添加到上面的规则中,像这样;

 <arg value="-S" /> <arg path="${android.library.reference.1}/res" /> 

它开始感觉越来越像一个破解任何平台SDK更新的破解。

manifestpackage是ant任务option "--rename-manifest-package"的参数值。 使用这个来为您的应用程序创build不同的包。 覆盖

 target name="-package-resources" 

从ant脚本

我最近需要能够在构build时更改应用程序的包名称。 当你有一个应用程序的付费和免费版本,这是一个共同的需要。 如果您想要在手机上安装应用程序的多个版本(如“开发”和“稳定”版本),这也很有用。

一种方法是将整个项目转换为一个图书馆项目,然后为每个版本创build一个最终项目,这取决于图书馆项目。

阿普魔法

还有另一种方法:aapt有一个–rename-manifest-package参数,用于重写最终APK中的二进制AndroidManifest.xml文件的包名称。

这是aapt帮助说的:

 --rename-manifest-package Rewrite the manifest so that its package name is the package name given here. Relative class names (for example .Foo) will be changed to absolute names with the old package so that the code does not need to change. 

最大的好处是你的代码不会改变,R类保持不变。

ant

自r17起,此选项在aapt Ant任务中通过manifestpackage属性可用。 您将需要覆盖从SDK build.xml复制的-package-resources目标:

 <target name="-package-resources" depends="-crunch"> <do-only-if-not-library elseText="Library project: do not package resources..." > <aapt executable="${aapt}" manifestpackage="com.my.package" > ... </aapt> </do-only-if-not-library> </target> 

Maven的

android-maven-plugin的android:apk目标有一个renameManifestPackage参数。

最后一件事

如果您在运行时加载一些资源ID,则可能需要更新您的代码。

我曾经这样做过:

 String packageName = context.getPackageName(); Resources res = context.getResources(); int id = res.getIdentifier("my_drawable", "drawable", packageName); 

这通常很好,特别是在你不知道包名的图书馆项目中。

但是,这里的问题是在最终更新包名称之前处理资源。 所以packageName是错误的。

通过使用Resources.getResourcePackageName()检索另一个资源的包名称,可以很容易地解决这个问题。

我们来创build专门用于此目的的资源ID,例如在res / values / ids.xml中:

 <?xml version="1.0" encoding="utf-8"?> <resources xmlns:android="http://schemas.android.com/apk/res/android"> <item name="used_for_package_name_retrieval" type="id"/> </resources> 

现在我们得到正确的包装:

 Resources res = context.getResources(); String packageName = res.getResourcePackageName(R.id.used_for_package_name_retrieval); int id = res.getIdentifier("some_drawable", "drawable", packageName); 

结论

这个技巧有助于创build同一个应用程序的不同版本。

这个工具可以帮助你重命名android项目包:

https://github.com/lijunjieone/RenameAndroidPackage