針對不同 GL 材質建立多個 APK

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

開發 Android 應用程式,善用 Google Play 上的多個 APK 時, 重要的是,一開始應先採用一些好方法,避免不必要的頭痛 進而參與開發程序本課程將說明如何為應用程式建立多個 APK 支援一部分的 OpenGL 紋理格式。此外,我們也會介紹一些必要工具 盡量減少維護多個 APK 程式碼集

確認您需要多個 APK

想在所有採用 Android 系統的 Android 系統上運作的應用程式時 自然而希望您的應用程式無論在何種裝置上都能呈現最佳外觀。 但並非所有 GL 紋理都支援相同的 GL 紋理組合乍看之下,可能就好像 支援多個 APK 是最佳解決方案,但這通常並非如此。使用單一 APK 這份修訂版 APK 開發人員指南中一節會提供一些實用資訊,說明如何 這項功能可以透過單一 APK 實作,包括如何偵測支援的紋理 在執行階段期間顯示多種格式視情況而定,您或許可以更輕鬆地將所有廣告格式 然後在執行階段選擇要使用的應用程式

如果易於管理,將應用程式限定於單一 APK 可帶來許多好處。 包括:

  • 發布及測試變得更簡單
  • 只要維護一個程式碼集
  • 應用程式可因應裝置設定變更進行調整
  • 只要在所有裝置上還原應用程式即可
  • 不用擔心市場偏好、來自「升級」的行為從一個 APK 到 或與哪個類別的裝置搭配使用的 APK

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

以圖表呈現需求

《Android 開發人員指南》提供了一些常見支援的紋理,供您參考。 supports-gl-texture 頁面。本頁也提供一些提示,說明支援哪些手機 (或電話系列) 支援 特定紋理格式請注意,通常建議其中一個 APK 支援 ETC1,因為所有支援 OpenGL ES 的 Android 裝置都支援該紋理格式。 2.0 規格

由於大多數 Android 裝置都支援多種紋理格式,因此您必須建立 。建立圖表,納入應用程式要使用的所有格式 聯絡。最左邊的儲存格優先順序是最低 (很有可能為 ETC1) 例如效能和相容性等方面。接著為圖表標上顏色 代表 APK

ETC1 先進產業技術 電源 VR

圖表中的上色不僅讓本指南更簡潔, 簡化團隊內部通訊 - 現在您可以直接將每個 APK 稱為「藍色」、「綠色」或 「紅色」,而非「支援 ETC1 紋理格式」等。

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

無論您要修改現有的 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-red

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

調整資訊清單

如果使用者透過 Google Play 下載使用多個 APK 的應用程式, 要使用的 APK 是透過以下簡單的規則選擇:

  • 資訊清單必須顯示特定 APK 符合資格
  • 在符合資格的 APK 中,版本號碼最高
  • 假使裝置能夠支援您的 APK 中列出的「任何」紋理格式, 將該裝置視為符合資格的裝置

關於 GL 紋理,最後一項規則很重要。這代表您應該 執行個體時,請務必在同一應用程式中使用不同 GL 格式。如果發生以下情況: 99% 的時間都使用 PowerVR,但請使用 ETC1 指定啟動畫面...接著是資訊清單 表示可支援兩種格式支援 ETC1 的裝置 「視為相容」,您的應用程式可以下載,使用者也會看到 訊息。常見的做法是如果您會使用多個 APK 來指定 根據 GL 紋理支援提供的不同裝置,每個 APK 都會採用一種紋理格式。

實際上,這使得紋理支援功能與兩個多個 APK 略有不同 維度、API 級別和螢幕大小每部裝置都只有一個 API 級別和一個畫面 APK 可支援各種格式,則取決於 APK。如果使用紋理,APK 通常會 支援一種紋理,而該裝置可支援多種材質。在單一物件之間通常會有重疊 裝置支援多個 APK,但解決方法相同:版本代碼。

比如說,抽出幾部裝置,看看其中幾個先前定義的 APK 數量 裝置。

FootPhone (食物電話) Nexus S 埃沃
ETC1 ETC1 ETC1
電源 VR ATI TC

假設 PowerVR 和 ATI 格式在可用的情況下都比 ETC1 優先使用, 依據「最高的版本號碼」如果在各個 APK 中設定 versionCode 屬性 因此紅色 ≥ 綠色 ≥ 藍色 一律會選擇在藍色上 裝置是否支援紅燈和綠燈 將顯示紅色

如何將所有 APK 保留在個別的「測試群組」中:務必要有良好的版本代碼 配置。您可以在開發人員指南的「版本代碼」部分找到我們建議的代碼。開始時間 這組 APK 範例只處理 3 個可能的尺寸之一, 將每個 APK 分開 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-gl-texture android:name="GL_OES_compressed_ETC1_RGB8_texture" />
    ...

綠色:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    android:versionCode="2001" android:versionName="1.0" package="com.example.foo">
    <supports-gl-texture android:name="GL_AMD_compressed_ATC_texture" />
    ...

紅色:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    android:versionCode="3001" android:versionName="1.0" package="com.example.foo">
    <supports-gl-texture android:name="GL_IMG_texture_compression_pvrtc" />
    ...

檢查正式發布前檢查清單

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

  • 所有 APK 的套件名稱都必須相同
  • 所有 APK 都必須使用相同的憑證簽署
  • 仔細檢查資訊清單篩選器,找出衝突資訊 (僅支援特定 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 的功能需求已間接增加。由於大多數 (非所有) x 大型裝置是不含電話通訊硬體的平板電腦,因此 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 指定的是目標裝置。恭喜您完成設定!