Генерация apk для разных архитектур - ffmpegmediametadataretriever

Я занят добавлением файлов предварительной сборки FFmpegMediaMetadataRetriever в свой проект, чтобы уменьшить размер файла Apk для каждой архитектуры.

Эта почта добавил в свой .aar следующее:

android {
splits {
        // Configures multiple APKs based on ABI.
        abi {
            // Enables building multiple APKs per ABI.
            enable true

            // By default all ABIs are included, so use reset() and include to specify that we only
            // want APKs for x86, armeabi-v7a, and mips.
            reset()

            // Specifies a list of ABIs that Gradle should create APKs for.
            include "x86", "x86_64", "armeabi-v7a", "arm64-v8a"

            // Specifies that we want to also generate a universal APK that includes all ABIs.
            universalApk false
        }
    }
    //...    
}

Библиотека Gradle предоставляет следующие файлы FFmpegMediaMetadataRetriever:

image


Мои вопросы:

  • Следует ли мне размещать файлы .aar в моей папке .aar как есть (без создания папок для каждой архитектуры) или мне следует добавить их в папку?
  • Какие из вышеперечисленных файлов libs мне следует использовать для поддержки всех архитектур?
  • В посте он также говорит о управлении версиями, необходимо ли это (мое приложение работает, и я не хочу испортить управление версиями - у меня текущая версия 21)?

Он реализовал управление версиями следующим образом:

// Map for the version code that gives each ABI a value.
def abiCodes = ['x86':1, 'x86_64':2, 'armeabi-v7a':3, 'arm64-v8a':4]

// APKs for the same app that all have the same version information.
android.applicationVariants.all { variant ->
    // Assigns a different version code for each output APK.
    variant.outputs.each {
        output ->
            def abiName = output.getFilter(OutputFile.ABI)
            output.versionCodeOverride = abiCodes.get(abiName, 0) * 100000 + variant.versionCode
    }
}

Я ищу кого-то, кто, возможно, использовал файлы .aar из .aar, который может дать мне руководство по его правильной реализации.

Редактировать 1

Изучив более о различных архитектурах / ABI, я считать могу с уверенностью сказать, что если я включу только FFmpegMediaMetadataRetriever, то большинство устройств будут "покрыты"? (Мой минимальный SDK - 16).

Значит ли это, что мне не нужно разделять APK и мне не нужно беспокоиться о версиях?

Я могу просто импортировать armeabi-v7a - .aar как обычно?

«В посте он также говорит о версиях, нужно ли это». да. Из документации разработчика Android: «Поскольку в Google Play Store не допускается использование нескольких APK для одного и того же приложения с одинаковой информацией о версии, перед загрузкой в ​​Play Store вам необходимо убедиться, что каждый APK имеет свой уникальный код версии».
Michael 12.09.2018 12:33

@Michael Понял, отредактировал. Спасибо.

ClassA 12.09.2018 12:38

Что касается используемых библиотек, вы можете удалить версии arm- и mips-. Я предполагаю, что версия all предназначена, если вы хотите создать один универсальный APK, а не отдельные APK для каждого ABI. Хотите ли вы поддерживать x86 и x86_64 - решать вам. Такие устройства не очень распространены, разве что в сегменте Chromebook. Другой вариант использования x86 - это запуск приложения в эмуляторе (например, для тестов пользовательского интерфейса), поскольку эмулятор Android x86 работает намного быстрее, чем эмулятор ARM.

Michael 12.09.2018 12:53

@Michael. Да, all - это когда я хочу универсальный APK. То есть вы говорите, что я должен добавить только следующее - arm_64, armv7? Будет ли это «охватывать» большинство устройств?

ClassA 12.09.2018 13:00

У меня нет списка устройств для версий ABI и Android, но см., Например, этот ответ, чтобы получить больше информации о x86 / x86_64. Подавляющее большинство устройств Android были и продолжают основываться на arm64-v8a и более старом armeabi-v7a.

Michael 12.09.2018 13:08

@Michael Большое спасибо. Как насчет моего вопроса о папках? Следует ли мне добавлять папки в папку libs или можно просто поместить файлы .aar в папку libs?

ClassA 12.09.2018 13:28

Я мало что знаю о работе с AAR, поэтому не могу сказать.

Michael 12.09.2018 13:50

@Michael Спасибо, что нашли время, чтобы прокомментировать.

ClassA 12.09.2018 14:20
9
8
2 091
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Во-первых, не стоит считать само собой разумеющимся, что armeabi-v7a вас «накроет». Согласно этому Сообщение блога:

In August 2019, Play will require that new apps and app updates with native libraries provide 64-bit versions in addition to their 32-bit versions.

Отредактируйте после того, как я посмотрел проект, который вы упоминаете

Достаточно использовать all-fmmr.aar. Он содержит файлы .so для всех архитектур. Если вы затем используете разбиение apk, каждый apk будет содержать только одну архитектуру.

Я бы также подумал о включении библиотеки через gradle:

dependencies {
    compile 'com.github.wseemann:FFmpegMediaMetadataRetriever:1.0.14'
}

Остальная часть исходного ответа ниже

Согласно тщательному анализу проекта, по крайней мере, в нашем приложении и библиотеке у нас нет нескольких файлов .aar. В одном .aar есть несколько нативных библиотек (.so), подобных этой (вы можете открыть ее как zip):

library.aar
+-jni
| +-armeabi-v7a
| | \-nativeLib.so 
| +-arm64-v8a
| | \-nativeLib.so 
| +-x86
| | \-nativeLib.so 
| \-etc. 
+-assets
+-drawable
+-res
+-classes.jar
\-etc.

Для работы разделения apk не обязательно иметь отдельные файлы .aar. У вас может быть один .aar с собственными библиотеками для нескольких архитектур, и вы получите несколько apks для каждой из них.

Если у вас уже есть несколько файлов .aar, которые вы хотите использовать, и каждый из них имеет подобную структуру, но только с одной архитектурой, вам не нужно создавать папки по архитектуре для их хранения. Вместо этого вы можете включить их, и, надеюсь, они будут объединены в apk.

Вы можете проверить, работает ли он, заглянув в apk, так как это всего лишь zip. Внутри будет папка lib с родными библиотеками:

lib
+-armeabi-v7a
| \-nativeLib.so
\-etc.

Без разделения вы должны получить один apk с несколькими архитектурами в папке lib. С разделениями вы получите несколько apks с одной архитектурой каждый.

Не могли бы вы уточнить - You do not need to have separate .aar files in order for apk splits to work. You can have single .aar with native libs for multiple architectures and you will get multiple apks each for single arch.

ClassA 13.09.2018 17:37

Как бы я это сделал? Вы упомянули, что я могу использовать один aar с несколькими собственными библиотеками, но библиотека включает только файлы aar, показанные в моем вопросе?

ClassA 13.09.2018 17:43
Ответ принят как подходящий

Вы можете сгенерировать различные APK, используя разновидности продукта, которые определяют желаемый целевой ABI. Затем вы можете указать, какую зависимость FMMR gradle или автономный файл AAR использовать в зависимости от каждой разновидности продукта. См. Этот файл build.gradle для справки:

apply plugin: 'com.android.application'

apply plugin: 'kotlin-android'

apply plugin: 'kotlin-android-extensions'

android {
    compileSdkVersion 28
    defaultConfig {
        applicationId "com.wseemann.example"
        minSdkVersion 15
        targetSdkVersion 28
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }

    flavorDimensions "version"
    productFlavors {
        fat {
            ndk {
                abiFilters "armeabi", "armeabi-v7a", "x86", "mips", "x86_64", "arm64-v8a"
            }
        }

        armeabi {
            ndk {
                abiFilter "armeabi"
            }
        }

        armeabi_v7a {
            ndk {
                abiFilter "armeabi-v7a"
            }
        }

        x86 {
            ndk {
                abiFilter "x86"
            }
        }

        mips {
            ndk {
                abiFilter "mips"
            }
        }

        x86_64 {
            ndk {
                abiFilter "x86_64"
            }
        }

        arm64_v8a {
            ndk {
                abiFilter "arm64-v8a"
            }
        }
    }
}

dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])
    implementation"org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
    implementation 'com.android.support:appcompat-v7:28.0.0-rc01'
    implementation 'com.android.support.constraint:constraint-layout:1.1.2'
    testImplementation 'junit:junit:4.12'
    androidTestImplementation 'com.android.support.test:runner:1.0.2'
    androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'

    // Product flavor, ABI specific dependencies
    fatImplementation 'com.github.wseemann:FFmpegMediaMetadataRetriever:1.0.14'
    armeabiImplementation 'com.github.wseemann:FFmpegMediaMetadataRetriever-armeabi:1.0.14'
    armeabi_v7aImplementation'com.github.wseemann:FFmpegMediaMetadataRetriever-armeabi-v7a:1.0.14'
    x86Implementation 'com.github.wseemann:FFmpegMediaMetadataRetriever-x86:1.0.14'
    mipsImplementation 'com.github.wseemann:FFmpegMediaMetadataRetriever-mips:1.0.14'
    x86_64Implementation 'com.github.wseemann:FFmpegMediaMetadataRetriever-x86_64:1.0.14'
    arm64_v8aImplementation 'com.github.wseemann:FFmpegMediaMetadataRetriever-arm64-v8a:1.0.14'
}

Другие вопросы по теме