为不同的架构生成 APK - FFmpegMediaMetadataRetriever

Generate APK for different architectures - FFmpegMediaMetadataRetriever

我正忙于将 FFmpegMediaMetadataRetriever 预构建 .aar 文件添加到我的项目中,以减少每个架构的 Apk 文件大小。

This post 在他的 Gradle 中添加了以下内容:

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
        }
    }
    //...    
}

FFmpegMediaMetadataRetriever 库提供以下 .aar 文件:


我的问题:

他是这样实现版本控制的:

// 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
    }
}

我正在寻找可能使用过 FFmpegMediaMetadataRetriever.aar 文件的人,可以指导我如何正确实施它。

编辑 1

在了解 不同的 architectures/ABI 之后,我 认为 可以肯定地说,如果我只包含 armeabi-v7a 那么大多数设备将是 "covered"? (我的最小 sdk 是 16)。

这是否意味着我不必拆分 APK,也不必担心版本控制?

然后我可以像往常一样导入 .aar - armv7-fmmr.aar 吗?

首先,你不应该想当然地认为 armeabi-v7a 会让你 "covered"。根据这个 blog post:

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.

您不需要单独的 .aar 文件来使 apk 拆分工作。对于多个体系结构,您可以使用带有本机库的单个 .aar,并且每个体系结构都将获得多个 apk。

如果您已经有多个要使用的 .aar 文件并且每个文件都具有这样的结构,但只有一个体系结构,那么您不需要按体系结构创建文件夹来保存它们。相反,您可以包含它们,希望它们会合并到 apk 中。

您可以通过查看 apk 内部来检查它是否有效,因为它只是一个 zip。里面会有带有原生库的 lib 文件夹:

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

如果没有拆分,您应该在其 lib 文件夹中获得具有多个体系结构的单个 apk。通过拆分,您将获得多个具有单一架构的 apk。

您可以使用指定所需目标 ABI 的产品风格生成不同的 APK。然后,您可以根据每种产品风格指定要使用的 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'
}