package com.huanju.chajianhuatest;
import android.app.Activity;
import android.app.Application;
import android.content.Context;
import android.content.res.AssetManager;
import android.content.res.Resources;
import android.os.Environment;
import android.util.Log;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import dalvik.system.DexClassLoader;
/**
* @author 刘镓旗
* @date 17/2/21
*/
public class MyApplication extends Application {
private static Context sContext;
public static DexClassLoader mClassLoader;
private AssetManager assetManager;
private Resources newResource;
private Resources.Theme mTheme;
@Override
protected void attachBaseContext(Context base) {
super.attachBaseContext(base);
// MyHookHelper.hookActivityResource(base);
sContext = base;
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 = getPackageResourcePath();
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 = getResources();
Log.e("Main", "supResource = " + supResource);
newResource = new Resources(assetManager, supResource.getDisplayMetrics(), supResource.getConfiguration());
Log.e("Main", "设置 getResource = " + getResources());
mTheme = newResource.newTheme();
mTheme.setTo(super.getTheme());
} catch (Exception e) {
Log.e("Main", "走了我的callActivityOnCreate 错了 = " + e.getMessage());
e.printStackTrace();
}
}
@Override
public AssetManager getAssets() {
return assetManager == null ? super.getAssets() : assetManager;
}
@Override
public Resources getResources() {
return newResource == null ? super.getResources() : newResource;
}
@Override
public Resources.Theme getTheme() {
return mTheme == null ? super.getTheme() : mTheme;
}
public static Context getContext() {
return sContext;
}
}