Flutter动态化 | Fair 2.6.0 新版本特性 Fair是为Flutter设计的动态化框架,通过FairCompiler工具对原生Dart源文件的自动转化,使项目获得动态更新WidgetTree和State的能力。创建Fair的目标是支持不发版(Android、iOS、Web)的情况下,通过业务bundle和JS下发实现更新,方式类似于ReactNative。与FlutterFair集成后,您可以快速发布新的页面,而无需等待应用的下一个发布日期。...
Flutter混合开发框架(二)——FlutterEngineGroup使用及原理分析 前序要解决的问题以及现在的常用解决方案就不再详细叙述,主要就是要做混合开发这件事。背景FlutterEngineGroup是由官方推出的Flutter+Native混合开发解决方案,与FlutterBoost不同的是,使用的是多引擎的处理方式,并优化了每个引擎的大小以及数据处理方式,让大部分数据实现共享,只有部分生命周期等内容做了隔离。实现方式相较于单Engine形式,多Engine无需关心页面栈等问题,但新增了一个问题,就是多Engine中的数据共享。多Engine的方式,如果我们自己设计,那
Flutter混合开发框架(一)——Flutter Boost分析 要解决的问题实现Native和Flutter的混合开发,降低native工程接入Flutter的成本。背景Flutter 2.0之前官方没有提供Native+Flutter的混合开发解决方案,开发者有两种实现方式。1、单Engine模式也就是共享Engine的实现方式,当Native启动Activity或者Controller甚至是Fragment时,都将相同的Engine与对应的控制器进行绑定。2、多Engine模式每开启一个页面都启动一个Flutter Engine,是用多Engine配合
Flutter 状态管理(二)——fish redux源码解析及思考 简介之前我们横向比较了 fish redux、flutter redux以及provider的用法。本文主要以fish redux为例介绍一下其更新机制,以及设计思想。提出问题1、fish redux的更新和setState是否有关系?2、setState到底是全局更新还是局部更新?3、effect 和 reducer 到底有何区别,谁先执行?设计方案介绍首先,我们已知fish redux的用法,关键的对象为effect、reducer、component、connector、page、ada
Android系统内存相关—Binder机制(二) 简介通过思维导图和相关分解,简单的介绍对Android系统的认知,方便搭建一套比较整体的Android基础框架。本章主要介绍Android的Binder机制处理跨进程问题,其本质还是对共享内存的处理。描述Binder 实现本质 内存共享 模型 server transact replay 同步返回,挂起进程 client transact replay 同步返回,挂起进程 binder驱动
安装未知来源应用权限申请(Rxjava封装) 安装未知来源需求简介当App需要安装未知来源的应用的时候,需要开启"安装位置来源应用”的权限。实现方案 //跳转到对应的设置页面进行权限操作 private fun gotoSettingsPage() { val packageURI = Uri.parse("package:"+ activity.packageName) val intent: Intent = Intent(Settings.ACTION_MANAGE_UNKNOWN_APP_S
Android 系统内存相关(一) 简介通过思维导图和相关分解,简单的介绍对Android系统的认知,方便搭建一套比较整体的Android基础框架。具体内容主要参考《Android内核设计》从内存基础介绍开始,无论是什么操作系统,都是要处理真正的物理内存去读取执行指令及数据,所以内存肯定是重中之重。描述操作系统 - 内存的游戏 进程间数据共享 共享内存 shared memory 申请内存 shmget shmat shmdt 全部进程需要撤销 shctl 配置共享区..
Flutter web嵌入原有js获取不到节点问题 Flutter web 与原js结合起因由于Flutter最近很火,团队在做flutter-dart的全平台尝试。对于Web这块,由于我们本身有很多react组件的积累,所以想在flutter web上直接使用原有的JS。一开始,因为flutter web的语法可以直接和js语法对标,所以感觉不是什么困难的事情。但是最终发现了有个1.20.4版本flutter,暂时还无法逾越的坑。shadow dom简单说,flutter 在创建web的platform view时,会在node前添加# sh
flutter web 启动失败报链接Chrome失败 问题:Failed to establish connection with the application instance in Chrome.This can happen if the websocket connection used by the web tooling is unable to correctly establish a connection, forexample due to a firewall.解决方案:配置本地localhost 127.0...
Flutter开发导致mac磁盘存储暴涨问题 现象正常开发,未开启iOS虚拟机,观察磁盘管理工具,发现磁盘存储疯狂减少,最终导致存储完全被占满。重启后发现垃圾箱里面多了个一个文件夹,并且这个文件夹有100G。文件夹中主要文件为:dyld_shared_cache_arm64这样的文件。解决方案官方给出的解决方案是升级到1.17.4以上版本这是官方的ISSUE:https://github.com/flutter/flutter/issues/56826亲测有效。...
Flutter状态管理(一)——框架对比及选择 Flutter状态框架对比及选择(一)简介随着业务需求的持续迭代,对于状态的管理就显得尤为重要,数据导向的页面更新是极有效的方式,但是业务越来越多就会导致各个module之间的依赖会越来越多。这张图就反应了,当页面复杂时,如果全是有中央集权的状态控制就会显得杂乱无章,特别在定位问题时就会很头疼,还有一个很重要的原因是因为flutter在调试时报错会从runApp开始报,如果没有状态管理器输出对应的错误,很难定位是哪个数据问题造成的。本次我们主要针对Flutter-Redux和Fish-Redux的
Android插件化,加载成功后无法找到类的问题 问题现象插件加载可以成功,但是获取类时出现class not found问题原因由于工程使用的是AAB的打包方式,壳子工程代码的classloader与业务线apk的classloader不是相同classloader在加载时,使用的是壳子工程的classloader,查找类时使用的是业务线自己的classloader,导致失败。解决方式使用相同classloader...
Fish Redux同时更新adapter的多个相同type的item时失败 如果有一个Action想更新两个item,发现不会进行更新了造成原因:AdapterSource copy; for (int i = 0; i < state.itemCount; i++) { final AbstractLogic<Object> result = pool[state.getItemType(i)]; if (result != null) { final Object oldData = state.getIte
Flutter No implementation found for method xxx on channel 问题原因很明显就是依赖没有,但是不是flutter的依赖,是Android native缺少这个方法。如果你不是直接在flutter工程生成的Android工程,或者是由其他方式使用flutter依赖时,当flutter工程引入部分带有native插件的第三方库时,就不会主动打到对应的Android工程中,引起改错误。解决方案方案一、将navtive插件当依赖引入到Android 工程,例如://magpie Android SDK debugdebugApi 'com.wuba.magpie:
Dex动态加载问题 用build-tools的dex打包失败改用d8即可具体使用方式可参照https://developer.android.google.cn/studio/command-line/d8加载时 No such file or directoryprivate static dalvik.system.DexPathList$Element[] dalvik.system.DexPathList.makeDexElements(java.util.List,java.io.File,java.util
mac解决MySql(8.0.20) 启动后端口是0,无法连接Workbench问题 问题1:未设置my.cnf如果没设置my.cnf配置,将会出现账号密码登录失败系统偏好配置中MySql无法启动或者关闭解决配置my.cnf到/etc/my.cnf中问题2:查看端口号为0mysql> show global variables like ‘port’;±--------------±------+| Variable_name | Value |±--------------±------+| port | 0 |±------------
从Android视角看数据爬虫 从Android视角看数据爬虫简介从Android客户端视角看数据爬虫,主要分为以下几个步骤1、通过反编译等手段,hook住对应app的网络请求库,得到对应的URL2、根据hook的点打印出当时的header和参数3、模拟APP请求,发起对应的数据请求如何实现通过反编译和Hook获取url这个爬虫的重点步骤,通过此步骤才能的到对应的URL,难易程度取决于APP对自己的保护程度。主要从以下几种情况来说明:1、使用了OkHttp,但未自己进行封装或修改的: 直接通过hook OkHttp的
koa2 ctx.render is not a function 记录一下该BUG,原因主要是因为js的运行是有顺序的,如果先初始化了Router,在访问时先执行了Router但其后面的ctx.render的render方法还没有绑定到上下文上,就会造成该问题。解决方法:将Router移动到其他的中间件后面去即可...
Groovy简介——编译时方法注入 一般只用于编写一些插件或者模板方法的时候使用,编译后的代码还是会合成为静态代码,会比运行时的处理方式效率更高。需要根据AST来添加对应的语法树。Groovy编译器允许我们进入其变异截断,一窥其所处理的AST(Abstract Syntax Tree 抽象语法树)。AST:这就是生成的语法树:Groovy支持开发者在任何阶段介入:初始化、解析、转换、语义分析、规范化、...
Groovy简介——运行时MOP 概况 Groovy是一个动态语言,类型不用定义的语言。它运行与JVM之上,编译器会先将Groovy代码编译为Java语言,然后编译为字节码。Groovy在编译的时候会先生成AST(抽象语法树,Abstract Syntax Tree),同时Groovy也提供了AST的操作方法,也就是说在Groovy编译时可以插入一些模板方法甚至根据AST插入对应的方法。还有一个很重要的...