古詩詞大全網 - 個性簽名 - Android之隱藏api介紹

Android之隱藏api介紹

..

Android P 引入了針對非 SDK 接口(俗稱為隱藏API)的使用限制。這是繼 Android N上針對 NDK 中私有庫的鏈接限制之後的又壹次重大調整。

從今以後,不論是native層的NDK還是 Java層的SDK,我們只能使用Google提供的、公開的標準接口。這對開發者以及用戶乃至整個Android生態,當然是壹件好事。

但這也同時意味著Android上的各種黑科技有可能會逐漸走向消亡。

公*** SDK 接口是在 Android 框架軟件包索引 中記錄的那些接口

從 Android Pie 開始,對某些隱藏類、方法和字段的訪問受到限制在 Pie 之前,通過簡單地使用反射來使用這些隱藏的非 SDK 組件非常容易。

但是,現在當嘗試訪問時,面向 API 28 (Pie) 或更高版本的應用程序將遇到 ClassNotFoundException、NoSuchMethodError 或 NoSuchFieldException Activity#createDialog() 。

先來看看系統是如何實現這個限制的。

通過反射或者JNI訪問非公開接口時會觸發警告/異常等,那麽不妨跟蹤壹下反射的流程,看看系統到底在哪壹步做的限制。

先來看壹下 java.lang.Class.getDeclaredMethod(String) :

其中看壹下 ShouldBlockAccessToMember 的調用,如果它返回false,那麽直接返回 nullptr ,上層就會拋 NoSuchMethodXXX 異常;也就觸發系統的限制了。

源碼如下:

繼續跟蹤下 GetMemberAction方法 :

繼續跟蹤GetMemberActionImpl方法:

其中調用到了

只要 IsExempted 方法返回 true,就算這個方法在黑名單中,依然會被放行然後允許被調用。

IsExempted 方法:

繼續跟蹤傳遞進來的參數 runtime->GetHiddenApiExemptions() 發現也是 runtime 裏面的壹個參數.

這樣就可以直接修改 hidden_api_exemptions_ 繞過去限制。

Java 層的,有壹個對應的 VMRuntime.setHiddenApiExemptions 方法,通過 VMRuntime.setHiddenApiExemptions 設置下豁免條件,就能愉快滴使用反射了。

IsExempted 方法裏面調用 DoesPrefixMatch 方法。DoesPrefixMatch是對方法簽名進行前綴匹配。所有Java方法類的簽名都是以 L 開頭,這樣就可以直接傳個 L 進去,所有的隱藏API全部被赦免了!

另壹種繞過 Android P以上非公開API限制的辦法