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

Mirosalva發表於2019-03-14

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

從 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前端後端區塊鏈產品設計人工智慧等領域,想要檢視更多優質譯文請持續關注 掘金翻譯計劃官方微博知乎專欄

相關文章