请参阅编辑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
文件:
我的问题:
.aar
文件原样放置在我的libs
文件夹中(不为每种体系结构创建文件夹),还是应该将其添加到文件夹中?.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
}
}
我正在寻找可能使用过.aar
的{{1}}个文件的人,这些文件可以为我提供有关如何正确实现它的指导。
在学习了more关于不同体系结构/ ABI的知识之后,我认为可以说,如果仅包含FFmpegMediaMetadataRetriever
,那么大多数设备都将被“覆盖”? (我的最低sdk是16)。
那是否意味着我不必拆分APK,也不必担心版本问题?
然后我可以照常导入armeabi-v7a
-.aar
吗?
答案 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。