[譯] 將通用安卓音樂播放器轉化為 instant 應用

Android_開發者發表於2019-05-05

從 Android Studio 的 3.3 版本開始,IDE 將會為 instant 應用提供工具支援。(撰寫至本文時,Android Studio 3.3 的可下載版本是 preview release,撰寫至譯文時,3.3 版本已更新到正式 release 版)。這篇博文中我們將介紹 我們即將採取的步驟 來把通用安卓音樂播放器 (UAMP) 轉換成 instant 應用。對於首次聽說 instant 應用的人,可以檢視 Android 開發者峰會上的會話,或者之前釋出的與該話題有關的閱讀文件

[譯] 將通用安卓音樂播放器轉化為 instant 應用

需求

為了在不使用命令列的情況下構建和部署 instant 應用,我們需要最低版本為 Android Studio 3.3。升級 Android Gradle 外掛來匹配 Android Studio 的版本也是非常重要的。例如,在撰寫本文時,Android Studio 的版本最新為 3.3 RC1,因此我們使用如下 Gradle 外掛版本:com.android.tools.build:gradle:3.3.0-rc01

更新清單檔案

在我們清單檔案的 application 標籤內部,我們需要新增程式碼 <dist:module dist:instant=”true” />。我們可能會看到報錯資訊表示『名稱空間 ‘dist’ 沒有被約束』,這裡我們需要新增程式碼 xmlns:dist="http://schemas.android.com/apk/distribution" 到清單程式碼的根標籤內。或者,我們可以按照 Android Studio 的提議為我們自動解決報錯問題。

我們也可以新增 intent filters 屬性來處理一個 VIEW intent,它與一個繫結我們應用的 URL 有關,儘管這不是唯一的辦法來觸發 instant 應用啟動。對於 UMAP 來說,更新後的清單檔案像下面程式碼這樣:

<application ...>

    <!-- Enable instant app support -->
    <dist:module dist:instant="true" />

<activity android:name=".MainActivity">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>

<!-- App links for http -->
        <intent-filter android:autoVerify="true">
            <action android:name="android.intent.action.VIEW" />
            <category android:name="android.intent.category.DEFAULT" />
            <category android:name="android.intent.category.BROWSABLE" />
            <data
                android:scheme="http"
                android:host="example.android.com"
                android:pathPattern="/uamp" />
        </intent-filter>

<!-- App links for https -->
        <intent-filter android:autoVerify="true">
            <action android:name="android.intent.action.VIEW" />
            <category android:name="android.intent.category.DEFAULT" />
            <category android:name="android.intent.category.BROWSABLE" />
            <data
                android:scheme="https"
                android:host="example.android.com"
                android:pathPattern="/uamp" />
        </intent-filter>
    </activity>
</application>
複製程式碼

構建和部署一個具備 instant 特性的應用包

我們可以遵照 Google Play Instant 文件中解釋的流程,我們也可以在 Android Studio 中更改執行配置。為了啟用 instant 應用的部署,我們可以選擇應用選單中 Deploy as instant app 選擇框,如下圖所示:

使用 Android Studio 介面來使應用部署為 instant 應用

現在,剩下要做的就是在 Android Studio 中點選非常令人滿意的 Run 按鈕,如果前面所有步驟都正確執行,那就等著看 instant 應用被自動部署和啟動吧!

這個步驟之後,我們不會看到我們的應用在啟動時出現在任何列表中。為了找到它,我們需要進入選單 Settings > Apps,已部署的 instant 應用被列在這裡:

Settings 列表下的 Instant 應用 > 應用

啟動 instant 應用

Android 系統可以通過很多種方式來觸發啟動一個 instant 應用。除了與 Play 商店繫結的機制之外,啟動 instant 應用通常是通過將 ACTION_VIEW 傳送到 URL 路徑所對應的物件,這個 URL 在我們的清單檔案中以 intent filter 的形式來定義。對於 UAMP 應用,通過執行下面的 ADB 指令來觸發我們的應用:

adb shell am start -a android.intent.action.VIEW "https://example.android.com/uamp"
複製程式碼

然而,Android 系統也會建議通過其他應用觸發 ACTION_VIEW 對應的 URL 路徑來啟動我們的應用,這基本上適用於除了 web 瀏覽器外的所有應用。

當**開啟**按鈕被按下時會啟動 UAMP 應用

有關應用連結的更多資訊,檢視這個主題的相關文件,包括你的應用處理如何驗證連結的歸屬方的方法。

已知問題

對於執行 API 28 版本的裝置(模擬器),當我們清除選單上 Deploy as Instant app 選擇按鈕並試圖再次部署時,會報如下的錯誤:

Error while executing: am start -n “com.example.android.uamp.next/com.example.android.uamp.MainActivity” -a android.intent.action.MAIN -c android.intent.category.LAUNCHER

Starting: Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] cmp=com.example.android.uamp.next/com.example.android.uamp.MainActivity }

Error type 3

Error: Activity class {com.example.android.uamp.next/com.example.android.uamp.MainActivity} does not exist.

Error while Launching activity
複製程式碼

解決辦法是移除裝置上的 instant 應用,既可以從裝置或模擬器的設定選單 Settings > Apps 中解除安裝,也可以通過 Android Studio 工具的標籤 terminal 中執行指令 ./gradlew uninstallAll

如果發現譯文存在錯誤或其他需要改進的地方,歡迎到 掘金翻譯計劃 對譯文進行修改並 PR,也可獲得相應獎勵積分。文章開頭的 本文永久連結 即為本文在 GitHub 上的 MarkDown 連結。


掘金翻譯計劃 是一個翻譯優質網際網路技術文章的社群,文章來源為 掘金 上的英文分享文章。內容覆蓋 AndroidiOS前端後端區塊鏈產品設計人工智慧等領域,想要檢視更多優質譯文請持續關注 掘金翻譯計劃官方微博知乎專欄

相關文章