精华内容
下载资源
问答
  • 2019-07-01 17:35:42

    Android P

    1. non-sdk 接口限制

      • 对非 SDK 接口的处理是 API 抽象化的实现细节
      • 官方链接 https://developer.android.google.cn/reference/packages
      • Android P 引入了针对非 SDK 接口的新使用限制,无论是直接使用还是通过反射或 JNI 间接使用。 无论应用是引用非 SDK 接口还是尝试使用反射或 JNI 获取其句柄,均适用这些限制。
        • Light grey list: targetSDK>=P时,警告;

        • Dark grey list: targetSDK<P时,警告;>=p时,不允许调用;

        • Black list:三方应用不允许调用;

        • 官方链接 https://android.googlesource.com/platform/frameworks/base/+/master/config/

          结果
          vik 指令引用字段引发 NoSuchFieldError
          vik 指令引用函数引发 NoSuchMethodError
          ss.getDeclaredField() 或 Class.getField() 反射引发 NoSuchFieldException
          ss.getDeclaredMethod() 或 Class.getMethod() 反射引发 NoSuchMethodException
          ss.getDeclaredFields() 或 Class.getFields() 反射结果中未出现非 SDK 成员
          ss.getDeclaredMethods() 或 Class.getMethods() 反射结果中未出现非 SDK 成员
          ->GetFieldID() 调用 JNI 返回 NULL,引发 NoSuchFieldError
          ->GetMethodID() 调用 JNI 返回 NULL,引发 NoSuchMethodError
    2. 安全相关

      • 加密变更.
        Crypto Java 加密架构 (JCA) 提供程序现已被移除

      • 类似写法,将会发生 NoSuchProviderException:

         SecureRandom.getInstance("SHA1PRNG", "Crypto")
        

        在android P 之前的设备上,使用 Crypto 提供商,如果 target < 24 (N) 能够正常使用,如果target 24+ 则会失败 在adnrodi P 设备上 由于彻底移除了 Crypto, 因此无论 target 是何值 都会抛出异常 NoSuchProviderException 许多算法的 Bouncy Castle 版本被弃用 加密功能的 BC 提供者被移除,官方博客中这样说: Starting in Android P, we plan to deprecate some functionality from the BC provider that’s duplicated by the AndroidOpenSSL (also known as Conscrypt) provider android P开始,BC 提供者变成不推荐,如果targetApi < P 会有日志警告 targetApi >=p (28+) 将会抛出 NoSuchAlgorithmException ,以下写法将会受影响:

        Cipher.getInstance("AES/CBC/PKCS7PADDING", "BC") or 
        Cipher.getInstance("AES/CBC/PKCS7PADDING", Security.getProvider("BC"))
        

        建议:不要再指定 provider 而使用默认实现。

      • 默认情况下启用网络传输层安全协议 (TLS)
        如果您的应用 Target 28+,则默认情况下 isCleartextTrafficPermitted() 函数返回 false。 如果您的应用需要为特定域名启用明文,您必须在应用的网络安全性配置中针对这些域名将 cleartextTrafficPermitted 显式设置为 true。
        错误日志:

        W/Glide: Load failed for http://xxx-99billxx.ufile.ucloud.cn/online/image/A1707101417703-349-   0xxhdpi 
        java.io.IOException: Cleartext HTTP traffic to xxx-99billxx.ufile.ucloud.cn not permitted
        

        重点注意:api是 api 23 才引入的。
        所以,由于一些历史原因无法及时把服务器变更为 https 的应用,应该通过配置文件针对特定域名允许使用明文传输,也就是 http 服务。

              
         新建配置文件 res/xml/network_security_config.xml:
        <?xml version="1.0" encoding="utf-8"?>
        <network-security-config>
        			 <base-config cleartextTrafficPermitted="true" />
        </network-security-config>
        	
        	
        <?xml version="1.0" encoding="utf-8"?>
           <manifest >
        		<application android:networkSecurityConfig="@xml/network_security_config" >       
        	</application>
        </manifest>
        
        
    3. 隐私相关

      • 存储

        Android 9.0以及以前的版本存储部分主要包含私有存储和外部存储,android Q的版本在9.0的基础上更细化了外部存储,也就是一般意义上的SD卡细分(其他外部存储也可以),android Q提出了隔离存储沙盒的概念,将公共存储分成两部分,一部分是隔离存储沙盒部分,另一部分外部存储,其中隔离存储沙盒部分其他程序是无法查看的数据,实现了公共区域的数据保护,当应用程序的被卸载时,沙河目录的部分会被删除,访问自己创建的沙盒目录部分不需要额外的权限,如果需要创建或者修改其他应用已有的文件,需要申请权限 。
        android Q细化了媒体文件的分类,细分为照片和视频、音乐和下载内容,这部分的集合是共享的,当app卸载的时候,照片和视频、音乐和下载内容不会被删除。

        • 照片权限READ_MEDIA_IMAGES
        • 视频权限READ_MEDIA_VIDEO
        • 音乐权限READ_MEDIA_AUDIO
    4. 其他限制

      • 挖孔屏适配

        • 对于有状态栏的页面,不会受到挖孔屏特性的影响;
        • 全屏显示的页面,系统挖孔屏方案会对应用界面做下移避开挖孔区显示;
        • 已经适配的P的应用的全屏页面可以通过谷歌提供的适配方案使用挖孔区,真正做到全屏显示

        注意对于沉浸式的显示要注意,避免挖空挡住UI布局,需要做好适配。

        • 新增挖孔屏挖孔尺寸和位置接口
        class WindowInsets {
               DisplayCutout getDisplayCutout();
               }
               class DisplayCutout {
               int getSafeInsetLeft();
               int getSafeInsetTop();
               int getSafeInsetRight();
               int getSafeInsetBottom();
               Region getBounds();
        }
        
        • 新窗口布局模式,允许应用程序请求是否在挖孔区域布局:
        class WindowManager.LayoutParams {
               int layoutInDisplayCutoutMode;
               //默认情况下,全屏窗口不会使用到挖孔区域,非全屏窗口可正常使用挖孔区域。
               final int LAYOUT_IN_DISPLAY_CUTOUT_MODE_DEFAULT;
               //窗口声明使用挖孔区域
               final int LAYOUT_IN_DISPLAY_CUTOUT_MODE_ALWAYS;
               //窗口声明不使用挖孔区域
               final int LAYOUT_IN_DISPLAY_CUTOUT_MODE_NEVER;
        }
        
        
      • 限制非Activity场景启动Activity(强制性 FLAG_ACTIVITY_NEW_TASK 要求)
        在 Android P 中,除非使用了 FLAG_ACTIVITY_NEW_TASK intent flag,您不能在非 Activity 场景下启动 Activity。若您未使用这个 intent flag 就尝试启动 Activity,系统无法正常开启活 Activity,并会在日志中留下相应信息。

    5. 电源管理优化

    Android Q

    1. 行为变更:所有应用 (不管targetSdk是多少,对所有跑在Q设备上的应用均有影响)
      官方网站 官方网站

      • 用户隐私权限变更
      权限受影响应用如何启用(影响范围)
      权限访问和共享外部存储设备中的文件的应用adb shell sm set-isolated-storage on(下文详述)
      权限在后台时请求访问用户位置信息的应用 这种权限策略在Android Q 上始终处于启用状态
      台启动 Activity不需要用户互动就启动 Activity 的应用关闭允许系统执行后台活动开发者选项即可启用限制
      标识符(deviceId)访问设备序列号或 IMEI 的应用在搭载 Android Q 的设备上安装应用
      扫描权限使用 WLAN API 和 Bluetooth API 的应用以 Android Q 为目标平台
      • 存储权限

        Android Q 在外部存储设备中为每个应用提供了一个“隔离存储沙盒”(例如 /sdcard)。任何其他应用都无法直接访问您应用的沙盒文件。由于文件是您应用的私有文件,因此您不再需要任何权限即可在外部存储设备中访问和保存自己的文件。此变更可让您更轻松地保证用户文件的隐私性,并有助于减少应用所需的权限数量。

        沙盒:就是应用专属文件夹,并且访问这个文件夹无需权限。谷歌官方推荐应用在沙盒内存储文件的地址为Context.getExternalFilesDir()下的文件夹。比如要存储一张图片,则应放在Context.getExternalFilesDir(Environment.DIRECTORY_PICTURES)中。

        • 访问自己文件:Q中用更精细的媒体特定权限替换并取消了 READ_EXTERNAL_STORAGE 和 WRITE_EXTERNAL_STORAGE权限,并且无需特定权限,应用即可访问自己沙盒中的文件。
        • 访问系统媒体文件:Q中引入了一个新定义媒体文件的共享集合,如果要访问沙盒外的媒体共享文件,比如照片,音乐,视频等,需要申请新的媒体权限:READ_MEDIA_IMAGES,READ_MEDIA_VIDEO,READ_MEDIA_AUDIO,申请方法同原来的存储权限。
        • 访问系统下载文件:对于系统下载文件夹的访问,暂时没做限制,但是,要访问其中其他应用的文件,必须允许用户使用系统的文件选择器应用来选择文件。
        • 所以请判断当应用运行在Q平台上时,取消对READ_EXTERNAL_STORAGE 和 WRITE_EXTERNAL_STORAGE两个权限的申请。并替换为新的媒体特定权限。
      • 后台地理位置访问

        用户可控制应用对设备位置信息的访问权限,当应用请求位置信息访问时,用户会看到提示框,android 9.0提示允许和拒绝,Android Q添加了在使用期间可以访问,也就是说如果你的应用在后台运行,用户选择使用期间可以访问的话,是无法获取到位置的,当然android Q 也提供了解决方法,引入了新的权限ACCESS_BACKGROUND_LOCATION,与现有ACCESS_FINE_LOCATIONACCESS_COARSE_LOCATION权限不同,新权限仅会影响应用在后台运行时对位置信息的访问权,如果你的应用从android 9.0或者更低版本的系统升级到android Q的话,android Q会自动添加新权限。

      • 设备唯一标识符

        原来的READ_PHONE_STATE权限已经不能获得IMEI和序列号。此方法已失效

        ((TelephonyManager) getActivity()
         .getSystemService(Context.TELEPHONY_SERVICE)).getDeviceId()
        

        谷歌官方给予了设备唯一ID最佳做法,但是此方法给出的ID可变,可以按照具体需求具体解决。
        本文给出一个不变和基本不重复的UUID方法。

            public static String getUUID() {
           
                   String serial = null;
                   String m_szDevIDShort = "35" +
                   Build.BOARD.length() % 10 + Build.BRAND.length() % 10 +
           
                   Build.CPU_ABI.length() % 10 + Build.DEVICE.length() % 10 +
           
                   Build.DISPLAY.length() % 10 + Build.HOST.length() % 10 +
           
                   Build.ID.length() % 10 + Build.MANUFACTURER.length() % 10 +
           
                   Build.MODEL.length() % 10 + Build.PRODUCT.length() % 10 +
           
                   Build.TAGS.length() % 10 + Build.TYPE.length() % 10 +
           
                   Build.USER.length() % 10; //13 位
           
           		try {
           		    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
           		        serial = android.os.Build.getSerial();
           		    } else {
           		        serial = Build.SERIAL;
           		    }
           		    //API>=9 使用serial号
           		    return new UUID(m_szDevIDShort.hashCode(), serial.hashCode()).toString();
           		} catch (Exception exception) {
           		    //serial需要一个初始化
           		    serial = "serial"; // 随便一个初始化
           		}
               //使用硬件信息拼凑出来的15位号码
                return new UUID(m_szDevIDShort.hashCode(), serial.hashCode()).toString();
         }
        
        

        唯一标识符权限的更改会导致android.os.Build.getSerial()返回unknown,但是由于m_szDevIDShort是由硬件信息拼出来的,所以仍然保证了UUID的唯一性和持久性。

      • minSDK警告

        在 Android Q 中,当用户首次运行以 Android 6.0(API 级别 23)以下的版本为目标平台的任何应用时,Android平台会向用户发出警告。

    2. 行为变更:以 Android Q 为目标平台的应用(targetSDK == Q 才有影响)

      • 非 SDK 接口限制

        Android Q 包含更新后的受限非 SDK 接口列表(基于与 Android 开发者之间的协作以及最新的内部测试)。
        非SDK接口限制就是某些SDK中的私用方法,如private方法,你通过Java反射等方法获取并调用了。那么这些调用将在target>=P或target>=Q的设备上被限制使用,当你使用了这些方法后,会报错:

        获取方法报错信息
        vik instruction referencing a fieldNoSuchFieldError thrown
        vik instruction referencing a methodNoSuchMethodError thrown
        lection via Class.getDeclaredField() or Class.getField()NoSuchFieldException thrown
        lection via Class.getDeclaredMethod(), Class.getMethod()NoSuchMethodException thrown
        lection via Class.getDeclaredFields(), Class.getFields()Non-SDK members not in results
        lection via Class.getDeclaredMethods(), Class.getMethods()Non-SDK members not in results
        via env->GetFieldID()NULL returned, NoSuchFieldError thrown
        via env->GetMethodID()NULL returned, NoSuchMethodError thrown

        如果您不确定自己的应用是否使用了非 SDK 接口,则可以测试该应用进行确认
        当你调用了非SDK接口时,会有类似Accessing hidden XXX的日志:

        Accessing hidden field Landroid/os/Message;->flags:I (light greylist, JNI)
        

        谷歌官方也提供了官方检查器veridex用来检测一个apk中哪里使用了非SDK接口。
        veridex下载

        项目中使用非SDK接口大概率有以下两种情况:
        - 在自定义View的过程中为了方便,使用反射修改某个参数。
        - 三方SDK中使用了非SDK接口(这种情况比较多)。
        解决方法:
        - 第一种 修改对应代码
        - 第二种 更新到最新的三方SDK版本,或者提工单、换库

    现在项目中需要处理的地方

    1. 阿里云OSS上传图片

      • 阿里云上传图片的接口没有回调
        java.net.UnknownServiceException: CLEARTEXT communication to XXX not permitted by network security policy

      问题原因:

      • 从 Android 9.0 开始,默认情况下移除HTTP客户端。项目使用的阿里云OSS的sdk2.7.3使用到HTTP客户端,所以会找不到该库抛出异常。
      • 阿里云OSS的sdk 2.7.3中的网络请求是http。而Android 9.0限制了明文流量的网络请求,非加密的流量请求都会被系统禁止掉。

      解决方案以下两种:

      • 开启 Android 9.0 兼容 http 的请求
        在 AndroidManifest文件中加入:
      <application  
              android:usesCleartextTraffic="true">
              <uses-library 
                android:name="org.apache.http.legacy" 
                android:required="false"/>
      </application>
      
      • 将本地的 oss 的 sdk 2.7.3版本升级到 2.9.0 以上
      api 'com.aliyun.dpa:oss-android-sdk:+'
      
    2. 非SDK接口调用

      限制非 SDK 接口的调用
      当你调用了非SDK接口时,会有类似Accessing hidden XXX的日志:

      Accessing hidden field Landroid/os/Message;->flags:I (light greylist, JNI)
      
      

      名单分类:

      • Light grey list: targetSDK>=P时,警告;
      • Dark grey list: targetSDK
        =p时,不允许调用;
      • Black list:三方应用不允许调用;
    3. 设备标识符

      移除对 Build.serial 的直接访问(设备唯一标识符)
      问题原因:

       ((TelephonyManager) getActivity().getSystemService(Context.TELEPHONY_SERVICE)).getDeviceId()
       
      

      获得设备ID,会返回空值(targetSDK<=P)或者报错(targetSDK==Q)。且官方所说的READ_PRIVILEGED_PHONE_STATE权限只提供给系统app,所以这个方法算是废了。

      解决方案:
      由于唯一标识符权限的更改会导致android.os.Build.getSerial()返回unknown,但是由于m_szDevIDShort是由硬件信息拼出来的,所以仍然保证了UUID的唯一性和持久性。参考代码如下:

      
      public static String getUUID() {
      
       	String serial = null;
       	
       	String m_szDevIDShort = "35" +
       	
       	Build.BOARD.length() % 10 + Build.BRAND.length() % 10 +
       	
       	Build.CPU_ABI.length() % 10 + Build.DEVICE.length() % 10 +
       	
       	Build.DISPLAY.length() % 10 + Build.HOST.length() % 10 +
       	
       	Build.ID.length() % 10 + Build.MANUFACTURER.length() % 10 +
       	
       	Build.MODEL.length() % 10 + Build.PRODUCT.length() % 10 +
       	
       	Build.TAGS.length() % 10 + Build.TYPE.length() % 10 +
       	
       	Build.USER.length() % 10; //13 位
       	
       	try {
       	
       	if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
       	
       	serial = android.os.Build.getSerial();
       	
       	} else {
       	
       	serial = Build.SERIAL;
       	
       	}
       	
       	//API>=9 使用serial号
       	
       	return new UUID(m_szDevIDShort.hashCode(), serial.hashCode()).toString();
       	
       	} catch (Exception exception) {
       	
       	//serial初始化
       	
       	serial = "serial"; 
       	
       	}
       	//使用硬件信息拼凑出来的15位号码
       
          return new UUID(m_szDevIDShort.hashCode(), serial.hashCode()).toString();
      
      }
      
      
    4. 前台服务权限

      • 在9.0 手机会抛出 SecurityException 异常
          Caused by: java.lang.SecurityException: Permission Denial: 
       startForeground from pid=6175, uid=10189 requires android.permission.FOREGROUND_SERVICE
      
      

      问题原因:
      在 Android 9.0 中,应用在使用前台服务之前必须先申请 FOREGROUND_SERVICE 权限,否则就会抛出 SecurityException 异常。

      解决方案:
      在 AndroidManifest文件中加入:

      android:name="android.permission.FOREGROUND_SERVICE"
      
    5. 共享WebView

      • 不允许共享WebView数据目录,应用程序不能再跨进程共享单个WebView数据目录。如果您的应用有多个使用WebView,CookieManager或android.webkit包中的其他API的进程,则当第二个进程调用WebView方法时,您的应用将崩溃.
    6. 访问数据目录

      • SELinux 禁止访问应用的数据目录,系统强制每个应用的 SELinux 沙盒对每个应用的私有数据目录强制执行逐个应用的 SELinux 限制。现在,不允许直接通过路径访问其他应用的数据目录。应用可以继续使用进程间通信 (IPC) 机制(包括通过传递 FD)共享数据.
    7. 访问通话记录

      • 限制访问通话记录

      • Android 9.0 引入 CALL_LOG 权限组并将 READ_CALL_LOG、WRITE_CALL_LOG 和 PROCESS_OUTGOING_CALLS 权限移入该组。 在之前的 Android 版本中,这些权限位于 PHONE 权限组。

      • 如果应用需要访问通话记录或者需要处理去电,则您必须向 CALL_LOG 权限组明确请求这些权限。 否则会发生SecurityException

    8. 访问电话号码

      限制访问电话号码

      • 在未首先获得 READ_CALL_LOG 权限的情况下,除了应用的用例需要的其他权限之外,运行于 Android 9.0 上的应用无法读取电话号码或手机状态。

      • 与来电和去电关联的电话号码可在手机状态广播(比如来电和去电的手机状态广播)中看到,并可通过 PhoneStateListener 类访问。 但是,如果没有 READ_CALL_LOG 权限,则 PHONE_STATE_CHANGED 广播和 PhoneStateListener“提供的电话号码字段为空”。

    9. 全面屏检测特殊适配

      Android P 和之后的版本完全可以使用官方 API 来判断全面屏

      if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {       
         	 WindowInsets windowInsets = decorView.getRootWindowInsets();       
         	  if (windowInsets != null) {            
         	  DisplayCutout displayCutout = windowInsets.getDisplayCutout();            
         	  if (displayCutout != null) {                
         	  List<Rect> rects = displayCutout.getBoundingRects();                
         	  //通过判断是否存在rects来确定是否刘海屏手机                
         	  if (rects != null && rects.size() > 0) {                    
         	       isNotchScreen = true;
         	                      
         	        }            
         	     }        
         	 } 
       }
      
    10. 限制静态广播的接收

      隐式广播将会被全面禁止,在AndroidManifest中注册的Receiver将不能够生效

    参考

    更多相关内容
  • AndroidQ源码

    2019-08-14 14:23:33
    Android Q 编译过源码(Java文件),帮助开发者了解新版本源码变化
  • Google发行Android Q版本也有很长一段时间了,华为应用市场已经要求要适配Android Q版本了,所以,我们也要去对Android Q进行适配。 先讲一下咱们这节用到的新特性 Android Q文件存储机制修改成了沙盒模式,类似于...
  • 主要介绍了AndroidQ(10)分区存储完美适配方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
  • Android Q 源码下载

    2019-11-27 17:30:21
    拉取的分支为android-Q-preview-6,源码总计110GB以上,全部上传到baiduYun,请自己下载。
  • 主要介绍了详解关于AndroidQ获取不到imsi解决方案,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
  • 主要介绍了Android Q适配之IMEI替换为Android_id,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
  • Android_boot_image_editor,用于解析和打包android boot.img/vbmeta.img的工具,支持android q预览.zip
  • 按照谷歌的命名习惯,下一代安卓系统会是Android Q(按照字母表排序),版本号或将为Android 10。
  • AndroidQ(十)Android Q功能和API

    千次阅读 2019-04-28 17:14:37
    Android Q 功能和 API Android Q 为用户和开发者引入了强大的新功能。本文重点介绍面向开发者的新功能。 要了解新版 API,请阅读API 差异报告或访问Android API 参考。为醒目起见,将突出显示新版 API。此外,请...

    Android Q 功能和 API

    Android Q 为用户和开发者引入了强大的新功能。本文重点介绍面向开发者的新功能。

    要了解新版 API,请阅读 API 差异报告或访问 Android API 参考。为醒目起见,将突出显示新版 API。此外,请务必查阅 Android Q 行为变更(针对以 Android Q 为目标平台的应用所有应用)以及隐私权变更,以了解平台变更可能给您的应用带来哪些方面的影响。

    安全增强功能

    Android Q 引入了若干安全功能,详见以下各节摘要说明:

    改进了生物识别身份验证对话框

    Android Q 对 Android 9 中增加的统一生物识别身份验证对话框进行了以下改进:

    指定用户确认要求

    您现在可以提供一个提示,以告知系统在用户使用隐式生物识别模式完成身份验证后无需要求用户进行确认。例如,您可以告知系统,在用户使用面孔身份验证完成身份验证后无需进行进一步确认。

    默认情况下,系统会要求用户进行确认。通常,用户希望确认敏感或高风险的操作(例如,购买商品)。但是,如果您的应用存在某些低风险操作,那么您就可以将 false 传递至 setRequireConfirmation() 方法,提供不要求用户确认的提示。由于此标记作为提示传递到系统,因此如果用户更改了针对生物识别身份验证的系统设置,则系统可能会忽略相应的值。

    改进了对设备凭据的回退支持

    您现在可以告知系统,如果用户因某种原因而无法使用其生物识别输入设备,则可以使用设备 PIN 码、图案或密码来进行身份验证。要启用此回退支持,请使用 setAllowDeviceCredential() 方法。

    如果您的应用目前使用 createConfirmDeviceCredentialIntent() 来回退到设备凭据,请改为使用新方法。

    检查设备的生物识别功能

    现在,您可以在调用 BiometricPrompt 之前,先使用 BiometricManager 类中的 canAuthenticate() 方法检查设备是否支持生物识别身份验证。

    直接从 APK 运行嵌入式 DEX 代码

    您现在可以告知平台直接从应用的 APK 文件中运行嵌入式 DEX 代码。如果攻击者曾设法篡改了设备上本地编译的代码,则此选项有助于防止相应攻击。

    注意:启用此功能可能会影响应用的性能,因为在应用启动时 ART 必须使用 JIT 编译器(而不是读取提前编译的原生代码)。我们建议您先测试应用性能,然后再决定是否在已发布的应用中启用此功能。

    要启用此功能,请在应用清单文件的 <application> 元素中将 android:useEmbeddedDex 属性的值设为 true。您还必须编译一个 APK,其中要包含 ART 可以直接访问的未压缩 DEX 代码。将以下选项添加到 Gradle 或 Bazel 配置文件,以编译包含未压缩 DEX 代码的 APK:

    Gradle

    aaptOptions {

           noCompress 'dex'

        }

       

     

    Bazel

        android_binary(

           ...,

           nocompress_extensions = [“.dex”],

        )

        

     

     

    TLS 1.3 支持

    现在,平台的 TLS 实现支持 TLS 1.3。TLS 1.3 是 TLS 标准的主要修订版本,它提升了性能和安全性。我们的基准测试数据表明,与 TLS 1.2 相比,使用 TLS 1.3 可以将建立安全连接的速度提高 40%。

    默认情况下,系统会为所有 TLS 连接启用 TLS 1.3。您可以通过调用 SSLContext.getInstance("TLSv1.2") 来获取停用 TLS 1.3 的 SSLContext。您还可以对相关对象调用 setEnabledProtocols() 来为每个连接来启用或停用协议版本。

    以下是有关 TLS 1.3 实现的一些重要的详细信息:

    • TLS 1.3 加密套件不可自定义。在启用 TLS 1.3 后,受支持的 TLS 1.3 加密套件会始终保持启用状态,并且系统会忽略所有试图通过调用 setEnabledCipherSuites() 将其停用的行为。
    • 在协商 TLS 1.3 时,系统会在将会话添加到会话缓存之前调用 HandshakeCompletedListeners(这与 TLS 1.2 和之前的其他版本不同)。
    • 在之前本应抛出 SSLHandshakeException 的某些情况下,SSLEngine 实例会抛出 SSLProtocolException
    • 不支持 0-RTT 模式。

    公共 Conscrypt API

    现在,Conscrypt 安全提供程序包含适用于 TLS 功能的公共 API。过去,用户可以通过反射来访问此功能。但是,由于在 Android P 中增加了关于调用非公共 API 的限制,因此这已在 Android Q 中加入了灰名单,并将在未来版本中进一步受限。

    此更新在 android.net.ssl 下增加了一组类,这些类包含用于访问通用 javax.net.ssl API 不提供的功能的静态方法。这些类的名称为相关 javax.net.ssl 类的复数,用户可以由此推断是否为这些类。例如,在 javax.net.ssl.SSLSocket 实例中运行的代码可以使用新的 android.net.ssl.SSLSockets 类中的方法。

    ELF TLS

    使用 API 级别 29 及更高版本的 NDK 编译的应用无需再使用 emutls,但可以改为使用 ELF TLS。我们增加了对动态和静态链接器的支持,以支持处理线程局部变量的新方法。

    对于针对 API 级别 28 及更低版本编译的应用,我们实现了针对 libgcc/compiler-rt 的改进,以便解决一些 emutls 问题。

    有关详情,请参阅面向 NDK 开发者的 Android 变更

    连接功能

    Android Q 包含一些与网络和连接相关的改进。

    WLAN 网络连接 API

    Android Q 增加了对点对连接的支持。借助此功能,应用可以提示用户更改设备连接到的接入点。点对点连接用于“非网络提供”目的,例如 Chromecast 和 Google Home 硬件等辅助设备的引导配置。

    点对点连接不需要位置权限。如果您发起连接到对等设备的请求,便会在对方设备上启动一个对话框,让相应设备的用户可以通过此对话框来接受连接请求。

    WLAN 网络建议 API

    Android Q 扩大了支持范围,现在允许应用提示用户连接到 WLAN 接入点。您可以提供关于要连接到哪个网络的建议。平台最终会根据来自您的应用和其他应用的输入来选择要接受的接入点。

    来自应用的建议必须先得到用户批准,然后平台才会发起到建议的网络的连接。当平台第一次在扫描结果中找到与应用提供的其中一个建议相匹配的网络时,将由用户响应通知进行批准。当平台连接到建议的其中某个网络时,设置会显示相关文本以将网络连接归因于提出建议的相应应用。

    改进了 WLAN 高性能和低延迟模式

    借助 Android Q,您可以为底层调制解调器提供提示,以最大限度地缩短延迟。

    Android Q 扩展了 WLAN Lock API,以有效地支持高性能和低延迟模式。系统会针对高性能和低延迟模式停用 WLAN 节能模式,并且您可以在低延迟模式下启用进一步的延迟优化(具体取决于调制解调器支持)。

    仅当获取锁的应用在前台运行且屏幕处于开启状态时才能启用低延迟模式。低延迟模式对实时移动游戏应用尤其有用。

    DNS 解析器中的专用查找

    先前版本的 Android 信息和运营商服务使用 org.xbill.DNS2 软件包来执行 NAPTR 和 SRV 查询。Android Q 增加了对“通过传输层安全协议 (TLS) 执行 DNS”的原生支持,以进行专用 DNS 查找。这项新增功能可以为开发者提供标准明文查找和“通过传输层安全协议 (TLS) 执行 DNS”模式。

    WLAN Easy Connect

    借助 Android Q,您可以利用 Easy Connect 为使用 URI 的对等设备配置 WLAN 凭据。您可以通过各种方法来检索此 URI,包括从 QR 码或者通过蓝牙 LE 或 NFC。

    当 URI 可用时,您可以立即使用 ACTION_PROCESS_WIFI_EASY_CONNECT_QR_CODE Intent 来配置对等设备的 WLAN 凭据。这样一来,用户就可以选择 WLAN 网络以共享并安全地传输相关凭据。

    注意:在使用此 Intent 之前,应用必须先通过调用 WifiManager.isEasyConnectSupported() 来验证设备是否支持 Easy Connect。

    WLAN 直连连接 API

    WifiP2pConfig 和 WifiP2pManager API 类在 Android Q 中有更新,以支持利用预先确定的信息快速与 WLAN 直连建立连接的功能。此信息通过边信道进行共享,例如蓝牙或 NFC。

    以下代码示例显示了如何使用预先确定的信息来创建群组:

        val manager = getSystemService(Context.WIFI_P2P_SERVICE) as WifiP2pManager

        val channel = manager.initialize(this, mainLooper, null)

     

        // prefer 5G band for this group

        val config = WifiP2pConfig.Builder()

            .setNetworkName("networkName")

            .setPassphrase("passphrase")

            .enablePersistentMode(false)

            .setGroupOperatingBand(WifiP2pConfig.GROUP_OWNER_BAND_5GHZ)

            .build()

     

        // create a non-persistent group on 5GHz

        manager.createGroup(channel, config, null)

       

     

    要使用凭据加入群组,请将 manager.createGroup() 替换为以下内容:

        manager.connect(channel, config, null)

       

     

    蓝牙 LE 连接导向型频道 (CoC)

    借助 Android Q,您的应用可以使用 BLE CoC 连接在两个 BLE 设备之间传输较大的数据流。此接口抽象化处理了蓝牙和连接机制,以简化实现。

    电话功能

    Android Q 包含一些与电话相关的改进。

    通话质量方面的改进

    Android Q 增加了在支持相关功能的设备上收集进行中的 IP 多媒体子系统 (IMS) 通话质量相关信息的功能,包括通过网络接听和拨打电话的质量。

    选接电话和来电显示

    Android Q 让您的应用可以将用户通讯录中不存在号码的来电标识为潜在骚扰电话,以及代表用户拒接骚扰电话而不响铃。系统会在通话记录中将这些已屏蔽的来电的相关信息记录为已屏蔽的来电,以便用户更清楚地了解何时有过未接来电。使用此新版 API,不需要从用户获取 READ_CALL_LOG 权限就可以提供选接电话和来电显示功能。

    您还可以配置应用,让其提供来电者的相关信息(例如公司名称、Facebook 联系信息等),这些信息会显示在平台的拨号器应用中。

    Call Redirection Service API

    Android Q 更改了来电 Intent 的处理方式。我们弃用了 NEW_OUTGOING_CALL 广播,并将其替换为 CallRedirectionService API。CallRedirectionService 提供了相关接口,以供您修改 Android 平台拨打的去电。例如,第三方应用可能会取消通话并通过 VoIP 对其进行重新路由。

    媒体和图形

    Android Q 引入了以下媒体和图形方面的新功能和 API:

    Native MIDI API

    借助 Android Native MIDI API (AMidi),应用开发者可以使用 C/C++ 代码发送和接收 MIDI 数据、与 C/C++ 音频/控制逻辑进行更紧密的集成以及最大限度地减少对 JNI 的需求。

    有关详情,请参阅 Android Native MIDI API

    MediaCodecInfo 方面的改进

    MediaCodecInfo 中有一些新方法可以显示有关编解码器的更多信息:

    isSoftwareOnly()

    如果编解码器仅在软件中运行,则返回 true。软件编解码器并不能保证渲染性能。

    isHardwareAccelerated()

    如果编解码器由硬件加速,则返回 true。

    isVendor()

    如果编解码器由设备供应商提供,则返回 true;如果由 Android 平台提供,则返回 false。

    isAlias()

    MediaCodecList 可能针对使用备用编解码器名称(别名)的同一底层编解码器包含额外的条目。如果此条目中的编解码器是另一个编解码器的别名,则此方法会返回 true。

    此外,MediaCodec.getCanonicalName() 会针对通过别名创建的编解码器返回底层编解码器名称。

    性能点

    “性能点”表示编解码器以特定高度、宽度和帧速率渲染视频的能力。例如,UHD_60 性能点表示以每秒 60 帧的速度渲染超高清视频(3840x2160 像素)。

    方法 MediaCodecInfo.VideoCapabilities.getSupportedPerformancePoints() 会返回编解码器可以渲染或捕获的 PerformancePoint 条目列表。

    您可以通过调用 PerformancePoint.covers(PerformancePoint) 来检查给定的 PerformancePoint 是否会覆盖另一个性能点。例如,UHD_60.covers(UHD_50) 会返回 true。

    我们为所有硬件加速的编解码器都提供了性能点列表。如果编解码器连标准性能点的最低值都不能满足,则此列表可能为空。

    请注意,已升级到 Android Q 但未更新供应商映像的设备是没有性能点数据的,因为此数据来自供应商 HAL。在这种情况下,getSupportedPerformancePoints() 会返回 null。

    单色摄像头支持

    Android 9(API 等级 28)首次引入了单色摄像头功能。Android Q 为单色摄像头支持增加了几项增强功能:

    • 新增了对 Y8 流格式的支持,以提高内存效率。
    • 支持单色原始 DNG 捕获。
    • 引入了 MONO 和 NIR CFA 枚举,以区分常规单色摄像头和近红外摄像头。

    您可以使用此功能来捕捉原生单色图片。逻辑多摄像头设备可以使用单色摄像头作为物理子摄像头,以获取更出色的低光图片质量。

    动态深度格式

    从 Android Q 开始,摄像头可以使用名为“动态深度格式”(DDF) 的新架构将图片的深度数据存储在单独的文件中。应用可以请求 JPG 图片及其深度元数据,以便在后期处理中利用这些信息来应用所需的模糊处理,而无需修改原始图片数据。

    ANGLE

    在 Android Q 发布后,Android 开发者和合作伙伴可以选择使用 ANGLE 运行,这是 Chrome 组织中的一个项目,能够将 ES 置于 Vulkan 上层,而不必使用供应商提供的 ES 驱动程序。

    有关详情,请参阅 ANGLE

    无障碍服务 API

    Android Q 引入了以下新的无障碍服务功能和 API:

    AccessibilityNodeInfo 输入键标记

    在 Android Q 中,AccessibilityNodeInfo 得到了增强,现在增加了一个新标记,用于指示其是否代表文本输入键的。您可以使用 AccessibilityNodeInfo.isTextEntryKey() 方法来访问此标记。

    无障碍对话框语音反馈

    当无障碍服务要求用户重复按无障碍快捷方式以启动服务时,此对话框现在可以在服务请求时附带文字转语音提示。

    物理键盘的无障碍快捷方式

    在 Android Q 中,用户现在可以通过物理键盘来触发无障碍快捷方式,只需按 Control+Alt+Z 即可。

    软键盘控制器增强功能

    在 Android Q 中,无障碍服务现在可以请求显示软键盘,即使设备检测到连接了硬键盘也不例外。用户可以替换此行为。

    用户定义的无障碍服务超时

    Android Q 引入了 API 方法 AccessibilityManager.getRecommendedTimeoutMillis(),用于为用户针对互动式和非互动式的无障碍界面元素定义的超时提供支持。返回值受用户偏好设置和无障碍服务 API 的影响。

    自动填充方面的改进

    Android Q 包含对自动填充服务的以下改进。

    与兼容性相关的自动填充请求

    您现在可以使用 FillRequest.FLAG_COMPATIBILITY_MODE_REQUEST 标记来确定是否通过兼容性模式生成了自动填充请求。

    同时保存用户名和密码

    您现在可以支持应用使用多个活动来显示用户名、密码和其他字段的情况,只需使用 SaveInfo.FLAG_DELAY_SAVE 标记即可。

    用户与保存界面的互动

    您现在可以在保存对话框中显示和隐藏密码字段,只需在此对话框中设置操作监听器,并更改相应密码远程视图的可见性即可。

    支持更新数据集

    现在,自动填充功能可以更新现有密码。例如,如果用户已经存储了一个密码,然后又保存了一个新密码,则自动填充功能现在会提示用户更新现有密码,而不是保存新密码。

    字段分类方面的改进

    Android Q 包含对 Field Classification API 的以下改进。

    UserData.Builder 构造函数

    UserData.Builder 构造函数已更改,以更好地符合 Builder 模式的要求。

    允许将一个值映射到多种类别 ID

    在使用 Android Q 中的 UserData.Builder 时,您现在可以将一个值映射到多种类别 ID。在以前的版本中,如果一个值被添加多次,系统就会抛出异常。

    改进了对信用卡号码的支持

    现在,字段分类可以检测四位数字作为信用卡号码的最后四位数字。

    支持特定于应用的字段分类

    Android Q 增加了 FillResponse.setUserData(),让您能够在会话期间设置特定于应用的用户数据。这有助于自动填充服务检测包含特定于应用的内容的字段的类型。

    界面和系统控件

    Android Q 提供以下界面方面的改进:

    支持 JVMTI PopFrame 功能

    Android Q 增加了对 Android JVMTI 实现中的 can_pop_frames 功能的支持。在调试时,此功能让您能够在断点暂停并调整函数的局部变量、全局变量或实现,然后重新运行函数。有关详情,请参阅 Oracle 的 Pop Frame 参考页面

    Surface Control API

    Android Q 提供了一个 SurfaceControl API,用于对系统合成器 (SurfaceFlinger) 进行底层访问。对于大多数用户而言,SurfaceView 是使用此合成器的正确方法。SurfaceControl API 在某些情况下很有用,例如:

    • 同步多个表面
    • 跨进程的表面嵌入
    • 底层生命周期管理

    SurfaceControl API 在 SDK 和 NDK 绑定中都可用。NDK 实现包含用于与合成器手动交换缓冲区的 API。这为遇到 BufferQueue 限制的用户提供了一种替代方案。

    WebView 挂起渲染程序检测

    Android Q 引入了一个新的 WebViewRendererClient 抽象类,应用可以使用它来检测 WebView 是否无响应。要使用此类,请执行以下操作:

    1. 定义自己的子类,并实现其 onRendererResponsive() 和 onRendererUnresponsive() 方法。
    2. 将 WebViewRendererClient 的实例附加到一个或多个 WebView 对象。
    3. 如果 WebView 无响应,则系统会调用客户端的 onRendererUnresponsive() 方法以传递 WebView 和 WebViewRenderer(如果 WebView 是单进程,则 WebViewRenderer 参数为 null)。您的应用可以执行适当的操作,例如向用户显示一个对话框,以询问其是否要暂停渲染流程。

    如果 WebView 保持无响应状态,则系统会定期调用 onRendererUnresponsive()(不超过每五秒钟一次),但不会执行任何其他操作。如果 WebView 再次无响应,系统只会调用 onRendererResponsive() 一次。

    设置面板

    Android Q 引入了“设置面板”,这是一种 API,让应用能够在自身环境中向用户显示设置。这可以避免用户转到设置更改 NFC 或移动数据等设置,以便使用此应用。

    1. 用户尝试在设备未连接到网络时打开网页。Chrome 弹出互联网连接设置面板…

    2. 用户可以开启 WLAN 并选择网络,而无需离开 Chrome 应用。

    例如,假设用户打开了网络浏览器,而其设备已开启飞行模式。在 Android Q 之前的版本中,此应用只能显示一条通用消息,要求用户打开设置以恢复连接。而借助 Android Q,浏览器应用便可以显示一个内嵌面板,其中会显示各种主要连接设置,例如飞行模式、WLAN(包括附近的网络)和移动数据。借助此面板,用户无需离开应用即可恢复连接。

    要显示设置面板,请使用以下其中一项新推出的 Settings.Panel 操作触发一个 Intent:

        val panelIntent = Intent(Settings.Panel.settings_panel_type)

        startActivityForResult(panelIntent)

       settings_panel_type 可以是下列项之一:

    • ACTION_INTERNET_CONNECTIVITY:显示与互联网连接相关的设置,例如飞行模式、WLAN 和移动数据。
    • ACTION_NFC:显示与近距离无线通信 (NFC) 相关的所有设置。
    • ACTION_VOLUME:显示所有音频流的音量设置,以及勿扰设置。

    我们计划针对此功能引入一个 AndroidX 封装容器。在搭载 Android 9(API 级别 28)或更低级别的设备上调用时,此封装容器会在设置应用中打开最合适的页面。

    共享功能方面的改进

    Android Q 为共享功能提供了多项改进。要了解所有详情,请参阅 Android Q 中共享功能方面的改进

    角色

    Android Q 引入了一种标准工具,即“角色”。借助此工具,操作系统可以根据易于理解的用例授予应用越权访问系统功能和用户数据的权限。在语义上,每个角色都代表着一个常见的用例,例如播放音乐、管理照片或发送短信。

    从测试版 1 开始,平台就为 Android Q 提供了一组预定义的角色。应用可以使用新的 RoleManager 类来查询可用角色并发出担任特定角色的请求。

    要详细了解角色如何影响 Android Q 中应用的行为,请参阅角色预览指南。

    Kotlin

    Android Q 对 Kotlin 开发进行了以下更新。

    libcore API 的可空性注释

    Android Q 改进了 SDK 中针对 libcore API 的可空性注释的覆盖范围。借助这些注释,在 Android Studio 中使用 Kotlin 或 Java 可空性分析的应用开发者可以在与这些 API 互动时获取非 Null 信息。

    通常,Kotlin 中的为空性合同违规行为会导致编译错误。为确保与现有代码兼容,所有新注释都仅限于 @RecentlyNullable 和 @RecentlyNonNull。这意味着为空性违规行为会引发警告,而不是错误。

    此外,Android 9 中添加的所有 @RecentlyNullable 或 @RecentlyNonNull 注释都会分别更改为 @Nullable和 @NonNull。这意味着为空性违规行为现在会引发错误,而不是警告。

    要详细了解注释方面的变更,请参阅 Android 开发者博客中的 Android Pie SDK 现已更适用于 Kotlin一文。

    NDK

    Android Q 包含以下 NDK 方面的变更。

    触发基于 Mallinfo 的垃圾回收

    当小型平台 Java 对象引用 C++ 堆中的大型对象时,通常只有在系统已回收并(举例而言)最终确定 Java 对象后,才能回收 C++ 对象。在之前的版本中,平台会估算与 Java 对象相关联的许多 C++ 对象的大小。这种估算并不总是准确,并且偶尔会导致内存使用量大大增加,因为平台无法在应该进行垃圾回收时完成回收。

    在 Android Q 中,垃圾回收器 (GC) 会跟踪系统 malloc() 分配的堆的总大小,以确保 malloc() 分配的大型堆始终包含在可触发 GC 的计算中。因此,与 Java 执行交错大量 C++ 分配的应用可能会出现垃圾回收频率提高的现象。其他应用的频率则可能会略有下降。

    改进了文件描述符所有权的调试

    Android Q 增加了 fdsan,它可以帮助您更轻松地查找和修复文件描述符所有权方面的问题。

    与错误处理文件描述符所有权相关的错误(通常表现为“use-after-close”和“double-close”)类似于内存分配“use-after-free”和“double-free”错误,但通常更难以诊断和修复。“fdsan”会尝试通过强制执行文件描述符所有权来检测和/或防止文件描述符误管理。

    要详细了解与这些问题相关的崩溃,请参阅 fdsan 检测到的错误。要详细了解 fdsan,请参阅关于 fdsan 的 Googlesource 页面

    展开全文
  • Android Q 新特性

    千次阅读 2019-05-13 11:20:45
    Android Q 功能和 API安全增强功能改进了生物识别身份验证对话框指定用户确认要求改进了对设备凭据的回退支持检查设备的生物识别功能直接从 APK 运行嵌入式 DEX 代码TLS 1.3 支持公共 Conscrypt API连接功能WLAN ...

    Android Q 功能和 API


    Android Q 为用户和开发者引入了强大的新功能。本文重点介绍面向开发者的新功能。
    要了解新版 API,请阅读 API 差异报告或访问 Android API 参考。为醒目起见,将突出显示新版 API。此外,请务必查阅 Android Q 行为变更(针对以 Android Q 为目标平台的应用和所有应用)以及隐私权变更,以了解平台变更可能给您的应用带来哪些方面的影响。

    安全增强功能

    Android Q 引入了若干安全功能,详见以下各节摘要说明:

    改进了生物识别身份验证对话框

    Android Q 对 Android 9 中增加的统一生物识别身份验证对话框进行了以下改进:

    指定用户确认要求

    您现在可以提供一个提示,以告知系统在用户使用隐式生物识别模式完成身份验证后无需要求用户进行确认。例如,您可以告知系统,在用户使用面孔身份验证完成身份验证后无需进行进一步确认。
    默认情况下,系统会要求用户进行确认。通常,用户希望确认敏感或高风险的操作(例如,购买商品)。但是,如果您的应用存在某些低风险操作,那么您就可以将 false 传递至 setRequireConfirmation() 方法,提供不要求用户确认的提示。由于此标记作为提示传递到系统,因此如果用户更改了针对生物识别身份验证的系统设置,则系统可能会忽略相应的值。

    改进了对设备凭据的回退支持

    您现在可以告知系统,如果用户因某种原因而无法使用其生物识别输入设备,则可以使用设备 PIN 码、图案或密码来进行身份验证。要启用此回退支持,请使用 setAllowDeviceCredential()方法。
    如果您的应用目前使用 createConfirmDeviceCredentialIntent() 来回退到设备凭据,请改为使用新方法。

    检查设备的生物识别功能

    现在,您可以在调用 BiometricPrompt 之前,先使用 BiometricManager 类中的 canAuthenticate() 方法检查设备是否支持生物识别身份验证。

    直接从 APK 运行嵌入式 DEX 代码

    您现在可以告知平台直接从应用的 APK 文件中运行嵌入式 DEX 代码。如果攻击者曾设法篡改了设备上本地编译的代码,则此选项有助于防止相应攻击。

    注意:启用此功能可能会影响应用的性能,因为在应用启动时 ART 必须使用 JIT 编译器(而不是读取提前编译好的原生代码)。我们建议您先测试应用性能,然后再决定是否在已发布的应用中启用此功能。
    要启用此功能,请在应用清单文件的 元素中将 android:useEmbeddedDex 属性的值设为 true。您还必须编译一个 APK,其中要包含 ART 可以直接访问的未压缩 DEX 代码。将以下选项添加到 Gradle 或 Bazel 配置文件,以编译包含未压缩 DEX 代码的 APK:

    Gradle
    aaptOptions {
           noCompress 'dex'
        }
        
    Bazel
        android_binary(
           ...,
           nocompress_extensions = [“.dex”],
        )
    
    TLS 1.3 支持

    现在,平台的 TLS 实现支持 TLS 1.3。TLS 1.3 是 TLS 标准的主要修订版本,它提升了性能和安全性。我们的基准测试数据表明,与 TLS 1.2 相比,使用 TLS 1.3 可以将建立安全连接的速度提高 40%。
    默认情况下,系统会为所有 TLS 连接启用 TLS 1.3。您可以通过调用 SSLContext.getInstance("TLSv1.2") 来获取已停用 TLS 1.3 的 SSLContext。您还可以对相关对象调用 setEnabledProtocols()来为每个连接来启用或停用协议版本。
    以下是有关 TLS 1.3 实现的一些重要的详细信息:

    • TLS 1.3 加密套件不可自定义。在启用 TLS 1.3 后,受支持的 TLS 1.3 加密套件会始终保持启用状态,并且系统会忽略所有试图通过调用 setEnabledCipherSuites() 将其停用的行为。
    • 在协商 TLS 1.3 时,系统会在将会话添加到会话缓存之前调用 HandshakeCompletedListeners(这与 TLS 1.2 和之前的其他版本不同)。
    • 在之前本应抛出 SSLHandshakeException 的某些情况下,SSLEngine 实例会抛出 SSLProtocolException
    • 不支持 0-RTT 模式。

    公共 Conscrypt API

    现在,Conscrypt 安全提供程序包含适用于 TLS 功能的公共 API。过去,用户可以通过反射来访问此功能。但是,由于在 Android P 中增加了关于调用非公共 API 的限制,因此这已在 Android Q 中加入了灰名单,并将在未来版本中进一步受限。
    此更新在 android.net.ssl 下增加了一组类,这些类包含用于访问通用 javax.net.ssl API 不提供的功能的静态方法。这些类的名称为相关 javax.net.ssl 类的复数,用户可以由此推断是否为这些类。例如,在 javax.net.ssl.SSLSocket 实例中运行的代码可以使用新的 android.net.ssl.SSLSockets 类中的方法。

    连接功能

    Android Q 包含一些与网络和连接相关的改进。

    WLAN 网络连接 API

    Android Q 增加了对点对连接的支持。借助此功能,应用可以通过使用 NetworkSpecifier 来提示用户更改设备连接到的接入点,以描述请求的网络的属性。点对点连接用于“非网络提供”目的,例如 Chromecast 和 Google Home 硬件等辅助设备的引导配置。
    点对点连接不需要位置权限。如果您发起连接到对等设备的请求,便会在对方设备上启动一个对话框,让相应设备的用户可以通过此对话框来接受连接请求。

    WLAN 网络建议 API

    Android Q 扩大了支持范围,现在允许应用提示用户连接到 WLAN 接入点。您可以使用 WifiNetworkSuggestion 来提供关于要连接到哪个网络的建议。平台最终会根据来自您的应用和其他应用的输入来选择要接受的接入点。
    来自应用的建议必须先得到用户批准,然后平台才会发起到建议的网络的连接。当平台第一次在扫描结果中找到与应用提供的其中一个建议相匹配的网络时,将由用户响应通知进行批准。当平台连接到建议的其中某个网络时,设置会显示相关文本,将网络连接归因于提出建议的相应应用。

    改进了 WLAN 高性能和低延迟模式

    借助 Android Q,您可以为底层调制解调器提供提示,以最大限度地缩短延迟。
    Android Q 扩展了 WLAN Lock API,以有效地支持高性能和低延迟模式。系统会针对高性能和低延迟模式停用 WLAN 节能模式,并且您可以在低延迟模式下启用进一步的延迟优化(具体取决于调制解调器支持)。
    仅当获取锁的应用在前台运行且屏幕处于开启状态时才能启用低延迟模式。低延迟模式对实时移动游戏应用尤其有用。

    DNS 解析器中的专用查找

    Android Q 增加了对“通过传输层安全协议 (TLS) 执行 DNS”的原生支持,以进行专用 DNS 查找。以前,平台 DNS 解析器支持 A 类解析,它可以根据域名来解析 IP 地址,而无需与通过此 IP 提供的服务有关的具体信息。经过此次更新,它现在还支持 SRV 和 NAPTR 查找。
    Android Q 可以为开发者提供标准明文查找和“通过传输层安全协议 (TLS) 执行 DNS”模式。

    WLAN Easy Connect

    借助 Android Q,您可以利用 Easy Connect 为对等设备配置 WLAN 凭据,以替代已弃用的 WPS。应用可以使用 ACTION_PROCESS_WIFI_EASY_CONNECT_URI intent 将 Easy Connect 集成到其设置和配置流程中。此 intent 需要 URI。调用应用可以通过各种方法来检索 URI,包括扫描贴纸或显示屏中的 QR 码,或通过扫描蓝牙 LE 或 NFC 广告。
    当 URI 可用时,您可以立即使用 ACTION_PROCESS_WIFI_EASY_CONNECT_URI intent 来配置对等设备的 WLAN 凭据。这样一来,用户就可以选择 WLAN 网络以共享并安全地传输相关凭据。
    注意:在使用此 intent 之前,应用必须先通过调用 WifiManager.isEasyConnectSupported() 来验证设备是否支持 Easy Connect。

    WLAN 直连连接 API

    WifiP2pConfigWifiP2pManager API 类在 Android Q 中有更新,以支持利用预先确定的信息快速与 WLAN 直连建立连接的功能。此信息通过边信道进行共享,例如蓝牙或 NFC。
    以下代码示例显示了如何使用预先确定的信息来创建群组:
    Kotlin

       val manager = getSystemService(Context.WIFI_P2P_SERVICE) as WifiP2pManager
        val channel = manager.initialize(this, mainLooper, null)
    
        // prefer 5G band for this group
        val config = WifiP2pConfig.Builder()
            .setNetworkName("networkName")
            .setPassphrase("passphrase")
            .enablePersistentMode(false)
            .setGroupOperatingBand(WifiP2pConfig.GROUP_OWNER_BAND_5GHZ)
            .build()
    
        // create a non-persistent group on 5GHz
        manager.createGroup(channel, config, null)
    

    Java

       WifiP2pManager manager = (WifiP2pManager) getSystemService(Context.WIFI_P2P_SERVICE);
        Channel channel = manager.initialize(this, getMainLooper(), null);
    
        // prefer 5G band for this group
        WifiP2pConfig config = new WifiP2pConfig.Builder()
        .setNetworkName("networkName")
        .setPassphrase("passphrase")
        .enablePersistentMode(false)
        .setGroupOperatingBand(WifiP2pConfig.GROUP_OWNER_BAND_5GHZ)
        .build();
    
        // create a non-persistent group on 5GHz
        manager.createGroup(channel, config, null);
    

    要使用凭据加入群组,请将 manager.createGroup() 替换为以下内容:
    Kotlin

    manager.connect(channel, config, null)
    

    Java

      manager.connect(channel, config, null);
    
    蓝牙 LE 连接导向型频道 (CoC)

    借助 Android Q,您的应用可以使用 BLE CoC 连接在两个 BLE 设备之间传输较大的数据流。此接口抽象化处理了蓝牙和连接机制,以简化实现。

    电话功能

    Android Q 包含一些与电话相关的改进。

    通话质量方面的改进

    Android Q 增加了在支持相关功能的设备上收集进行中的 IP 多媒体子系统 (IMS) 通话质量相关信息的功能,包括通过网络接听和拨打电话的质量。

    选接电话和来电显示

    Android Q 让您的应用可以将用户通讯录中不存在号码的来电标识为潜在骚扰电话,以及代表用户拒接骚扰电话而不响铃。系统会在通话记录中将这些已屏蔽的来电的相关信息记录为已屏蔽的来电,以便用户更清楚地了解何时有过未接来电。使用此新版 API,不需要从用户获取 READ_CALL_LOG 权限就可以提供选接电话和来电显示功能。
    您还可以配置应用,让其提供来电者的相关信息(例如公司名称、Facebook 联系信息等),这些信息会显示在平台的拨号器应用中。

    Call Redirection Service API

    Android Q 更改了来电 Intent 的处理方式。我们弃用了 NEW_OUTGOING_CALL 广播,并将其替换为 CallRedirectionService API。CallRedirectionService 提供了相关接口,以供您修改 Android 平台拨打的去电。例如,第三方应用可能会取消通话并通过 VoIP 对其进行重新路由。

    媒体和图形

    Android Q 引入了以下媒体和图形方面的新功能和 API:

    Native MIDI API

    借助 Android Native MIDI API (AMidi),应用开发者可以使用 C/C++ 代码发送和接收 MIDI 数据、与 C/C++ 音频/控制逻辑进行更紧密的集成以及最大限度地减少对 JNI 的需求。
    有关详情,请参阅 Android Native MIDI API

    MediaCodecInfo 方面的改进

    MediaCodecInfo 中有一些新方法可以显示有关编解码器的更多信息:

    • isSoftwareOnly()如果编解码器仅在软件中运行,则返回 true。软件编解码器并不能保证渲染性能。
    • isHardwareAccelerated()如果编解码器由硬件加速,则返回 true
    • isVendor()如果编解码器由设备供应商提供,则返回 true;如果由 Android 平台提供,则返回 false
    • isAlias() MediaCodecList可能针对使用备用编解码器名称(别名)的同一底层编解码器包含额外的条目。如果此条目中的编解码器是另一个编解码器的别名,则此方法会返回true

    此外,MediaCodec.getCanonicalName() 会针对通过别名创建的编解码器返回底层编解码器名称。

    性能点

    “性能点”表示编解码器以特定高度、宽度和帧速率渲染视频的能力。例如,UHD_60 性能点表示以每秒 60 帧的速度渲染超高清视频(3840x2160 像素)。
    方法 MediaCodecInfo.VideoCapabilities.getSupportedPerformancePoints() 会返回编解码器可以渲染或捕获的 PerformancePoint 条目列表。
    您可以通过调用 PerformancePoint.covers(PerformancePoint) 来检查给定的 PerformancePoint 是否会覆盖另一个性能点。例如,UHD_60.covers(UHD_50) 会返回 true
    我们为所有硬件加速的编解码器都提供了性能点列表。如果编解码器连标准性能点的最低值都不能满足,则此列表可能为空。
    请注意,已升级到 Android Q 但未更新供应商映像的设备是没有性能点数据的,因为此数据来自供应商 HAL。在这种情况下,getSupportedPerformancePoints() 会返回 null

    单色摄像头支持

    Android 9(API 等级 28)首次引入了单色摄像头功能。Android Q 为单色摄像头支持增加了几项增强功能:

    • 新增了对 Y8 流格式的支持,以提高内存效率。
    • 支持单色原始 DNG 捕获。
    • 引入了 MONO 和 NIR CFA 枚举,以区分常规单色摄像头和近红外摄像头。

    您可以使用此功能来捕捉原生单色图片。逻辑多摄像头设备可以使用单色摄像头作为物理子摄像头,以获取更出色的低光图片质量。

    动态深度格式

    从 Android Q 开始,摄像头可以使用名为“动态深度格式”(DDF) 的新架构将图片的深度数据存储在单独的文件中。应用可以请求 JPG 图片及其深度元数据,以便在后期处理中利用这些信息来应用所需的模糊处理,而无需修改原始图片数据。

    ANGLE

    在 Android Q 发布后,Android 开发者和合作伙伴可以选择使用 ANGLE 运行,这是 Chrome 组织中的一个项目,能够将 ES 置于 Vulkan 上层,而不必使用供应商提供的 ES 驱动程序。
    有关详情,请参阅 ANGLE

    无障碍服务 API

    Android Q 引入了以下新的无障碍服务功能和 API:

    AccessibilityNodeInfo 输入键标记

    在 Android Q 中,AccessibilityNodeInfo 得到了增强,现在增加了一个新标记,用于指示其是否代表文本输入键的。您可以使用 AccessibilityNodeInfo.isTextEntryKey() 方法来访问此标记。

    无障碍对话框语音反馈

    当无障碍服务要求用户重复按无障碍快捷方式以启动服务时,此对话框现在可以在服务请求时附带文字转语音提示。

    物理键盘的无障碍快捷方式

    在 Android Q 中,用户现在可以通过物理键盘来触发无障碍快捷方式,只需按 Control+Alt+Z 即可。

    软键盘控制器增强功能

    在 Android Q 中,无障碍服务现在可以请求显示软键盘,即使设备检测到连接了硬键盘也不例外。用户可以替换此行为。

    用户定义的无障碍服务超时

    Android Q 引入了 API 方法 AccessibilityManager.getRecommendedTimeoutMillis(),用于为用户针对互动式和非互动式的无障碍界面元素定义的超时提供支持。返回值受用户偏好设置和无障碍服务 API 的影响。

    自动填充方面的改进

    Android Q 包含对自动填充服务的以下改进。

    与兼容性相关的自动填充请求

    您现在可以使用 FillRequest.FLAG_COMPATIBILITY_MODE_REQUEST 标记来确定是否通过兼容性模式生成了自动填充请求。

    同时保存用户名和密码

    您现在可以支持应用使用多个活动来显示用户名、密码和其他字段的情况,只需使用 SaveInfo.FLAG_DELAY_SAVE 标记即可。

    用户与保存界面的互动

    您现在可以在保存对话框中显示和隐藏密码字段,只需在此对话框中设置操作监听器,并更改相应密码远程视图的可见性即可。

    支持更新数据集

    现在,自动填充功能可以更新现有密码。例如,如果用户已经存储了一个密码,然后又保存了一个新密码,则自动填充功能现在会提示用户更新现有密码,而不是保存新密码。

    字段分类方面的改进

    Android Q 包含对 Field Classification API 的以下改进。

    UserData.Builder 构造函数

    UserData.Builder 构造函数已更改,以更好地符合 Builder 模式的要求。

    允许将一个值映射到多种类别 ID

    在使用 Android Q 中的 UserData.Builder 时,您现在可以将一个值映射到多种类别 ID。在以前的版本中,如果一个值被添加多次,系统就会抛出异常。

    改进了对信用卡号码的支持

    现在,字段分类可以检测四位数字作为信用卡号码的最后四位数字。

    支持特定于应用的字段分类

    Android Q 增加了 FillResponse.setUserData(),让您能够在会话期间设置特定于应用的用户数据。这有助于自动填充服务检测包含特定于应用的内容的字段的类型。

    界面和系统控件

    Android Q 提供以下界面方面的改进:

    支持 JVMTI PopFrame 功能

    Android Q 增加了对 Android JVMTI 实现中的 can_pop_frames 功能的支持。在调试时,此功能让您能够在断点暂停并调整函数的局部变量、全局变量或实现,然后重新运行函数。有关详情,请参阅 Oracle 的 Pop Frame 参考页面

    Surface Control API

    Android Q 提供了一个 SurfaceControl API,用于对系统合成器 (SurfaceFlinger) 进行底层访问。对于大多数用户而言,SurfaceView 是使用此合成器的正确方法。SurfaceControl API 在某些情况下很有用,例如:

    • 同步多个表面
    • 跨进程的表面嵌入
    • 底层生命周期管理

    SurfaceControl API 在 SDK 和 NDK 绑定中都可用。NDK 实现包含用于与合成器手动交换缓冲区的 API。这为遇到 BufferQueue 限制的用户提供了一种替代方案。

    WebView 挂起渲染程序检测

    Android Q 引入了一个新的 WebViewRendererClient 抽象类,应用可以使用它来检测 WebView 是否无响应。要使用此类,请执行以下操作:

    1. 定义自己的子类,并实现其 onRendererResponsive()onRendererUnresponsive() 方法。
    2. WebViewRendererClient 的实例附加到一个或多个 WebView 对象。
    3. 如果 WebView 无响应,则系统会调用客户端的 onRendererUnresponsive() 方法以传递 WebViewWebViewRenderer(如果 WebView 是单进程,则 WebViewRenderer 参数为 null)。您的应用可以执行适当的操作,例如向用户显示一个对话框,以询问其是否要暂停渲染流程。
      如果 WebView 保持无响应状态,则系统会定期调用 onRendererUnresponsive()(不超过每五秒钟一次),但不会执行任何其他操作。如果 WebView 再次无响应,系统只会调用 onRendererResponsive() 一次。
    设置面板

    Android Q 引入了“设置面板”,这是一种 API,让应用能够在自身环境中向用户显示设置。这可以避免用户转到设置更改 NFC 或移动数据等设置,以便使用此应用。

    例如,假设用户打开了网络浏览器,而其设备已开启飞行模式。在 Android Q 之前的版本中,此应用只能显示一条通用消息,要求用户打开设置以恢复连接。而借助 Android Q,浏览器应用便可以显示一个内嵌面板,其中会显示各种主要连接设置,例如飞行模式、WLAN(包括附近的网络)和移动数据。借助此面板,用户无需离开应用即可恢复连接。
    要显示设置面板,请使用以下其中一项新推出的 Settings.Panel 操作触发一个 intent
    Kotlin

     val panelIntent = Intent(Settings.Panel.settings_panel_type)
        startActivityForResult(panelIntent)
    

    Java

    Intent panelIntent = new Intent(Settings.Panel.settings_panel_type);
    startActivityForResult(panelIntent);
    

    settings_panel_type 可以是下列项之一:

    • ACTION_INTERNET_CONNECTIVITY显示与互联网连接相关的设置,例如飞行模式、WLAN 和移动数据。
    • ACTION_WIFI:显示 WLAN 设置,但不显示其他连接设置。这对于需要 WLAN 连接以执行大容量上传或下载的应用非常有用。
    • ACTION_NFC显示与近距离无线通信 (NFC) 相关的所有设置。
    • ACTION_VOLUME显示所有音频流的音量设置。

    我们计划针对此功能引入一个 AndroidX 封装容器。在搭载 Android 9(API 级别 28)或更低级别的设备上调用时,此封装容器会在设置应用中打开最合适的页面。

    共享功能方面的改进

    Android Q 为共享功能提供了多项改进。要了解所有详情,请参阅 Android Q 中共享功能方面的改进

    Kotlin

    Android Q 对 Kotlin 开发进行了以下更新。

    libcore API 的可空性注释

    Android Q 改进了 SDK 中针对 libcore API 的可空性注释的覆盖范围。借助这些注释,在 Android Studio 中使用 Kotlin 或 Java 可空性分析的应用开发者可以在与这些 API 互动时获取非 Null 信息。
    通常,Kotlin 中的为空性合同违规行为会导致编译错误。为确保与现有代码兼容,所有新注释都仅限于 @RecentlyNullable@RecentlyNonNull。这意味着为空性违规行为会引发警告,而不是错误。
    此外,Android 9 中添加的所有 @RecentlyNullable@RecentlyNonNull 注释都会分别更改为 @Nullable@NonNull。这意味着为空性违规行为现在会引发错误,而不是警告。
    要详细了解注释方面的变更,请参阅 Android 开发者博客中的 Android Pie SDK 现已更适用于 Kotlin一文。

    NDK

    Android Q 包含以下 NDK 方面的变更。

    改进了文件描述符所有权的调试

    Android Q 增加了 fdsan,它可以帮助您更轻松地查找和修复文件描述符所有权方面的问题。
    与错误处理文件描述符所有权相关的错误(通常表现为“use-after-close”和“double-close”)类似于内存分配“use-after-free”和“double-free”错误,但通常更难以诊断和修复。“fdsan”会尝试通过强制执行文件描述符所有权来检测和/或防止文件描述符误管理。
    要详细了解与这些问题相关的崩溃,请参阅 fdsan 检测到的错误。要详细了解 fdsan,请参阅关于 fdsan 的 Googlesource 页面

    ELF TLS

    使用 API 级别 29 及更高版本的 NDK 编译的应用无需再使用 emutls,但可以改为使用 ELF TLS。我们增加了对动态和静态链接器的支持,以支持处理线程局部变量的新方法。
    对于针对 API 级别 28 及更低版本编译的应用,我们实现了针对 libgcc/compiler-rt 的改进,以便解决一些 emutls 问题。
    有关详情,请参阅面向 NDK 开发者的 Android 变更

    运行时

    Android Q 包含以下运行时方面的变更。

    触发基于 Mallinfo 的垃圾回收

    当小型平台 Java 对象引用 C++ 堆中的大型对象时,通常只有在系统已回收并(举例而言)最终确定 Java 对象后,才能回收 C++ 对象。在之前的版本中,平台会估算与 Java 对象相关联的许多 C++ 对象的大小。这种估算并不总是准确,并且偶尔会导致内存使用量大大增加,因为平台无法在应该进行垃圾回收时完成回收。
    在 Android Q 中,垃圾回收器 (GC) 会跟踪系统 malloc() 分配的堆的总大小,以确保 malloc() 分配的大型堆始终包含在可触发 GC 的计算中。因此,与 Java 执行交错大量 C++ 分配的应用可能会出现垃圾回收频率提高的现象。其他应用的频率则可能会略有下降。

    测试和调试

    Android Q 包含以下测试和调试方面的改进。

    改进了设备上系统跟踪功能

    现在,您在执行设备上系统跟踪时可以指定跟踪的记录大小和持续时间限制。在您指定任一值后,系统便会执行长期跟踪,并在记录跟踪时定期将跟踪缓冲区复制到目标文件。在达到您指定的记录大小或持续时间限制后,跟踪便会完成。
    请使用这些附加参数来测试除了您使用标准跟踪进行测试的用例之外的其他用例。例如,您可能正在诊断某个性能错误,而此错误仅在您的应用长时间运行后才会发生。在这种情况下,您可以记录为期一整天的长期跟踪,然后分析 CPU 调度程序、磁盘活动、应用线程以及报告中的其他数据,以帮助您确定造成此错误的原因。

    参考

    Android Q 功能和 API: https://developer.android.google.cn/preview/features.html

    展开全文
  • Android Q 适配指南

    千次阅读 2019-11-18 16:37:27
    Android 10开始版本中,官方的改动较大,相应的开发者适配成本...这里按照`2019.11.11 google android q workshop`流程,大概说明一下Android Q适配需要注意的内容。虽然是大概介绍,但应该是目前最全的适配攻略了...

    在Android 10开始版本中,官方的改动较大,相应的开发者适配成本还是很高的。
    这里按照2019.11.11 google android q workshop流程,大概说明一下Android Q适配需要注意的内容。虽然是大概介绍,但应该是目前最全的适配攻略了…

    • 非SDK 接口
    • 设备ID
    • 外部存储
    • 权限
    • 新功能——夜间模式

    官方适配文档:
    https://developer.android.com/about/versions/10

    一、非SDK接口

    官方文档:针对非 SDK 接口的限制

    官方从 Android 9(API 级别 28)开始,对应用使用的非 SDK 接口实施了限制。
    如果你的APP通过引用非 SDK 接口或尝试使用反射或 JNI 来获取句柄,这些限制就会起作用。官方给出的解释是为了提升用户体验、降低应用崩溃风险。

    1.1、非SDK接口检测工具

    官方给出了一个检测工具,下载地址
    Google官方 veridex下载:
    https://android.googlesource.com/platform/prebuilts/runtime/+/master/appcompat

    CSDN资源镜像 veridex下载:
    https://download.csdn.net/download/aiwusheng/80980831

    veridex使用方法:

    appcompat.sh --dex-file=apk.apk
    

    在这里插入图片描述

    1.2、blacklist、greylist、greylist-max-o、greylist-max-p含义

    以上截图中,blacklist、greylist、greylist-max-o、greylist-max-p含义如下:

    • blacklist 黑名单:禁止使用的非SDK接口,运行时直接Crash(因此必须解决)
    • greylist 灰名单:即当前版本仍能使用的非SDK接口,但在下一版本中可能变成被限制的非SDK接口
    • greylist-max-o: 在targetSDK<=O中能使用,但是在targetSDK>=P中被禁止使用的非SDK接口
    • greylist-max-p: 在targetSDK<=P中能使用,但是在targetSDK>=Q中被禁止使用的非SDK接口

    如果觉得我没有说清楚,可以看以下 2019.11.11 google android q workshop PPT 截图

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    1.3、Android Q 加固 与 热修复

    关于加固与热修复,官方也提供了相应的API

    • 加固
      在这里插入图片描述

    • 热修复
      在这里插入图片描述

    注:
    未适配Android Q的应用,若使用了blacklist 相关接口,在Android Q系统上打开时,会直接Crash!
    未适配Android Q的应用,若使用了blacklist 相关接口,在Android Q系统上打开时,会直接Crash!
    未适配Android Q的应用,若使用了blacklist 相关接口,在Android Q系统上打开时,会直接Crash!

    二、设备ID

    从Android 10 开始 普通应用 已无法完全标识一个设备,曾经用mac地址、IMEI等设备信息标识设备的方法,从Android 10开始统统失效。而且无论你的APP是否是配过Android 10。

    2.1、IMEI等设备信息

    从Android10开始普通应用不再允许请求权限android.permission.READ_PHONE_STATE
    而且,无论你的App是否适配过Android Q(既targetSdkVersion是否大于等于29),均无法再获取到设备IMEI等设备信息。

    受影响的API如下:

    Build.getSerial();
    TelephonyManager.getImei();
    TelephonyManager.getMeid()
    TelephonyManager.getDeviceId();
    TelephonyManager.getSubscriberId();
    TelephonyManager.getSimSerialNumber();
    

    在这里插入图片描述

    targetSdkVersion<29 的应用,其在获取设备ID时,会直接返回null
    targetSdkVersion>=29 的应用,其在获取设备ID时,会直接跑出异常SecurityException

    在这里插入图片描述

    如果您的App希望在Android 10以下的设备中仍然获取设备IMEI等信息,可按以下方式进行适配:

    在这里插入图片描述

    谁能访问设备ID?

    从Android 10开始,哪些应用还能访问设备ID?

    Google官方的描述如下:
    https://source.android.com/devices/tech/config/immutable-device-ids?hl=zh-cn

    • 默认的短信应用。
    • 具有 READ_PRIVILEGED_PHONE_STATE 权限,并且在 privapp-permission.xml 文件中列入白名单的应用。
      这些应用还必须加载到 system/priv-app 目录中。
    • 具有 UICC 运营商权限中定义的运营商权限的应用。
    • 具有 READ_PHONE_STATE 权限的设备所有者或资料所有者(无需列入白名单)。
      在这里插入图片描述

    2.2、Mac地址随机分配

    从Android10开始,默认情况下,在搭载 Android 10 或更高版本的设备上,系统会传输随机分配的 MAC 地址。(既从Android 10开始,普通应用已经无法获取设备的真正mac地址,标识设备已经无法使用mac地址)

    2.3、如何标识设备唯一性?

    在这里插入图片描述
    在这里插入图片描述

    Google给出的解决方案是:如果您的应用有 追踪非登录用户重装 的需求,可用ANDROID_ID来标识设备。

    • ANDROID_ID的生成规则为:签名+设备信息+设备用户
    • ANDROID_ID重置规则:设备恢复出厂设置时,ANDROID_ID将被重置
    String androidId = Settings.Secure.getString(this.getContentResolver(), Settings.Secure.ANDROID_ID);
    

    也就是从Android 10开始已经无法完全标识一个设备,曾经用mac地址、IMEI等设备信息标识设备的方法,从Android 10开始统统失效。而且无论你的APP是否是配过Android 10。

    求高手留言解答:
    在Android 10系统上,目前本人尚未找到标识设备唯一性的办法,如果大家有办法希望留言告知!!!

    三、分区存储

    官方文档:

    外部存储访问权限范围限定为应用文件和媒体
    Manage scoped external storage access

    在这里插入图片描述

    为解决截图中的问题,从Android Q开始,官方对外部存储进行了一定的限制。

    To give users more control over their files and to limit file clutter, apps targeting Android 10 (API level 29) and higher are given scoped access into an external storage device, or scoped storage, by default. Such apps can see only their app-specific directory—accessed using Context.getExternalFilesDir()—and specific types of media. It’s a best practice to use scoped storage unless your app needs access to a file that doesn’t reside in either the app-specific directory or the MediaStore.

    为了使用户更改的管理Sdcard中的文件,解决文件混乱的问题。从Android 10开始(API level 29),Android将对外部存储进行一定的限制。
    默认情况下,对于外部存储,App只能通过Context.getExternalFilesDir()访问自己的特定文件目录;
    以及系统特定的文件类型目录(例:照片、屏幕快照、视频 等)。
    在这里插入图片描述

    3.1、APP专属路径

    对于App专属 内部存储路径外部存储路径的访问,将不再需要 READ_EXTERNAL_STORAGEWRITE_EXTERNAL_STORAGE 权限:

    • 内部存储路径 /data/data/<包名>/
    • 外部存储路径 /storage/Android/data/<包名>/

    Android Q 存储目录的获取,可参考以下文档:Android Sdcard存储目录
    Android Q 存储目录的获取,可参考以下文档:Android Sdcard存储目录
    Android Q 存储目录的获取,可参考以下文档:Android Sdcard存储目录

    3.2、手机共享路径

    读取其他APP创建的共享文件,例:相册、屏幕快照 等,则需要申请READ_EXTERNAL_STORAGE权限:

    3.3、Downloads文件夹

    读取手机的Downloads文件夹,不需要任何权限,需要使用API Storage Access Framework

    3.4、停用Andorid 10的分区存储

    对于适配难度较大的应用,Android提供了一种方式可以暂时停用分区存储功能
    在androidmanifest配置文件中将requestLegacyExternalStorage设置为true,可以停用分区存储
    requestLegacyExternalStorage设置为true,可以迅速适配Android 10;但Android11及以上版本,还需进行分区存储适配

    <manifest ... >
      <application android:requestLegacyExternalStorage="true"  >
      </application>
    </manifest>
    

    官方描述如下:
    https://developer.android.google.cn/training/data-storage/use-cases

    在这里插入图片描述

    四、权限相关

    主要包括:

    • 在后台运行时访问设备位置信息
    • 从后台启动 Activity 的限制
    • 屏幕录制
    • 摄像头和麦克风
    • 剪切板隐私限制

    4.1、在后台运行时访问设备位置信息

    Android 10 引入了 ACCESS_BACKGROUND_LOCATION 权限。
    若应用在后台运行时,访问手机位置,需要动态申请该权限,用户则可以选择拒绝。

    官方给出的数据,大部分用户对位置信息是比较敏感的。而且大部分用户是不允许应用在后台使用位置信息的。
    在这里插入图片描述

    在这里插入图片描述

    在这里插入图片描述

    4.2、从后台启动 Activity 的限制

    具体内容请查看官方文档

    4.3、屏幕录制

    不需要手动申请权限,但官方 API内部会向用户弹窗申请权限

    在这里插入图片描述

    4.4、摄像头和麦克风

    Android 9 摄像头和麦克风 后台权限已经移除了

    4.5、活动探知——新增权限

    在这里插入图片描述

    4.6、剪切板隐私限制

    从Android P开始,除非你的应用是默认输入法,否则它无法访问用户的剪贴板数据;但向剪切板写入数据不影响。

    五、新功能——夜间模式

    关于夜间模式,感兴趣的同学,可以查看我的另一篇文档:

    Android Q 深色主题

    六、参考文章

    Android 10 Scoped Storage

    = THE END =

    文章首发于公众号”CODING技术小馆“,如果文章对您有帮助,可关注我的公众号。
    欢迎关注我的公众号

    展开全文
  • android q 最近任务栏依赖包sysui_shared.jar可以直接替换掉android p quickstep\libs下包,因为很多接口有所改变需要对androd q最近任务栏接口做适配,可以查看我的博客了解android q最近任务栏移植分享。
  • AndroidQ文件存储适配

    千次阅读 2019-12-27 17:47:55
    安卓Q即安卓10.0已经发布多时,不过大多数开发者并没有真机去测试,最近各厂商系统陆续推送了10.0的升级,因此必须要考虑去适配10.0系统了! 关于10.0系统权限方面的改变,大家可以搜索相关文章,这里主要讲一下存储...
  • Android Q 适配

    千次阅读 2019-09-16 20:10:51
    因为项目在华为部分手机有预装,应华为要求,适配 Android QAndroid 10) 版本,因为华为那边要求,新版本系统出来不久就会适配,项目是一步步适配上来的,Android M、Android N、Android O、Android P ,所以本次...
  • Android Q 适配,看这篇就妥了

    千次阅读 2019-06-04 09:00:00
    转载自公众号:刘望舒作者:吃猫猫的鱼地址:https://juejin.im/post/5cad5b7ce51d456e5a0728b01. 导读Android ...
  • Android Q的全新特性与隐私权限

    万次阅读 2019-05-10 23:50:53
    在前几天的Google I/O 2019大会上,发布了Android Q版本(Android 10)。Android Q带来了许多新特性,也增强安全隐私保护,包括支持折叠屏、非SDK接口限制、共享内存、分区存储、系统二进制文件映射到只执行内存、WLAN...
  • Android Q版本读取SDcard

    千次阅读 2022-01-10 09:50:57
    uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/> 需要在application里面添加 android:...
  • Android Q(10.0)版本新特性和兼容性适配

    万次阅读 热门讨论 2019-04-18 12:02:29
    北京时间2019年3月14日Google正式对外发布Android Q Beta 1及预览版SDK,这意味着安卓开发者们又即将迎来一年一度的新版本适配工作了。Android Q 为开发者们带来了许多新功能,如折叠屏增强项、新网络连接 API、全新...
  • Android Q 不叫 Q,正式命名为 Android 10

    千次阅读 2019-08-24 15:28:04
    根据官方博文,谷歌已经公布了 Android Q 的名称,它并不像以前一样,以甜食命名,也不是以任何以字母 Q 开头来命名,而是简单称它为 Android 10。 该公司表示,正在改变其发布版本的命名方式。该公司写道: 这些...
  • Android Q is the “developer preview” edition of Android 10. As with past Android releases, Android Q will slowly make its way to ordinary users, starting in the fall of 2019. In the meantime, app ...
  • Android Q隐私权:权限变更 本文档介绍了权限模型的一些变更。这些变更有助于增强用户隐私。 其中一些变更会影响在Android Q上运行的所有应用,而其他变更仅会影响以Android Q为目标平台的应用。 影响所有应用的...
  • Android Q(10) 文件存储适配

    万次阅读 多人点赞 2019-09-29 18:05:03
    Android Q官方文档 Android Q 分区存储 Android Q文件存储机制修改成了沙盒模式,和IOS神似 应用只能访问自己沙盒下的文件和公共媒体文件 对于Android Q以下,还是使用老的文件存储方式 权限 Android Q不再需要...
  • Android Q(10.0)的新功能和API

    千次阅读 2019-05-25 10:37:06
    Android Q功能和API 目录: 安全性增强 改进的生物识别认证对话框 直接从APK运行嵌入式DEX代码 TLS 1.3支持 Public Conscrypt API 连接功能 Wi-Fi网络连接API Wi-Fi网络建议API 改进了Wi-Fi高性能和低延迟...
  • PictureSelector 2.0 Android Q 适配之旅。

    万次阅读 多人点赞 2020-01-08 15:37:07
    PictureSelector 至从2016年12月底提交第一个版本以来时至今日总共也已提交80...由于Google Android Q正式版预计在2019年8月份前后推出,所以针对AndroidQ的适配已经迫在眉睫了,其中Android Q一项比较重要的变更就...
  • AndroidQ Scoped Storage终极适配指导

    千次阅读 2019-11-07 18:34:29
    为了使用户能够更好地控制自己的文件,并限制文件混乱,AndroidQ修改了外部存储权限。这种外部存储的新特性被称为分区存储(Scoped Storage)。官方翻译称为分区储存,也有称为沙盒模式。 外部存储空间被分为两部分 ...
  • 适配Android Q上读取多媒体文件

    千次阅读 2019-08-16 19:08:14
    Android Q版本出来也有一段时间了,但是大部分我们都没有去适配过它,首选说一下Android Q版,最大的亮点集中在隐私安全和智能交互两方面,其中在隐私安全方面Android Q增加了外部存储策略变更、位置权限的后台访问...
  • Android Q读写共享目录媒体文件

    千次阅读 2020-04-29 15:26:28
    Android Q读取公共目录媒体文件 有些人通过文件名称去查找公共目录下媒体文件却获取不到,可能是由于查询条件写错了。注意下MediaStore.Video.Media.DISPLAY_NAME 参数,我用MediaStore.Video.Media.BUCKET_DISPLAY_...
  • androidQ(10.0) 预装集成apk到data分区

    千次阅读 2020-07-02 13:48:39
    当我按照 Android O、P、Q 版本如何预装 APK 一文将 PMS 中 patch 回退,并在 Android.mk 中指定 LOCAL_MODULE_PATH := $(TARGET_OUT_DATA_APPS) 输出到 data/app 目录下,编译后apk也确实位于 data/app/中,而且 ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 89,855
精华内容 35,942
关键字:

android q

友情链接: test.rar