生成适用于不同架构的APK-FFmpegMediaMetadataRetriever

时间:2018-09-10 07:38:49

标签: java android apk

请参阅编辑1


我正忙于向项目中添加FFmpegMediaMetadataRetriever个预构建.aar文件,以减少每种体系结构的Apk文件大小。

This帖子在他的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文件:

image


我的问题:

  • 我应该将.aar文件原样放置在我的libs文件夹中(不为每种体系结构创建文件夹),还是应该将其添加到文件夹中?
  • 我应该使用哪个.aar个文件来支持所有体系结构?
  • 在帖子中他还谈到了版本控制,这是否有必要(我的应用程序处于活动状态,我不想弄乱版本控制-我的当前版本为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的{​​{1}}个文件的人,这些文件可以为我提供有关如何正确实现它的指导。


编辑1:

在学习了more关于不同体系结构/ ABI的知识之后,我认为可以说,如果仅包含FFmpegMediaMetadataRetriever,那么大多数设备都将被“覆盖”? (我的最低sdk是16)。

那是否意味着我不必拆分APK,也不必担心版本问题?

然后我可以照常导入armeabi-v7a-.aar吗?

2 个答案:

答案 0 :(得分:1)

您可以使用指定所需目标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'
}

答案 1 :(得分:0)

首先,您不应该想当然,armeabi-v7a会让您“被发现”。按照此blog post

  

2019年8月,Play将要求具有本机库的新应用程序和应用程序更新除了提供32位版本外,还必须提供64位版本。

在查看您提到的项目后进行编辑

使用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)来检查它是否有效。里面有带有本地libs的lib文件夹:

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

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