Android 9 pie更新內容
Android 9 pie更新內容
1.非sdk介面限制
白名單: adroid sdk
黑名單: 只能被Android系統和系統應用呼叫,無論targetsdkversion都禁止使用,對開發者來說相當於沒有這些介面
深灰名單: 沒有發現應用在使用,但我們覺得有潛在的可能性,當targetsdkversion<p時可以使用,否則禁止使用
淺灰名單: 已有應用在使用的非sdk介面,仍然可以繼續使用,將來可能會提供相應的sdk介面當>=p時系統會提示警告
如果你想測試自己應用是否使用了非sdk介面
1.logcat中檢視
2.靜態掃描工具Veridex
2.凹口螢幕
1.不要給狀態列指定的高度,用windowinsetscompat獲取狀態列高度
2.注意螢幕大小和顯示區域差異,用view.getLcationInWindow,不要用view.getLocationOnScreen,處理montionevent時,用getx/gety,而不是getrawx/getrawy
3.凹口可以在中間或者靠邊,只會在螢幕短邊出現,兩條短邊都有缺口
3.螢幕旋轉鎖定
在Android9上螢幕旋轉的介面可以設定為縱向和橫向,這個設定取決於使用者給activity設定的screenOrientation,不要假設裝置旋轉鎖定時必定縱向
4.應用空閒時無法訪問麥克風,攝像頭和感測器
Android p限制所有處於空閒的應用對麥克風,攝像頭和所有sensorManager感測器的訪問。當應用的uid空閒,麥克風將報告系統“無音訊訊號”,感測器會停止報告事件,使用的攝像頭也會斷開連線
5.後臺服務限制
targetsdk>26的應用沒有在前臺顯示,那麼後臺服務就會受到系統限制。如果需要長期執行的服務應該遷移到前臺服務,或者用workmanager和jobscheduler
6.前臺服務限制
targetsdk時p版本後,使用前臺服務必須申請FOREGROUND_SERVICE許可權,這個時一般性許可權,放在manifest中聲明後系統會自動授權。如果沒有這個,系統會丟擲securityException
7.inline函式檢查
在android p中,如果呼叫某個inline方法的類和inline方法所在的類由不同的classloader載入,就會主動發起abort(inline不允許跨dex檔案),導致應用crash。應該儘量避免用不同的classloader載入相關類,因為被呼叫類的方法可能已經被inline了
應用不相容的常見原因
1.使用了系統的classloader載入org.apache.http.*的庫
2.沒有相容Android p的加固服務
3.直接呼叫dex2oat
4.使用了非sdk介面
5.使用了不相容的第三方庫
8.後臺位置限制
後臺應用每小時只能接收幾次位置更新,前臺應用不受影響。
解決方式
1.用地理圍欄geofence
2.用位置批處理locationService.setMaxWaitTime()
3.被動獲取位置資訊locationService.setFastersInterval()
9.隱式廣播限制
無法繼續在清單中為隱式廣播註冊廣播接收器,清單中顯示註冊仍然有效,使用context.registerReceiver()註冊隱式廣播接收器仍然有效
解決方式
1.使用高優先順序FCM訊息
2.使用workmanager來安排一個作業
10.多顯示器支援
指定activity在哪個顯示器啟動,activityOptions.setLaunchDisplayId
activity在顯示器之間切換時自動更新屬性
不要假設暫停的activity一定不可見
11.包名重構
之前的v4和v7之類的包現在都放在androidx.*中Android 9 pie更新內容