在开发过程往往会遇到下面这种情况:
我们App某些功能会经常变更,正常情况下我们需要根据功能变更来升级APP。但是这样会平凡的升级APP,造成很差的用户体验。
引出:前段时间项目中有这样一个需求:下载到本地的视频需要在播放时加载字幕,但是某些视频我们的服务器中不存在字幕,怎么办呢?
后来发现某个网页能通过影片名查询到相应的字幕,并下载下来。但是问题是,我们的app不能拿到相应的接口,接下来又该怎么办呢?
后来通过一些逆向开发手段,捕获到了字幕的下载路径,但是他是HTML的页面以Table标签的方式展示出来的,这样我们就可以通过java代码动态的解析这些html的标签,拿到字幕下载地址,并进行下载到我们的服务器上。但是后来更坑的事情出现了,某一天我们的app的在搜索字幕时,瘫痪了,怎么回事呢?原来发现字幕提供网站返回的html的形式发生了变化,导致解析异常。怎么办呢?答案是:修改解析html的解析代码。重新让用户更新新的app。可是问题来了,如果这个字幕网站经常变更,我们每次都让用户更新app么? 那这样的话就只能一个字形容了:“坑”。
相信大家有类似的经历,遇到这种情况怎么办呢? 这让我突然想到了Web App的原理,从这个原理总结到了一个办法,那就是把变化的交给服务器,不变的交给app.那到底怎么做呢?让我慢慢到来~~~
首先在我们这里变化的是字幕网站中返回的html,不变的是结果要对字幕下载解决的处理。那么我们能不能将变化的html的解析逻辑放到服务器呢,每次启动app的时候就从服务器将解析html的逻辑从服务器下载下来,动态的打包到我们的app,并实例化对象,调用解析html方法。如果字幕库网站发生变化时,动态更新我们服务器上的解析代码,并重新下载相应的解析代码,就能实现不变应万变。
下面是图形流程:
制作Dex文件,二就是:从服务器下载Dex文件并动态加载打包到我们的app中。
制作Dex文件:
提到Dex文件,可能部分人不太理解为什么弄个Dex文件呢?为什么不直接写一个java类文件呢?原因很简单,因为如果在用户下载java源文件情况下,用户手机需要去编译这个java源文件,并生产字节码class文件。可是用户的手机是不装有编译环境的,因此必须是编译后的文件才能被识别。
那么Dex文件又是什么呢? 我们都知道在我们要运行java程序时,必须要编译成class的字节码文件才能被jvm虚拟机识别。可是在我们的安卓手机上运行的是Dalvik虚拟机,他不能直接处理class的字节码文件,必须是class字节码文件经过优化后的Dex文件。我们可以认为Dex文件就是class文件经过优化后生成。

被折叠的 条评论
为什么被折叠?



