編者按:本文系 Google 的李寄超講師,在掘金技術社群主辦的《中美技術人才矽谷大講堂 | JTalk 掘金線下活動第六期》 活動上的分享整理。掘金 JTalk 目前已舉辦6期,每期 JTalk 會邀請垂直行業的優秀工程師來分享優秀的實踐經驗,技巧方法。旨在為開發者提供線下技術交流互動機會,幫助開發者成長。
李寄超現就職於 Android 開發團隊。畢業於弗吉尼亞大學,從事 Android 系統及軟體開發多年,曾在 Google Play 、 Search 和 Payment 負責多個專案,並多次參加展會推廣 Android 以及 Google Play 。熱衷於瞭解開發者以及推廣 Android 生態。
What's new in Android

我們先來簡單回顧一下今年 I/O Keynote 都講了什麼?
- Android Jetpack 完美相容 Kotlin 語言,可利用 Android KTX 大幅節省程式碼量,幫助開發者加快應用開發速度。
- Android App Bundle 在 Android Studio 中,現在可以構建包含任何裝置上應用所需一切的應用軟體包 — 支援所有語言、每種裝置螢幕尺寸以及每種硬體架構。然後,當使用者下載應用時,Google Play 全新動態交付將會只交付與使用者裝置匹配的程式碼和資源。
- Slices 是一種 Google 平臺上適用於各種不同 Android 版本的介面模板,可在您的應用中顯示一組豐富的動態互動內容。
- Actions 是 Android P 當中的新功能,可以提供一些很細微的關於 App 內部功能的提示。
- Android Studio 3.2 Canary 現已上線,大家有興趣的話可以試一下,包含了 Android App Bundle
- ML Kit
接下來,我們說一些在本屆 I/O 上沒有特別細講的 Android P 的功能。
通知

首先是通知,我們在 Android P 上做了許多通知上的優化,主要集中在 UI 上。一方面是圓角的優化,另一方面是過去的一些空隙會更大一些。此外我們還專門針對對話,也就是聊天的應用做了一些特別優化:你可以直接在通知中聊天,也可以直接在通知中放大檢視圖片。下一個是 Remote Input ,相當於你可以在裡面通知裡面設定快捷回覆語句然後直接傳送。另外我們還對通知中的動畫進行了優化,現在通知中的動畫可以無縫銜接。

圖上的這些程式碼大家不必刻意去記與背,我們對於聊天方面進行的一些優化,這裡有一個 create new person 和 create image message,最主要的是 MessagingStyle 可以表示出我們要加入一個怎麼樣的 message,這段程式碼從頭到尾寫起來既快捷又簡單。
通知攔截

之前經常有使用者向我們反映,有些通知會突然來很多,很煩人也不知如何去掉,所以我們在 Android P 中會讓使用者可以更方便的攔截通知,但這對於開發者來說並不是一個特別好的訊息。在此我們提醒開發者一定記得用 channels,即 Android O 開始的 notification channels,相當於所有通知不僅僅是來自於你的 App ,它可能來自於很多不同的方面。比方說有一個外賣 App ,它的通知內容可能包含賬單資訊、配送提醒,這些都是不同的類別,使用者可以自行選擇通知中顯示的內容類別,即自行選擇開啟/關掉 channels,而不必關掉整個 app 的所有通知。 但有一點大家要注意一下,Android P 中不再給使用者更加靈活自由地去關閉這些 notifications,所以大家更應該去用 channels。
“劉海”螢幕支援

Android P 對“劉海”螢幕是原生支援的,具體的API是 WindowInserts.getDisplayCutout() 。這個API會告訴你凹口形狀、大小以及位置。目前共支援四種劉海。

光學防抖

外接閃光燈支援

現在已在 CameraMetadata 中加入了對外接閃光燈的支援,在照相中能提供更好地支援。
多攝像頭支援

現在有的手機有兩個前置攝像頭,或者兩個後置攝像頭,我們現在提供API讓你將兩個攝像頭相連線變成一個邏輯攝像頭。假如兩個攝像頭不在一個焦距上,你可以將兩個攝像頭的焦距進行無縫銜接。可以通過 Session 和 Surface 共享,不必重新開始,從而減低整體延遲。
新的影像解碼器:ImageDecoder

ImageDecoder 相較於以前的 BitmapFactory 效能更加,支援的地方更多。AnimatedImageDrawable 可以直接顯示動圖。

這相當於是一個 createSource ,每一個因為都是 ImageDecoder,所以可以有 HeadProcessor 也可以有 PostProcessor,這些可以在解析的頭和尾進行相應的處理。具體解析詳見 Documentation。
媒體

我們現在開始原生支援 HDR VP9 。 HEIF 是一個比 JPEG 更有效率的圖片格式,它可以在同體積下比 JPEG 多一倍的畫素。
JobScheduler

舉個例子,在網路阻塞的情況下,JobScheduler 可以很智慧地暫緩上傳直到網路暢通。
Neural Networks API 1.1

我們在之前的1.0 版本基礎上增加了九個新運算,如果對這方面感興趣可以多加留意。
Kotlin + Jetpack


上方是原 Kotlin 程式碼和使用了 Jetpack 以後的程式碼。同時也不難看出,相較於 Java,Kotlin 的程式碼風格更加簡潔。
Baseline Distance

上圖的這兩個距離以往很難調整,因此我們引入了 Baseline Distance。

以上方這段程式碼距離,只靠兩行程式碼就把之前令人頭疼已久的行距問題。
Magnifier 放大鏡

Magnifier 實現起來非常簡單,具體程式碼如下。

加強隱私保護

在 Android P 之後,程式如果處在後臺,是無法使用麥克風、攝像頭和感應器的。相當於給麥克風空白音,防止不良應用在後臺竊聽;攝像頭在後臺,會報錯 GeneralError 無法連線。加強隱私保護是 Android P 中一個相當大的核心。
電耗優化

我們在 Android P 中對電耗也進行了相應優化,最主要的兩個新功能,一個是應用後臺限制,另一個是應用待機分組。

在 Activity Manager 中,開發者可以找到自己的應用是否被使用者限制。

這四個分組是根據使用者的習慣,系統來決定把應用放進哪個組。

私有API

私有 API 在Android P 中非常重要,可能會影響到各位開發者。 一些私有 API 為實現公開SDK 文件中未實現的功能,很多會用反射或者其他原理來呼叫這些私有 API 。這些私有 API 最大的問題在於每次 Release 的時候,比如 Android N 到 Android O,或是 Android O 到 Android P,由於它們並沒有在官方文件中出現。所以對於這些私有 API ,我們預設認為 API 不再在指示範圍之內,可以任意地修改,或者這些 API 直接消失。這代表著每次使用者升級時,這些應用都會莫名其妙的崩潰,那這個對於使用者和開發者來說,都是一件不好的事情,開發者還需重新測試。 所以從 Android P 開始,我們會逐步限制私有 API 的使用,希望大家儘快將 私有 API 轉成公有 API 。

我們在 VM 中做了一些修改,會辨別是在呼叫私有 API ,如果是系統或者系統應用的話可以放行;如果是第三方應用而非系統/系統應用,若觸發黑名單規則會直接崩潰。此外還有兩個名單,即淺灰名單和深灰名單。希望大家以後在使用淺灰名單中那些沒有可被公有 API 替換的私有 API 時,給我們 Android 團隊以反饋。對於深灰名單,為針對應用相容, targetSDK 小於 Android P 系統的會提示系統警告,大於的則按黑名單處理。
Target SDK 遷至26

希望大家能儘快進入 Target SDK 進行更新。
以上就是我今天的分享,謝謝大家!

《中美技術人才矽谷大講堂 | JTalk 掘金線下活動第六期》 分享整理合集
Android P 新特性大起底 - 李寄超 | JTalk 第六期