"Android"
- Biometric fallback 完整設計
iOS Face ID / Touch ID 和 Android BiometricPrompt 的行為差異、fallback 策略、安全 vs 可用性取捨的顯式記錄方法
- iOS HIG vs Material Design 導航差異
兩個平台在 back 行為、手勢、tab bar 位置、modal 呈現上的差異 — 跨平台 app 需要決定遵循哪套慣例
- Permission 請求時機與措辭
系統權限請求的時機選擇(首次開啟 vs 功能使用時)和說明文字的設計 — 使用者只有一次機會理解為什麼需要這個權限
- 開發機的定期空間清理:專案產物、快取、並存的工具鏈版本、虛擬磁碟與 App 沙箱容器的判讀
開發機的佔用依「刪除之後由誰重建、刪除前要查證什麼」分類,每一類各自的判斷依據與檢查指令;涵蓋專案編譯產物、套件與 App 的快取、Gradle/NDK/模擬器映像/Flutter SDK 這類並存的工具鏈版本、容器的虛擬磁碟、模擬器裝置與自己開發的 App 的沙箱容器,以及刪除前要先辨識出來的被忽略檔。
- 用 adb 遠端診斷 Android 實機
機器不在手邊,而要判斷畫面上是哪個 App 的視窗蓋住了操作、擷圖傳回電腦後無法開啟、或 logcat 的輸出裡找不到按下按鈕那一刻的紀錄時回來讀
- claim 一個 USB 介面等於接管它,原本用它的系統功能會停止回應
使用者回報畫面凍結、點不動,而應用程式沒有閃退也沒有 ANR 紀錄時回來讀;也適用於判斷「連線成功」這個訊號能不能拿來當把關條件
- USB 類別代碼記在裝置層與介面層兩處,只讀裝置層的印表機會回報 0
照 USB 類別代碼過濾裝置而候選清單裡一台印表機都不剩,或需要確認某個 USB 裝置屬於哪一類用途時回來讀
- 兩種錯法的代價不對稱時,過濾策略要讓失敗倒向可補救的那一邊
要決定裝置候選清單用白名單還是黑名單、或某類裝置取不到判斷依據時該放行還是排除時回來讀
- 陌生機器的硬體盤點比從應用端反推便宜,因為它把假設換成可核對的值
手上有一台不熟悉的 Android 裝置、而問題可能出在硬體識別或裝置歸屬時回來讀;也適用於判斷內建印表機該走通用路徑還是原廠 SDK
- 會在開機自動生效的設定要在讀取端驗證,寫入端的把關救不了已經寫壞的機器
已出貨的機器因為一筆存錯的設定而每次開機都復現同一個故障、重裝程式也修不好時回來讀;也適用於判斷一個設定的驗證該放在寫入端還是讀取端
- Flutter 音量控制:App 自己的音量 vs 系統音量
釐清 Flutter/Android 兩種層次的音量——播放器各自的音量(App 免 plugin 就能控制自己的聲音)與裝置系統媒體音量(全域、需 plugin),以及為什麼多數情況不該從 App 去改系統音量。
- flutter devices 卡住的訊號:device 數從 N 變 N-1 與 emulator 半活
`flutter devices` / `flutter run` 卡住又印 `Error -2 retrieving device properties` 時回來看。根因是 Android emulator 半活狀態,附恢復順序。
- Gradle Configuration 時序陷阱:afterEvaluate、evaluationDependsOn、finalized properties
Gradle 報 `Cannot run Project.afterEvaluate ... already evaluated` 或 `property is final`。時序錯誤同源於 callback 註冊太晚或屬性賦值太晚,附各 API 的正確時機。
- Gradle 強制覆寫 plugin 的 JVM target:Kotlin 與 Java 的切入點不對稱
Kotlin / AGP 升級後 build 報 `Inconsistent JVM-target compatibility`。為何要強制覆寫 plugin 的 JVM target,以及 Kotlin 與 Java 設定切入點的不對稱。
- Android 無線調試連接指南
ADB 無線偵錯的配對與連接流程,含 device offline、端口錯誤、AP 隔離等連線中斷的排查。