「包名是 App 的唯一標識,那一個項目只能有一個包嗎?如果有多個包,/data/data/ 下的應用目錄叫什麼名?」
| 概念 | 定義位置 | 作用 | 命名規則 |
|---|---|---|---|
| Application ID (applicationId) | build.gradle 中 defaultConfig { applicationId "com.example.app" } |
**應用在設備、Play 商店、系統中的全局唯一標識**。決定 /data/data/ 目錄名、數據庫文件名、SharedPreferences 文件前綴、進程名默認值等。 |
通常採用反域名風格,全局唯一。構建時可通過 productFlavors 為不同渠道生成不同 ID(如 com.example.app.free, com.example.app.pro)。 |
| Java/Kotlin 包名 | 源碼文件頂部 package com.example.app;、目錄結構 src/main/java/com/example/app/ |
代碼組織的命名空間,防止類名衝突。編譯後生成的 R.java、BuildConfig.java 所在的包。 |
慣例與 applicationId 保持一致,但**可以不同**。項目中可有無數個子包(com.example.app.ui, com.example.app.data, com.example.app.utils 等)。 |
| Manifest 包名 (package 屬性) | AndroidManifest.xml 根標籤 <manifest package="com.example.app"> |
AGP 3.0+ 中**不再直接使用**,構建工具會自動用 applicationId 替換。歷史上曾同時承擔上述兩種角色。 |
現建議不在 Manifest 寫死,僅在 build.gradle 設置 applicationId。 |
applicationId 是唯一的(每個 Build Variant 一個)。/data/data/ 下目錄叫什麼? **完全等於 applicationId**。與 Java 包名無關。即使你有 100 個 Java 包,數據目錄仍只有一個,名為 com.example.app(或構建變體對應的 ID)。applicationId 指定的包下(而非 Java 源碼包)。這是 AGP 3.0+ 的行為,確保資源 ID 與應用 ID 綁定。applicationId 與主 Java 包名一致(如同為 com.company.project),減少認知負擔。productFlavors 區分渠道/版本時,通過 applicationIdSuffix 追加後綴(.dev, .test, .googleplay),而非修改 Java 包結構。applicationId,只有 Java 包名,最終合併到宿主 App 的 applicationId 下。總結:**Application ID 是「身份證」,Java 包名是「房間號」**。一個人(App)只有一張身份證,但可以有很多房間(包)存放不同用途的代碼。數據目錄綁定身份證,與房間數量無關。