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

前言 最近應該不少 Android 開發者都有在 Google Play Console 收到一則關於 16 KB 記憶體分頁大小 (page size) 的政策審查通知。 依據官方文件,開發者有四種途徑可以檢查 App 是否支援 16 KB 記憶體分頁大小: 確認是否有使用 Native Code。 如果完全沒有使用,基本上預設會是支援的狀態。 使用 Android Studio 中的 APK Analyzer。 依靠 Android Studio 編譯階段時的自動提醒。 透過 Command-Line 工具 。 就我手上維護的專案來說,有些使用了第三方 Native Code Libs,另一些則是 Android 官方提供的 (例如 CameraX )。 問題 在實際用 APK Analyzer 檢查的時候,我發現了一個狀況。 Google Play Console 顯示結果與本地檢查不一致 使用環境:Android Studio Meerkat | 2024.3.1 。 Google Play Console 明確指出 libimage_processing_util_jni.so 不支援 16 KB ,但不管是檢查 APK 還是 AAB , APK Analyzer 都沒有指出有 lib 不支援。 ...

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

Android 15 後模擬器鍵盤不顯示,如何開啟 Soft Keyboard?

問題說明 在 Android Studio Android 15 後的模擬器中,預設情況下開啟鍵盤會看到這樣的畫面: 畫面上只有一個可拖曳的設定 UI,卻沒有顯示任何鍵盤。 雖然你依然可以透過電腦實體鍵盤輸入文字,但若需要測試 軟體鍵盤與 App UI 的互動,就會非常不方便。 如何改回一般鍵盤顯示? 感謝 StackOverflow: How can I make the Android emulator show the soft keyboard? 上的解答,可以透過以下方式啟用模擬器的 Soft Keyboard: 方法一:透過模擬器浮動選單 在已點選輸入框的狀態下,點選模擬器畫面右側的 垂直浮動工具列,找到三條橫線並開啟選單,選擇 Settings。 在 Write in text fields 頁面,滑動到下方,將 Show on-screen keyboard 設為「開啟」。 完成後,就能看到軟體鍵盤正常顯示。 方法二:透過系統設定進入 若無法直接進入,可改用以下路徑: 開啟 系統設定 Settings 點選 System > Keyboard > On-screen keyboard 選擇 Gboard > Write in text fields 開啟 Show on-screen keyboard 完成設定後,鍵盤應該就會出現了: ...

Published on August 27, 2025 · 1 min · 83 words · Daniel Huang

Android Studio Gemini Code Assist 安全設定:使用 .aiexclude 保護敏感資料

前言 許多開發者已經習慣使用各種 AI 工具來加速開發流程。對於 Android 開發者來說,如果不想額外付費,Google 官方推出的 Gemini Code Assist 無疑是最佳選擇之一。 不過,為了讓 Gemini 能提供貼近專案脈絡的建議,它需要讀取你專案內的檔案。但你是否曾經思考過:哪些檔案應該避免被 AI 存取? 保護機敏資料 這點就像我們使用 Git 時會建立 .gitignore 來排除不該同步的檔案一樣——像是金鑰、憑證等敏感資料。 在使用 Web 版 Gemini 時,避免提供檔案相對簡單;但在 Android Studio 中,則需要透過特定的機制進行設定。而這項機制,就是本文主角:.aiexclude 檔案。 認識 .aiexclude .aiexclude 是什麼? .aiexclude 的作用,就如同 .gitignore,放在專案資料夾下,告訴 Gemini 哪些檔案或資料夾應該排除在外、不被存取或索引。 .aiexclude 的語法規則與 .gitignore 完全一致,且支援路徑、萬用字元(如 *、**)、副檔名等。 實用語法範例 語法 說明 dev.properties 排除目錄中所有名稱為 dev.properties 的檔案 KEYS.* 排除所有名稱為 KEYS、任意副檔名的檔案 *.api 排除所有 .api 副檔名的檔案 /*.kt 僅排除 .aiexclude 所在目錄下的 .kt 檔案 my/sensitive/dir/ 排除指定目錄與其所有子目錄 my/sensitive/dir/**.txt 排除指定目錄及子目錄下所有 .txt 檔案 my/sensitive/dir/*.txt 僅排除該目錄下的 .txt 檔案,不包含子目錄 只要在專案根目錄(或任一子目錄)建立 .aiexclude 檔案,即可立即生效。 ...

Published on June 9, 2025 · 1 min · 136 words · Daniel Huang

Android Studio 產製 SBOM 軟體物料清單

前言 公司專案近期收到客戶的要求,疑似因為數發部想推動公部門的開放原始碼,需要廠商填寫系統相關資訊,其中一項就包含 SBOM 軟體物料清單。 什麼是 SBOM 軟體物料清單 SBOM 全稱為 Software Bill of Materials,中文翻譯為軟體物料清單。 白話來說,SBOM 就是一份描述軟體專案使用到的套件清單,就像買零食會看到的原料清單一樣。 SBOM 需要包含: 供應商名稱 套件名稱 套件版本 其他可識別套件的 ID 依賴關係 SBOM表作者 產表時間 SBOM 的報告格式: Software Package Data Exchange (SPDX): Linux 基金會推動。 CycloneDX: OWASP 發行。 Software Identification (SWID) Tags: ISO & IEC 發行。 為什麼要做 讓採購方可以清楚知道,該軟體中有使用到哪些套件,進而在採購與使用前發現有疑慮的資安問題。 OCF Lab 拒絕受駭!美國推行「軟體物料清單」公開軟體組成,採購更安心 實作 SPDX Gradle Plugin Github: spdx/spdx-gradle-plugin libs.versions.toml 1 2 3 4 5 6 7 [versions] # ... spdx = "0.8.0" [plugins] # ... spdx = { id = "org.spdx.sbom", version.ref = "spdx"} Top-Level build.gradle.kts 1 2 3 4 5 6 // Top-level build file where you can add configuration options common to all sub-projects/modules. plugins { // 略... // 加入 alias(libs.plugins.spdx) apply false } build.gradle.kts (App Level) 1 2 3 4 5 6 7 8 9 10 11 12 13 plugins { // 略... alias(libs.plugins.spdx) } // 加入以下 spdxSbom { targets { create("release") { configurations.set(listOf("releaseRuntimeClasspath")) } } } 📂 參考資料 Issue: Project Configuration Question #49 ...

Published on June 20, 2024 · 3 min · 480 words · Daniel Huang