11/12/2011

在rowboat的Android 2.3.4 (based on DM37),點擊webkit的browser常常都會crash...


I/ActivityManager(  863): Starting activity: Intent { act=android.intent.action.MAIN flg=0x10000000 cmp=com.android.browser/.BrowserActivity }
I/ActivityManager(  863): Start proc com.android.browser for activity com.android.browser/.BrowserActivity: pid=1341 uid=10014 gids={3003, 1015}
I/ActivityThread( 1341): Publishing provider browser: com.android.browser.BrowserProvider
I/ActivityManager(  863): Displayed activity com.android.browser/.BrowserActivity: 1525 ms (total 1525 ms)
D/dalvikvm( 1341): GC_FOR_MALLOC freed 3858 objects / 224504 bytes in 122ms
W/dalvikvm( 1341): JNI WARNING: JNI method called with exception raised
W/dalvikvm( 1341):              in Landroid/webkit/JWebCoreJavaBridge;.sharedTimerFired ()V (NewLocalRef)
W/dalvikvm( 1341): Pending exception is:
I/dalvikvm( 1341): Ljava/lang/IllegalArgumentException;: provider=gps
I/dalvikvm( 1341):  at android.os.Parcel.readException(Parcel.java:1251)
I/dalvikvm( 1341):  at android.os.Parcel.readException(Parcel.java:1235)
I/dalvikvm( 1341):  at android.location.ILocationManager$Stub$Proxy.requestLocationUpdates(ILocationManager.java:516)
I/dalvikvm( 1341):  at android.location.LocationManager._requestLocationUpdates(LocationManager.java:711)
I/dalvikvm( 1341):  at android.location.LocationManager.requestLocationUpdates(LocationManager.java:630)
I/dalvikvm( 1341):  at android.webkit.GeolocationService.registerForLocationUpdates(GeolocationService.java:162)
I/dalvikvm( 1341):  at android.webkit.GeolocationService.start(GeolocationService.java:66)
I/dalvikvm( 1341):  at android.webkit.JWebCoreJavaBridge.sharedTimerFired(Native Method)
I/dalvikvm( 1341):  at android.webkit.JWebCoreJavaBridge.fireSharedTimer(JWebCoreJavaBridge.java:88)
I/dalvikvm( 1341):  at android.webkit.JWebCoreJavaBridge.handleMessage(JWebCoreJavaBridge.java:105)
I/dalvikvm( 1341):  at android.os.Handler.dispatchMessage(Handler.java:99)
I/dalvikvm( 1341):  at android.os.Looper.loop(Looper.java:123)
I/dalvikvm( 1341):  at android.webkit.WebViewCore$WebCoreThread.run(WebViewCore.java:621)
I/dalvikvm( 1341):  at java.lang.Thread.run(Thread.java:1096)
I/dalvikvm( 1341): "WebViewCoreThread" prio=5 tid=11 NATIVE
I/dalvikvm( 1341):   | group="main" sCount=0 dsCount=0 s=N obj=0x4402d3e8 self=0x254b78
I/dalvikvm( 1341):   | sysTid=1354 nice=0 sched=0/0 cgrp=unknown handle=2444472
I/dalvikvm( 1341):   at android.webkit.JWebCoreJavaBridge.sharedTimerFired(Native Method)
I/dalvikvm( 1341):   at android.webkit.JWebCoreJavaBridge.fireSharedTimer(JWebCoreJavaBridge.java:88)
I/dalvikvm( 1341):   at android.webkit.JWebCoreJavaBridge.handleMessage(JWebCoreJavaBridge.java:105)
I/dalvikvm( 1341):   at android.os.Handler.dispatchMessage(Handler.java:99)
I/dalvikvm( 1341):   at android.os.Looper.loop(Looper.java:123)
I/dalvikvm( 1341):   at android.webkit.WebViewCore$WebCoreThread.run(WebViewCore.java:621)
I/dalvikvm( 1341):   at java.lang.Thread.run(Thread.java:1096)
I/dalvikvm( 1341): 

這現象非常奇怪,一直以為是我porting wifi 出了問題...

一路trace過去,終於發現原來是因為Google的webkit在開啟預設頁面時,都會去啟動GPS來尋找location相關資料,而且還沒有error handle的處理方式...

而啟動的service叫做Geolocationservice,一開始在external/webkit/Webcore把ENABLE_GEOLOCATION的定義拿掉,但還是一樣不行....

在想不到更好的解決方式之下...只好直接從Java裡把gps register拿掉,可以暫時避掉這問題。

From 30fe105d47ec283b46865d4c94c17c065048bd3e Mon Sep 17 00:00:00 2001 
From: Dicky Chiang
Date: Fri, 11 Nov 2011 04:17:12 +0800
Subject: [PATCH 20/20] fix browser crashes out of the webkit
---
 .../java/android/webkit/GeolocationService.java    |    4 ++++
 1 files changed, 4 insertions(+), 0 deletions(-)


diff --git a/frameworks/base/core/java/android/webkit/GeolocationService.java b/frameworks/base/core/java/android/webkit/    GeolocationService.java
index 24306f4..348715f 100755
--- a/frameworks/base/core/java/android/webkit/GeolocationService.java
+++ b/frameworks/base/core/java/android/webkit/GeolocationService.java
@@ -158,10 +158,14 @@ final class GeolocationService implements LocationListener {
         try {
             mLocationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 0, 0, this);
             mIsNetworkProviderAvailable = true;
+
+            // Can be register it if gps device on platform, otherwise to disable it.
+            /*
             if (mIsGpsEnabled) {
                 mLocationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, this);
                 mIsGpsProviderAvailable = true;
             }
+            */
         } catch(SecurityException e) {
             Log.e(TAG, "Caught security exception registering for location updates from system. " +
                 "This should only happen in DumpRenderTree.");
-- 
1.7.4.1 


10/30/2011

GIT協同開發


自己學git的時間,斷斷續續加起來也不過2個多月的時間,認識週遭的同事大多也都使用SVN,鮮少接觸到git。

正如之前說的,用git的時機大多只管理我自己的job...很少用git跟人一起協同開發..

而自己對git的原理也矇矇矓矓的,只知道git對我來說,是個非常棒的軟體管理和提高效率的好工具!

奈何它也確實學習曲線頗高,剛接觸的人如果不是抱有很大的興趣的話,很容易讓人打退堂鼓。

前陣子公司正好要開始開發系統的東西,意識到沒有版本控制的工具,真的會一團亂...所以開會提出要架設server來管理版本。

這對我來說實在是大好機會 ! 立刻毫不猶豫把Git提出來,並分析Git的好處和它的優秀又快速的branch...

很可惜的,最終還是敗給SVN,因為SVN相對而言較簡單,我也承認SVN的確入門....但我對它的歷史查找和開設branch實在是無法認同。

SVN架了一陣子,因為種種因素而失敗,所以最後主管同意讓我去架設git server,這讓我高興了好一陣子呀 XD

雖然server我不會架...但弄一個簡單的repository讓同事clone這點我還是會的qq

因為公司有同事並不熟悉git,所以就寫了這些東西,順便拷貝上來作筆記 :)

============

整個source branch model我都是參考這篇,這對個人或小型團隊真的是滿漂亮的模型,我自己的job也都是這樣去分的 :)

一般而言,我都會在遠端開設develop分支,所以clone下來之後可以看到兩個遠端分支 :






預設都會指向遠端master分支,因為master屬於穩定發佈的分支,是不能隨便去merge或是commit,所以應該在自己的本地去新建一個分支,這個分支的名字最好對應遠端develop,讓自己知道該向哪一個遠端分支進行提交 :








"git co -b develop" 這意思就是在當前的分支(master)checkout出來一份並切換到你建立的分支底下,所以這時master和develop就屬於同一平行線上,不管你對develop做多少修改,都不會影響到master分支,所以從develop分支底下就可以安心進行工作了.

但依我自己的習慣,我建議在develop底下再建立一個分支來開發,等最後開發好了再merge到develop。這樣做的原因是一來不用擔心自己把develop這分支弄壞,造成其它人的不便。二來隨時可以很方便的對develop分支進行diff,來觀察自己改了什麼導致系統不正常或其它原因。三來是怕有時腦神經大條,commit到錯的檔案或是忘了add ( 這點我常犯的XD),最後還要用reset回去...

所以在develop分支底下再checkout出來一分 :







現在可以安心進行開發了,先在a.c裡面加了一個printf :















可以看到多了一個"Hello test",還有status,以及最後再把它commit上去,現在回到develop底下,再merge hello_test,讓develop有了hello_test功能 :





加"--no-ff"是為了讓merge之後的訊息不要遺失,清楚呈現整個分支merge狀況,像這樣 :















現在dicky的工作結束了,所以可以對遠端develop提交成果,讓大家可以使用你的功能 :







註 : 如果發現自己merge的分支裡面有存在很嚴重的bug,但都己經commit和push到遠端分支了....該怎麼還原遠端分支 ? 用reset只對自己的本地有用而己...
我不清楚是否還有更好的辦法,我自己是先創個分支把develop備份起來,再回到develop使用reset --hard還原,然後把遠端develop砍了....再重新把reset過的develop push上去 :

$ git checkout -b develop_bak develop                                            // 先備份develop
$ git checout develop                                                                    // 切回develop
$ git reset --hard 2941b2d2e89adc311354bffea4fb521941976790     // 還原
$ git push origin :develop                                                             //  把遠端分支砍了
$ git push origin develop                                                              //  再重新push develop到遠端



假設Jimmy也clone一份,但他需要知道先前有沒有人更新過,所以在工作前要把server上資料pull下來:








從git回應的訊息來看,Jimmy知道有人創建develop並在更新遠端develop,這時Jimmy想要跟蹤這個遠端分支develop,並且以後也想在develop做開發 ,可以運行"git checkout --track origin/develop" :


















這樣一來,Jimmy以後可以在自己的develop分支來進行開發和提交了。

假設另一個人Jack在develop更新了功能並己經更新,但Dicky並不知道,也更新了develop,commit之後在push時會出現git需要先pull :







Dicky也對遠端develop進行pull,但卻發現在Auto merge a.c 時發生錯誤 :








這時就需要自己手動把錯誤修改回來再commit回去,先來看看錯誤是長什麼樣子 :







所謂的"HEAD"就是自己所增加的程式,而另外一個用"="分開並用哈希做為結尾就是Jack所增加的程式,通常這種錯誤都是發生在兩方修改同一行,Git是沒辦法解決這種衝突,需要自行修改,修改完之後長這樣 :






這時Dicky就可以再重新commit和push上去了 :