May 14, 2010

關於android app的向下相容

今天要做一個multi-touch的功能。事實上android的multi-touch在2.0版本以後系統才有支援。所以說,在我的小N1上使用這些API當然是沒有問題的。然而,應該不會有人想做了一隻程式卻要限定2.0以上才可以使用吧,畢竟1.5/1.6的市占率還是不低呢(版本分佈參考這邊)。尤其又有某些廠商遲遲不願替手機升級... 殘念...

言歸正傳。程式寫好之後,若沒有限定minSDK版本的話,是可以安裝的。安裝的時候或者upload到market的時候並不會檢查裡面是不是有用到哪些不支援的API。像這樣的API錯誤,會在run time才出現。

幸運的是,很快就找到相關文章有寫到解法了。

所以說,如果希望寫出來的程式能夠向下相容,ex.在2.0以上可以具有multi-touch的功能,但在舊版的android也至少不要當掉。該如何做呢?

android的Dalvik VM使用delayed class loading的作法。也就是說,class會在要被使用到的時候才會load起來。如果class沒有被用到,那就不會load,也就不會讓VM complain有VerificationError了。

所以我們查查API,發現可以使用android.os.Build.VERSION.SDK_INT來作為OS版本的判別,於是很開心的用下去的結果,卻發現怎麼在1.5 Cupcake上還是照樣掛點...囧...。原來,這個SDK_INT從1.6 Dount之後才開始出現,還真是搞笑了... XD

再檢查一下,原來我們應該要用Build.VERSION.SDK去做check。這是跟SDK_INT完全一樣的數字,只不過是String的版本。所以說,我們的code可以這樣寫
public boolean onTouchEvent(MotionEvent event) {
boolean hasMultiTouch = Integer.parseInt(Build.VERSION.SDK) >= 5;
int nPointer = hasMultiTouch ? WrapNew.getPointerCount(event) : 1;
// ...
}

至於裡面的WrapNew的class則是我們自己implement的一個static class,用來把那些舊版SDK不存在的method包起來的一個class。類似底下這樣
class WrapNew {
static int getPointerCount(MotionEvent event) {
return event.getPointerCount();
}
}

這樣一來,就可以避免VM發生VerificationError了。

詳細請參閱引用來源。這篇文章真的寫的超棒的,淺顯易懂,英文又不難。雖然我有把主要重點的地方翻譯/寫出來了,還是相當值得一看。

May 6, 2010

好快的Chrome!

其實是因為看了這個影片。


超快的於是我就去裝來玩玩看了。

因為慣用firefox幾個好用的add-ons,但原生的chrome並沒有那些功能。所幸新的chrome也支援extensions了。幾個常用的add-ons都找的到對應的extension for chrome。照樣加上chrome為關鍵字做搜尋即可。

剛裝到現在試用了ad-block,flash block,以及chrome gesture。基本上常用到的大概也就這幾個吧。

adblock方面,可以從firefox的adblock把filter匯出,然後貼到"C:\Users\water\AppData\Local\Google\Chrome\User Data\Default\Extensions\gighmmpiobklfepjocnamgkkbiglidom\1.4.26\filters\adblock_custom.txt"這個檔案裡面是可以work的,看來語法並無差異。

之外,若要在chrome直接block某些頁面的ad,安裝"Browser Button for AdBlock",右上角會出現adblock的按鈕,按下按鈕選擇"block an ad on this page",之後點擊頁面上ad的區塊,再拉動那個bar,選擇想要block的範圍大小就可以了。操作上比ff的adblock還要更直觀一點。

之外,開啟facebook跟plurk的速度都蠻快的。不過一開就發現我的噗浪幾個圓角都不見了。chrome是webkit base的瀏覽器。需要的朋友可以參考這篇去對plurk的CSS做修改即可。

目前這樣短短的用了一會兒,各方面的使用都頗正常。也許也可以考慮拿來取代firefox了咧。真的是好快呀!

5/7。從ff版貼上去的adblock filter不曉得有沒有作用,發現原本的filter就已經可以慮掉很多東西了。這點還有待觀察。

March 7, 2010

Nexus One -programming

把玩了這麼久,總該做點正事。

把公司開發的軟體直接丟上去跑的結果,就是出現了搞笑的超小字的界面,UI layout整個亂掉。果然1.5到1.6的升級不是升假的,難怪market上面一堆軟體都以這為分界,切成兩個版本發布,也難怪一堆使用者都覺得拿著1.5的magic整個很像孤兒一般。

把project改了一些相關設定之後升級至1.6的SDK,原以為惡夢到此為止。結果才發現核心部份也有少許不相容,造成底層沒有反應。這問題目前尚待解決。

UI Layout。
UI亂掉的部份主要是因為1.6以上開始支援One app, Multi screens。更多技術內容可以參考這裡。我這邊具體的作法是先把底下這段加入Manifest.xml中。

然後再改用1.6的SDK去build,如此一來UI的layout就可以保持原樣了。

不過SDK有說,這樣做是讓它跑在相容模式底下,會不會有什麼performance issue我就不清楚了。也許比較好的方式還是依大中小三種尺寸做不同的UI設計吧。

Root Directory。
另外玩一玩就發現,原本應該"/"底下每個folder都可以正常進去的,到了N1上卻發現某些folder沒辦法 listFiles了。原本的code沒有去check listFiles()得到的東西是不是null,這就是造成crash的原因。

在N1上,"/config"與"/cache"對這兩個folder listFiles()會return null,如果有去掃folder的請稍微注意。

像這幾天用aFile Lite也有相同的crash的狀況,同時還造成http server沒有反應的問題。不過只要把軟體設為"只管理SD卡的文件",一切就又恢復平靜了。



然後然後還有一個看起來是N1的bug。順便也寫在這邊。
我在使用某些ap的時候,比如PlurQ,如果按home回主畫面,會回到主畫面的右邊那一頁(但應該回到中間那頁,按home都是回中間那頁呀。),而且桌面上所有widget或者icon會全部不見!需要左右滑過桌面才會再回來~

這個狀況似乎不是每次會發生的,目前還沒找到什麼固定的步驟可以複製出來。就是有時候會,有時候又不會那樣。

然後之外網路上有討論到的,點一點變兩點的狀況今天早上也發生過一次,不過在關掉螢幕再打開之後就恢復正常了。看樣子是軟體bug吧。




結語。
總的來說這還是隻不可多得的好手機啦~ 也是一個工程師的超棒玩具!夠我把玩好一陣子不會膩的了!