我正在开发一个Android库,需要从中央服务器进行频繁更新。我在想如果我的库可以更新自己会有多好 - 或者我是否可以在安装应用程序时发布一个下载目标库的引导库。
我在1.5中看到这个名为“DexClassLoader”的类,但除了API文档之外,网上似乎还有一些珍贵的东西。有没有人成功地使用过这个我描述过的场景?
此外,Android Market的条款是否允许这样的事情?
答案 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()
获取路径)更安全,并且还具有在卸载应用时自动清理的优势。这是推荐的方法。