用於設定應用程式以執行 Google Play 免安裝功能的步驟 (如建立您的第一個免安裝應用程式一文所述),同樣適用於遊戲。本指南著重於介紹專屬於遊戲的一些設定步驟。
您可以使用以下應用程式開發 Google Play 免安裝遊戲: Unity (無論是否採用 Google Play 免安裝 Unity 應用程式) 外掛程式), Cocos2D、 Android Studio,或您自己的自訂搜尋引擎。
本指南假設您已知道想要提供的遊戲體驗類型。如要瞭解製作高品質遊戲的理念和最佳做法,請參閱 Google Play 免安裝功能的遊戲使用者體驗最佳做法。
此外,在發布可在 Google Play 免安裝功能執行的遊戲之前,請詳閱技術相關規定檢查清單。
指定進入點
包含下列意圖篩選器的活動將成為 Google Play 免安裝體驗的進入點:
<activity android:name=".GameActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
使用者輕觸 Play 商店中的「立即體驗」按鈕或 Google Play 遊戲應用程式的「立即玩」按鈕時,就會啟動這項活動。您也可以使用深層連結 API 直接啟動這個活動。
定義正確的版本代碼
遊戲的免安裝體驗版本代碼必須低於可安裝遊戲的版本代碼。以這種方式管理應用程式版本,可以讓玩家從 Google Play 免安裝體驗下載遊戲並將遊戲安裝到其裝置上。Android 架構會將這個轉換視為應用程式更新。
為確保您遵循建議的版本管理計畫,請按照下列任一策略操作:
- 從 1 開始重新計算 Google Play 免安裝體驗的版本代碼。
- 將安裝版應用程式的版本代碼提高較大的數值 (例如 1000),確保有足夠空間可以增加免安裝體驗的版本號碼。
您可以分別在兩個 Android Studio 專案中開發免安裝遊戲和安裝版遊戲。但如果您這麼做,則必須執行下列步驟才能將遊戲發布到 Google Play 上:
- 在兩個 Android Studio 專案中使用相同的套件名稱。
- 在 Google Play 管理中心,將兩個變化版本上傳至同一個應用程式。
如要進一步瞭解如何設定遊戲版本,請參閱管理應用程式版本。
支援執行環境
與其他應用程式一樣,Google Play 免安裝遊戲也是在裝置的有限沙箱內執行。如要支援這個執行環境,請完成以下各節所示的步驟。
選擇退出明文流量
Google Play 免安裝遊戲不支援 HTTP 流量。如果遊戲以 Android 9 (API 級別 28) 以上版本為目標平台,Android 預設會停用遊戲中的明文支援。
不過如果遊戲以 Android 8.1 (API 級別 27) 以下版本為目標平台,則必須建立一個網路安全性設定檔案。
在這個檔案中,將 cleartextTrafficPermitted
設為 false
,如以下程式碼片段所示:
<?xml version="1.0" encoding="utf-8"?> <network-security-config> <domain-config cleartextTrafficPermitted="false"> <domain includeSubdomains="true">secure.example.com</domain> </domain-config> </network-security-config>
更新目標沙箱版本
更新免安裝遊戲的 AndroidManifest.xml
檔案,如此一來檔案就會指定 Google Play 免安裝技術支援的沙箱環境。您可以在遊戲的 <manifest>
元素中新增 android:targetSandboxVersion
屬性以完成這項更新,如以下程式碼片段所示:
<manifest
xmlns:android="http://schemas.android.com/apk/res/android"
...
android:targetSandboxVersion="2" ...>
詳情請參閱 targetSandboxVersion
屬性的說明文件。
請勿仰賴快取或應用程式資料
已下載的免安裝體驗會保留在使用者的裝置上,直到免安裝體驗快取遭到清除為止,系統會在出現下列情況時執行這項清除作業:
- 裝置的可用記憶體不足,因此系統會將免安裝體驗快取收集為垃圾。
- 使用者重新啟動裝置。
如果發生以上任一情況,使用者必須重新下載免安裝體驗才能與其互動。
如果系統的儲存空間即將用盡,很有可能會將免安裝體驗的使用者資料從內部儲存空間中移除。因此,建議您定期將使用者資料與遊戲伺服器同步處理,即可保留使用者的遊戲進度。
縮減應用程式大小
與其他類型的應用程式不同,Google Play 免安裝遊戲的下載大小上限為 15 MB。如要建立這樣大小的遊戲,您可能需要重構遊戲的邏輯。本節介紹一些有助於最佳化遊戲大小的工具和技巧。
工具
以下列出的工具可協助您判定構成遊戲大小的內容為何:
- APK 分析工具:提供編譯後 APK 內容的概觀。透過此檢視畫面中,您可以瞭解各個元素在整體大小中所佔的位元組數。這項工具可快速檢查遊戲使用的資源、素材資源、邏輯和原生資料庫的大小。
- Bloaty McBloatface:顯示二進位檔案的大小設定檔。
- Android GPU 檢查器:查看檔案大小效果 不必重新編譯遊戲,也能縮減紋理大小
技巧
下列技巧可用於縮減遊戲大小:
- 擷取部分遊戲邏輯將其放入一或多個功能模組,這些模組不會計入大小限制。
- 降低遊戲紋理的解析度。
- 考慮使用 WebP 格式,特別是在 GPU 上使用未壓縮的紋理時。以 WebP 格式建立的圖片其品質與 JPEG 圖片相同,但大小會縮減 15% 到 30%。雖然壓縮 WebP 圖片所需的時間較長,但此壓縮時間仍然比下載遊戲紋理的時間來得短很多。Google 也已將格式整合到開放原始碼遊戲引擎中。
- 壓縮或重複使用音效和音樂。
- 請使用不同的編譯標記以協助縮小二進位檔案:
-fvisibility=hidden
:是最重要的一個。在cmake
中,您可以指定 如下所示:$ set_target_properties(your-target PROPERTIES CXX_VISIBILITY_PRESET hidden)
-Oz
- 對縮減檔案大小也很重要。如果使用gcc
進行編譯,請改用-Os
。-flto
– 有時會縮減檔案大小。- 連接器標記:將
--gc-sections
與編譯器標記 (例如-ffunction-sections
和-fdata-sections
) 搭配使用,。
- 使用 Proguard 縮減程式碼和資源。
- 使用 Gradle 4.4 以上版本來產生較小的 DEX 檔案。
- 導入雲端資產提供服務。
將大型遊戲分割為多個 APK
即使採用了縮減 APK 大小的建議,也可能很難透過最佳化 Google Play 免安裝體驗使遊戲能夠融入單一 15MB 的 APK。為解決這個問題,您可以將遊戲分割為多個 APK。玩家可以先下載主要的基本 APK,在玩遊戲的過程中,系統會在背景中提供遊戲剩餘的「分割 APK」。
舉例來說,基本 APK 可能包含核心遊戲引擎,以及顯示載入畫面所需的素材資源。基本 APK 啟動時會顯示載入畫面,並立即要求包含遊戲和關卡資料的額外分割 APK。分割 APK 可供使用後,就能將其資產載入至遊戲引擎,並提供玩家開始遊戲所需的內容。
採用使用者體驗最佳做法
將遊戲設定為支援免安裝體驗後,請加入以下各節所述的邏輯,提供優質的使用者體驗。
支援 64 位元架構
在 Google Play 上發布的應用程式需要支援 64 位元架構。為應用程式新增 64 位元版本,不僅能提升效能,也能延伸支援只適用 64 位元硬體的裝置。進一步瞭解 64 位元架構支援機制。
檢查遊戲是否執行免安裝體驗
如果遊戲的某些邏輯取決於使用者是否參與免安裝體驗,請呼叫 isInstantApp()
方法。如果目前執行的程序是免安裝體驗,這個方法會傳回 true
。
透過這項檢查作業,您可以決定是否要讓應用程式在有限的執行環境中執行,或者也可以利用平台功能。
顯示安裝提示
如果您已建立 Google Play 免安裝體驗試用版,遊戲應該會在某個時刻提示玩家將完整版本安裝在其裝置上。方法是在 Google API for Android 中使用 showInstallPrompt()
方法。
如要進一步瞭解應如何及何時提示玩家進行安裝,請參閱 Google Play 免安裝功能的遊戲使用者體驗最佳做法。
將資料轉移至已安裝的體驗
如果玩家喜歡您的試玩體驗,可能會決定安裝完整版遊戲。如要提供優質的使用者體驗,請務必將玩家的遊戲進度從免安裝體驗轉移到完整版遊戲。
如果遊戲指定的 targetSandboxVersion
為 2
,則玩家的遊戲進度會自動轉移到完整版遊戲。否則,您必須手動轉移與玩家遊戲進度相關的資料,方法是使用 Cookie API - 範例應用程式
其他資源
如要進一步瞭解 Google Play 免安裝功能,請參考這些額外資源:
- 程式碼研究室:打造第一個免安裝應用程式
- 在現有應用程式中新增 Google Play 免安裝支援。
- 程式碼研究室:建構多功能免安裝應用程式
- 將多功能應用程式模組化。