6

我想在 Android 清单中使用元数据来自定义服务的行为。

<service
    android:name=".SampleService"
    android:exported="false">
    <meta-data
        android:name="sampleName"
        android:resource="@string/sampleValue" />
</service>

我的服务是图书馆的一部分,有些人在使用我的服务时可能会将敏感数据放入这些属性中。即使没有导出服务,这些元数据属性是否通过 PackageManager 对手机上其他已安装的包可见?

4

2 回答 2

9

即使没有导出服务,这些元数据属性是否通过 PackageManager 对手机上其他已安装的包可见?

是的。清单中的所有内容以及资源和资产中的所有内容都可供设备上的所有应用程序访问。

于 2012-04-27T14:40:04.263 回答
1

正如 CommonsWare 所说,在做了一些测试之后,我确认所有元数据字段对所有包都是可见的。但是,我还发现您可以通过使用 android:resource 而不是 android:value 来保持 value 的内容私有。当您使用 android:resource 时,PackageManager 只会返回资源的整数 id,因此只有您的包才能访问实际的资源值。

更新: 事实证明,CommonsWare 又是对的。在进一步调查后,所有资源和资产对设备上安装的所有软件包都是公开可见的。不需要任何权限。

PackageManager pm = getPackageManager();
PackageInfo info = pm.getPackageInfo("test.package", PackageManager.GET_META_DATA|PackageManager.GET_SERVICES);
int resourceId = info.services[0].metaData.getInt("sampleName");
String resourceValue = pm.getResourcesForApplication("test.package").getString(resourceId);
于 2012-04-27T15:25:33.420 回答