Multidex应用程序无法找到jar资源,但只能在某些手机

时间:2017-12-21 17:55:50

标签: android multidex

这是对我提出的一个较旧问题的更新,我把它变成了一个新问题,因为我有很多新信息,而且我从来没有得到任何有用的答案。我有点解决了这个问题,但我想了解原因。

旧问题:

java.util.MissingResourceException: Can't find bundle for base name javax.servlet.LocalStrings

基本上,我的一小部分用户都会遇到这种崩溃。

Fatal Exception: java.lang.ExceptionInInitializerError
       at MyApp$2.run(MyApp.java:364)
       at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1113)
       at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588)
       at java.lang.Thread.run(Thread.java:818)
Caused by java.lang.NullPointerException: Attempt to invoke virtual method 'void java.util.jar.JarVerifier.removeMetaEntries()' on a null object reference
       at java.util.jar.JarFile.getInputStream(JarFile.java:381)
       at libcore.net.url.JarURLConnectionImpl.getInputStream(JarURLConnectionImpl.java:222)
       at java.net.URL.openStream(URL.java:470)
       at java.lang.ClassLoader.getResourceAsStream(ClassLoader.java:444)
       at java.util.ResourceBundle.handleGetBundle(ResourceBundle.java:516)
       at java.util.ResourceBundle.handleGetBundle(ResourceBundle.java:542)
       at java.util.ResourceBundle.handleGetBundle(ResourceBundle.java:542)
       at java.util.ResourceBundle.getBundle(ResourceBundle.java:228)
       at java.util.ResourceBundle.getBundle(ResourceBundle.java:139)
       at javax.servlet.GenericServlet.(GenericServlet.java)
       at MyApp$2.run(MyApp.java:364)
       at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1113)
       at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588)
       at java.lang.Thread.run(Thread.java:818)

当我的应用尝试实例化Servlet时会发生这种情况。基本上GenericServlet正在尝试加载资源,这些是它似乎崩溃的行:

 private static final String LSTRING_FILE = "javax.servlet.LocalStrings";
 private static ResourceBundle lStrings =
        ResourceBundle.getBundle(LSTRING_FILE);

我的应用会在Servlet开始时立即创建onCreate,基本上是Application类的Servlet。所以我发现崩溃的修复方法很难看,但它确实有效。如果我在从onCreate启动的线程中创建Servlet实例,那么对于某些用户来说它会崩溃。如果我在onCreate上创建public void onCreate() { ..... new MyServlet(); ..... 而不延迟它,那么它就不会崩溃。

基本上这不会崩溃:

public void onCreate() {
    .....
    new Thread(){..... new Servlet();}
    .....

但这会:

javax

所以我的猜测是,当我在Servlet上看到onCreate创建时,multidex确保将multiDexKeepFile类和资源保留在主dex文件中。但正如我在上一个问题中提到的,我尝试使用multiDexKeepProguard,最近我尝试multiDexKeepProguard。那他们为什么不工作呢?

-keep class javax.servlet.http.HttpServlet -keep class javax.servlet.GenericServlet -keep class javax.servlet.* -keep class javax.servlet.LocalStrings -keepclassmembers class javax.servlet.LocalStrings 绝望的最新尝试是:

Servlet

但它没有帮助。唯一有帮助的是将第一个Thread实例化移到onCreate之外并转移到Servlet。所有后续的Thread创建和服务器的启动都会在git stash pop上发生,而不会出现问题。

那么我做错了什么?

感谢。

0 个答案:

没有答案