为不同的架构生成 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
文件:
我的问题:
- 我应该将
.aar
文件按原样放在我的 libs
文件夹中(不为每个体系结构创建文件夹),还是应该将其添加到文件夹中?
我应该使用以上哪些 .aar
文件来支持所有架构?
在 post 他还谈到了版本控制,这是必要的吗(我的应用程序是实时的,我不想搞乱版本控制 - 我目前版本是 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
}
}
我正在寻找可能使用过 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'
}
我正忙于将 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
文件:
我的问题:
- 我应该将
.aar
文件按原样放在我的libs
文件夹中(不为每个体系结构创建文件夹),还是应该将其添加到文件夹中? 我应该使用以上哪些.aar
文件来支持所有架构?在 post 他还谈到了版本控制,这是必要的吗(我的应用程序是实时的,我不想搞乱版本控制- 我目前版本是 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
}
}
我正在寻找可能使用过 FFmpegMediaMetadataRetriever
的 .aar
文件的人,可以指导我如何正确实施它。
编辑 1
在了解 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'
}