Wie kann man feststellen, für welche Architektur eine APK bestimmt ist?

9

Ich schreibe ein Skript, um eine große Anzahl von Apks zu testen. Einige laufen auf x86 und andere auf Arm. Kann ich feststellen, welche Apks für welche Architektur bestimmt sind?

Ich habe den Bericht über aapt badging mit durchgesehen aapt dump badging application.apk. Für einige der armkompatiblen Versionen sehe ich, native-code: 'armeabi-v7a'aber nicht für alle, und ich sehe keinen Hinweis darauf, auf welcher Architektur die x86-kompatiblen apks laufen.

Ich habe auch versucht, apktool zu verwenden, um die apk zu zerlegen und die AndroidManifest.xml zu untersuchen. Ich sehe auch nichts in Bezug auf die Chip-Architektur darin.

Irgendwelche Ideen?

MikeSchem
quelle

Antworten:

17

Eine (ziemlich grobe) Möglichkeit, um zu sehen, für welche Architektur die nativen Bibliotheken eines APK erstellt wurden, besteht darin, sie zu entpacken (es ist nur eine Zip-Datei) und einen Blick auf den Ordner libs zu werfen. Wenn die Anwendung native Bibliotheken enthält, werden diese aufgeteilt die folgenden Unterordner (mit den kompilierten Bibliotheken darin):

Siehe Applikation für Android - Paket für weitere Informationen zu einer Aufbau der APK, und die Quelle der obigen Liste. Eine vollständigere Liste (einschließlich MIPS64) sowie einige Informationen zu architekturspezifischen Dingen finden Sie in einer archivierten Version der ABI-Verwaltungsseite für Android-Entwickler , die am 18. April 2016 erfasst wurde.

Interessanterweise bedeutet das Targeting eines einzelnen ABI (wobei eine App native Bibliotheken enthält, die für eine Architektur entwickelt wurden) nicht unbedingt, dass die App nicht auf Geräten ausgeführt wird, die andere Architekturen verwenden. ARMv8-a ist beispielsweise abwärtskompatibel mit ARM und ARMv7-a, und Intels x86-Android-Geräte enthalten eine proprietäre Übersetzungsschicht , mit der ARM-Code auf x86-Geräten ausgeführt werden kann (sodass nur ARM-Apps auf x86-Plattformen ausgeführt werden können). Eine Liste der ABIs, die ein Android-Gerät ausführen kann, finden Sie in der ro.product.cpu.abilistEigenschaft, die in einer Shell (z. B. über eine Terminal-App auf dem Gerät oder über ADB mit adb shell) mit dem folgenden getpropBefehl abgerufen werden kann : getprop ro.product.cpu.abilist.

Joe
quelle