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:valueの代わりにandroid:resourceを使用することで、値のコンテンツを非公開にできることもわかりました。android:resourceを使用すると、リソースの整数IDのみがPackageManagerから返されるため、パッケージのみが実際のリソース値にアクセスできます。

更新: 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 に答える