おでーぶでおでーぶ

いろいろ書く。いろいろ。

App Shortcuts の targetPackage/targetClass に string resource も manifest placeholder も使えない

DroidKaigi 2020 アプリで App Shortcuts を設定する際、色々と試行錯誤をしてくださった方がいたんですが、僕の理解が足りずに手を煩わせてしまったのでざっと調査しました。

github.com

当然ハードコーディングすれば起動しますし、string resource を使えば preference などからは targetPackage/targetClass も動作します。ただ App Shotcuts がどうしても出来ず、main/resources/xml/shortcuts.xml に対して、次の3通りを試してみました。

  • 動的に定義した string resource
  • main/resources/values/strings.xml で定義した string resource
  • Manifest Placeholder

動的に定義した string resource

f:id:jmatsu:20200203012531j:plain

f:id:jmatsu:20200203012535j:plain

上記の通り、string resource が展開されず resource の id が表示されています。*1

main/resources/values/strings.xml で定義した string resource

動的に生成しない場合、つまり main resource からは確実に見える resource を使ってみました。

f:id:jmatsu:20200203012511j:plain

f:id:jmatsu:20200203012526j:plain

こちらもやはり展開されませんでした。

Manifest Placeholder

App Shortcuts 用のファイルは Android Manifest に meta-data として埋め込むため、Manifest Merger か Injector が頑張ってくれるかも?と思い、試してみます。

f:id:jmatsu:20200203012457j:plain

f:id:jmatsu:20200203012503j:plain

無理でした。Placeholder (放置)。

余談

com.android.tools.build:gradle:3.6.0-rc01 (3.5.3 でも同様でした) では以下の方法で動的に application id を resource に差し込む必要が出てきました。API breaking changes があり、設計思想及び変更の propagation が変わったため注意した方が良さそうです。

android {
    applicationVariants.configureEach { variant ->
        variant.resValue('string', 'application_id', variant.applicationId)
    }
}

resource value に限らず、今までは mergedFlavor を利用する以下の方法があったかと思いますが、現在は動作しません。(下記は3.4.x時代の公式ドキュメントサンプルから転載)*2

android.applicationVariants.all { variant ->
    def mergedFlavor = variant.getMergedFlavor()
    // Defines the value of a build variable you can use in the manifest.
    mergedFlavor.manifestPlaceholders = [hostName:"www.example.com/${variant.versionName}"]
}

*1:多分。なんか昔はミスりまくって時々見かけたはずなんですが、今は逆にこれを再現することができないでいます。

*2:https://google.github.io/android-gradle-dsl/current/com.android.build.gradle.AppExtension.html#com.android.build.gradle.AppExtension:applicationVariants