Завершая свой первый проект на Android, я столкнулся с проблемой отсутствия достаточной гибкости при сборке релиза.
Изначально для сборки предполагается использовать ant. При создании проекта платформа любезно создает для вас build.xml .
Как правило, вся настройка состоит из указания пути к Android SDK в файле local.properties. Вы также можете указать там параметры key.store и key.alias, чтобы приложение автоматически подписывалось при сборке.
Google в своей документации не рекомендует этого делать, поскольку ввод пароля для ключа, который предлагается в процессе сборки, логируется в Shell. Но что делать, если во время сборки нужно сделать что-то дополнительно? В моем случае необходимо было исключить некоторые файлы из итогового пакета, расположенного активы/тест папка.
В этих файлах хранятся пути для тестирования веб-сервисов и данные авторизации.
Нет абсолютно никакого смысла включать их в итоговое приложение.
Оказалось, что найти решение, несмотря на его простоту, непросто.
Проблема в небольшом количестве документации.
Предлагаю заглянуть внутрь, чтобы сэкономить время в будущем.
Если вы заглянете внутрь build.xml , то там вы сможете найти закомментированные элементы для настройки:
<!-- extension targets. Uncomment the ones where you want to do custom work
in between standard targets -->
<!--
<target name="-pre-build">
</target>
<target name="-pre-compile">
</target>
[This is typically used for code obfuscation.
Compiled code location: ${out.classes.absolute.dir}
If this is not done in place, override ${out.dex.input.absolute.dir}]
<target name="-post-compile">
</target>
-->
После этого идет инструкция
<setup />
Он импортирует контент SDK/инструменты/ant/main_rules.xml .
Если заглянуть внутрь указанного файла, то можно увидеть весь процесс сборки проекта.
К сожалению, отсюда мы видим, что использование -pre-build, -pre-compile или -post-compile не подходит для поставленной задачи.
Процесс упаковки ресурсов в файл .
apk выглядит следующим образом:
<target name="-package-resources">
<echo>Packaging resources</echo>
<aapt executable="${aapt}"
command="package"
versioncode="${version.code}"
debug="${build.packaging.debug}"
manifest="AndroidManifest.xml"
assets="${asset.absolute.dir}"
androidjar="${android.jar}"
apkfolder="${out.absolute.dir}"
resourcefilename="${resource.package.file.name}"
resourcefilter="${aapt.resource.filter}">
<res path="${resource.absolute.dir}" />
<!-- <nocompress /> forces no compression on any files in assets or res/raw -->
<!-- <nocompress extension="xml" /> forces no compression on specific file extensions in assets and res/raw -->
</aapt>
</target>
Очевидно, что в этой конкретной задаче нужно что-то менять.
Логично я видел два варианта: 1. Как-то установить исключения, которые будут отфильтровывать ненужные ресурсы при упаковке.
2. Добавьте еще один шаг: удаление ненужных файлов из готового апк.
Самым сложным было найти документацию для .
Очевидно, что задача зависит от инструмента платформы aapt. Но все, что есть по этому поводу, — это формальная справка в Shell и кусок текста в документации: Другие инструменты платформы, такие как helpl, aapt, dexdump и dx, обычно вызываются инструментами сборки Android или инструментами разработки Android (ADT), поэтому вам редко придется вызывать эти инструменты напрямую.
Как правило, вам следует полагаться на инструменты сборки или плагин ADT, чтобы вызывать их по мере необходимости.
Из заголовков задача-определение В main-rules.xml мы видим, что этот aapt — не что иное, как класс com.android.ant.AaptExecLoopTask .
Мы нашли источник Сорт. Из него мы видим, что задача — не что иное, как узкий слой для стандартной упаковки с помощью утилиты командной строки aapt. Можно настраивать пути и имена, но более глубокой гибкости нет, как и она не заложена в самом aapt при работе с ассетами.
Инструмент позволяет вам только указать каталог, но не управлять списками файлов.
Если вы еще увидите варианты, буду рад прочитать их в комментариях.
Поэтому я решил оставить упаковку как есть и пойти вторым путем: удалить ненужные файлы после упаковки.
Для этого внутри нашего build.xml переопределить зависимости для задачи
«-package-release», который зависит от задачи упаковки:
<target name="-package-release" depends="-dex, -package-resources, -package-removetestassets">
<package-helper
output.filepath="${out.unsigned.file}"/>
</target>
Теперь эта цель будет использоваться вместо исходной из main_rules.xml. Он добавил новую зависимость -package-removetestassets .
Добавим простую задачу, которая удалит ненужные ресурсы:
<target name="-package-removetestassets">
<echo>Excluding test assets from apk</echo>
<exec executable="${aapt}">
<arg value="remove"/>
<arg value="${out.absolute.dir}/${resource.package.file.name}"/>
<arg value="assets/test/*.
*"/>
</exec>
</target>
Результат был достигнут с минимальными изменениями в build.xml. И это очень важно, потому что.
снижает риски при переходе на новые версии Android. Надеюсь, что заметка окажется полезной.
Теги: #разработка Android #разработка Android
-
Аристипп
19 Oct, 24 -
Гугл Ответы
19 Oct, 24 -
Zpm – Менеджер Пакетов Для Intersystems Iris
19 Oct, 24 -
Мобильный Телефон И Общественные Места
19 Oct, 24 -
Мостелеком Инвестирует В Тройную Игру
19 Oct, 24