Android - Erstelle separate APKs für unterschiedliche Prozessorarchitekturen

9

Gibt es eine einfache Möglichkeit, separate APK-Dateien für Android für verschiedene Prozessorarchitekturen zu erstellen, mit dem alten ANT oder dem neuen Gradle Build-Prozess? Meine Vorgehensweise besteht darin, eine "fette" APK mit allen unterstützten nativen Bibliotheken zu erstellen und sie dann in separate APKs aufzuteilen, wie ich es erklärt habe hier . Es scheint jedoch, dass es eine direktere Methode dafür geben sollte ...

    
gregko 13.11.2013, 12:44
quelle

4 Antworten

4

Ich habe beschlossen, meine Antwort von woanders erneut hier zu posten, so dass das Ganze auf einer Seite leicht zu finden ist Zugriff. Wenn dies gegen SO-Richtlinien verstößt, bitte sagen Sie mir und löschen Sie diesen Beitrag von hier.

Hier ist meine Idee, wie separate APK-Dateien für jede unterstützte Prozessorarchitektur erstellt werden können:

  1. Erstellen Sie ein "fettes" APK mit allen von Ihnen verwendeten Tools, die alle nativen Code-Bibliotheken enthalten, die Sie unterstützen, z. Armeabi, armeabi-v7a, x86 und Mips. Ich werde es die 'ursprüngliche' APK-Datei nennen.

  2. Entpacken Sie Ihr originales APK in einen leeren Ordner mit einem beliebigen Zip / Unzip-Dienstprogramm, verwenden Sie am besten Kommandozeilen-Tools, damit Sie es später mit einem Shell-Skript oder einer Batch-Datei automatisieren können. Wie mein Beispiel-Batch-Skript unten zeigt, verwende ich einfach die Befehlszeilen-Zip / Unzip-Tools, um APKs direkt zu manipulieren, anstatt sie vollständig zu entpacken, aber der Effekt ist der gleiche.

  3. Löschen Sie in dem Ordner, in den das ursprüngliche APK dekomprimiert wurde (oder in der ursprünglichen .apk / .zip), den Unterordner META-INF (dieser enthält die Signaturen, wir müssen das APK erneut signieren Nach all den Änderungen muss das ursprüngliche META-INF gelöscht werden.

  4. Wechseln Sie in den Unterordner lib und löschen Sie die Unterordner für alle Prozessorarchitekturen, die Sie nicht in der neuen APK-Datei haben möchten. Lassen Sie beispielsweise nur den Unterordner "x86", um ein APK für Intel Atom-Prozessoren zu erstellen.

  5. Wichtig: Jedes APK für eine andere Architektur muss in AndroidManifest.xml eine andere 'versionCode'-Nummer und den Versionscode für z. arméabi-v7a muss etwas höher sein als das für armeabi (lesen Sie die Google-Anleitung zum Erstellen mehrerer APKs hier: Ссылка ). Leider befindet sich die Manifestdatei in einer kompilierten binären Form innerhalb der APK. Wir brauchen ein spezielles Tool, um dort den versionCode zu modifizieren. Siehe unten.

  6. Sobald das Manifest mit einem neuen Versionscode geändert wurde und unnötige Verzeichnisse und Dateien gelöscht wurden, können Sie Ihr kleineres APK erneut zippen, signieren und ausrichten (verwenden Sie die Tools jarsigner und zipalign vom Android SDK).

  7. Wiederholen Sie den Vorgang für alle anderen Architekturen, die Sie unterstützen müssen, und erstellen Sie kleinere APK-Dateien mit leicht unterschiedlichen Versionscodes (aber demselben Versionsnamen).

Das einzige noch offene Problem ist die Möglichkeit, 'versionCode' in der binären Manifestdatei zu ändern. Lange Zeit konnte ich dafür keine Lösung finden, also musste ich mich endlich hinsetzen und meinen eigenen Code ankurbeln. Als Ausgangspunkt habe ich APKExtractor von Prasanta Paul, Ссылка , in Java geschrieben. Ich bin die alte Schule und noch bequemer mit C ++, so dass mein kleines Hilfsprogramm 'aminc', geschrieben in C ++, jetzt auf GitHub ist:

Ссылка

Ich habe die gesamte Visual Studio 2012-Lösung dort gepostet, aber das ganze Programm ist eine einzelne .cpp-Datei, die wahrscheinlich auf jeder Plattform kompiliert werden kann. Und hier ist eine Beispiel-Windows-Batch-Script-Datei, die ich verwende, um meine "fette" apk namens atVoice.apk in 4 kleinere Dateien namens atVoice_armeabi.apk, atVoice_armeabi-v7a.apk, atVoice_x86.apk und atVoice_mips.apk zu teilen. Ich übergebe diese Dateien tatsächlich an Google Play (siehe meine App unter Ссылка ) und Alles funktioniert perfekt:

%Vor%

Zusätzliche Sicherheitsmaßnahmen

Ich erhalte in der Google Play-Entwicklerkonsole einige Fehlerberichte, in denen angegeben wird, dass eine native Methode nicht gefunden werden konnte. Höchstwahrscheinlich wird dies durch den Benutzer verursacht, der eine falsche APK installiert, z. Intel oder MIPS APK auf einem ARM-Gerät. Zusätzlicher Code zu meiner App hinzugefügt, die VersionCode-Nummer auf Build.CPU_ABI geprüft, dann eine Fehlermeldung im Falle einer Nichtübereinstimmung angezeigt und der Benutzer aufgefordert, eine Neuinstallation von Google Play (oder meiner eigenen Website, wo ich ein "fettes" APK poste) ) in diesem Fall.

Greg

    
gregko 14.11.2013 13:14
quelle
3

In diesem Artikel Android NDK: Versionscode-Schema für die Veröffentlichung von APKs pro Architektur Ich habe eine gute Lösung für dieses Problem gefunden. Es besteht darin, den folgenden Code hinzuzufügen:

%Vor%

zum Abschnitt android{...} des Build.gradle-Skripts. Wenn Sie die Details verstehen möchten, empfehle ich sehr, diesen Artikel zu lesen, es ist wirklich lesenswert.

    
Andrew 12.10.2016 12:40
quelle
-1

Beginnen Sie mit Android NDK Build mit ANT-Skript , mit minimalen Änderungen:

%Vor%

und verwende eine Batch-Datei, um die Schleife auszuführen (ich verwende ein einfaches sed -Skript; sed ist in %NDK_ROOT%\prebuilt\windows\bin\ und auf allen anderen Plattformen verfügbar):

%Vor%

Dies setzt voraus, dass android.verisonCode in der Manifestdatei null als letzte Ziffer hat, z. android:versionCode="40260" .

Beachten Sie, dass es technisch keinen Grund gibt, versionCode für die Varianten armeabi und mips zu ändern, aber es kann wichtig sein, armeabi & lt; armeabi-v7a & lt; x86 .

Update Danke an Ashwin S Ashok für eine noch bessere Nummerierung Schema: VERSION+10000*CPU .

    
Alex Cohn 17.11.2013 09:41
quelle
-2

Eine sehr einfache Möglichkeit ist die Verwendung eines plattformübergreifenden Frameworks wie Intel XDK.

Es hat die Fähigkeit, App zu erstellen, die auf allen Versionen von Android (2.3 +), iOS, Windows Phone 8, Tizen, Google Chrome und Mozilla Firefox funktioniert.

Ein Quellcode wird die Magie für Sie tun.

    
inspiredMichael 14.11.2013 15:10
quelle