package com.qmusic.extplugin;
import java.io.File;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
import android.annotation.SuppressLint;
import android.content.Context;
import android.os.Build;
import com.qmusic.uitls.BLog;
import dalvik.system.BaseDexClassLoader;
import dalvik.system.DexClassLoader;
public class PluginLoader {
static final String TAG = PluginLoader.class.getSimpleName();
private static Map<String, IPlugin> plugins;
private static Map<String, String> pluginsLoaded;
static {
plugins = new HashMap<String, IPlugin>();
pluginsLoaded = new HashMap<String, String>();
}
public static final String[] getFunctions(String pluginId) {
String[] functions = null;
if (plugins.containsKey(pluginId)) {
IPlugin plugin = plugins.get(pluginId);
functions = plugin.getFunctions();
} else {
BLog.e(TAG, "plugin not exists:" + pluginId);
}
return functions;
}
public static final void execute(String pluginId, String functionName, Object params) {
if (plugins.containsKey(pluginId)) {
IPlugin plugin = plugins.get(pluginId);
plugin.invoke(functionName, params);
} else {
BLog.e(TAG, "plugin not exists:" + pluginId);
}
}
/**
* 每次升级插件的时候,必须同时删除缓存文件,否则程序会崩溃
*
* @param pluginId
*/
@SuppressWarnings("rawtypes")
@SuppressLint("NewApi")
public static final String loadPlugin(Context ctx, String jarPath, String classPath) {
String pluginId = "";
final String key = jarPath + classPath;
if (pluginsLoaded.containsKey(key)) {
pluginId = pluginsLoaded.get(key);
return pluginId;
}
try {
Class mmsmsClass;
if (Build.VERSION.SDK_INT >= 14) {
BaseDexClassLoader cl = new BaseDexClassLoader(jarPath, ctx.getFilesDir(), null, ctx.getClassLoader());
mmsmsClass = cl.loadClass(classPath);
} else {
DexClassLoader cl = new DexClassLoader(jarPath, ctx.getFilesDir().getAbsolutePath(), null,
ctx.getClassLoader());
mmsmsClass = cl.loadClass(classPath);
}
IPlugin plugin = (IPlugin) mmsmsClass.newInstance();
pluginId = plugin.pluginId();
plugin.onLoad();
plugins.put(pluginId, plugin);
pluginsLoaded.put(key, pluginId);
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
} catch (Throwable e) {
e.printStackTrace();
}
return pluginId;
}
public static final void removeCache(Context ctx, String fileName) {
File folder = ctx.getFilesDir();
File[] dexes = folder.listFiles();
int index = fileName.lastIndexOf(".");
String name = fileName;
if (index > 0) {
name = fileName.substring(0, index) + ".dex";
} else {
name += ".dex";
}
for (File dex : dexes) {
if (dex.getName().equals(name)) {
dex.delete();
break;
}
}
}
public static final void removePlugin(String pluginId) {
if (plugins.containsKey(pluginId)) {
IPlugin plugin = plugins.remove(pluginId);
Set<String> keys = pluginsLoaded.keySet();
String keyId = null;
for (String key : keys) {
String value = pluginsLoaded.get(key);
if (value.equals(pluginId)) {
keyId = key;
break;
}
}
if (keyId != null) {
pluginsLoaded.remove(keyId);
}
plugin.onUnload();
} else {
BLog.e(TAG, "plugin not exists:" + pluginId);
}
}
}