Как установить путь туда, где добавлена команда aapt add
Я использую инструмент aapt для удаления некоторых файлов из разных папок моего apk. Это прекрасно работает.
Но когда я хочу добавить файлы в apk, команда добавления команды aapt не позволяет указать путь к тому, где я хочу добавить файл, поэтому я могу добавлять файлы только в корневую папку apk,
Это странно, потому что я не думаю, что разработчики никогда не захотят добавлять файлы в подпапку apk (например, папка res). Возможно ли это с помощью aapt или любого другого метода? Причина, по которой удаляются файлы из любой папки, отлично работает, и добавление файла работает только для корневой папки apk. Невозможно использовать его для любой другой папки.
Спасибо
Ответы
Ответ 1
Инструмент aapt сохраняет структуру каталогов, указанную в команде добавления, если вы хотите добавить что-то в существующую папку в 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/, надеясь, что это ответит на ваш вопрос
Ответ 2
На самом деле есть ошибка в 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 должен был поставить с невероятно сложным механизмом представления, который, в конце концов, занял шесть месяцев, чтобы кто-то мог вернуться ко мне, в некоторых случаях с незначительными изменениями, которые могли быть только что сделаны на их конце, был процесс их подачи не настолько ужасно сложным. очень легкое решение этой проблемы, я не считаю это достаточно важным, чтобы все это снова беспокоиться.)