当您在Android项目中导入第三方API(数据包依赖注入,生成的库,源代码等)时,您会认为它们的行为与广告一样。大多数时候代码都不是开源的,它是混淆的或者只是编译过来。
有没有办法控制此API对重要系统资源(如网络,联系人,视频和音频,位置)的访问?
最好的方法是为系统资源提供proxy
。这将带来以下好处:
我未能找到如何实现这样的解决方案,因为用户定义的活动和服务无法控制第三方API的服务,甚至无法直接调用任何Android公共接口。
解决方案不应该要求root访问权限,因为您不希望将此控件置于您自己应用的边界之外。
这个问题的内容与几个问题有关,这些问题涉及这个广泛问题的特殊性(log data of content providers,network requests - 这让我在研究答案的同时考虑了这个问题)
注意:简短的回答是否定的,但是一个人可以有足够的创造力(可能针对本机级黑客可以解决此问题 - idk)
答案 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,正如我自己所经历的那样,并且涉及大量的手工劳动。