手写热修复实现原理分析
思路
热修复优势
1、对开发者:无需重新发布新版本,省时省力。
2、用户:无感知修复,也无需下载更新应用,代价小。
3、App:修复成功率高,把损失降到最低。
package com.dongnao.plugindavid;
import android.content.Context;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.content.res.AssetManager;
import android.content.res.Resources;
import java.io.File;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import dalvik.system.DexClassLoader;
/**
-
Created by Administrator on 2017/7/18.
*/
public class PluginManager {private Resources resources;
private DexClassLoader dexClassLoader;
private static PluginManager ourInstance = new PluginManager();
private Context context;
private PackageInfo packageInfo;public static PluginManager getInstance() {
return ourInstance;
}public void setContext(Context context) {
this.context = context.getApplicationContext();
}private PluginManager() {
}
//路径
public void loadPath(String path) {
File dexOutFile = context.getDir(“dex”, Context.MODE_PRIVATE);
//能都去加载外置卡的class
dexClassLoader = new DexClassLoader(path,
dexOutFile.getAbsolutePath(), null, context.getClassLoader());
PackageManager packageManager=context.getPackageManager();
packageInfo=packageManager.getPackageArchiveInfo(path,PackageManager.GET_ACTIVITIES);//需要AssetManager try { AssetManager assetManager=AssetManager.class.newInstance(); Method addAssetPath=AssetManager.class.getMethod("addAssetPath", String.class); addAssetPath.invoke(assetManager, path); resources=new Resources(assetManager, context.getResources().getDisplayMetrics(),context.getResources().getConfiguration()); } catch (InstantiationException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } catch (NoSuchMethodException e) { e.printStackTrace(); } catch (InvocationTargetException e) { e.printStackTrace(); }
}
public PackageInfo getPackageInfo() {
return packageInfo;
}public Resources getResources() {
return resources;
}public ClassLoader getClassLoader() {
return dexClassLoader;
}
}