我正在开发android企业应用程序,我想在运行时使用一些文件。我可以使用 Java Reflection 使用简单的类,我也想使用Fragment。
例如,我创建了 TestingDummyJar.jar并放入SDCard 。
用法 - 首先我使用DexClassLoader加载这个jar然后加载类。 它非常适合简单类 -
final File tmpDir = this.getDir("dex", 0);
classloader = new DexClassLoader("/SDcard/TestingDummyJar.jar", tmpDir.getAbsolutePath(), null, this.getClassLoader());
mLoadedClass = (Class<Object>) classloader.loadClass("com.example.testingdummyjar.TestingDummyReflection");<br>
但是当我尝试将片段加载为 -
mLoadedClass = (Class<Object>) classloader.loadClass("com.example.testingdummyjar.ImageParticularFragment");
抛出异常&#34; java.lang.IllegalAccessError:预验证类中的类ref已解析为意外实现&#34;
谁能告诉我,是否有可能从Jar文件中加载片段? 如果是,那么请给我一些线索如何做到?
找到解决方案寻求帮助。
我试图从jar文件加载的片段是使用 android.support.v4库,我想要使用的应用程序也使用 android.support.v4库 。但是两个应用程序都需要Library,因为在这两个应用程序中都使用了片段
所以我想删除 android.support.v4库。你能帮我摆脱它吗?
提前致谢!
答案 0 :(得分:1)
如果您使用的是Android Studio,或者正在使用Gradle,请将主要应用和您通过DexClassLoader
加载的JAR之间共享的依赖关系范围更改为provided
,而不是{{1} }。
在您的情况下,应用和JAR都依赖于compile
。在应用中,正常使用support-v4
。在JAR中,使用compile 'com.android.support:support-v4:24.2.0'
。
在Android 5.0+上似乎不需要这样,可能是因为ART。在4.4及更老版本中,如果应用程序和JAR具有相同的类,Dalvik会感到恼火。切换到provided 'com.android.support:support-v4:24.2.0'
说“针对这些类编译,但不要将它们打包到库中,因为我们将从其他地方获得这些类的实现”。在这种情况下,JAR从应用程序的类加载器(provided
)获取实现。