一個Android程序員的自我救贖(二)

前言

上回說到要舉一個例子來說明,在看例子前,我們先來說說問題,有時我們會在工作中遇到很難的專業問題,如設計一個業務算法或用OpenGL做3D特效,這類的問題雖然不簡單,但屬於比較單一的類型。即使出現問題,你也能比較容易集中在特定的領域裡去解決它,解決或學習它們的過程中你可能並不需要做太多的選擇。

一個Android程序員的自我救贖(二)

但現實往往會給你一些不一樣的問題,總是給你一種不知所措的感覺,有時覺得是自己領域的問題,迷糊中又覺得不是。如我遇到的一個“Access-Control-Allow-Origin”異常問題。

跨域和跨界

我們的APK使用了Cordova框架,在這個框架中加載本地的Html/JS文件,是一個單頁Web應用,Web視圖上的數據是通過JS發送Http請求從一個提供Rest服務的Tomcat獲取。

關於跨域問題可以看到這篇文章:10分鐘弄懂跨域資源共享 CORS

問題描敘:

  • 在很多手機都是正常的(Android SDK從4.4到7.1),只在某個型號的錘子手機上出現;
  • 在出現問題的錘子手機(SM901, SDK 6.0.1, API23)上做測試,發現同是生產版的apk,但Release版和Debug的效果不一樣,Release版本會有這個問題,而Debug版本正常。

在問題手機上的截圖:

一個Android程序員的自我救贖(二)

從上面的兩點看,你可能會很容易想到是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端的問題、前端的問題,還是後端的問題?

如果是移動端,我們可能就侷限在兼容性的問題上了,可能需在Android更深入的知識或者諮詢錘子手機的專家。如果在前端或者後端,可能也需要他們對移動端也有部分了解。

這只是一個具體的案例,這個問題你可以按手機的兼容性去解決,也可以從前端、Nginx和Java後端去尋求其他的解決方案。

而我們可能也有所察覺,新技術都是建立在多個已有技術的組合之上的。技術並不是憑空產生的,而且通過不同的組合衍生的。這個案例雖然看似不復雜,但卻涉及前後端來配合查找方案,勢必就會涉及多個技術棧。

取捨

這個問題最終怎麼解決呢?

其實,我沒有解決,取捨如下(理解成藉口也成立):

  • 我可以通過非技術手段繞過這個問題;
  • 我有更有價值的事情要去完成;

不過我還是很感興趣花時間去看一下跨域和Nginx方面的一些知識。

我們解決問題不一定非要侷限於自己熟悉的領域,我們可以嘗試各種正常和“不正常”的方式,但需要從幾個方面進行取捨:

  • 這真的是問題嗎?
  • 解決這個問題的成本高嗎?
  • 解決這個問題的對自己和公司有多大的價值?
  • 除了技術的解決方案,沒有其他的選擇嗎?

很多時候追問第一個問題會發現,你遇到的很多問題都不需要解決,或者可以用非技術方案解決。還有很多問題因為你有更合適的技術棧,或者可以諮詢或得到這方面的幫助,能讓你用更優雅簡潔的方案解決。

這也是我慢慢在轉變的方向,單一的技術慢慢變成愛好。真正要做好事情,還需要我們給自更加擁抱變化和未知的機會。技術重要,但有更多的技術組合能讓你產生更大的價值。

並在這個過程感受到了新的東西,發現一些秘密:

我們一直以為自己在解決技術問題,其實我們面臨的是溝通問題。

最後

在現在這個金三銀四的面試季,我自己在網上也蒐集了很多資料做成了文檔和架構視頻資料免費分享給大家【包括高級UI、性能優化、架構師課程、NDK、Kotlin、混合式開發(ReactNative+Weex)、Flutter等架構技術資料】,希望能幫助到您面試前的複習且找到一個好的工作,也節省大家在網上搜索資料的時間來學習。

資料獲取方式:關注我+私信回覆【學習】免費獲取!!!

一個Android程序員的自我救贖(二)


分享到:


相關文章: