从其他APK动态加载类

3
我正在创建一个框架,供我工作环境中的许多部门使用。 我需要一种方法,可以从各个部门的apk中动态加载类到框架中。 例如,一种将A部门的内容提供程序类动态加载到框架中的方法。
我一直在努力尝试解决这个问题,任何帮助都将不胜感激。谢谢。
2个回答

10

如果您想从设备上当前安装的另一个.apk文件中加载已知类,可以采用以下方法(假设您的类具有默认构造函数)。请记住,您必须知道另一个.apk文件的包名,并且该文件的包名必须与您的应用程序包名不同。

private Object loadClass(String packageName, String className){
    Object plugin = null;
    try {
        PackageManager packageManager = getPackageManager();
        ApplicationInfo appInfo = packageManager.getApplicationInfo(packageName, 0);
        DexFile df = new DexFile(appInfo.sourceDir);
        ClassLoader cl = getClassLoader();
        Class classToInvestigate = df.loadClass(className, cl);
        plugin = classToInvestigate.newInstance();


    } catch (Exception e) {
        System.out.println("EXCEPTION");
    }
    finally{
        return plugin;
    }
}

0

如果允许这样做,我认为这将是一个安全漏洞,而且您的设计风险很高,因为您的程序与他人的程序紧密耦合。

更好的解决方案是能够像在Android中访问联系人一样,只需从您的活动中使用内容提供程序即可。


它将会是紧密耦合的。本质上,我有一个用于发送和接收数据的服务。应用程序可以向该服务注册,因此当数据被接收时,它知道在哪里存储内容(这就是我需要能够加载特定数据库的内容提供程序类的原因)。我想框架不是一个好词。它更像是一个开发工具包,提供了一个JAR文件来访问服务。但我卡在了这个问题上... - jjNford
将所有内容提供程序放在一个地方,但 Android 的优势在于只需调用能够处理所需内容并保存/更新数据的内容提供程序。Android 基于松散耦合,因此您可能希望保持该设计。 - James Black
我同意。这个应用程序将处理非常敏感的信息。现在我有一个远程前台服务正在运行,可以接收和发送网络数据。APK可以绑定到该服务并注册广播接收器和内容观察器。想法是当新数据进入手机时,它可以被放入数据库并触发内容观察器游标,从而发送广播。这样,部门apk的开发人员就可以自己处理调用方式。它还保证了死亡的apk将接收到信号,表明它们有新数据。我只需要一种存储内容的方法。 - jjNford
在正确的数据库中。我认为可以通过使用apk的内容提供者来实现这一点。这允许部门开发人员灵活处理。 (相信我,一个地方听起来不错-但这将潜在地被数百个不同的部门使用-我需要是动态和抽象的,但处理数据流)。 - jjNford
詹姆斯...我是个傻瓜。内容提供程序对每个人都可用。我只需要正确的URI来接收数据...而这个我已经有了。给我惊喜吧...谢谢你的帮助,伙计! - jjNford

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接