1、引入開源項目的方式java
使用開源項目 MultiType 的兩種方式:android
一、maven引入:在主Module 的 build.gradle 中加入git
dependencies {
......
compile 'me.drakeet.multitype:multitype:2.3.0'
}
二、建立爲 library 包:在 https://github.com/drakeet/MultiType/releases 將開源項目 MultiType 下載下來,將其中的 library 包複製拷貝到與主 Module 同個目錄下並重命名爲 multitype 以下:github
項目目錄:api
接着,修改 重命名爲 multitype 後的文件夾下的 build.gradle 爲app
apply plugin: 'com.android.library'
最後,在主Module 中引入該 libaray,以下:maven
dependencies {
......
compile project(':multitype')
}
注意: maven 引入時若指定的 sdk最低版本 與開發的項目的 sdk最低版本 衝突則要在主Module (彷佛是在這裏,忘了)的中覆蓋引入項目的編譯版本。建立 library 包時則能夠直接在該 library 包的 build.gradle 文件中修改這個開源項目的 sdk編譯版本。不管哪一種方式都要注意 主Module的 sdk最低版本 不能低於 開源項目的 sdk最低版本,否則當手機的版本低於 開源項目的 最低版本則用不了這個開源項目。gradle
例子:公司項目中的 minSdkVersion 8 而 開源項目的 minSdkVersion 9 ,只能修改 公司項目的 minSdkVersion 爲 9。ui
2、兩種方式各自出現的問題以下:spa
一、sdk最低版本衝突:開源項目指定的 sdk最低版本 與開發的項目的 sdk最低版本 衝突。提示以下:
Error:Execution failed for task ':xxx:processXxxDebugManifest'.
> Manifest merger failed with multiple errors, see logs
二、依賴包重複:開源項目須要用 RecyclerView,爲兼容低版本的系統,引入了 v7包(目錄結構以下:)中的 recyclerview 的包。
開源項目中的 build.gradle 中的依賴以下:
dependencies {
testCompile 'junit:junit:4.12'
compile 'com.android.support:support-annotations:24.2.1'
compile 'com.android.support:recyclerview-v7:24.2.1'
}
而 RecyclerView 的使用是依賴於 v4 包的。而公司項目中有將 v7 中的 v4的jar包(v4的jar包下含 annotation 和 v4)引入單獨成爲一個 library 包,這會於引入的 開源項目的依賴包()重複。
公司項目將 v7 自成一個 library 包以下:
錯誤提示:
Error:Execution failed for task ':taojinroad:transformClassesWithJarMergingForXxxDebug'.
> com.android.build.api.transform.TransformException: java.util.zip.ZipException: duplicate entry: android/support/annotation/IntegerRes.class
3、解決方法
maven 引入的解決方法
一、sdk最低版本衝突
要在主Module (彷佛是在這裏,忘了)的中覆蓋引入項目的 minSdkVersion 。前提是主 Module 的 minSdkVersion 不能低於 開源項目的 minSdkVersion,不然在 系統版本 過低的手機上沒法使用這一開源項目。
二、依賴包重複
將開源項目中的依賴包去掉,以下:
dependencies {
......
compile ('me.drakeet.multitype:multitype:2.3.0'){
exclude group: 'com.android.support', module: 'support-v4'
exclude group: 'com.android.support', module: 'support-annotations'
}
}
建立開源項目爲 library 包的解決方法
一、sdk最低版本衝突
能夠修改 主 Module 的 minSdkVersion 或 開源項目的 minSdkVersion 使它們一致。前提是主 Module 的 minSdkVersion 不能低於 開源項目的 minSdkVersion,不然在 系統版本 過低的手機上沒法使用這一開源項目。
二、依賴包重複
前提:library 包中含 build.gradle 文件且可在裏面修改相應的依賴。也就是說不能將 開源項目的 jar包 或 aar包 直接引入成爲一個 library(上面提到的 公司裏的建立的一個 v7 的 library 包就是這種狀況。以 jar包形式引入則沒法在 build.gradle 中看到引入的依賴,所以沒法修改這些依賴),而應該直接將源代碼引入成爲一個 library 包。以下:
不能用此方法的:
可用此方法的:
將 build.gradle 中的
dependencies {
testCompile 'junit:junit:4.12'
compile 'com.android.support:support-annotations:24.2.1'
compile 'com.android.support:recyclerview-v7:24.2.1'
}
修改成
dependencies { testCompile 'junit:junit:4.12' // compile 'com.android.support:support-annotations:24.2.1' // compile 'com.android.support:recyclerview-v7:24.2.1' compile('com.android.support:recyclerview-v7:23.2.1') {//注意:這裏的RecyclerView 的版本與 v7的 library中的 v4包的版本同樣是 23.2.1// exclude group: 'com.android.support'//這個是 exclude 掉全部 support 包 exclude group: 'com.android.support', module: 'support-v4' exclude group: 'com.android.support', module: 'support-annotations' } compile project(':android-support-v7-appcompat')//這是 v7 的 library包 含 v4 和 annotation }