Android程序员的救赎之路(二)

上回说到要举一个例子来说明,在看例子前,我们先来说说问题,有时我们会在工作中遇到很难的专业问题,如设计一个业务算法或用OpenGL做3D特效,这类的问题虽然不简单,但属于比较单一的类型。即使出现问题,你也能比较容易集中在特定的领域里去解决它,解决或学习它们的过程中你可能并不需要做太多的选择。但现实往往会给你一些不一样的问题,总是给你一种不知所措的感觉,有时觉得是自己领域的问题,迷糊中又觉得不是。如我遇到的一个“Access-Control-Allow-Origin”异常问题。跨域和跨界

我们的APK使用了Cordova框架,在这个框架中加载本地的Html/JS文件,是一个单页Web应用,Web视图上的数据是通过JS发送Http请求从一个提供Rest服务的Tomcat获取。关于跨域问题可以看到这篇文章:跨域资源共享 CORS 详解(http://www.ruanyifeng.com/blog/2016/04/cors.html)问题描叙:

在很多手机都是正常的(Android SDK从4.4到7.1),只在某个型号的锤子手机上出现;

在出现问题的锤子手机(SM901, SDK 6.0.1, API23)上做测试,发现同是生产版的apk,但Release版和Debug的效果不一样,Release版本会有这个问题,而Debug版本正常。

在问题手机上的截图:从上面的两点看,你可能会很容易想到是Android的兼容性问题,毕竟这是她的前科不少。针对第2点,Android Studio默认会为项目构建一个Debug和一个Release版本的应用,这两个版本的不同主要体现在在非开发机上的调试功能以及APK的签名方式,如debuggable属性,在Debug上是true,在其他版本是false。而且我试过只要把Release的debugable=true,不会出现“Access-Control-Allow-Origin”。网上也有一些别人试过的做法,如设置"setAllowUniversalAccessFromFileURLs",不过对这个手机还是无效。新发现并不是所有的锤子手机都会出现这个问题,我有一台相同型号的手机就没这个问题。但有一次进入“开发这模式”,把“严格模式”打开,在这台手机上重现了这个问题。不过又引入了新的问题:就算之后我把“严格模式”关闭,在Release版上这个问题仍然出现,关机重启还是能重现。也就是说只要我打开过一次就一直重现,卸载重装还是一样。逻辑上不能完全说是严格模式引起的,因为严格模式关了还有这个问题(当然,也有可能是厂商的严格模式关闭有BUG)。再测试发现,把Webview中访问的Url换成其他的(如https://github.com)并不会报Access-Control-Allow-Origin的错误,那么问题是服务端了?技术的本质

了解了一下,这个项目的前后端构建,大体涉及的技术节点如下:我们不妨问一下我们自己,这个是Android端的问题、前端的问题,还是后端的问题?如果是移动端,我们可能就局限在兼容性的问题上了,可能需在Android更深入的知识或者咨询锤子手机的专家。如果在前端或者后端,可能也需要他们对移动端也有部分了解。这只是一个具体的案例,这个问题你可以按手机的兼容性去解决,也可以从前端、Nginx和Java后端去寻求其他的解决方案。而我们可能也有所察觉,新技术都是建立在多个已有技术的组合之上的。技术并不是凭空产生的,而且通过不同的组合衍生的。这个案例虽然看似不复杂,但却涉及前后端来配合查找方案,势必就会涉及多个技术栈。取舍

这个问题最终怎么解决呢?其实,我没有解决,取舍如下(理解成借口也成立):

我可以通过非技术手段绕过这个问题;

我有更有价值的事情要去完成;

不过我还是很感兴趣花时间去看一下跨域和Nginx方面的一些知识。我们解决问题不一定非要局限于自己熟悉的领域,我们可以尝试各种正常和“不正常”的方式,但需要从几个方面进行取舍:

这真的是问题吗?

解决这个问题的成本高吗?

解决这个问题的对自己和公司有多大的价值?

除了技术的解决方案,没有其他的选择吗?

很多时候追问第一个问题会发现,你遇到的很多问题都不需要解决,或者可以用非技术方案解决。还有很多问题因为你有更合适的技术栈,或者可以咨询或得到这方面的帮助,能让你用更优雅简洁的方案解决。这也是我慢慢在转变的方向,单一的技术慢慢变成爱好。真正要做好事情,还需要我们给自更加拥抱变化和未知的机会。技术重要,但有更多的技术组合能让你产生更大的价值。并在这个过程感受到了新的东西,发现一些秘密:我们一直以为自己在解决技术问题,其实我们面临的是沟通问题。关于沟通下一篇还是用技术实例做“药引”,敬请期待。

本文来自企鹅号 - Android面试启示录媒体

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏软件测试经验与教训

客户端流畅度测试

36810
来自专栏喵了个咪的博客空间

phalapi-入门篇1(简单介绍以及环境搭建)

#phalapi-入门篇1(简单介绍以及环境搭建)# ? ##前言## 先在这里感谢phalapi框架创始人@dogstar,为我们提供了这样一个优秀的开源框架...

3607
来自专栏EAWorld

微服务模式系列之二:微服务架构

译者评论: 微服务架构大家已经耳熟能详,但是我认为这篇文章最有价值的是这段: 但这类解决方案中也存在着以下弊端: 开发者必须应对创建分布式系统所产生的额外的复杂...

3405
来自专栏静晴轩

快应用之开发体验纪要

何谓「快应用」呢?它是基于手机硬件平台的新型应用形态,标准是由主流手机厂商组成的快应用联盟联合制定。其标准的诞生将在研发接口、能力接入、开发者服务等层面建设标准...

1312
来自专栏FreeBuf

HTTP/2性能更好,但是安全性又如何呢?

根据W3Techs的调查数据显示,目前大约有11%的网站使用了新型的互联网通信协议–HTTP/2,而在一年之前,其占比只有2.3%。 没错,这个新的协议的确可以...

21210
来自专栏腾讯移动品质中心TMQ的专栏

腾讯TMQ在线沙龙|Code Review也有潜规则

Code Review也有潜规则 活动时间:2017年3月30日 QQ群视频交流 活动介绍:TMQ在线沙龙第十八期分享 本次分享的主题是:Code Review...

2547
来自专栏JAVA烂猪皮

微服务写的最全的一篇文章

今年有人提出了2018年微服务将疯狂至死,可见微服务的争论从未停止过。在这我将自己对微服务的理解整理了一下,希望对大家有所帮助。

3842
来自专栏云计算D1net

如何应对混合云网络的复杂性?

在经过一番艰苦努力的之后,我最终调试解决了一个非常棘手的混合云网络问题。 虚拟私有云(VPC)提供了一个包含免费虚拟机(VM)使用时间的培训项目,学生可以跟随一...

3586
来自专栏企鹅号快讯

代码学习与实践:开篇-测试深入了解代码的好处及实践

1 缘起 最近在负责测试的项目,相对来说比较复杂。从业务上来看,涉及商品添加、审核、交易、支付、退款、换号、管理等多个流程,从代码逻辑上来看,划分了9个模块,还...

2058
来自专栏韩伟的专栏

如何提高程序员的生产率(上)

一、硬件资源 1) 办公环境 ? 大部分开发团队都不把座椅家具视为一个非常重要的问题。拥有宽敞的桌面的环境,可以在桌上放置更多的东西:本子、笔、杯子、书本、打...

3876

扫码关注云+社区

领取腾讯云代金券