从 AGP 4.1.2 到 7.5.1——XmlParser、GPathResult、QName 过时

新年首发,
去年的问题,今年解决~

问题 & 排查

1: Task failed with an exception.
-----------
* What went wrong:
Execution failed for task ':app:processCommonReleaseManifest'.
> org.xml.sax.SAXParseException; lineNumber: 1; columnNumber: 38; 
> 元素类型 "manifest" 必须后跟属性规范 ">""/>"

定位到了问题所在代码,且能成功复现,异常是在 XmlUtil.serialize 里面抛出。

//问题复现
def xmlpath = projectDir.getAbsolutePath() + File.separator + "testdata" + File.separator + "AndroidManifest.xml"
println("xmlpath: " + xmlpath)

def xmlNode = new XmlParser().parse(new File(xmlpath).getPath())
println("xml node: " + xmlNode)

println("xml serialize begin!")
def serialize = groovy.xml.XmlUtil.serialize(xmlNode)
println("xml serialize done!")

从 AGP 4.1.2 到 7.5.1——XmlParser、GPathResult、QName 过时_第1张图片

从 AGP 4.1.2 到 7.5.1——XmlParser、GPathResult、QName 过时_第2张图片

我们发现复现代码中 XmlParser是一个过时的,不仅如此整个groovy.util包下都是过时的类,其中一部分过时的类使用新包groovy.xml下的同名类代替。

从 AGP 4.1.2 到 7.5.1——XmlParser、GPathResult、QName 过时_第3张图片
果然,更换过时类的包名重新打包没有报错了。

解决

同类目更换导包路径即可。

//过时类
import groovy.util.XmlParser;
import groovy.util.slurpersupport.GPathResult
import groovy.xml.QName


//新类
import groovy.xml.XmlParser
import groovy.xml.slurpersupport.GPathResult
import groovy.namespace.QName

其他问题

assets 资源输出目录:从 merged_assets 变成 assets

检查你的代码,如果有对 assets 资源的操作,注意代码适配,且新版 assets 后面没有了out 子目录,比如我的代码就需要调整路径。

//调整常量 FILE_DIR_MERGED_ASSETS,移除拼接的 out 目录
String outFolder = PluginFileUtils.adjustPath(mProject.projectDir.path,
        FileConstant.FILE_DIR_BUILD,
        FileConstant.FILE_DIR_INTERMEDIATES,
        FileConstant.FILE_DIR_MERGED_ASSETS,
        CommUtils.getFirstCharLowercaseStr(CommonManager.getmVariantName()))

从 AGP 4.1.2 到 7.5.1——XmlParser、GPathResult、QName 过时_第4张图片

你可能感兴趣的:(android)