Chinese (Traditional) (中文(繁體)) translation by xingshi (you can also view the original English article)
每當你發佈一個安卓APP時,你至少會想一下你想要這個APP實現什麼目標。
你想要APP實現的目標應該非常具體,比如在第一季度產生一定的廣告收入,或者在Google Play獲取更高的排名。
甚至,你想要你APP實現的目標是想要盡可能多的用戶使用你的APP,如果是這樣,那麼Instant Apps是能夠幫你實現目標的新選擇。
Instant App是一種全新的接觸使用者的方式,使用者不需要在他們的設備上安裝你的APP,而是在任何支持URL的地方(包括emails,Google搜索結果,社交平臺上,YouTube的評論和論壇)找到並訪問你的APP。
開發Instant App,你必須將你APP的功能劃分為獨立的模組。然後,用戶點擊你提供的URL,就可以載入這些模組中的任意模組而不需要下載你的APP。
在這個three-part系列,我將展示如何在安卓工程中添加對Instant App的支持。在這個系列的末尾,你將會創建一個APP,它包含兩個獨立的Instant App模組,你可以發佈和測試它們。
我們即將討論的內容
在這第一篇文章中,我們主要關注什麼是Instant App,如何工作和你為什麼需要關注它們。為了給你Instant App第一印象,我們將使用AS(Android Studio)創建工程時的選項來產生一個預先配置了支援Instant App的APP,所以你將能看到所有不同的Instant App元件而不僅僅是閱讀它們。
儘管創建一個預先配置了支援Instant App的APP是使用這種新功能最快速最簡單的方式,事實上你可能更喜歡給已經存在的工程添加對Instant App的依賴,而這在第二部分中展示。 我將提供一個APP,你可以從GitHub上下載,然後帶你在這個工程一步一步添加對Instant App的支持。
最後是創建一個多功能的Instant App,所以在第三部分,我將展示如何給你的應用添加第二個功能模組,並且如何使用安卓APP連結來將這個模組映射到不同的URL。
什麼是Instant Apps?
描述Instant App最好的方式之一是觀察你可能用到的示例。
想像一下,你的一個朋友給你發送了一個關於小貓視頻的連結,他們承諾你肯定會很喜歡,但是當你點選連結的時候,你才發現需要下載APP才能觀看視頻。
先不考慮你會不會下載APP,或者忽略那個連結,或者冒險在網路上找到那個小貓視頻,這都不是好的用戶體驗,但卻是許多安卓用戶面臨的場景。
我們大部分人都有過這樣的體驗,就是下載一個APP,然後僅僅完成單一的任務。比如,你可能下載一個APP僅僅是為了看一下別人發給你的email附件,來完成某個網站上的一次購買,或者跟蹤一下你的包裹。
再次想像小貓視頻案例,但是這次APP開發者已經把所有代碼和資源放到instant app模組來播放視頻,並且將該模組映射到網址www.example.com/video 這次,當你點擊網址www.example.com/video,Google Play識別到這個網址與一個instant app 模組關聯了,並且獲取了所有用於播放視頻的代碼和資源。結果呢?你可以無需安裝任何東西就可以觀看20秒的小貓視頻,多麼棒的使用者體驗啊!
為什麼我要開始使用Instant App特性?
正如你在這個系列的下一篇文章中看到的,給已有工程增加對Instant App的支援是煩人的,經常需要你完全改變應用的結構方式。
由於重構工程要很慎重,這部分我將説明你決定你花費的時間和努力是否值得增加支持Instant App帶來的收益。
- 消除APP與新用戶之間的障礙通過。Google Play安裝一個APP不是特別困難和耗時,但是它仍然是你的APP與新用戶之間的障礙。 無論你花費多少時間來吸引用戶去點擊那個Install按鈕,仍然有許多人在點擊那個瞬間放棄。
- Instant App有助於你的APP接觸新用戶。儘管你一直在網頁的各種位置宣傳你的APP,比如你自己的主頁,博客或社交媒體,但連接新用戶主要依賴他們訪問你的APP的Google Play主頁。 Instant app移除了這種對Google Play的依賴,在任意支持RUL的位置直接訪問你的APP,給你接近無限制的機會來連接新用戶。
- Instant App保證了分享的內容是你APP最好的廣告。使用者分享了你APP的內容是你APP接觸新使用者最好的方式,所以你要給人良好的第一印象 之前,對於那些沒有安裝你APP的用戶,為他們提供持續的體驗是很困難的,但是現在Instant App可以保證絲滑原生的體驗。
- 即使是在網路受限情況下,也能説明用戶訪問你的APP。儘管網路輸送量一直在改善,你仍然需要努力找到快速穩定的網路或者你正在接近每月的資料津貼,並擔心會導致額外的費用。 當你的網路慢且不穩定時,下載一個完整的APP非常耗時麻煩,或者你隨時可能超出流量上限,下載新的APP可能導致額外的費用。 所有的instant app模組必須小於等於4MB,所以如果下載整個APP不是問題,那麼訪問一個instant app也不是問題。
- 增加位置和時間敏感apps的吸引力。當APP被設計為特殊位置,或者甚至不是一個新概念,問問你自己,我有多想裝一個隻使用很短時間或只在某個特定位置使用的的APP? Instant app能增加時間和位置敏感APP的吸引力,因為用戶只要點擊一個URL就能訪問你APP的最重要的功能。
限制
在我們開始instnat app之旅之前,我們需要知道instant app不能做到的事情:
- 訪問設備識別字,比如IMEI和MAC位址。
- 使用後臺服務
- 執行後臺通知
- 訪問設備外部存儲
- 訪問使用者設備上已安裝的APP列表-除非這些應用自己出現在instant app。
還有,你的應用必須:
- 你的應用可以免費從Google Play下載。
- 在Android 6.0(API 23)以上使用新的許可權模式。由於用戶沒有安裝instant app,沒有機會申請許可權。 假如你的instant app特性模組需要訪問設備容量或使用者資訊,你需要動態申請許可權。
- 支援APP連結。將instant app模組映射到指定URL。我將在下一篇文章詳細討論APP連結。
最後,假如你的APP是 Designed for Families的一部分,那麼它不能作為instant app。
設置你的開發環境。
首先,你需要安裝下列內容:
- AS 3.0預覽版
- Android SDK 6.0
- Android SDK Build Tools 26.x
- Android SDK Tools 25.x
- Android SDK Platform Tools 25.x
你還應確保Android Support Library和Android Repository是最新的版本,打開Android Studio的SDK Manager,安裝需要更新的地方。
一旦你完成上述所有操作後,就可以下載Instant Apps 的開發SDK:
- 打開SDKManager,然後選擇“SDK Tools”選項卡。
- 選擇Instant Apps Development SDK。
- 按一下應用。
目前,您只能在Nexus 5X,Nexus 6P,Pixel,Pixel XL或Galaxy S7上測試Instant App,因為這些設備運行Android 6.0或更高版本的系統。但是,如果您沒有這些設備中任意一台,那麼您可以創建一個類比其中一個設備的AVD(安卓虛擬機器),而且AVD要滿足幾個條件:AVD必須使用x86映射,並且必須包含Google API 。
由於我沒有這些設備,我將創建一個模擬Pixel的AVD:
- 啟動AVD管理器。
- 按一下Create virtual device... 按鈕。
- 選擇Pixel,然後按一下Next。
- 選擇x86 Images選項卡。
- 選擇一個運行Android 6.0並包含Google API的系統映射,例如Marshmallow / 23 / x86 / Android 6.0(Google API)。
- 點擊Next。
- 給您的AVD一個名稱,然後按一下Finish
- 啟動你的AVD。
最後,您需要在AVD上登錄Google帳戶:
- 切換到您的AVD,然後打開設備的啟動器
- 選擇Google應用
- 輸入Gmail位址和密碼。這可以是您的真實帳戶,也可以是您創建的僅用於測試Android項目的帳戶。
創建您的第一個Instant App
在Android Studio 3.0 Preview 1及更高版本中,創建具有內置Instant App的項目與選擇核取方塊一樣簡單,所以,我們不僅僅是描述Instant App特性,我們還將創建一個Instant App項目,然後在本文的剩餘部分體驗它的各種元件。
請注意,該專案沒有任何APP連結,所以您將無法在您的AVD上測試Instant App元件(這是我們將在第二部分中詳細探討的內容)。
創建您的項目:
- 通過從Android Studio工具列中選擇File > New > New project… ,或者從Android Studio的“歡迎”螢幕中按一下Start a new Android Studio project ,來啟動專案創建的引導頁面。
- 給您的項目一個名稱,然後按一下下一步。
- 將Minimum SDK設置為Android 6.0(棉花糖)。
- 選中Include Android Instant app support 核取方塊,然後按一下下一步。
- 為了簡化操作,請接受預設模組名稱(feature),然後按一下下一步。
- 選擇Basic Activity,然後按一下下一步。
- 在下一個螢幕上,接受所有預設值,然後按一下完成。
我們可以看到,這個項目與典型的Android專案結構非常不同,它包括以下模組:
- App。可安裝的應用模組,也稱為APK模組。
- Base。基本功能模組。
- Feature。雖然這個專案只有一個Feature,但一般一個APP由多個Feature模組組成。
- Instantapp。即時應用模組。

任何支援Instant app的專案都必須包含上述所有模組(除了feature模組),因此我們詳細探討這些模組。
1. Application Module
Application Module的概念可能不是什麼新鮮事物,但是當您的項目支持Instant app時,應用程式模組的清單看起來比你曾經使用的更簡潔:
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.jessicathornsby.myapplication.app" />
這個檔是如此空的一個原因是:當你建立你的項目時,所有其他的清單檔的內容包括base feature和 feature modules 都與這個檔合併,所以它不會永遠保持這麼空!
如果您打開此模組的build.gradle檔,則會注意到兩個新元素:
dependencies { implementation project(':feature') implementation project(':base') }
在這裡,我們聲明我們的application module依賴於feature
module 和 base
module。
當你給專案添加對instant app的支持時,你就將相關代碼和資源分離到可獨立運行的feature modules。然後,這些模組仍然是可安裝APP的一部分,而不是單獨的實體,這就是為什麼我們的application module聲明依賴於feature module 和 base module。
2. Base Feature Module
每個instant app專案都必須包含一個base feature module,其中包含貫穿所有APP模組的代碼和資源。例如,如果您打開項目的base / res / mipmap資料夾,那麼您將看到所有應用程式的啟動器圖示,這些圖示顯然將被用於多個模組。
由於base feature module包含公共的代碼和資源,所以所有項目的feature modules 都依賴于這個單一的base feature module。
繼續這個主題,base feature module包含整個專案中使用的清單條目。例如,您的項目的base / src / main / AndroidManifest.xml檔包含應用程式的圖示,主題和標籤的設置:
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.jessicathornsby.myapplication"> <application android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:roundIcon="@mipmap/ic_launcher_round" android:supportsRtl="true" android:theme="@style/AppTheme" /> </manifest>
另一個值得注意的元素是base module的build.gradle檔,其中包含一些新屬性:
//All base feature and “regular” feature modules use the com.android.feature plugin, rather than the com.android.application plugin// apply plugin: 'com.android.feature' android { compileSdkVersion 26 buildToolsVersion "26.0.0" //Specify that this is the project’s one and only base feature, using the ‘baseFeature true’ expression// baseFeature true … … … dependencies { //Use ‘application project’ to add a dependency from the base feature module, to your project’s installable ‘app’ module// application project(':app') //Use ‘feature project’ to reference our project’s feature module, aptly named ‘feature’// feature project(':feature')
您還會注意到,這個特殊的build.gradle檔缺少applicationID
屬性,當我們來檢查我們的feature module的build.gradle檔時,您會發現完全相同的事情。這是因為我們項目的applicationID
僅在應用程式模組的build.gradle檔中聲明。
我們的base module的build.gradle文件中的application project(:app)
行確保專案的單個applicationID
屬性在所有build.gradle檔中傳播,這就是為什麼我們專案的其餘部分缺少此屬性。
3. Feature Module
當您最終將Instant App支持添加到現有項目中時,最大的任務是將每個應用程式的特性提取到自己的feature module,中,因為每個feature module都包含僅提供此功能所需的代碼和資源。
如果您打開我們項目的feature module,,那麼您將看到它包含MainActivity
類,以及activity_main和content_main資源檔 - 被引入到Basic Activity範本的所有元件。

單一的feature module可以由多個Activities組成,但每個模組必須至少有一個Activity被指定為該模組的入口Activity。
每個入口Activity被映射到特定的URL,當用戶點擊此URL時,它載入關聯的Activity,然後用戶訪問此特定feature module。
您可以通過該模組的manifest指定模組的入門Activity。具體而言,您需要打開此manifest檔,並將以下內容添加到要作為入口的Activity中:
- 一個intent filter,具有
CATEGORY_LAUNCHER
和ACTION_MAIN
這兩個intent。 - 包含關於URL(映射到入口Activity的URL)所有資訊的
<data>
元素。 -
android:autoVerify
屬性。這告訴系統檢查您的應用程式是否有權作為該特定URL的默認處理常式。 這是一個重要的安全機制,它有助於保護網站所有者免受試圖劫持其網址的惡意應用程式的攻擊。
如果您打開我們的feature module的 manifest檔,那麼您將看到所有這些代碼已經添加到我們的MainActivity
聲明中:
<activity android:name=".MainActivity" android:label="@string/app_name" android:theme="@style/AppTheme.NoActionBar"> <intent-filter android:order="1"> <action android:name="android.intent.action.VIEW" /> <category android:name="android.intent.category.BROWSABLE" /> <category android:name="android.intent.category.DEFAULT" /> <data android:host="jessicathornsby.com" android:path="www.example.com/MainActivity" android:scheme="https" /> </intent-filter> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> <intent-filter android:autoVerify="true">
我們將在此模組中查看的最終檔是build.gradle檔,其中包含幾行值得注意的代碼:
//Again, we’re using com.android.feature plugin, rather than com.android.application// apply plugin: 'com.android.feature' android { //As previously mentioned, this section is missing an ‘applicationID’ attribute// … … … dependencies { implementation fileTree(dir: 'libs', include: ['*.jar']) androidTestImplementation('com.android.support.test.espresso:espresso-core:2.2.2', { exclude group: 'com.android.support', module: 'support-annotations' }) //All feature modules have a dependency on the base feature module, which we’re declaring here// implementation project(':base') testImplementation 'junit:junit:4.12'
由於所有feature modules都取決於base feature module,因此使用者首次從應用程式請求任何功能時,都將會收到base feature module以及實際嘗試訪問的feature module。
請注意,儘管該特定專案由一個base feature module和一個feature module組成,但如果您的app僅僅有一個instant app可訪問的feature時,則可以創建僅由base feature module組成的專案。 我們將在本系列中探討instant app專案的“types”。
4. Instant App Module
Instant App module有一個簡單的目的:它作為一個容器,將所有的feature modules 轉換成instant app的APK。
如果您打開該項目的Instant App module,那麼您將看到除了build.gradle檔外其他幾乎是空的,它只是聲明了對base feature module 和 feature module 的依賴關係:
apply plugin: 'com.android.instantapp' dependencies { implementation project(':feature') implementation project(':base') }
Testing Your App
由於此專案不包含任何APP連結,我們將無法測試其instant app元件,但我們仍然可以將該專案作為可安裝應用程式運行。這可能不是特別令人興奮,但是請記住,我們項目的大部分代碼和資源位於instant app feature module中,重要的是測試我們的項目如何成為可安裝的APP。
啟動我們之前創建的AVD或將可相容的物理Android智慧手機或平板電腦連接到電腦,然後從Android Studio工具列中選擇Run > Run… > app 。
儘管我們所有的MainActivity
代碼都位於feature module中,但一旦我們的應用載入後,您將看到MainActivity
的操作按鈕(FAB)和Hello World消息。我們在這裡看到的是我們的APP模組,它包含了分佈在Instant App feature 和 base feature modules中的代碼和資源,並且把它們結合到一個可安裝的APP中。
結論
在本教程中,我們深入瞭解了Instant Apps的工作原理,並探討了你需要為Android專案添加Instant App支持的各種原因。
在理想情況下,您開始探索Instant Apps的決定與開始新Android專案完全吻合,但不幸的是,作為開發人員很少這樣方便!更多的情況是,您必須重新配置現有專案才能支援Instant Apps,這並沒有在Android Studio的項目創建引導頁中選中一個核取方塊那麼簡單!
在下一篇文章中,我們將深入瞭解如何為已有項目添加對instant app的支持。我還將向您展示如何實現App Links,因此在下一篇文章結束之前,您將創建一個功能齊全的instant app,並且您可以在任何相容的AVD或Android設備上啟動和測試instant app。
敬請關注!與此同時,請查看關於Android APP開發的其他文章。
Subscribe below and we’ll send you a weekly email summary of all new Code tutorials. Never miss out on learning about the next big thing.
Update me weeklyEnvato Tuts+ tutorials are translated into other languages by our community members—you can be involved too!
Translate this post