Instant App 常見(jiàn)問(wèn)題官方指南 | Android 開(kāi)發(fā)者 FAQ Vol.6
我們被大家的熱情驚到了 —— 事實(shí)上我們發(fā)出上一篇 Instant App 的文章沒(méi)幾天就收到了一大堆問(wèn)題。由于涉及到的類(lèi)目太多,我們這里簡(jiǎn)單歸納了一下,方便大家查看。
1. 基礎(chǔ)類(lèi)問(wèn)題
Q: 哪些設(shè)備兼容 Android Instant App?
A: Android Instant App 在運(yùn)行 Android 6.0(API 級(jí)別 23)或更高版本的設(shè)備上可用,此外還計(jì)劃為 Android 5.0(API 級(jí)別 21)添加額外的支持。例如,現(xiàn)在您可以在 Google Pixel、Google Nexus、Samsung Galaxy S7 等人氣設(shè)備上開(kāi)發(fā) Instant App。
Q: 哪些國(guó)家和地區(qū)支持 Android Instant App?
A: 您可以在支持頁(yè)面中找到完整的支持國(guó)家和地區(qū)列表:
(https://support.google.com/googleplay/android-developer/answer/7381861#production)
Q: 開(kāi)發(fā)者現(xiàn)在需要構(gòu)建兩套不同的 Android 應(yīng)用嗎?
A: 正相反,開(kāi)發(fā)者只需使用一個(gè)源代碼樹(shù)維護(hù)一個(gè)項(xiàng)目即可。通過(guò)對(duì)項(xiàng)目進(jìn)行配置,創(chuàng)造出兩套架構(gòu)工件:可安裝版本和免安裝版本。在可安裝應(yīng)用基礎(chǔ)上添加免安裝支持需要的工作量大小取決于可安裝應(yīng)用的當(dāng)前架構(gòu)。
* 請(qǐng)注意,免安裝應(yīng)用的版本號(hào)必須等于或小于上次發(fā)布的可安裝應(yīng)用版本。
Q: Instant App 都能使用什么 Android API 和功能?
A: Android Instant App 設(shè)計(jì)的目的是擴(kuò)展現(xiàn)存 App 的使用場(chǎng)景,而非取代它們。所以Android Instant App 使用同樣的 Android API,同樣的項(xiàng)目,同樣的源代碼。當(dāng)然,由于Android Instant App 的 “免安裝” 特性,可能會(huì)無(wú)法符合用戶(hù)針對(duì) “已安裝” 應(yīng)用所抱有的一些期待。例如,免安裝應(yīng)用無(wú)法使用后臺(tái)服務(wù),無(wú)法激活后臺(tái)通知,也無(wú)法使用設(shè)備唯一標(biāo)識(shí)符。
Q: 用戶(hù)可以選擇***安裝應(yīng)用嗎?
A: 當(dāng)然!開(kāi)發(fā)者可以允許用戶(hù)從 Google Play 安裝應(yīng)用。在安裝完成后,當(dāng)用戶(hù)離開(kāi)應(yīng)用時(shí),它仍會(huì)留在用戶(hù)的手機(jī)上 —— 就和現(xiàn)在大家正在做的事情一樣。
Q: Android Instant App 的權(quán)限需求是怎樣的?
A: Android Instant App 使用自 Android 6.0 (API 級(jí)別 23)以來(lái)采用的運(yùn)行時(shí)權(quán)限。
Q: 免安裝應(yīng)用可以獲取哪些權(quán)限?
A:免安裝應(yīng)用可以使用下列 Android 權(quán)限。沒(méi)有出現(xiàn)在下方列表中的權(quán)限將無(wú)法在免安裝應(yīng)用中使用。
- BILLING
- ACCESS_COARSE_LOCATION
- ACCESS_FINE_LOCATION
- ACCESS_NETWORK_STATE
- CAMERA
- INSTANT_APP_FOREGROUND_SERVICE 僅限 Android O
- INTERNET
- READ_PHONE_NUMBERS 僅限 Android O
- RECORD_AUDIO
- VIBRATE
Q:免安裝應(yīng)用對(duì)網(wǎng)絡(luò)訪問(wèn)有哪些限制?
A:來(lái)自免安裝應(yīng)用的一切網(wǎng)絡(luò)流量均必須使用 HTTPS,不支持 HTTP。
Q:開(kāi)發(fā)者要如何發(fā)布這些應(yīng)用?
A:開(kāi)發(fā)者需要經(jīng)由 Google Play Console 發(fā)布免安裝應(yīng)用,這一點(diǎn)與現(xiàn)有的 Android 應(yīng)用并無(wú)兩樣。想要了解更多信息,請(qǐng)參閱 “發(fā)布您的免安裝應(yīng)用” :
(https://support.google.com/googleplay/android-developer/answer/7381861)
Q:免安裝應(yīng)用必須使用 Smart Lock 么?
A:是的,我們規(guī)定在免安裝中的登錄體驗(yàn)必須使用 Smart Lock。想要進(jìn)一步了解如何在應(yīng)用中使用 Smart Lock,請(qǐng)參閱 “為您的 Android 密碼使用 Smart Lock” :
(https://developers.google.cn/identity/smartlock-passwords/android/)
Q:我能不能在沒(méi)有可安裝版本 Android 應(yīng)用的情況下實(shí)現(xiàn)一個(gè)免安裝應(yīng)用?
A:不能。您必須首先在 Google Play 中擁有一個(gè)該 App 的可安裝版本。
Q:我們能在里面使用 WebP 圖片格式嗎?
A:當(dāng)然可以,我們推薦使用 WebP 格式的圖片。想要了解更多信息,請(qǐng)參閱 “如何縮減下載圖片的大小” :
(https://developer.android.google.cn/topic/performance/network-xfer.html#webp)
Q:免安裝應(yīng)用在 Google 網(wǎng)頁(yè)搜索中將會(huì)如何呈現(xiàn)?
A:免安裝應(yīng)用與可安裝應(yīng)用的搜索顯示結(jié)果并無(wú)不同。在搜索結(jié)果中,免安裝應(yīng)用會(huì)顯示出應(yīng)用圖標(biāo),如果該 URL 已與免安裝應(yīng)用相關(guān)聯(lián),則還會(huì)顯示 “Instant” 標(biāo)簽,正如搜索結(jié)果中的可安裝應(yīng)用會(huì)在圖標(biāo)上顯示 “Installed” 標(biāo)簽一樣。
Q:我能使用 Android Instant App 的形式來(lái)承載我的游戲嗎?
A:游戲是極為特別的一類(lèi)應(yīng)用,它們通常擁有獨(dú)特的工具庫(kù)和龐大的資產(chǎn)庫(kù),對(duì)性能表現(xiàn)的要求也很高。即使如此,我們對(duì)探索游戲用戶(hù)的使用案例也充滿興趣。請(qǐng)前往 StackOverflow 瀏覽有關(guān) Android Instant App 的帖子,不少人也在討論這個(gè)話題。
2. 項(xiàng)目結(jié)構(gòu)、功能和架構(gòu)
Q:免安裝應(yīng)用和可安裝應(yīng)用是否擁有不同的 build.gradle 文件?
A:如果您的可安裝應(yīng)用和免安裝應(yīng)用來(lái)自同一個(gè) Android Studio 項(xiàng)目,那么答案是肯定的,兩種應(yīng)用需要不同的 build.gradle 文件。您必須使用符合 com.android.application 構(gòu)建規(guī)則的模塊來(lái)構(gòu)建您的可安裝應(yīng)用,而當(dāng)您構(gòu)建免安裝應(yīng)用時(shí)則需要使用符合 com.android.instantapp 構(gòu)建規(guī)則的模塊。想要了解更多信息,請(qǐng)參閱 “項(xiàng)目結(jié)構(gòu)” :
(https://developer.android.google.cn/topic/instant-apps/getting-started/structure.html#structure_of_a_basic_instant_app)
Q:我能獨(dú)立編譯可安裝與免安裝應(yīng)用嗎?
A:正如上面 “項(xiàng)目結(jié)構(gòu)” 中所展示的那樣,我們推薦采用的工程結(jié)構(gòu)應(yīng)該優(yōu)先將獨(dú)立的功能封裝成模塊,這樣可安裝應(yīng)用和免安裝應(yīng)用都可以依賴(lài)這些庫(kù)模塊。如果您遵循我們推薦的工程結(jié)構(gòu),您就可以獨(dú)立編譯每個(gè)功能而不涉及其他。
Q:我應(yīng)該如何在免安裝應(yīng)用中的不同頁(yè)面之間進(jìn)行導(dǎo)航?
A:您可以通過(guò)進(jìn)入一條目標(biāo)頁(yè)面的 URL 來(lái)導(dǎo)航過(guò)去。由于這個(gè)原因,免安裝應(yīng)用中的頁(yè)面均需滿足這個(gè)條件:可被 URL 尋址。想要了解更多如何讓app頁(yè)面可被 URL 尋址的內(nèi)容,請(qǐng)參閱 “如何從 Google Play 請(qǐng)求功能” :
(https://developer.android.google.cn/topic/instant-apps/overview.html#play_store)
和 “實(shí)現(xiàn)應(yīng)用鏈接” :
(https://developer.android.google.cn/topic/instant-apps/getting-started/index.html#app-links)
Q:我能在我的主應(yīng)用里處理深度鏈接(Deep Link),然后再調(diào)用其他免安裝應(yīng)用的頁(yè)面嗎?
A:免安裝應(yīng)用需要在功能上實(shí)現(xiàn)模塊化,通過(guò)主應(yīng)用集中處理與此相矛盾。使用 App Link 即可進(jìn)行您需要的鏈接跳轉(zhuǎn)功能,同時(shí)保持免安裝應(yīng)用的模塊化特性。
Q:我能在一個(gè)功能內(nèi)包含多個(gè)頁(yè)面嗎?
A:您可以在一個(gè)功能內(nèi)包含多個(gè)頁(yè)面。但您需要留意的是,免安裝應(yīng)用下載有 4MB 的大小限制。同時(shí),每個(gè)功能都需要用一個(gè)頁(yè)面作為入口。
Q:我能在不同功能之間共享資源嗎?
A:可以,基本功能(Base Feature)內(nèi)的資源可以被所有功能分享。包含在附加功能之內(nèi)的資源則只能被這個(gè)功能所使用。想要了解更多關(guān)于如何搭建您的項(xiàng)目資源,以及如何在不同功能之間共享資源,請(qǐng)參閱上面提到的 “項(xiàng)目結(jié)構(gòu)”。
額外再說(shuō)一點(diǎn),您必須把位于附加功能和基本功能之間的資源 ID 區(qū)分開(kāi)來(lái)。例如,如果您的基本功能提供了一個(gè)名為 R.id.feature_layout 的資源 ID,但您的附加功能卻定義了另一個(gè)同 ID 資源,那么免安裝應(yīng)用就會(huì)使用來(lái)自基本功能的資源,而不會(huì)使用來(lái)自附加功能的資源。
此外,所有隨著功能模塊的產(chǎn)生而被引用的資源都必須在基本功能模塊內(nèi)出現(xiàn)。
Q:如果應(yīng)用內(nèi)有兩個(gè)功能,它們是否會(huì)共享存儲(chǔ)?
A:會(huì),多個(gè)功能會(huì)在同一進(jìn)程中運(yùn)行,并共享應(yīng)用上下文,只要它們屬于同一個(gè)免安裝應(yīng)用。但是,免安裝應(yīng)用相較于可安裝 APK 而言擁有一些限制。想要了解更多信息,請(qǐng)參閱 “了解受限和不受支持的功能” :
(https://developer.android.google.cn/topic/instant-apps/prepare.html#restricted)
Q:我能在同一頁(yè)面內(nèi)的 view-pager 中擁有多個(gè)分段(Fragment)嗎?
A:可以,您能在單一頁(yè)面中擁有多個(gè)分段,并在功能內(nèi)定義與頁(yè)面相關(guān)的分段。但請(qǐng)記住分段不能與深鏈接相關(guān),并且不能獨(dú)立于頁(yè)面啟動(dòng)。
Q:免安裝應(yīng)用應(yīng)該擁有獨(dú)立的應(yīng)用圖標(biāo)嗎?
A:不,免安裝應(yīng)用和可安裝應(yīng)用應(yīng)該使用同一個(gè)圖標(biāo)。可安裝應(yīng)用和免安裝應(yīng)用應(yīng)該為用戶(hù)提供一致的體驗(yàn),因此它們應(yīng)該使用同樣的視覺(jué)元素(如圖標(biāo))。
想要了解更多關(guān)于如何關(guān)聯(lián)免安裝應(yīng)用和可安裝應(yīng)用的信息,請(qǐng)參閱 “同一個(gè)應(yīng)用,安裝前與安裝后”:
(https://developer.android.google.cn/topic/instant-apps/ux-best-practices.html#instant-v-installed)
Q:我如何才能分辨出我的應(yīng)用正在以可安裝模式還是免安裝模式運(yùn)行?
A:您可以使用靜態(tài)的 InstantApps.isInstantApp ( ) 方法。如果接受測(cè)試的進(jìn)程屬于一個(gè)免安裝應(yīng)用,這個(gè)方法的返回值將為 True 。
Q:我要如何鼓勵(lì)用戶(hù)從免安裝應(yīng)用中安裝我的應(yīng)用?
A:您可以使用靜態(tài)的 InstantApps.showInstallPrompt ( ) 方法。這種方法會(huì)鼓勵(lì)用戶(hù)安裝常規(guī) APK 版本的應(yīng)用。
Q:為各種功能使用的不同的 APK 會(huì)不會(huì)在 Google Play 里顯示為不同的產(chǎn)品?
A:不會(huì),免安裝應(yīng)用與可安裝應(yīng)用共享相同的包裝名和產(chǎn)品列表。
Q:我在免安裝應(yīng)用內(nèi)為功能命名時(shí),會(huì)不會(huì)受到限制?
A:功能模塊遵循 Java 命名規(guī)則。例如,您不能在功能名稱(chēng)中使用連字符。想要了解更多關(guān)于 Java 命名規(guī)則的內(nèi)容,請(qǐng)參閱對(duì)應(yīng)的 Java 文獻(xiàn):
(https://docs.oracle.com/javase/tutorial/java/package/namingpkgs.html)
3. Google 分析、Google Play 與部署
Q:我能讓我的免安裝應(yīng)用只在限定的幾個(gè)國(guó)家內(nèi)發(fā)布嗎?
A:免安裝應(yīng)用的使用范圍限定于相應(yīng)的可安裝應(yīng)用所在的國(guó)家和地區(qū)。在這些國(guó)家和地區(qū)的范圍內(nèi),開(kāi)發(fā)者可以選擇在特定地區(qū)內(nèi)發(fā)布自己的免安裝應(yīng)用。
Q:如果我想要通過(guò) Google Play 在發(fā)布前測(cè)試我的免安裝應(yīng)用,我還需要首先發(fā)布可安裝應(yīng)用的 APK 嗎?
A:想要通過(guò) Google Play 在開(kāi)發(fā)階段測(cè)試您的免安裝應(yīng)用的部署情況,您就必須在 Google Play Console 中擁有 “草稿” 形式的可安裝版本應(yīng)用。
想要了解更多關(guān)于對(duì)您的免安裝應(yīng)用的進(jìn)行部署,以及對(duì)其部署情況進(jìn)行測(cè)試的信息,請(qǐng)參閱上面提到的 “發(fā)布您的免安裝應(yīng)用”。
4. 應(yīng)用大小
Q:4MB 的總下載限制是什么意思?
A:免安裝應(yīng)用的大小(基本功能加上任何附帶的附加功能)應(yīng)該越小越好。您的應(yīng)用越小,用戶(hù)下載使用起來(lái)就越容易。但是,當(dāng)您的免安裝應(yīng)用已經(jīng)運(yùn)行在用戶(hù)的設(shè)備上時(shí),您就可以使用用戶(hù)的設(shè)備來(lái)下載并儲(chǔ)存額外的數(shù)據(jù)。如果是用這種方式在用戶(hù)的設(shè)備上使用數(shù)據(jù),則不存在 4MB 的硬限制。
想要計(jì)算應(yīng)用大小的話,只需解壓免安裝應(yīng)用的 APK 并檢查 APK 文件。您可以使用 APK 文件的磁盤(pán)容量,或是打開(kāi) APK Analyzer 并觀察 Raw File Size 值。
對(duì)于那些擁有多個(gè)功能的免安裝應(yīng)用,您必須把基本功能 APK 的大小與單一功能 APK 合并計(jì)算。基本功能與單一功能 APK 文件大小之和必須小于 4MB。
Q:用戶(hù)每次下載同一個(gè)免安裝應(yīng)用時(shí)都需要下載基本功能 APK 和附加功能 APK 嗎?
A:當(dāng)用戶(hù)***下載免安裝應(yīng)用時(shí),他們會(huì)下載基本功能和附加功能兩個(gè) APK。當(dāng)用戶(hù)請(qǐng)求其他功能的 APK 時(shí),用戶(hù)只會(huì)收到與所請(qǐng)求功能的 APK。在這種情況下,基本功能 APK 不需要被重復(fù)下載。
* 注意:系統(tǒng)會(huì)在垃圾整理期間根據(jù)需要清理免安裝應(yīng)用的緩存。如果手機(jī)重啟,緩存會(huì)清空。如果免安裝應(yīng)用的緩存被清空,用戶(hù)就必須重新下載基本功能的 APK。
Q:何時(shí)會(huì)觸發(fā) 4MB 驗(yàn)證?
A:當(dāng)您在制作階段將免安裝應(yīng)用上傳到 Google Play Console 時(shí)就會(huì)觸發(fā)驗(yàn)證。
5. 應(yīng)用鏈接、深鏈接與 URL 處理
Q:用戶(hù)從一些應(yīng)用點(diǎn)擊鏈接時(shí),鏈接并沒(méi)有打開(kāi)我的免安裝應(yīng)用,而是在應(yīng)用內(nèi)瀏覽器中打開(kāi)了。有沒(méi)有辦法能保證用戶(hù)被帶到免安裝應(yīng)用里面去?
A:App Link 只是普通的 URL,所以應(yīng)用可以強(qiáng)迫它們?cè)趹?yīng)用內(nèi)瀏覽器中打開(kāi)。請(qǐng)考慮使用 Firebase Dynamic Links 來(lái)包裝您的 URL,確保用戶(hù)在點(diǎn)擊您的鏈接時(shí)總能被帶到您的免安裝應(yīng)用里去。
Q:我的主應(yīng)用 manifest 里包括其他 URL 和其他 URL 域名,但我并不擁有這些域名。這樣會(huì)產(chǎn)生什么后果?
A:很遺憾,如果一個(gè) URL 的域名所有權(quán)未經(jīng)確認(rèn),則會(huì)導(dǎo)致免安裝應(yīng)用發(fā)布失敗。
6. 在設(shè)備上運(yùn)行免安裝應(yīng)用
Q:用戶(hù)能否放棄使用 Android Instant App?
A:能。用戶(hù)在***啟動(dòng)免安裝應(yīng)用時(shí)可以選擇放棄。用戶(hù)還可以選擇打開(kāi) Settings 并點(diǎn)擊 Google > Instant Apps 進(jìn)行設(shè)置。
Q:兩個(gè)免安裝應(yīng)用可以同時(shí)運(yùn)行嗎?
A:可以。免安裝應(yīng)用可以同時(shí)運(yùn)行,用戶(hù)可以在多個(gè)應(yīng)用之間切換。只有位于前臺(tái)的免安裝應(yīng)用會(huì)在通知欄內(nèi)顯示圖標(biāo)。
Q:用戶(hù)能否在 “最近使用” 欄和設(shè)備主屏上結(jié)束和重啟免安裝應(yīng)用的進(jìn)程?
A:免安裝應(yīng)用可以從 “最近使用” 欄重啟,用戶(hù)還可以點(diǎn)擊之前運(yùn)行過(guò)的啟動(dòng) URL 來(lái)重啟應(yīng)用。
當(dāng)用戶(hù)停止與免安裝應(yīng)用互動(dòng)時(shí),免安裝應(yīng)用的進(jìn)程即被終止。但是,應(yīng)用的內(nèi)部存儲(chǔ),如 SQLite DB 還有共享偏好會(huì)保留下來(lái)。如果設(shè)備存儲(chǔ)空間告急,免安裝應(yīng)用可能會(huì)被刪除,它的內(nèi)部存儲(chǔ)也會(huì)一同被刪除。雖然這種情況不太可能出現(xiàn),但當(dāng)它出現(xiàn)的時(shí)候還想恢復(fù)用戶(hù)的使用狀態(tài)和偏好信息的話,開(kāi)發(fā)者需要從服務(wù)端解決。
Q:免安裝應(yīng)用能不能啟動(dòng)用戶(hù)設(shè)備上安裝的其他應(yīng)用?
A:免安裝應(yīng)用可以通過(guò)發(fā)出隱式意圖 (implicit intent) 來(lái)啟動(dòng)一個(gè)可安裝應(yīng)用,但無(wú)法使用顯式意圖 (explicit intent) 來(lái)啟動(dòng)大多數(shù)可安裝應(yīng)用。但可安裝應(yīng)用可選擇對(duì)那些發(fā)出顯式意圖的免安裝應(yīng)用開(kāi)放。
Q:如果用戶(hù)安裝了較舊版本的應(yīng)用,并點(diǎn)擊了與較新版本免安裝應(yīng)用相關(guān)聯(lián)的 URL,會(huì)打開(kāi)哪個(gè)應(yīng)用?
A:可安裝應(yīng)用永遠(yuǎn)優(yōu)先于免安裝應(yīng)用打開(kāi)。
Q:用戶(hù)如何接收我的免安裝應(yīng)用的***版本? Google 會(huì)不會(huì)在用戶(hù)的設(shè)備上自動(dòng)對(duì)它進(jìn)行更新?
A:***版本的免安裝應(yīng)用將提供給新用戶(hù)使用,現(xiàn)有用戶(hù)的免安裝應(yīng)用緩存過(guò)期時(shí),也會(huì)獲取***版本的應(yīng)用。
以上就是這一次的 FAQ 內(nèi)容。想要打造良好的免安裝體驗(yàn),請(qǐng)點(diǎn)擊 “閱讀原文” 進(jìn)一步查閱我們的***案例。如果您手里已經(jīng)有安裝版本的應(yīng)用,何不試試再進(jìn)一步,讓您的應(yīng)用無(wú)需安裝即可使用呢?
【本文是51CTO專(zhuān)欄機(jī)構(gòu)“谷歌開(kāi)發(fā)者”的原創(chuàng)稿件,轉(zhuǎn)載請(qǐng)聯(lián)系原作者(微信公眾號(hào):Google_Developers)】