精华内容
下载资源
问答
  • 安卓平台IO特性分析

    千次阅读 2017-09-26 12:18:12
     eMMC FTL需要根据平台IO特性来进行优化。例如之前实验中,发现应用命令间隔为200ms,FTL可以在这段间隔内进行垃圾回收,这样可以提高用户体验。 建议3:   所有应用的测试结果显示时间局部...

    背景

    测试环境:

    测试设备:Nexus5,32GB SanDisk INAND eMMC 4.51,无外挂SD卡。

    操作系统:Android v4.4

    IO监控软件:作者自己搞的BIOtracer

    测试内容:

        选取常用的14个软件,和4个系统功能。那么有18个应用场景和它们一些组合应用场景(电话、空闲和启动手机也简单认为是应用程序之一)。详细如下:






    数据记录:

         命令请求的大小、类型、位置和响应时间、 service time, and inter-arrival time。和请求并行程度。

    测试数据:


        A. eMMC吞吐量



         上图是从25种测试case中获取的数据的平均值。可以看到,请求数据大小对eMMC吞吐量有很大影响。因为Flash读操作比编程用时短,所以可以看到读的极限速度比编程写命令要高很多。

        B. 数据大小关联性



          表格项说明:

    Data Size:所有命令请求数据总量

    Number of Reqs:命令请求数

    Max Size:单个请求最大数据包的大小

    Write Reqs Pct:写操作占命令的百分比

    Write Size Pct:写操作数据量大小占数据传输的百分比。

           规律:

    1. 因为有packing command这个特性,所以数据请求大小可以超过Linux的限制512KB。

    2. 命令平均请求长度一般在11KB到34.5KB之间。

    3. 大部分使用场景下,写请求比较多。


    特性1:绝大部分手机应用都是以写操作为主。



         18个应用的写操作大小分布如图4所示。可以看到小数据操作占了大部分,大数据请求占百分比很少。最后10个互联网应用的大小分布,命令请求大小;分布比较类似。


    特性2:小数据请求占了所有请求的大部分。



        C时间相关性分析


    Recording Duration:数据记录的时间

    Arrival Rate:每秒种命令请求次数。

    Access Rate:平均每秒钟数据请求量

    NoWart  Req. Ratio:指那些被马上执行的请求的比率。意味着当时没有进行中的命令,这些命令可以被马上执行。

    Mean Serv:命令平均服务时间

    Mean Resp:命令平均响应时间

         待机、打电话和Youtute的data access rate很低。系统启动时,每秒请求量比较高,主要是读操作。程序安装,每秒请求次数和数据传输量都比较高。15个应用中,最低有63%的请求可以马上执行,其中有10个应用的80%请求可以马上执行。

        

    特性3:大部分请求到达的时候可以被立刻执行。也就是说,很少请求会同时到达。


         从表格IV看到,手机待机、通话中、YouTube和微博这种平均一秒都还不发不到一条命令的应用,平均响应时间还更久。z这是因为eMMC在无操作一段时间后会进入低功耗模式,唤醒初始化到响应命令需要一段时间。


         特性4:在eMMC空闲时间超过阈值,eMMC会进入低功耗模式。因此有些周期性访问eMMC的设备,导致eMMC频繁在低功耗模式和正常模式间切换,这样会导致平均相应时间变慢。


         Spatial Locality(空间局部性):顺序访问所占的比率。

         Temoral Locality(时间局部性):重复存取同一个地址的比率。

         18个应用场景中,16个空间局部性比率是低于30%的,即使在所有应用场景中最多也是48%。时间局部性会普遍好点,18个应用场景中,11个处于于30.83%到52.9%的。总的来说,相对于服务器级别应用局部性原理的二八定律,上述测试的应用看起来不太符合。

         特性5:测试应用场景,局部性的特性不明显。其中空间局部性比时间局部性要低


        

    从表格5可以看出,大部分的命令都可以在2ms内完成,绝大部分在16ms内完成。我们发现响应时间分布和请求大小分布是有很强关联性的。可以发现相应时间大部分是取决于命令请求的大小。



         表格6显示各应用命令请求的时间间隔分布。看电影的时候大部分请求间隔都在1ms以内。从中也可以看到互联网应用的请求时间间隔分布是类似的。本地的一些应用,比如说“看电影”、“听音乐”等命令请求频率会比互联网应用要高。


         特性6:在大部分应用中,平均请求间隔均比较久。其中13个应用命令间隔大于200ms,另外10个应用中,超过20%的命令间隔大于16ms。


    D. 同时运行多个应用的IO分析

        在大部分情况下,手机用户会在前台执行一个应用,后台同时有多个服务在进行。一种情况是,手机用户会在刷微博的同时听音乐,然后挂者微信或者QQ。另一种情况,客户可能在看朋友圈的时候来了短信,然后切换到短信中,看完短信又切回朋友圈。

        在此,作者收集7种应用组合的请求来进行IO分析。大致有{音乐,微博}、{音乐、短信}等比较常用的组合。



         图7分别表示7种组合应用请求大小分布、相应时间分布和命令请求间隔分    布。图7A的请求大小分布情况和图4相差不大。

         图7B所示,组合应用的相应时间和单个应用时间其实也相差不大,没有明显的增长。比如说Music/WB平均相应时间3.61ms,单个应用上Music、WB分别为3.45ms和5.2ms。

         图7C所示,组合应用的命令间隔普遍还增加了。7种应用组合命令间隔范围大概为44.8ms到164ms。

        

    另外,由于Host资源的局限性,所以组合应用的每秒请求次数和每秒数据传输速度是比单个应用的值相加还要高。总的来说,多个应用同时执行的情况下,IO特性都比较稳定的。(PS:测试应用比较偏日常使用,没有很多数据密集型的应用)。


        表格4最后几项关于应用组合测试的,可以看到大部分请求都可以马上被执行,所以即使在多应用运行的情况下也是不需要并行处理机制的。


    eMMC设计建议

         基于上篇和上面的分析情况,给eMMC的设计者一些建议。

    建议1:

         在大部分应用情况下超过80%的请求都可以被立即执行,只有少量的并行请求。所以没必要在设备层提高并行性能(比如说使用SD卡),或者在系统层面提增加并行请求队列支持。外置SD卡性能较低,反而会降低的性能。


    建议2:

         eMMC FTL需要根据平台IO特性来进行优化。例如之前实验中,发现应用命令间隔为200ms,FTL可以在这段间隔内进行垃圾回收,这样可以提高用户体验。


    建议3:

         所有应用的测试结果显示时间局部性和空间局部性不明显,所以eMMC中一个大容量的ram缓存对性能的提高就不是特性明显了。(还是很有用的~)


    建议4:

         由于局部性不明显,表示Host会对eMMC不同的地方都会进行访问,所以eMMC使用一个简单的磨损均衡方案就可以了。


    建议5:

    实验数据显示大部分应用一般的命令大小4K,快速处理4K请求会提高eMMC的整体性能。SLC Flash可以提供更加高效的读写命令(PS:道理我都懂,SLC贵啊)。


    其它:

    作者还虚拟了一种Flash 4KB和8KB,分别用于存放4K数据和较大的数据,从而减少写放大写系数。

                                                      


    END
    展开全文
  • 安卓平台架构及特性

    2016-04-08 19:11:11
    开发者开发的程序和系统程序都是平等的,都是通过访问安卓提供的API框架;  大量的API供开发者使用。除了作为应用程序开发的基础,也可以成为软件复用的手段。 3、函数库  系统C库:为嵌入式Linux

    1、应用程序层

         包含一系列的核心应用程序,包括邮件客户端、日历、地图、浏览器、联系人。通常都是由Java编写的。

    2、应用程序框架

        应用程序的开发所依赖的框架。开发者开发的程序和系统程序都是平等的,都是通过访问安卓提供的API框架;

       大量的API供开发者使用。除了作为应用程序开发的基础,也可以成为软件复用的手段。

    3、函数库

       系统C库:为嵌入式Linux 设备调整过的标准C系统库;

      媒体库:支持播放和录制流行的音视频格式。

     SGL:底层的2D图形引擎;

    SQLite:供所有应用程序使用的功能强大的轻量级关系数据库;

    4、安卓运行虚拟机

       安卓核心库集和ART.ART模式,用户安装App时进行预编译的,将原本在程序运行时的编译动作提前到应用安装时,这样使得程序在运行时可以减少动态编译的开销,从而提升了运行效率。

    5、Linux 内核

       安卓建立在Linux 2.6之上。提供了安全性,内存管理,进程管理,网络协议栈和驱动器模型等核心系统服务。

    展开全文
  • 本文描述了与其它触屏手机系统和桌面系统不同的Android平台特性,这些特性需要更多的表现在我们开发的应用程序中,以保证这是一款Android手机的应用。这些特性可能对于习惯了其它手机操作系统的用户可能有不习惯的...
  • 本文将重点介绍该版本特性中部分需要开发适配的部分,以官方文档说明为基础,汇总自己在适配中踩过的坑以及经验,后续遇到相关问题会持续更新。 API = 30,主要影响分类: 影响所有应用的行为变更(不管targetSdk...

    本文将重点介绍该版本特性中部分需要开发适配的部分,以官方文档说明为基础,汇总自己在适配中踩过的坑以及经验,后续遇到相关问题会持续更新。

    API = 30,主要影响分类:

    • 影响所有应用的行为变更(不管targetSdk是多少,对所有跑在R设备上的应用均有影响)
    • 影响以 Android R为目标平台的应用的行为变更(targetSDK ==R ,且跑在R设备上的应用才有影响)
       

    影响所有应用的行为变更

    官方文档在这里

    隐私设置,其中包括:

    • 单次授权:让用户可以选择授予更多对位置信息、麦克风和摄像头的临时访问权限。

    • 权限对话框的可见性:一再拒绝某项权限表示用户希望“不再询问”。这个只是官方的一个建议。
    • 数据访问审核:深入了解您的应用在何处访问私密数据。可以注册 AppOpsManager.OnOpNotedCallback 实例,该实例可在每次发生以下任意事件时执行相应操作应用的代码访问私密数据。为了帮助您确定应用的哪个逻辑部分调用了事件,您可以按归因标记审核数据访问。依赖库或 SDK 中的代码访问私密数据。(这个没实践过)
    • 系统提醒窗口权限:根据请求自动向某些类型的应用授予 SYSTEM_ALERT_WINDOW 权限。此外,包含 ACTION_MANAGE_OVERLAY_PERMISSION intent 操作的 intent 始终会将用户转至系统设置中的屏幕。
    • 永久SIM卡标识符:在 Android 11 及更高版本中,使用 getIccId() 方法访问不可重置的 ICCID 受到限制。该方法会返回一个非 null 的空字符串。如需唯一标识设备上安装的 SIM 卡,请改用 getSubscriptionId() 方法。订阅 ID 会提供一个索引值(从 1 开始),用于唯一识别已安装的 SIM 卡(包括实体 SIM 卡和电子 SIM 卡)。除非设备恢复出厂设置,否则此标识符的值对于给定 SIM 卡是保持不变的。

    安全性,其中包括:

    • SSL 套接字默认情况下使用 Conscrypt SSL 引擎:Android 的默认 SSLSocket 实现基于Conscrypt 。从 Android 11 开始,该实现是在 Conscrypt 的 SSLEngine 之上内部构建的。

    • Scudo Hardened Allocator:Android 11 在内部使用 Scudo Hardened Allocator 为堆分配提供服务。Scudo 能够检测并减轻某些类型的内存安全违规行为。如果您在原生代码崩溃报告中发现与 Scudo 相关的崩溃(例如 Scudo ERROR:),请参阅 Scudo 问题排查文档

    Scudo 是一个动态的用户模式内存分配器(也称为堆分配器),旨在抵御与堆相关的漏洞(如基于堆的缓冲区溢出、释放后再使用和重复释放),
    同时保持性能良好。它提供了标准 C 分配和取消分配基元(如 malloc 和 free),以及 C++ 基元(如 new 和 delete)

    • 针对 5G 的模拟器支持

    Android 11 添加了 5G API,使您的应用能够添加各种先进的功能。如需在添加这些功能时对其进行测试,您可以使用 Android SDK 模拟器的新功能。这项新功能是在模拟器版本 30.0.22 中添加的。
    选择 5G 网络设置可将 TelephonyDisplayInfo 设为 OVERRIDE_NETWORK_TYPE_NR_NSA,修改带宽估算值,还允许您设置按流量计费性,
    以验证您的应用是否会对 NET_CAPABILITY_TEMPORARILY_NOT_METERED 状态的变化做出适当的响应。

    性能和调试

    • JobScheduler API 调用限制调试

    JobScheduler任务调度器,可以在设备空闲时做一些任务处理。开发者可以利用此服务发现潜在的性能问题。对于 debuggable 清单属性设置为 true 的应用,超出速率限制的 JobScheduler API 调用将返回 RESULT_FAILURE。如此设置限制,正当合理的用例应该就不会受到影响。

    JobScheduler是由SystemServer进程启动的一个系统服务

    • 文件描述符排错程序:Android 10 引入了 fdsan(文件描述符排错程序)。fdsan 检测错误处理文件描述符所有权的错误,例如 use-after-close 和 double-close。在 Android 11 中,fdsan 的默认模式发生了变化。现在,fdsan 会在检测到错误时中止,而以前的行为则是记录警告并继续。如果您在应用中发现由于 fdsan 而导致的崩溃,请参阅 fdsan documentation

    文件描述符(FileDescriptor) 是Unix/Linux系统文件操作的相关概念,它在形式上是一个非负整数。当程序打开一个现有文件或者创建一个新文件时,内核向进程返回一个文件描述符。 
    系统的进程也就是使用了这个fd来标示打开的文件,有了它就能对文件做各种操作,获得文件的各种相关信息了。

    非SDK接口限制:Android 11 包含更新后的受限制非 SDK 接口列表(基于与 Android 开发者之间的协作以及最新的内部测试)。跟其他版本一样,Android11也会限制一些接口,包括灰名单和白名单,具体看对非 SDK 接口的限制

    与其他应用交互

    • 分享内容 URI:应用与其他应用分享内容 URI,相应 intent 必须至少设置以下 intent 标记中的一个,以便授予对 URI 的访问权限FLAG_GRANT_READ_URI_PERMISSION 和 FLAG_GRANT_WRITE_URI_PERMISSION。这样一来,如果其他应用以 Android 11 为目标平台,相应应用仍可访问内容 URI。即使内容 URI 与不属于你的应用的内容提供程序相关联,应用也必须包含 intent 标记。

    以 Android 11 为目标平台的应用行为变更:

    隐私设置,Android 11 引入了一些变更和限制来加强用户隐私保护,其中包括:

    • 强制执行分区存储:对外部存储目录的访问仅限于应用专用目录,以及应用已创建的特定类型的媒体。

    分区存储将存储空间分为两部分:

    1、公共目录:Downloads、Documents、Pictures 、DCIM、Movies、Music、Ringtones等

        公共目录的文件在App卸载后,不会删除;可以通过SAF、MediaStore接口访问;拥有权限,也能通过路径直接访问

    2、 应用专属目录: 应用专属目录只能自己直接访问;App卸载,数据会清除。

    targetSdkVersion = 29应用中,设置android:requestLegacyExternalStorage=“true”,就可以不启动分区存储,Environment.getExternalStoragePublicDirectory读取正常使用。

    targetSdkVersion = 30中强制开启分区存储。 

    targetSdkVersion 由29修改到30,覆盖安装,增加android:preserveLegacyExternalStorage=“true”,Environment.getExternalStoragePublicDirectory读写正常不报错

    targetSdkVersion 由29修改到30,卸载安装,Environment.getExternalStoragePublicDirectory读写报错,程序崩溃(open failed: EACCES (Permission denied))

    数据迁移,可以将数据迁移到使用分区存储时可见的目录。先通过Environment.isExternalStorageLegacy() (added in api 29)方法判断存储模式,再操作文件;

    在较低版本的Android系统中,当应用获得前台位置信息访问权限时,授权后,就能同时获取前台位置权限和后台位置权限(ACCESS_BACKGROUND_LOCATION)。

    Android 11中必须单独申请后台位置权限,而且,要先获取前台权限,再获取后台服务权限(顺序不能换)

    如果在没获取前台权限时就执行获取后台权限的代码会没反应,等获取前台权限(ACCESS_COARSE_LOCATION/ACCESS_FINE_LOCATION)之后,申请后台权限就会跳转到一个新的权限页面,必须选择Allow all the time (始终允许)才能获得后台位置权限。

    • 前台服务:如果应用以 Android 11 或更高版本为目标平台,在 Android 11 中,前台服务何时可以访问设备的位置信息、摄像头和麦克风发生了一些变化。

    如果应用在前台服务中访问摄像头或麦克风,则必须添加前台服务类型camera 和 microphone(foregroundType = “MicroXXX|camera”)。

    如果应用在后台运行时启动了某项前台服务,则该前台服务无法访问麦克风或摄像头。此外,除非您的应用具有在后台访问位置信息的权限,否则该服务无法访问位置信息。

    • 软件包可见性:当应用查询设备上已安装应用的列表时,系统会过滤返回的列表。原本调用 getInstalledApplications() 或 getInstalledPackages() queryIntentActivities()的地方会受到影响。

    查询特定软件包及与之交互

    如果你知道要查询或与之交互的一组特定应用,要将其软件包名称添加到 <queries> 元素内的一组 <package> 元素中:

    <manifest package="com.example.game">
        <queries>
            <package android:name="com.example.store" />
            <package android:name="com.example.services" />
        </queries>
        ...
    </manifest>

    在给定 intent 过滤器的情况下查询应用及与之交互

    如果不知道要添加的具体软件包名称,可以在 <queries> 元素中列出 intent 过滤器签名。应用就可以发现具有匹配的 <intent-filter> 元素的应用。

    以下示例允许应用看到支持 JPEG 图片共享功能的已安装应用:

    <manifest package="com.example.game">
        <queries>
            <intent>
                <action android:name="android.intent.action.SEND" />
                <data android:mimeType="image/jpeg" />
            </intent>
        </queries>
        ...
    </manifest>
    

    在给定提供程序授权的情况下查询应用及与之交互

    如果需要查询Content Provider 但不知道具体的软件包名称,可以在 <provider> 元素中声明该提供程序授权,如以下所示:

    <manifest package="com.example.suite.enterprise">
        <queries>
            <provider android:authorities="com.example.settings.files" />
        </queries>
        ...
    </manifest>

    查询所有应用及与之交互

    在极少数情况下,应用可能需要查询设备上的所有已安装应用或与之交互。系统会提供QUERY_ALL_PACKAGES  权限。

    下面列出了适合添加 权限的用例的一些示例:

    • 启动器应用
    • 无障碍应用
    • 浏览器
    • 点对点 (P2P) 共享应用
    • 设备管理应用
    • 安全应用

    文本消息框 API 变更

    以 Android 11 或更高版本为目标平台的应用会发现文本消息框受到以下负面影响:

    以下方法的返回值并不反映实际值,因此不应在应用中依赖于它们:

    以下方法是空操作,因此应用不应使用它们:

    应用打包和安装

    • 压缩的资源文件

    如果以 Android 11(API 级别 30)或更高版本为目标平台的应用包含压缩的 resources.arsc 文件(由aapt生成的所有apk资源(图标,字串等)的索引文件)或者如果此文件未按 4 字节边界对齐,应用将无法安装。如果存在其中任意一种情况,系统将无法对此文件进行内存映射。无法进行内存映射的资源表必须读入 RAM 中的缓冲区,从而给系统造成不必要的内存压力,并大大增加设备的 RAM 使用量。

    • 现在需要 APK 签名方案 v2

    对于以 Android 11(API 级别 30)为目标平台,且目前仅使用 APK 签名方案 v1 签名的应用,现在还必须使用 APK 签名方案 v2 或更高版本进行签名。用户无法在搭载 Android 11 的设备上安装或更新仅通过 APK 签名方案 v1 签名的应用。

    如需应用是否已使用 APK 签名方案 v2 或更高版本进行签名,可以在命令行中使用AS 或 apksigner 工具。

    兼容性测试

    可以在设备的开发者选项中查看当前已启用的变更,并且可以启用/停用这些变更。如需访问这些选项,请按以下步骤操作:

    1. 如果开发者选项尚未启用,先启用开发者选项。
    2. 打开设备的“设置”应用,然后依次导航到系统 > 高级 > 开发者选项 > 应用兼容性变更
    3. 从列表中选择您的应用。

     

    展开全文
  • 本文将重点介绍该版本特性中部分需要开发适配的部分。汇总自己踩过的坑以及百度所得,本文会持续更新。 背景:谷歌在GoogleI / O 2019发布了Android Q Beta X。对当前应用影响重大,急需适配。 API = 29;主要影响...

    本文将重点介绍该版本特性中部分需要开发适配的部分。汇总自己踩过的坑以及百度所得,本文会持续更新。

    背景:谷歌在GoogleI / O 2019发布了Android Q Beta X。对当前应用影响重大,急需适配。

    API = 29;主要影响分类:

    • 影响所有应用的行为变更(不管targetSdk是多少,对所有跑在Q设备上的应用均有影响)
    • 影响以 Android Q 为目标平台的应用的行为变更(targetSDK == Q ,且跑在Q设备上的应用才有影响)
    • 项目升级遇到的问题(这个没有实践过,怕误导大家,在此不讨论)

    影响所有应用的行为变更

    用户隐私权限变更:AndroidQ引入了大量更改和限制以增强对用户隐私的保护。具体变更如下:

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

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

    沙盒,简单而言就是应用专属文件夹,并且访问这个文件夹无需权限。
    谷歌官方推荐应用在沙盒内存储文件的地址为Context.getExternalFilesDir()下的文件夹。
    比如要存储一张图片,
    则应放在Context.getExternalFilesDir(Environment.DIRECTORY_PICTURES)中。
    • 操作自己APP的内部外部存储无需任何权限
      多媒体文件(照片,音频,视频)可以通过MediaStore进行操作。
      其他文件可以通过文件路径以及File API进行操作,应用卸载时,该目录会被清除。
    • 访问系统媒体文件:Q中引入了一个新定义媒体文件的共享集合,比如照片,音乐,视频等,需要申请新的媒体权限,READ_MEDIA_IMAGES,READ_MEDIA_VIDEO,READ_MEDIA_AUDIO,申请方法同原来的存储权限。
    • 访问系统下载文件:对于系统下载文件夹的访问,暂时没做限制,但是,要访问其中其他应用的文件,必须允许用户使用SAF(存储访问框架)来选择文件。
    • 访问其他沙盒的多媒体文件需要申请READ_EXTERNAL_STORAGE权限。                                                                                       必须使用MediaStore和ContentResolver来进行文件的访问和操作。
    • 访问其他沙盒的非多媒体文件,必须使用SAF(存储访问框架),也就是打开系统的文件选择器
    • SAF可以访问任何一个文件,而无需请求任何权限。

    2、定位权限:如果应用需要在后台时也获得用户位置,就需要动态申请ACCESS_BACKGROUND_LOCATION权限。

    与现有的 ACCESS_FINE_LOCATION 和 ACCESS_COARSE_LOCATION 权限不同,新权限仅会影响应用在后台运行时对位置信息的访问权。除非应用的某个 Activity 可见或应用正在运行前台服务,否则应用将被视为在后台运行。

    targetSDK <= P 应用如果请求了ACCESS_FINE_LOCATION 或 ACCESS_COARSE_LOCATION权限,Q设备会自动帮你申请ACCESS_BACKGROUND_LOCATION权限。

    3、不可重置的设备标识符限制:从 Android 10 开始,去掉了READ_PHONE_STATE权限,取而代之的是一个系统级别的权限:READ_PRIVILEGED_PHONE_STATE(只提供给系统app),只有拥有该权限才能访问设备的不可重置标识符(包含 IMEI 和序列号)。那么在Android Q平台,我们的应用也不会再有IMEI和序列号。

    受影响的方法:

    针对(targetSDK >= 29)的设备唯一标识符适配,谷歌官方有提供解决方案,但是ID可变。ANDROID_ID的获取一直不受影响,但可能由于机型原因返回null,两种方法半斤八两。目前没有很好的解决方案。取ANDROID_ID适配如下:

    public static String getDeviceId(Context context) {
        if (ActivityCompat.checkSelfPermission(context, Manifest.permission.READ_PHONE_STATE) != PackageManager.PERMISSION_GRANTED) {
            Log.e(TAG, "Have not permission to obtain DeviceId");
            return "";
        }
        if (Build.VERSION.SDK_INT >= 29) {
            return getAndroidId(context);
        }
        TelephonyManager telephonyManager = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
        return telephonyManager.getDeviceId();
    }

    4、禁止应用后台弹页面

    Android Q在开发者选项中:关闭允许系统执行后台活动开发者选项即可启用限制。只能通过用户的交互来打开活动如果存在该场景的应用(比如闹钟、语音、视频电话等),需要通过通知提醒的方式解决。

    5、关于minSDK警告:谷歌要求运行在Q设备上的应用targetSDK>=23,不然会向用户发出警告。

    在 Android Q 中,当用户首次运行以 Android 6.0(API 级别 23)以下的版本为目标平台的任何应用时,Android平台会向用户发出警告。如果此应用要求用户授予权限,则系统会先向用户提供调整应用权限的机会,然后才会允许此应用首次运行。

    影响以 Android Q 为目标平台的应用的行为变更

    非 SDK 接口限制:非SDK接口限制在Android P中就已提出,但是在Q中,被限制的接口的分类有较大变化

    非SDK接口介绍:为了确保应用稳定性和兼容性,Android 平台开始限制您的应用可在 Android 9(API 级别 28)中使用哪些非 SDK 接口。Android Q 包含更新后的受限非 SDK 接口列表(基于与 Android 开发者之间的协作以及最新的内部测试)。

    非SDK接口限制就是某些SDK中的私用方法,如private方法,你通过Java反射等方法获取并调用了。那么这些调用将在target>=P或target>=Q的设备上被限制使用,当你使用了这些方法后,会报错:

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

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

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

    但是一个大项目到底哪里使用了这些方法,靠review代码和看日志肯定是不现实的,谷歌官方也提供了官方检查器veridex用来检测一个apk中哪里使用了非SDK接口。veridex下载地址:https://android.googlesource.com/platform/prebuilts/runtime/+/master/appcompat,选择相应版本对应下载即可。

    下载解压后命令行cd到veridex目录下使用./appcompat.sh --dex-file=Q.apk即可自动扫描。Q.apk为包的绝对路径,如果包与veridex在相同目录下直接输入包文件名即可。扫描结果分为两部分,一部分为被调用的非SDK接口的位置,另一部分为非SDK接口数量统计。

    非SDK接口适配:如果您的应用依赖于非 SDK 接口,则应该开始计划迁移到 SDK 替代方案。如果您无法为应用中的某项功能找到使用非 SDK 接口的替代方案,则应该请求新的公共 API。

    官方要求targetSDK>=P的应用不使用这些方法,并寻找其他的公共API去替代这些非SDK接口,如果找不到,则可以向谷歌申请,请求一个新的公共API https://developer.android.com/distribute/best-practices/develop/restrictions-non-sdk-interfaces#feature-request (一般不需要)。

    项目中使用非SDK接口大概率有以下两种情况:

    • 在自定义View的过程中为了方便,使用反射修改某个参数。
    • 三方SDK中使用了非SDK接口(这种情况比较多)。

    第二种情况只能更新到最新的三方SDK版本,或者提工单、换库(也是整个适配过程中工作量最庞大的部分)。

    展开全文
  • 抢先看!安卓11新特性和适配攻略

    千次阅读 2020-08-10 20:09:13
    引言 近期,Google 发布了 ...本文将从分区存储、应用包可见性、权限变化和新功能四个方面来谈谈 Android 11 新特性,以帮助开发者更快速、更便捷地上手适配Android新系统。 作者| 个推高级安卓开发...
  • 摘要:论文简单介绍Android 平台特性,主要阐述了基于Android 平台简易即时通讯(IM)的作用和功能以及实现方法,复杂的通讯如引入视频音频等可以考虑AnyChat SDK。关键词:Android 平台;即时通讯   (本文中...
  • unity版本 unity2019.3.6 描述 本项目演示了如何将VRTK场景与Pico VR SDK集成。如下图所示,在Assets-VRTK中已经使用PicoSDKv2.8.5配置了七个场景,供参考。...这些特性可以在提供的VRTK演示场景中找到。另外,..
  • APT(Android Performance Testing Tools)安卓平台高效性能测试工具,适用于开发自测和定位性能瓶颈,测试人员完成性能基准测试、竞品测试。应用特性安卓应用性能测试(无需源代码,支持第三方应用,适合小白用户)...
  • 本文描述了与其它触屏手机系统和桌面系统不同的Android平台特性,这些特性需要更多的表现在我们开发的应用程序中,以保证这是一款 Android手机的应用。这些特性可能对于习惯了其它手机操作系统的用户可能有不习惯的...
  • Android 支持所有 Java 7 语言功能,以及一部分 Java 8 语言功能(具体因平台版本而异)。本文介绍您可以使用的新语言功能、如何正确配置项目以使用这些功能,以及您可能遇到的任何已知问题。注:在为 Android 开发...
  • XMPP的前身是Jabber,一个开源形式组织产生的网络即时通信协议。 XMPP目前被IETF国际标准组织完成了标准化工作。标准化的核心结果分为两部分; 核心的XML流传输协议 ...借助于XML易于解析和阅读的特性,使得XMPP的...
  • Android 5.0 (LOLLIPOP) 为用户和...要构建 Android 5.0 版应用,您必须先下载 Android SDK,然后使用SDK 管理器下载 Android 5.0 SDK 平台和系统映像。 要进一步针对运行 Android 5.0 的设备优化您的应用,请将t...
  • 前言java语言自从走入SE8版本就异常的让开发者感到兴奋,随之而来的rxjava系列等(相似于javaScript的...做为android平台的一名App开发者,若是咱们想在android App开发过程当中使用java8的新特性那可能就另当别论了...
  • 对于应用开发者而言,iOS平台和安卓平台往往需要兼顾,这样往往在开发了针对其中一个平台的应用后还需重新着手开发另一个平台的应用。不过现在,Intel的多操作系统引擎可能会帮助广大的Java开发人员解决这个问题。 ...
  • 前段时间Qt5.1正式版发布,支持Android和IOS的开发,强大的可移植性和跨平台特性非常的吸引人,并且使用C++。由于之前做过Qt在嵌入式平台的应用,所以顺便试试新版本的Qt如何,再看看Qt5.1 for Android是否足够优秀...
  • 安卓驱动是一款基于Andriod平台,连接电脑与手机的PC端软件安装工具,为您提供海量最新最火的安卓软件游戏一键飞速下载安装体验。小体积低消耗,简单易用,为您在电脑上打开一扇手机的窗口,是安卓手机用户首选必备...
  •  法国计算机专业学生弗洛伦特·里维斯特开发出一款被称作AsteroidOS的新开放源代码平台。  AsteroidOS并非以Android Wear为基础,而是一款基于Linux的可穿戴设备操作系统,开发之初特别考虑到了可移植性。...
  • 本文从安卓的定义、特性、架构、功能等角度介绍它。...Android SDK(Soft Development Kit)安卓的软件开发工具包提供了一些工具和必要的API使得可以使用java程序语言开始在安卓平台上开发应用程序。 特...
  • Android平台简介 安卓背景介绍 Android SDK提供了在JAVA平台下...安卓特性: 1.应用程序框架; 2.Dalvik虚拟机; 3.内部集成浏览器:基于开源的WebKit引擎; 4.优化的图形系统:自定义了2D图形库,3D图形库基于OpenG

空空如也

空空如也

1 2 3 4 5 ... 19
收藏数 373
精华内容 149
关键字:

安卓平台特性