android8.0 反射Application 启动过程

private void proxy(){

        try{
            //获取当前ActivityThread
            Class ClassActivityThread=Class.forName("android.app.ActivityThread");
            Method methodCurrentActivityThread=ClassActivityThread.getDeclaredMethod("currentActivityThread");
            Object activityThread=methodCurrentActivityThread.invoke(null);
            //获取当前ActivityThread的mInstrumentation字段
            Field fieldmInstrumentation=ClassActivityThread.getDeclaredField("mInstrumentation");
            fieldmInstrumentation.setAccessible(true);
            Object mInstrumentation=fieldmInstrumentation.get(activityThread);
            //构造LoadAPK 调用LoadedApk(ActivityThread, ApplicationInfo,
            //                    CompatibilityInfo,ClassLoader,boolean,boolean,boolean)构造函数
            Class ClassInstrumentation=Class.forName("android.app.Instrumentation");
            Class ClassContextImpl= Class.forName("android.app.ContextImpl");
            //loadAPK packageInfo
            Class classLoadedApk= Class.forName("android.app.LoadedApk");
            Class classCompatibilityInfo=Class.forName("android.content.res.CompatibilityInfo");
            Field fieldDEFAULT_COMPATIBILITY_INFO=classCompatibilityInfo.getDeclaredField("DEFAULT_COMPATIBILITY_INFO");
            Object DEFAULT_COMPATIBILITY_INFO=fieldDEFAULT_COMPATIBILITY_INFO.get(null);
            UserHandle.class.getDeclaredMethod("myUserId").invoke(null);

            Constructor constructor=classLoadedApk.getConstructor(ClassActivityThread, ApplicationInfo.class,
                    classCompatibilityInfo,ClassLoader.class,boolean.class,boolean.class,boolean.class);
            ApplicationInfo applicationInfo=this.getApplicationInfo();
            applicationInfo.className="com.xx.xx.CustomApp";
            Object loadAPK=constructor.newInstance(activityThread,applicationInfo,
                    DEFAULT_COMPATIBILITY_INFO,this.getClassLoader(),false,true,false);


            //执行创建Application
            Method methodCreateAppContext=ClassContextImpl.getDeclaredMethod("createAppContext",ClassActivityThread,classLoadedApk);
            methodCreateAppContext.setAccessible(true);
            Object appContext =methodCreateAppContext.invoke(null,activityThread,loadAPK);
            CustomApp globalApp= (CustomApp) ClassInstrumentation.getDeclaredMethod("newApplication",ClassLoader.class,String.class,
                    Context.class).invoke(mInstrumentation,this.getClassLoader(),"com.xx.xx.CustomApp",appContext);

            Field fieldAppication=classLoadedApk.getDeclaredField("mApplication");
            fieldAppication.setAccessible(true);
            fieldAppication.set(loadAPK,globalApp);
            //调用onCreate() 
            globalApp.onCreate();
            globalApp.setAttached(true);
            

        }catch (Exception e){
            e.printStackTrace();
        }
        //globalApp.onCreate();
    }

 

代码没有经过考验,仅供学习参考 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值