这是对我提出的一个较旧问题的更新,我把它变成了一个新问题,因为我有很多新信息,而且我从来没有得到任何有用的答案。我有点解决了这个问题,但我想了解原因。
旧问题:
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
上发生,而不会出现问题。
那么我做错了什么?
感谢。