public void replaceApplicationContext(Application application) {
Log.w(
"NDK_JIAGU"
,
"replaceApplicationContext"
);
try
{
/
/
先获取到ContextImpl对象
Context contextImpl
=
application.getBaseContext();
/
/
替换ContextImpl的代理Application
Reflect.invokeMethod(contextImpl.getClass(), contextImpl,
new
Object
[]{sDelegateApplication},
"setOuterContext"
,
Context.
class
);
/
/
替换ActivityThread的代理Application
Object
mMainThread
=
Reflect.getFieldValue(contextImpl.getClass(), contextImpl,
"mMainThread"
);
Reflect.setFieldValue(
"android.app.ActivityThread"
, mMainThread,
"mInitialApplication"
,
sDelegateApplication);
/
/
替换ActivityThread的mAllApplications
ArrayList<Application> mAllApplications
=
(ArrayList<Application>) Reflect.getFieldValue(
"android.app.ActivityThread"
,
mMainThread,
"mAllApplications"
);
mAllApplications.add(sDelegateApplication);
mAllApplications.remove(application);
/
/
替换LoadedApk的代理Application
Object
loadedApk
=
Reflect.getFieldValue(contextImpl.getClass(), contextImpl,
"mPackageInfo"
);
Reflect.setFieldValue(
"android.app.LoadedApk"
, loadedApk,
"mApplication"
,
sDelegateApplication);
/
/
替换LoadedApk中的mApplicationInfo中name
ApplicationInfo applicationInfo
=
(ApplicationInfo) Reflect.getFieldValue(
"android.app.LoadedApk"
,
loadedApk
,
"mApplicationInfo"
);
applicationInfo.className
=
sDelegateApplication.getClass().getName();
sDelegateApplication.onCreate();
} catch (Exception e) {
e.printStackTrace();
}
}