我正在开发一个Android库,需要从中央服务器进行频繁更新。我在想如果我的库可以更新自己会有多好 - 或者我是否可以在安装应用程序时发布一个下载目标库的引导库。

我在1.5中看到这个叫做“DexClassLoader”的类。但除了API文档之外,网上似乎还有一些宝贵的东西。有没有人成功地使用过这个我描述过的场景?

此外,Android Market的条款是否允许这样的事情?

有帮助吗?

解决方案

我已成功使用 DexClassLoader 。提供实际可由您的应用程序编写的 dexOutputDir 非常重要,因此 / data / dalvik-cache 。否则,日志将显示一行或两行关于无法写入,然后是 ClassNotFoundException

cl = new DexClassLoader("/full/path/com.example.apk",
                        getFilesDir().getAbsolutePath(),// /data/data/foo/files
                        null,  // native lib path, I haven't used this
                        MyClass.class.getClassLoader());
// This doesn't make Class.forName() work, instead I do this:
Class<?> foo = cl.loadClass("com.example.foo");

要使 Class.forName()工作,你可以尝试 Thread.setContextClassLoader()(我还没有)。

其他提示

确实你想要的是支持和工作。 DexClassLoader 对我不起作用,但以下代码运行正常。

DexFile df = new DexFile(new File("/data/app/my_downloaded_lib.apk"));
ClassLoader cl = getClassLoader();
Class clazz = df.loadClass("com/my/lib/MyClass", cl);

关于市场问题,我认为没有任何问题,但您必须阅读EULA以确定。

DexClassLoader 是正确的答案。应用程序不应该直接使用 DexFile (它应该由类加载器使用)。

您可以使用外部存储( / sdcard )或应用程序的私有数据区域来获取 dexOutputDir 参数。外部存储通常较大,但如果卡被弹出,您的应用程序将被终止,并且由于缺乏文件权限强制执行,第三方很容易替换您的代码。这可能允许恶意应用程序导致您的应用程序执行任意操作。 (无论如何你想要这样做,通过 Environment.getExternalStorageDirectory()获取路径;需要 WRITE_EXTERNAL_STORAGE 权限。)

app-private数据区(从 Context.getFilesDir()获取路径)更安全,并且还具有在卸载应用程序时自动清理的优势。这是推荐的方法。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top