as工程放到源码编译_Flutter源码剖析(二):源码的阅读与调试环境配置
综述
Flutter从架构上来说有3部分:
- 用Dart写的Framework层,面向开发者
- 用Java/Kotlin写的Embdder层(For Android,iOS是OC/Swift),纯Flutter App不需要关心
- 用C++写的Engine层,提供Dart运行环境和底层绘制能力
针对每个部分,对应的源码阅读环境不同,调试方法也不同。
对于阅读环境,最重要的是能够正确地完成调用/定义的跳转。
对于调试环境,最重要的是能够设置断点,单步执行。
Framework环境配置
Framework的环境设置比较简单。
源码阅读
Framework的代码在 https://github.com/flutter/flutter 下面,直接Clone下来。
亲测安装了Flutter插件的Android Studio是最好的阅读工具,直接打开./packages/flutter
目录,然后flutter pub get
即可。
这一步可能报错,主要是一些的版本冲突,按照信息解决即可。
源码调试
通过Flutter Acttach
按钮即可开始调试,但是如果要调试启动部分的Dart代码,用Debug
而不是Run
来启动程序:
Embedder环境配置
Embedder的环境稍微复杂一点。
源码阅读
Embedder的代码在engine的./shell/platform
下面:
tree -L 1.├── BUILD.gn├── android├── common├── config.gni├── darwin├── embedder├── fuchsia├── glfw├── linux└── windows
用AS直接打开android
目录即可,打开后会发现代码都无法解析对,这样就没法跳转了!!!
首先把根目录设置为Source
类型:
这时候只剩androidx
无法解析了:
发现旁边一个目录已经声明了依赖,于是按照提示,建立一个local.properties
文件,指出本地sdk路径即可,然后执行Gradle命令,拉取更新:
后来查看文档,发现其实另外一个目录已经有这些依赖了,直接在工程设置页面添加一个classpath
即可:
../third_party/android_embedding_dependencies/
这个目录是在engine外,buildroot下的,应该是之前gclient sync
的时候就解析build.gradle
拉下来的。
源码调试
如果在打开Flutter的工程,打开Andorid的Activity是解析错误的:
需要以android作为根目录单独打开,然后通过Run/Debug
按钮再次启动即可:
这里单独打开工程无需担心如何集成Flutter,gradle脚本已经搞定了。
Engine环境配置
Engine的配置是最复杂的。
源码阅读
把gn工具在src/out
目录生成的compile_commands.json
文件移到src/flutter
目录下,然后用CLion打开这个文件就可以正确索引Engine的C++代码了。
该文件是预编译生成的索引,其他编辑器也可以支持,当然用CLion是最方便的。
源码调试
官方提供了gdb的调试方法,但是没有文档,按照代码注释的文档,也无法运行成功,一直报下面的错误:
Could not find platform independent libraries Could not find platform dependent libraries Consider setting $PYTHONHOME to [:]ImportError: No module named site
看到网上有人已经在用lldb调试了,于是也按照这个思路成功了,
首先是把Android SDK的lldb-server
push到设备,建立一个信道,通过run-as
绕过权限问题:
# 注意换成自己的包名adb push lldb-server /data/local/tmp/lldb-server
adb shell run-as com.example.flutter_demo \cp -F /data/local/tmp/lldb-server /data/data/com.example.flutter_demo/lldb-server
adb shell run-as com.example.flutter_demo \chmod a+x /data/data/com.example.flutter_demo/lldb-server
adb shell "run-as com.example.flutter_demo sh -c '/data/data/com.example.flutter_demo/lldb-server platform --server --listen unix-abstract:///data/data/com.example.flutter_demo/debug.socket'"
通过以上几步已经建立可以调试的通道了,然后启动lldb,attach到指定进程(通过进程id),然后添加符号表:
adb shell pidof com.example.flutter_demolldb(下面是lldb环境)(lldb) platform select remote-android(lldb) process attach -p 25382(lldb) add-dsym ~/WorkProject/flutter_source_code/src/out/android_debug_unopt_arm64/libflutter.so
之前就注意到构建目录下的这个so非常大,打包的so不过10M,这个接近300M,应该是存在大量调试信息。
这里有两个坑:
- lldb进去之后,进程会挂起,必须用
c/continue
来恢复,不然无法触发逻辑,也就无法触发断点 - 必须在
System.loadLibrary
之后才能添加符号表,否则失败,如果还是失败,就把以上流程重试一遍~
如此,便可以开始调试了,下面演示在帧刷新位置设置断点,然后触发:
总结
以上便是Flutter源码阅读/调试环境的搭建,欲善其事,先利其器,后面就要开始真刀真枪撸源码了。
参考
- engine/flutter_gdb at master · flutter/engine
- Debugging the engine · flutter/flutter Wiki
- Debugging Flutter apps - Flutter
- Debugging Flutter apps programmatically - Flutter
- Using an OEM debugger - Flutter
- 如何调试Android Native Framework
- Flutter Engine C++ 源码调试初探
- Android 调试桥 (adb) | Android 开发者 | Android Developers
as工程放到源码编译_Flutter源码剖析(二):源码的阅读与调试环境配置相关推荐
- flutter 真机无法调试 sdk报错_Flutter源码剖析(二):源码的阅读与调试环境配置
综述 Flutter从架构上来说有3部分: 用Dart写的Framework层,面向开发者 用Java/Kotlin写的Embdder层(For Android,iOS是OC/Swift),纯Flut ...
- [android源码下载索引贴】微信+二维码那都不是事......
微信: Android 简单仿微信朋友圈布局2014/09/02 http://www.eoeandroid.com/thread-542738-1-1.html [代码片段] 高仿摇一摇效果 201 ...
- 直播视频app源码,Android 点击生成二维码
直播视频app源码,Android 点击生成二维码实现的相关代码 activity.xml代码如下: <?xml version="1.0" encoding="u ...
- zxing 生成二维码,可设置logo、二维码颜色、白边大小
主要是使用google的zxing 生成二维码,可设置logo.二维码前景色/后景色.白边大小.二维码大小 1.用到jar包 <dependency><groupId>com. ...
- asp.net 后台生成二维码及生成带logo的二维码
asp.net 后台生成二维码及生成带logo的二维码,此处将生成二维码和带Logo的二维码写在一起的,需要自己区分一下. 直接上代码 using System; using System.Colle ...
- js 将微信二维码转为url,qrcodeJs解析二维码,qrcode.decode is not a function报错
前言 工作中遇到的需求:用户上传相册中选中的图片,判断这个图片里的二维码是不是微信二维码,如果是则上传到服务器:不是,则提示用户重新上传. 百度了下,qrcode.js是一个用于生成二维码的 Java ...
- Android中 自定义logo二维码绘制(仿微信QQ二维码)
自定义Logo二维码绘制(追加上一篇简单二维码绘制) 1.实现思路 2.实现(新增拍照以及相册上传logo以及分享和保存二维码) 简单绘制二维码地址: Android 实现简单绘制二维码(包含带LOG ...
- AR.js开发问题详解(二维码识别不出来及AR二维码如何进行训练)
AR.js开发问题详解(二维码识别不出来及AR二维码如何进行训练) 1. 大家碰到的很多都是二维码识别不出来的情况. 原因:周围环境的光太强或太暗,遮挡了二维码的信息,摄像头识别不到全部的信 ...
- 实现扫描二维码和生成带logo的二维码
欢迎来到风的博客 今天讲的是如何引用google的zxing库实现扫描二维码和生成带logo的二维码,源码库可以从github上下载[https://github.com/zxing/zxing];在 ...
最新文章
- 适用于Mac上的SQL Server
- 深度学习NN、CNN、RNN、和DNN你了解吗?
- 将一个数组输出到模板中来处理2
- 计算机视觉Computer Vision网址导航
- HTTP中request请求参数的设置
- DeepLearning:pydot安装的使用和安装
- presto 连接mysql,Presto等同于MySQL group_concat
- proxool java_Java应用中使用Proxool
- 通用编程_通用编程准则
- udf提权 udf.php,UDF提权
- Java序列化机制原理,java面试题,java基础笔试题,BAT
- Python:获取代码运行时间方法
- JAVA学习笔记——JAVA基础语法(二)
- 学python能赚钱吗-自学Python三个月能赚钱吗?
- 支付宝宣布刷脸支付将全面接管扫码支付
- Qos介绍及功能->分类标记->流量管理(令牌桶)->拥塞管理与拥塞避免
- python爬虫之一:爬取网页小说(魂破九天)
- PayPal完成对区块链公司的投资首秀
- 用c语言反向输出5ge字符,C语言入门:05.scanf函数
- C++语言基础——C++一本通:C++语言入门 1005:地球人口承载力估计
热门文章
- 聚类分析在用户行为中的实例_用户关注行为数据分析过程详解-描述统计+聚类...
- 在C ++中使用getter和setter函数创建具有X和Y轴的类Point
- java对数组进行排序_用Java对数组进行排序所需的最少交换
- 工程中多个不同类型线程池_软件工程中不同类型的设计策略
- ReactNative实现图集功能
- c++实现插入和冒泡排序
- 动感灯箱制作流程培训_2000多年的灯箱发展史,你知道多少?
- df添加一行 python_Python为输出的数据绘制表格
- java解析xml中文字符乱码_Eclipse读取xml中文乱码问题解决
- dos 改某个目录下所有文件的时间_go语言入门学习笔记(2)-DOS操作及go语言变量学习...