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