android10_android10添加selinux - CSDN
精华内容
参与话题
  • 于此,将框架(Framework)和设计模式(Design Pattern)应用于Linux驱动开发,...其直接的益处就是:让我们能基于一致的设计理念来结合Android HAL与Linux两层的驱动开发,规划出整体和谐Android-based软硬整合产品架构。
  • Google I/O 2019开发者大会上,谷歌正式公布了安卓系统的全新版本Android Q,这一版本也被称作Android 10,是安卓的第十个主要版本。 现在的安卓已经在全球超25亿设备上激活运行,在手机上更是拥有了大...

    Google I/O 2019开发者大会上,谷歌正式公布了安卓系统的全新版本Android Q,这一版本也被称作Android 10,是安卓的第十个主要版本。

     

    安卓10终于来了,能吃上的果然只有这些手机!

     

     

     

    现在的安卓已经在全球超25亿设备上激活运行,在手机上更是拥有了大部分的市场份额。

    历经十余年时间,进化到第十个大版本的安卓如今都有怎样的能耐?

    安卓Q的新鲜功能

    诸多新功能中最令人瞩目的,当然是全新的手势操作:如今底部的虚拟按键简化成了极窄的导航条。操作也变成了从屏幕向上划是返回桌面,划得稍短一点则会在手机震动后进入多任务界面,而返回操作变成了从屏幕左右两侧向内划。

     

    安卓10终于来了,能吃上的果然只有这些手机!

     

     

     

    全新手势操作的出现,意味着安卓阵营在全面屏手机时代该如何进行操作有了一个定论,即是在MIUI上首次出现的全面屏手势。虽然并不是完全原创,但操作方便学习简单。

     

    安卓10终于来了,能吃上的果然只有这些手机!

     

     

     

    这也意味着在Android 9上短暂出现的“药丸”home键操作,在服役短短一年之后就告别历史舞台,不过对于国内的安卓用户并没有太大影响,大多数用户都随着手机厂商提前进入了全面屏手势操作。

    另一个肉眼可见的明显变化,是全局夜间模式。在此前曾出现过系统UI能变成深色的夜间模式,而在全局夜间模式中,支持夜间主题功能的应用也能随着系统一同变成深色,现在我们能看到变成深色的电话、短信、日历等应用。

     

    安卓10终于来了,能吃上的果然只有这些手机!

     

     

     

    在OLED屏开始在手机上流行的现在,全局夜间模式明显能帮助我们更省电更护眼地使用手机。至于还没有提供夜间主题支持的应用,系统中还加入了强制变暗的功能,可以将应用直接转换为深色界面。

    更进一步的权限管理此前已经在首个测试版初见端倪,现在可以像iOS那样,将应用获取定位的权限设置为尽在应用运行时可用。如此一来,不仅隐私管理可以更加安全,应用随意调取定位产生的耗电也能被遏制。

     

    安卓10终于来了,能吃上的果然只有这些手机!

     

     

     

    请求权限通知的弹窗也改变了交互逻辑,从原来的小区域横向放置,改为了大按钮纵向放置,一上一下区分允许和拒绝,就不会出现因为太近而被按错的情况。

    在访问无线网络时,可以设置为随机MAC地址。这样广告商就无法跟踪手机的固定MAC,也就无法根据你上网时的喜好来给你推送定制化广告。当然,想要从MAC地址知道你在哪的人,这下也得另寻他路。

     

    安卓10终于来了,能吃上的果然只有这些手机!

     

     

     

    应用通知得到了进一步简化,之前的版本中出现了应用通知分组和非常详细的通知设定项,但这对于普通用户来说未免有些眼花缭乱。现在直接改为了提醒我、静音通知和屏蔽三个大的选项,剩下的细节交给系统帮忙完成,可以说非常省心。

     

    安卓10终于来了,能吃上的果然只有这些手机!

     

     

     

    这样的通知设计也与国产定制系统和iOS中的通知收纳/静音设计类似,既保证了能够接收到应用通知,又不会让通知打扰到日常使用。正式版中会不会出现不重要通知收纳或是同应用通知重叠,还得看未来的版本。

    开发者选项中加入了主题设置项,可以对系统强调色、字体和图标样式进行修改。虽然系统还没有像壁纸那样提供显眼的入口,但可以想象,未来安卓将获得更方便更多样的“无痛化”界面自定义功能。对于想要在手机个性化有更多动作的用户,应该有福了。

     

    安卓10终于来了,能吃上的果然只有这些手机!

     

     

     

    还有一些交互上的优化,比如说分享界面更加易用,不仅唤起速度增快还能直接分享链接;Wi-Fi密码可以直接通过二维码分享;桌面上手滑删掉的快捷方式也能即时撤回;用安装包安装应用也只会弹出小窗口,而不是之前的全屏。

     

    安卓10终于来了,能吃上的果然只有这些手机!

     

     

     

    基于数字健康功能,新系统加入了专注模式。如同字面意义那样,通过对应用通知、使用时长等功能的切断,让你不再分心去使用手机专注于当前的工作。在定制系统上,我们或许能看到国产厂商本地化后的专注模式。

    谷歌还在Android Q藏了个小小的野心:桌面模式。在窗口化运行的基础上更进一步,允许手机连接屏幕显示出独立的桌面,还能多窗口同时允许多个应用。看起来吸收了Windows的设计思路,以及三星DeX和华为桌面模式、锤子TNT等的精髓。

     

    安卓10终于来了,能吃上的果然只有这些手机!

     

     

     

    桌面模式的出现,暗示着谷歌在桌面级登陆的野心。至于这份野心具体会是安卓与Chrome OS融合,或是再度推出安卓平板,还是Pixel 4将支持桌面模式输出,等到今年秋季就能有定论。

    Android Q还有机会得到可离线使用的小型化AI,谷歌已经在大会上现场展示。得益于被压缩到500MB左右的本地数据包,语音助理可以快速、精准地响应语音指令,不用等待与服务器沟通。甚至还支持随时的上下文沟通,不需要反复去说让人害羞的唤醒词。

     

    安卓10终于来了,能吃上的果然只有这些手机!

     

     

     

    虽然谷歌还没有推出相关产品,但Android Q也加入了对折叠屏的支持。无论是展开还是折叠,应用都能持续使用而不中断,仅有界面的大小发生变化。不过我们离折叠屏手机的时代还有相当的距离,未来还是个不定数。

    升级机型预测

    说完了Android Q的种种新功能,接下来让人关心的就是什么时候可以升级到新系统。

    首先是安卓阵营的领头人谷歌,目前谷歌旗下有Pixel系列手机,在拥有完整的最新版安卓系统特性的同时,还能得到谷歌的独家优化。

     

    安卓10终于来了,能吃上的果然只有这些手机!

     

     

     

    不出意外的话,Pixel全系列手机将随着Android Q在今年秋季的正式发布同时得到更新,想要最先体验到正式版肯定是首选Pixel。

    作为安卓阵营的重要OEM厂商,三星为旗下机型推送Android Q的时间可能会稍晚一些。按照往年的时间点,三星下半年旗舰Galaxy Note10会早于Android Q正式发布,所以这款手机不会出厂预装新系统。

     

    安卓10终于来了,能吃上的果然只有这些手机!

     

     

     

    从三星近几年的更新速度来看,Galaxy Note 10与Galaxy S10系列这两个2019年旗舰将会最先得到更新,之后是Galaxy Note9与Galaxy S9系列。待到明年年中,三星在今年主推的A系列等中低端手机,才会正式得到Android Q。

    华为在安卓厂商中,是提供系统更新相对积极的一家。由于下半年旗舰Mate系列发布时间都晚于Android Q正式发布,所以Mate 30系列有望预装基于Android Q的EMUI 10,之后推出的机型亦是如此。

     

    安卓10终于来了,能吃上的果然只有这些手机!

     

     

     

    Mate 20系列、P30系列等麒麟980处理器机型,有望在Mate 30系列发布会后第一时间得到更新。Mate 10系列和P20系列等麒麟970处理器机型则可能等到第二批,至于Mate 9系列等更老的机型以及中低端产品,则需要等待华为具体通知。

    荣耀的更新机型和具体时间可能与华为相近,Magic 2和荣耀V20、荣耀20系列为主的麒麟980处理器机型第一批得到Android Q更新,荣耀V10和荣耀10等麒麟970处理器机型稍晚,中低端机型也得依据具体通知来看。

     

    安卓10终于来了,能吃上的果然只有这些手机!

     

     

     

    小米近年来按照谷歌对厂商的要求,执行着一般提供两个大版本更新的策略。出厂系统基于Android 9的小米9系列和红米Note 7系列,还有即将发布的红米K20系列可能是最早升级Android Q的机型,目前小米9已经可以刷入预览版的原生Android Q。

     

    安卓10终于来了,能吃上的果然只有这些手机!

     

     

     

    小米8、小米MIX2S和小米6X等手机将迎来第二次大版本更新,而其余的中低端手机,小米可能会安排在更晚的批次来进行更新。

    OPPO目前已经有Reno得到了Android Q预览版适配,相信未来也能够得到基于ColorOS 6的正式版更新。今年一并上市的Reno 10倍变焦版以及去年底登场的R17系列,也有望得到新版安卓更新。

     

    安卓10终于来了,能吃上的果然只有这些手机!

     

     

     

    vivo也有X27可以刷入适配的Android Q预览版,未来或许会有X27 Pro、S1、S1 Pro、iQOO、X23、NEX以及NEX双屏版等机型得到更新,按照传统也会是基于最新版FuntouchOS定制。

     

    安卓10终于来了,能吃上的果然只有这些手机!

     

     

     

    魅族对于更新安卓大版本一事并不算很热情,但未来会上市的新机型有望预装Android Q,今年的新旗舰魅族16s或许也会有更新的可能性。

    一加则是对更新安卓版本有十足热情的品牌,前不久他们还为一加3、一加3T提供了Android 9更新。不过未来会更新Android Q的机型顺序可能会是即将发布的一加7、一加7 Pro,一加6和一加6T以及较老的一加5和一加5T。

    安卓10终于来了,能吃上的果然只有这些手机!

     

     

    努比亚得到Android Q更新的机型可能会是红魔3、红魔Mars、努比亚X和努比亚Z18。

    索尼旗下可能有Xperia 1、Xperia XZ3、Xperia XZ2 Premium、Xperia XZ2、Xperia XZ2 Compact、Xperia 10、Xperia 10 Plus等近两年推出的机型得到Android Q更新。

     

    安卓10终于来了,能吃上的果然只有这些手机!

     

     

     

    htc往年是更新安卓版本较为积极的厂商,但近年来经营不善,导致去年承诺更新Android 9的机型只有U12+、U12、U11+、U11 Life (Android One)。但在U12+国行版迟迟得不到更新的情况下,htc恐怕难有余裕为旧机型提供Android Q。

    联想虽然还没能回归主流手机厂商,但也会为手机提供安卓更新,使用骁龙855的Z5 Pro GT和Z6 Pro有望得到官方的Android Q更新。

     

    安卓10终于来了,能吃上的果然只有这些手机!

     

     

     

    moto的国际版系统都以轻定制版安卓为主,今年刚推出的G7系列,以及旗舰Z3和低端的E系列都有机会得到Android Q,基于Android One的moto One系列手机也同样如此。

    诺基亚同样选择了定制化不多的系统,不少机型也加入了Android One,所以近两年推出的机型如诺基亚X71、诺基亚8.1、诺基亚X6等都有机会在较快的时间内升级Android Q。

    安卓10终于来了,能吃上的果然只有这些手机!

     

     

     

    由于安卓并不是像iOS那样由单一厂商推出设备,所以各厂商的安卓手机并不能在同一时刻得到更新。而且由于各厂商的定制需要,系统更新的功能和时间也会有些许出入。

    想要体验到系统更新更快,功能更齐全或者是更适合自己的手机,就得多加考虑一番。

    展开全文
  • 关于Android 10.0适配,看这篇就够了

    万次阅读 多人点赞 2019-11-19 13:00:52
    本文将从三个角度介绍Android Q的部分适配问题,也是大家开发适配过程中大概率会遇到的问题: Q 行为变更:所有应用 (不管targetSdk是多少,对所有跑在Q设备上的应用均有影响) Q 行为变更:以 Android Q 为目标...

    本文将从三个角度介绍Android Q的部分适配问题,也是大家开发适配过程中大概率会遇到的问题:

    • Q 行为变更:所有应用 (不管targetSdk是多少,对所有跑在Q设备上的应用均有影响)
    • Q 行为变更:以 Android Q 为目标平台的应用(targetSDK == Q 才有影响)
    • 项目升级遇到的问题

    至于Q的新功能及SDK,项目中并没有涉及,故暂不介绍,只放出链接AndroidQ新API及功能。

    https://developer.android.com/preview/features

    Q行为变更:所有应用

    用户隐私权限变更

    AndroidQ引入了大量更改和限制以增强对用户隐私的保护。

    官方文档将这一部分内容独立于Q 行为变更:所有应用来介绍,是因为这一部分内容庞大且重要,个人认为Q的最大更新就是用户隐私权限变更。具体变更的权限如下:

    权限;   受影响应用;   如何启用(影响范围)

     

     

     

    存储权限

    访问和共享外部存储设备中的文件的应用

    adb shell sm set-isolated-storage on(下文详述)

    定位权限

    在后台时请求访问用户位置信息的应用

    这种权限策略在 Android Q 上始终处于启用状态

    从后台启动 Activity

    不需要用户互动就启动 Activity 的应用

    关闭允许系统执行后台活动开发者选项即可启用限制

    设备标识符(deviceId)

    访问设备序列号或 IMEI 的应用

    在搭载 Android Q 的设备上安装应用

    无线扫描权限

    使用 WLAN API 和 Bluetooth API 的应用

    以 Android Q 为目标平台

     

     

     因为从后台启动Activity权限和无线扫描权限两种权限的变更影响较少。本文不作详述,如有涉及请查阅官方文档。

    https://developer.android.com/preview/privacy/background-activity-starts

    从后台启动Activity权限变更仅针对与用户毫无交互就启动一个Activity的情况,(比如微信登陆授权)

    以下会着重介绍存储权限,定位权限和设备标识符三种权限的变更与适配。

    存储权限

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

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

    以下将按访问的目标文件的地址介绍如何适配。

    1. 访问自己文件:Q中用更精细的媒体特定权限替换并取消了 READ_EXTERNAL_STORAGE 和 WRITE_EXTERNAL_STORAGE权限,并且无需特定权限,应用即可访问自己沙盒中的文件。

    2. 访问系统媒体文件:Q中引入了一个新定义媒体文件的共享集合,如果要访问沙盒外的媒体共享文件,比如照片,音乐,视频等,需要申请新的媒体权限:READ_MEDIA_IMAGES,READ_MEDIA_VIDEO,READ_MEDIA_AUDIO,申请方法同原来的存储权限。

    3. 访问系统下载文件:对于系统下载文件夹的访问,暂时没做限制,但是,要访问其中其他应用的文件,必须允许用户使用系统的文件选择器应用来选择文件。

    4. 访问其他应用沙盒文件:如果你的应用需要使用其他应用在沙盒内创建的文件,请点击使用其他应用的文件,本文不做介绍。

    所以请判断当应用运行在Q平台上时,取消对READ_EXTERNAL_STORAGE 和 WRITE_EXTERNAL_STORAGE两个权限的申请。并替换为新的媒体特定权限。

    关于存储权限的(如何启用)影响范围

    模拟器

    在Android Q Beat1中,谷歌暂未开放存储权限的改动。我们需要使用adb命令

    adb shell sm set-isolated-storage on

    来开启模拟器对于存储权限的变更来进行适配。

    真机

    当满足以下每个条件时,将开启兼容模式,即不开启Q设备中的存储权限改动:

    1. 应用targetSDK<=P。
    2. 应用安装在从 Android P 升级到 Android Q 的设备上。

    但是当应用重新安装(更新)时,不会重新开启兼容模式,存储权限改动将生效。

    所以按官方文档所说,无论targetSDK是否为Q,必须对应用进行存储权限改动的适配。

    在我的测试中,当targetSDK<=P,在Q Beat1版上申请两个旧权限时会自动改成申请三个新权限,不会影响应用正常使用,但当targetSDK==Q时,申请旧权限将失败并影响应用正常使用。

    定位权限

    为了让用户更好地控制应用对位置信息的访问权限,Android Q 引入了新的位置权限 ACCESS_BACKGROUND_LOCATION。

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

    与iOS系统一样,Q中也加入了后台位置权限ACCESS_BACKGROUND_LOCATION,如果应用需要在后台时也获得用户位置(比如滴滴),就需要动态申请ACCESS_BACKGROUND_LOCATION权限。

    当然如果不需要的话,应用就无需任何改动,且谷歌会按照应用的targetSDK作出不同处理:

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

    设备唯一标识符

    从 Android Q 开始,应用必须具有 READ_PRIVILEGED_PHONE_STATE 签名权限才能访问设备的不可重置标识符(包含 IMEI 和序列号)。

    许多用例不需要不可重置的设备标识符。如果您的应用没有该权限,但您仍尝试查询标识符的相关信息。会返回空值或报错。

    设备唯一标识符需要特别注意,原来的READ_PHONE_STATE权限已经不能获得IMEI和序列号,如果想在Q设备上通过

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

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

    谷歌官方给予了设备唯一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的唯一性和持久性。

    经测试上述方法完全相同的手机有可能重复,网上还有其他方案比如androidID,但是androidID可能由于机型原因返回null,所以个人任务两种方法半斤八两。设备ID的获取一个版本比一个版本艰难,如果有好的方法欢迎指出。

    minSDK警告

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

    如果此应用要求用户授予权限,则系统会先向用户提供调整应用权限的机会,然后才会允许此应用首次运行。

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

    3.Q 行为变更:以 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

    其中有windows,linux和mac版本,对应下载即可。

    下载解压后命令行cd到veridex目录下使用./appcompat.sh --dex-file=Q.apk即可自动扫描。Q.apk为包的绝对路径,如果包与veridex在相同目录下直接输入包文件名即可。

    扫描结果分为两部分,一部分为被调用的非SDK接口的位置,另一部分为非SDK接口数量统计,例如:

    1. greylist: 灰名单,即当前版本仍能使用的非SDK接口,但在下一版本中可能变成被限制的非SDK接口
    2. blacklist:黑名单,使用了就会报错。也是我们项目中必须解决的非SDK接口
    3. greylist-max-o:在targetSDK<=O中能使用,但是在targetSDK>=P中被限制的非SDK接口
    4. greylist-max-p:在targetSDK<=P中能使用,但是在targetSDK>=Q中被限制的非SDK接口

    所以从适配Q的角度出发,除了greylist我们可以暂时不解决以外,其余三种类型的非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接口大概率有以下两种情况:

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

    第一种是好解决的,毕竟是我们自己写的代码。

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

    4.项目升级遇到的问题

    模拟器X86,项目中SO库为v7

    • 找到so库源代码,编译成x86
    • 如果so库只是某个功能点使用,对APP整体没大影响,就可以屏蔽特定so库功能或略过测试
    • 如果so库是项目核心库必须加载,也可使用腾讯云测,上面有谷歌亲儿子Q版本。腾讯云测有adb远程连接调试功能(我没成功过)。adb连不上也没关系,直接安装就行,云测上也可以直接看日志。
    • 至于inter的houdini我尝试研究过,理论上能安装在x86模拟器上让它编译v7的so库,但是由于关于houdini的介绍比较少也比较旧,建议大家时间不充裕的话就别研究了。

    Requires development platform Q but this is a release platform.

    由于目前Q是preview版,所以targetSDK==Q 的应用只能在Q设备上跑。

    INSTALL_FAILED_INVALID_APK: Failed to extract native libraries, res=-2

    这个错误是由于打包压缩so库时造成的,具体原因可见

    https://issuetracker.google.com/issues/37045367

    在AndroidManifest.xml的application节点下加入android:extractNativeLibs="true"

    可能有人加了上面代码还是不行,在app/build.gradle中的defaultConfig节点下加入

    packagingOptions{ 
          doNotStrip "/armeabi/.so" doNotStrip "/armeabi-v7a/.so" doNotStrip "/x86/.so" }

    Didn't find class “org.apache.http.client.methods.HttpPost"

    在AndroidManifest.xml的application节点下加入

    <uses-library android:name="org.apache.http.legacy" android:required="false"/>

    如果你的项目没有适配过android O或P,那么你需要注意:

    1. android O的读取已安装应用权限(对应用内自动更新有影响)
    2. android P的默认禁止访问http的API

    这两个版本的适配问题本文就不做详述,网上有很多详细的介绍。

    参考文献

    官方文档

    https://developer.android.com/preview

    出处:云栖社区 https://cloud.tencent.com/developer/article/1437956

    如果对您能有所帮助,请点个赞吧亲!!!

     

     

    展开全文
  • 北京时间2019年3月14日Google正式对外发布Android Q Beta 1及预览版SDK,这意味着安卓开发者们又即将迎来一年一度的新版本适配工作了。Android Q 为开发者们带来了许多新功能,如折叠屏增强项、新网络连接 API、全新...

    北京时间2019年3月14日Google正式对外发布Android Q Beta 1及预览版SDK,这意味着安卓开发者们又即将迎来一年一度的新版本适配工作了。Android Q 为开发者们带来了许多新功能,如折叠屏增强项、新网络连接 API、全新的媒体解码器、摄像头新功能、NNAPI 扩展、Vulkan 1.1 图形支持等等。2019/4 Beta2版本发布 ,5月份将会正式发布,本文将带大家对Android Q变更和新特性的详细解读。

    还有一点值得Android开发者注意的事件,华为应用市场在3.26日发布了一则公告,要求华为市场上的App在2019年5月底前完成Android Q版本适配工作并自检通过,针对未适配或在Android Q版本体验欠佳的应用,华为应用市场将在Android Q版本机型上采取下架、不推荐更新或屏蔽策略。


    一、Android Q 行为变更:所有应用

    官方文档将这一部分内容独立于Q 行为变更:所有应用来介绍,是因为这一部分内容庞大且重要,其中最大的更新就是用户隐私权限变更。具体变更的权限如下:

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

    从后台启动Activity权限和无线扫描权限两种权限的变更影响较少 ,本文就不做介绍,详细可以查看请查阅官方文档:https://developer.android.com/preview/privacy/background-activity-starts
    从后台启动Activity权限变更仅针对与用户毫无交互就启动一个Activity的情况,(比如微信登陆授权)。

    本文将重点讲述存储权限,定位权限和设备标识符三种权限的变更与适配。

    1.用户存储权限的变更

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

    以下将按访问的目标文件的地址介绍如何适配:

    1. 访问自己文件:Q中用更精细的媒体特定权限替换并取消了 READ_EXTERNAL_STORAGEWRITE_EXTERNAL_STORAGE权限,并且无需特定权限,应用即可访问自己沙盒中的文件。

    2. 访问系统媒体文件:Q中引入了一个新定义媒体文件的共享集合,如果要访问沙盒外的媒体共享文件,比如照片,音乐,视频等,需要申请新的媒体权限:READ_MEDIA_IMAGES,READ_MEDIA_VIDEO,READ_MEDIA_AUDIO,申请方法同原来的存储权限。

    3. 访问系统下载文件:对于系统下载文件夹的访问,暂时没做限制,但是,要访问其中其他应用的文件,必须允许用户使用系统的文件选择器应用来选择文件。

    4. 访问其他应用沙盒文件:如果你的应用需要使用其他应用在沙盒内创建的文件,请点击使用其他应用的文件,本文不做介绍。

    所以请判断当应用运行在Q平台上时,取消对READ_EXTERNAL_STORAGE和 WRITE_EXTERNAL_STORAGE两个权限的申请。并替换为新的媒体特定权限。

    当满足以下每个条件时,将开启兼容模式,即不开启Q设备中的存储权限改动:

    1. 应用targetSDK<=P。
    2. 应用安装在从 Android P 升级到 Android Q 的设备上。

    当应用重新安装(更新)时,不会重新开启兼容模式,存储权限改动将生效。
    所以按官方文档所说,无论targetSDK是否为Q,必须对应用进行存储权限改动的适配
    在测试中,当targetSDK<=P,在Q Beat1版上申请两个旧权限时会自动改成申请三个新权限,不会影响应用正常使用,但当targetSDK==Q时,申请旧权限将失败并影响应用正常使用。

    2.用户的定位权限的变更

    为了让用户更好地控制应用对位置信息的访问权限,Android Q 引入了新的位置权限 ACCESS_BACKGROUND_LOCATION

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

    与iOS系统一样,Q中也加入了后台位置权限ACCESS_BACKGROUND_LOCATION,如果应用需要在后台时也获得用户位置(比如滴滴),就需要动态申请ACCESS_BACKGROUND_LOCATION权限。

    当然如果不需要的话,应用就无需任何改动,且谷歌会按照应用的targetSDK作出不同处理:
    targetSDK <= P 应用如果请求了ACCESS_FINE_LOCATIONACCESS_COARSE_LOCATION权限,Q设备会自动帮你申请ACCESS_BACKGROUND_LOCATION权限。

    3.设备唯一标识符的变更

    从 Android Q 开始,应用必须具有 READ_PRIVILEGED_PHONE_STATE签名权限才能访问设备的不可重置标识符(包含 IMEI 和序列号)。
    如果您的应用没有该权限,但您仍尝试查询标识符的相关信息,会返回空值或报错
    设备唯一标识符需要特别注意,原来的READ_PHONE_STATE权限已经不能获得IMEI和序列。

    如果想在Q设备上通过使用以下代码获取设备的ID

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

    则执行以上代码会返回空值(targetSDK<=P)或者报错(targetSDK==Q)。且官方所说的READ_PRIVILEGED_PHONE_STATE权限只提供给系统app,所以这个方法行不通了

    谷歌官方给予了设备唯一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的唯一性和持久性。
    测试输出结果如下
    在这里插入图片描述

    经测试上述方法完全相同的手机有可能重复,网上还有其他方案比如androidID,但是androidID可能由于机型原因返回null,所以个人认为两种方法半斤八两。设备ID的获取一个版本比一个版本艰难,如果有好的方法欢迎指出。

    4.关于minSDK警告

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

    如果此应用要求用户授予权限,则系统会先向用户提供调整应用权限的机会,然后才会允许此应用首次运行。


    二、Android Q 行为变更:以 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
    其中有windows,linux和mac版本,对应下载即可。下载解压后命令行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接口大概率有以下两种情况:
    1. 在自定义View的过程中为了方便,使用反射修改某个参数。
    2. 三方SDK中使用了非SDK接口(这种情况比较多)。

    第一种是好解决的,毕竟是我们自己写的代码。第二种就头疼了,只能更新到最新的三方SDK版本,或者提工单、换库(也是整个适配过程中工作量最庞大的部分)。


    三、Android项目升级遇到的问题

    模拟器X86,项目中SO库为v7
    • 找到so库源代码,编译成x86
    • 如果so库只是某个功能点使用,对APP整体没大影响,就可以屏蔽特定so库功能或略过测试
    • 如果so库是项目核心库必须加载,也可使用腾讯云测,上面有谷歌亲儿子Q版本。腾讯云测有adb远程连接调试功能(我没成功过)。adb连不上也没关系,直接安装就行,云测上也可以直接看日志。
    • 至于inter的houdini我尝试研究过,理论上能安装在x86模拟器上让它编译v7的so库,但是由于关于houdini的介绍比较少也比较旧,建议大家时间不充裕的话就别研究了。
    Requires development platform Q but this is a release platform.

    由于目前Q是preview版,所以targetSDK==Q 的应用只能在Q设备上跑。

    INSTALL_FAILED_INVALID_APK: Failed to extract native libraries, res=-2

    这个错误是由于打包压缩so库时造成的,具体原因可见:https://issuetracker.google.com/issues/37045367
    在AndroidManifest.xml的application节点下加入android:extractNativeLibs="true"
    可能有人加了上面代码还是不行,在app/build.gradle中的defaultConfig节点下加入

    packagingOptions{ 
          doNotStrip "/armeabi/.so" doNotStrip "/armeabi-v7a/.so" doNotStrip "/x86/.so" }
    
    Didn’t find class “org.apache.http.client.methods.HttpPost"

    在AndroidManifest.xml的application节点下加入

    <uses-library android:name="org.apache.http.legacy" android:required="false"/>
    

    如果你的项目没有适配过android O或P,那么你需要注意

    android O的读取已安装应用权限(对应用内自动更新有影响)
    android P的默认禁止访问http的API


    参考文档:

    Android Q Beta开发者文档链接::https://developer.android.com/preview
    Android Q Beta镜像下载链接:https://developer.android.com/preview/download
    Android Q Beta 发布 blog:https://android-developers.googleblog.com/2019/03/introducing-android-q-beta.html
    非SDK接口:https://juejin.im/post/5afe50eef265da0b70262463

    展开全文
  • Android 10 发布

    千次阅读 2019-09-04 19:27:00
    Android 10 正式发布了,根据官网的介绍,聚焦于隐私可控、手机自定义与使用效率,此版本主要带来了十大新特性: 智能回复 使用机器学习来预测你在回复信息时可能会说些什么,这项功能在 Android P 中已经有...

    Android 10 正式发布了,根据官网的介绍,聚焦于隐私可控、手机自定义与使用效率,此版本主要带来了十大新特性:

     

    智能回复

    使用机器学习来预测你在回复信息时可能会说些什么,这项功能在 Android P 中已经有提供,但仅限于谷歌专用的应用程序。Android 10 中,它已经内置到整个通知系统中,并且不仅提供对信息的回复建议,还可以获得建议的操作。比如,如果朋友要你出去吃饭,你的手机会建议你发送回应短信,并且它还会在 Google 地图中直接显示位置信息。此功能也适用于 Signal 等消息应用。

    手势导航

    引入手势导航后,应用程序不仅可以实现全屏幕的内容显示,还能最大限度地减少系统导航键的可见程度,这对于当下主流的全面屏手机尤为重要。

    用户可以从左下角或右下角斜向滑动以启动 Google Assistant 助手,在触发的角落会有相应的 “小手柄” 指示器来作为视觉提示。

    另外,团队还为包含导航抽屉(Navigation Drawer)的应用增加了一个名为 peek 的动作:用户轻压屏幕边缘然后再向内划动,便可拉出应用抽屉页面。所有版本的 DrawerLayout 均提供 peek 支持,其中以 DrawerLayout 1.1.0-alpha02 的体验最优。

     

    暗黑主题

    Android Q 引入的另一项新功能是新系统暗黑主题,它适用于 Android 系统 UI 和 Android 设备上运行的应用。暗黑主题为开发人员带来许多好处,比如能够降低功耗、对于低视力和对强光敏感的用户来说可以提高屏幕内容可见度。

    Focus Mode

    这其实是新的消息控制方式,可以让用户专注于面前的一切,不会被其它应用分心。

    Live Caption

    此功能将自动向视频、播客和音频消息添加说明文字。这些说明是实时性和系统性,因此它们不限于特定的应用程序。Live Caption 文本框可以调整大小并在屏幕周围移动。Live Caption 不仅对那些发现自己处于音频无法选择的情况下的用户很有帮助,而且对听力障碍者来说也非常有益。

    Security Updates

    随着这一新功能发布,通过 Google Play Store,安全补丁将自动推送到手机更新应用,更新将在后台运行,并在下次重新启动设备时加载,而不必等待完整的操作系统更新。

    Location Controls

    Android 10 让用户更好地控制应用程序何时能够访问设备位置信息。在使用时,你可以选择只与应用程序共享位置数据。当你没有使用的应用程序访问你的位置时,你也会收到提醒,以决定是否继续分享。

     

    Family Link

    家长可以使用这一功能设定数字基本规则,如每日屏幕时间限制、设备关机时间、特定应用程序的时间限制等。他们还可以查看孩子们在设备上安装的应用程序,以及它们的使用情况。

    详情查看官方网站:

    https://www.android.com

    展开全文
  • Android10.0(Q)新特性和行为变更

    万次阅读 2019-04-10 18:13:36
    Android Q 还为开发者们带去了许多新功能,如折叠屏增强项、新网络连接 API、全新的媒体解码器、摄像头新功能、NNAPI 扩展、Vulkan 1.1 图形支持等等。2019/4 Beta2版本发布(点击查看Google官文),5月份将会正式发布...
  • Android 10正式版发布

    万次阅读 2019-09-04 18:30:49
    Android10的亮点 Android 10主要有三大亮点 Android 10走在移动创新技术的前沿,具有先进的机器学习技术,同时也支持新兴设备,例如折叠屏设备和5G设备。 Android 10主要提升了隐私性和安全性,使用了接近50...
  • Android 10正式版发布,看看都有哪些新特性

    万次阅读 多人点赞 2020-09-05 17:35:24
    谷歌在今年3月推出了Android 10.0的首个测试版,昨天,Android 10.0的正式版正式向外发布,而最先尝到新版本的自然是亲儿子Pixel手机...基于强大的多窗口支持,Android 10扩展了跨应用程序窗口的多任务处理,并在设...
  • Android TextView加上阴影效果

    万次阅读 多人点赞 2014-10-11 16:02:29
    废话不多说 字体阴影需要四个相关参数: ...1. android:shadowColor:阴影的颜色 2. android:shadowDx:水平方向上的偏移量 3. android:shadowDy:垂直方向上的偏移量 4. android:shadowRadius:阴影的范围
  • AndroidAndroid布局中实现圆角边框

    万次阅读 2013-09-21 00:43:08
    设置corners_bg.xml 设置边框圆角可以在drawable-mdpi目录里定义一个xml:  <corners android:topLeftRadius="10dp" android:topRightRadius="10dp" android:bottomRightRad
  • Android 版本号及对应的版本名

    万次阅读 2019-05-24 11:15:35
    android Q API 28 android 9.0 Pie 馅饼 API 27 android 8.1 Oreo 奥利奥 API 26 android 8.0 Oreo 奥利奥 API 25 android 7.1 Nougat 牛轧糖 API 24 android 7.0 Nougat 牛轧糖 API 23 an...
  • Android版本和API Level对应关系

    万次阅读 多人点赞 2014-10-09 11:35:54
    Platform Version API Level VERSION_CODE Notes Android 4.4 19 KITKAT Platform Highlights Android 4.3 18 JELLY_BEAN_MR2 Platform Highlights ...Android 4.2, 4
  • Android布局实现圆角边框

    万次阅读 热门讨论 2012-05-23 23:50:03
    这里用的是TableLayout布局的。先看效果图 下面看下布局文件 <LinearLayout xmlns:android=... android:layout_width="fill_parent" android:layout_height="fill_parent" andr
  • Android设置虚线、圆角、渐变

    万次阅读 多人点赞 2014-11-20 14:42:04
    有图又真相,先上图再说。 设置虚线: <shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="line" > android:dashGap="3dp" android:dashWidth="6dp
  • Android Selector 与 Shape 基本用法

    万次阅读 热门讨论 2011-07-20 15:39:40
    1:Selector drawable的item中可以有以下属性: android:drawable="@[package:]drawable/drawable_resource" android:state_pressed=["true" | "false"] android:
  • Android各版本对应的SDK和JDK版本

    万次阅读 2018-01-24 10:38:52
    一、Android各版本对应的SDK版本: 平台版本 SDK版本 版本名称 Android 8.0 26 Oreo Android 7.1 25 Nougat Android 7.0 24 Nougat Android 6.0 23 Marshmallow Android 5.1 22 ...
  • SDK版本和API level对应表 ... Android 9.0(Pie) 28 Android 8.1 (Oreo) 27 Android 8.0 (Oreo) 26 Android 7.1.1 (Nougat) 25 Android 7.0 (Nougat) 24 Android 6.0 (Marshm...
  • Android Studio 3.0找不到Android Device Monitor

    万次阅读 多人点赞 2018-05-29 12:55:22
    为什么Android Studio 3.0中找不到Android Device Monitor? 因为自Android Studio 3.0开始弃用Android Device Monitor,Android Developers官网上的原话是: Android Device Monitor is a standalone tool that...
  • Android API Level与sdk版本对照表

    万次阅读 2015-02-13 18:03:34
    API等级1:Android 1.0 API等级2:Android 1.1 Petit Four 花式小蛋糕 API等级3:Android 1.5 Cupcake 纸杯蛋糕 API等级4:Android 1.6 Donut 甜甜圈 API等级5:Android 2.0 Éclair 松饼 API...
  • 界面如上图所示
1 2 3 4 5 ... 20
收藏数 2,280,641
精华内容 912,256
关键字:

android10