如果您將應用程式發布到 Google Play,應建構並上傳 Android App Bundle。屆時 Google Play 就會自動套用 根據每位使用者的裝置設定產生並提供經過最佳化的 APK,因此使用者只需下載 執行應用程式所需的程式碼和資源如果您要 無法發布至 Google Play,但您必須自行建構、簽署及管理各個 APK。
開發 Android 應用程式時,如果想充分運用 Google Play 上的多個 APK,請務必從一開始就採用一些良好做法,以免在開發過程中遇到不必要的麻煩。本課程將說明如何為 分別涵蓋不同的螢幕大小類別。此外,我們也會介紹一些必要工具 盡量減少維護多個 APK 程式碼集
確認您需要多個 APK
如果要製作適用於多種尺寸的 Android 裝置的應用程式 自然會希望應用程式利用大型裝置上的所有可用空間 而不影響小螢幕的相容性或可用性。乍看之下,您可能會認為支援多個 APK 是最佳解決方案,但實際上並非如此。使用單一 APK 這份修訂版 APK 開發人員指南中一節會提供一些實用資訊,說明如何 方法是使用單一 APK,包括使用支援資料庫。請務必詳閱 「支援多種螢幕」指南 還有 Google 提供的支援資料庫 可以透過 Android SDK 下載,此 SDK 可讓您在 Honeycomb 之前的裝置上使用片段 ( 就可以更輕鬆地在單一 APK 支援多螢幕支援)。
如果易於管理,將應用程式限定於單一 APK 可帶來許多好處。 包括:
- 發布和測試更輕鬆
- 只需維護一個程式碼集
- 應用程式可因應裝置設定變更進行調整
- 只要在所有裝置上還原應用程式即可
- 不用擔心市場偏好、來自「升級」的行為從一個 APK 到 或與哪個類別的裝置搭配使用的 APK
本課程的其餘部分假設您已研究這個主題,並認真吸收連結資源中的內容,並判斷多個 APK 是應用程式的正確路徑。
以圖表呈現需求
請先建立簡單的圖表,以便快速判斷所需的 APK 數量和畫面 每個 APK 的封面大小。幸好,您可以輕鬆又快速地列出需求 以供日後參考一開始先使用一列儲存格來表示各種螢幕大小 Android 平台提供的所有功能
小 | 正常 | 大 | 特大 |
現在只需在圖表中加上顏色,讓各種顏色都能代表一個 APK。以下範例說明如何將各個 APK 套用至特定範圍的螢幕尺寸。
小 | 正常 | 大 | 特大 |
您也可以依需求建立兩個「小而所有其他 APK」的 APK或「放大」 。」為圖表上著色還能讓內部團隊內部溝通更容易 — 您還可以 現在不論螢幕類型為何,只要將每個 APK 稱為「藍色」、「綠色」或「紅色」即可 前提是該網路覆蓋了
將所有通用程式碼和資源放入程式庫專案
無論您要修改現有的 Android 應用程式,還是從頭開始建立應用程式, 您在程式碼集執行的第一項工作 到目前為止最重要的是全部顯示 只需要更新一次 (例如語言本地化字串 色彩主題、共用程式碼中修正的錯誤),從而改善開發時間並減少 能輕鬆避開的錯誤機率
注意:雖然如何建立和 還可加快學習速度 請參閱建立 Android 程式庫一文。
如果您打算將現有應用程式轉換成支援多個 APK 的功能, 針對每個本地化字串檔案、值清單、佈景主題檢查程式碼集 不會因 APK 版本而改變的顏色、選單圖示和版面配置 全都在程式庫專案中不會大幅變更的程式碼 也要前往程式庫專案您可能會擴充這些類別,從 APK 新增一或兩個方法。
另一方面,如果您是從頭開始建立應用程式,請嘗試 並先在程式庫專案中編寫程式碼, 個別 APK長期下來比起新增單一檔案 使用起來會更加方便 其次,接著幾個月,嘗試確定這個 blob 是否可以向上移動 不必向上螺絲,就能前往程式庫專區
建立新的 APK 專案
每個要發布的 APK 都有一個獨立的 Android 專案。簡單易用 請將程式庫專案和所有相關 APK 專案放在同一個上層資料夾下。 此外,請注意,每個 APK 不一定都要使用相同的套件名稱,但不一定要重複。 此時,開發人員會向程式庫提供套件名稱如果遵循配置的情況下有 3 個 APK 您的根目錄可能如下所示:
alexlucas:~/code/multi-apks-root$ ls foo-blue foo-green foo-lib foo-red
建立專案後,請將程式庫專案新增為每個 APK 專案的參照。如果 在您的程式庫專案中定義起始活動,並在 APK 中擴充該活動 專案。程式庫專案中定義的起始活動可讓您 應用程式初始化時,所以個別 APK 不需要 重新導入「通用」初始化 Analytics、執行授權檢查等 從 APK 到 APK 沒有太大變化的初始化程序。
調整資訊清單
當使用者透過 Google Play 下載使用多個 APK 的應用程式時,系統會根據兩個簡單的規則選擇要使用的正確 APK:
- 資訊清單必須顯示特定 APK 符合資格
- 在符合資格的 APK 中,版本號碼最高
舉例而言,假設每個 APK 都有對應的多組 APK 已設為支援所有大於「目標」的螢幕尺寸螢幕大小。個別來說,每個 APK 的可能範圍如下所示:
小 | 正常 | 大 | 特大 |
小 | 正常 | 大 | 特大 |
小 | 正常 | 大 | 特大 |
不過,如果使用「最高的版本號碼」只要在其中設定 versionCode 屬性 每個 APK 的紅色 ≥ 藍色 ≥ 藍色,實際上會顯示如下圖所示:
小 | 正常 | 大 | 特大 |
接著,我們再假設 Red APK 有額外要求。 開啟 Android 裝置的「Google Play 篩選器」頁面 開發人員指南列出了可能的原因。舉例來說,假設紅色需要前置鏡頭。事實上,紅色 APK 的整個點 就是使用額外的 可用的螢幕空間,使用前置鏡頭進行娛樂。事實證明 並非所有大螢幕裝置甚至配備前置鏡頭!是恐怖的!
不過,如果使用者透過這類裝置瀏覽 Google Play,Google Play 會查看 請看,紅色將前置鏡頭列為必備條件,然後安靜無聲忽略, 即使在「數位天堂」中,「紅色」與「當天」的裝置不符。就會看到 「綠色」不僅與超大型裝置相容,也不在乎 前置鏡頭!但使用者還是可以從 Google Play 下載這個應用程式 儘管整部前置鏡頭發生問題,但目前仍有某個 APK 支援該特定螢幕 大小
如要將所有 APK 保留在個別的「測試群組」中,請務必取得理想的版本代碼 配置。您可以在 開發人員指南本例的 APK 組合只會處理 3 個可能 只需要 1,000 個以 1,000 個為單位遞增即可。這個 如下所示:
藍色:1001、1002、1003、1004...
綠色:2001、2002、2003、2004...
紅色:3001、3002、3003、3004...
總而言之,您的 Android 資訊清單看起來會像 包括:
藍色:
<manifest xmlns:android="http://schemas.android.com/apk/res/android" android:versionCode="1001" android:versionName="1.0" package="com.example.foo"> <supports-screens android:smallScreens="true" android:normalScreens="true" android:largeScreens="true" android:xlargeScreens="true" /> ...
綠色:
<manifest xmlns:android="http://schemas.android.com/apk/res/android" android:versionCode="2001" android:versionName="1.0" package="com.example.foo"> <supports-screens android:smallScreens="false" android:normalScreens="false" android:largeScreens="true" android:xlargeScreens="true" /> ...
紅色:
<manifest xmlns:android="http://schemas.android.com/apk/res/android" android:versionCode="3001" android:versionName="1.0" package="com.example.foo"> <supports-screens android:smallScreens="false" android:normalScreens="false" android:largeScreens="false" android:xlargeScreens="true" /> ...
請注意,從技術層面來說,多個 APK 會搭配使用 supports-screens 標記或 compatible-screens 標記。一般而言,建議使用支援螢幕。 在同一個資訊清單中使用這兩種標記通常不是個好主意。這項服務 反而會變得複雜又複雜 且增加發生錯誤的機會 另請注意,代管設定檔並未利用預設值 (small 和 normal 預設為一律為 true),而是明確設定每個螢幕大小的值。這麼做可以避免日後的麻煩。舉例來說,如果資訊清單 目標 SDK:由於 xlarge 大小尚不存在,9 會自動設為 false。 所以請明確
檢查正式發布前檢查清單
上傳至 Google Play 前,請仔細檢查下列項目。請注意 與多個 APK 特別相關,但不代表一份完整的檢查清單 上傳至 Google Play 的應用程式
- 所有 APK 的套件名稱都必須相同
- 所有 APK 都必須使用相同的憑證簽署
- 您希望 APK 支援的所有螢幕大小,在資訊清單中設為 true。每個要避免的螢幕大小,都設為 false
- 再次檢查資訊清單篩選器是否有衝突的資訊 (僅支援 XLARGE 螢幕的 APK 不會顯示給任何人)
- 每個 APK 的資訊清單在至少一個支援的螢幕、openGL 紋理或 平台版本
- 請嘗試在至少一部裝置上測試每個 APK。最令人興奮的 開發機器上的自訂裝置模擬器。大發雷霆!
另外,建議您先檢查已編譯的 APK 再推送至市場,確保沒有出現 以免在 Google Play 上隱藏您的應用程式。如果使用 「aapt」如果偏好在終端機視窗中工作 可使用 Google Cloud CLI gcloud 指令列工具Aapt (Android 資產封裝工具) 是建構程序的一部分 也能輕鬆檢查 Android 應用程式
>aapt dump badging package: name='com.example.hello' versionCode='1' versionName='1.0' sdkVersion:'11' uses-permission:'android.permission.SEND_SMS' application-label:'Hello' application-icon-120:'res/drawable-ldpi/icon.png' application-icon-160:'res/drawable-mdpi/icon.png' application-icon-240:'res/drawable-hdpi/icon.png' application: label='Hello' icon='res/drawable-mdpi/icon.png' launchable-activity: name='com.example.hello.HelloActivity' label='Hello' icon='' uses-feature:'android.hardware.telephony' uses-feature:'android.hardware.touchscreen' main supports-screens: 'xlarge' supports-any-density: 'true' locales: '--_--' densities: '120' '160' '240'
檢查 aapt 輸出內容時,請務必確認 supports-screens 和 compatible-screens 的值不會互相衝突,且不會因為您在資訊清單中設定的權限而新增非預期的「uses-feature」值。在上例中,如果不是所有裝置,至少大多數裝置都會看不到 APK。
為什麼?藉由新增必要權限 SEND_SMS,android.hardware.telephony 的功能需求已間接增加。由於大多數 (非所有) x 大型裝置是不含電話通訊硬體的平板電腦,因此 Google Play 在這些情況下會篩除這個 APK,直到日後的裝置大小足以回報為超大螢幕尺寸,且擁有電話硬體。
不過,只要將下列程式碼新增到您的 manifest:
<uses-feature android:name="android.hardware.telephony" android:required="false" />
系統也會間接新增 android.hardware.touchscreen
要求。如果您想在非觸控螢幕裝置的電視上顯示 APK,請在資訊清單中加入以下內容:
<uses-feature android:name="android.hardware.touchscreen" android:required="false" />
完成發布前檢查清單後,請將 APK 上傳至 Google Play。瀏覽 Google Play 時,可能需要經過一點時間才會顯示這個應用程式,但完成後 執行最後檢查將應用程式下載至任何可能的測試裝置,以確認 指出 APK 鎖定的是指定裝置
如要進一步瞭解如何在 Google Play 發布多個 APK,請參閱 支援多個 APK。