日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

No field gDefault in class Landroid/app/ActivityManagerNative

發(fā)布時(shí)間:2023/12/10 编程问答 58 豆豆
生活随笔 收集整理的這篇文章主要介紹了 No field gDefault in class Landroid/app/ActivityManagerNative 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

啟動(dòng)未注冊(cè)activity。8.0系統(tǒng)報(bào)錯(cuò)如下:

05-06 10:25:31.312 13973-13973/com.bolex.androidhookstartactivity W/System.err: java.lang.NoSuchFieldException: No field gDefault in class Landroid/app/ActivityManagerNative; (declaration of 'android.app.ActivityManagerNative' appears in /system/framework/framework.jar)
? ? ? ? at java.lang.Class.getDeclaredField(Native Method)
?

?

如何啟動(dòng)一個(gè)未注冊(cè)過(guò)的Activity

幾乎所有的插件化都會(huì)要的一個(gè)需求,啟動(dòng)一個(gè)未注冊(cè)的Activiy,即加載插件包中的Activity,并且主應(yīng)用并不知道插件應(yīng)用中會(huì)有什么Activity,這是各個(gè)插件化框架主力解決的問(wèn)題之一。

今天我們學(xué)習(xí)一下占坑式插件化框架的啟動(dòng)Activity原理。

關(guān)于動(dòng)態(tài)代理的知識(shí),了解過(guò)Retrofit的源碼的或者看過(guò)Java設(shè)計(jì)模式之代理模式的高級(jí)使用的,應(yīng)該都了解了。本章不做介紹,主介紹hook+反射

Hook是什么?

Hook直白點(diǎn)說(shuō)就是攔截方法,自己對(duì)其參數(shù)等進(jìn)行修改,或者替換返回值,達(dá)到自己不可告人的目的的一件事。

尋找Hook點(diǎn)

對(duì)于啟動(dòng)Activity,老實(shí)說(shuō)光startActivity便有很多要說(shuō),很多文章會(huì)帶著你一直追到ActivityManagerService中的若干個(gè)方法,最后再調(diào)用本地的ActivityThread里面的方法去啟動(dòng)本進(jìn)程的Activity。

所以光上面的流程我們看出,我們把要啟動(dòng)的Activity信息發(fā)給AMS,其做了各種檢查各種操作后真正讓Activity啟動(dòng)的還是我們的ActivityThread

實(shí)現(xiàn)欺騙

欺騙系統(tǒng)就欺騙兩個(gè)地方,我們?cè)贏ndroidManifest里面申明一個(gè)假Activity,然后在啟動(dòng)真實(shí)Activity的地方,將Intent里面的Activity替換成我們已經(jīng)注冊(cè)過(guò)的。再在ActivityThread launch Activity的時(shí)候,替換成我們需要啟動(dòng)的便實(shí)現(xiàn)了啟動(dòng)一個(gè)未注冊(cè)過(guò)的Activity的效果。


實(shí)行代碼如下:

安卓系統(tǒng)8.0以下手機(jī)啟動(dòng)未注冊(cè)activity方法

private static void hookActivityManager() {try {// 獲取gDefaultClass activityManagerClass = Class.forName("android.app.ActivityManagerNative");Field gDefaultField = activityManagerClass.getDeclaredField("gDefault");gDefaultField.setAccessible(true);Object gDefault = gDefaultField.get(null);// 獲取mIntanceClass singletonClass = Class.forName("android.util.Singleton");Field mInstanceField = singletonClass.getDeclaredField("mInstance");mInstanceField.setAccessible(true);Object mInstance = mInstanceField.get(gDefault);// 替換mIntanceObject proxy = Proxy.newProxyInstance(mInstance.getClass().getClassLoader(),new Class[]{Class.forName("android.app.IActivityManager")},new IActivityManagerHandler(mInstance));mInstanceField.set(gDefault, proxy);} catch (Exception e) {Log.e("hook", "err", e);} }

Android系統(tǒng)8.0及以上手機(jī)啟動(dòng)方法就不再調(diào)用ActivityManagerNative類,而是ActivityManager類,部分代碼如下

Class activityManagerClass = Class.forName("android.app.ActivityManager");

demo鏈接:https://download.csdn.net/download/meixi_android/11161392

云盤demo鏈接:https://pan.baidu.com/s/1CjWTpmueLrBMpxlsR7Jjew

在線回復(fù)云盤密碼:QQ1085220040

?

?

?

?

總結(jié)

以上是生活随笔為你收集整理的No field gDefault in class Landroid/app/ActivityManagerNative的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。