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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

No field gDefault in class Landroid/app/ActivityManagerNative

發布時間:2023/12/10 编程问答 49 豆豆
生活随笔 收集整理的這篇文章主要介紹了 No field gDefault in class Landroid/app/ActivityManagerNative 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

啟動未注冊activity。8.0系統報錯如下:

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)
?

?

如何啟動一個未注冊過的Activity

幾乎所有的插件化都會要的一個需求,啟動一個未注冊的Activiy,即加載插件包中的Activity,并且主應用并不知道插件應用中會有什么Activity,這是各個插件化框架主力解決的問題之一。

今天我們學習一下占坑式插件化框架的啟動Activity原理。

關于動態代理的知識,了解過Retrofit的源碼的或者看過Java設計模式之代理模式的高級使用的,應該都了解了。本章不做介紹,主介紹hook+反射

Hook是什么?

Hook直白點說就是攔截方法,自己對其參數等進行修改,或者替換返回值,達到自己不可告人的目的的一件事。

尋找Hook點

對于啟動Activity,老實說光startActivity便有很多要說,很多文章會帶著你一直追到ActivityManagerService中的若干個方法,最后再調用本地的ActivityThread里面的方法去啟動本進程的Activity。

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

實現欺騙

欺騙系統就欺騙兩個地方,我們在AndroidManifest里面申明一個假Activity,然后在啟動真實Activity的地方,將Intent里面的Activity替換成我們已經注冊過的。再在ActivityThread launch Activity的時候,替換成我們需要啟動的便實現了啟動一個未注冊過的Activity的效果。


實行代碼如下:

安卓系統8.0以下手機啟動未注冊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系統8.0及以上手機啟動方法就不再調用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

在線回復云盤密碼:QQ1085220040

?

?

?

?

總結

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

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。