Android 7.0使用私有NDK库的问题
首先來看看 Android7.0對非公開 NDK 庫的使用說明。
從 Android 7.0 開始,系統(tǒng)將阻止應用動態(tài)鏈接非公開 NDK 庫,這種庫可能會導致您的應用崩潰。此行為變更旨在為跨平臺更新和不同設備提供統(tǒng)一的應用體驗。即使您的代碼可能不會鏈接私有庫,但您的應用中的第三方靜態(tài)庫可能會這么做。因此,所有開發(fā)者都應進行相應檢查,確保他們的應用不會在運行 Android 7.0 的設備上崩潰。如果您的應用使用原生代碼,則只能使用公開 NDK API。
您的應用可通過以下三種方式嘗試訪問私有平臺 API:
您的應用直接訪問私有平臺庫。您應更新您的應用以添加該應用的庫副本,或使用公開 NDK API。 您的應用使用一個可訪問私有平臺庫的第三方庫。即使您確定您的應用不會直接訪問私有庫,您仍應針對此情景測試您的應用。 您的應用引用一個其 APK 中未包含的庫。例如,如果您嘗試使用您自己的 OpenSSL 副本,但忘記將它與應用的 APK 進行捆綁,則可能會出現(xiàn)此情況。正常情況下,此應用可在包含 libcrypto.so 的 Android 平臺版本上運行。不過,此應用在不包含此庫的新版 Android(例如,Android 6.0 和更高的版本)上會崩潰。為修復此問題,請確保您的 APK 捆綁您的所有非 NDK 庫。應用不應使用 NDK 中未包含的原生庫,因為這些庫可能會發(fā)生更改或在不同 Android 版本之間的可用性不同。例如,從 OpenSSL 切換至 BoringSSL 即屬于此類更改。此外,由于不屬于 NDK 中的平臺庫沒有兼容性要求,因此不同的設備可能提供不同級別的兼容性。
為降低此限制可能對當前發(fā)布的應用的影響,面向 API 級別 23 或更低級別的應用在 Android N 上可暫時訪問頗為常用的一組庫,例如libandroid_runtime.so、libcutils.so、libcrypto.so 和 libssl.so。如果您的應用加載其中某個庫,logcat 會生成一個警告,并在目標設備上顯示一個 Toast 來通知您。如果您看到這些警告,您應更新您的應用以添加該應用自己的庫副本,或僅使用公開 NDK API。將來發(fā)布的 Android 平臺可能會完全限制對私有庫的使用,并導致您的應用崩潰。
所有應用在調(diào)用既非公開又不可暫時訪問的 API 時都會生成一個運行時錯誤。結果就是 System.loadLibrary 和 dlopen(3) 同時返回 NULL,并可能導致您的應用崩潰。您應檢查應用代碼以移除對私有平臺 API 的使用,并使用預覽版設備或模擬器全面測試應用。如果您不確定您的應用是否使用私有庫,您可以檢查 logcat 以識別運行時錯誤。
根據(jù)以上的解釋,如果自己的應用中用了非公開的 NDK 庫,解決這個問題的辦法就是:將所用到的.so文件合入armeabi-v7a文件下面即可,這樣就能讓 apk 運行在 Android7.0的機子上了。
總結
以上是生活随笔為你收集整理的Android 7.0使用私有NDK库的问题的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: QML 实现图片帧渐隐渐显轮播
- 下一篇: Qt 检测第三方软件是否运行、杀死第三方