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的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: HenCoder文章汇总
- 下一篇: python3.0 数据类型、万恶的编码