① 处理Gradle依赖冲突
在android开发过程中会总会引入一些第三方依赖库,无可避免的会遇到jar/aar包冲突,Manifest合并冲突,资源冲突等问题
基于此本次主要记录下如何处理类冲突,jar/aar版本冲突。先由常见的com.ta.utdid2.a.a.a found in moles alicloud-android-utdid-2.5.2 android-utdid冲突入手,常见于支付宝sdk和友盟Sdk的冲突。
磨刀不误砍材工,在处理冲突问题前,要先了解下如何查看Gradle依赖树,在AS的Terminal里输入 gradle :app:dependencies 即可查看gradle依赖树。输出结果如下(示意)
输出依赖树后,在里面搜索android-utdid,会发现有多个第三方库对utdid存在引入关系。
经过查看得知utdid我依赖为:com.aliyun.ams:alicloud-android-utdid:2.5.2
该依赖库的Group为com.aliyun.ams。mole为alicloud-android-utdid
下面要做的就是去除其他依赖对utdid的引入,仅保留一次有效的引用关系即可。
implementation ('com.xxx:yyy:0.0.0.4'){
exclude mole: 'alicloud-android-utdid'
}
implementation ('com.aaa:bbb:0.4'){
exclude mole: 'alicloud-android-utdid'
}
常规查阅资料大家推荐去除重复引入的方法都是exclue group。实际上如该group下的依赖项较多,且只想去除某一个依赖时,这时使用exclude mole能更细节且准确的控制去除某一项的引用关系。
以上为utdid的处理方式
关于微信sdk冲突的处理方式
问题背景:我方已集成wechat-sdk-android-with-mta sdk用作分享和支付功能,随着业务发展需要接入一个第三方业务Sdk,该Sdk内部具备支付功能,他们也进行了wechat-sdk-android-with-mta的引入,且两个微信sdk的版本不一致。
此时如果进行打包就会爆出各种com.tecent.xx的类冲突。
处理方式参照支付宝sdk的冲突方式
implementation ('com.xxx:zzz:0.6'){
exclude mole: 'wechat-sdk-android-with-mta'
}
关于网络地图API_KEY冲突的处理方式
网络地图需要在主工程的Manifest里注册一个API_KEY。如此时引入的第三方Sdk里同样有网络地图,且已经在内部注册了com..lbsapi.API_KEY。
此时会出现Manifest.xml的合并冲突。解决方式为增加tools:replace="android:value"属性即可
<meta-data
android:name="com..lbsapi.API_KEY"
android:value=""
tools:replace="android:value"/>
在开发中不同第三方Sdk对基础依赖的版本会发生变化,比如ktx和compact的版本。需要强制指定这些基础依赖的版本统一
方式为在build.gradle(app)里增加
configurations.all{
resolutionStrategy.force'androidx.core:core-ktx:1.8.0-alpha01'
}
后续将持续添加AndroidStudio里各种冲突的处理方式。
② android studio怎么解决冲突
在使用svn 的时候,当然update别人的代码会弹出对话窗口提示你冲突,是否合并。合并有三种方案,accept yours 使用你的、accept theirs使用别人的版本和 merge合并。
当你选择merge合并的时候,会弹出代码对照合并窗口,一共是三个屏,左右两边的是不同的代码,冲突的地方会被高亮显示出来,带有箭头和叉叉。通过点击箭头将两边的冲突代码添加到中间的合并区域中去,点叉叉则放弃那一段代码。所有冲突处理完成以后merge成功。
2、建议使用git作版本控制,基本操作和svn 差不多,但你可以将代码commit 在本地,然后再pull 仓库里面的代码来进行merge,这样就算merge 过程中点错了什么,也能将代码回滚到你上次commit 的版本,再次进行pull 和 merge conflict。一般git 的操作就是先commit,然后Pull,最后push。合并冲突代码的界面和svn 是一样的。
③ Android开发之引用三方库导致SO库冲突的解决办法
从这个图片可以看出 匹配到了多个 libc++_shared.so
packagingOptions的用法使用方法packagingOptions常见的设置项有
exclude、
pickFirst、
doNotStrip、
merge。
exclude
过滤掉某些文件或者目录不添加到APK中,作用于APK,不能过滤aar和jar中的内容。
④ 终极方案:快速解决Android项目依赖冲突
冲突类型无非是类、jar包重复,比如:
在此不多做介绍了,直接上解决方案
1、配置显示冲突依赖详细信息
2、编译,查看控制台详细输出
1、project依赖排除示例
2、远程依赖排除示例
参考链接:如何exclude aar包中的某个jar包
核心:
① 解压aar文件到tmpDir目录下
② 找到classes.jar包,用压缩工具打开,删除目标文件
③ 将tmpDir重新打包成一个新的aar
⑤ android eclipse开发 drawable文件夹 资源文件大小写冲突
Android res文件夹下的所有文件不能有大写字符,如果出现大写字符会导致R.java无法生成
Android项目是的R文件是由系统生成的资源的定义,如果出同冲突,错误,那么android 无法生成R文件 ,即使有时候你xml文件没有错误,他都无法生成。针对此问题,总结以下几个方面的原因:
1. xml本身有错误
R.java这个文件是会自动生成的,但是如果你不小心xml文件写错了,或者不小心在编辑xml的时候点击了run(其实这个时候会运行这个xml文件,会生成一个同名的xml文件,后缀为xx.out.xml),然后正巧你游clear了一下项目,你可能会发现gen下面的R.java的文件没有了,这个在刚开始的时候很气人,真不知道怎么解决,后来发现,只要xml文件有问题,系统是绝对不会给你自动生成这个R.java文件,因为他要参照你的每张xml里的数据来生成R.java,所以自然就生成不了了。虽然知道了原因但是问题头疼,假如项目的layout xml文件有几十个,这个时候怎么办,难道要一个一个xml的看吗,呵呵,其实也不是,把console中的信息clear一下,然后再clear项目一下,这个时候,console中会有很多红色的信息,参照这个肯定能准确的找到哪个文件报错了。
下面这个事误运行了xml文件,可以看到gen的包不是空的,R.java文件也存在,并且明确的支出了是layout包中的错误
2. 编码格式不正确
有时候由于编码格式问题,造成无法生成R文件,此时后,把编码格式变成GBK或者UTF--8即可
三,配置问题,转义字符的问题
因为XML有些特殊字符需要转义,例如"<>&;"' "等
⑥ Android引入多个jar包,冲突问题解决方案
Android引入多个jar包,冲突问题解决方案(引入jar包,即本地文件) 以引用加载第三方框架中也有okhttp3 okio冲突讲解
(PS:如果不知道是那个jar冲突可以用指令gradlew app:dependencies查看)
1.找到项目中的libs->对应冲突的第三方包.jar。
3.用解压工具打开(不是解压,是打开。比如windows下可用360解压打开)。
4.删掉重复引用的包(okhttp3 + okio)。
5.重新打开项目,等待编译。
6.可能出现innerClass mission警告,可以忽略掉,或者clean build。
7.如果还报错的话那么在app build.gradle加入:
packagingOptions {
exclude 'META-INF/proguard/okhttp3.pro'
}
温馨提示:
如果你的项目是因为刚刚添加了某个网络加载依赖导致的,那么你就查看下这个库下的哪一个依赖冲突了,在添加这个依赖的时候把它给过滤掉。具体写法如下。
implementation ('com.***.***:XXX:1.2.0'){ // 所加的第三方框架
exclude mole: 'okhttp:3.10.0'
}
//或者要把组名一起添上去
implementation ('com.***.***:XXX:1.2.0'){ // 所加的第三方框架
exclude group: 'com.squareup.okhttp3'
}
⑦ android 卡片画廊效果及RecycleView、ViewPager、ScrollView之前的冲突解决
1、内容需要通过卡片的形式来展现,还有支持加载更多,所以最底部使用RecyclerView,最好是做成预加载形式,提前n页加载下一页,这样体验更好。
2、为了展示更多内容卡片内要支持垂直分页,这时候我使用了ViewPager,一是可以更好的管理分页内容,二是ViewPager的垂直分页容易实现,三是可以处理不同控件之前的滑动冲突
3、ViewPager第一页使用的可回弹的ScrollView,可以在下拉的时候做一些动画之类的操作,例如关注操作等。
4、ViewPager的第二页只是一个普通的ScrollView,具体使用可以根据实际情况来处理
1、RecycleView的分页效果基于PagerSnapHelper,RecyclerView在25.1.0版本中添加了一盒基于SnapHelper的子类PagerSnapHelper,可以使RecyclerView像ViewPager一样的效果,一次只能滑一页,而且居中显示。
2、卡片的效果是在滑动的时候根据RecycleView的偏移量计算缩放因子进行缩放
3、RecycleView的item内有一个垂直分页的VerticalViewPager,VerticalViewPager是在ViewPager上转换X,Y即可
4、解决ViewPager与RecycleView滑动的冲突,在ViewPager中屏蔽父视图的上下滑动事件
5、解决ViewPager子视图ScrollView的冲突,在ViewPager中拦截事件
6、解决ViewPager与BounceScrollView的冲突,在下拉过程中有时会被ViewPager拦截
以上就是此项目中的所有关键点。
ScrollViewDemo 欢迎Star
RecycleViewCardGallary