9
votes

Comment cibler différentes architectures Android?

J'utilise actuellement la bibliothèque OpenCV (OpenCV4android) qui n'utilise pas le NDK (il n'y a pas de code C ou C ++). Cependant, il existe des fichiers .so pour Armeabi, Armeabi-V7a, MIPS et X86. Si j'inclus tout cela dans le projet, la taille de l'application est de 30 Mo, alors que si je comprends seulement 1, la taille de l'application n'est que de 9 Mo. Si j'essaie d'exécuter l'application sur un périphérique qui n'a pas que le fichier d'architecture d'architecture de cet appareil inclus, il se bloque, alors que si je dispose du fichier .so inclus, cela fonctionne.

Par conséquent, je veux libérer plusieurs APK sur différentes architectures de périphériques afin de réduire les tailles de fichiers. D'après ce que j'ai vu, cela ne peut être fait que dans le fichier application.mk, mais ma bibliothèque n'en a pas un. Y a-t-il un autre moyen de cibler différentes architectures Android?


3 commentaires

S'il y a des fichiers .so, alors il utilise le NDK.


Est-il possible, à (ou après?) Temps d'installation, pour indiquer qu'un APK séparé doit être installé? Ensuite, vous pouvez casser votre application en cinq, un Core APK et quatre spécifiques à l'architecture, et une fois l'application Core installée, elle détecterait la voûte et installerait l'APK supplémentaire nécessaire. Je crois que s'ils utilisent le même nom de paquet, ils peuvent travailler ensemble comme unité, mais je n'ai jamais rien essayé de tel. Toutes mes excuses si je suis loin de la base.


@Immibis I Supposez que les fichiers SO sont issus d'une bibliothèque précompilée (OpenCV4android) et dans ce projet d'application, le développeur n'utilise pas NDK pour construire les fichiers SO.


3 Réponses :


18
votes

J'utilise actuellement la bibliothèque OpenCV (OpenCV4android) qui n'utilise pas le NDK (il n'y a pas de code C ou C ++). Cependant, il existe des fichiers .so pour Armeabi, Armeabi-v7a, Mips et X86.

Comme Immibis le met, s'il y a des fichiers .so , il utilise le NDK.

Si j'essaie d'exécuter l'application sur un périphérique qui n'a pas que l'architecture de cet appareil est incluse, il se bloque, alors que si je l'ai fait .so inclus, cela fonctionne.

qui dépend de l'appareil. De nombreux appareils x86 ont libhoudiini , qui peuvent exécuter des fichiers binaires à bras NDK, bien que plus lentement qu'ils ne couraient des fichiers binaires X86 natifs. De même, un périphérique ARMEABI-V7 peut exécuter ARMEABI NDK binaires, bien que peut-être plus lentement, en particulier si le traitement de point flottant est utilisé.

Par conséquent, je veux libérer plusieurs APK sur différentes architectures de périphériques afin de réduire les tailles de fichiers. D'après ce que j'ai vu, cela ne peut être fait que dans le fichier application.mk, mais ma bibliothèque n'en a pas un.

Le fichier appliquer.mk ne contrôle que ce qui est compilé, pas ce qui est distribué.

Y a-t-il un autre moyen de cibler différentes architectures Androides?

Utilisez Gradle pour Android, peut-être conjointement avec Android Studio, et le abi Split : xxx

abi fermeture dans le Splits Fermeture:

  • opte dans différents fichiers APK par architecture CPU

  • met en place une blancheur des architectures que vous souhaitez

  • demande également à une "APK universelle" contenant toutes les architectures, à utiliser avec des canaux de distribution qui ne prennent pas en charge des puits distincts par architecture

    Le résultat de votre construction sera séparé des APKs par CPU Architecture, plus l'Universal One.


4 commentaires

C'est une excellente nouvelle pour entendre, donc si j'utilise cette méthode, je suis capable de déployer plusieurs APK au magasin pour une application pour cibler plusieurs architectures?


... Utiliser un seul "Inclure" pour chaque APK, par exemple, d'inclure "armée-v7a"?


@Aggiedev: Vous allez afficher dans l'instruction les architectures que vous souhaitez et ignorez celles que vous ne voulez pas (par exemple, MIPS , probablement). Vous obtiendrez un apk par architecture. En termes de distribution sur le magasin de jeu, ma compréhension est qu'elle soutient des APK distincts par architecture, bien que je ne l'ai pas essayé personnellement.


Vous devrez avoir des codes de version différents pour chacune de ces architectures que Kiran a déclaré et téléchargez vos APK vers la console de développeur en "mode avancé". Voici un gist qui peut vous aider à gérer correctement les codes de version à partir de gradle: gist.github.com/PH0B/69586260BC20C58136EF



10
votes

Chaque APK pour l'application doit avoir un code de version unique spécifié par Android: VersionCode Code>. Certains appareils X86 peuvent exécuter des fichiers binaires ARMV7. Donc, pour éviter un cas d'Armv7 APK d'être téléchargé / utilisé dans le périphérique X86 (et des scénarios similaires pour d'autres architectures), Vous devez commander les codes de version forts>. Par ex., Commandez les codes de version afin que, l'APK X86 dispose d'un code de version plus élevé que ARMV7. Plus sur les versions sur ce lien .

a build.gradle code> échantillon pour créer des appareils codés une version unique pour chaque architecture de votre choix est partagé par ph0b à Github . Copier le même ci-dessous. P>

splits {
        abi {
            enable true
            reset()
            include 'x86', 'x86_64', 'armeabi-v7a', 'arm64-v8a' //select ABIs to build APKs for
            universalApk true //generate an additional APK that contains all the ABIs
        }
    }

    // map for the version code
    project.ext.versionCodes = ['armeabi': 1, 'armeabi-v7a': 2, 'arm64-v8a': 3, 'mips': 5, 'mips64': 6, 'x86': 8, 'x86_64': 9]

    android.applicationVariants.all { variant ->
        // assign different version code for each output
        variant.outputs.each { output ->
            output.versionCodeOverride =
                    project.ext.versionCodes.get(output.abiFilter, 0) * 1000000 + android.defaultConfig.versionCode
        }
    }


2 commentaires

La documentation a mis à jour la taille suggérée de 50 Mo à 100 Mo. "Vous devez généralement utiliser plusieurs APK pour prendre en charge différentes configurations de périphérique uniquement lorsque votre APK est trop grand (supérieur à 100 Mo)" "


n'a pas pu obtenir une propriété inconnue 'abiffilter' pour



3
votes

Je ne recommande pas d'utiliser ce modèle pour créer votre numéro de construction. Arch - Construisez, car si un jour que vous souhaitez revenir à un APK, vous devrez augmenter beaucoup votre version. Au lieu de cela, vous pouvez suivre ce modèle: Construction - Arch

android.defaultConfig.versionCode * 100 + project.ext.versionCodes.get(output.getFilter(com.android.build.OutputFile.ABI), 0)


0 commentaires