官术网_书友最值得收藏!

如何面對Android P的限制

寫作這本書的時候,Google推出了Android P preview的操作系統,會限制對@hide api的反射調用。目前會通過log發出警告,用戶代碼仍然能夠獲取到正確的Method或Field,在后續版本中獲取到的Method或Field極有可能為空。

但是道高一尺,魔高一丈。Google對這次限制,很快就被技術極客們繞過去了詳細內容,請參見田維術的文章:http://weishu.me/2018/06/07/free-reflection-above-android-p/,有兩種解決方法:

1)把通過反射調用的系統內部類改為直接調用。具體操作辦法是,在Android項目中新建一個庫,把要反射的類的方法和字段復制一份到這個庫中,App對這個庫的引用關系設置為provided。那么我們就可以在App中直接調用這個類和方法,同時,在編譯的時候,又不會把這些類包含到apk中。

其實早在2015年,hoxkx就在他的插件化框架中實現了這種技術項目地址參見:https://github.com/houkx/android-pluginmgr。但是這種解決方案,僅限于Android系統中標記為public的方法和字段,對于protected和private就無能為力了。比如AssetsManager的addAssetPath方法,ActivityThread的currentActivityThread方法。

2)類的每個方法和字段都有一個標記,表明它是不是hide類型的。我們只要在jni層,把這個標記改為不是hide的,就可以繞過檢查了。

然而,魔高一丈,道高一丈二。Google在Android P的正式版中勢必會推出更嚴厲的限制方案,到時候,又會有新的解決方案面世,讓我們拭目以待。

其實,開發者是無意和Google進行技術對抗的,這是毫無意義的。泛濫成災的修改導致了App大量的崩潰,Google實在看不下去了,所以才搞出這套限制方案;另一方面,插件化技術是剛需,尤其在中國的互聯網行業,App崩潰會直接影響使用,很可能導致經濟損失,所以開發者才會不惜一切代價走插件化這條路。

再回到限制方案來,Google也不是清一色不要開發者使用系統底層的標記為hide的API,而是推出了一組黑灰名單,如下所示:

所以,另一種應對策略是,在插件化中使用淺灰名單中的API,比如說ActivityThread的currentActivityThread方法。

Google的這組清單還在持續調整中,據我所知,給各大手機廠商的清單與其在社區中發布的清單略有出入。在Android P的正式版本中,這份清單會最終確定下來。所以現在中國的各個插件化框架的開發人員,都在等Android P的正式版本發布后再制定相應的策略。留給中國隊的時間不多了。

主站蜘蛛池模板: 罗城| 伊宁县| 大方县| 遂平县| 山阳县| 天镇县| 西乌珠穆沁旗| 辰溪县| 大关县| 泸水县| 金华市| 项城市| 兴仁县| 翁源县| 蕲春县| 会昌县| 封丘县| 大英县| 台州市| 稷山县| 美姑县| 弋阳县| 涿州市| 柞水县| 海林市| 贞丰县| 游戏| 东乡县| 贵德县| 辽源市| 大新县| 类乌齐县| 友谊县| 海安县| 沈丘县| 桓台县| 瑞安市| 微山县| 阿坝县| 连南| 鄂托克前旗|