как установить путь, куда команда aapt add добавляет файл - PullRequest
11 голосов
/ 02 июня 2011

Я использую инструмент aapt для удаления некоторых файлов из разных папок моего apk.Это работает нормально.

Но когда я хочу добавить файлы в apk, команда добавления инструмента aapt не позволяет мне указать путь, куда я хочу добавить файл, поэтому я могу добавлять только файлыв корневую папку апк.Это странно, потому что я не думаю, что разработчики никогда не захотят добавлять файлы в подпапку apk (например, в папку res).Это возможно с aapt или любым другим методом?Потому что удаление файлов из любой папки работает нормально, а добавление файлов работает только для корневой папки apk.Не могу использовать его для любой другой папки.

Спасибо

Ответы [ 2 ]

11 голосов
/ 10 июня 2011

Инструмент aapt сохраняет структуру каталогов, указанную в команде add, если вы хотите добавить что-то в существующую папку в apk, вам просто необходимо иметь аналогичную папку в вашей системе и указать каждый файл, чтобы добавить полный список каталога,Пример

$ aapt list test.apk
res/drawable-hdpi/pic1.png
res/drawable-hdpi/pic2.png
AndroidManifest.xml

$ aapt remove test.apk res/drawable-hdpi/pic1.png
$ aapt add test.apk res/drawable-hdpi/pic1.png

Добавленный pic1.png находится в папке в текущем рабочем каталоге терминала res / drawable-hdpi /, надеюсь, это ответило на ваш вопрос

8 голосов
/ 04 июля 2011

На самом деле в aapt есть ошибка, которая делает это случайным образом невозможным.Предполагается, что он будет работать так, как утверждает другой ответ: пути сохраняются, если вы не передадите -k.Давайте посмотрим, как это реализовано:

Флаг, который контролирует, игнорируется ли путь: mJunkPath:

bool        mJunkPath;

Эта переменная находится в классе с именем Bundle и управляетсяс помощью двух методов доступа:

bool getJunkPath(void) const { return mJunkPath; }
void setJunkPath(bool val) { mJunkPath = val; }

Если пользователь указал -k в командной строке, он будет установлен на true:

case 'k':
    bundle.setJunkPath(true);
    break;

И при добавлении данныхв файл проверяется:

if (bundle->getJunkPath()) {
    String8 storageName = String8(fileName).getPathLeaf();
    printf(" '%s' as '%s'...\n", fileName, storageName.string());
    result = zip->add(fileName, storageName.string(),
                      bundle->getCompressionMethod(), NULL);
} else {
    printf(" '%s'...\n", fileName);
    result = zip->add(fileName, bundle->getCompressionMethod(), NULL);
}

К сожалению, один экземпляр Bundle, используемый приложением, размещен в main в стеке, и инициализация mJunkPath в нем отсутствуетконструктор, поэтому значение переменной является случайным;без способа явно установить его на false, в моей системе я (на первый взгляд, детерминистически) не могу добавлять файлы по указанным путям.

Однако вы также можете просто использовать zip, так как APK являетсяпросто файл Zip, и инструмент zip отлично работает.

(Для справки, я еще не представил тривиальное исправление для этого как патч для Android, если кто-то еще хочет, чтобы мир мог, вероятно,быть лучшим местом. Мой опыт с процессом отправки кода Android был вынужден мириться с невероятно сложным механизмом отправки, который в итоге занял шесть месяцев, чтобы кто-то вернулся ко мне, в некоторых случаях с незначительными изменениями, которые могли быть только чтов конце концов, процесс их представления был не таким уж сложным. Учитывая, что для этой проблемы есть действительно легкий обходной путь, я не считаю его достаточно важным, чтобы снова заняться всем этим.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...