2015年3月12日 星期四

購買x86版本的Android手機,請注意App相容性

目前的Android手機架構以ARM為大宗,但越來越多的低價手機,改用Intel的Atom晶片,也就是x86架構,雖然Intel號稱有95%的App能相容(請見: Intel:採用x86晶片的Android手機,已有95%在Play商店的App可相容運作),但還有5%的不相容啊~~~

好死不死,蕃薯最近入手的一部ZenFone 5 3G版,安裝的第一個App就碰壁,一直以來都使用CSipSimple這套Softphone,沒想到安裝到ZenFone 5一開App就當掉,後來改用Zoiper IAX SIP VOIP Softphone就OK了。

上網搜到這篇: Issue 2829: Asus ZenFone always crash,以下這幾行:
11-13 12:47:43.732: D/dalvikvm(21207): No JNI_OnLoad found in /data/app-lib/com.sphene.sphene-2/libstlport_shared.so 0x437e6af0, skipping init
11-13 12:47:43.732: D/dalvikvm(21207): Trying to load lib /data/app-lib/com.sphene.sphene-2/libpjsipjni.so 0x437e6af0
11-13 12:47:43.752: A/libc(21207): Fatal signal 11 (SIGSEGV) at 0x00000000 (code=1), thread 21221 (ervice.Executor)
 


果然是該死的JNI在搞鬼,不知道什麼是JNI? 簡單的說,就是使用C或其他程式語言,編譯成binary code供Java(Android)呼叫使用,詳細說明請看維基百科: Java本地介面。這使蕃薯想起之前看過的另一篇: ZenFone Facebook 問題讓 x86 Android 相容難題再浮現,當初Facebook也遇到同樣的問題。

再來是App開發商的部份,蕃薯歸納出2種自行開發JNI的原因:

1. 控制特有的設備

由於Android Framework不提供該設備的API, 而必須自行撰寫,但一般的手機應該不會遇到這種狀況才是。

2. 提升執行效能與佔用較少的記憶體

現在的手機CPU都是GHz等級,雙核、四核甚至八核心,RAM也都是GB以上,快個零點零幾秒或是省幾MB的記憶體,實在是感覺不出來。

如果都用Android Framework開發程式,透過Dalvik跨平台執行就沒有問題,不解為什還要自行開發JNI而造成平台相依。對於這種狀況,除非廠商另外再釋出x86版本的App, 否則真的無解。

最後,蕃薯的建議是: 現階段Android還是以ARM為主流,購買手機能選ARM就選ARM, 否則難保下一個App不會遇到相容性的問題。

沒有留言:

張貼留言