这段时间在项目中做了一些感觉不错的模块化功能,然后又看见代码有些冗余,就想做成依赖库,模块化。使用起来更方便。
接下来,就搜人家是怎么做的,这俩天试了很多,产生了一些依赖库冲突问题,搜索到高票博客上基本都只是简单的写了流程,很大一部分都没说明,会产生的依赖库冲突问题。那我就记录下遇到的依赖库冲突问题,并给出一些解决方案。
好了,进入正题,我们先完整的跑一遍发布依赖库流程。
首先,我们先测试下github是否能连通。点下“test”,显示“Connection successful”,说明连接github没问题。
接下来,新建一个项目,设置好项目,包名这些,然后全部next就行了。
新建完项目后,我们需要建一个库,这就是我们需要用到的依赖库,建库的选项,参照下图。
点了“Module”后,会进入下图,选择“Android Library”
依赖库也是有包名,修改下面信息为你所满意的信息,点“Finish”就行了
建完库后,是下面的文件结构
1.坑点所在
在上传之前,我们修改下,库的gradle代码,将“implementation”改成“compileOnly”,这个是解决冲突的一个较好的途径,解决这个冲突,如果不修改,这地方可能会产生冲突,也可能不会产生项目(我在公司的项目里不修改直接引用就会产生冲突,新建项目引用就没有产生冲突,牛批。但是建议最好修改下),据我所知有俩个办法:
1.这里可以看见appcompat是v7:28.0.0,说明targetSdkVersion 是28,这要求我们的引用项目的targetSdkVersion 也改成28,这样做确实能解决问题,亲测可以。但是,测试中可以这样解决,生产中要是你有多个依赖库targetSdkVersion都不一样,那你就没辙了
2.库的gradle代码,将“implementation”改成“compileOnly”。
引用依赖库,AS会自动合并你的gradle和AndroidManifest.xml,当依赖库和你的项目targetSDK不一样,合并的时候会产生依赖冲突。使用“compileOnly”说明这个依赖库只参与编译,代码中可以引用依赖库中的相关方法,不参与打包。
比如:如果你在你的依赖库中,使用compileOnly引用了OkHttp这个依赖库的话,依赖库中使用OkHttp方法,实例其中的对象,都是可以的。当别人引用了你的依赖库,必须在gradle(app)中使用implementation引用OkHttp这个依赖库,如果不引用的话,在你的依赖库中那些使用OkHttp的地方全部爆红,编译过不了的。这样可以确保只存在一个依赖库,不会冲突。
之前也可以用“provided”,但是Google已经不赞成使用了,那我们就使用“compileOnly”。
在库里写个简单的方法,建个“MyFunction”类,写个“showToast”方法,弹出信息。
我们也可以在本地,引用我们建的依赖库(这个不是重点,在这里备忘下)
1.把整个module库文件夹复制到工程的根目录
2.在工程的settings.gradle中增加对module的引用。
由include ‘:app’变成include ‘:app’, ‘:ytaolibrary’
3.在工程的主module (Module: app)中增加对库module的引用
implementation project(path: ':ytaolibrary')
现在,我们将我们的依赖库上传到github上,选择“Share Project On GitHub”
填完信息,点下分享就行了
这里我们选择“app”和不选择“app”都可以,“YTAOLibrary”和“ytaolibrary”都是需要选的。
这样就上传成功了,如果之前没上传过,会弹出填写“账号”,“密码”对话框,填下github的账号密码就行了
我们上传到github上面的项目,选择“releases”
选择“Create a new release”
填写完信息,选择“Publish release”提交
接下来,我们进入 https://jitpack.io JitPack网站,先复制下我们的项目链接
进入jitpack一般会自动提示绑定github,很智能。我们将复制的网址贴贴到“Look Up”前,点击“Look Up”会刷出“Version”
点击“Get it”,然后就可以了
2.小坑点(JitPack所给的俩个配置,一定要在相应地方写对)
OK,这样我们就能引用了。记住maven的依赖是“allprojects”下的“repositories”中。
最后测一下:添加依赖库;调用下依赖库里面的方法
真机上跑一下程序,可以看到,弹出了toast,依赖库里面的方法成功调用了
总结:编译环境:Android Studio 3.2.0; 真机:小米;文章中的依赖库项目,和最后的调用依赖库项目,均是新建项目,我写这篇文章,也是跑了一套完整的流程。到最后的运行,没报依赖库冲突的错误。相信大家完整的照着文章流程跑一遍,也会没问题的。
3.密集坑点说明加解决
大家引用依赖库,可能因为依赖库的原因会产生各种依赖库冲突错误,我在这里整理了解决的方法
3.1 修改自己项目的AndroidManifest.xml文件
在manifest里加这句:xmlns:tools="http://schemas.android.com/tools"
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
package=".........">
在application里加上这句:tools:replace="android:allowBackup, android:theme, android:icon"
<application
...
tools:replace="android:allowBackup, android:theme, android:icon">