谷歌針對(duì)的Q預(yù)覽版的特性分享,內(nèi)容涉及比較多。遺憾的是沒(méi)有提供PPT給參會(huì)者,如下內(nèi)容根據(jù)提綱與回憶整理,如有缺失敬請(qǐng)諒解。
適配Q重點(diǎn)歸納
- 限制后臺(tái)拉activity
- 非系統(tǒng)應(yīng)用無(wú)法獲取到IMEI
- 外部存儲(chǔ)的隔離存儲(chǔ);公共媒體文件的存儲(chǔ)
- 后臺(tái)地理位置權(quán)限
- 適配折疊屏
- 全屏手勢(shì)導(dǎo)航,應(yīng)用充分利用全面屏,建議應(yīng)用不要覆蓋系統(tǒng)手勢(shì),否則可能導(dǎo)致手勢(shì)沖突,影響用戶使用習(xí)慣
- 應(yīng)用使用黑色主題,靈活動(dòng)態(tài)變化
- Android Q,受限制的非SDK接口數(shù)量增多了
android Q發(fā)布時(shí)間表

1.后臺(tái)啟動(dòng) Acitvity 限制
禁止無(wú)用戶交互的后臺(tái)啟動(dòng)activity。
在后臺(tái),通過(guò)Notification也可以啟動(dòng)activity,但是通過(guò)alarm定時(shí)器無(wú)法啟動(dòng)activity。
允許Activity Starts的條件:
- 該應(yīng)用有可見(jiàn)的窗口,例如有一個(gè)activity在前臺(tái)
- 該應(yīng)用程序有一個(gè)activity在foreground task
- 可見(jiàn)的應(yīng)用程序綁定到應(yīng)用程序的service
- 可見(jiàn)的應(yīng)用程序發(fā)送該應(yīng)用程序的pending intent
- 系統(tǒng)發(fā)送該應(yīng)用程序的pending intent
- 系統(tǒng)發(fā)送broadcast到該應(yīng)用程序
- 系統(tǒng)綁定到應(yīng)用程序的服務(wù)
- 應(yīng)用程序與配套硬件設(shè)備相關(guān)聯(lián)
- 改應(yīng)用程序是Device Policy Controller
2.設(shè)備標(biāo)識(shí)符(deviceId)
從 Android Q 開(kāi)始,應(yīng)用必須具有 READ_PRIVILEGED_PHONE_STATE 簽名權(quán)限才能訪問(wèn)設(shè)備的不可重置標(biāo)識(shí)符(包含 IMEI 和序列號(hào))。
原來(lái)的READ_PHONE_STATE權(quán)限已經(jīng)不能獲得IMEI和序列號(hào),如果想在Q設(shè)備上通過(guò)如下代碼獲得設(shè)備ID,會(huì)返回空值(targetSDK<=P)或者報(bào)錯(cuò)(targetSDK==Q)。
((TelephonyManager) getActivity()
.getSystemService(Context.TELEPHONY_SERVICE)).getDeviceId()
IMEI 可以幫我們判斷用戶是否更換了設(shè)備。在 Android Q 里有沒(méi)有合適的替代方案?
Android 官方唯一標(biāo)識(shí)符最佳做法:https://developer.android.google.cn/training/articles/user-data-ids

3.Android Q 分區(qū)存儲(chǔ)
官方文檔:https://developer.android.google.cn/preview/privacy/scoped-storage
如下是Q Beta3版本的最新特性,目前網(wǎng)上大部分基于Beta1的存儲(chǔ)分區(qū)解釋有差異,以如下Beta3特性為準(zhǔn)。
外部存儲(chǔ)沙盒:
Android Q 在外部存儲(chǔ)設(shè)備中為每個(gè)應(yīng)用提供了一個(gè)“隔離存儲(chǔ)沙盒”(例如 /sdcard)。任何其他應(yīng)用都無(wú)法直接訪問(wèn)您應(yīng)用的沙盒文件。卸載APK時(shí)也會(huì)刪除SD卡沙盒內(nèi)的數(shù)據(jù),要想在卸載后保留文件,請(qǐng)將它們保存到MediaStore中.
訪問(wèn)自己文件:
當(dāng)應(yīng)用target Q時(shí),它會(huì)進(jìn)入分區(qū)存儲(chǔ)模式,這意味著它不再能直接訪問(wèn)/sdcard。嘗試直接訪問(wèn)將導(dǎo)致FileNotFoundException或EPERM錯(cuò)誤。
可以無(wú)需任何權(quán)限,直接訪問(wèn)應(yīng)用所屬沙盒目錄(例如Context.getExternalFilesDir()),要想訪問(wèn)沙盒目錄以外的文件,需要使用MediaStore或存儲(chǔ)訪問(wèn)框架SAF。
訪問(wèn)媒體文件:
要訪問(wèn)沙盒外的媒體共享文件,比如照片,音樂(lè),視頻等,需要通過(guò)MediaStore。MediaStore以外的文件需要通過(guò)系統(tǒng)的文件選擇器應(yīng)用來(lái)進(jìn)行訪問(wèn)。
所有應(yīng)用都可以在沒(méi)有任何權(quán)限的情況下為MediaStore提供內(nèi)容,但是要查看其他應(yīng)用提供的內(nèi)容,必須獲取READ_EXTERNAL_STORAGE權(quán)限。
Metadata:
android Q開(kāi)始,應(yīng)用需要獲取ACCESS_MEDIA_LOCATION權(quán)限才可以訪問(wèn)媒體文件的位置信息元數(shù)據(jù)。
MediaStore中的LATITUDE和LONGITUDE字段已廢棄,請(qǐng)使用ExifInterface來(lái)替代。
適配:
當(dāng)應(yīng)用target Q時(shí),默認(rèn)會(huì)開(kāi)啟分區(qū)存儲(chǔ)模式;Q以下,默認(rèn)情況下,應(yīng)用儲(chǔ)存方式將不會(huì)發(fā)生任何改變,依舊采用與舊版本 Android 系統(tǒng)相同的儲(chǔ)存機(jī)制。
主動(dòng)開(kāi)啟或關(guān)閉分區(qū)特性,使用allowExternalStorageSandbox標(biāo)簽:
<manifest ... >
<application android:allowExternalStorageSandbox="false" ... >
</application>
</manifest>
明年的下個(gè)版本,與target SDK級(jí)別無(wú)關(guān),所有應(yīng)用都要支持分區(qū)存儲(chǔ)。
4.Android Q 地理位置權(quán)限變更
Android 官方文檔:https://developer.android.google.cn/preview/privacy/device-location
新增位置權(quán)限:ACCESS_BACKGROUND_LOCATION
除非應(yīng)用的某個(gè) Activity 可見(jiàn)或應(yīng)用正在運(yùn)行前臺(tái)服務(wù),否則應(yīng)用將被視為在后臺(tái)運(yùn)行。如果應(yīng)用需要在后臺(tái)時(shí)也獲得用戶位置(比如滴滴),就需要?jiǎng)討B(tài)申請(qǐng)ACCESS_BACKGROUND_LOCATION權(quán)限。
targetSDK <= P 應(yīng)用如果請(qǐng)求了ACCESS_FINE_LOCATION 或 ACCESS_COARSE_LOCATION權(quán)限,Q設(shè)備會(huì)自動(dòng)幫你申請(qǐng)ACCESS_BACKGROUND_LOCATION權(quán)限。
5.非SDK接口限制
Android 官方文檔:https://developer.android.google.cn/preview/non-sdk-q#greylist-now-restricted
在 Android Q 中,受限制的非 SDK 接口數(shù)量更多了,建議您在開(kāi)發(fā)時(shí)選用相等功能的公開(kāi) SDK 接口。為了幫助您成功過(guò)渡,并防止應(yīng)用出現(xiàn)崩潰等問(wèn)題,僅當(dāng)應(yīng)用的目標(biāo)平臺(tái)為 Android Q 時(shí),這些限制才會(huì)生效。
| 名單 | 描述 | 影響 |
|---|---|---|
| 白名單 | 公開(kāi)SDK | |
| 淺灰名單 | 我們檢測(cè)到有應(yīng)用在使用的接口 | 允許訪問(wèn),可能加入警告或日志 |
| 深灰名單 (maxTargetSDK = P) |
"接近"淺灰名單的接口,并在android新版本中已經(jīng)增加了公開(kāi)替代接口 | 當(dāng)應(yīng)用的targetSDK在P或者更早時(shí),允許訪問(wèn),否則(Q以后)禁止訪問(wèn) |
| 黑名單 | 我們認(rèn)為沒(méi)有應(yīng)用在使用的非SDK接口 | 禁止訪問(wèn),拋出運(yùn)行時(shí)錯(cuò)誤 |
6.ART性能優(yōu)化
- 云端配置JIT熱路徑(僅支持google play)
從 Android Nougat 開(kāi)始,ART 便引入了熱代碼profile優(yōu)化機(jī)制,通過(guò)識(shí)別并預(yù)編譯頻繁執(zhí)行的代碼,達(dá)到縮短應(yīng)用啟動(dòng)時(shí)間的目的。為了進(jìn)一步加快應(yīng)用的啟動(dòng)速度,Google Play 現(xiàn)在除了 APK 文件之外,還會(huì)交付一套基于云的配置文件。它是一套已經(jīng)過(guò)匿名化處理的匯總 ATR 配置文件,允許 ART 在應(yīng)用開(kāi)始運(yùn)行之前就預(yù)編譯一部分代碼,這有助于顯著提升優(yōu)化進(jìn)程的整體效率?;谠频木幾g文件適用于所有應(yīng)用,而且運(yùn)行 Android P 或更高版本系統(tǒng)的設(shè)備目前已提供相關(guān)支持。 - 分代垃圾回收(Generational Garbage Collection)
在 ART 的并發(fā)復(fù)制垃圾收集器 (Concurrent Copying Garbage Collector) 中加入了分代收集機(jī)制 (Generational Garbage Collection)。分代算法可以將新生代的對(duì)象單獨(dú)收集出來(lái),這樣效率更高,而且與 full-heap GC 相比成本更小,釋放空間也十分可觀??傮w而言,引入分代算法后,ART 垃圾回收速度和 CPU 利用效率有了明顯提升,在減少垃圾的同時(shí),幫助應(yīng)用在低端設(shè)備上流暢運(yùn)行。
7.Jetpack 更新
Jetpack官方文檔:https://developer.android.google.cn/jetpack
主要更新:使用函數(shù)生成UI。
正常開(kāi)發(fā)界面是xml布局+code,二者耦合。使用jetpack可以用代碼生成UI,無(wú)需xml。
具體參看谷歌文檔,需要使用Kotlin進(jìn)行代碼生成UI。
8.折疊屏設(shè)備適配
折疊屏官方文檔:https://developer.android.google.cn/preview/features/foldables
折疊屏適配比較細(xì)化,主要是折疊、展開(kāi)時(shí),在onConfigurationChanged()做界面調(diào)整,支持拖拽等,請(qǐng)需要適配的APP模塊自行參閱谷歌文檔吧。
9.網(wǎng)絡(luò)連接API
- APP不能自行開(kāi)關(guān)wifi
- 設(shè)備管理APP才能調(diào)用網(wǎng)絡(luò)配置API
- Telephony、WiFi、藍(lán)牙的掃描API,必須獲取FINE LOCATION權(quán)限
10.全屏手勢(shì)導(dǎo)航
類(lèi)似于我們現(xiàn)在的全屏手勢(shì),建議今后采用原生實(shí)現(xiàn)邏輯;建議應(yīng)用不要覆蓋系統(tǒng)手勢(shì),否則可能導(dǎo)致手勢(shì)沖突。
11.深色主題
- 入口:設(shè)置—顯示—主題背景;下拉快捷鍵
- 針對(duì)OLED屏幕的話,深色主題可以省電。
12.通用系統(tǒng)映像介紹
GSI通用系統(tǒng)映像是未經(jīng)修改的 Android 開(kāi)源項(xiàng)目 (AOSP) 代碼編譯出的“純 Android”,是一個(gè)system.img,適用8.x后支持treble的機(jī)型。
GSI的意義:節(jié)約時(shí)間,提前適配。在沒(méi)有pixel手機(jī)刷Q Beta的情況下,可以使用完全支持treble的機(jī)器刷Q GSI,體驗(yàn)Q的新特性。
刷GSI步驟:(適用pixel,其他具體咨詢芯片商)
啟動(dòng)到 fastboot 模式,然后解鎖bootloader。
通過(guò)刷寫(xiě) vbmeta.img 停用驗(yàn)證啟動(dòng) (AVB):
$ fastboot --disable-verification flash vbmeta vbmeta.img-
清空系統(tǒng)分區(qū),然后將 GSI 刷寫(xiě)到系統(tǒng)分區(qū):
$ fastboot erase system$ fastboot flash system system.img
擦除用戶數(shù)據(jù):$ fastboot -w
重新啟動(dòng):$ fastboot reboot
官方文檔:https://source.android.google.cn/setup/build/gsi
13.Google Play 商店政策
- DexClassLoder:
GP允許使用動(dòng)態(tài)加載等代碼更新,但是jar、so必須經(jīng)過(guò)GP下發(fā),不能使用自己的服務(wù)器下發(fā)jar,也就是jar要經(jīng)過(guò)GP審核。 - 系統(tǒng)級(jí)permission:
GP政策中心上并沒(méi)有包含針對(duì)OEM APK的說(shuō)明,咨詢了谷歌的人,他們說(shuō)的也比較含糊,說(shuō)是針對(duì)OEM廠商上架APK發(fā)過(guò)說(shuō)明,針對(duì)OEM廠商APK的政策跟普通APK是不太一樣的。 - 咨詢GP政策的講師,說(shuō)放心用permission,有問(wèn)題及時(shí)申訴就行。申訴周期比較快,2個(gè)工作日內(nèi)會(huì)給答復(fù)。
14.其他更新點(diǎn)
- 19年下半年開(kāi)始,Google Play 將要求所有新應(yīng)用及更新將 targetSdkVersion 設(shè)置為 28 (Android 9 Pie)。除此以外,當(dāng)用戶首次運(yùn)行 API 低級(jí)低于 23 (Android Marshmallow) 的應(yīng)用時(shí),會(huì)受到來(lái)自 Android Q 的警告信息。
- 所有應(yīng)用必須滿足 64 位要求
- 新增Bubble,Q正式版本在開(kāi)發(fā)者選項(xiàng)中,未來(lái)浮動(dòng)窗口可用Bubble替代
- AI SDK (ML KIT)增強(qiáng)
- 通知優(yōu)化:自動(dòng)生成文本回復(fù),URL鏈接,其他deep links
- 系統(tǒng)分享框優(yōu)化:提升速度、改良外觀,增加描述信息和圖標(biāo)
- 隱私與安全
BiometricPrompt 是 Android 推出的統(tǒng)一驗(yàn)證框架,它能為生物識(shí)別提供層面的支持。
BiometricPrompt:https://developer.android.google.cn/reference/android/hardware/biometrics/package-summary
TLS 1.3 的支持。https://developer.android.google.cn/preview/features#tls-1.3
15.Bionic 庫(kù)和動(dòng)態(tài)鏈接器路徑變更
從 Android Q 開(kāi)始,多個(gè)路徑不再采用常規(guī)文件形式,而是采用符號(hào)鏈接形式。如果應(yīng)用一直以來(lái)依賴的都是采用常規(guī)文件形式的路徑,則可能會(huì)出現(xiàn)故障:
/system/lib/libc.so -> /apex/com.android.runtime/lib/bionic/libc.so
/system/lib/libm.so -> /apex/com.android.runtime/lib/bionic/libm.so
/system/lib/libdl.so -> /apex/com.android.runtime/lib/bionic/libdl.so
/system/bin/linker -> /apex/com.android.runtime/bin/linker
為了確保兼容性,新符號(hào)鏈接會(huì)基于舊路徑提供,例如 /system/lib/libc.so 現(xiàn)在是指向 /apex/com.android.runtime/lib/bionic/libc.so 的符號(hào)鏈接,等等。因此,dlopen(“/system/lib/libc.so”) 會(huì)繼續(xù)工作,但當(dāng)應(yīng)用嘗試通過(guò)讀取 /proc/self/maps 或類(lèi)似項(xiàng)來(lái)檢測(cè)已加載的庫(kù)時(shí),將會(huì)發(fā)現(xiàn)不同之處。這并不常見(jiàn),但我們發(fā)現(xiàn)一些應(yīng)用會(huì)將這種做法作為對(duì)抗黑客攻擊的一項(xiàng)舉措。如果是這樣,則應(yīng)該將新的 /apex/… 路徑添加為 Bionic 文件的有效路徑。
16.系統(tǒng)二進(jìn)制文件/庫(kù)會(huì)映射到只執(zhí)行內(nèi)存
從 Android Q 開(kāi)始,系統(tǒng)二進(jìn)制文件和庫(kù)會(huì)映射到只執(zhí)行(不可讀取)內(nèi)存,作為應(yīng)對(duì)代碼重用攻擊的安全強(qiáng)化技術(shù)。有意或意外讀入已標(biāo)記為只執(zhí)行的內(nèi)存段會(huì)拋出 SIGSEGV,無(wú)論此讀入行為是來(lái)自錯(cuò)誤、漏洞還是有意的內(nèi)存自省都不例外。
您可以通過(guò)檢查 /data/tombstones/ 中的相關(guān) tombstone 文件來(lái)確定崩潰是否由變更改所導(dǎo)致。與只執(zhí)行相關(guān)的崩潰包含以下中止消息:
Cause: execute-only (no-read) memory access error; likely due to data in .text.
要解決此問(wèn)題,開(kāi)發(fā)者可以通過(guò)調(diào)用 mprotect() 將只執(zhí)行內(nèi)存段標(biāo)記為“讀取+執(zhí)行”,例如用于執(zhí)行內(nèi)存檢查。不過(guò),我們強(qiáng)烈建議您事后將其重新設(shè)為只執(zhí)行,因?yàn)檫@樣可以更好地保護(hù)您的應(yīng)用和用戶。
對(duì) ptrace 的調(diào)用不會(huì)受到影響,因此 ptrace 調(diào)試也不會(huì)受到影響。
17.移除了應(yīng)用主目錄的執(zhí)行權(quán)限
以 Android Q 為目標(biāo)平臺(tái)的不受信任的應(yīng)用無(wú)法再針對(duì)應(yīng)用主目錄中的文件調(diào)用 exec()。這種從可寫(xiě)應(yīng)用的主目錄執(zhí)行文件的行為違反了 W^X。應(yīng)用應(yīng)該僅加載嵌入到應(yīng)用的 APK 文件中的二進(jìn)制代碼。
此外,以 Android Q 為目標(biāo)平臺(tái)的應(yīng)用無(wú)法針對(duì)已執(zhí)行 dlopen() 的文件中的可執(zhí)行代碼進(jìn)行內(nèi)存中修改。這包括含有文本重定位的所有共享對(duì)象 (.so) 文件。
18.Go 設(shè)備上的 SYSTEM_ALERT_WINDOW
在 Android Q(Go 版本)設(shè)備上運(yùn)行的應(yīng)用無(wú)法獲得 SYSTEM_ALERT_WINDOW 權(quán)限。這是因?yàn)槔L制疊加層窗口會(huì)使用過(guò)多的內(nèi)存,這對(duì)低內(nèi)存 Android 設(shè)備的性能十分有害。
如果在搭載 Android 9 或更低版本的 Go 版設(shè)備上運(yùn)行的應(yīng)用獲得了 SYSTEM_ALERT_WINDOW 權(quán)限,則即使設(shè)備升級(jí)到 Android Q 也會(huì)保留此權(quán)限。不過(guò),尚不具有此權(quán)限的應(yīng)用在設(shè)備升級(jí)后便無(wú)法獲得此權(quán)限了。
如果 Go 設(shè)備上的應(yīng)用發(fā)送具有 ACTION_MANAGE_OVERLAY_PERMISSION 操作的 intent,則系統(tǒng)會(huì)自動(dòng)拒絕此請(qǐng)求,并將用戶轉(zhuǎn)到設(shè)置屏幕,上面會(huì)顯示不允許授予此權(quán)限,原因是它會(huì)減慢設(shè)備的運(yùn)行速度。如果 Go 設(shè)備上的應(yīng)用調(diào)用 Settings.canDrawOverlays(),則此方法始終返回 false。同樣,這些限制不適用于在設(shè)備升級(jí)到 Android Q 之前便已收到 SYSTEM_ALERT_WINDOW 權(quán)限的應(yīng)用。