Jak powiedzieć, dla jakiej architektury jest przeznaczony pakiet APK?

9

Piszę skrypt, aby przetestować dużą liczbę aplikacji. Niektóre działają na x86, a niektóre na ramieniu. Czy istnieje sposób, aby określić, które aplikacje są przeznaczone dla jakiej architektury?

Przejrzałem raport na temat oznakowania Aapt aapt dump badging application.apk. Widzę niektóre wersje kompatybilne z ramieniem, native-code: 'armeabi-v7a'ale nie wszystkie, i nie widzę żadnej wskazówki, na jakiej architekturze działają apki kompatybilne z x86.

Próbowałem także za pomocą apktool rozerwać apk i zbadać plik AndroidManifest.xml. Nie widzę też w tym nic związanego z architekturą układu.

Jakieś pomysły?

MikeSchem
źródło

Odpowiedzi:

17

Jednym (raczej prymitywnym) sposobem na sprawdzenie, dla jakiej architektury są budowane biblioteki natywne APK, jest rozpakowanie go (jest to tylko plik zip) i spojrzenie na folder libs - jeśli aplikacja zawiera jakieś biblioteki natywne, zostaną one podzielone na następujące podfoldery w środku (w tym skompilowane biblioteki):

Zobacz Pakiet aplikacji na Androida, aby uzyskać więcej informacji na temat struktury APK i źródła powyższej listy. Pełniejszą (w tym MIPS64) listę wraz z niektórymi informacjami na temat elementów specyficznych dla architektury można znaleźć w zarchiwizowanej wersji strony zarządzania ABI dla programistów Androida , zarejestrowanej 18 kwietnia 2016 r.

Co ciekawe, celowanie w pojedynczy ABI (gdzie aplikacja zawiera biblioteki natywne zaprojektowane dla jednej architektury) niekoniecznie oznacza, że ​​aplikacja nie będzie działać na urządzeniach korzystających z innych architektur. Na przykład ARMv8-a jest wstecznie kompatybilny z ARM i ARMv7-a, a urządzenia z Androidem x86 Intela zawierają zastrzeżoną warstwę translacyjną, która pozwala na wykonywanie kodu ARM na urządzeniach x86 (umożliwiając uruchamianie aplikacji tylko na ARM na platformach x86). Wykaz ABI, że urządzenie może wykonywać Androida można znaleźć na ro.product.cpu.abilistwłasność, którą można osiągnąć w powłoce (na przykład przez zacisk aplikacji na urządzeniu lub na ADB pomocą adb shell) z użyciem getpropkomendy: getprop ro.product.cpu.abilist.

Joe
źródło