API level targeting to 28,準備好了嗎?

  • 2019 年 10 月 10 日
  • 筆記

【前言】

小編負責的地圖手錶項目,和Google合作,需要儘快完成targetsdk升級的適配測試工作。

Google Play的目標API級別要求:Google Play 要求新應用(自2019年8月1日起)和應用更新(自2019年11月1日起)將目標API級別至少設為28(至少為Android9.0)。小編對主要的行為變更進行了學習和測試準備

【1. 限制 HTTP 網路請求】

說明

Android9.0中限制了HTTP(明文傳輸)網路請求,若仍繼續使用HTTP請求,則會在日誌中提示異常。

測試

(1). app應用請求

理論上都換成https,如有抓到http,需和開發確認,Android9.0限制了明文流量的網路請求,非加密的流量請求,都會被禁止掉。

測試,需覆蓋所有模組直接和服務交互的請求(參照項目功能模組list)

(2). app應用涉及下載任務的模組

例如地圖項目:離線地圖、離線導航、導航音色包(語音廣場)、樣式文件、模板包

(3). 應用內置的己方的sdk

例如地圖項目:mapsdk、定位sdk、mapmatch、pushsdk、導航引擎sdk、數據引擎sdk、搜索引擎sdk

(4). 第三方的sdk

例如地圖項目:分享、登錄註冊、滴滴打車

(5). wap頁面

例如:webview打開圖片等、常見問題及幫助等

(6). 應用服務端支援

如果仍有部分介面數據沒完全轉成https,需要一個類似通配符,允許所有的http流量。

【2. 棄用 Apache HTTPClient】

說明

官方在Android 9.0 中,移除了所有 Apache HTTP Client 相關的類。

測試

覆蓋應用中的各種請求,生效性,尤其是下載相關模組(離線資源、語音包等)

覆蓋第三方庫,涉及請求的模組,功能正常

sdk,是否有使用http客戶端,如有使用,會找不到該庫,拋出異常

分享sdk,如qq分享sdk、微信分享等

注意:有上傳圖片,需要介面回調的模組

【3. 限制非SDK介面的調用】

3.1 說明

為幫助確保應用穩定性和兼容性,此平台對某些非SDK函數和欄位的使用進行了限制;無論您是直接訪問這些函數和欄位,還是通過反射或JNI 訪問,這些限制均適用。在Android 9中,您的應用可以繼續訪問這些受限的介面;該平台通過toast和日誌條目提醒您注意這些介面。如果您的應用顯示這樣的toast,則必須尋求受限介面之外的其他實現策略。

3.2 官方對非 SDK 介面的分類

共分為三類:黑名單、灰名單、白名單。其中灰名單又被分為淺灰名單和深灰名單。(非受限灰名單中的非SDK 介面稱為淺灰名單,而受限灰名單中的非 SDK 介面稱為深灰名單)

(1). 白名單(Whitelist)

此列表中的介面已在 Android 框架軟體包索引中正式記錄,它們是受支援的介面,沒有任何訪問限制,可以自由使用。

(2). 灰名單(light-greylist和dark-greylist)

light-greylist(淺灰名單):對於此名單中的非SDK 介面,官方暫未找到可替代的 SDK 介面,因此開發者仍可繼續訪問(如果targetSdkVersion 大於等於28時會出現警告)。dark-greylist(深灰名單):targetSdkVersion小於28時仍可繼續使用此名單中的介面,但會出現警告提示;大於等於28時,這些介面將會限制訪問。

(3). 應用內置的己方的sdkblacklist(黑名單):

無論targetSdkVersion 為多少,只要應用運行在Android 9.0 平台上,訪問此名單中的任何一個介面都會受限(系統就會拋出錯誤)

3.3 應用嘗試訪問黑名單中的非 SDK 介面時可能會出現的預期行為

3.4 測試應用是否使用非 SDK 介面

(1). 使用 Android 9.0 或更高版本的設備調試應用

在您的應用上運行測試時,如果該應用訪問了某些非SDK 介面,系統就會輸出一條日誌消息。您可以檢查應用的日誌消息,查找以下詳細資訊:

  • 聲明的類、名稱和類型(採用Android 運行時所使用的格式)。
  • 訪問方式:鏈接、反射或JNI。
  • 所訪問的非SDK 介面屬於哪個列表。

您可以使用adb logcat 來查看這些日誌消息,這些消息顯示在所運行應用的PID 下。例如:

(2). 使用StrictMode API 進行測試

(3). 使用google工具veridex 對應用進行掃描

可以在APK上運行靜態分析工具veridex。veridex工具會掃描APK的整個程式碼庫(包括所有第三方庫),並報告發現的所有使用非SDK介面的行為,該工具的掃描結果會列出應用對於三個限制名單中的介面的調用細節。

veridex工具也在不斷地更新,它存在以下局限性:

  • 它無法檢測到通過JNI 實現的調用。
  • 它只能檢測到一部分通過反射實現的調用。
  • 它對非活動程式碼路徑的分析僅限於API 級別的檢查。

【4. 前台服務許可權】

說明

在Android 9.0 中,應用在使用前台服務之前必須先申請FOREGROUND_SERVICE許可權,否則就會拋出Security Exception 異常。

處理

由於FOREGROUND_SERVICE許可權只是普通許可權,因此開發者只需在AndroidManifest.xml中註冊此許可權即可,系統會自動對此許可權進行授權:

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

【5.不允許共享Web View數據目錄】

說明

Android 9.0 為了改善應用穩定性和數據完整性,應用無法再讓多個進程共用同一Web View 數據目錄。

測試

應用程式不能再跨進程共享單個WebView數據目錄。如果您的應用有多個使用Web View,CookieManager或android.webkit包中的其他API的進程,則當第二個進程調用WebView方法時,您的應用將崩潰。

【6. 其他行為變更】

6.1 Build.SERIAL (設備唯一標識符)被棄用

說明

Android 9.0 之前,開發者可以使用Build.SERIAL 獲取設備的序列號。現在這個方法被棄用了,Build.SERIAL將始終設置為 "UNKNOWN" 以保護用戶的隱私。

處理

如果您的應用需要訪問設備的硬體序列號,適配的方法為:先請求READ_PHONE_STATE 許可權,然後調用Android9 中新增的 Build.getSerial()方法。

測試

最新版本,targetSdkVersion升級後,能正常拿到該參數。涉及到需要有設備序列號相關的請求,參數完整可用

6.2 限制訪問通話記錄

說明

Android 9.0 引入CALL_LOG 許可權組並將 READ_CALL_LOG、WRITE_CALL_LOG和 PROCESS_OUTGOING_CALLS 許可權移入該組。在之前的 Android 版本中,這些許可權位於PHONE 許可權組。

測試

如果應用需要訪問通話記錄或者需要處理去電,則您必須向CALL_LOG 許可權組,明確請求這些許可權。否則會發生SecurityException

6.3 限制訪問電話號碼

說明

在未獲得READ_CALL_LOG 許可權的情況下,除了應用的用例需要的其他許可權之外,運行於Android 9.0 上的應用無法讀取電話號碼或手機狀態。

測試

與來電和去電關聯的電話號碼可在手機狀態廣播(比如來電和去電的手機狀態廣播)中看到,並可通過PhoneStateListener 類訪問。但是,如果沒有READ_CALL_LOG 許可權,則 PHONE_STATE_CHANGED 廣播和PhoneStateListener「提供的電話號碼欄位為空」。

6.4 後台對感測器的訪問受限

說明

Android9 限制後台應用訪問用戶輸入和感測器數據的能力。如果您的應用在運行Android 9 設備的後台運行,系統將對您的應用採取以下限制:

  • 您的應用不能訪問麥克風或攝影機。
  • 使用連續報告模式的感測器(例如加速度計和陀螺儀)不會接收事件。
  • 使用變化或一次性報告模式的感測器不會接收事件。
  • 如果您的應用需要在運行Android 9 的設備上檢測感測器事件,請使用前台服務。

測試

例如地圖項目:測試覆蓋後台導航,後台錄音(如喚醒)等

6.5 限制訪問 Wi-Fi 位置和連接資訊

在Android 9 中,應用進行 Wi-Fi 掃描的許可權要求比之前的版本更嚴格。

類似的限制也適用於 getConnectionInfo() 函數,該函數返回描述當前Wi-Fi 連接的 WifiInfo 對象。如果調用應用具有以下許可權,則只能使用該對象的函數來檢索SSID 和 BSSID 值:

  • ACCESS_FINE_LOCATION 或 ACCESS_COARSE_LOCATION
  • ACCESS_WIFI_STATE

檢索SSID 或 BSSID 還需要在設備上啟用位置服務(在 Settings> Location 下)。

6.6 電話資訊現在依賴設備位置設置

如果用戶在運行Android 9 的設備上停用設備定位,則以下函數不提供結果:

  • getAllCellInfo()
  • listen()
  • getCellLocation()
  • getNeighboringCellInfo()

6.7 Android 9.0 移除了Crypto Java 加密架構 (JCA) 提供程式

從Android 9 開始,Crypto JCA 提供程式已被移除。調用SecureRandom.getInstance("SHA1PRNG","Crypto"),將拋出NoSuchProviderException。

【參考】

https://developer.android.com/about/versions/pie/android-9.0-changes-28?hl=zh-cn

https://developer.android.com/about/versions/pie/android-9.0-migration?hl=zh-CN

https://juejin.im/post/5cbc146751882541625684bd

https://blog.csdn.net/jjzhoujun2010/article/details/89647738

https://blog.csdn.net/qq_38520096/article/details/90579475