Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

在 gradle 7.0.2 运行不起来 #17

Open
WTree opened this issue Oct 19, 2021 · 2 comments
Open

在 gradle 7.0.2 运行不起来 #17

WTree opened this issue Oct 19, 2021 · 2 comments

Comments

@WTree
Copy link

WTree commented Oct 19, 2021

java.lang.NullPointerException at com.android.ide.common.resources.NodeUtils.processSingleNodeNamespace(NodeUtils.java:186) at com.android.ide.common.resources.NodeUtils.updateNamespace(NodeUtils.java:147) ....

@achenglike
Copy link

研究了2天吧,最终解决方法就是在 root工程的gradle.properties添加:

systemProp.javax.xml.parsers.DocumentBuilderFactory=com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderFactoryImpl

原因:

我觉得是 gradle 或者 agp 的bug,DocumentBuilderFactory#newInstance() 在找底层实现的时候,出现了同一个方法返回了两种实现一个是 com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderFactoryImpl 另一个是 org.apache.xerces.jaxp.DocumentBuilderFactoryImpl 然后调用到 NodeUtils#adoptNode(Document document, Node node) 时 document和node来自不同的实现,adoptNode 就直接返回了NULL,后面就空指针了。

解决:

DocumentBuilderFactory#newInstance() 再向下走创建实例的过程中有一步是查看是否设置了SystemProperty

try {
            factoryClassName = SecuritySupport.getSystemProperty(factoryId);
            if (factoryClassName != null) {
                dPrint(() -> {
                    return "found system property, value=" + factoryClassName;
                });
                return newInstance(type, factoryClassName, (ClassLoader)null, true);
            }
        } catch (SecurityException var9) {
            if (debug) {
                var9.printStackTrace();
            }
        }

直接通过gradle.properties定义下这个property,这样获取的实现就一致了

求助:

DocumentBuilderFactory#newInstance() 后面的实例化 DocumentBuilderFactory 的过程中有使用ServiceLoader,

private static <T> T findServiceProvider(final Class<T> type) {
        try {
            return AccessController.doPrivileged(new PrivilegedAction<T>() {
                public T run() {
                    ServiceLoader<T> serviceLoader = ServiceLoader.load(type);
                    Iterator<T> iterator = serviceLoader.iterator();
                    return iterator.hasNext() ? iterator.next() : null;
                }
            });
        } catch (ServiceConfigurationError var4) {
            RuntimeException x = new RuntimeException("Provider for " + type + " cannot be created", var4);
            FactoryConfigurationError error = new FactoryConfigurationError(x, x.getMessage());
            throw error;
        }
    }

就是这个地方,出现了本插件使用流程中实例化查不到实现,其它情况能查到,哪位知道原因的话,烦请回复下。

@zhangjibiao
Copy link

我是遇到了这个错误后,从搜索引擎找到这里的,我的情况是资源文件也就是res目录下的文件存在错误。

我是这样子排查的,新建空的AS项目,编译通过后,git init并提交,通过版本控制工具来整理
然后先将res/values/string.xml拷贝过来,编译测试
再拷贝/values/...等其他文件,一个一个(或者一整个目录)编译进行测试,编译成功便说明没有问题,git add . 记录一下

最终找出了很多错误,解决错误后再拷贝回来原项目
Uploading 2020-07-26_221719 - 副本.png…

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

3 participants