控制第三方API对Android系统资源的访问?

时间:2016-02-17 13:40:57

标签: android api proxy android-security

当您在Android项目中导入第三方API(数据包依赖注入,生成的库,源代码等)时,您会认为它们的行为与广告一样。大多数时候代码都不是开源的,它是混淆的或者只是编译过来。

有没有办法控制此API对重要系统资源(如网络,联系人,视频和音频,位置)的访问?

最好的方法是为系统资源提供proxy。这将带来以下好处:

  • 可以通过在代理中提供模拟数据来执行测试
  • 如果没有必要,您的应用程序将不必提供API所需的所有权限,并且代理将允许API因为通过模拟权限授予而不会中断
  • 过滤本地收集的有关用户的可能数据,并将其发送到用于广告或恶意目的的API主页回复

我未能找到如何实现这样的解决方案,因为用户定义的活动和服务无法控制第三方API的服务,甚至无法直接调用任何Android公共接口。

解决方案不应该要求root访问权限,因为您不希望将此控件置于您自己应用的边界之外。

这个问题的内容与几个问题有关,这些问题涉及这个广泛问题的特殊性(log data of content providersnetwork requests - 这让我在研究答案的同时考虑了这个问题)

注意:简短的回答是否定的,但是一个人可以有足够的创造力(可能针对本机级黑客可以解决此问题 - idk)

1 个答案:

答案 0 :(得分:1)

在名为com.myproxies的软件包中构建您想要保护的所需android资源的代理类(例如MediaRecorder,SensorManager,Camera,java.net.HTTPURLConnection)。在代理中,您需要实现所有公共方法你正在嘲笑的类,你需要实现逻辑以允许访问(转发到适当的方法)或拒绝。一个有用的步骤是检查caller of the method

  • 如果您打算导入源代码,请重构代码以将包更改为您的代理(proguard可以帮助解决此问题)。

  • 如果您正在使用库,请获取Jar Jar Links,这是一个实用程序,可以轻松地重新打包Java库并将它们嵌入到您自己的发行版中,并将内部的程序包名称更改为类的名称。您的包裹将作为代理。

  • 如果您正在使用Maven或Gradle包依赖注入,您还可以尝试导入Jar Jar链接并在编译时执行包重构(不太确定可以完成)

不幸的是,我很容易打破API,正如我自己所经历的那样,并且涉及大量的手工劳动。