同一功能在Android不同版本进行兼容的方法

APP应用开发的时候,经常需要APP有能力去兼容不同的Android版本或者说拥有跨平台的能力,但说起来容易,做起来难。

 我们常常会遇到这样的痛点,同样的软件功能在Android不同版本之间实现方法差异会很大,上层需要用同一套代码,同一个APP需要去进行兼容。


 说一下我遇到的两种处理方法:

一、插件化:

APP将随Android版本经常发生变动的这部分封装成一层抽象接口,具体的实现放到插件中去实现。插件中可以根据Android版本进行区分,将差异区分的地方由以前的APP中下沿到插件中实现。从而保证只有APP统一性。可以参考常见的静态、动态jar的设计思想。



二、APP内部处理


当遇到下面几种比较尴尬的情况的时候:

 

1.有的时候因为做插件比较麻烦,如果只是一个文件的差异如果去插件话未免大材小用;

2.有时候你对做插件的设计思想还不是很清楚,不知道怎么设计;

3.有时候是你刚接手的别人的项目,你对软件架构都还不太熟悉,不敢贸然去增加插件机制或者做大幅度的修改。

那么,可以用下面这种偷懒的方式去处理一下,在改动最小的情况下做到软件兼容。

 

策略一:运行时通过读取Android版本+反射机制来兼容

因为APP的开发时大多同学用的Android studio,如果比较暴力的通过软件运行的时候读取Android版本进行功能区分,那么Android studio在指定sdk的时候只能指定一种Android版本,在别的版本上就会出现因为接口不同或者有差异导致编译不过的问题。

如果接口简单,其实你可以通过反射方法来解决掉此问题。

但如果有的时候接口涉及的参数的比较复杂、或者存在回调的参数情况下,反射方法处理起来很麻烦或者失效了,无法在去帮我们使用软件运行时读取Android版本在进行反射调用来达到兼容的目的了。

 

那么,遇到这种情况该怎么办呢?可以试试策略二。

策略二:编译时目录区分

不在软件运行时,读取Android版本进行反射来处理差异接口,转而在软件编译时将差异区分出来来达到兼容目的。


主要思想是将差异放在APP内部消化掉,将差异的包目录单独拎出来做成一个单独的目录,此目录需要和src目录同级才行,否则如果直接放在src目录下好像因为同一个java类文件有多个会冲突,导致无法编译成功。


在原来的src的目录基础上,在编译的时候在增加我们自己新增的差异目录。

差异目录里面放的是和Android版本相关的源码文件,通过在编译的时候区分Android版本进行编译目录的动态选择。

 

参考如下目录结构:

Platform文件夹是和src平级的目录;

Platform文件夹中我们创建了两包目录结构一样的文件,里面的类文件命名也是相同的,保证包名+类名的一致性。唯一区分就是Android版本目录的区分,一个是Android19,也就是Android4.4平台,另外一个是Android26,也就是Android8.0平台。


在服务器上编译的时候通过区分Android版本来进行目录选择,在Android.mk的基础上增加我们新增的这部分目录的编译。


编译完成后,我们自建的这部分代码在不同的Android版本上就编译时被动态替换进去了,然后就可以解决兼容性问题了。


另外,这种操作后,你在Android studio编译的时候,如果切换SDK版本的时候,需要让Android studio编译时根据Android版本去加入我们自建的这一部分目录,需要重新在APPbuild.gradlesourceSet里面重新修改下,在java.srcDirs中加入自建的这部分目录,如下所示。

 

这样我们的Android studio直接调试也可以做到做到Android版本区分动态编译了,使用起来才得心应手。

更多精彩;阅读原文

  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值