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

Posted Qiujuer

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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
—— 学之开源,用于开源;初学者的心态,与君共勉!

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

以上是关于AS1.3 及其以上预览版新插件-实验版(NDK)的主要内容,如果未能解决你的问题,请参考以下文章

MySQL 5.7.9 GA稳定版新特性解读

Rancher v2.6.4 社区版新特性解读

一文掌握Flutter for Windows桌面端稳定版新特性

一文掌握Flutter for Windows桌面端稳定版新特性

一文掌握Flutter for Windows桌面端稳定版新特性

六年级下册数学书上的练习九答案(人教版新课标,网址也行)高分在线等快!