十年网站开发经验 + 多家企业客户 + 靠谱的建站团队
量身定制 + 运营维护+专业推广+无忧售后,网站问题一站解决
You are building a fat APK that includes binaries for android-arm, android-arm64.
巴马ssl适用于网站、小程序/APP、API接口等需要进行数据传输应用场景,ssl证书未来市场广阔!成为成都创新互联公司的ssl证书销售渠道,可以享受市场价格4-6折优惠!如果有意向欢迎电话联系或者加微信:13518219792(备注:SSL证书合作)期待与您的合作!
If you are deploying the app to the Play Store, it's recommended to use app bundles or split the APK to reduce the APK size.
To generate an app bundle, run:
flutter build appbundle --target-platform android-arm,android-arm64
Learn more on:
To split the APKs per ABI, run:
flutter build apk --target-platform android-arm,android-arm64 --split-per-abi
Learn more on:
Initializing gradle... 2.3s
Resolving dependencies... 14.2s
Running Gradle task 'assembleRelease'... ע: E:\work_tool\flutter\.pub-cache\hosted\pub.flutter-io.cn\connectivity-0.4.4\android\src\main\java\io\flutter\plugins\connectivity\ConnectivityPlugin.javaʹ�û????����ѹ�ʱ�� API��
ע: �й���ϸ��Ϣ, ��ʹ�� -Xlint:deprecation ���±��롣
ע: E:\work_tool\flutter\.pub-cache\hosted\pub.flutter-io.cn\url_launcher-5.1.3\android\src\main\java\io\flutter\plugins\urllauncher\WebViewActivity.javaʹ
�û????����ѹ�ʱ�� API��
ע: �й���ϸ��Ϣ, ��ʹ�� -Xlint:deprecation ���±��롣
Calling mockable JAR artifact transform to create file: C:\Users\Administrator\.gradle\caches\transforms-1\files-1.1\android.jar\baf414ed95f14e507d85c560886dfbe2\android.jar with input E:\work_tool\sdk\android-sdk-windows\platforms\android-28\android.jar
Calling mockable JAR artifact transform to create file: C:\Users\Administrator\.gradle\caches\transforms-1\files-1.1\android.jar\ab096bb3fb172ccb785acdb1058c10a9\android.jar with input E:\work_tool\sdk\android-sdk-windows\platforms\android-27\android.jar
Request to incrementing alive workforce from 0. Current workforce (dead or alive) 0
thread-pool size=4
ProGuard, version 6.0.3
Reading input...
Reading program jar [C:\Users\Administrator\.gradle\caches\transforms-1\files-1.1\flutter.jar\ab2691c929f4d2aa57a17fa551e662a6\jetified-flutter.jar] (filtered)
Reading program jar [F:\dartSpace\flutter\jiddspace\nfc\build\app\intermediates\flutter\release\libs.jar] (filtered)
Reading program jar [C:\Users\Administrator\.gradle\caches\transforms-1\files-1.1\localbroadcastmanager-1.0.0.aar\7a407f962902eada026a8e241a760bac\jars\classes.jar] (filtered)
Reading program jar [C:\Users\Administrator\.gradle\caches\transforms-1\files-1.1\work-runtime-2.1.0.aar\8e3a1e8a8ff79006a94df6c01ceeb4f5\jars\classes.jar] (filtered)
Reading program jar [C:\Users\Administrator\.gradle\caches\transforms-1\files-1.1\fragment-1.1.0.aar\4fa7d1b49e3514cb08c8a696f9b59436\jars\classes.jar] (filtered)
Reading program jar [C:\Users\Administrator\.gradle\caches\transforms-1\files-1.1\room-runtime-2.1.0.aar\1b8774fa39759f08defb930275652eac\jars\classes.jar] (filtered)
Reading program jar [C:\Users\Administrator\.gradle\caches\transforms-1\files-1.1\room-runtime-2.1.0.aar\1b8774fa39759f08defb930275652eac\jars\libs\room-common-java8-2.1.0.jar] (filtered)
Reading program jar [C:\Users\Administrator\.gradle\caches\transforms-1\files-1.1\viewpager-1.0.0.aar\885186e7f6f969363bc93cd607d741a5\jars\classes.jar] (filtered)
Reading program jar [C:\Users\Administrator\.gradle\caches\transforms-1\files-1.1\loader-1.0.0.aar\f84f22ad0a97d2c689850b912fc04277\jars\classes.jar] (filtered)
Reading program jar [C:\Users\Administrator\.gradle\caches\transforms-1\files-1.1\activity-1.0.0.aar\a46db1490fae1b9001fc672a24eb288f\jars\classes.jar] (filtered)
Reading program jar [C:\Users\Administrator\.gradle\caches\transforms-1\files-1.1\customview-1.0.0.aar\fe8bf4a709414e884086911d2168b715\jars\classes.jar] (filtered)
Reading program jar [C:\Users\Administrator\.gradle\caches\transforms-1\files-1.1\core-1.1.0.aar\87febb54759dd5a2c7be8e971d745644\jars\classes.jar] (filtered)
Reading program jar [C:\Users\Administrator\.gradle\caches\transforms-1\files-1.1\versionedparcelable-1.1.0.aar\754157c6f50ca4e4cf3ac8d7cb5ced26\jars\classes.jar] (filtered)
Reading program jar [C:\Users\Administrator\.gradle\caches\modules-2\files-2.1\androidx.collection\collection\1.1.0\1f27220b47669781457de0d600849a5de0e89909\collection-1.1.0.jar] (filtered)
Reading program jar [C:\Users\Administrator\.gradle\caches\transforms-1\files-1.1\lifecycle-livedata-2.0.0.aar\de6944801d37d99b1dd0b877649fde1f\jars\classes.jar] (filtered)
Reading program jar [C:\Users\Administrator\.gradle\caches\transforms-1\files-1.1\lifecycle-livedata-core-2.0.0.aar\e21d6663beb6faa41a30fd5a582cb4d9\jars\classes.jar] (filtered)
Reading program jar [C:\Users\Administrator\.gradle\caches\transforms-1\files-1.1\core-runtime-2.0.1.aar\724bb0cc2ce99eaf0a23a99bb1cc5c23\jars\classes.jar] (filtered)
Reading program jar [C:\Users\Administrator\.gradle\caches\modules-2\files-2.1\androidx.room\room-common\2.1.0\b87765704590bd992ea0d92ac50253a9df7818a0\room-common-2.1.0.jar] (filtered)
Reading program jar [C:\Users\Administrator\.gradle\caches\transforms-1\files-1.1\sqlite-framework-2.0.1.aar\9cbdf82e938f7e565620a3682d2406e9\jars\classes.jar] (filtered)
Reading program jar [C:\Users\Administrator\.gradle\caches\transforms-1\files-1.1\sqlite-2.0.1.aar\1215aa5476f752bd431fb2d8059a1a39\jars\classes.jar] (filtered)
Reading program jar [C:\Users\Administrator\.gradle\caches\transforms-1\files-1.1\lifecycle-service-2.0.0.aar\9d24ebd4d6766d7b2cd515369a737934\jars\classes.jar] (filtered)
Reading program jar [C:\Users\Administrator\.gradle\caches\transforms-1\files-1.1\lifecycle-runtime-2.1.0.aar\ca02c0867547ae607130bcc54a4a9ba5\jars\classes.jar] (filtered)
Reading program jar [C:\Users\Administrator\.gradle\caches\transforms-1\files-1.1\lifecycle-viewmodel-2.1.0.aar\594e1ff6298a01d8933530bb534fa472\jars\classes.jar] (filtered)
Reading program jar [C:\Users\Administrator\.gradle\caches\transforms-1\files-1.1\savedstate-1.0.0.aar\8a2c3791a34fc80e5d9d268bf2886f95\jars\classes.jar] (filtered)
Reading program jar [C:\Users\Administrator\.gradle\caches\modules-2\files-2.1\androidx.lifecycle\lifecycle-common\2.1.0\c67e7807d9cd6c329b9d0218b2ec4e505dd340b7\lifecycle-common-2.1.0.jar] (filtered)
Reading program jar [C:\Users\Administrator\.gradle\caches\modules-2\files-2.1\androidx.arch.core\core-common\2.1.0\b3152fc64428c9354344bd89848ecddc09b6f07e\core-common-2.1.0.jar] (filtered)
Reading program jar [C:\Users\Administrator\.gradle\caches\modules-2\files-2.1\androidx.annotation\annotation\1.1.0\e3a6fb2f40e3a3842e6b7472628ba4ce416ea4c8\annotation-1.1.0.jar] (filtered)
Reading program jar [C:\Users\Administrator\.gradle\caches\modules-2\files-2.1\com.google.guava\listenablefuture\1.0\c949a840a6acbc5268d088e47b04177bf90b3cad\listenablefuture-1.0.jar] (filtered)
Reading program jar [F:\dartSpace\flutter\jiddspace\nfc\build\flutter_downloader\intermediates\intermediate-jars\release\classes.jar] (filtered)
Reading program jar [F:\dartSpace\flutter\jiddspace\nfc\build\shared_preferences\intermediates\intermediate-jars\release\classes.jar] (filtered)
Reading program jar [F:\dartSpace\flutter\jiddspace\nfc\build\url_launcher\intermediates\intermediate-jars\release\classes.jar] (filtered)
Reading program jar [F:\dartSpace\flutter\jiddspace\nfc\build\sqflite\intermediates\intermediate-jars\release\classes.jar] (filtered)
Reading program jar [F:\dartSpace\flutter\jiddspace\nfc\build\connectivity\intermediates\intermediate-jars\release\classes.jar] (filtered)
Reading program jar [F:\dartSpace\flutter\jiddspace\nfc\build\path_provider\intermediates\intermediate-jars\release\classes.jar] (filtered)
Reading program jar [F:\dartSpace\flutter\jiddspace\nfc\build\package_info\intermediates\intermediate-jars\release\classes.jar] (filtered)
Reading program directory [F:\dartSpace\flutter\jiddspace\nfc\build\app\intermediates\javac\release\compileReleaseJavaWithJavac\classes] (filtered)
Reading program jar [F:\dartSpace\flutter\jiddspace\nfc\build\app\intermediates\transforms\mergeJavaRes\release\0.jar] (filtered)
Reading library jar [C:\Users\Administrator\.gradle\caches\modules-2\files-2.1\androidx.annotation\annotation\1.0.0\45599f2cd5965ac05a1488fa2a5c0cdd7c499ead\annotation-1.0.0.jar] (filtered)
Reading library jar [E:\work_tool\sdk\android-sdk-windows\platforms\android-28\android.jar]
Reading library jar [E:\work_tool\sdk\android-sdk-windows\build-tools\28.0.3\core-lambda-stubs.jar]
Reading library jar [E:\work_tool\sdk\android-sdk-windows\platforms\android-28\optional\org.apache.http.legacy.jar]
Reading library jar [E:\work_tool\sdk\android-sdk-windows\platforms\android-28\optional\android.test.mock.jar]
Reading library jar [E:\work_tool\sdk\android-sdk-windows\platforms\android-28\optional\android.test.base.jar]
Reading library jar [E:\work_tool\sdk\android-sdk-windows\platforms\android-28\optional\android.test.runner.jar]
Initializing...
Warning: io.flutter.embedding.android.FlutterView: can't find referenced method 'android.graphics.Insets getSystemGestureInsets()' in library class android.view.WindowInsets
Warning: io.flutter.embedding.android.FlutterView: can't find referenced class android.graphics.Insets
Warning: io.flutter.embedding.android.FlutterView: can't find referenced class android.graphics.Insets
Warning: io.flutter.embedding.android.FlutterView: can't find referenced class android.graphics.Insets
Warning: io.flutter.embedding.android.FlutterView: can't find referenced class android.graphics.Insets
Warning: io.flutter.embedding.android.FlutterView: can't find referenced class android.graphics.Insets
Warning: io.flutter.embedding.android.FlutterView: can't find referenced class android.graphics.Insets
Warning: io.flutter.view.FlutterView: can't find referenced method 'android.graphics.Insets getSystemGestureInsets()' in library class android.view.WindowInsets
Warning: io.flutter.view.FlutterView: can't find referenced class android.graphics.Insets
Warning: io.flutter.view.FlutterView: can't find referenced class android.graphics.Insets
Note: io.flutter.view.AccessibilityViewEmbedder$ReflectionAccessors: can't find dynamically referenced class android.util.LongArray
Warning: io.flutter.view.FlutterView: can't find referenced class android.graphics.Insets
Warning: io.flutter.view.FlutterView: can't find referenced class android.graphics.Insets
Warning: io.flutter.view.FlutterView: can't find referenced class android.graphics.Insets
Warning: io.flutter.view.FlutterView: can't find referenced class android.graphics.Insets
Note: there were 1 unresolved dynamic references to classes or interfaces.
You should check if you need to specify additional program jars.
()
Warning: Exception while processing task java.io.IOException: Please correct the above warnings first.
Thread(Tasks limiter_1): destruction
Warning: there were 12 unresolved references to classes or interfaces.
You may need to add missing library jars or update their versions.
If your code works fine without the missing classes, you can suppress
the warnings with '-dontwarn' options.
()
Warning: there were 2 unresolved references to library class members.
You probably need to update the library versions.
()
FAILURE: Build failed with an exception.
* What went wrong:
Execution failed for task ':app:transformClassesAndResourcesWithProguardForRelease'.
Job failed, see logs for details
* Try:
Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output. Run with --scan to get full insights.
* Get more help at
BUILD FAILED in 4m 23s
Running Gradle task 'assembleRelease'...
Running Gradle task 'assembleRelease'... Done 264.4s (!)
*******************************************************************************************
The Gradle failure may have been because of AndroidX incompatibilities in this Flutter app.
See for more information on the problem and how to fix it.
*******************************************************************************************
Gradle task assembleRelease failed with exit code 1
Flutter是Google开发的新一代跨平台方案,Flutter可以实现写一份代码同时运行在iOS和Android设备上,并且提供很好的性能体验。Flutter使用Dart作为开发语言,这是一门简洁、强类型的编程语言。Flutter对于iOS和Android设备,提供了两套视觉库,可以针对不同的平台有不同的展示效果。
Flutter原本是为了解决Web开发中的一些问题,而开发的一套精简版Web框架,拥有独立的渲染引擎和开发语言,但后来逐渐演变为移动端开发框架。正是由于Dart当初的定位是为了替代JS成为Web框架,所以Dart的语法更接近于JS语法。例如定义对象构建方法,以及实例化对象的方式等。
在Google刚推出Flutter时,其发展很缓慢,终于在18年发布第一个Bate版之后迎来了爆发性增长,发布第一个Release版时增长速度更快。可以从Github上Star数据看出来这个增长的过程。在19年最新的Flutter 1.2版本中,已经开放Web支持的Beta版。
Flutter不仅仅提供了一套视觉库,在Flutter整体框架中包含各个层级阶段的库。例如实现一个游戏功能,上面一些游戏控件可以用上层视觉库,底层游戏可以直接基于Flutter的底层库进行开发,而不需要调用原生应用的底层库。Flutter的底层库是基于Open GL实现的,所以Open GL可以做的Flutter都可以。
核心
前端三大框架已趋于平稳,标准化,向 Web Components 看齐。
小程序(各种平台)爆发,互联网创业优先选择小程序。多端受到重视,不再只是 all in mobile。
WebAssembly 让更多语言可以运行在浏览器上。
PWA进入稳定期,尤其是 PWA 桌面版,可以让我们更好的看清楚 PC 桌面版开发的全貌。
Flutter 发展较快,最大硬伤是Dart语言。RN原有的开发方式会退出历史舞台。
TypeScript已经慢慢成为前端的主流开发如果你想要学好web前端最好加入一个好的学习环境,可以来这个Q群,首先是132,中间是667,最后是127,这样大家学习的话就比较方便,还能够共同交流和分享资料语言,将成为必备开发技能。
开发团队前后端分离已经进入深水期。
其他:ServerLess\GraphSQL发展迅猛、D3、webgl、SVG、webpack不再是唯一的打包工具选项(Rollup、parcel零配置)、WebRTC、静态生成、人工智能前端化
趋势一:更加移动优先
响应式设计显然是目前web前端开发领域的主要趋势之一,并且这一趋势在未来还将持续一段时间。虽然现在的响应式设计大部分还是以PC版优先,然而如果有一天我们把PC版放到比移动版次要的位置上,也没有什么好奇怪的。因为,目前许多web前端开发者已经开始转向以移动优先方案来做他们的响应式设计和开发,这就象征着一个重大转变,值得我们跟进的。
趋势二:更多使用快速原型开发工具
众多web前端开发者从2018年开始尝试使用快速原型开发工具,而在2019年将是这种技术真正爆发的一年。“UXpin、Webflow、Invision以及其它许多快速原型开发工具,让设计师不用写一行代码,就能为网站和服务快速创建低保真和高保真原型,便于设计师衡量它们的可用性和美观性。”web设计师Jamie 如是说,“许多工具也允许你在浏览器中设计原型并从工具里真正启动网站自身。”
趋势三:营销类页面小程序化
这个指的就是大家平时在微信里看到的各类营销网页,因为主要入口在微信,因此变成微信小程序。这个大家比较好理解吧,就不多说了。小程序现在可能BUG多,功能跟不上,但是要替代这类网页可能也就是2年不到的时间。
趋势四:HTML内的技术改进
这个能影响到的范围看起来很大,但其实场景比较有限,主要是排除掉上面说的1和3之外的空间。空间就在于这两大技术目前都没有成熟的最佳实践,还需要探索。
在互联网时代,更多的人、场景、知识将需要被更加紧密地联系在一起,而有连接的地方就会有界面,有界面的地方就会有前端。每一门学科与技术都是在不断摸索和总结中前行,前端技术也不例外。未来我们有理由相信在前端技术日趋成熟的前提下,新的突破和变革将会给我们的工作与生活带来更多惊喜。
趋势五:虚拟现实
如果要讨论web前端技术趋势怎能不提到虚拟现实技术VR呢,2019年将继续是VR成为主流的一年,这也就意味着web开发者将通过VR来吸引用户,我们已经看到一些公司比如Mozilla和Google投资开发VR与Web之间的API。越来越多的VR应用程序将相继问世,所以如果看到越来越多的虚拟现实元素出现在 Web上,也别觉得奇怪。
这里给大家整理了一份系统全面的前端学习路线,主要掌握以下技术:
第一阶段:专业核心基础
阶段目标:
1. 熟练掌握HTML5、CSS3、Less、Sass、响应书布局、移动端开发。
2. 熟练运用HTML+CSS特性完成页面布局。
4. 熟练应用CSS3技术,动画、弹性盒模型设计。
5. 熟练完成移动端页面的设计。
6. 熟练运用所学知识仿制任意Web网站。
7. 能综合运用所学知识完成网页设计实战。
知识点:
1、Web前端开发环境,HTML常用标签,表单元素,Table布局,CSS样式表,DIV+CSS布局。熟练运用HTML和CSS样式属性完成页面的布局和美化,能够仿制任意网站的前端页面实现。
2、CSS3选择器、伪类、过渡、变换、动画、字体图标、弹性盒模型、响应式布局、移动端。熟练运用CSS3来开发网页、熟练开发移动端,整理网页开发技巧。
3、预编译css技术:less、sass基础知识、以及插件的运用、BootStrap源码分析。能够熟练使用 less、sass完成项目开发,深入了解BootStrap。
4、使用HTML、CSS、LESS、SASS等技术完成网页项目实战。通过项目掌握第一阶段html、css的内容、完成PC端页面设计和移动端页面设计。
第二阶段:Web后台技术
阶段目标:
1. 了解JavaScript的发展历史、掌握Node环境搭建及npm使用。
2. 熟练掌握JavaScript的基本数据类型和变量的概念。
3. 熟练掌握JavaScript中的运算符使用。
4. 深入理解分之结构语句和循环语句。
5. 熟练使用数组来完成各种练习。
6.熟悉es6的语法、熟练掌握JavaScript面向对象编程。
7.DOM和BOM实战练习和H5新特性和协议的学习。
知识点:
1、软件开发流程、算法、变量、数据类型、分之语句、循环语句、数组和函数。熟练运用JavaScript的知识完成各种练习。
2、JavaScript面向对象基础、异常处理机制、常见对象api,js的兼容性、ES6新特性。熟练掌握JavaScript面向对象的开发以及掌握es6中的重要内容。
3、BOM操作和DOM操作。熟练使用BOM的各种对象、熟练操作DOM的对象。
4、h5相关api、canvas、ajax、数据模拟、touch事件、mockjs。熟练使用所学知识来完成网站项目开发。
第三阶段:数据库和框架实战
阶段目标:
1. 综合运用Web前端技术进行页面布局与美化。
2. 综合运用Web前端开发框架进行Web系统开发。
3. 熟练掌握Mysql、Mongodb数据库的发开。
4. 熟练掌握vue.js、webpack、elementui等前端框技术。
5. 熟练运用Node.js开发后台应用程序。
6. 对Restful,Ajax,JSON,开发过程有深入的理解,掌握git的基本技能。
知识点:
1、数据库知识,范式,MySQL配置,命令,建库建表,数据的增删改查,mongodb数据库。深入理解数据库管理系统通用知识及MySQL数据库的使用与管理,为Node.js后台开发打下坚实基础。
2、模块系统,函数,路由,全局对象,文件系统,请求处理,Web模块,Express框架,MySQL数据库处理,RestfulAPI,文件上传等。熟练运用Node.js运行环境和后台开发框架完成Web系统的后台开发。
3、vue的组件、生命周期、路由、组件、前端工程化、webpack、elementui框架。Vue.js框架的基本使用有清晰的理解,能够运用Vue.js完成基础前端开发、熟练运用Vue.js框架的高级功能完成Web前端开发和组件开发,对MVVM模式有深刻理解。
4、需求分析,数据库设计,后台开发,使用vue、node完成pc和移动端整站开发。于Node.js+Vue.js+Webpack+Mysql+Mongodb+Git,实现整站项目完整功能并上线发布。
第四阶段:移动端和微信实战
阶段目标:
1.熟练掌握React.js框架,熟练使用React.js完成开发。
2.掌握移动端开发原理,理解原生开发和混合开发。
3.熟练使用react-native和Flutter框架完成移动端开发。
4.掌握微信小程序以及了解支付宝小程序的开发。
5.完成大型电商项目开发。
知识点:
1、React面向组件编程、表单数据、组件通信、监听、声明周期、路由、Redux基本概念。练使用react完成项目开发、掌握Redux中的异步解决方案Saga。
2、react-native、开发工具、视图与渲染、api操作、Flutter环境搭建、路由、ListView组件、网络请求、打包。练掌握react-native和Flutter框架,并分别使用react-native和Flutter分别能开发移动端项目。
3、微信小程序基本介绍、开发工具、视图与渲染、api操作、支付宝小程序的入门和api学习。掌握微信小程序开发了解支付宝小程序。
4、大型购物网站实战,整个项目前后端分离开发;整个项目分为四部分:PC端网页、移动端APP、小程序、后台管理。团队协作开发,使用git进行版本控制。目期间可以扩展Three.js 、TypeScript。
之前讲到了 flutter的Texture
SurfaceTexture 是 Surface 和 OpenGL ES (GLES) 纹理的组合。SurfaceTexture 用于提供输出到 GLES 纹理的 Surface
SurfaceTexture 包含一个 BufferQueue。当生产方将新的缓冲区排入队列时,onFrameAvailable() 回调会通知应用。然后,应用调用 updateTexImage(),这会释放先前占有的缓冲区,从队列中获取新缓冲区并执行 EGL 调用,从而使 GLES 可将此缓冲区作为外部纹理使用。
关键方法:
SurfaceTexture(int texName, boolean singleBufferMode)构造方法
setOnFrameAvailableListener 设置回调,当生产者准备好新的帧后会调用Listener
updateTexImage 更新texture到指定的GLESContext
detachFromGLContext
attachToGLContext
解绑/绑定 当前GLContext
getTransformMatrix 设置重采样纹理矩阵,当渲染的时候会用到这个数据
release() 完全释放 SufaceTexture的 buffers并且吧Surface状态置为abandoned
android-8.0.0_r1 源码解析:
GLConsumer参数解释:
bq是BufferQueue创建BufferConsumer
tex 表示要将图像流传输到的OpenGL ES纹理名称。
texTarget指定了哪个纹理将被绑定
useFenceSync表示是否需要同步访问缓冲区
可以从一个OpenGL ES上下文中分离GLConsumer,然后分别使用detachFromContext和attachToContext方法将GLConsumer附加到另一个上下文。
如果设置tex参数则会通过attachToContext将GLConsumer附加到OpenGL ES context中。
第一次调用updateTexImage才会绑定,之后所有对updateTexImage的调用必须使用相同的当前OpenGL ES context进行
acquireBufferLocked创建EglImage并设置到EglSlots中
updateAndReleaseLocked 更新 EglImage
createIfNeeded 如果EGLDisplay改变或者crop改变则会创建EglImage
bindToTextureTarget 将调用glEGLImageTargetTexture2DOES去绑定image到指定的目标纹理
这里创建EGLImageKHR,EGLImageKHR用于共享EGL资源
EGL的ShareContext是常见的共享上下文的方式(iOS平台的EAGL叫ShareGroup)。
当share_context参数传入另一个EGL的context时,这两个EGLContext就可以共享纹理以及VBO等。
需要注意的是container objects不能被共享,比如:
Framebuffer objects
Vertex array objects
Transform feedback objects
Program pipeline objects
参考:
EGLImageKHR:
本文将从三个方面介绍Android 图形系统。
图形系统提供绘图和图形处理支持。
Android 框架提供了各种用于 2D 和 3D 图形渲染的 API、图片解码库,以及各种Driver支持。
• 绘图API:2D引擎 Skia,3D引擎 OpenGL ES,RenderScript,OpenCV和Vulkan。
• 图片解码库:jpg,png,gif等。
应用开发者可通过三种方式将图像绘制到屏幕:
• Canvas : 2D图形API,Android View树实际的绘制者。
• OpenGL ES : 嵌入式设备的OpenGL 三维图形API子集。
• Vulkan :跨平台的2D和3D绘图引擎,Android 7.0后支持,NDK。
整个图形系统架构是一个生产者和消费者模式,五层依次介绍:
2D绘制:Canvas api / view 的子类 (button ,list)/自定义view
3D绘制:应用直接使用OpenGL 接口绘制图形(PixelFlinger对应的是openGl 1.0 ,GUP driver 对应的是2.0和3.0)
所有情况下的绘图都渲染到一个包含 GraphicBuffer的Surface上,当一块 Surface 显示在屏幕上时,就是用户所看到的窗口。
• Canvas:画布,2D图形API,Android View树实际的渲染者。
• Skia绘制:Android4.0之前默认使用,主线程通过CPU完成绘图指令操作,在复杂场景下单帧容易超过16ms导致卡顿。
WindowManagerService(WMS)窗口管理服务,管理系统中所有的窗口。
• 管理window (view的容器)
• Window与surface对应,一块显示区域。添加一个window,就是 WMS 为其分配一块 Surface 的过程。
Google 在Android source官网提示:
这里就对这些控件进行简单介绍:
Surface : Handle onto a raw buffer that is being managed by the screen compositor.
Surface 对应一块屏幕缓冲区。生产者是: SurfaceTexture、MediaRecorder 等,消费者是: OpenGL、MediaPlayer 或 CameraDevice等。每个window对应一个Surface。Canvas或OpenGL ES等最终都渲染到Surface上。
• Flutter在Android平台上也是直接渲染到Surface。例如:一个Activity/Dialog都是一个Surface,它承载了上层的图形数据,与SurfaceFlinger侧的Layer相对应。
Canvas(画布)实现由 Skia 图形库提供。为了确保两个客户端不会同时更新某个缓冲区,使用以下命令处理画布锁:
使用双缓冲机制,有自己的 surface,View只是一个透明的占位符,Surface可以在后台线程中绘制。双缓冲机制提高渲染效率,独立线程
绘制,提升流畅性。适合一些场景:需要界面迅速更新、UI绘制时间长、对帧率要求较高的情况。
提供访问和控制Surface 相关的方法 。通过SurfaceView的getHolder()函数可以获取SurfaceHolder对象,Surface 就在SurfaceHolder对象内。
addCallback(SurfaceHolder.Callbackcallback) /Canvas lockCanvas() /unlockCanvasAndPost(Canvascanvas)
SurfaceTexture: Surface 和 OpenGL ES (GLES) 纹理(Texture)的组合。将图像流转为 OpenGL 外部纹理。
TextureView:持有 SurfaceTexture,将图像处理为 OpenGL 纹理更新到 HardwareLayer。
GLSurfaceView:加入 EGL 管理,自带 GL 上下文和 GL 渲染线程
这些View通常涉及到Android音视频相关,需要高效的渲染能力。如下面的SurfaceTexture在camera中的应用。
简称Buffer, 一个Buffer包含一帧图像,Buffer由gralloc分配和回收。Buffer 属性包含:width, height, format, usage等
BufferQueue 的引入是为了解决显示和性能问题。
• Surface属于APP进程,Layer属于系统进程,如果它们之间只用一个Buffer,会存在显示和性能问题。
• 一些Buffer用于绘制,一些Buffer用于显示,双方处理完之后,交换一下Buffer,提高效率。
• BufferQueue中包含多个Buffer对象。
Android图形系统包含了两对生产者和消费者模型,它们都通过BufferQueue进行连接:
1.Canvas和OpenGL ES生产图形数据,SurfaceFlinger消费图形数据。
2.SurfaceFlinger合成所有图层的图形数据,Display显示合成结果。
code:frameworks/native/services/surfaceflinger
• Surface表示APP进程的一个窗口,承载了窗口的图形数据。
• SurfaceFlinger是系统进程合成所有窗口的系统服务,负责合成所有Surface提供的图形数据,然后送显到屏幕。
• SurfaceFlinger既是上层应用的消费者,又是Display的生产者,起到了承上启下的作用。
数据流:
合成示意图:
在介绍Vsync机制之前先介绍两个重要概念:
屏幕刷新率:屏幕每秒钟可以刷新多少次。60HZ刷新率,16.7ms刷新一次。(120HZ/8.3ms),硬件指标。
GPU 绘制帧率:GPU 每秒能够合成绘制多少帧。
软件层触发 View 绘制的时机是随机的,当下一次屏幕刷新时,屏幕从 Frame Buffer 中拿到的数据还是“帧1”的数据,导致“丢帧”。
每隔 16ms 硬件层发出 vsync 信号,应用层接收到此信号后会触发UI 的渲染流程,同时 vsync 信号也会触发 SurfaceFlinger 读取Buffer 中的数据,进行合成显示到屏幕上。
总结:Vsync机制将 CPU 和 GPU 的开始时间与屏幕刷新强行拖拽到同一起跑线
Android提供的Graphics流程相对比较复杂对其进行具象后的流程如下两张图所示: