MAUI模板專案閃退問題
在MAUI
最初發布的時候就曾建立過幾個模板專案進行體驗過,沒遇到什麼坑。由於最近需要開發針對餐飲行業的收銀機(安卓系統)開發一款應用,這種收銀機一般配置不咋滴,系統版本和效能也肯定比不上我們自己使用的手機。在做技術選型時首先想到了MAUI
,備選Flutter
,React Native
。都是大廠維護的跨平臺應用框架,在使用MAUI
框架時遇到新建的模板應用居然啟動時直接閃退,最終也是解決了這個閃退問題,遂分享下這一經歷。
建立專案
演示建立專案過程,所有流程都是IDE預設,不做任何修改。
新建MAUI模板專案
用VS新建MAUI
模板專案,如下
專案名也預設為MauiApp1
連線裝置
- 通過USB連線目標安卓裝置
- 目標裝置開啟開發者模式,然後開啟usb除錯(自行
百度必應/谷歌) - 手機上切換usb除錯的模式,一般會出現 僅充電,檔案傳輸。。。,簡單粗暴的切換各種選項,當VS列出了你的裝置就可以了。
除錯專案
- 完成上一步的裝置連線,直接的debug模式下啟動專案
等待一會,可以在裝置上看到應用已經安裝了,按說應該會被自動開啟,等了好久也沒動靜,VS的輸出視窗也不在有新的內容輸出了
手動點選裝置上的安裝好的MauiApp1
應用,然後剛看到啟動頁面一個大大的.NET標誌,隨後來了個 Maui1已停止執行
解決閃退問題
以前也做過使用android studio
開發過原生安卓應用,一般這種問題都能在IDE有錯誤輸出,可以通過錯誤資訊找到閃退原因。
回顧剛才這個問題,不知道去哪裡檢視日誌,這該怎麼去看閃退的原因呢,要是VS
能像android studio
那樣可以檢視詳細的日誌就好了,目前我還不知道是否有地方能看詳細的debug日誌。我選擇了一種比較通用的排查錯誤的方式:adb
工具。
有關adb
不做介紹,讀者如有疑問自行百度必應/谷歌,你只需要知道他是用來除錯安卓應用的一個強大工具即可。
下面的流程需要你將adb
目錄新增到環境變數PATH中,方可全域性使用adb
命令。
常用命令
adb命令檢視列出手機裝的所有 app 的包名:
adb shell pm list packages
列出系統應用的所有包名:
adb shell pm list packages -s
列出除了系統應用的第三方應用包名:
adb shell pm list packages -3
推測一個包中可能帶有的關鍵字:
adb shell dumpsys activity | findstr mFocusedActivity
清除應用資料與快取
adb shell pm clear 應用包名
檢視日誌
adb logcat
V:詳細(最低優先順序)
D:除錯
I:資訊
W:警告
E:錯誤
F:嚴重
S:靜默(最高優先順序,未曾輸出過任何內容)
找到我們要看的日誌
- 確認adb能識別到你的裝置
$ adb devices
List of devices attached
1234567890ABCDEF device
- 找出我們的包名
$ adb shell pm list packages -3
....
package:com.landi.print.service
package:com.companyname.mauiapp1
....
包名為:com.companyname.mauiapp1
- 使用
logcat
直接執行adb logcat
能看到裝置的所有日誌,會對我們的排查造成干擾,我們只需要檢視package:com.companyname.mauiapp1
的日誌
可以使用grep
進行過濾,這個在在windows
的命令列工具都不支援,我使用的是GitBash
的shell
命令列工具,可以使用這一功能。
adb logcat | grep com.companyname.mauiapp1
這樣就只會輸出mauiapp1
的日誌了。
執行上面的命令後,點選mauiapp1
應用圖示啟動應用,得到我們應用啟動到崩潰的所有日誌如下:
06-16 10:21:11.953 1424 1424 D Launcher2.2.10: flow not clicked com.companyname.mauiapp1crc64e632a077a20c694c.MainActivity
06-16 10:21:11.953 1424 1424 D Launcher2.2.10: flow click desktop com.companyname.mauiapp1crc64e632a077a20c694c.MainActivity
06-16 10:21:11.953 424 466 I ActivityManager: START u0 {act=android.intent.action.MAIN flg=0x10200000 cmp=com.companyname.mauiapp1/crc64e632a077a20c694c.MainActivity} from uid 10072
06-16 10:21:11.958 424 466 E ActivityManager: getPackageFerformanceMode--ComponentInfo{com.companyname.mauiapp1/crc64e632a077a20c694c.MainActivity}----com.companyname.mauiapp1
06-16 10:21:11.967 424 1456 E ActivityManager: getPackageFerformanceMode--ComponentInfo{com.companyname.mauiapp1/crc64e632a077a20c694c.MainActivity}----com.companyname.mauiapp1
06-16 10:21:11.987 424 1456 I ActivityManager: Start proc 19415:com.companyname.mauiapp1/u0a97 for activity com.companyname.mauiapp1/crc64e632a077a20c694c.MainActivity
06-16 10:21:12.173 19415 19415 D debug-app-helper: Checking if libmonodroid was unpacked to /data/app/com.companyname.mauiapp1-Wpq5srmqUiNM5498jRmH8Q==/lib/arm/libmonodroid.so
06-16 10:21:12.173 19415 19415 D debug-app-helper: Native libs extracted to /data/app/com.companyname.mauiapp1-Wpq5srmqUiNM5498jRmH8Q==/lib/arm, assuming application/android:extractNativeLibs == true
06-16 10:21:12.173 19415 19415 D debug-app-helper: Added filesystem DSO lookup location: /data/app/com.companyname.mauiapp1-Wpq5srmqUiNM5498jRmH8Q==/lib/arm
06-16 10:21:12.173 19415 19415 W debug-app-helper: Using runtime path: /data/app/com.companyname.mauiapp1-Wpq5srmqUiNM5498jRmH8Q==/lib/arm
06-16 10:21:12.173 19415 19415 W debug-app-helper: checking directory: `/data/user/0/com.companyname.mauiapp1/files/.__override__/lib`
06-16 10:21:12.173 19415 19415 W debug-app-helper: directory does not exist: `/data/user/0/com.companyname.mauiapp1/files/.__override__/lib`
06-16 10:21:12.173 19415 19415 W debug-app-helper: Checking whether Mono runtime exists at: /data/user/0/com.companyname.mauiapp1/files/.__override__/libmonosgen-2.0.so
06-16 10:21:12.173 19415 19415 W debug-app-helper: Checking whether Mono runtime exists at: /data/app/com.companyname.mauiapp1-Wpq5srmqUiNM5498jRmH8Q==/lib/arm/libmonosgen-2.0.so
06-16 10:21:12.173 19415 19415 I debug-app-helper: Mono runtime found at: /data/app/com.companyname.mauiapp1-Wpq5srmqUiNM5498jRmH8Q==/lib/arm/libmonosgen-2.0.so
06-16 10:21:12.192 19415 19415 W monodroid: Creating public update directory: `/data/user/0/com.companyname.mauiapp1/files/.__override__`
06-16 10:21:12.198 19415 19415 F monodroid: No assemblies found in '/data/user/0/com.companyname.mauiapp1/files/.__override__' or '<unavailable>'. Assuming this is part of Fast Deployment. Exiting...
06-16 10:21:12.275 19433 19433 F DEBUG : pid: 19415, tid: 19415, name: nyname.mauiapp1 >>> com.companyname.mauiapp1 <<<
06-16 10:21:12.284 19433 19433 F DEBUG : Abort message: 'No assemblies found in '/data/user/0/com.companyname.mauiapp1/files/.__override__' or '<unavailable>'. Assuming this is part of Fast Deployment. Exiting...'
06-16 10:21:12.288 19433 19433 F DEBUG : #01 pc 0001b08b /data/app/com.companyname.mauiapp1-Wpq5srmqUiNM5498jRmH8Q==/lib/arm/libmonodroid.so (xamarin::android::internal::MonodroidRuntime::create_domain(_JNIEnv*, xamarin::android::jstring_array_wrapper&, bool, bool)+282)
06-16 10:21:12.288 19433 19433 F DEBUG : #02 pc 0001c08f /data/app/com.companyname.mauiapp1-Wpq5srmqUiNM5498jRmH8Q==/lib/arm/libmonodroid.so (xamarin::android::internal::MonodroidRuntime::create_and_initialize_domain(_JNIEnv*, _jclass*, xamarin::android::jstring_array_wrapper&, xamarin::android::jstring_array_wrapper&, _jobjectArray*, xamarin::android::jstring_array_wrapper&, _jobject*, bool, bool, bool)+26)
06-16 10:21:12.288 19433 19433 F DEBUG : #03 pc 0001d2c5 /data/app/com.companyname.mauiapp1-Wpq5srmqUiNM5498jRmH8Q==/lib/arm/libmonodroid.so (xamarin::android::internal::MonodroidRuntime::Java_mono_android_Runtime_initInternal(_JNIEnv*, _jclass*, _jstring*, _jobjectArray*, _jstring*, _jobjectArray*, _jobject*, _jobjectArray*, int, unsigned char, unsigned char)+4020)
06-16 10:21:12.288 19433 19433 F DEBUG : #04 pc 0001d55f /data/app/com.companyname.mauiapp1-Wpq5srmqUiNM5498jRmH8Q==/lib/arm/libmonodroid.so (Java_mono_android_Runtime_initInternal+50)
06-16 10:21:12.288 19433 19433 F DEBUG : #05 pc 0005282f /data/app/com.companyname.mauiapp1-Wpq5srmqUiNM5498jRmH8Q==/oat/arm/base.odex (offset 0x2e000)
06-16 10:21:12.905 424 19434 W ActivityManager: Force finishing activity com.companyname.mauiapp1/crc64e632a077a20c694c.MainActivity
06-16 10:21:12.916 424 451 I ActivityManager: Showing crash dialog for package com.companyname.mauiapp1 u0
06-16 10:21:12.976 424 877 I ActivityManager: Process com.companyname.mauiapp1 (pid 19415) has died: fore TOP
我們只關注日誌級別為F
,E
的即可:
下面錯誤資訊說明了程式掛掉的原因
06-16 10:21:12.198 19415 19415 F monodroid: No assemblies found in '/data/user/0/com.companyname.mauiapp1/files/.__override__' or '<unavailable>'. Assuming this is part of Fast Deployment. Exiting...
06-16 10:21:12.275 19433 19433 F DEBUG : pid: 19415, tid: 19415, name: nyname.mauiapp1 >>> com.companyname.mauiapp1 <<<
06-16 10:21:12.284 19433 19433 F DEBUG : Abort message: 'No assemblies found in '/data/user/0/com.companyname.mauiapp1/files/.__override__' or '<unavailable>'. Assuming this is part of Fast Deployment. Exiting...'
接下來就可以發揮我們程式設計師的重要技能之一:百度谷歌,能不能搜尋正確的答案就看造化了。
看來筆者有點東西,谷歌到了一個類似的案例:
https://stackoverflow.com/questions/42336546/xamarin-android-application-crashed-after-clear-data-in-settings
有興趣的去深究下,這裡xamarin
的解決辦法是關閉 Use Fast Deployment
修改專案配置
經過仔細檢視屬性配置檔案,找到這個配置與stackoverflow
的上說的關閉 Use Fast Deployment
極其相似,應該就是它了,關閉它再次使用VS
以debug模式啟動專案。
這次經過稍微漫長的過程,也執行到Found device: 1234567890ABCDEF
不動了
手動開啟App,沒任何效果。
解除安裝Mauiapp1
重試
雖然上一步改了沒效果,但我堅信應該就是這樣,所以解除安裝app再試試,排除干擾因素。
Found device: 1234567890ABCDEF
之後不在卡住不動了
隨後我的裝置上也安裝並自動開啟了Mauiapp1
,並且沒有閃退!