Android 9.0 Pie(派),9.0适配

   Android9.0的预览版。2018年 8 月 7 日上午,Android9.0的正式版正式命名为派(Pie)。首批测试手机,具体型号如下:Google Pixel/Pixel XL/Pixel 2/Pixel 2 XL,Essential Phone PH-1、一加6、小米MIX 2S、OPPO R15 Pro、vivo X21/X21、索尼Xperia XZ2、诺基亚7 Plus。

   2018年2月,Android 9.0的初步代号定为Pistachio Ice Cream,中文暂译为开心果冰淇淋。
   Google I/O开发者大会的时间:确认将在2018年5月8日在美国加州山景城海岸线圆形剧场举办。而且还暗示性的提到即将发布的Android 9.0很有可能命名为Pineapple cake,也就是菠萝蛋糕,到时可能会涉及GooglePay、Android即时应用、AndroidKTX、Android Kotlin开发和入门,以及Android、AndroidappsforCromeOS、AndroidWear的最新进展。

    安卓9.0三大特性曝光用户体验全面升级:首先,就是安卓9.0系统将由谷歌进行统一推送;再次,加入ProjectTreble模式;最后,系统更加封闭。支持刘海屏。

-- Android P刘海屏适配
 谷歌提供的刘海屏适配方案,要求应用必须适配到P版本才可使用。请参考:https://developer.android.com/preview/migration.html ,https://developer.android.com/preview/features

-- Android P

1. 突破 Android P 非公开 API 限制- https://infoq.cn/article/2018/04/Android-P-API
2. 另一种绕过 Android P以上非公开API限制的办法- http://weishu.me/2019/03/16/another-free-reflection-above-android-p/
3.理解Android P内部API的限制调用机制- http://gityuan.com/2019/01/26/hidden_api/
第一篇较为科普;第二篇在一定知识储备条件下,可以看到也是一种比较深入的探索;第三篇为纯原理佐证。

说了三个方法,大致可以分为:
 1.不用反射;
 2.利用上文的怎么 check?把自己伪装成系统类;
 3.利用上文的怎么 check?去掉字段上的hidden标识;

-- 9.0适配

安卓6.0到9.0适配- https://mp.weixin.qq.com/s/K9eIN0veW96sjXoczHms5w

-- Android P
A library that lets you use reflection without any restriction above Android P- https://github.com/tiann/FreeReflection/

另一种绕过 Android P以上非公开API限制的办法- http://weishu.me/2019/03/16/another-free-reflection-above-android-p/
一种绕过Android P对非SDK接口限制的简单方法- http://weishu.me/2018/06/07/free-reflection-above-android-p/
理解Android P内部API的限制调用机制-http://gityuan.com/2019/01/26/hidden_api/
  每一次Android大版本的升级,往往会有大量的APP出现兼容性问题,导致这个情况的主要原因是由于APP的热修复SDKs以及依赖Android internal API(内部API),也就是非SDK API。这些API是指标记@hide的类、方法以及字段,它们不属于官方Android SDK的字段与函数。越来越多的 API 被加入了黑名单。
  Google希望未来Android大版本升级,APP都能正常运行,而很多APP对内部API的调用通过反射或JNI间接调用的方法来调用,破坏兼容性。 为此Google从Android P开始限制对内部API的使用,继续使用则抛出如下异常。
  Android 7.0对Native的NDK的调用限制是手铐,而Android 9.0对Java层SDK的调用限制就是脚铐。
  Android 7.0针对Native lib引入了namespace来限制平台lib对外的可见性,普通APP在Android N上不能直接调用系统私有库,Android系统允许调用的公用库定义在public.libraries.android.txt。 这个feature只针对target SDK为24及以上的APP。
  Android 7.0限制对C/C++代码的NDK,Android 9.0限制对Java的SDK。这一以来APP想利用内部API搞黑科技的难度以及不稳定性都会有所增加。
  Android P限制APP对内部API的调用,而内部API只能通过反射或JNI间接调用,那么限制机制必然是在反射和JNI方法调用链中插入判断逻辑。

-- Android 9 PrecomputedText
 Android 9 官方极致优化 PrecomputedText .PrecomputedText 如字面意义一样,是用来预先计算文本的。它的诞生也是因为计算文本是一个耗时操作,它需要根据字号、字体、样式、换行等去计算,并且这个计算时间随着文字数量的增加而增加。如果这时显示的列表中恰好是这种多行的文字,那么滑动起来岂不是会掉帧,影响着用户体验。比如微博这类的产品,列表就非常的复杂。
Future<PrecomputedTextCompat> future = PrecomputedTextCompat.getTextFuture(
                    “text”, textView.getTextMetricsParamsCompat(), null);
textView.setTextFuture(future);

 Android 4.0 中底层就有引入TextLayoutCache来解决这个问题,每个测量过的文字都被添加到缓存中,下次需要相同的文字时,可以从缓存中获取,不用在测量。不过缓存大小只有0.5 MB。并且在没有缓存之前,我们的首次滑动还是UI线程耗时的。
 不要滥用PrecomputedText,对于一两行文字来说并没有很大的提升,反而会造成不必要的Scheduling delay,建议文本200个字符以上使用。
 不要在TextViewCompat.getTextMetricsParams()方法后修改textview的属性。比如设置字号放到前面执行。
 PrecomputedTextCompat在9.0以上使用PrecomputedText优化,5.0~9.0使用StaticLayout优化,5.0以下的不做处理。
 如果您已禁用RecyclerView的预取(Prefetch),则PrecomputedText无效。如果您使用自定义LayoutManager,请确保它实现 collectAdjacentPrefetchPositions()以便RecyclerView知道要预取的项目。因此ListView 无法享受到PrecomputedText带来的性能优化。

-- Android 9.0 http无法访问网络问题
Android 9.0网络权限适配- https://blog.csdn.net/Liu_ser/article/details/86640849
  谷歌将在Android P中砍掉SIM卡状态中dBm/asu数值显示功能所做的配套。
  Google表示,为保证用户数据和设备的安全,针对下一代 Android 系统(Android P) 的应用程序,将要求默认使用加密连接,这意味着 Android P 将禁止 App 使用所有未加密的连接,因此运行 Android P 系统的安卓设备无论是接收或者发送流量,未来都不能明码传输,需要使用下一代(Transport Layer Security)传输层安全协议,而 Android Nougat 和 Oreo 则不受影响。

 1.原来9.0系统已经默认不支持http请求了,谷歌默认要求链接是加密链接了,要解决这个问题有几种方案,第一个是把http改成https,这个要让后台更改(APP改用https请求)
 2.还有一个就是把targetSdkVersion 改成27或者以下。
 3.还有一个方案就是在res目录添加一个xml文件夹,新建一个xml 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"?>
<network-security-config>
    <base-config cleartextTrafficPermitted="true">
        <trust-anchors>
            <certificates src="system" overridePins="true" />
            <certificates src="user" overridePins="true" />
        </trust-anchors>
    </base-config>
</network-security-config>

然后在Application中引用
<application
...
 android:networkSecurityConfig="@xml/network_security_config"
...
    />

<uses-permission android:name="android.permission.INTERNET"/>

> Android 9.0 新特性
 -- 新功能
Android 9.0的新功能包括:谷歌统一推送升级、深度集成Project Treble模式、更加封闭、原生支持通话录音等。
 1.全面屏的全面支持 
 2.通知栏的多种通知 
 3.多摄像头的更多画面  
 4.GPS定位之外的WiFi定位 
 5.网络还有神经网络 
 6.Material Design迎来2.0时代  

 7.数字化健康 
 8.自适应功能
 -- 新设计
Android 9.0将会新增支持类似于iPhone X的刘海屏设计,具体体现为优化屏幕内容显示,能够让系统或者应用充分利用整块屏幕,尤其是两只“猫耳朵”位置。在Android 9.0系统当中,谷歌还会进一步将谷歌助手集成到应用中、进一步优化电池续航、支持多屏和可折叠屏等。  
 -- 新特性
 1.全局黑夜模式
 2.为具备Always-on display(屏幕常显)功能手机加入原生的天气支持。

> Android P 9.0特性
 1. PrecomputedText, 文本展示非常复杂,其涵盖的特性有:多种字体、行间距、字间距、文本方向、断行、字符连接等。为了测量及布局给定文本,TextView 必须做很多工作,例如读取字体文件、查找字形、决定形状、测量边界框以及将文本缓存在内部文本缓存中。更重要的是,所有这些工作都在 UI 线程中进行,这就有可能导致 app 帧数下降。新的 API: PrecomputedText。该 API 早先在 API 14中便可以通过 PrecomputedTextCompat 访问。
 2. 放大器(Magnifier), Android P 推出了文本放大器,以提升文本选择方面的用户体验。由于该放大器提供了可以在文本上方拖拽的文本放大面板,所以有助于用户精准地定位光标或文本选择手柄。放大器有3种主要方法:show、update 及 dismiss。例如,您可以在实现定制视图onTouchEvent 处理时调用这些方法。这样放大器就可以跟随用户在屏幕上的手指移动。
 3. Smart Linkify, Linkify 类自 API 1以来一直存在,它允许运用正则表达式为文本添加链接。除此之外,它会调用 WebView 的实例来查找物理地址,这样可能会降低请求链接的 app 的性能。为了能提供更准确的链接,尤其对于国际化文本,以及消除 WebView 造成的性能降低,我们创建了 Smart Linkify。它可以通过 TextClassifier API 进行访问。
  Smart Linkify 使用机器学习算法及模型识别文本中的实体。这种方式提高了实体识别的可靠性。Smart Linkify 可以根据实体类别来对用户可采取的操作提出建议。比如,如果Smart Linkify 识别到电话号码,便会给出建议,比如发送文本短信、打电话或添加到通讯录。
 4. 行高及基线文本对齐, 有时设计者提供给开发者的布局参数与现有的 TextView 属性不完全匹配。在 Android P 及 Jetpack 中,我们增加了三个属性及其相应方法,以弥合由设计者与开发者工作方式的不同带来的分歧。
  在 Android P 之前,行间距可以由 lineSpacingExtra 及 lineSpacingMultiplier 属性控制。然而,设计者通常会使用一个简单的行高来设置这些值。为此,在 Android P 上,我们增加了 lineHeight 属性以设置文本行高,即行顶部与底部之间的间距(或两个连续的基线之间的间距)。实际上,该属性利用及更改了现有的 lineSpacingExtra 及 lineSpacingMultiplier 属性。
  设置基线文本对齐, 为控制首行及末行基线与视图边界之间的间距,我们增加了两个新属性: firstBaselineToTopHeight 与 lastBaselineToBottomHeight。
firstBaselineToTopHeight: 设置 TextView 的上边界及 TextView 的首行基线之间的间距。该属性实际上更改的是顶部边距。
lastBaselineToBottomHeight: 设置 TextView 的下边界及 TextView 的末行基线之间的间距。该属性实际上更改的是底部边距。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值