flutter 真机无法调试 sdk报错_Flutter源码剖析(二):源码的阅读与调试环境配置
綜述
Flutter從架構(gòu)上來說有3部分:
- 用Dart寫的Framework層,面向開發(fā)者
- 用Java/Kotlin寫的Embdder層(For Android,iOS是OC/Swift),純Flutter App不需要關(guān)心
- 用C++寫的Engine層,提供Dart運(yùn)行環(huán)境和底層繪制能力
針對每個(gè)部分,對應(yīng)的源碼閱讀環(huán)境不同,調(diào)試方法也不同。
對于閱讀環(huán)境,最重要的是能夠正確地完成調(diào)用/定義的跳轉(zhuǎn)。
對于調(diào)試環(huán)境,最重要的是能夠設(shè)置斷點(diǎn),單步執(zhí)行。
Framework環(huán)境配置
Framework的環(huán)境設(shè)置比較簡單。
源碼閱讀
Framework的代碼在 https://github.com/flutter/flutter 下面,直接Clone下來。
親測安裝了Flutter插件的Android Studio是最好的閱讀工具,直接打開./packages/flutter 目錄,然后flutter pub get即可。
這一步可能報(bào)錯,主要是一些的版本沖突,按照信息解決即可。
源碼調(diào)試
通過Flutter Acttach按鈕即可開始調(diào)試,但是如果要調(diào)試啟動部分的Dart代碼,用Debug而不是Run來啟動程序:
Embedder環(huán)境配置
Embedder的環(huán)境稍微復(fù)雜一點(diǎn)。
源碼閱讀
Embedder的代碼在engine的./shell/platform下面:
tree?-L?1.
├──?BUILD.gn
├──?android
├──?common
├──?config.gni
├──?darwin
├──?embedder
├──?fuchsia
├──?glfw
├──?linux
└──?windows
用AS直接打開android目錄即可,打開后會發(fā)現(xiàn)代碼都無法解析對,這樣就沒法跳轉(zhuǎn)了!!!
首先把根目錄設(shè)置為Source類型:
這時(shí)候只剩androidx無法解析了:
發(fā)現(xiàn)旁邊一個(gè)目錄已經(jīng)聲明了依賴,于是按照提示,建立一個(gè)local.properties文件,指出本地sdk路徑即可,然后執(zhí)行Gradle命令,拉取更新:
后來查看文檔,發(fā)現(xiàn)其實(shí)另外一個(gè)目錄已經(jīng)有這些依賴了,直接在工程設(shè)置頁面添加一個(gè)classpath即可:
../third_party/android_embedding_dependencies/這個(gè)目錄是在engine外,buildroot下的,應(yīng)該是之前gclient sync的時(shí)候就解析build.gradle拉下來的。
源碼調(diào)試
如果在打開Flutter的工程,打開Andorid的Activity是解析錯誤的:
需要以android作為根目錄單獨(dú)打開,然后通過Run/Debug按鈕再次啟動即可:
這里單獨(dú)打開工程無需擔(dān)心如何集成Flutter,gradle腳本已經(jīng)搞定了。
Engine環(huán)境配置
Engine的配置是最復(fù)雜的。
源碼閱讀
把gn工具在src/out 目錄生成的compile_commands.json文件移到src/flutter目錄下,然后用CLion打開這個(gè)文件就可以正確索引Engine的C++代碼了。
該文件是預(yù)編譯生成的索引,其他編輯器也可以支持,當(dāng)然用CLion是最方便的。
源碼調(diào)試
官方提供了gdb的調(diào)試方法,但是沒有文檔,按照代碼注釋的文檔,也無法運(yùn)行成功,一直報(bào)下面的錯誤:
Could?not?find?platform?independent?libraries?Could?not?find?platform?dependent?libraries?
Consider?setting?$PYTHONHOME?to?[:]
ImportError:?No?module?named?site
看到網(wǎng)上有人已經(jīng)在用lldb調(diào)試了,于是也按照這個(gè)思路成功了,
首先是把Android SDK的lldb-server push到設(shè)備,建立一個(gè)信道,通過run-as繞過權(quán)限問題:
#?注意換成自己的包名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'"
通過以上幾步已經(jīng)建立可以調(diào)試的通道了,然后啟動lldb,attach到指定進(jìn)程(通過進(jìn)程id),然后添加符號表:
adb?shell?pidof?com.example.flutter_demolldb
(下面是lldb環(huán)境)
(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
之前就注意到構(gòu)建目錄下的這個(gè)so非常大,打包的so不過10M,這個(gè)接近300M,應(yīng)該是存在大量調(diào)試信息。
這里有兩個(gè)坑:
如此,便可以開始調(diào)試了,下面演示在幀刷新位置設(shè)置斷點(diǎn),然后觸發(fā):
總結(jié)
以上便是Flutter源碼閱讀/調(diào)試環(huán)境的搭建,欲善其事,先利其器,后面就要開始真刀真槍擼源碼了。
參考
- 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
- 如何調(diào)試Android Native Framework
- Flutter Engine C++ 源碼調(diào)試初探
- Android 調(diào)試橋 (adb) ?|? Android 開發(fā)者 ?|? Android Developers
總結(jié)
以上是生活随笔為你收集整理的flutter 真机无法调试 sdk报错_Flutter源码剖析(二):源码的阅读与调试环境配置的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 如何用C的easyX图形库制作图形化界面
- 下一篇: 【C++】C++函数需要有返回值,但非全