package com.tws.plugin.core; import java.util.HashMap; import tws.component.log.TwsLog; import android.text.TextUtils; import com.tws.plugin.bridge.TwsPluginBridgeReceiver; import com.tws.plugin.bridge.TwsPluginBridgeService; import com.tws.plugin.content.PluginDescriptor; import com.tws.plugin.manager.PluginManagerHelper; import dalvik.system.DexClassLoader; /** * 为了支持Receiver和Service,增加此类。 * * @author yongchen * */ public class HostClassLoader extends DexClassLoader { private static final String TAG = "rick_Print:HostClassLoader"; private static HashMap<String, String> sPluginInHostAMF_ServiceMap = new HashMap<String, String>(); static { sPluginInHostAMF_ServiceMap.clear(); // sPluginInHostAMF_ServiceMap.put("com.pacewear.tws.demo.service.PaceService", "com.example.plugindemo"); sPluginInHostAMF_ServiceMap.put("com.pacewear.tws.wallet.service.PaceApduService", "com.pacewear.tws.phoneside.wallet"); } public HostClassLoader(String dexPath, String optimizedDirectory, String libraryPath, ClassLoader parent) { super(dexPath, optimizedDirectory, libraryPath, parent); } @Override public String findLibrary(String name) { TwsLog.d(TAG, "findLibrary:" + name); return super.findLibrary(name); } @Override protected Class<?> loadClass(String className, boolean resolve) throws ClassNotFoundException { // Just for Receiver and Service TwsLog.d(TAG, "loadClass className:" + className + " resolve=" + resolve); if (className.startsWith(PluginIntentResolver.CLASS_PREFIX_SERVICE)) { TwsLog.d(TAG, "className is " + className + " PluginShadowService is " + PluginShadowService.class.getName()); // 这里返回PluginShadowService是因为service的构造函数以及onCreate函数 // 2个函数在ActivityThread的同一个函数中被调用,框架没机会在构造器执行之后,oncreate执行之前, // 插入一段代码, 注入context. // 因此这里返回一个fake的service, 在fake service的oncreate方法里面手动调用构造器和oncreate // 这里返回了这个Service以后, // 由于在框架中hook了ActivityManager的serviceDoneExecuting方法, // 在serviceDoneExecuting这个方法里面, 会将这个service再还原成插件的servcie对象 if (className.equals(PluginIntentResolver.CLASS_PREFIX_SERVICE + "null")) { TwsLog.e(TAG, "到了这里说明出bug了,这里做个容错处理, 避免出现classnotfound"); return TwsPluginBridgeService.class; } else { return PluginShadowService.class; } } else if (className.startsWith(PluginIntentResolver.CLASS_PREFIX_RECEIVER)) { String realName = className.replace(PluginIntentResolver.CLASS_PREFIX_RECEIVER, ""); Class<?> clazz = PluginLoader.loadPluginClassByName(realName); if (clazz != null) { TwsLog.d(TAG, "className is " + className + " target is " + realName + (clazz == null ? " null" : " found")); return clazz; } else { TwsLog.e(TAG, "到了这里说明出bug了,这里做个容错处理, 避免出现classnotfound"); return TwsPluginBridgeReceiver.class; } } else { final String pluginId = sPluginInHostAMF_ServiceMap.get(className); if (!TextUtils.isEmpty(pluginId)) { PluginDescriptor pluginDescriptor = PluginManagerHelper.getPluginDescriptorByPluginId(pluginId); if (pluginDescriptor != null) { Class<?> clazz = PluginLoader.loadPluginClassByName(pluginDescriptor, className); if (clazz != null) { TwsLog.d(TAG, "className is " + className + " target is in plugin:" + className + (clazz == null ? " null" : " found")); return clazz; } } TwsLog.e(TAG, "到了这里说明出bug了,这里做个容错处理, 避免出现classnotfound"); return TwsPluginBridgeService.class; } } return super.loadClass(className, resolve); } }