Пользовательский файл Android build.xml для переименования манифеста

Я хочу создать одно приложение в 2 версии, один платный, один бесплатный, и я знаю, что у aapt есть опция «–rename-manifest-package», но я не знаю, как использовать его в build.xml. Я нахожу 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.xml, поместил его в корень проекта и построил с консоли, набрав;

 ant debug 

И если вы зависите от каких-либо библиотек, они также должны пойти в упаковку. Посмотрите в файл default.properties, и вы увидите ссылку на lib. Затем добавьте это к правилу выше, например:

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

Он начинает чувствовать себя все более и более похожим на хак, который может сломаться с любым обновлением SDK платформы.

option "--rename-manifest-package" значение arg для option "--rename-manifest-package" для ant-задачи. Используйте это для создания разных пакетов для своего приложения. переопределение

 target name="-package-resources" 

От скрипта ant

Недавно мне нужно было изменить имя пакета приложения во время сборки. Это обычная необходимость, когда у вас есть платная и бесплатная версия приложения. Это также полезно, если вы хотите установить несколько версий приложения на свой телефон, например, «dev» и «stable» build.

Один из способов сделать это – преобразовать весь проект в виде проекта библиотеки, а затем создать один окончательный проект для каждой версии, который зависит от проекта библиотеки.

Aapt magic

Существует еще один способ: aapt имеет параметр -rename-manifest-package, который перезаписывает имя пакета бинарного файла AndroidManifest.xml в последнем APK.

Вот что помогает помощник:

 --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 останется идентичным.

Муравей

Начиная с r17 этот параметр доступен в задаче aapt Ant, через атрибут manifestpackage. Вам нужно переопределить цель -package-resources, скопированную из файла SDK build.xml:

 <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> 

специалист

Цель android: apk для android-maven-plugin имеет параметр renameManifestPackage.

Одна последняя вещь

Если вы загружаете некоторые идентификаторы ресурсов во время выполнения, вам может потребоваться обновить код.

Раньше я это делал:

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

Это обычно отлично работает, особенно в библиотечных проектах, где вы не знаете имя пакета.

Однако проблема заключается в том, что ресурсы были обработаны до окончательного обновления имени пакета. Так что packageName ошибочно.

Это легко исправить, получив имя пакета другого ресурса с помощью Resource.getResourcePackageName ().

Давайте создадим идентификатор ресурса, выделенный для этой цели, например, в 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); 

Вывод

Этот совет помогает создавать разные версии одного и того же приложения.

Этот инструмент может помочь вам переименовать пакет проекта Android:

https://github.com/lijunjieone/RenameAndroidPackage