插件化技術:宿主訪問插件資源

本文同步自wing的地方酒館javascript

最近在搞插件化,16年很火的東西,我又拖了1年纔來研究,哈哈哈,正確下一個熱門技術能提早一些吧。php

今天想跟你們討論一下我在研究插件化過程當中,遇到的一個容易混淆的點,那就是資源訪問。java

首先感謝下在插件化道路上的老司機,無私的奉獻資料。android

看過不少插件化的文章,都提到了一大痛點是資源訪問的問題。解決方法很通用,都是經過反射使用 AssetManager 的 addAssetPath 方法,把插件apk路徑添加進去。再把系統的resource替換掉,就能夠訪問到資源了。spa

這時候,大部分博客會添加一句:.net

資源訪問是一個痛點,因此用以上方式解決R引用插件

可是這裏有一個及其容易混淆的地方,就是 「解決了R引用」,那麼到底其實是解決了誰的R引用問題呢? 是宿主訪問插件的資源呢,仍是插件訪問插件的資源呢?code

爲了講解清楚我來畫一張圖:cdn

如上圖在沒有替換掉Resources的時候。對象

因爲每一個apk只能訪問本身的res,因此這時候使用hook newActivity建立的Activity對象,是沒法訪問到插件res的,雖然這個Activity確實是插件中的Activity,可是其實是加載在宿主裏的resource,因此也就是有個隔離,所以必須替換resource

當AddPath之後,關係就變成了如上圖的關係,此時建立的Activity的實例,也就是宿主的瓜熟蒂落能拿到插件的資源。

混淆點就是在這裏,在以前網上博客文章中說的解決了資源訪問問題,其實是指插件Activity不能訪問插件自己的資源,而不是說宿主Activity訪問插件的資源

宿主Activity如何訪問插件資源?

通過大量搜索,跟小夥伴討論得知能夠經過以下方式得到插件資源:

getResources().getString(getResources()
.getIdentifier("plugin", "string","com.your.name")),
 Toast.LENGTH_SHORT).show();複製代碼

這個方法是根據資源名稱,來獲取資源id,因此就能夠根據id拿到資源了。

好比上面的例子就是經過getIdentifier()方法尋找名稱爲plugin的string資源。固然你要提供插件的包名。

相關文章
相關標籤/搜索