Android 11 在 Android 带有字符串资源的清单中声明包可见性

Android 11 declaring package visibility in Android Manifest with string resource

我的应用检测是否通过 queryIntentActivities 安装了某个应用。因为我的应用程序目标 api 级别 30 这个 stopped working 因为我缺少一些清单声明。

this example中他们直接定义包名。但是我要查询的应用程序因每个构建变体而异。所以最好使用字符串资源。然而这似乎不可能。

例子

<manifest package="com.example.game">
    <queries>
        <package android:name="com.example.store" />
        <package android:name="com.example.services" />
    </queries>
    ...
</manifest>

我想要什么

<manifest package="com.example.game">
    <queries>
        <package android:name="@string/store_app" />
        <package android:name="@string/services_app" />
    </queries>
    ...
</manifest>

一些其他文件

<string name="store_app">com.example.store</string>
<string name="services_app">com.example.services</string>

如何使用字符串资源

我用 manifestPlaceholders 解决了这个问题,因为我想要一个单一的 AndroidManifest。此解决方案的唯一缺点是我还在我的代码中使用了应用程序包名称,因此我需要在字符串资源文件中再次定义它。

AndroidManifest

<manifest package="com.example.game">
    <queries>
        <package android:name="${store_app}" />
        <package android:name="${services_app}" />
    </queries>
    ...
</manifest>

build.gradle

manifestPlaceholders = [store_app: "com.example.store"]

我还尝试 this solution 在我的 gradle 文件中创建一个字符串资源,但我无法让它工作。