Перепакуйте файл APK, чтобы он содержал пользовательские ресурсы - какой инструмент сборки использовать? - PullRequest
9 голосов
/ 25 января 2011

Обновление : Это старый пост, и ссылки на сломанные aapt версии ниже будут устаревшими.


На основании предыдущих отзывов я храню пользовательские текстовые поля в каталоге ресурсов моего приложения.

Я напишу приложение, используя данные пользователя по умолчанию в файле активов, и клиент хотел бы перестроить приложение для каждого пользователя, включая данные этого пользователя в файле активов.

(Я знаю, что у этого метода есть некоторые серьезные недостатки, но клиент по-прежнему заинтересован в том, чтобы сделать это таким образом - см. Вставить данные для входа в APK-файл, разные для каждого пользователя (или другие параметры?) )

Этот вопрос касается проблем, возникающих у меня при перекомпоновке APK-файла, после того, как я разархивировал его и обновил файл пользовательских ресурсов. Я совершенно убежден, что упускаю что-то маленькое, однако документация и сообщения, которые я нашел по этим методам, не достаточно полезны для новичка.

  1. aapt - инструмент Android SDK: К сожалению, документы для Android по теме «Использование aapt» для документов для Android [ссылка 2 ниже] очень ограничены. Команда консоли -help показывает немного больше информации. При попытке использовать его, чтобы просто добавить файл в test.apk, он в итоге удаляет оригинал и создает новый файл test.apk.zip, содержащий только файл, который я пытался добавить. Я не смог найти правильную комбинацию командной строки, чтобы взять разархивированный apk и перепаковать его - это был бы мой первый приз.

  2. apkbuilder - инструмент Android SDK: во-первых, этот инструмент устарел, что является для него отрицательным моментом. Я также не могу заставить его работать с тем, что у меня есть в этой разархивированной папке. Я думаю, что пропускаю предварительный шаг apkbuilder, потому что apkbuilder запрашивает zip-архив ресурса, и у меня есть папка ресурса.

  3. ant - build tool: другие подобные посты говорят, что нужно строить с помощью ant, а не с помощью инструментов android. У меня проблемы с получением муравья на работу. Одна конкретная ссылка на «Получение Ant для работы с Android» [ссылка 3 ниже] выглядит многообещающе, но, похоже, она предназначена для другого Android SDK (мой build.xml, созданный Android, выглядит иначе, чем его). К сожалению, я мало знаю об муравьях, и мне трудно стать экспертом, чтобы решить мою текущую проблему.
    В дополнение к решению NickT, приведенному ниже - при запуске сценария ant появляется ошибка
    TaskDef класс com.android.ant.SetupTask не может быть найден с помощью загрузчика классов AntClassLoader [] .
    Я нашел в Интернете некоторые ссылки на эту ошибку, подтвердив, что local.properties имеет параметр sdk.dir, который указывает на мою папку установки Android SDK (sdk.dir = / Applications / android-sdk-mac_86).

  4. ?????: Могут быть и другие варианты, которые я не перечислил / не обнаружил, о которых мне было бы интересно услышать.

Я понимаю, что копание в механизмах, которые обычно скрыты моим идеем, может привести к трудностям. Но я знаю, что многие пользователи SO могут делать многие из этих вещей, и я надеюсь, что некоторые из них меня заинтересуют. Спасибо за любую помощь.

(Eclipse 3.6 на Mac Snow Leopard 10.6 64 бит)

PS, я не могу опубликовать более 1 гиперссылки, поэтому я включил эти адреса, чтобы показать больше информации для моего вопроса.

(1): stackoverflow.com/questions/4783160/embed-login-details-in-apk-file-different-for-each-user-or-other-options

(2): developer.android.com/guide/developing/tools/aapt.html

(3): www.disgruntledrats.com/?p=27

Ответы [ 4 ]

9 голосов
/ 09 февраля 2011

Чтобы ответить на мой собственный вопрос, используя метод, который мы окончательно выбрали, и «для протокола»:

Мне не удалось заставить Ant правильно работать на меня (мое непонимание).

В итоге я использовал инструмент aapt. Он работает в соответствии с документацией Android SDK и очень прост в использовании:

aapt add -v Test.apk "assets/readme.txt"

Это добавит файл readme.txt (мы хранили его в подпапке текущей запущенной папки, называемой assets. Если вы хотите сохранить новый файл где-то еще, aapt предлагает параметр командной строки, чтобы указать это)

Однако есть некоторые оговорки:

  1. Не удалось заставить его работать с подписанными файлами APK.
  2. некоторые версии aapt не работают должным образом! Они не распознают подпапку ...

Для решения 1:

  1. Экспорт APK из затмения в виде неподписанного APK.
  2. Используйте keytool для генерации ключа (см. Документацию по Android).
  3. Используйте aapt.
  4. Подпишите APK, используя jarsigner.

Решить 2:

Я не могу помочь с этим. Каждая версия SDK (для Mac), которую я пытался загрузить, включала инструмент aapt, который не распознавал подпапки. Коллега загрузил работающую версию, но мы все еще не могли выяснить, какую версию он скачал, поэтому мы сохранили эту «волшебную» копию и переименовали ее, и будем использовать ее, пока не найдем новую работающую версию.

3 голосов
/ 25 января 2011

Самое простое решение - предоставить исходный шаблон приложения вашему клиенту с помощью скрипта, который перестраивает приложение с нуля.

Таким образом, ваш клиент просто должен изменить ресурсы в папке, дваждыщелкните пакетный файл и получите apk через минуту или около того.

Вам не нужно ничего знать о ANT, чтобы скомпилировать и упаковать без IDE, просто выполните следующие действия:

http://developer.android.com/guide/developing/other-ide.html

Сценарий ANT генерируется командами «android create» «android update».Тогда вам просто нужно запустить «выпуск муравья» и вперед.

2 голосов
/ 19 мая 2011

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

Я просто использовал стандартный инструмент Zip, чтобы «отписать» APK, удалив папку META-INF, обновил все файлы ресурсов и затем оставил APK, используя jarsigner. (Если бы я мог найти способ подписать JAR-файлы без использования jarsigner, поэтому нам не нужно было бы устанавливать Java SDK везде, это было бы действительно полезно - кто-нибудь подумает?)

1 голос
/ 25 января 2011

Чтобы расширить ответ Яхеля, да, я думаю, что Ant - это путь. Это может быть немного пугающим, но это удивляет, насколько хорошо это работает "из коробки", не слишком много возиться. Чтобы настроить его, нужно немного почитать, но я справился, и я поделюсь с вами своим опытом.

Сначала создайте пример приложения, как предложено. Предположим, вы хотите, чтобы он был создан в c: \ junk. Затем из командной строки в каталоге Android SDK \ tools введите:

android create project -t 5 -n AndSampleApp -p c:\junk\AndSampleApp -a AndSampleApp -k com.yourpackage.andsample.

(-t 5 дает 7-й уровень API, введите «android list target», чтобы увидеть другие варианты)

Давайте предположим, что вы строили свои проекты в рабочей области Eclipse (это / dev / projects / EclipseHelios / AndroidWorkspace на моей машине). Скопируйте файлы build.xml и build.properties примера приложения в папку проекта в Eclipse

и отредактируйте вновь созданный build.xml и удалите строку

<project name="AndSampleApp" default="help">

и замените его просто:

<project>

Теперь отредактируйте вновь созданные build.properties, которые будут пустыми, за исключением комментариев, и добавьте (настраивая при необходимости):

# The password will be asked during the build when you use the 'release' target.
# OH NO IT WON'T! IF YOU PUT THE KEYS & PWDS IN AS BELOW - It'S AUTOMATIC

# Customised (hard coded) section ---------------------

projectname=YourActualProjectName

# Line below is the parent folder of where the sources are
workspace.dir=/dev/projects/EclipseHelios/AndroidWorkspace

# Line below is where you want the binaries to go
outbasebase.dir=/dev/projects/AntBuilds

key.store=c:/users/you/your-release-key.keystore
key.alias=your_release_alias
key.store.password=YourSecretPassword
key.alias.password=YourSecretPassword
#------------------------------------------------------

ant.project.name=${projectname}
base.dir=${workspace.dir}/${projectname}
source.dir=${base.dir}/src
outbase.dir=${outbasebase.dir}/${projectname}
out.dir=${outbase.dir}/bin
layout.dir=${base.dir}/res/layout

Если вы получите приглашение командной строки в / dev / projects / EclipseHelios / AndroidWorkspace / YourActualProjectName

и введите 'ant release', вы должны получить встроенный и подписанный apk в / dev / projects / AntBuilds / YourActualProjectName

Вы должны иметь возможность настроить расположение активов, добавив запись assets.dir в build.properties

...