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(我不是作者)
使用库的注意事项/aar
s:
但是,使用库时会遇到一个主要问题(aar
而不是 apk
)。恕我直言,您不能(自动)创建不同的 ABI 特定 aar
s。相反,您创建 aar
s 包含所有 ABI 的二进制文件。将 aar
添加到 android 应用程序时,您在应用程序 build.gradle
中指定 splits
如上所述。
我正在尝试为所有架构构建通用 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(我不是作者)
使用库的注意事项/aar
s:
但是,使用库时会遇到一个主要问题(aar
而不是 apk
)。恕我直言,您不能(自动)创建不同的 ABI 特定 aar
s。相反,您创建 aar
s 包含所有 ABI 的二进制文件。将 aar
添加到 android 应用程序时,您在应用程序 build.gradle
中指定 splits
如上所述。