实验插件是啥
在 Android Studio 1.3.0 中 Google 为支持NDK ,添加了 实验插件 (experimental-plugin) ,想要在 Android Studio 中完成 Native 的编译构建工作,就必须要用到该插件。
注意: 该插件仍然处于实验阶段, 并非 Google 为在 Android Studio 上支持 NDK 开发的最终版本,将来可能还会改动。
使用该插件有三个要求
- Gradle 版本必须是2.5
- Android NDK r10e
- SDK build tool 19.0.0 以上
实验插件和传统插件的异同
实验插件和传统插件有三处不同,接下来分别对每处不同进行比较。
1. /gradle/wrapper/gradle-wrapper.properties
该文件中有一属性distributionUrl
,标识内置 gradle 版本 必须是 2.5
2. project ==>/build.gradle
传统插件的构建脚本依赖 classpath 是 com.android.tools.build:gradle:1.3.0
1 2 3 4 5 6 7 8
| buildscript { repositories { jcenter() } dependencies { classpath 'com.android.tools.build:gradle:1.3.0' } }
|
而实验插件 构建脚本指定的 classpath 却是 com.android.tools.build:gradle-experimental:0.2.0
,目前实验插件最新版本是 0.2.0
1 2 3 4 5 6 7 8
| buildscript { repositories { jcenter() } dependencies { classpath 'com.android.tools.build:gradle-experimental:0.2.0' } }
|
3. module ==>/app/build.gradle
传统 build.gradle 脚本,大致结构是这样的:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| apply plugin: 'com.android.application' android { compileSdkVersion 22 buildToolsVersion "22.0.1" defaultConfig { ... } buildTypes { ... } productFlavors{ ... } } dependencies { ... }
|
然而对于实验插件, build.gradle 脚本却是下面这种格式:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| apply plugin: 'com.android.model.application' model { android { compileSdkVersion = 22 buildToolsVersion = "22.0.1" defaultConfig.with { ... } } android.ndk { ... } android.sources { ... } android.productFlavors { ... } } dependencies { ... }
|
首先导入的插件是 apply plugin: 'com.android.model.application'
,然后所有配置由 model 模块包装,其中又嵌入了 android、android.ndk 、android.sources、android.productFlavors 等模块,项目依赖 dependencies 与 model 模块同级,接下来看一下各个模块的语法。
android.ndk 这个模块必须声明 moduleName ,构建时会以 moduleName 命名所需要生成的so库,所有对native的配置都在该模块下进行
1 2 3 4 5 6 7 8 9 10
| android.ndk { moduleName = "native" toolchain = "clang" toolchainVersion = "3.5" CFlags += "-DCUSTOM_DEFINE" cppFlags += "-DCUSTOM_DEFINE" ldFlags += "-L/custom/lib/path" ldLibs += "log" stl = "stlport_static" }
|
android.sources 配置 JNI 源代码路径
1 2 3 4 5 6 7 8 9
| android.sources { main { java { source { srcDirs 'src/main/jni' } } } }
|
android.productFlavors 配置构建项目时需要生成的不同平台 abi 的 so 库
1 2 3 4 5 6 7 8 9 10 11 12 13
| android.productFlavors { create ("arm7") { ndk.abiFilters += "armeabi-v7a" } create ("arm8") { ndk.abiFilters += "arm64-v8a" } create ("x86-32") { ndk.abiFilters += "x86" } create("all") }
|
android 这个模块和上述的其他模块 ,我们看到所有属性的配置都改用 =
号连接,其中又嵌套了 defaultConfig 模块,同样用 =
号配置
1 2 3 4 5 6 7 8 9
| android { compileSdkVersion = 22 buildToolsVersion = "22.0.1" defaultConfig.with { applicationId = "com.sample.teapot" minSdkVersion.apiLevel = 17 targetSdkVersion.apiLevel = 21 } }
|
4.Samples
关于 Android Studio 上开发 JNI , 有很多官方提供的例子,戳这里Github