AS1.3 及其以上预览版新插件-实验版(NDK)

在新版的AS预览版中我发现对于NDK的支持有所变化。
在新的插件版本中加强了对NDK的支持以及性能的优化。
于是查询了一下文档,特此写了该文章,为尝鲜的朋友准备,喜欢尝鲜的朋友可以试试,个人感觉味道不错。
在之前版本的时候我写过如何在AS中编译NDK:
[Android] 环境配置之Android Studio开发NDK

本篇文章是一篇半翻译文章,来源于AS的说明文档,在文章底部会附上原文链接。
本篇文章中的东西来源于预览版,本文章中的方法已测试有效;但不建议用于生产开发。

介绍

这是一个新的试验性插件,该组建基于新的Gradle组建模型;在配置上能显著减少时间。在新的插件中包括了使用JNI开发NDK的一键式操作。在本指南中提供了详细的使用方式,同时强调了新的插件与原始插件之间的区别。

警告:该插件是试验性插件。有关该插件的Gradle API也并不是最终版本。这意味着他只是特定版本的API,也可能只能在特定版本中使用。

此外。DSL可能发生大量改变,在最终版本中有可能采用新的API代替。

该实验插件是改善了NDK集成与性能相关的早期预览版本(这两个问题来自于用户反馈)。

需求

  • Gradle 2.5 (仅仅)
  • Android NDK R10e 版本(如果你需要使用NDK)
  • SDK 构建工具最低版本 19.0.0 ,一些功能可能需要更新的版本
  • AS 1.3 预览版及其更高版本

迁移

从之前版本迁移到最新预览版。在下面显示了新的预览版的项目结构,更改的地方使用红色表示。

这里写图片描述

./gradle/wrapper/gradle-wrapper.properties

新的插件仅仅只支持 gradle-2.5.

#Wed Apr 10 15:27:10 PDT 2013
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
distributionUrl=https://services.gradle.org/distributions/gradle-2.5-all.zip

./build.gradle

其中Classpath 应该配置为 com.android.tools.build:gradle-experimental 以前是 com.android.tools.build:gradle
当前可使用版本为: 0.2.0.

// 提示: 顶层配置,你也可以在你的子项目或者子Model中添加对应配置

buildscript {
    repositories {
        jcenter()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle-experimental:0.2.0'

        // 提示: 别把项目所需依赖写在这里,他们属于Model中的 build.gradle 文件
    }
}

allprojects {
    repositories {
        jcenter()
    }
}

./app/build.gradle

在该插件中有着许多有关DSL变化。其中很多变化似乎有些奇葩,并不必要;因为在我看来插件变化应该尽量简单以减少插件迁移的代价。

DSL 变更:
  • Apply 默认插件名现在是 com.android.model.application 在之前的版本中是:com.android.application. 如果我们的Model是另外的库或者aar 那么现在应该为: com.android.model.library
  • 根配置应该加上 model { } 模块
  • 大多属性应该加上 '=' 操作符
  • 如果是为集合添加对应的元素应该使用 '+=' 操作符
使得 DSL 更局限性的变更:
  • buildTypes, productFlavors 和 signingConfigs 配置必须写在 android { } 模块以外
  • 能在 android { } 模块中嵌套使用的配置需要加上with 关键字.
  • 属性也将只能使用所支持的直接属性,而没法使用其他类型而后进行转换(如果该属性是int类型,将只能输入int值,而不能是string字符然后强制转换)。例如:
    • 文件类型属性将直接接受文件类型,而不接受String类型。
    • 不能直接使用 minSdkVersion 接受一个 int 或者 string 类型,而需要写为:minSdkVersion.apiLevel = 15.
  • 创建一个buildType 或者 productFlavor 等标记需要调用 create方法. 修改一个现有的,如buildType中的release或者debug标记可以直接使用名称就可以了.
  • 现在修改DSL 的变量或者任务是非常非常局限的.
    这里写图片描述
dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    compile 'com.android.support:appcompat-v7:22.2.0'
}

NDK 相关

在该实验插件中使用NDK创建Android本地程序。 你需要:
使用下载工具下载 NDK 包并配置好环境.
在项目local.properties 文件中设置 ndk.dir 变量并指定你的 NDK 路径,也可以在环境变量中设置 ANDROID_NDK_HOME 为你计算机上的 NDK 路径.
在你的 model 中的 build.gradle 文件中添加 android.ndk 板块.

已知局限

  • 不支持NDK-only模块;仅仅支持混合的app或者lib库的项目编译。
  • 编译项目时并不会重复编译已编译完成的JNI代码(AAR库中的所有so文件仅仅只是简单打包到APK中,不会进行重复编译)。
  • 不支持创建可依赖静态库。
  • 不支持使用诸如cpu_features 的NDK库。
  • 不支持集成外部构建系统。

Model 中的 build.gradle 中的 NDK 配置诸如这样:
这里写图片描述

提示:项目中的 moduleName 属性是必须的,它定义了 NDK 所生成的文件名。

默认情况下,JNI 文件应该放到项目的目录为:src/main/jni ,在其中你可以放C/C++代码;当然你也可以重新定义该默认目录。

model {
    android {
        compileSdkVersion = 22
        buildToolsVersion = "22.0.1"
    }
    android.ndk {
        moduleName = "native"
    }
    android.sources {
        main {
            jni {
                source {
                    srcDir 'src'
                }
            }
        }
    }
}

其他的编译属性你可以设置到android.ndk { } 模块中,诸如:

model {
    android {
        compileSdkVersion = 22
        buildToolsVersion = "22.0.1"
    }
    android.ndk {
        // 所有可以在 android.ndk 中定义的配置.
        moduleName = "native"
        toolchain = "clang"
        toolchainVersion = "3.5"

        // 提示:CFlags 是一个C的资源, 其命名与常规的属性并不一样.  这是一个技术限制,但在以后会解决。

        CFlags += "-DCUSTOM_DEFINE"
        cppFlags += "-DCUSTOM_DEFINE"
        ldFlags += "-L/custom/lib/path"
        ldLibs += "log"
        stl = "stlport_static"
    }
    android.buildTypes {
        release {
            ndk.with {
                debuggable = true
            }
        }
    }
    android.productFlavors {
        create("arm") {
            ndk.with {
                // 你可以在 productFlavors 和 buildTypes 节点中配置 NDK 相关的属性
                abiFilters += "armeabi-v7a"
            }
        }
        create("fat") {
            // 如果未指定 ndk.abiFilters 属性,那么将会生成所有的CPU版本ABI.
        }
    }

    // 你可以修改所有的 NDK 属性
    components.android {
        binaries.afterEach { binary ->
            binary.mergedNdkConfig.cppFlags.add(
                    "-DVARIANT=\"" + binary.name + "\"")
        }
    }
}

原文链接

需要梯子:
http://tools.android.com/tech-docs/new-build-system/gradle-experimental

案例

这里有一些Google官方的案例,地址:
https://github.com/googlesamples/android-ndk.
我的博客中的案例会放到:
https://github.com/qiujuer/BeFoot

========================================================
作者:qiujuer
博客:blog.csdn.net/qiujuer
网站:www.qiujuer.net
开源库:github.com/qiujuer/Genius-Android
开源库:github.com/qiujuer/Blink
转载请注明出处:http://blog.csdn.net/qiujuer/article/details/47961763
—— 学之开源,用于开源;初学者的心态,与君共勉!

========================================================

  • 4
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 7
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值