2015-04-10 3 views
0

Когда я пытаюсь собрать некоторую APK-как framework-res.apk или FileExplorer.apk я получаю ту же ошибку всегдаApktool падает с некоторыми папками значения-mccxxxx-mncxxxx

invalid resource directory name: /ApkTool/Decompiladas/MiuiFramework.apk/res values-mcc9998-mnc9999 
invalid resource directory name: /ApkTool/Decompiladas/MiuiFramework.apk/res values-mcc9466-mnc9999 

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

Есть ли способ построить apk без переименования этих папок?

Спасибо.

+1

Это грязный, но, возможно, вы можете скомпилировать его без этих папок, а затем переименуйте apk в расширение .zip, добавьте эти папки обратно, а затем переименуйте обратно в apk? (Вы не указали, подписан ли apk или нет.) –

+0

Спасибо за ваш ответ, но apk нужно декомпилировать, чтобы увидеть такие папки (значения), и я не могу добавить их в zip-файл. Apk не нужно подписывать. – juliusssss

+0

Вы знаете, что вы можете переименовать расширение apk прямо в файловом браузере в .zip и изучить содержимое, верно? Вы также можете добавить ресурсы и изменить их обратно в apk, без компиляции! –

ответ

1

Недействительны mnc или mcc значения. Вы можете увидеть на странице Providing Alternative Resources что mcc находится в диапазоне от 0 до 999, в то время как mnc колеблется от 1 до 999.

Основываясь на именование рамках. Кажется, вы имеете дело с картой MIUI. Это означает, что вполне возможно, что MIUI изменил квалификаторы AOSP, чтобы позволить такие значения. Это означает, что MIUI будет иметь свой собственный модифицированный aapt из тех изменений, которые могут обрабатывать эти нестандартные квалификаторы.

Я проверил ResourceTypes.h, чтобы посмотреть, какие типы данных mcc и mnc есть.

union { 
    struct { 
     // Mobile country code (from SIM). 0 means "any". 
     uint16_t mcc; 
     // Mobile network code (from SIM). 0 means "any". 
     uint16_t mnc; 
    }; 
    uint32_t imsi; 
}; 

Как вы можете видеть, что они оба uint16_t. Таким образом, наше максимальное значение равно 65535. Таким образом, мы могли легко хранить 9998 и больше, не изменяя сами квалификаторы. Это указывает на проблему валидации aapt.

Если мы посмотрим на AaptConfig.cpp из aapt мы видим parseMcc и parseMnc методы, которые оба имеют вариации этой проверки

if (c-val == 0 || c-val > 3) return false; 

Так в основном любое значение больше чем 3 цифр не удалось, таким образом, давая вам эту ошибку.

Теперь я не знаю, как MIUI использует эти квалификаторы, но у вас есть два варианта.

  1. Создайте свой собственный aapt из источника, удаляющего эту проверку. Вам понадобится этот commit, который добавит поддержку других изменений классификатора MIUI. Чтобы быть в безопасности. Я бы просто создал ваш aapt от моего platform_frameworks_baserepo. Из-за постоянного адаптационного характера aapt, приложения становятся все труднее и сложнее перекомпилировать правильно. Моя вилка aapt удаляет ненужные проверки. (Я делаю это, потому что, если вы декомпилируете apk, он уже был скомпилирован один раз, поэтому его не apktool для обеспечения 100% -ной совместимости, такой как новее aapt, пытается обеспечить соблюдение).

  2. Удалить те каталоги res/values-mcc9998-mnc9999 и values-mcc9466-mnc9999.

+0

Спасибо за ваш ответ и извините за задержку, я скомпилировал мой собственный aapt, удалив чек, и я скомпилировал miuiframework, но rom все еще не загружается, если я удаляю эти папки, происходит одно и то же. – juliusssss

+0

@juliusssss Вам нужно будет захватить лог-код, чтобы отладить это дальше. «Не загружать» не совсем полезно. –

+0

Я декомпилирую и компилирую MiuiFramework без каких-либо изменений в apk, затем я заменяю его на rom и я flash rom, но rom не загружает его в bootlogo. Извините, что не объясняю хорошо. Я тестировал с помощью differents aapt и apktools и всегда делал то же самое. – juliusssss