File ini tampaknya dalam format XML biner. Apa format ini dan bagaimana cara mem-parsing secara terprogram (sebagai lawan dari menggunakan aapt dump tool di SDK)?
Format biner ini tidak dibahas dalam dokumentasi di sini .
Catatan : Saya ingin mengakses informasi ini dari luar lingkungan Android, lebih disukai dari Jawa.
android
android-manifest
Joror
sumber
sumber
android.content.pm.PackageManager.queryXX
metode (docs: developer.android.com/reference/android/content/pm/… ).Jawaban:
Gunakan android-apktool
Ada aplikasi yang membaca file apk dan menerjemahkan XML ke bentuk yang hampir asli.
Pemakaian:
Periksa android-apktool untuk informasi lebih lanjut
sumber
apktool d Gmail.apk && cat Gmail/AndroidManifest.xml
minSdkVersion
dan parameter versi lainnya juga dapat ditemukan diGmail/apktool.yml
Metode Java ini, yang berjalan pada Android, mendokumentasikan (apa yang saya bisa tafsirkan) format biner dari file AndroidManifest.xml dalam paket .apk. Kotak kode kedua menunjukkan cara memanggil decompressXML dan cara memuat byte [] dari file paket aplikasi pada perangkat. (Ada bidang yang tujuannya tidak saya mengerti, jika Anda tahu artinya, katakan padaku, saya akan memperbarui informasinya.)
Metode ini membaca AndroidManifest ke dalam byte [] untuk diproses:
Sebagian besar aplikasi disimpan di / system / app yang dapat dibaca tanpa me-root Evo saya, aplikasi lain berada di / data / app yang saya butuhkan untuk melihatnya. Argumen 'jalur' di atas adalah sesuatu seperti: "/system/app/Weather.apk"
sumber
Bagaimana dengan menggunakan Perangkat Pengemasan Aset Android (aapt), dari Android SDK, menjadi skrip Python (atau apa pun)?
Melalui aapt ( http://elinux.org/Android_aapt ), memang, Anda dapat mengambil informasi tentang paket .apk dan tentang file AndroidManifest.xml -nya . Secara khusus, Anda dapat mengekstrak nilai elemen individual dari paket .apk melalui sub-perintah 'dump' . Misalnya, Anda dapat mengekstrak izin pengguna dalam file AndroidManifest.xml di dalam paket .apk dengan cara ini:
Di mana package.apk adalah paket .apk Anda .
Selain itu, Anda dapat menggunakan perintah pipa Unix untuk menghapus output. Sebagai contoh:
Berikut skrip Python untuk itu secara terprogram:
Dengan cara yang sama Anda dapat mengekstrak informasi lain (mis. Paket , nama aplikasi , dll ...) dari AndroidManifest.xml :
Jika Anda ingin mem-parsing seluruh pohon AndroidManifest XML, Anda bisa melakukannya dengan cara yang sama menggunakan perintah xmltree :
Menggunakan Python seperti sebelumnya:
sumber
Anda dapat menggunakan alat axml2xml.pl yang dikembangkan beberapa waktu lalu dalam proyek android-random . Ini akan menghasilkan file manifes teks (AndroidManifest.xml) dari file biner.
Saya mengatakan " tekstual " dan bukan " asli " karena seperti banyak alat reverse-engineering yang satu ini tidak sempurna dan hasilnya tidak akan lengkap . Saya kira itu tidak pernah fitur lengkap atau hanya tidak kompatibel dengan maju (dengan skema pengkodean biner yang lebih baru). Apa pun alasannya, alat axml2xml.pl tidak akan dapat mengekstraksi semua nilai atribut dengan benar. Atribut tersebut adalah minSdkVersion, targetSdkVersion, dan pada dasarnya semua atribut yang mereferensikan sumber daya (seperti string, ikon, dll.), Yaitu hanya nama kelas (aktivitas, layanan, dll.) Yang diekstraksi dengan benar.
Namun, Anda masih dapat menemukan informasi yang hilang ini dengan menjalankan alat aapt pada file aplikasi Android asli ( .apk ):
sumber
Dengan SDK-Tools terbaru, Anda sekarang dapat menggunakan alat yang disebut apkanalyzer untuk mencetak AndroidManifest.xml dari APK (serta bagian lain, seperti sumber daya).
[android sdk]/tools/bin/apkanalyzer manifest print [app.apk]
apkanalyzer
sumber
Periksa Proyek WPF berikut yang menerjemahkan properti dengan benar.
sumber
apk-parser, https://github.com/caoqianli/apk-parser , alat ringan untuk java, tanpa ketergantungan untuk aapt atau biner lainnya, bagus untuk parse file biner xml, dan info apk lainnya.
sumber
Jika Anda menggunakan Python atau menggunakan Androguard , fitur Androguard Androaxml akan melakukan konversi ini untuk Anda. Fitur ini dirinci dalam posting blog ini , dengan dokumentasi tambahan di sini dan sumber di sini .
Pemakaian:
sumber
Jika berguna, berikut adalah versi C ++ dari cuplikan Java yang diposting oleh Ribo:
sumber
chars
dialokasikan oleh karakter baru [], tetapi kemudian dikosongkan, bukan yang benardelete[] chars;
. Pada akhir ctor dekompresiXML itu harusprt(" end at offset "+toIntString(off));
, jika tidak pointer aritmatika digunakan ...untuk referensi di sini adalah versi kode Ribo saya. Perbedaan utamanya adalah bahwa decompressXML () langsung mengembalikan sebuah String, yang untuk tujuan saya adalah penggunaan yang lebih tepat.
CATATAN: Satu-satunya tujuan saya dalam menggunakan solusi Ribo adalah untuk mengambil versi file .APK yang diterbitkan dari file XML Manifest, dan saya mengonfirmasi bahwa untuk tujuan ini berfungsi dengan baik.
EDIT [2013-03-16]: Ini berfungsi dengan baik JIKA versi ini ditetapkan sebagai teks biasa, tetapi jika diatur untuk merujuk ke Resource XML, itu akan muncul sebagai 'Sumber Daya 0x1' misalnya. Dalam kasus khusus ini, Anda mungkin harus memasangkan solusi ini ke solusi lain yang akan mengambil referensi sumber daya string yang tepat.
Semoga bisa membantu orang lain juga.
sumber
Di Android studio 2.2 Anda dapat langsung menganalisis apk. Goto build-analysis apk. Pilih apk, arahkan ke androidmanifest.xml. Anda dapat melihat detail dari androidmanifest.
sumber
Versi @Mathieu Kotlin mengikuti:
Ini adalah versi kotlin dari jawaban di atas.
sumber
Saya menemukan AXMLPrinter2, aplikasi Java di proyek Android4Me untuk bekerja dengan baik di AndroidManifest.xml yang saya miliki (dan mencetak XML dengan cara yang diformat dengan baik). http://code.google.com/p/android4me/downloads/detail?name=AXMLPrinter2.jar
Satu catatan .. itu (dan kode pada jawaban ini dari Ribo) tampaknya tidak menangani setiap file XML terkompilasi yang saya temui. Saya menemukan satu di mana string disimpan dengan satu byte per karakter, daripada format byte ganda yang diasumsikan.
sumber
ini bisa membantu
G adalah kelas Aplikasi saya:
sumber
Saya telah menjalankan dengan kode Ribo yang diposting di atas selama lebih dari setahun, dan itu telah membantu kami dengan baik. Namun, dengan pembaruan terkini (Gradle 3.x), saya tidak lagi dapat menguraikan AndroidManifest.xml, saya mendapatkan indeks dari kesalahan batas, dan secara umum tidak lagi dapat mengurai file.
Pembaruan: Saya sekarang percaya bahwa masalah kami adalah peningkatan ke Gradle 3.x. Artikel ini menjelaskan bagaimana AirWatch memiliki masalah dan dapat diperbaiki dengan menggunakan pengaturan Gradle untuk menggunakan aapt bukannya aapt2 AirWatch tampaknya tidak kompatibel dengan Plugin Android untuk Gradle 3.0.0-beta1
Ketika mencari-cari, saya menemukan proyek open source ini, dan itu sedang dipertahankan dan saya bisa langsung ke intinya dan membaca kedua APK lama saya yang sebelumnya bisa saya uraikan, dan APK baru yang logika dari Ribo melempar pengecualian.
https://github.com/xgouchet/AXML
Dari contohnya inilah yang saya lakukan
sumber
apkanalyzer akan sangat membantu
pos asli https://stackoverflow.com/a/51905063/1383521
sumber