我正在尝试设置一个依赖于使用“.so”文件的库模块的项目。
直到现在我有:
# Copyright (C) 2010 The Android Open Source Project # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. LOCAL_PATH:= $(call my-dir) include $(CLEAR_VARS) # Here we give our module name and source file(s) LOCAL_MODULE := my-module LOCAL_SRC_FILES := $(TARGET_ARCH_ABI)/my-lib.so LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/include include $(PREBUILT_SHARED_LIBRARY)
apply plugin: 'com.android.library' android { compileSdkVersion 23 buildToolsVersion "23.0.2" defaultConfig { minSdkVersion 15 targetSdkVersion 23 versionCode 1 versionName "1.0" } compileOptions { sourceCompatibility JavaVersion.VERSION_1_7 targetCompatibility JavaVersion.VERSION_1_7 } buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } } sourceSets.main.jni.srcDirs = [] //disable automatic ndk-build call // By default set the publish flavor to defaultPublishConfig "X86Debug" publishNonDefault true productFlavors { // for detailed abiFilter descriptions, refer to "Supported ABIs" @ // https://developer.android.com/ndk/guides/abis.html#sa arm { ndk { abiFilter("armeabi") } } arm7 { ndk { abiFilter("armeabi-v7a") } } x86 { ndk { abiFilter("x86") } } // This is the fat apk which includes all the ABIs fat } } dependencies { testCompile 'junit:junit:4.12' compile 'com.j256.ormlite:ormlite-android:4.48' }
... apply plugin: 'com.android.application' ... android { ... // In case more than one filter should be applied for the flavors, the order is important flavorDimensions "api", "abi" productFlavors { // Define separate dev and prod product flavors. dev { dimension "api" // dev utilizes minSDKVersion = 21 to allow the Android gradle plugin // to pre-dex each module and produce an APK that can be tested on // Android Lollipop without time consuming dex merging processes. minSdkVersion 21 } prod { dimension "api" // The actual minSdkVersion for the application. minSdkVersion Integer.parseInt((String) project.ANDROID_BUILD_MIN_SDK_VERSION) } // for detailed abiFilter descriptions, refer to "Supported ABIs" @ // https://developer.android.com/ndk/guides/abis.html#sa arm { dimension "abi" ndk { abiFilter("armeabi") } } arm7 { dimension "abi" ndk { abiFilter("armeabi-v7a") } } x86 { dimension "abi" ndk { abiFilter("x86") } } } ... buildTypes { release { // Disable all components for debug debuggable false // Use the updated proguard rules proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' // Obfuscate, clean and optimize project code minifyEnabled true // Enable zip align for optimizations zipAlignEnabled true //Only use the release key on a release buildType signingConfig signingConfigs.prod } debug { debuggable true minifyEnabled false zipAlignEnabled false } } ... compileOptions { sourceCompatibility JavaVersion.VERSION_1_7 targetCompatibility JavaVersion.VERSION_1_7 } } configurations { // x86 versions devX86DebugCompile prodX86DebugCompile devX86ReleaseCompile prodX86ReleaseCompile // arm versions devArmDebugCompile prodArmDebugCompile devArmReleaseCompile prodArmReleaseCompile // arm7 versions devArm7DebugCompile prodArm7DebugCompile devArm7ReleaseCompile prodArm7ReleaseCompile } dependencies { compile fileTree(include: ['*.jar'], dir: 'libs') devX86DebugCompile project(path: ':my-module-lib', configuration: 'x86Debug') prodX86DebugCompile project(path: ':my-module-lib', configuration: 'x86Debug') devX86ReleaseCompile project(path: ':my-module-lib', configuration: 'x86Release') prodX86ReleaseCompile project(path: ':my-module-lib', configuration: 'x86Release') devArmDebugCompile project(path: ':my-module-lib', configuration: 'armDebug') prodArmDebugCompile project(path: ':my-module-lib', configuration: 'armDebug') devArmReleaseCompile project(path: ':my-module-lib', configuration: 'armRelease') prodArmReleaseCompile project(path: ':my-module-lib', configuration: 'armRelease') devArm7DebugCompile project(path: ':my-module-lib', configuration: 'arm7Debug') prodArm7DebugCompile project(path: ':my-module-lib', configuration: 'arm7Debug') devArm7ReleaseCompile project(path: ':my-module-lib', configuration: 'arm7Release') prodArm7ReleaseCompile project(path: ':my-module-lib', configuration: 'arm7Release') ... }
这似乎目前有效(至少在编译时),但我觉得很难像这样维护它,我将不得不添加很多依赖项和配置(最后我想支持所有ABI ,为每个人制作一个apk。
有更简单,更清洁的方式来做这样的事情吗?
此外,在生成的APK中,包括所有ABI。我为此做错了什么?
我已经修复了包含在APK中的所有ABI的问题。我只需要在应用程序模块的productFlavors中使用abiFilter。 我已经更新了我的代码以反映这一点。 我注意到只有一个小问题:库模块的结果仍然包括所有ABI,即使它已经为每种风格正确设置了abiFilter。