Kotlin 反射已经安装的Apk并创建对象实例

/**
 *创建类加载器,把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)
}

猜你喜欢

转载自my.oschina.net/sfshine/blog/1826156
今日推荐