Android端权限隐私的合规化处理实战记录

目录
  • 是什么
  • 为什么
  • 具体实践
    • 一.Android各版本对权限的适配处理
      • 1.1 早期的注册权限
      • 1.2 动态权限授予
      • 1.3 READ_PHONE_STATE权限的变化
    • 二.隐私信息合规化处理
      • 2.1 隐私信息获取告知的直接化和透明化
      • 2.2 隐私信息获取和传输的安全化
      • 2.3 部分隐私Api调用的严格化
    • 三.遇到的一些问题和坑
  • 总结

是什么

对客户端而言,权限隐私可分为权限和隐私两个大的方面。

  • 权限为用户通过app内弹窗设置或者手机设置内对应app的权限设置方式给予对应app相应的权限,如电话权限,定位权限,相机权限等,本文主要集中介绍隐私相关的权限部分。
  • 隐私为app使用过程中与用户个人相关的个人信息,如所在位置,Mac地址,设备id等。就Android端而言,多数隐私信息需要对应授权后才能获取,但目前仍存在部分隐私信息无需授权就可以拿到的。

为什么

  • 大众隐私意识觉醒,权限隐私安全性差会直接导致用户不愿使用;
  • 日趋严格的权限治理和隐私安全治理,工信部和市场的严格管控;
  • 客户端作为与用户最直接的交互信息收集入口,有义务合规化的收集和使用用户信息。

具体实践

一.Android各版本对权限的适配处理

1.1 早期的注册权限

Android6.0(SDK版本为23)之前的版本,安装App页面会列出当前app所注册的所有权限,无同意与否按钮,只有安装和取消,开发App时只需要在清单文件中注册所需的对应权限即可:

<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.CAMERA" />

1.2 动态权限授予

Android自6.0(SDK版本为23)开始,将权限分为普通权限,危险权限,特殊权限。而其中的危险权限需要在调用某些系统方法之前需要用户手动授予对应权限,包括PHONE,LOCATION,STORAGE等多个权限组。如果在没授权的情况下直接调用相关方法,就会抛出,应用也随之崩溃。报错信息类似下方这种:

java.lang.SecurityException: getDeviceId: has android.permission.READ_PHONE_STATE.

而要解决以上的报错问题,可以自行封装权限处理类工具,也可使用一些开源的权限工具进行处理。核心代码都逃不过:

//判断某个权限是否已经被同意
ContextCompat.checkSelfPermission(context, perm) ==  PackageManager.PERMISSION_GRANTED)
//请求某个权限,调用后会弹出权限系统弹窗
ActivityCompat.requestPermissions((Activity) object, perms, requestCode);

注:如果用户拒绝权限且不让再次显示系统权限授权弹窗的话,最好是提供端内可点击进入手机系统的权限设置页面以让用户可以选择开启对应权限。

1.3 READ_PHONE_STATE权限的变化

1.3.1 演变

  • READ_PHONE_STATE权限是允许访问电话状态权限,此权限主要集中在TelephonyManager类中,控制对imei,deviceId,Meid,SimSerialNumber等id和其他手机状态的获取。而多数app都会单独引用或者组合引用这些字段作为设备唯一码来标识用户设备,进而服务端进行数据分析,下发等操作。在6.0之前只需注册后就可以使用。
  • 在Android6.0之后,READ_PHONE_STATE权限变为危险权限,需要用户主动授权后方可使用,故部分App处理的操作为必须授权该权限后才允许使用App,不授权的话就退出应用。这显然不是一个很好的解决方式,但在过渡阶段还是能有一定效果的。可以预留出时间重新定义在未授权情况下如何标识特定设备。
  • 在适配Android10.0之后,READ_PHONE_STATE权限直接被取消掉了,换成了系统权限READ_PRIVILEGED_PHONE_STATE,此权限只能在系统App中才可以被使用。而如果代码处理上仍使用READ_PHONE_STATE权限进行授权的话,手机上不会再弹出同样的权限授予弹窗了,此时如果仍调用getDeviceId方法,会直接抛出SecurityException。源码上的可以体现在对应方法的注解上:
@RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE)
public String getDeviceId()
@RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE)
public String getImei()

1.3.2 适配处理

清单文件中设定使用READ_PHONE_STATE权限最高为28,即Android10以上的设备不进行该权限的获取。

<uses-permission
    android:name="android.permission.READ_PHONE_STATE"
    android:maxSdkVersion="28"/>
  • 在调用getDeviceId,getImei等方法之前增加当前设备Android版本的判断Build.VERSION.SDK_INT < Build.VERSION_CODES.Q,能有效避免调用这些方法导致的崩溃问题。
  • 由于Android10.0以上手机获取不到这些id,对国内广告的精准推送也都产生了一定的影响,故各大产商联盟推出了OAID的标识,本意是用于广告精准推送,但目前也不失作为客户端App唯一标识的一种选择。具体获取方式参考联盟的集成文档即可。

1.4 存储分区的处理

自Android10.0之后,Google开始采用存储分区,主要目的是改变现有App胡乱使用手机存储导致垃圾和其他安全问题。适配 Android11 后强制使用存储分区。具体分区如下,扩展的外部存储是无权限进行读取的。而其他私有存储会在App卸载后清理掉:

具体部分代码改动如下:

1.拍照存储路径:

Environment.getExternalStorageDirectory().getAbsolutePath()修改为getExternalFilesDir(Environment.DIRECTORY_DCIM)

2.原本的存储路径 /storage/emulated/0 改为 /storage/emulated/0/Android/data
具体调用的修改为:
Environment.getExternalStorageDirectory()改为context.getExternalFilesDir() ;

3.如果App在sdcard中有重要存储,可以在适配android10.0的过渡阶段将之前的数据复制出来到新的存储分区中。

二.隐私信息合规化处理

上半部分较为粗略的过了一下权限相关的部分改动和对应修改,接下来说一说隐私信息的合规化处理。当然,权限作为隐私处理的前提,如果权限都没有合理的修改完毕,那隐私处理合规化更谈不上了,毕竟很多隐私是依赖于权限的。

2.1 隐私信息获取告知的直接化和透明化

  • 在首次打开App时,需要在进行初始化之前就向用户展示用户协议与隐私保护弹窗或页面,只有用户在同意之后才能进入App进行使用。而对于手机号、MAC地址、IMEI、所在位置信息、手机存储权限、相册访问权限,手机流量使用等敏感信息需要让用户在第一屏就能够看到。并且提供用户协议和隐私政策链接,能让用户点击后查看具体详细的条款。设计完成后要让法务进行确认,是否符合。
  • 在处理1.2中的动态权限时,需要在系统弹窗中或者之前说明需要用户授予该权限的原因。如:获取定位权限之前需要告知用户该权限是为了获取定位信息,然后精准推送相关内容。获取相机权限是为了要使用摄像头进行拍照。
  • 在进入App操作三步以内能看到法律条款和隐私政策入口,正常处理方式会在App的设置页内加上对应入口。同时在注册登录页面,需要明显展示出法律条款和隐私条款入口,且需要默认不勾选,需要用户主动同意后才能进行账号注册和登录。如下图:

  • 分发广告的App需要注意处理广告下载逻辑,在用户点击后需要展示所下载App的信息,所需的权限和隐私条款,让用户清楚的知道下载的App是否是自己想要的,且不允许自动下载。这样能很好的解决用户无意识的在手机上下载了很多无用App,这对很多老年人使用手机很有帮助。

2.2 隐私信息获取和传输的安全化

  • 避免频繁的调用系统方法获取隐私信息,可以在单次启动App调用该获取数据后使用全局变量进行缓存,之后每次使用时直接调用全局变量使用就行,不必每次都调用系统方法。包括getDeviceId,getMacAddress等。
  • 诸如imei,mac,定位的经纬度等敏感信息,需要避免多次在网络中传输,可以处理为单独接口收集相关信息一次后保存在服务端即可,无需每次传输;另外需要避免以明文的方式在数据接口中传输。像imei可以通过MD5加密算法进行加密处理,并不会影响用户的区分;
  • 由于READ_PHONE_STATE权限升级为了系统权限READ_PRIVILEGED_PHONE_STATE,部分通过native方式(C代码)直接调用imei等信息时也会报错或者为空。建议这部分尽量使用java方式调用,如果有变动可以明显的感知到错误并修改,不至于需要重新修改C代码,然后又进行jni编译。

2.3 部分隐私Api调用的严格化

  • 在未授权的情况下,需要保证App中与该权限无关联的功能可以正常使用。所以就不能简单的处理为1.3.1中提到的不给权限就不让使用App的方案了。
  • Android端目前尚存在部分无需动态授权就可以获取的隐私,如用户手机上的应用安装列表。此信息可用于分析用户喜好,如小说类产品还是视频类产品;也可以用于分析用户某些App还未安装,便于推送广告的拉新。但目前国内市场已经开始治理,如果存在获取手机内应用列表的情况,会进行下架处理或者不予上架。
  • 目前工信部和各应用市场对App上架要求严格,使用第三方检测工具可以很细致的检测出App中存在哪些不合理的系统方法调用,比如:在未同意协议与隐私之前就进行了网络请求;在未同意协议与隐私之前获取了Mac地址;在未获取定位权限的情况下就获取了手机的基站信息。

三.遇到的一些问题和坑

这里总结部分在开发过程中遇到的一些隐蔽小点,希望能帮助到大家。

  • 早期的腾讯X5内核会在隐私协议展示时就会获取mac地址,如下图。可尝试更新到新的版本继续查看。由于我方对X5内核需求不高,所以直接进行了删除清理。

  • 集成开源库或者第三方sdk的初始化均需要处理为同意隐私之后再进行,大多数sdk在初始化时都会调用相关无需授权的api方法。如语音相关的讯飞sdk会在初始化的时候调用MAC地址信息。
  • 部分统计库如umeng,talkingdata sdk需要升级到新版本的接入方式。老版本的talkingdata sdk在尚未授定位权限时进行初始化仍会调用手机基站信息api(属于定位)。
  • 自有代码逻辑中相关隐私信息的获取和赋值,也都要放到隐私同意之后去进行,故在用户协议和隐私同意之前尽量少的进行代码逻辑处理。

总结

权限隐私的发展趋势只会越来越严格和规范。在日常的客户端开发当中,我们就需要时刻持有隐私安全的意识,让自己站在用户的角度上合理的保证隐私安全。并紧跟隐私安全的发展,提前布局。这样才能不至于临时出问题后手忙脚乱的去处理。

到此这篇关于Android端权限隐私合规化处理的文章就介绍到这了,更多相关Android端权限隐私合规化内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Android获取设备隐私 忽略6.0权限管理

    一.前言 (1).由于MIUI等部分国产定制系统也有权限管理,没有相关api,故无法判断用户是否允许获取联系人等隐私.在Android 6.0之后,新增权限管理可以通过官方api判断用户的运行状态: (2).我们指定targetSdkVersion为23或者之后我们还需要在运行时请求这些所需的权限.这很重要,因为已经出现了很多开发者把targetSdkVersion飙到了最新,然后发现自己的app疯狂的崩溃,这是由于他们没有实现执行运行时权限请求的代码.当你已经把一个targeting API

  • Android端权限隐私的合规化处理实战记录

    目录 是什么 为什么 具体实践 一.Android各版本对权限的适配处理 1.1 早期的注册权限 1.2 动态权限授予 1.3 READ_PHONE_STATE权限的变化 二.隐私信息合规化处理 2.1 隐私信息获取告知的直接化和透明化 2.2 隐私信息获取和传输的安全化 2.3 部分隐私Api调用的严格化 三.遇到的一些问题和坑 总结 是什么 对客户端而言,权限隐私可分为权限和隐私两个大的方面. 权限为用户通过app内弹窗设置或者手机设置内对应app的权限设置方式给予对应app相应的权限,如电

  • iOS组件化开发实战记录

    1. 组件化需求来源 起初的这个项目,App只有一条产品线,代码逻辑相对比较清晰,后期随着公司业务的迅速发展,现在App里面承载了大概五六条产品线,每个产品线的流程有部分是一样的,也有部分是不一样的,这就需要做各种各样的判断及定制化需求.大概做了一年多后,出现了不同产品线提过来的需求,开发人员都需要在主工程中开发,但是开发人员开发的是不同的产品线,也得将整个工程跑起来,代码管理.并行开发效率.分支管理.上线时间明显有所限制.大概就在去年底,我们的领导提出了这个问题,希望作成组件化,将代码重构拆分

  • Android App隐私合规检测辅助工具Camille详解

    目录 简介 安装 用法 后记 场景 1APP.SDK违规处理用户个人信息方面 1.1违规收集个人信息. 1.2超范围收集个人信息. 1.3违规使用个人信息. 1.4强制用户使用定向推送功能. 2设置障碍.频繁骚扰用户方面 2.1APP强制.频繁.过度索取权限. 2.2APP频繁自启动和关联启动. 3欺骗误导用户方面 3.1欺骗误导用户下载APP. 3.2欺骗误导用户提供个人信息. 参考链接 Camille Android App隐私合规检测辅助工具,项目仓库:https://github.com

  • Android应用隐私合规检测实现方案详解

    目录 [前言] 一.准备工作 二.编写Xposed模块 [前言] 为了响应国家对于个人隐私信息保护的号召,各应用渠道平台陆续出台了对应的检测手段去检测上架的应用是否存在隐私合规问题,因而你会发现现在上架应用,随时都会存在被驳回的风险,为了避免被驳回,我们需要做的就是提前检测好自己的应用是否存在隐私合规问题,及时整改过来,下面提供Xposed Hook思路去检测隐私合规问题,建议有Xposed基础的童鞋阅读 一.准备工作 1.准备一台root过的安卓手机或者安卓模拟器(新版本的手机root比较麻烦

  • 详解Android自定义权限使用总结

    1.如何声明自定义权限 在Manifest文件中使用Permission标签定义自己的权限: <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.bright.permission"> <permission

  • Android端实现单点登录的方法详解

    前言 单点登录SSO(Single Sign On)说得简单点就是在一个多系统共存的环境下,用户在一处登录后,就不用在其他系统中登录,也就是用户的一次登录能得到其他所有系统的信任.单点登录在大型网站里使用得非常频繁,例如像阿里巴巴这样的网站,在网站的背后是成百上千的子系统,用户一次操作或交易可能涉及到几十个子系统的协作,如果每个子系统都需要用户认证,不仅用户会疯掉,各子系统也会为这种重复认证授权的逻辑搞疯掉.实现单点登录说到底就是要解决如何产生和存储那个信任,再就是其他系统如何验证这个信任的有效

  • 详解Android端与JavaWeb传输加密(DES+RSA)

    一.加密介绍 本文采用对称式加密算法DES和非对称式加密算法RSA结合做数据传输加密的方式. 先说一下对称式加密 DES:对称式加密即使用单钥密码加密的方法,信息的加密和解密使用同一个秘钥,这种方式也称为单秘钥加密.所谓对称就是指加密和解密使用的是同一个秘钥! 常用的对称加密有:DES.IDEA.RC2.RC4.SKIPJACK.RC5.AES算法等. 与对称加密算法不同,非对称加密算法需要两个密钥:公开密钥(publickey)和私有密钥 (privatekey).公开密钥与私有密钥是一对,如

  • ionic App 解决android端在真机上tab处于顶部的问题

    ionic App 解决android端在真机上 tab处于顶部的Bug 在app.js 页面中添加以下代码 .config(function($stateProvider, $urlRouterProvider,$ionicConfigProvider) { $ionicConfigProvider.platform.ios.tabs.style('standard'); $ionicConfigProvider.platform.ios.tabs.position('bottom'); $i

  • android端实现验证码随机生成功能

    本文实例为大家分享了android端生成随机验证码的具体代码,供大家参考,具体内容如下 package com.nobeg.util; import java.util.Random; import android.graphics.Bitmap; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.graphics.Bitmap.

  • Android uses-permission权限列表中文注释版

    android同时也限定了系统资源的使用,像网络设备,SD卡,录音设备等.如果你的应用希望去使用任何系统资源,我们必须去申请Android的权限.这就是<uses-permission>元素的作用. 一个权限通常有以下格式,用一个名字为name 的字符串去指导我们希望使用的权限. 复制代码 代码如下: <uses-permission android:name="string"/> 例如:想要获得networking APIs的使用权限,我们指定如下的元素作为

随机推荐