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

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


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

一、插件化:

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

同一功能在Android不同版本进行兼容的方法_第1张图片


二、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不同版本进行兼容的方法_第2张图片

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

同一功能在Android不同版本进行兼容的方法_第3张图片

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


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

 同一功能在Android不同版本进行兼容的方法_第4张图片

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

更多精彩;阅读原文

更多相关文章

  1. Android - 利用Android studio + Android Killer工具在手机未ROO
  2. Ubuntu下android学习——(2)Android系统构架分析和应用程序目录结
  3. Android8.1以及5.1版本识别sdcard和U盘并创建文件解决办法
  4. Android转场动画和共享元素动画兼容5.0以下版本的实现
  5. 使用ant让Android自动打包的build.xml,自动生成签名的apk文件(支
  6. 说说android下TV版本UC浏览器模拟鼠标的实现
  7. Android:增强目录选择器对话框
  8. Android运行时权限,6.0—9.0多版本,多终端(手机,TV盒子)130行代码一劳

随机推荐

  1. android 隐藏ListView滚动条
  2. Android(安卓)Notification的使用
  3. Android问题总结
  4. Android(安卓)textView点击滚动(跑马灯)
  5. android ui imagebutton
  6. Android--ExpandbleView源码学习一---Exp
  7. android唤醒屏幕--保持屏幕唤醒-Reprinte
  8. Android(安卓)USB挂载
  9. Android(安卓)异步任务加载图片代码
  10. 安卓Android大量项目源码实例