package com.huanju.chajianhuatest;
import android.app.Activity;
import android.app.Instrumentation;
import android.content.Context;
import android.content.res.AssetManager;
import android.content.res.Resources;
import android.os.Bundle;
import android.os.Environment;
import android.util.Log;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
/**
* Created by DELL-PC on 2017/2/23.
*/
public class MyInstrumentation extends Instrumentation {
private final Context mContext;
private final Instrumentation mInstr;
public MyInstrumentation(Instrumentation base, Context context) {
mInstr = base;
mContext = context;
}
@Override
public void callActivityOnCreate(Activity activity, Bundle icicle) {
Log.e("Main", "走了我的callActivityOnCreate");
Log.e("Main", "activity = " + activity);
Log.e("Main", "activity class = " + activity.getClass());
Log.e("Main", "activity resource = " + activity.getResources());
try {
//拿到ContextWrapper类中的字段mBase字段,就是Context
Class<?> aClass = activity.getClass();
Log.e("Main", "activity aClass = " + aClass);
Log.e("Main", "activity aClass aClass = " + aClass.getSuperclass());
Log.e("Main", "activity aClass aClass aClass = " + aClass.getSuperclass().getSuperclass());
Field mBaseField = Activity.class.getSuperclass().getSuperclass().getDeclaredField("mBase");
mBaseField.setAccessible(true);
Context mBase = (Context) mBaseField.get(activity);
Log.e("Main", "mBase = " + mBase);
//拿出Context中的Resource字段
Class<?> mContextImplClass = Class.forName("android.app.ContextImpl");
Field mResourcesField = mContextImplClass.getDeclaredField("mResources");
mResourcesField.setAccessible(true);
//创建我们自己的Resource
String apkPath = Environment.getExternalStorageDirectory().getAbsolutePath() + "/chajian_demo.apk";
String mPath = mContext.getApplicationContext().getPackageResourcePath();
AssetManager assetManager = AssetManager.class.newInstance();
Method addAssetPathMethod = assetManager.getClass().getDeclaredMethod("addAssetPath", String.class);
addAssetPathMethod.setAccessible(true);
addAssetPathMethod.invoke(assetManager, mPath);
addAssetPathMethod.invoke(assetManager, apkPath);
Method ensureStringBlocks = AssetManager.class.getDeclaredMethod("ensureStringBlocks");
ensureStringBlocks.setAccessible(true);
ensureStringBlocks.invoke(assetManager);
Resources supResource = mContext.getResources();
Log.e("Main", "supResource = " + supResource);
Resources newResource = new Resources(assetManager, supResource.getDisplayMetrics(), supResource.getConfiguration());
mResourcesField.set(mBase, newResource);
Log.e("Main", "设置 getResource = " + activity.getResources());
} catch (Exception e) {
Log.e("Main", "走了我的callActivityOnCreate 错了 = " + e.getMessage());
e.printStackTrace();
}
super.callActivityOnCreate(activity, icicle);
}
}