Hi there, I’m Daniel. 👋

  • 一位 Android 工程師,每天對於如何在茫茫技術海中存活感到憂慮。
  • 每次動筆都不斷告訴自已:筆記不是為了別人,而是為了自己。
  • 在這裡,我將分享我在開發中經歷的大小事,不論是各種奇怪的 Bug,還是學習過程中的心得與反思;偶爾也會夾雜一些因為興趣而產生的分享。
  • 希望每個走進來的朋友,都能在這裡找到對你有幫助的資訊。

SonarQube Community Build 新手指南:從安裝到整合 Android 專案的完整教學

SonarQube Community Build 是免費的原始碼品質與資安檢測工具。本篇文章從環境需求、安裝步驟到以 Gradle 建置的 Android 專案整合,完整示範如何在本機快速導入 SonarQube 並開始進行程式碼分析。

Published on December 3, 2025 · 2 min · 393 words · Daniel Huang

Android 資安 | 使用 SQLCipher 替 Room 資料庫加密

前言 對,又是資安檢測。XD 前一篇 Android 資安 | 螢幕覆蓋攻擊(Tapjacking)防護筆記 就是因為資安檢測所做的調整,而這次被檢測出來的項目,是 4.1.2.3.4 行動應用程式應避免在關閉及登出後將敏感性資料儲存於冗餘檔案或日誌檔案中。 報告的詳細說明指出,App 本地儲存的 SQLite 資料庫檔案,被檢測出包含使用者的敏感資訊(如行動電話號碼)。按照報告的步驟,確實能輕易地從資料庫檔案中讀取到這些未經保護的資料。 要讓檢測單位篩檢不出敏感資訊的方法有很多,例如只針對敏感資料欄位加密。但考量到 App 尚處於開發階段,同時提早因應未來可能會越來越嚴格的資安標準,直接將整個 SQLite 資料庫加密,似乎是更好的方法, 廢話不多說,我們就來看看如何在 Android 上,使用 SQLCipher 為 Room 資料庫進行加密吧~ 什麼是 SQLCipher 首先,先認識一下本篇文章的主角,SQLCipher。 SQLCipher 是由 Zetetic 公司所開發與維護的 SQLite 加密套件,它透過簡單的擴充,為 SQLite 資料庫提供了透明、可靠的加密層。 它的主要特性包含: 透明加解密:在資料讀取與寫入時,SQLCipher 會在背景自動進行加解密,開發者無需修改原有的 SQL 查詢邏輯。 可靠的加密演算法:採用 AES-256 位元演算法,這是目前公認的安全標準。 頁面級加密:對資料庫的每一頁(Page)獨立加密,確保資料的完整性與安全性。 跨平台支援:支援 Android, iOS, .NET, macOS, Linux 等多個平台。 彈性的授權:免費的社群版到功能更豐富的付費商用版都有,開發者可根據專案需求選擇。 大概認識 SQLCipher 後,就來看看在 Android 上該如何與 Room 搭配實作吧! 整合 SQLCipher 與 Room 步驟 1:加入 Gradle 依賴 首先,在 app module 的 build.gradle.kts 或 build.gradle 檔案中,加入 SQLCipher 的依賴。 ...

Published on December 2, 2025 · 2 min · 387 words · Daniel Huang

Android 資安 | 螢幕覆蓋攻擊(Tapjacking)防護筆記

今年度的資安檢測基準新增了「螢幕覆蓋攻擊」的檢測項目。剛好最近送測的專案也因此被點出不符規範,加上後續的專案預期都會受到影響,因此特別整理這篇筆記,讓自己能快速掌握概念,並理解各種防護方式的實作細節。 什麼是螢幕覆蓋攻擊(Screen Overlay Attack)? 圖片來源: Android Doc - Privacy and Security - Tapjacking 根據 行動應用資安聯盟 - 行動應用App基本資安檢測基準V4.0 裡的描述: 攻擊者的應用程式會在行動應用程式上繪製一個視窗,誤導使用者將自己點擊的入侵視窗當作正常視窗。 換句話說,螢幕覆蓋攻擊本質上就是「用一層假的 UI 蓋住真的 UI」。攻擊者可能會模擬系統警示框、模擬 App 畫面,或做成任何能誘導操作的浮動視窗。 在網頁領域,它的行為類似 ClickJacking;而在 Android 官方文件中,這類攻擊則被稱為 Tapjacking。 如何避免 App 遭遇螢幕覆蓋攻擊? 理解攻擊手法後,防範策略可以分成這幾個方向: 避免 App 不被其他 App 遮蔽。 在 App 畫面被遮蔽時,使觸控事件無效。 🙃 警告使用者不要亂安裝奇怪的東西跟亂給權限… 🙃 以下整理幾種常見、有效、並且可依系統版本選擇的防護方式。 方法一、WindowManager.LayoutParams.FLAG_SECURE 支援版本:API 1 起即可使用。 效果:阻止 Overlay、阻止截圖、阻止投影。 1 2 3 4 5 // 禁止其他程式於上層繪製 / 禁止截圖 / 禁止投影 activity.window.setFlags( WindowManager.LayoutParams.FLAG_SECURE, WindowManager.LayoutParams.FLAG_SECURE ) 在 Activity.onCreate() 加上上述設定後,不僅可以防止 Overlay,也會一併禁止截圖與投影。這也是許多銀行、醫院等高資安需求 App 的常見做法。 ...

Published on November 19, 2025 · 3 min · 481 words · Daniel Huang

為什麼 Play Console 上的 16 KB Page Size 與 APK Analyzer 的結果不一樣

開發 Android App 時遇到 Play Console 顯示的 16 KB Page Size 與 APK Analyzer 檢查結果不一致?本文分享原因分析與實際解法,幫助你正確驗證 16 KB 對齊狀態。

Published on September 17, 2025 · 3 min · 474 words · Daniel Huang

Android Studio 編譯失敗 - Error loading build artifacts

前幾天在公司專案遇到一個奇怪的 Bug,這裡筆記一下解決過程。 問題描述 在 Android Studio 點選 Run 'app' 時,專案完全沒編譯就直接報錯,錯誤訊息如下: 1 Error loading build artifacts from: D:\Daniel\Projects\cropssurvey-mk2-android\app\build\intermediates\apk_ide_redirect_file\debug\createDebugApkListingFileRedirect\redirect.txt 環境資訊 我的 Android Studio 設定參數如下: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 Android Studio Meerkat Feature Drop | 2024.3.2 Patch 1 Build #AI-243.26053.27.2432.13536105, built on May 22, 2025 Runtime version: 21.0.6+-13368085-b895.109 amd64 VM: OpenJDK 64-Bit Server VM by JetBrains s.r.o. Toolkit: sun.awt.windows.WToolkit Windows 11.0 GC: G1 Young Generation, G1 Concurrent GC, G1 Old Generation Memory: 4096M Cores: 16 Registry: debugger.new.tool.window.layout=true ide.experimental.ui=true Non-Bundled Plugins: one.util.ideaplugin.screenshoter (1.8.1) com.wzc.sw.plugin (1.3.3) Dart (243.26753.1) com.duke.screenmatch (3.2) idea.plugin.protoeditor (243.22562.13) com.developerphil.adbidea (1.6.19) com.godwin.kdocer (1.6) org.sonarlint.idea (10.27.0.81781) io.flutter (86.0.1) 嘗試過的解法(失敗) Sync Project with Gradle Files Rebuild Project Invalid Cache and Restart 重開 Android Studio 刪除 /.gradle 與 /.idea 兩個資料夾。參考來源 結果,以上方法,都 沒 有 用 … ...

Published on September 12, 2025 · 1 min · 193 words · Daniel Huang