有没有办法让Android清单中的元数据对软件包私有?
我想使用Android清单中的元数据来定制服务的行为有没有办法让Android清单中的元数据对软件包私有?,android,service,metadata,android-manifest,android-package-managers,Android,Service,Metadata,Android Manifest,Android Package Managers,我想使用Android清单中的元数据来定制服务的行为 <service android:name=".SampleService" android:exported="false"> <meta-data android:name="sampleName" android:resource="@string/sampleValue" /> </service> 我的服务是库的一部分,有些人在使用我的
<service
android:name=".SampleService"
android:exported="false">
<meta-data
android:name="sampleName"
android:resource="@string/sampleValue" />
</service>
我的服务是库的一部分,有些人在使用我的服务时可能会将敏感数据放入这些属性中。即使未导出服务,手机上其他已安装的软件包是否也可以通过PackageManager看到这些元数据属性
即使未导出服务,手机上其他已安装的软件包是否也可以通过PackageManager看到这些元数据属性
对。清单中的所有内容,以及您的资源和资产中的所有内容,都可以被设备上的所有应用程序访问。在做了一些测试之后,我确认所有包都可以看到所有元数据字段,正如Commonware所说的那样。但是,我还发现,通过使用android:resource而不是android:value,可以将值的内容保持为私有。当您使用android:resource时,PackageManager只返回资源的整数id,因此只有您的包可以访问实际的资源值。
更新:
原来,Commonware又是对的。进一步调查后,所有资源和资产对设备上安装的所有软件包都是公开可见的。不需要任何权限
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);
这样做可能会将信息从package manager的公共产品中排除到其他应用程序中,但定位和打开apk、提取二进制清单并将其重新格式化为纯文本相当简单—资源的情况应该类似。也许我们不应该总是依赖于能够做到这一点,但我们绝对不能依赖于其他人不能做到这一点。这对所有的dex文件、资产和资源都是如此吗?是的,但是在代码中组装的值需要比以标准方式存储的值更具体的工作。我明白你的意思。在我的例子中,我认为元数据不够敏感,不能保证这种混淆(没有密码、密钥等)。谢谢你的建议。有人能给我解释一下为什么安卓选择让所有资源和资产对所有其他软件包可见吗?有没有什么好的私人场所可以放置资源?或者你只需要在运行时下载它们并将其放在一个私有目录中?