有没有办法让 Android 清单中的元数据对包私有?
Posted
技术标签:
【中文标题】有没有办法让 Android 清单中的元数据对包私有?【英文标题】:Is there a way to keep meta-data in the Android manifest private to the package? 【发布时间】:2012-05-08 07:40:16 【问题描述】:我想使用 android 清单中的元数据来自定义服务的行为。
<service
android:name=".SampleService"
android:exported="false">
<meta-data
android:name="sampleName"
android:resource="@string/sampleValue" />
</service>
我的服务是图书馆的一部分,有些人在使用我的服务时可能会将敏感数据放入这些属性中。即使服务没有导出,这些元数据属性是否对手机上其他已安装的包通过 PackageManager 可见?
【问题讨论】:
【参考方案1】:即使服务没有导出,这些元数据属性是否对手机上其他已安装的包通过 PackageManager 可见?
是的。清单中的所有内容以及资源和资产中的所有内容都可供设备上的所有应用程序访问。
【讨论】:
【参考方案2】:正如 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);
【讨论】:
这样做可能会从包管理器的公开产品中排除信息给其他应用程序,但定位和打开 apk、提取二进制清单并将其解压缩回纯文本相当简单 -资源的情况应该类似。一个人或许不应该依赖于总是能够做到这一点,但绝对不能不依赖于其他人不能够做到这一点。 不是所有 dex 文件、资产和资源都这样吗? 是的,但是在代码中组装的值比以标准方式存储的值需要更具体的工作。 我明白你在说什么。就我而言,我认为元数据不够敏感,不足以保证这种混淆(没有密码、密钥等)。不过感谢您的建议。 谁能向我解释为什么 Android 选择让所有资源和资产对所有其他包可见?有什么好地方可以私下放资源吗?还是只需要在运行时下载它们并将其放在私有目录中?以上是关于有没有办法让 Android 清单中的元数据对包私有?的主要内容,如果未能解决你的问题,请参考以下文章
您的 android 清单中所需的元数据标记不存在。 MobileAds.initialize() 处的应用程序崩溃;
清单的应用程序标记中缺少名称为“com.google.android.gms.appstate.APP_ID”的元数据标记
有没有办法预先缓存网页以使用 Android WebView 查看?
apache pig Java UDF - 更改属性中的值似乎并没有坚持
Android 11 应用程序崩溃并显示“您的应用程序的 AndroidManifest.xml 中的元数据标记没有正确的值。预期为 12451000,但发现为 4323000”