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