flutter 真机无法调试 sdk报错_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,應該是存在大量調試信息。
這里有兩個坑:
如此,便可以開始調試了,下面演示在幀刷新位置設置斷點,然后觸發:
總結
以上便是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
總結
以上是生活随笔為你收集整理的flutter 真机无法调试 sdk报错_Flutter源码剖析(二):源码的阅读与调试环境配置的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 如何用C的easyX图形库制作图形化界面
- 下一篇: 盛大发布nbsp;Bambooknbsp