Android實現免安裝APK外掛程式(四)

2021-08-20 18:50:06 字數 1818 閱讀 1547

在獲取資源時,有三個重要的類resources, assetmanager, theme,我們通過context獲取它們的物件

@override

public assetmanager getassets()

@override

public resources getresources()

@override

public resources.theme gettheme()

mthemeresource = resources.selectdefaulttheme(mthemeresource,

initializetheme();

return mtheme;

}}

我們要做的就是依葫蘆畫瓢重寫這幾個方法,構造自己物件。對於外掛程式activity,我們需要給它設定乙個resources,讓其包含外掛程式中的資源。但是,這裡不能替換掉宿主應用中的resources,不然宿主就出問題了。resources的建構函式如下:

public

resources(assetmanager assets, displaymetrics metrics, configuration config)

它需要三個物件,這裡的關鍵是assetmanager,它可以通過addassetpath制定資源所在apk的路徑,而另外兩個我們就用宿主的即可。這裡我們需要自己建立乙個assetmanager,由於addassetpath是hide的,所以只能通過反射呼叫。

mdexam = assetmanager.class.newinstance();

method

method = mdexam.getclass

().getdeclaredmethod

("addassetpath", string.class);

method.setaccessible

(true);

method.invoke

(mdexam, loaddexutils.getplugapkpath());

接下來就可以構造乙個resources物件了

resources res = getresources();

mdexresources = new resources(mdexam, res.getdisplaymetrics(), res.getconfiguration());

上面的theme獲取要複雜些,不過我們也可以仿照獲取

class resources = class.forname("android.content.res.resources");

method selectdefaulttheme = resources.getdeclaredmethod("selectdefaulttheme", int.class, int.class);

selectdefaulttheme.setaccessible(true);

mdextheme = mdexresources.newtheme();

@override

public resources getresources()

@override

public resources.theme gettheme()

@override

public assetmanager getassets()

到這裡,外掛程式activity就可以正常啟動了,最終實現無需安裝apk,就可以實現外掛程式化了。

**路徑:

Android實現免安裝APK外掛程式 三

雖然startactivity正常了,但是這不是要啟動的activity,豈不是做了無用功。然而事情往往沒那麼簡單,既然系統服務那關已經過了,我們得自己做點事情了。activity的建立及生命週期都是在自己程序中完成的,所以activitythread這個類似乎可以幫我們做事情。注意到activit...

Android實現免安裝外掛程式 二

在啟動activity中出現activitynotfoundexception有兩種可能,一種是該activity的應用未安裝,一種是該activity未在androidmanifest中申明。在外掛程式化中,屬於情況一。所以在startactivity中需啟動activity實際是系統中不能找到的...

android中跳轉安裝apk

在android中跳轉安裝apk 需要先新增許可權 在跳轉的過程中分為三種情況 android版本低於等於6.0 intent intent new intent intent.action view intent.setflags intent.flag activity new task sta...