这是百度应用程序构建的Maven服务器后端. 单击一个以查看详细信息:

有上传的二进制aar,也有pom文件,以及我们在上传时自定义的文件自述文件
在读取远程POM文件之后,我们正在研究二进制文件在下载后如何存储在本地
这是一个简单的POM文件
您可以看到有两个依赖项. 应当注意,作用域也分为运行时和编译. 运行时将不参与编译,但将参与打包,而compile将参与编译和打包
两个实际示例:
一个: 假设A依赖于B,而B依赖于C
B使用对C的实现依赖
B中的Foo类继承自C中的Bar
在A中使用Foo类时,会出现错误,并且找不到Bar类. 该解决方案只能让A再次依赖C,因此您应尽量避免使用继承
二: 假设A依赖于B,而B依赖于C
BC是二进制的,并且B的POM中对C的依赖是运行时
在Gradle 4.4中,A仍可以调用C代码,此问题在Gradle 5.0之后已得到解决
什么是依赖冲突:
假定ABC是源代码,D是二进制文件,A声明依赖于B,A声明依赖于C,B声明依赖于D 1.0版,C声明依赖于D 1.1版. 目前,D具有依赖项冲突,需要确定是使用1.0还是使用版本1.1
如何解决依赖冲突:
编译时,B在编译时取决于D的1.0版本,而C在编译时取决于D的1.1版本,但是最终打包到apk中的D的版本是1.1,因为版本号冲突,默认情况下,最高版本是默认选择的Gradle为我们提供了一系列解决依赖关系冲突的规则,例如: 不允许交付依赖关系,排除删除依赖关系,用另一个组件替换组件,这些方法没有一个一个地介绍,百度可以根据需要添加规则: 如果最终应用程序的版本号高于version.properties中定义的版本号,则会报告错误
注意:
假设D发布了1.2版,但B和C都没有发布基于D 1.2版的新版本,则最终的软件包仍然是D的1.1版,因此所有组件最终都打包到了APK软件包中. 版本为version.properties. 定义的版本假定D的MavenId从D更改为E,C释放基于E的二进制文件,而B仍然相同. 在实际包装中,将报告重复的错误. 原因是B的POM文件取决于D,因此需要让B根据重命名为E的E重新发行二进制文件.
有了以上的预兆,让我们实际了解执行打包任务时实际执行了哪些任务. 环境配置如下:

5.1.1级
Android Gradle插件3.1.2
org.gradle.parallel = true打开并行编译
发布软件包minifyEnabled是
执行命令以获取如下所示的输出
# --dry-run 表示不实际执行每个 Task
gradlew assembleRelease --dry-run
有许多任务. 接下来,我将为大家介绍一些重要的任务. 其余没有被介绍的感兴趣的学生可以找到相应的实现类以查看其实现.
说明: 进行一些预编译检查
一个例子: 有些人可能会遇到以下错误
"Android dependency "+ display+ "is set to compileOnly/provided which is not supported"
其原因是由前面提到的compileClasspath和runtimeClasspath引起的.
当组件的compileClasspath是版本1.1.1(由于不同的相关配置项)而其runtimeClasspath是版本1.1.2时,preBuild将检测到此问题并将错误报告给我们处理
类: AidlCompile
描述: 在内部,AidlProcessor用于调用call方法,而build-tool下的aidl用于执行编译.
这些任务使我们能够在整个编译项目中动态生成一些代码. 生成的资源需要与现有资源合并,有必要注意覆盖现有资源的可能性,在此不再赘述
第一步: 我们拥有app项目下的Java源文件,以及AIDL,generate,R.java等生成的Java源文件,以及它自己的依赖项,即源子项目,以及远程aar解压缩. 一系列二进制文件,例如jar包. 源文件是javac需要编译的文件. 二进制文件.jar / .class是javac编译诸如类名之类的符号时. 在哪里找到集合,对应的javac参数是-classpath
此参数实际上是compileClasspath的应用程序. 如果您的源文件引用了一个类,并且其jar包不在compileClasspath中,则在编译期间未找到javac时,它将报告错误.
第2步: 将源文件编译成类文件后gradle 不是内部或外部,Google提供了一种Transform机制,使我们可以在打包前修改二进制文件. 例如,上图所示的app: transformClassesWithXXXForRelease SKIPPED是我们自定义的Transform. 通过: app: transformClassesAndResourcesWithProguardForRelease跳过您还可以看到Proguard也通过Transform机制实现. 这是图片中的.class文件,一个是.jar / .class文件,第一个显然是javac编译的产物,第二个是runtimeClasspath,它是需要打包的二进制文件. 我相信每个人都了解compileClasspath和runtimeClasspath如何影响打包过程
步骤3: 在Transform处理完所有类文件之后,下一步是将.class文件转换为.dex文件. 值得注意的是,javac只能找到源代码中的问题,而不能找到二进制文件中未参与编译的问题. 在dex转换过程中,您会发现诸如类重复的问题或一个类,名称不变,但是该类已成为严重的代码问题,如Interface.
第四步是打包先前的资源. 对应的类是PackageApplication,获取此Task后可以自定义打包内容
尽管它仅提供了一些常用配置的概述,但没有详细介绍Gradle和Android Gradle插件的相关内容,例如Gradle的生命周期,插件开发,Transform机制等,但是如果您阅读它,您会看到整个编译工具. 该链有一个大致的了解,并且您可以了解在需要时从哪个方向解决问题,这就是本文的价值.
作者:
xuduokai
本文来自电脑杂谈,转载请注明本文网址:
https://www.pc-fly.com/a/ruanjian/article-201115-2.html
至甲午海战时