由銀聯開發包調試引出的Android Studio的一個八哥
最近有段痛苦的經曆,寫出來讓大家開心開心!
最近公司的flutter項目由於需要接入銀聯卡支付,我google了一下,看了一下銀聯開發的開發文檔,不算複雜。就跟老板說,一周能搞定。
於是,下載開發包,申請開發者賬號,不過,商戶開戶(海外)卻不知道在那裏?有問題?找客服,客服很客氣的回答,需要我提供資料,然後她來轉給
當地的收單機構跟我們聯係。(結果現在都沒人跟我聯係...?)
項目開始,先弄iOS的,由於這個是需要C++/C混編,這個難不了我,很快,銀聯卡支付界麵出來了,用測試卡測試了一般,搞定!
好順利啊,心想!
接著開始Android,jar拷貝,lib拷貝,data.bin拷貝,於是,痛苦的事情就發生了。
點擊支付按鈕,程序一下就崩潰了,Android Studio 顯示
java.lang.RuntimeException: Unable to start activity ComponentInfo{xxxxxxx/com.unionpay.uppay.PayActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'long java.io.InputStream.skip(long)' on a null object reference
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2690)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2755)
at android.app.ActivityThread.-wrap12(ActivityThread.java)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1495)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:154)
at android.app.ActivityThread.main(ActivityThread.java:6196)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:888)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:778)
Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'long java.io.InputStream.skip(long)' on a null object reference
at java.io.FilterInputStream.skip(FilterInputStream.java:151)
at com.unionpay.mobile.android.resource.c.a(Unknown Source)
at com.unionpay.mobile.android.widgets.m.<init>(Unknown Source)
at com.unionpay.mobile.android.widgets.m.<init>(Unknown Source)
at com.unionpay.mobile.android.plugin.BaseActivity.onCreate(Unknown Source)
at com.unionpay.uppay.PayActivity.onCreate(Unknown Source)
at android.app.Activity.performCreate(Activity.java:6698)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1140)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2643)
心想,不是吧!有問題,找穀哥!
於是,搜了一般,有人問過,不過回答是 data.bin要拷貝到工程的 assets目錄,我查了下,沒問題啊,接著用最愚蠢的辦法,
把assets/data.bin拷貝到所有的目錄下,再運行,還是同樣的錯誤!
查了下銀聯開發包的反編譯代碼
if (var14 == null) {
InputStream var16 = a.class.getClassLoader().getResourceAsStream("assets/data.bin");
DataInputStream var19 = new DataInputStream(var16);
try {
....
心裏不禁大罵那些家夥,大猿何苦為難小猿呢?世間的八哥已經是如此傷人!
不得不用各種招數.
......九陽神功....
............
....你師傅教了你三路劍法,上中你都沒學....
....
...我底褲外穿...
嘿,醒醒吧!
哎,我不是老總,我隻是碼工,我整天鬥八哥,隻是為生活!
看著小孩鋼琴練累了,在沙發趴一下,接著起來練,練大提琴累了,往椅子靠一靠,接著練(我自己是把椅子,家裏人依靠我,我還能依靠誰呢?)
嘿,醒醒吧!努力!努力!
於是,從一窮二白開始,建一個新的project,引入銀聯開發包,working..
接著開始引入插件,二分法排除,
.......
....怎麽銀聯沒返回了?(估計我太頻繁訪問,銀聯把我拉黑了,)啊,銀聯大哥,我隻是在調試,沒力氣黑你!
.....
總算找到原因了,原來google 的 crashlytics跟銀聯的衝突了..
真正的問題是哪裏呢?
接著努力!努力!
總算找到了,於是發郵件給google求助,過了10來分鍾,google回複讓我把Android Studio 3.4 downgrade 到 3.3.2,
com.android.tools.build:gradle:3.4.0也降低版本,於是,我把AS 3.4卸載,重新下載了3.3.2,而且把
com.android.tools.build:gradle:3.4.0也改為com.android.tools.build:gradle:3.2.1,
clean project --> rebuild--> run
於是,銀聯的支付界麵總算在Android手機上出來了。
......
心裏在罵銀聯的同時,不禁感歎,自己那是什麽程序猿,碼農,完全是個不折不扣的碼奴!
盡管很努力,老板還是覺得這個App怎麽老是有問題,而且還想讓我當產品經理(PM+PM+ Full Stack+Dev OPs),我一台電腦開著Mysql workbench在建庫表,調sql,寫存儲過程,
還開著Elipse寫Spring boot代碼,還開著Android Stuido 寫java, XCode寫OC, Swift,還要開著Visual Studio Code
來寫flutter 和 PHP,
天啊,難道還要我開著Visio ?再開Photo Shop?
啊,這不是蘋果電腦啊,這是鴨梨!