现在运用商场的隐私合规查看越来越严格,各大手机厂商的检测标准也不一致,常常有这个平台过审了那个平台还有问题呈现,依照工信部的要求,工信部隐私合规阐明。隐私合规是个不可不重视的点。

咱们一般遇到的首要问题:
  • 在用户同意隐私协议之前,不能有收集用户隐私数据的行为。例如:在用户同意协议之前不能去获取 Android ID、Device ID、MAC 等隐私数据。

  • 在用户同意隐私协议之后,获取权限时必须要契合当时运用场景,例如:咱们需求获取手机读写,相机权限,这种需求在真正的读写,打开相机等页面时才能去请求权限。

如上问题处理可分为两种:权限隐私
  • 权限 需求在对应页面即 app内获取权限时主动设置弹窗等方式给予app相应的权限
'如电话权限,定位权限,相机权限,浮窗权限,读写权限等。在每个请求危险权限前,都需求弹窗阐明权限解说阐明。'
  • 隐私 为app运用过程中与用户个人相关的个人信息
'如方位,Mac地址,设备id等。就Android端而言,大都隐私信息需求对应授权后才能获取,但现在仍存在部分隐私信息无需授权就能够拿到的'

怎么检测

一、第三方检测

京数安扫描平台 、国舜 、 网易云盾

二、静态检测
  • Lint 查看项目

    Lint用于检测静态代码和资源,找到其中不契合预界说规矩的当地。可参阅网易云隐私合规静态查看

  • 反编译查找对应办法

    反编译首要是为了找出第三方的一些不合规办法调用,但是比较费事,全局查找很不便利

三、动态检测(开源)
  • 1、Xposed

    长处 :Xposed 是比较早的做hook的结构, Xposed结构能够在不修正APK文件的情况下影响程序运转(修正体系)的结构服务,基于它能够制作出许多功用强大的模块,且在功用不抵触的情况下一起运作。Android中一般存在两种hook:sdk hook和ndk hook。native hook的难点在于了解ELF文件与学习ELF文件,Java层Hook则需求了解虚拟机的特性与java上的反射运用。另外还存在全局hook,即结合sdk hook和ndk hook,xposed便是一种典型的全局hook结构。

    缺陷:需求手机ROOT

  • 2、VirtualXposed

    长处 :VirtualXposed 是基于VirtualApp 和 epic 完成的,能在非ROOT环境下直接运转Xposed模块 (现在支持5.0~10.0)。其实VirtualXposed便是一个支持Xposed的虚拟机,咱们把开发好的Xposed模块和对应需求hook的App安装上去就能完成hook功用。

    缺陷:步骤相对费事,de.robv.android.xposed 的依靠需求翻墙。

  • 3、epic

    长处 :装备简略,属于运转时hook,阐明在动态加载dex也能检测到,也是我现在再用的,能够自界说装备hook 对应的类和办法,并找出当时调用线程仓库,直接定位到调用的办法。

    缺陷:兼容问题,Android 11及以上只能支持 64位,不过这个不影响11以下的运用;只检测java类代码,native没有hook 。

  • 4、PrivacySentry

    接入相对杂乱,基于自界说transform , 编译期注解+hook方案,第一个transform收集需求阻拦的灵敏函数,第二个transform替换灵敏函数,运转期收集日志,一起支持游客模式。

    有java.util.zip.ZipException: duplicate entry: META-INF/INDEX.LIST 抵触风险。

  • 5、camille

    运用 python Frida 等工具命令,做hook 模块,手机需求Root,功用强大但相对杂乱

  • 6、自界说Asm插件,做代码插入检测

    能够在class->dex时,对相应的类、调用办法,做检测。增加咱们的阻拦代码

四、epic落地
  • 我这儿运用的时 epic 检测,直接依靠:
implementation 'me.weishu:epic:1.0.0'
implementation 'me.weishu.exposed:exposed-xposedapi:0.4.5'

首要核心是 DexposedBridge.findAndHookMethod 办法

//targetClass: 传入 需求hook 的类,如:TelephonyManager.class
//targetMethod:类对应的办法,如:getDeviceId
DexposedBridge.findAndHookMethod(targetClass, targetMethod, new XC_MethodHook() {
   @Override
   protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
       super.beforeHookedMethod(param);
       //被调用的类名
       String className = param.method.getDeclaringClass().getName();
       //被调用的函数名
       String methodName = param.method.getName();
       LogAction.log("检测到 " + className + " 被调用: methodName=" + methodName);
       //这儿能够收集当时的线程信息,仓库等,将调用关系打印出来,例如:
       //Thread thread = Thread.currentThread();
       //StringBuilder stringBuilder = new StringBuilder();
       //获取线程信息
       //String threadInfo = getThreadInfo(thread);
       //stringBuilder.append(threadInfo);
       // 回来表明此线程的仓库转储的仓库盯梢元素数组。
      // 如果这个线程还没有发动,现已发动但还没有被体系计划运转,或许现已终止,这个办法将回来一个零长度的  数组。
       //StackTraceElement[] stackTraceElements = thread.getStackTrace();
       //String print = printToString2(stackTraceElements);
       //stringBuilder.append("线程仓库日志:").append(print);
       //LogAction.log(stringBuilder);
   }
   @Override
   protected void afterHookedMethod(MethodHookParam param) throws Throwable {
       super.afterHookedMethod(param);
   }
});

例如,我这儿用了 leakcanary 做检测时会提示的

Android 隐私合规检测

由于我对 android.app.ApplicationPackageManager 这个类做了检测,queryIntentActivities 办法被调用时即触发了beforeHookedMethod

五、集成优化处理
  • 咱们能够自己界说一个module模块,单独处理合规检测,运用 debugImplementation 的方式集成,不会影响到线上

  • 能够运用 ContentProvider 做初始化入口,debugImplementation 集成进来即可,在 ContentProvider onCreate 的时候去 start启用 需求hook 的集合类。

  • 能够运用企业微信供给 APIToken,在收到 隐私限制办法被调用时,触发音讯发送,便利测验和提示,不需求去看log日志。