我试图建立一个项目,该项目依赖于使用“ .so”文件的库模块。
到目前为止,我有:
库模块
.so文件进入jniLib:armeabi,armeabi-v7a和x86。
这是用于配置的Android.mk文件:
#版权所有(C)2010 The Android Open Source Project # #根据Apache许可证2.0版(“许可证”)获得许可; #除非符合许可,否则您不得使用此文件。 #您可以在以下位置获得许可的副本 # #http://www.apache.org/licenses/LICENSE-2.0 # #除非适用法律要求或书面同意,否则软件 根据许可协议分发的#是按“原样”分发的, #没有任何明示或暗示的保证或条件。 #有关特定语言的管理权限,请参阅许可证。 #许可中的限制。 LOCAL_PATH:= $(调用my-dir) 包括$(CLEAR_VARS) #在这里我们给出模块名称和源文件 LOCAL_MODULE:=我的模块 LOCAL_SRC_FILES:= $(TARGET_ARCH_ABI)/my-lib.so LOCAL_EXPORT_C_INCLUDES:= $(LOCAL_PATH)/ include 包括$(PREBUILT_SHARED_LIBRARY)
这是build.gradle文件:
应用插件:“ com.android.library” android { 编译版本23 buildToolsVersion“ 23.0.2” defaultConfig { minSdkVersion 15 targetSdkVersion 23 版本代码1 versionName“ 1.0” } compileOptions { sourceCompatibility JavaVersion.VERSION_1_7 targetCompatibility JavaVersion.VERSION_1_7 } buildTypes { 发布 { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android.txt'),'proguard-rules.pro' } } sourceSets.main.jni.srcDirs = [] //禁用自动ndk-build调用 //默认情况下,将发布样式设置为 defaultPublishConfig“ X86Debug” publishNonDefault true productFlavors { //有关abiFilter的详细说明,请参阅“支持的ABI” @ // https://developer.android.com/ndk/guides/abis.html#sa 手臂{ ndk { abiFilter(“ armeabi”) } } arm7 { ndk { abiFilter(“ armeabi-v7a”) } } x86 { ndk { abiFilter(“ x86”) } } //这是包含所有ABI的胖APK 脂肪 } } 依赖项{ testCompile'junit:junit:4.12' 编译'com.j256.ormlite:ormlite-android:4.48' }应用模块
这是build.gradle:
... 应用插件:“ com.android.application” ... android { ... //如果要对多个口味应用多个过滤器,则顺序很重要 flavourDimensions“ api”,“ abi” productFlavors { //定义单独的dev和prod产品风格。 开发{ 维度“ api” //开发人员利用minSDKVersion = 21允许Android gradle插件 //预先处理每个模块并生成可在其中测试的APK // Android Lollipop,无需耗时的dex合并过程。 minSdkVersion 21 } 产品{ 维度“ api” //应用程序的实际minSdkVersion。 minSdkVersion Integer.parseInt((String)project.ANDROID_BUILD_MIN_SDK_VERSION) } //有关abiFilter的详细说明,请参阅“支持的ABI” @ // https://developer.android.com/ndk/guides/abis.html#sa 手臂{ 尺寸“ abi” ndk { abiFilter(“ armeabi”) } } arm7 { 尺寸“ abi” ndk { abiFilter(“ armeabi-v7a”) } } x86 { 尺寸“ abi” ndk { abiFilter(“ x86”) } } } ... buildTypes { 发布 { //禁用所有组件进行调试 可调试假 //使用更新的Proguard规则 proguardFiles getDefaultProguardFile('proguard-android.txt'),'proguard-rules.pro' //混淆,清理和优化项目代码 minifyEnabled是 //启用zip align进行优化 zipAlignEnabled是 //仅在发布buildType上使用发布键 signingConfig signingConfigs.prod } 调试{ 可调试true minifyEnabled false zipAlignEnabled false } } ... compileOptions { sourceCompatibility JavaVersion.VERSION_1_7 targetCompatibility JavaVersion.VERSION_1_7 } } 配置{ // x86版本 devX86DebugCompile prodX86DebugCompile devX86ReleaseCompile prodX86ReleaseCompile //手臂版本 devArmDebugCompile prodArmDebugCompile devArmReleaseCompile prodArmReleaseCompile // arm7版本 devArm7DebugCompile prodArm7DebugCompile devArm7ReleaseCompile prodArm7ReleaseCompile } 依赖项{ 编译fileTree(include:['* .jar'],dir:'libs') devX86DebugCompile项目(路径:':my-module-lib',配置:'x86Debug') prodX86DebugCompile项目(路径:':my-module-lib',配置:'x86Debug') devX86ReleaseCompile项目(路径:':my-module-lib',配置:'x86Release') prodX86ReleaseCompile项目(路径:':my-module-lib',配置:'x86Release') devArmDebugCompile项目(路径:':my-module-lib',配置:'armDebug') prodArmDebugCompile项目(路径:':my-module-lib',配置:'armDebug') devArmReleaseCompile项目(路径:':my-module-lib',配置:'armRelease') prodArmReleaseCompile项目(路径:':my-module-lib',配置:'armRelease') devArm7DebugCompile项目(路径:':my-module-lib',配置:'arm7Debug') prodArm7DebugCompile项目(路径:':my-module-lib',配置:'arm7Debug') devArm7ReleaseCompile项目(路径:':my-module-lib',配置:'arm7Release') prodArm7ReleaseCompile项目(路径:':my-module-lib',配置:'arm7Release') ... }
这似乎当前有效(至少在编译时有效),但是我觉得很难像这样维护它,并且我必须添加很多依赖项和配置(最后,我要支持所有ABI,以便每个apk)。
有没有更简单,更清洁的方式来做这样的事情?
此外,在生成的APK中,所有ABI都包括在内。我为此做错了吗?
我已经解决了所有ABI都包含在APK中的问题。我只需要在应用程序模块的productFlavors中使用abiFilter。我已经更新了代码以反映这一点。我只注意到了一个小问题:库模块的结果aar仍然包括所有ABI,即使它已针对每种口味正确设置了abiFilter。