Android远程代码加载

时间:2009-06-16 14:43:37

标签: android auto-update

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

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

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

3 个答案:

答案 0 :(得分:13)

我已成功使用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()(我没有)。

答案 1 :(得分:3)

确实你想要的是支持和工作。 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以确定。

答案 2 :(得分:2)

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

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

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