1. 程式人生 > >Android P 應用相容常見錯誤及建議

Android P 應用相容常見錯誤及建議

640?wx_fmt=png&wxfrom=5&wx_lazy=1

從 2018 年 3 月初我們釋出 Android P 開發者預覽版以來,很多開發者都對當前常見應用在 Android P 上做了一些相容性測試,我們在這裡總結了一些常見的問題,以及它們發生的原因和建議的修改措施。

問題 1: 假設 android.os.Build.VERSION.RELEASE 為數值型別


原因:

對於即將推出的 Android 新版本的預覽版,這些值可能是字母數字 (如 “PPR” 或 “P”),因此在嘗試將 “P” 解析為整數時會導致崩潰。

建議:

應用把 RELEASE 的值作為字串型別來處理。

問題 2: 使用的第三方 SDK 版本過低,不相容 Android P

原因:

在中國的 Android 生態中,應用經常依賴的第三方 SDK (特別是加固和熱修復框架) 會和系統底層緊密整合 (如使用非公開的介面),而導致應用在 Android 版本升級時無法正常執行。我們也開始與一些常見的 SDK 提供商合作 (並計劃覆蓋更多),在 Android 新的預覽版本中儘早解決相容性問題。

建議:

經常檢查第三方 SDK 的升級公告,及時升級至其最新版本。

如果您使用的第三方 SDK 尚不支援 Android 新版本,請報告給其提供商,幫助推動它解決相容性問題。

問題 3: 開啟應用時顯示 "Detected problems with API compatibility",或呼叫非 SDK 介面時遭遇 NoSuchFieldException 或 NoSuchMethodException

原因:

非 SDK 介面指的是 Android 系統內部使用、並未提供在 SDK 中的介面,開發者可能通過 Java 反射、JNI 等技術來呼叫這些介面。但是,這麼做是很危險的:非 SDK 介面沒有任何公開文件,必須檢視原始碼才能理解其行為邏輯。

非 SDK 介面的函式簽名 (包括引數列表和返回值)、行為邏輯都有可能在下個 Android 版本中被大幅修改,甚至 API 本身也可能被刪除。這會導致使用非 SDK 介面的應用在新的 Android 版本中無法執行,或執行時產生不符合預期的行為,開發者必須投入相當的研發資源保持其在未來每個 Android 新版本中的適配。

直接使用底層的非 SDK 介面有可能會繞過一些 Android 對使用者的安全性和隱私性方面的保護,不但影響使用者體驗、妨害使用者隱私,也很可能會被 Google Play Protect 判定為惡意軟體而提示使用者解除安裝應用。

建議:

只使用 Android SDK 中的公開介面進行應用開發。公開 SDK 介面有詳細的技術文件和支援渠道,未來的 Android 新版本也會保證公開 SDK 介面的相容性 (即使有改動,也會在文件中詳細闡明)。

請儘早在 Android P 預覽版中測試您的應用,您可以執行並操作應用,然後在 adb logcat 中查詢類似下方的內容,其中包含了應用呼叫的非 SDK 介面名,所屬黑/灰名單和呼叫的方式: 
Accessing hidden field Landroid/os/Message;->flags:I (light greylist, JNI)

Accessing hidden method Landroid/app/ActivityThread;->currentActivityThread()Landroid/app/ActivityThread; (dark greylist, reflection)


如果您有合理的理由,必須使用某個非 SDK 介面,請在文章下方留言給我們,我們非常期待聆聽和與您進行討論,並會在充分評估必要性和可行性後,提供可能的方案來滿足合理的功能需求。

問題 4: 直接呼叫 dex2oat,或者使用不支援 / 不正確的方式編譯 dex 檔案

原因:

從一開始,dex2oat 就被設計為系統內部使用的編譯部署工具,Android 從來都未支援過開發者直接呼叫 dex2oat 的場景。我們會持續而不定期地對這個工具進行優化,而很多時候其行為變更 (如: 生成的檔案及其格式) 都是與之前不相容的。在大多數情況下,標準的類載入器 (BaseDexClassLoader / DexClassLoader / PathClassLoader) 無法找到或使用由直接呼叫 dex2oat 生成的檔案。

此外請注意,從 Android O 開始,BaseDexClassLoader 和 DexClassLoader 建構函式中的 “optimizedDirectory” 引數已廢棄,並在載入 dex 檔案時不起作用。

建議:

如果您需要從記憶體中載入 dex 檔案,而不願在儲存中留下痕跡,請使用 Android O 中新增的載入器 InMemoryDexClassLoader。

問題 5: 篡改 Android Studio 生成的 dex 和 so 檔案

原因:

Android Studio 生成的 dex 檔案雖然有公開的佈局格式,但具體內容還是會在執行時被系統在後臺進行編譯優化。如果您在 dex 檔案中寫入自定義的內容,很可能這些自定義的寫入操作與系統優化發生衝突,以致自定義的內容被擦除或覆蓋,甚至導致優化後的 dex 在執行時直接崩潰。


Android Studio 生成的 so 檔案包含一些元資料 (如 ELF headers 和 section headers),以備動態連結器進行完整性檢查。篡改 so 檔案並不會帶來安全性的提升 (很多工具可以重新生成元資料),反而可能導致應用無法在未來的 Android 版本中啟動 (由於動態連結器可能執行更嚴格的檢查)。更多關於 so 檔案的要求,您可在公眾號平臺傳送資訊 “so檔案” 獲取相關連結。

建議:

不要修改 Android Studio 生成的 dex 和 so 檔案。

問題 6: 應用在 Android P 上啟動時顯示 “This app was built for an older version of Android and may not work properly...”

原因:

應用的 targetSdkVersion 太舊 ( <17 )

建議:

升級您應用的 targetSdkVersion 至最新版本,您可在公眾號平臺傳送資訊 “targetsdkversion” 獲取相關文件連結

問題 7: 應用在特長螢幕上未能正確顯示,部分內容超出螢幕

原因:

Android O 開始支援特長螢幕,而且已經有很多廠商開始釋出特長螢幕的手機。應用對螢幕的顯示比例做出錯誤的假設,而未能支援 16:9 以上的縱橫比,進而影響使用者體驗。

建議:

修改您的應用,使他能夠適應不同的螢幕尺寸 (包括 16:9 以上的縱橫比)。

如果自適應式 UI 不適合您的場景,可以考慮在 manifest 中的 <activity> 內設定 resizableActivity = false,並加上 android:MaxAspectRatio 來宣告最大支援縱橫比。這會在特長螢幕的裝置上啟用相容模式,把應用邊緣的顯示空間以黑色填充。

問題 8: 應用在特長螢幕上未能正確顯示,上下出現黑邊

原因:

Android O 開始支援特長螢幕,而且已經有很多廠商開始釋出特長螢幕的手機。應用對未能支援 16:9 以上的縱橫比會在特長螢幕的裝置上啟用相容模式,把應用邊緣的顯示空間以黑色填充。

建議:

升級您應用的 targetSdkVersion 至最新版本,您可在公眾號平臺傳送資訊 “targetsdkversion” 獲取相關文件連結

640?wx_fmt=gif

請參考下列 Android P 相關文件,使您的應用盡早相容 Android P:

- 設定 SDK 和模擬器

https://developer.android.google.cn/preview/setup-sdk.html

- 遷移指南

https://developer.android.google.cn/preview/migration.html

- 行為變更

https://developer.android.google.cn/preview/behavior-changes.html

- 新功能及 API

https://developer.android.google.cn/preview/features.html

如果您在 Android P 的相容性工作中有什麼經驗和體會,歡迎在文章下方留言與我們分享。謝謝!

640?wx_fmt=jpeg

推薦閱讀

640?wx_fmt=gif

相關推薦

Android P 應用相容常見錯誤建議

從 2018 年 3 月初我們釋出 Android P 開發者預覽版以來,很多開發者都對當前常見

流程圖設計的常見錯誤糾正建議

流程圖設計 流程圖 設計 錯誤 糾正 我目前正在企業做咨詢,不同的企業人員在首次設計流程圖時所犯錯誤基本相同,或者說常見錯誤一樣。因此,我想列舉一下企業員工設計流程圖的常見錯誤,只要大家把錯誤改正了,就能設計出美觀實用的流程圖來。我發現的流程圖設計常見錯誤如下:●張冠李戴,結構流程與活動流

Android應用安全常見問題解決方案

內容來源:2018 年 09 月 15 日,華為資深技術專家李欣哲在“從研發到測試,手把手教你打造綠色應用”進行《應用安全常見問題及解決方案》的演講分享。IT 大咖說作為獨家視訊合作方,經主辦方和講者審閱授權釋出。 閱讀字數:3315 | 9分鐘閱讀 觀看嘉賓演講視訊及PPT,請點選:t.cn/E2DtMQW

Android 開發常見錯誤解決方法集錦

                                                 作者:段興               2014-5-24 1    DescriptionThe container 'Android Dependencies' refe

Android NDK編譯常見錯誤解決方案

轉自:http://chinavideo.org/forum.php?mod=viewthread&tid=10821&page=1 Error 1: $ ndk-build/cygdrive/c/andy/abc/obj/local/armeabi-v7a

在myeclipse中使用maven前常見錯誤解決辦法

eclips aam lai loj yate ren err jar ued %E4%BD%BF%E7%94%A8CHttpFile%E4%BB%8E%E6%9C%8D%E5%8A%A1%E5%99%A8%E7%AB%AF%E6%AD%A3%E7%A1%AE%E7%9A%

MVC MVC常見錯誤解決辦法

.cn log entity ash cnblogs vid services ron strong MVC常見錯誤及解決辦法 問題1: 必須添加對程序集“EntityFramework, Version=5.0.0.0, Culture=neutral,

web程序常見錯誤解決方法

開始 個數字 ice 依據 文件中 方法參數 500錯誤 程序 運行 404錯誤產生原因及解決方法 在剛開始進行Web應用開發的時候,經常看見頁面出現404這個數字,我們一般會稱之為運行產生了404錯誤。類似於404這個數字,還有可能在頁面上看到405、500這兩個數字,他

jenkins 常見錯誤解決方法整理

ref 令行 follow ESS tro windows ins 常見錯誤 以管理員身份運行 現象 WMI.WmiException:AccessDenied 解決方法: 以管理員身份運行 cmd 命令行 jenkins-slave install jenkins

ENVI FLAASH大氣校正常見錯誤解決方法(轉載)

ENVI FLAASH大氣校正常見錯誤及解決方法(轉載) 本文彙總了ENVI FLAASH大氣校正模組中常見的錯誤,並給出解決方法,分為兩部分:執行錯誤和結果錯誤。前面是錯誤提示及說明,後面是錯誤解釋及解決方法。 FLAASH對輸入資料型別有以下幾個要

nginx常見錯誤解決方法

nginx: [error] open() “/var/run/nginx.pid” failed (2: No such file or directory) 今天修改了下nginx配置,重新載入配置檔案的時候報瞭如下錯誤 [root@renguangli ~]# nginx

Android Fragment Activity 廣播常見錯誤

1.Fragment使用startActivityForResult時,不要加上getActivity,且onActivityResult裡應該使用super   2.Fragment中使用getActivity時要注意,Fragment對應的Activity有可能

Android P應用適配相關指南

Android P應用適配相關指南 本文對開發Android P應用適配以及新版本相關特性,下圖是博主開發的教育專案對劉海屏相關適配. 如圖: 一 Android P適配指導 AndroidP開始提供規範化的介面,應用可以使用標準介面,獲取當前是否有劉

elasticsearch常見錯誤解決方案

1.OpenJDK 64-Bit Server VM warning: If the number of processors is expected to increase from one, then you should configure the number of parallel GC threa

Nginx常見錯誤解決辦法

1、Nginx 常見啟動錯誤  有的時候初次安裝nginx的時候會報這樣的錯誤  sbin/nginx -c conf/nginx.conf  報錯內容:sbin/nginx: error while&nbs

java中在使用類時的一些常見錯誤解決方法

關於java中類的一些常見錯誤及解決方法 1.定義了一個主類,如 public class TestCircle{//此時這裡會顯示“class TestCircle”has never been used“ public void main(String[] args){…}; class

Linux下編譯PHP常見錯誤解決方法

locate freetype evel distrib 常見 expec fin install erro 1、configure: error: xml2-config not found. Please check your libxml2 installation.

傳統複製常見錯誤填坑方法

傳統複製常見錯誤及填坑方法 環境 1、表不存在導致插入更新失敗 1.1、模擬複製錯誤產生 1.1.1、生成測試表sbtest.test 1.1.2、在備庫上檢視是否同步test表 1.1.3、主庫上往test表中

loadrunner的幾種常見錯誤解決辦法

1、錄製loadrunner指令碼時,無法生成指令碼,錄製過程中事物都有顯示,我把所有防火牆和網路保護都關了,但是指令碼就是無法生成,協議之類的都是對的。  解決: 在錄製選項option->network->     ort Map

loadrunner執行場景時,常見錯誤解決方法

目錄   1、Error -27727:.3 2、Error -27728:.3 3、Error -27791:.3 4、Error -27492:.4 5、Error -27498:.4 6、Error -26612:.4