- Android插件化開發指南
- 包建強
- 795字
- 2019-01-05 08:31:08
如何面對Android P的限制
寫作這本書的時候,Google推出了Android P preview的操作系統,會限制對@hide api的反射調用。目前會通過log發出警告,用戶代碼仍然能夠獲取到正確的Method或Field,在后續版本中獲取到的Method或Field極有可能為空。
但是道高一尺,魔高一丈。Google對這次限制,很快就被技術極客們繞過去了,有兩種解決方法:
1)把通過反射調用的系統內部類改為直接調用。具體操作辦法是,在Android項目中新建一個庫,把要反射的類的方法和字段復制一份到這個庫中,App對這個庫的引用關系設置為provided。那么我們就可以在App中直接調用這個類和方法,同時,在編譯的時候,又不會把這些類包含到apk中。
其實早在2015年,hoxkx就在他的插件化框架中實現了這種技術。但是這種解決方案,僅限于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的正式版本發布后再制定相應的策略。留給中國隊的時間不多了。