在 Android 应用程序中,我在几个地方实现了接口 javax.xml.namespace.NamespaceContext。该接口有 3 个方法,我只关心 1 个(如果调用其他两个方法中的任何一个,我们将抛出异常)。我们关心的签名是:
String getNamespaceURI(String prefix);
以前是用 Java 实现的,现在是用 Kotlin 实现的。直到昨晚我开始使用“minifyEnabled true”进行测试时,Kotlin 的实现似乎都运行良好。
使用 minifyEnabled,我得到以下异常:
java.lang.IncompatibleClassChangeError: Class ‘mypackage.content.loader.EPubNamespaceResolver' does not implement interface 'javax.xml.namespace.NamespaceContext' in call to 'java.l
ang.String javax.xml.namespace.NamespaceContext.getNamespaceURI(java.lang.String)' (declaration of 'org.apache.xpath.jaxp.JAXPPrefixResolver' appears in /apex/com.android.art/javalib/apache-xml.jar)
E at org.apache.xpath.jaxp.JAXPPrefixResolver.getNamespaceForPrefix(JAXPPrefixResolver.java:47)
E at org.apache.xpath.compiler.Lexer.mapNSTokens(Lexer.java:596)
E at org.apache.xpath.compiler.Lexer.tokenize(Lexer.java:365)
E at org.apache.xpath.compiler.Lexer.tokenize(Lexer.java:98)
E at org.apache.xpath.compiler.XPathParser.initXPath(XPathParser.java:112)
E at org.apache.xpath.XPath.<init>(XPath.java:178)
E at org.apache.xpath.XPath.<init>(XPath.java:266)
E at org.apache.xpath.jaxp.XPathImpl.eval(XPathImpl.java:195)
E at org.apache.xpath.jaxp.XPathImpl.evaluate(XPathImpl.java:281)
我在 Java 中没有任何 proguard 规则,它只是工作。我试着用混淆规则来保留它,我试过@Keep。我尝试研究参数和返回类型是否可为空。我只是不能让它在 Kotlin 中与 minifyEnabled 一起工作。
尝试添加 proguard 规则作为
-keep class javax.xml.** { *; }
。一旦你成功执行它。然后,缩小范围以进行更多优化。通过错误日志,您的界面看起来也正在缩小。