2015-04-16 5 views
18

Я хочу преобразовать файл AndroidManifest.xml из открытого текста в бинарный формат, который использует Android для его упаковки в финальном APK.Android: преобразование стандартного XML в Android Бинарный XML-формат (AXML)

Я хочу сделать это в Java, так как мне нужно сделать это на самом устройстве Android (именно поэтому этот вопрос НЕ дубликат:. How to convert XML to Android Binary XML Я знаю, что вы можете использовать AAPT, но мне нужно java method)

Существует множество инструментов для декодирования двоичного xml-файла в читаемом файле, но ничего о том, как сделать наоборот, что я хочу.

Оцените любую информацию или подсказку о том, как это может быть достигнуто.

+1

Существует этот вопрос SO как ресурс для декодирования AXML в XML https://stackoverflow.com/a/4761689/4307644 Он был достаточно хорош, чтобы комментировать формат. Все, что нам нужно, - это перепроектировать «хакерскую» часть неизвестных данных, а затем отменить процесс этого парня. Здесь поздно, поэтому я буду смотреть утром; но, надеюсь, кто-то с немного большим временем может использовать этот ресурс и помочь до этого. – MeetTitan

+1

Чтобы дать немного большей ясности в отношении щедрости, предложенный @MeetTitan отвечает критериям получения награды. Такие инструменты, как aapt, apktool и т. Д., Пока они «работают», не дают желаемого результата. –

+0

@Gavin Итак, в основном вы ищете ответ кода, который не зависит от вызовов sys внешним инструментам, не так ли? –

ответ

6

Вы можете найти множество инструментов командной строки, которые могут быть использованы для компиляции и декомпиляции XML-файлов для Android. Эти инструменты объединяются с несколькими инструментами построения, включая aapt (Android Asset Packaging Tools) для просмотра, создания и обновления Zip-совместимых архивов (zip, jar, apk). Поскольку этот инструмент является частью Android SDK, в Java нет встроенной реализации.

К счастью, у репозитория self-compile-Android есть все необходимые файлы в Java Native Interface (JNI). Они готовы к использованию из приложения Android и способны самостоятельно компилировать, мутировать и распространять вирусы.

Вот список доступных модулей родных в приложении:

aapt -> Platform_Framework_Base\tools\aapt aidl -> Platform_Framework_Base\tools\aidl androidfw -> Platform_Framework_Base\include\androidfw 

zipalign -> Platform_Build\tools\zipalign host -> Platform_Build\lib\host 

libpng -> Platform_External_Libpng expat -> Platform_External_Expat zlib -> Platform_External_Zlib 

libcutils -> Platform_System_Core\libcutils cutils -> Platform_System_Core\include\cutils 

liblog -> Platform_System_Core\liblog log -> Platform_System_Core\include\log 

libutils -> Platform_System_Core\libutils utils -> Platform_System_Core\include\utils 

log.h -> Platform_System_Core\include\android 

asset_manager.h -> Platform_Framework_Native\include\android looper.h -> Platform_Framework_Native\include\android 

zopfli -> zopfli\src 

ld -> Tool_Chain_Utils\binutils-2.25\ld 

Если вы внимательно посмотрите на источник вы найдете приложение выполняющийся AAPT команды, используя родные JNI файлы:

private void runAapt() throws Exception { 
    Util.deleteRecursive(new File(S.dirRes, "drawable-xxhdpi")); 

    Aapt aapt = new Aapt(); 
    int exitCode = aapt.fnExecute("aapt p -f -v -M " + S.xmlMan.getPath() + " -F " + S.ap_Resources.getPath() 
      + " -I " + S.jarAndroid.getPath() + " -A " + S.dirAssets.getPath() + " -S " + S.dirRes.getPath() 
      + " -J " + S.dirGen.getPath()); 

    if (exitCode != 0) { 
     throw new Exception("AAPT exit(" + exitCode + ")"); 
    } 
} 

Теперь перейдите к образцу кода, чтобы узнать, как реализованы функциональные возможности. Например, чтобы изменить значение в файле манифеста,

private void modifyManifest() throws Exception { 
     Document dom = Util.readXml(S.xmlMan); 

     dom.getDocumentElement().getAttributes().getNamedItem("package").setNodeValue(userInput.appPackage); 

     Transformer t = tf.newTransformer(); 
     t.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "4"); 
     t.setOutputProperty(OutputKeys.INDENT, "yes"); 
     t.setOutputProperty(OutputKeys.METHOD, "xml"); 
     t.setOutputProperty(OutputKeys.VERSION, "1.0"); 
     t.setOutputProperty(OutputKeys.ENCODING, "UTF-8"); 
     t.transform(new DOMSource(dom), new StreamResult(new FileOutputStream(xmlFile))); 
    } 
+0

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

+0

Очень ценится. @Master_T –

0

Ваша проблема сводится к тому, как вы можете запустить адаптер на самом устройстве Android.

Поскольку aapt - это с открытым исходным кодом, лучшее решение - просто построить его самостоятельно!

Множество людей уже сделали это - и действительно есть примеры в Play Маркете. См. http://talc1.loria.fr/users/cerisara/posts/buildandroid/ для получения инструкций о том, как использовать aapt, полученный из приложения AIDE. Поиск в Play Маркете вызывает множество других Android-IDE, которые также предлагают функцию aapt.

Смежные вопросы