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 = 22buildToolsVersion = "22.0.1"}android.ndk {moduleName = "native"}android.sources {main {jni {source {srcDir 'src'}}}}
}
其他的编译属性你可以设置到android.ndk { }
模块中,诸如:
model {android {compileSdkVersion = 22buildToolsVersion = "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)相关推荐
- 帆软报表获取单元格的值的几种方式,包括分页预览,填报预览,新填报预览
帆软报表获取单元格的值的方式在分页预览,填报预览,新填报预览都是不同的,没有统一的方式,这给使用者带来一定的不便.现在总结一下. 分页预览: getCellValue: function (cellP ...
- pdfh5.js 基于pdf.js和jQuery,web/h5/移动端PDF预览手势缩放插件。
pdfh5.js 基于pdf.js和jQuery,web/h5/移动端PDF预览手势缩放插件. 注意:本地绝对路径地址不能加载,跨域问题用代理或者服务端解决. svg模式渲染存在缺陷,只能渲染普通pd ...
- VUE图片预览放大缩小插件viewer
VUE图片预览放大缩小插件viewer 一.安装依赖 npm install v-viewer --save 二.main.js内引用并注册调用 //main.js import Viewer fro ...
- 360度商品展示html5,360度图片旋转产品预览展示js插件
这是一款360度图片旋转产品预览展示js插件.该360度图片旋转产品预览js插件提供多种控制产品图片旋转的方法,包括自动旋转,通过按钮来控制旋转,通过鼠标拖拽或鼠标移动来控制旋转,通过鼠标滚轮来控制旋 ...
- html制作手机预览效果,新移动端Html5方式预览报表插件
2. Html5报表制作及手机效果 2.1 手机页面大小 制作手机上的报表与PC端报表制作过程是一样的,为了让用户制作出适合手机尺寸的报表,在模板>>移动端属性地方,勾选设置为手机模板画布 ...
- 不同手机型号图文预览_分分钟教你使用手机预览原型图(MAC版)
在网上看了很多人都使用EasyWebSvr做一个本地服务器,然后将做好的原型文件装进去,手机打开浏览器就可以预览原型图啦~ 但是MAC系统没有EasyWebSvr怎么办? 不用担心,很简单~ 步骤 设 ...
- 微信小程序点击图片放大预览,新页面中全屏预览图片
第一步:在wxml中定义image组件,并设置绑定事件. <image src="{{priceUrl}}" bindtap="imgClick"> ...
- office(doc,xls,txt,pdf,ppt)文档在线预览及转换(office2pdf) - PHP版
最近项目想用到"文档在线预览",参考了一下 使用OpenOffice.org将各类文档转为PDF 本想用OpenOffice的类, 但OpenOffice的类太复杂了.. 后来想到 ...
- 【VUE】图片预览放大缩小插件(推荐阅读)
From: https://www.jianshu.com/p/e3350aa1b0d0 在看项目时,突然看到预览图片的弹窗,感觉好僵硬,不能放大,不能切换,于是便在网上找下关于图片预览的插件,有找到 ...
- 图片上传本地预览(回显)插件
图片上传本地预览插件,本示例只是静态页面,请下载完整的示例查看 请下载完整的js和css样式,以及Demo <html><title>文件上传</title>< ...
最新文章
- 逆元~(乘法逆元及其应用)
- Android 中intent传递序列化信息(传递类)
- windows10怎么安装python第三方库_怎么在windows下安装python第三方包
- uniapp返回上一页_一例万级写入并发,百亿级数据,毫秒级返回架构分享
- Symbol MC1000 扫描 冲突问题 把下面文件做成scanwedge.reg的注册表文件,放在Application重起
- 1m带宽可以做mysql数据库吗_服务器的1M带宽够用吗?1M网速是多少?
- Spring Boot 中文索引--资料大全
- omnigraffle 画曲线_「技法」三步学会用绘图利器 OmniGraffle 绘制流程图
- GridView常用代码 (转)
- BroadcastReceiver 用于接收广播
- React Native系列文章
- Introduce Local Extension
- MYSQL 8.0 OCP
- svm公式推导及理解
- Python 通过微信控制实现app定位发送到个人服务器再转发微信服务器接收位置信息
- (译)理解ConstraintLayout性能上的好处
- windows10 原版 纯净版 下载
- 了解WEB前端开发吗,风风雨雨30年,前端开发变迁史
- Vue 防抖节流 详细介绍(面试常客、去繁从简、性能优化)
- u8查找文件服务器的数据,u8数据库服务器名怎么查找
热门文章
- 基础集合论 第二章 9 族
- java添加录音,大家说说java程序里怎么插入视频和音频啊
- 复旦nlp实验室 nlp-beginner 任务二:基于深度学习的文本分类
- 联合索引(a,b,c),怎么单独检索b用上索引
- html自动旋转屏幕,求教!HTML5屏幕旋转90度再让画布自适应,该如何做,大神给留demo...
- c语言编写面条排序算法,腾讯PCG事业部腾讯视频面经
- java 接口 同名方法_java 实现多个接口 方法重名的解决办法——内部类
- 使用CefSharp在.NET中嵌入Google kernel
- Jenkins集群搭建
- [Selenium+Java] Selenium Framework: Keyword Driven Hybrid