Android P 應用相容常見錯誤及建議
從 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” 獲取相關文件連結。
請參考下列 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 的相容性工作中有什麼經驗和體會,歡迎在文章下方留言與我們分享。謝謝!
推薦閱讀
相關推薦
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