建立可支援多種尺寸的多個 APK

如果您將應用程式發布到 Google Play,應建構並上傳 Android App Bundle。屆時 Google Play 就會自動套用 根據每位使用者的裝置設定產生並提供經過最佳化的 APK,因此使用者只需下載 執行應用程式所需的程式碼和資源如果您要 無法發布至 Google Play,但您必須自行建構、簽署及管理各個 APK。

開發 Android 應用程式,善用 Google Play 上的多個 APK 時, 請務必一開始就採用一些好習慣,避免不必要的頭痛 以便深入開發程序本課程將說明如何為 分別涵蓋不同的螢幕大小類別。此外,我們也會介紹一些必要工具 盡量減少維護多個 APK 程式碼集

確認您需要多個 APK

當您嘗試建立可在眾多 Android 裝置上運作的應用程式時,自然希望應用程式在每部裝置上都能呈現最佳效果。決定要 充分利用大螢幕空間,但仍可在小螢幕裝置上運用新的 Android API 功能或視覺紋理,適用於先進的裝置,但不會捨棄舊裝置。這可能會 似乎在初期支援多個 APK 是最佳解決方案,但這通常不是 確認是否屬於此情況使用 單一 APK 請參閱多份 APK 指南中的部分實用資訊,瞭解如何 只要使用單一 APK 就能提供這些功能,包括使用我們的支援資料庫。 參閱 Android 開發人員指南

如果您可以管理,將應用程式限制在單一 APK 中,可享有以下幾項優勢:

  • 發布及測試變得更簡單
  • 只要維護一個程式碼集
  • 應用程式可因應裝置設定變更而調整
  • 跨裝置應用程式還原功能正常運作
  • 您不必擔心市場偏好設定、從一個 APK 升級至另一個 APK 的行為,或是哪個 APK 與哪個裝置類別相符

本課程的其餘部分假設您已研究過這個主題,但它剛好吸收 ,並判定多個 APK 是適用於 應用程式。

以圖表呈現需求

請先建立簡單的圖表,以便快速判斷所需的 APK 數量和畫面 每個 APK 的封面大小。幸好,您可以輕鬆快速地繪製需求表,方便日後參考。假設您想將 APK 分割成兩個維度:API 和螢幕大小針對每一組可能的值和顏色,建立一個表格並以列和欄呈現 在某些「blob」中,每種顏色都代表一個 APK。

3 4 5 6 7 8 9 10 11 12 +
正常
特大

以上為包含四個 APK 的範例。藍色代表所有小型/一般螢幕裝置,綠色代表大 螢幕裝置;紅色則適用於超大型螢幕裝置,API 範圍為 3 至 10。紫色是 它適用於所有螢幕大小,但僅適用於 API 11 以上版本。更重要的是 瀏覽這張圖表,您就可以立刻知道哪個 APK 涵蓋了任何特定 API/螢幕尺寸組合。目的地: 也會因為「我們是否測試過紅色的 ?」很多 能輕鬆詢問寶寶,而非「我們根據 Xoom 測試了 3 到 10 x 大 APK 嗎?」列印此內容 繪製圖表並交給每位處理程式碼集的人員生活變得更輕鬆

將所有通用程式碼和資源放入程式庫專案

無論您要修改現有的 Android 應用程式,還是從頭開始建立應用程式, 您在程式碼集執行的第一項工作 到目前為止最重要的是全部顯示 只需要更新一次 (例如語言本地化字串 色彩主題、共用程式碼中修正的錯誤),從而改善開發時間並減少 能輕鬆避開的錯誤機率

注意:雖然如何建立和 還可加快學習速度 請參閱建立 Android 程式庫一文。

如果您要將現有應用程式轉換為支援多個 APK,請在程式碼庫中搜尋每個經過本地化的字串檔案、值清單、主題顏色、選單圖示和不會在 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-purple
foo-red

建立專案後,請將程式庫專案新增為每個 APK 專案的參照。如果 在您的程式庫專案中定義起始活動,並在 APK 中擴充該活動 專案。程式庫專案中定義的起始活動可讓您 應用程式初始化時,所以個別 APK 不需要 重新導入「通用」初始化 Analytics、執行授權檢查等 從 APK 到 APK 沒有太大變化的初始化程序。

調整資訊清單

當使用者透過 Google Play 下載使用多個 APK 的應用程式時,系統會根據兩個簡單的規則選擇要使用的正確 APK:

  • 資訊清單必須顯示特定 APK 符合資格
  • 在符合資格的 APK 中,版本號碼最高。

舉例而言,假設每個 APK 都有一套 (如先前所述) 的組合 APK 已設為支援大於「目標」的所有螢幕尺寸螢幕大小。我們來看看 範例圖表:

3 4 5 6 7 8 9 10 11 12 +
正常
特大

由於涵蓋率可以重疊,因此我們可說明每個 APK 所涵蓋的涵蓋範圍,例如 例如:

  • 藍色遮蓋所有螢幕 (minSDK 3)。
  • 綠色會涵蓋大螢幕和更高版本的 minSDK 3。
  • 紅色 涵蓋 XLarge 螢幕 (通常為平板電腦)、minSDK 9。
  • 紫色可涵蓋所有畫面,minSDK 為 11。

請注意,這些規則的重疊部分過多。舉例來說 搭載 API 11 的 XLarge 裝置可以執行指定的 4 個 APK 中的任一個。 不過,如果使用「最高的版本號碼」我們可以設定 如下所示:

紫色 ≥ 紅色 ≥ 綠色 ≥ 藍色

為何允許所有重疊部分?假設紫色 APK 對於 其他兩種則不會「Google Play 篩選器」頁面 請參閱 Android 開發人員指南中完整的可能原因清單。舉例來說 假設紫色需要前置鏡頭事實上,紫色的重點是 使用前置鏡頭享受娛樂內容!但事實並非如此 甚至配備前置鏡頭!是恐怖的!

幸運的是,如果使用者透過這類裝置瀏覽 Google Play,Google Play 會查看資訊清單,並發現 Purple 列出前置鏡頭為必要條件,因此會悄悄忽略這項條件,因為系統已判斷 Purple 和該裝置不相容。然後 必須注意的是,紅色不僅能與超大型裝置相容,而且同樣不會 還有前置鏡頭!使用者仍然可以從 Google Play 下載這個應用程式 因為儘管整部前置鏡頭發生問題,但仍然有其他 APK 支援這項機制 API 級別。

如要將所有 APK 保留在個別的「測試群組」中,請務必取得理想的版本代碼 配置。您可以在 開發人員指南建議您詳閱整個章節,但這裡的重點是,對於這組 APK,我們會使用兩位數字代表 minSDK、兩位數字代表最小/最大螢幕尺寸,以及 3 位數字代表版本號碼。這樣一來,當裝置升級至新版 Android 時 例如從 10 至 11 個,任何符合資格且偏好使用的 APK,而非目前安裝的 APK 視為「升級」。套用至範例的版本號碼配置 APK 組合,看起來可能像這樣:

藍色:0304001、0304002、0304003...
綠色:0334001、0334002、0334003
紅色:0344001、0344002、0344003...
紫色:1104001、1104002、1104003...

總而言之,您的 Android 資訊清單看起來會像 包括:

藍色:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    android:versionCode="0304001" android:versionName="1.0" package="com.example.foo">
    <uses-sdk android:minSdkVersion="3" />
    <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="0334001" android:versionName="1.0" package="com.example.foo">
    <uses-sdk android:minSdkVersion="3" />
    <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="0344001" android:versionName="1.0" package="com.example.foo">
    <uses-sdk android:minSdkVersion="3" />
    <supports-screens android:smallScreens="false"
        android:normalScreens="false"
        android:largeScreens="false"
        android:xlargeScreens="true" />
    ...

紫色:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    android:versionCode="1104001" android:versionName="1.0" package="com.example.foo">
    <uses-sdk android:minSdkVersion="11" />
    <supports-screens android:smallScreens="true"
        android:normalScreens="true"
        android:largeScreens="true"
        android:xlargeScreens="true" />
    ...

請注意,從技術層面來說,多個 APK 會搭配使用 supports-screens 標記或 compatible-screens 標記。一般而言,觀眾會偏好支援螢幕,不過這通常是件好事 但這使得過程不需要複雜,並且增加了出錯的機會。 另請注意,請不要使用預設值 (小、一般值一律為 true)。 根據預設),資訊清單會明確設定每個螢幕大小的值。這可以節省您的成本 9 會是超大 自動設為 false,因為該大小目前不存在。所以請明確

查看正式發布前檢查清單

上傳到 Google Play 前,請仔細檢查以下項目。請注意 與多個 APK 特別相關,且不能代表完整的檢查清單, 上傳至 Google Play 的應用程式

  • 所有 APK 的套件名稱都必須相同。
  • 所有 APK 都必須使用相同的憑證簽署。
  • 如果平台版本的 APK 中重疊,則 minSdkVersion 較高的 APK 必須具備 版本代碼。
  • 您希望 APK 支援的每個螢幕尺寸,在資訊清單中設為 true。適合各種螢幕大小 設為 false
  • 仔細檢查資訊清單篩選器,找出衝突資訊 (僅支援特定 APK 的 APK)。 XLARGE 螢幕上沒人看見杯子蛋糕
  • 每個 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 輸出內容時,請確認所有 支援螢幕和相容螢幕,而且沒有非預期的「uses-feature」服務值 您之所以新增這些條件,是因為您在資訊清單中設定權限。在上述範例中 則為大多數裝置不會顯示。

為什麼?藉由新增必要權限 SEND_SMS,android.hardware.telephony 的功能需求已間接增加。由於大多數 (但非全部) 特大尺寸裝置都是沒有電話功能的平板電腦,因此 Google Play 會在這些情況下篩除這個 APK,直到日後推出的裝置同時具備足夠大的螢幕 (可回報為特大尺寸) 和電話功能。

不過,只要在資訊清單中加入以下內容,就能輕鬆解決這個問題:

<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 指定的是目標裝置。恭喜!你已完成設定。