Как установить путь туда, где добавлена ​​команда 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 должен был поставить с невероятно сложным механизмом представления, который, в конце концов, занял шесть месяцев, чтобы кто-то мог вернуться ко мне, в некоторых случаях с незначительными изменениями, которые могли быть только что сделаны на их конце, был процесс их подачи не настолько ужасно сложным. очень легкое решение этой проблемы, я не считаю это достаточно важным, чтобы все это снова беспокоиться.)