Android gradle,不同架构的本地库

Android gradle, native libs for different architectures

我正在尝试为所有架构构建通用 apk。这是我的项目结构:

-App
    -appModule
    -libraryModule
         -libs
             -armeabi
                 -lib.so
         -src
             -java
             -jni

这是我的 gradle libraryModule 文件:

apply plugin: 'com.android.library'

//    


android {
    compileSdkVersion 23
    buildToolsVersion "23.0.2"

    defaultConfig {
        ndk {
            moduleName "ProxyResolver" // <-- This is the name of AndroidProxy native module
            stl "gnustl_shared"
            cFlags "-std=c++11"
            abiFilters = ['armeabi']
            ldLibs (projectDir.absolutePath + "/libs/armeabi/libresolver.so")
        }
    }

    sourceSets {
        main {
            jniLibs.srcDirs = ['libs']
        }
    }
}

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
}

如您所见,库的路径是硬编码。现在它 可以在 arm-v7 处理器上工作 。但是我需要添加对 x86 的支持而不添加风味

我猜:

ndk {

    moduleName "resolver"
    stl "gnustl_shared"
    cFlags "-std=c++11"
    abiFilters = ['armeabi','arm-v7']
}

并删除

sourceSets {
    main {
        jniLibs.srcDirs = ['libs']
    }
}

在您的 defaultConfig 中设置 abiFilters 只会向应用程序的功能添加信息(仅对安装程序有用,即当您尝试安装的设备不兼容时,安装程​​序会出错)并且不会更改将哪些二进制文件添加到最终 apk,另请参阅 。

我想您想要完成的是针对不同的体系结构设置不同的 apk。这是一个常见的用例,即减少构建大小。您可以通过在应用的 build.gradle 中使用 splits 来完成此操作。请参考https://developer.android.com/studio/build/configure-apk-splits.html.

强烈推荐https://www.neotechsoftware.com/blog/native-libraries-part-i-common-pitfalls(我不是作者)

使用库的注意事项/aars: 但是,使用库时会遇到一个主要问题(aar 而不是 apk)。恕我直言,您不能(自动)创建不同的 ABI 特定 aars。相反,您创建 aars 包含所有 ABI 的二进制文件。将 aar 添加到 android 应用程序时,您在应用程序 build.gradle 中指定 splits 如上所述。