合规检测主要是对隐私API的无声明调用的筛选
主要存在于:
启动时
- 三方SDK的初始化
- 协议声明前的隐私API调用和权限申请
- 打开隐私协议对隐私API的调用
运行时
- 三方/ app 对 隐私API的调用没有包含于协议或者无调用前声明
对隐私API的调用方式主要两种方式
- 直接调用
- 反射调用
检测方案:
首先要了解自己需要过滤那些API
使用Android Studio 进行全局搜索
- 对于自己开发的APP代码可以使用全局搜索的方式
- 如果包含第三方的SDK那就在无混淆和加固打包后进行反编译,然后再进行全局搜索
- 对于反射调用的方法也要对关键字进行搜索
优点:
反编译后筛选比较全面,基本不会有遗漏。
缺点:
这种方案对于app本身的代码容易找到调用堆栈并做出调用方案处理,但是对于三方SDK较为麻烦,复杂的SDK很难找出调用路径
AOP注入代码
编译时使用gradle 插件在编译时进行检测
优点:
这种方案比全局搜索的方式更智能,
缺点:
也不会打印出调用堆栈,毕竟不是运行时
使用HOOK的方式
使用xposed或者frida hook隐私api的调用,并打印出调用堆栈
优点:
可以直接找出对应的调用堆栈做出处理
缺点:
只能在运行时检测,运行过程没有调用的API没法进行检测,无法在调用前进行声明
需要root的手机 或者模拟器,xposed 和 firda 都需要写对应的注入代码
使用循环打印调用堆栈方式
这种和HOOK相似,只是有代码侵入和不侵入的区别,在 application 中 启动一个新线程for循环对当前调用的方法的堆栈进行日志打印,从日志打印中筛选出对隐私api的调用
优点:
相对于Hook方式,代码量相对较少,无需开发插件。
缺点:
- 检测时死循环可能对性能造成影响
- 对源代码有侵入,检测完成后测试代码需要移除
三种方式各有优缺点,可根据自己的需求进行选择。
如果只是在启动时进行检测,只需要hook或者堆栈检测就可以了。
如果想要很全面的检测需要在调用前进行声明,那就需要字节码注入和全局搜索方式了。