抬头仰望星空,是否能发现自己的渺小。

伪斜杠青年

人们总是混淆了欲望和理想

Android 11 AIDL 失效引出的新特性:软件包可见性

前两天公司一同事做了一下 AIDL 的尝试,发现在 Android 11 的设备上无法运行,经过检索得知,在 Android 11 (Target API 30)的情况下,需要指定软件包的可见性。

官方的说明如下:

为了更好地 “问责” 访问已安装应用的行为,默认情况下,以 Android 11 为目标平台 (目标 API level 为 30) 的应用默认将只能检测到部分过滤后的已安装应用。如果想获取更多别的已安装应用列表信息,则需要在应用内的 Android manifest 中添加 <queries> 元素,从而拓宽访问范围。

这里有两种形式,一种是显式的指定需要交互的应用的包名,可用于同一公司内部相关应用的相互访问(可以配置多个 package 标签)。

<manifest package="com.example.game">
    <queries>
        <!-- 声明所要进行交互的应用名 -->
        <package android:name="com.example.service" />
    </queries>
    
    ...
  
</manifest>

还有一种隐式的作用于 intent,用于泛匹配的方式:

<manifest package="com.example.game">
    <queries>
        <!-- 声明要查询的 intents
             例如下列标签声明了一个自定义的分享视图的 intent
            -->
        <intent>
            <action android:name="android.intent.action.SEND" />
            <data android:mimeType="image/jpeg" />
        </intent>
    </queries>

    ...
  
</manifest>

对于 Content Provider 这种特殊的跨进程组件则特殊一点:

<manifest package="com.example.suite.enterprise">
    <queries>
        <provider android:authorities="com.example.settings.files" />
    </queries>
    ...
</manifest>

对于需要配置多项的情况按以下二选一:

  • 在单个 <provider> 元素中,声明以英文分号分隔的授权列表。
  • 添加多个 <provider> 元素,让这些元素全部在同一 <queries> 元素中。在每个 <provider> 元素中,声明单项授权或以英文分号分隔的授权列表。

总结一下:

就是需要访问其他 APP 时,显式或者隐式的将用于寻找对方的,比如包名或者intent,在 manifest 中使用 queries 标签包裹起来,以获取更大的访问范围。

指定后,可解 AIDL 在 Android 11 上无法连接的问题。

参考:https://developer.android.google.cn/training/basics/intents/package-visibility


本站由以下主机服务商提供服务支持:

0条评论

发表评论