引入aar的衝突無所不在,經過遠程依賴maven的包能夠經過exclude
關鍵字搭配module
和group
去除某個組,沒辦法去除具體的類。html
那麼若是是單獨的aar包,想要排除aar下classes.jar包裏的某個單獨的包或者類怎麼辦?java
須要接入的jar包已經帶了騰訊X5核心,當前依賴的已經包含X5核心,衝突又該如何解決呢?git
當前的gradle腳本(項目連接:https://github.com/luohongxfb... )能夠解決。github
如excludelib/libs/exampleAAR.aar,左邊是未去除的包結構,右邊是去除com.baidu
以後的:maven
如excludelib/libs/exampleJAR.jar:gradle
(1)將須要排除的aar或者jar包放在excludelib/libs下。ui
(2)更改excludelib/build.gradlethis
//須要排除的aar或者jar。(替換成須要排除的) artifacts.add("exclude", file('libs/exampleAAR.aar')) artifacts.add("exclude", file('libs/exampleJAR.jar'))
(3)設置排除規則 若是您須要排除aar,那麼請更改excludelib/excludeAar.gradle;若是您須要排除jar,那麼請更改excludelib/excludeJar.gradle
//須要排除的包名 def excludePackages = ['com.baidu'] //須要排除的類(須要全類名) def excludeClasses = []
(4)運行排除任務
排除後生成的aar在excludelib/build/excludeaar下,排除後生成的jar位於excludelib/build/excludejar。
而後就能夠愉快的使用啦~
aar排除步驟:
一、獲取到須要排除的原始AAR包
二、解壓AAR包(zipTree配合Task Copy)
三、解壓AAR包中的class.jar(zipTree配合Task Copy)
四、按照排除規則對解壓的class.jar從新打包(Task Jar)
五、從新打包成AAR包(Task Zip)
jar排除步驟
一、獲取到須要排除的原始jar包
二、解壓jar包(zipTree配合Task Copy)
三、按照排除規則對解壓的jar從新打包(Task Jar)
task unZipAar(type: Copy) { def zipFile = getDefaultAar() def outputDir = unZipAarFile from zipTree(zipFile) into outputDir }
主要原理:zipTree配合Copy,實現解壓。
Copy Task官方講解:https://docs.gradle.org/curre...
ziptree源碼主要解析:建立一個新的file tree包含原來zip的內容,能夠配合Copy實現解壓。
public interface Project{ /** * <p>Creates a new {@code FileTree} which contains the contents of the given ZIP file. * You can combine this method with the {@link #copy(groovy.lang.Closure)} * method to unzip a ZIP file * @param zipPath The ZIP file. Evaluated as per {@link #file(Object)}. * @return the file tree. Never returns null. */ FileTree zipTree(Object zipPath); }
task zipJar(type: Jar) { baseName = 'classes' from unZipJarFile destinationDir unZipAarFile exclude getExcludePackageRegex(excludePackages) exclude getExcludeClassRegex(excludeClasses) }
這個步驟就是把以前解壓的classes.jar文件,按照排除規則用Task Jar從新打包成jar文件。
Task Jar官方講解:https://docs.gradle.org/curre...
Property/Method | Description |
---|---|
baseName | 壓縮後的jar文件名。 |
from(sourcePaths) | 須要壓縮的目錄。 |
destinationDir | 壓縮後存放的目錄。 |
exclude(excludes) | 須要排除的文件。 |
task excludeAar(type: Zip) { group 'ex' description '生成一個排除以後的aar包' baseName excludeAarName extension "aar" from unZipAarFile destinationDir excludeAarFile }
對classes.jar處理完成的aar重打包,主要用到Task Zip。
Task Zip官方講解:https://docs.gradle.org/curre...
Property/Method | Description |
---|---|
group | setGroup(String group) 將當前的Task設置到指定組。 |
description | setDescription(@Nullable String description) Task描述。 |
baseName | 壓縮後的aar文件名。 |
extension | 壓縮後的文件擴展名。 |
from(sourcePaths) | 須要壓縮的目錄。 |
destinationDir | 壓縮後存放的目錄。 |