/** *创建类加载器,把dex加载到虚拟机中 *第一个参数:是指定apk安装的路径,这个路径要注意只能是通过actInfo.applicationInfo.sourceDir来获取 *第二个参数:是C/C++依赖的本地库文件目录,可以为null *第三个参数:是上一级的类加载器* * T 是需要创建实例的接口, 插件中实现接口, 在Host中通过接口调用插件功能. */ private inline fun <T> createPluginInstance(context: Context, pkgName: String, className: String): T? { var dynamic: Class<*> /** 使用PathClassLoader方法加载类 */ val apps = context.packageManager.getInstalledApplications(PackageManager.MATCH_UNINSTALLED_PACKAGES) // 获得指定包名的applicationInfo的信息 try { val applicationInfo = apps.first { it.packageName == pkgName } val sourceDir = applicationInfo.sourceDir val libPath = applicationInfo.nativeLibraryDir println("sourceDir: $sourceDir") println("libPath: $libPath") val pcl = PathClassLoader(sourceDir, libPath, context.classLoader) dynamic = pcl.loadClass(className) return dynamic.newInstance() as T } catch (e: NoSuchElementException) { Log.w(TAG, Log.getStackTraceString(e)) } catch (e: ClassNotFoundException) { Log.w(TAG, Log.getStackTraceString(e)) } return null }
fun getTestPlugin(context: Context): ITestPlugin? { return createPluginInstance(context, PLUGIN_PKG_NAME, TEST_CLASS_NAME) }