Just My Life & My Work

Archive for the ‘教學’ Category

[Flutter] Debug 包和 Release 包

由於在整合國際牌的推播套件,搞了一星期遇卡關,iOS 測試沒問題,Android 取得裝置 Token 噴錯,最後發現是 Debug 包和 Release 包的問題,然後大陸工程師 10/1-10/9 假期中⋯⋯剛好趁這時候來徹底角解兩者差異。🥸

絕大部分時刻我都是包 Release 版本,而在上海的夥伴則是包 Debug 版本,在測試時發現兩包有不同反應,後來追問題才曉得套件有 Release/Debug 差異。

flutter build apk --flavor dev --release
flutter build apk --flavor dev --debug

在 Flutter 開發中,DebugRelease 版本扮演著不同的角色,開發者需要了解兩者差異,才能在開發與上架流程中正確選擇。

.

Debug 版本主要用於開發與測試。它啟用了 Flutter 的 Hot ReloadHot Restart,讓開發者能快速驗證修改結果。程式碼使用 JIT(Just-In-Time)編譯,啟動較慢、效能較低,但換來靈活的除錯體驗。Debug 版本通常包含完整的日誌輸出、Debug Banner,以及可以透過 DevTools 檢查 widget tree、記憶體與效能。它使用系統提供的 debug key 簽名,因此無法上架商店。

相對地,Release 版本則是提供給最終用戶的正式包。Flutter 在這個模式下會使用 AOT(Ahead-Of-Time)編譯,將 Dart 程式轉換為原生機器碼,大幅提升效能與啟動速度。Release 版本會進行最佳化,例如代碼壓縮與資源精簡,App 體積更小、更流暢。它不支援 Hot Reload,也不允許連接 DevTools,日誌輸出也會受到限制。最重要的是,Release 版本需要使用正式的 keystore 簽名,才能提交到 Google Play。

簡而言之,Debug 版本適合開發與測試,強調靈活性;Release 版本則面向使用者,追求效能與穩定性。開發者必須在不同階段切換模式,才能兼顧效率與品質。

(繼續閱讀…)

[iOS] 推播驗證區分 p12 憑證與 p8 金鑰

最近需要整合中國可比較順利收到遠端推播的平台極光,我們決定使用最新的 Apple 推播通知(APNs)認證機制。

先前已有在文章:Apple 推播通知服務憑證更新研究過,了解舊的 p12 憑證與新的 p8 金鑰之差異,有更好的方法就與時俱進吧!

.

1. .p12 憑證

  • 舊機制:以前要使用 APNs,必須在 Apple Developer 產生「推播憑證(Push Certificate)」,然後把它匯出成 .p12 檔案(包含憑證與私鑰)。
  • 綁定性高:這個 .p12 是針對「單一 App」產生的,每個 App 要推播就得有自己的憑證。
  • 管理麻煩:如果有很多 App,要管理很多 .p12,到期還得逐一更新。

2. .p8 金鑰

  • 新機制 (2016 後):Apple 推出了「APNs Auth Key」機制,用 .p8 私鑰檔案來取代傳統憑證。
  • 好處
    • 一把 .p8 金鑰可以同時支援多個 App,不需要為每個 App 建立不同檔案。
    • 不會每年過期,只要不撤銷,金鑰就一直有效。
    • 伺服器端使用 JWT(JSON Web Token)來跟 APNs 做身份驗證,安全性更好。
  • 限制:一個 Apple 開發者帳號最多能建立 2 組 APNs .p8 金鑰。

小結

  • .p12 → 舊式、以「App」為單位的憑證,會過期,需要管理多份。
  • .p8 → 新式、以「帳號」為單位的金鑰,不會過期,維護更簡單。
(繼續閱讀…)

[Flutter] iOS CICD 流程

原本 App Team 包含我僅有兩位開發者,我負責領導開發忙得不可開交。去年 Q4,親自招募兩位新人進駐,我終於可以有空閒時間做 Flutter App 的 CICD。🙂

2019 年在港商工作時,已有建置 iOS CICD 流程經驗,所以首選 Jenkins 來作為持續整合工具,節省研究時間,稍微比較其他工具後,認為 Jenkins 相關套件外掛多,未來有需有可以擴充。另因 Jenkins 有直覺的操作介面,使得無論是工程人員或是團隊其他成員,都能迅速上手。

註:

  • CI(Continuous Integration,持續整合)
  • CD(Continuous Delivery / Continuous Deployment,持續交付 / 持續部署)

簡單比喻

  • CI:像是每次寫完一小段文章就馬上拼到全文裡,再跑拼字檢查。
  • CD:檢查通過後,自動把這篇文章印刷出版(交付)或直接送到讀者家(部署)。

我將 Shell Scrip 流程圖解如下:

.

(繼續閱讀…)

增加 Android 模擬器容量

從開發 Flutter App 開始,我除了要使用 iOS 模擬器外,還要召喚 Android 模擬器,兩平台護衛協助我研發與測試。😀

通常我都使用預設狀態的模擬器,一般來說不太會有問題。然而對於不熟 Android 模擬器的我,遇到比較棘手的像是模擬器空間不足,使得我無法安裝 APK 檔。

.

(繼續閱讀…)

[Flutter] Package 與 Plugin

平常寫 Flutter App,我都會稱第三方套件為 Package,隱約曉得 Package 又可細分有無跟平台相依的套件。後來去了解後,才知道原來是有區分為 Package 與 Plugin。

翻成中文:

  • Package:套件
  • Plugin:外掛

.

(繼續閱讀…)

[C/C++] SDL 與 FFMEPG 播放影片

SDL (Simple DirectMedia Layer)FFmpeg (Fast Forward mepg) 是兩個獨立的函式庫,可以結合使用以實現視訊播放。

(繼續閱讀…)

Flutter 例外處理

透過 Flutter 框架開發的 App (含 iOS 與 Android) 已經上線,開始要追蹤用戶使用時,是否有發生不預期的狀況。

如同開發原生 iOS App 那樣,我將 Firebase Crashlytics 導入 Flutter App 中,一旦有任何崩潰、例外狀況,就會被記錄且上傳到 Firebase,讓我每天能明確掌握 App 使用狀況,並在適當時機修正並釋出新版本。🙃

這是我開啟記錄「例外」事件功能後,在 Firebase 上所搜集統計的資料。在沒有開啟此功能前是一片祥和,幾乎沒有「崩潰」事件。然而我為了優化 App 各種不預期的使用狀況,便有需要去了解會有哪些「例外」事件。🤔

(繼續閱讀…)

[C/C++] SDL 非同步執行任務

想要實現 SDL 和 FFmpeg 非同步方式播放影片,涉及到在一個單獨的線程中解碼影片幀,並在主線程中更新 SDL 視窗。之後做到同時播放影片,還能偵測滑鼠點擊事件。

(繼續閱讀…)

[C/C++] 取得本機硬碟容量

因為要儲存持續錄製的影音檔,本機容量的使用量會很快耗盡,於是需要知道本機硬碟容量可用空間剩多少。

(繼續閱讀…)

extern “C" 的作用為何?

有時候在寫 C/C++ 程式,引用了某些 Library,編譯會出現錯誤,後來查找原因

FFmpeg 編譯: undefined reference to ‘av_frame_alloc()’

原來該 Library 是以純 C 寫的,需要以 extern "C"來讓編譯器識別。

看來我真的對 C/C++ 不熟呢~😜

(繼續閱讀…)

標籤雲