Google Android 3.0 的 Market 對 Google Analytics 丟資料

April 28th, 2011

又一個 Root 手機的好理由.

最近在看 logcat 時, 常常會瞄到這些訊息:

04-28 12:30:43.770: DEBUG/NetworkRequestUtil/ConstructEventRequestPath(2275): /__utm.gif?utmwv=4.5ma&utmn=1845718205&utmt=event&utme=5(details%3Fdoc%3Dcom.amazon.kindle*VIEW_ITEM*1743839399)&utmcs=UTF-8&utmsr=1280x800&utmul=en-US&utmac=UA-19761900-1&utmcc=__utma%3D999.1840870358.1303223573.1303963419.1303963501.42

04-28 12:30:43.800: DEBUG/NetworkRequestUtil/ConstructPageviewRequestPath(2275): /__utm.gif?utmwv=4.5ma&utmn=1672526910&utmcs=UTF-8&utmsr=1280x800&utmul=en-US&utmp=%2Fhttp%3A%2F%2Fandroid.clients.google.com%2Ffdfe%3Fe%3DRELATED%26c%3D&utmac=UA-19761900-1&utmcc=__utma%3D999.1840870358.1303223573.1303963419.1303963501.42

04-28 12:30:43.800: DEBUG/NetworkRequestUtil/ConstructPageviewRequestPath(2275): /__utm.gif?utmwv=4.5ma&utmn=488885935&utmcs=UTF-8&utmsr=1280x800&utmul=en-US&utmp=%2Fhttp%3A%2F%2Fandroid.clients.google.com%2Ffdfe%3Fe%3DRELATED%26c%3D-1827484239&utmac=UA-19761900-1&utmcc=__utma%3D999.1840870358.1303223573.1303963419.1303963501.42

04-28 12:30:43.800: DEBUG/NetworkRequestUtil/ConstructPageviewRequestPath(2275): /__utm.gif?utmwv=4.5ma&utmn=1226858699&utmcs=UTF-8&utmsr=1280x800&utmul=en-US&utmp=%2Fhttp%3A%2F%2Fandroid.clients.google.com%2Ffdfe%3Fe%3DDETAILS%26c%3D1743839399&utmac=UA-19761900-1&utmcc=__utma%3D999.1840870358.1303223573.1303963419.1303963501.42

04-28 12:30:43.800: DEBUG/NetworkRequestUtil/ConstructPageviewRequestPath(2275): /__utm.gif?utmwv=4.5ma&utmn=564046613&utmcs=UTF-8&utmsr=1280x800&utmul=en-US&utmp=%2Fhttp%3A%2F%2Fandroid.clients.google.com%2Ffdfe%3Fe%3DRELATED%26c%3D&utmac=UA-19761900-1&utmcc=__utma%3D999.1840870358.1303223573.1303963419.1303963501.42

04-28 12:30:43.800: DEBUG/NetworkRequestUtil/ConstructPageviewRequestPath(2275): /__utm.gif?utmwv=4.5ma&utmn=951601809&utmcs=UTF-8&utmsr=1280x800&utmul=en-US&utmp=%2Fhttp%3A%2F%2Fandroid.clients.google.com%2Ffdfe%3Fe%3DRELATED%26c%3D-1827484239&utmac=UA-19761900-1&utmcc=__utma%3D999.1840870358.1303223573.1303963419.1303963501.42

起初不以為意, 但經過一而再再而三 log 的 “洗腦”, 越看越發覺得有些 keyword 很眼熟, 而在安裝 AdFree 之後才恍然大悟:

04-28 12:35:43.090: DEBUG/NetworkRequestUtil/ConstructPageviewRequestPath(3253): /__utm.gif?utmwv=4.5ma&utmn=1709128022&utmcs=UTF-8&utmsr=1280x800&utmul=en-US&utmp=%2Fhttp%3A%2F%2Fandroid.clients.google.com%2Ffdfe%3Fe%3DBROWSE%26c%3D1743839399&utmac=UA-19761900-1&utmcc=__utma%3D999.1840870358.1303223573.1303963501.1303965303.43

04-28 12:35:43.150: WARN/googleanalytics(3253): Problem with socket or streams.

04-28 12:35:43.150: WARN/googleanalytics(3253): java.net.ConnectException: www.google-analytics.com/127.0.0.1:80 - Connection refused

04-28 12:35:43.150: WARN/googleanalytics(3253):     at org.apache.harmony.luni.net.PlainSocketImpl.connect(PlainSocketImpl.java:211)

04-28 12:35:43.150: WARN/googleanalytics(3253):     at org.apache.harmony.luni.net.PlainSocketImpl.connect(PlainSocketImpl.java:431)

04-28 12:35:43.150: WARN/googleanalytics(3253):     at java.net.Socket.connect(Socket.java:901)

04-28 12:35:43.150: WARN/googleanalytics(3253):     at org.apache.http.conn.scheme.PlainSocketFactory.connectSocket(PlainSocketFactory.java:119)

04-28 12:35:43.150: WARN/googleanalytics(3253):     at com.google.android.apps.analytics.PipelinedRequester.maybeOpenConnection(Unknown Source)

04-28 12:35:43.150: WARN/googleanalytics(3253):     at com.google.android.apps.analytics.PipelinedRequester.addRequest(Unknown Source)

04-28 12:35:43.150: WARN/googleanalytics(3253):     at com.google.android.apps.analytics.NetworkDispatcher$DispatcherThread$AsyncDispatchTask.dispatchSomePendingEvents(Unknown Source)

04-28 12:35:43.150: WARN/googleanalytics(3253):     at com.google.android.apps.analytics.NetworkDispatcher$DispatcherThread$AsyncDispatchTask.run(Unknown Source)

04-28 12:35:43.150: WARN/googleanalytics(3253):     at android.os.Handler.handleCallback(Handler.java:587)

04-28 12:35:43.150: WARN/googleanalytics(3253):     at android.os.Handler.dispatchMessage(Handler.java:92)

04-28 12:35:43.150: WARN/googleanalytics(3253):     at android.os.Looper.loop(Looper.java:126)

04-28 12:35:43.150: WARN/googleanalytics(3253):     at android.os.HandlerThread.run(HandlerThread.java:60)

04-28 12:35:53.110: DEBUG/NetworkRequestUtil/ConstructPageviewRequestPath(3253): /__utm.gif?utmwv=4.5ma&utmn=1709128022&utmcs=UTF-8&utmsr=1280x800&utmul=en-US&utmp=%2Fhttp%3A%2F%2Fandroid.clients.google.com%2Ffdfe%3Fe%3DBROWSE%26c%3D1743839399&utmac=UA-19761900-1&utmcc=__utma%3D999.1840870358.1303223573.1303963501.1303965303.43

04-28 12:35:53.110: WARN/googleanalytics(3253): Problem with socket or streams.

04-28 12:35:53.110: WARN/googleanalytics(3253): java.net.ConnectException: www.google-analytics.com/127.0.0.1:80 - Connection refused

04-28 12:35:53.110: WARN/googleanalytics(3253):     at org.apache.harmony.luni.net.PlainSocketImpl.connect(PlainSocketImpl.java:211)

04-28 12:35:53.110: WARN/googleanalytics(3253):     at org.apache.harmony.luni.net.PlainSocketImpl.connect(PlainSocketImpl.java:431)

04-28 12:35:53.110: WARN/googleanalytics(3253):     at java.net.Socket.connect(Socket.java:901)

04-28 12:35:53.110: WARN/googleanalytics(3253):     at org.apache.http.conn.scheme.PlainSocketFactory.connectSocket(PlainSocketFactory.java:119)

04-28 12:35:53.110: WARN/googleanalytics(3253):     at com.google.android.apps.analytics.PipelinedRequester.maybeOpenConnection(Unknown Source)

04-28 12:35:53.110: WARN/googleanalytics(3253):     at com.google.android.apps.analytics.PipelinedRequester.addRequest(Unknown Source)

04-28 12:35:53.110: WARN/googleanalytics(3253):     at com.google.android.apps.analytics.NetworkDispatcher$DispatcherThread$AsyncDispatchTask.dispatchSomePendingEvents(Unknown Source)

04-28 12:35:53.110: WARN/googleanalytics(3253):     at com.google.android.apps.analytics.NetworkDispatcher$DispatcherThread$AsyncDispatchTask.run(Unknown Source)

04-28 12:35:53.110: WARN/googleanalytics(3253):     at android.os.Handler.handleCallback(Handler.java:587)

04-28 12:35:53.110: WARN/googleanalytics(3253):     at android.os.Handler.dispatchMessage(Handler.java:92)

04-28 12:35:53.110: WARN/googleanalytics(3253):     at android.os.Looper.loop(Looper.java:126)

04-28 12:35:53.110: WARN/googleanalytics(3253):     at android.os.HandlerThread.run(HandlerThread.java:60)

原來當你在使用 Android Market, 不管看過哪些程式, 安裝哪些軟體, 搜尋哪些遊戲, 這些動作通通都會回報給 Google .. 分析 (?), 也許拿來改善 Market 的設計, 又或者計算程式的排名.

不過我好不容易翻出 Android Market Terms of Service, 左看右看卻找不到會蒐集使用者資料的說明, 而印象中某 Google 工程師在介紹 Google Analytics for Mobile 時提到, 使用這個 API 一定得告知使用者, 最好還有個選項可以關閉資料的蒐集. (Software principles from Google Analytics API – Terms & Conditions) 但不知道是我眼殘, 還是這些說明及開關都埋在很深的 UI 裡面, 我怎麼也找不到他要我接受 ToS 的地方, 也找不到可以禁用 Google Analytics 的方法..

還好目前可以透過 Root 的方式使用 AdFree 把這類的連線 “關閉”, 雖然吃到飽的 3G 網路不會因為這點小封包受到影響, 但這種蒐集使用者習慣的方式讓人感到不是很舒服 (Android 2.3 之前的 Market 都沒這現象) 讓我 Root Android device 的理由再添上一筆 !

另一種 Root EEE Pad Transformer 的方法..

April 23rd, 2011

果然, EEE Pad 的最新 OTA update 把 recovery 的簽名檢查開啟了, 所以如果你先前有 Root 過卻不小心安裝了更新檔案, EEE Pad 就失去了 Root 權限.

說巧不巧, 最近有個 GingerBreak 的 root 程式 release, 所以只要小小修改一下 source code 重新 compile, 便可得到能在 EEE Pad 上使用的 root 程式. 我花了點時間做成 Windows 上可執行的批次檔, 有興趣及需要得可以抓回自行研究.

警告: 執行該程式可能損壞您的 EEE Pad, 不保證不破壞保固, 出事 (EEE Pad 再起不能, 電腦爆炸, 女朋友分手或老婆紅杏出牆..) 自行負責, 程式僅供自我學習參考用 微笑

說明:

  1. 程式使用的平台為 Windows 7, 請先至官網下載  USB Driver.
  2. 執行過程需要插入 SD 卡
  3. 執行成功後請自行重開機

使用:

將 EEE Pad 上的 USB Debugging 開啟, 連接至電腦後安裝 USB Driver. 抓回程式 [http://www.multiupload.com/GE43AOTTY4] , 解開後透過 cmd 執行 EEE_Root 下的 RootMyTransformer.bat, 過了一會兒 (沒仔細算) 出現 “Done ! Transformer is waiting to take your orders !” 代表成功囉.

Root eee pad 的方法..

April 16th, 2011

先說明: 任何 root 行為都有可能破壞保固 & 讓你的機器爛掉, 本篇文章僅供自我學習參考用 微笑

拿到 eee pad 後開始嘗試 root (為了打生氣鳥不會出現礙眼的廣告), 首先想辦法進入 recovery 或者 fastboot mode, 發現:

  1. 按著 power key 長一點時間 (10s) 可以 reboot
  2. Power + Volume up 可以進入 NVIDIA USB Boot-recovery, 可惜有鎖, 以至於 nvflash 沒法得到進一步的資訊.
  3. Power + Volume down + 甚麼都不做, 會進入 wipe mode, 再按 Volume up 可以清除使用者資料, Volume down 重開機.
  4. Power + Volume down + 5 秒內按 Volume up 會進入 ReCoveryKernel, 畫面會顯示 /!\ 與小機器人, 等久一點 adb shell 可以進去. 在環境變數沒有設定的狀況下, 執行一些命令得加上 /bin, 比如 /bin/ls, 有點麻煩.

此時不知道哪根筋不對, 跑到 /tmp 找到 recovery.log

recovery.log.orig

看見有趣的 info: sdcard 下的ASUS_BUNDLE.zip & EP101_SDUPDATE.zip. 於是想辦法抓了下 Superuser & gapps 的 package for Tegra (因為要 update-binary), 包裝成前面兩個檔名的 update.zip 後塞到 SD 卡重開機進 RCK..

  1. ASUS_BUNDLE.zip 會讓 eee pad 重開機, 甚麼事情也沒發生.
  2. EP101_SDUPDATE.zip 可以成功將 Superuser 刷進去, but ! su 的 binary 不能用, 得找同是 Tegra 平台的才行. 所以要嘛就用 G Tablet, 要嘛就用 XOOM..

結果檔案沒找到, MoDaCo 的 Paul 就發表了 root 包. 微笑 不過誠心的希望 ASUS 不要把這個 *功能* 於下一次更新中關閉啊 !! >___< (Samsung i9000 表示杯具)

Android 刷機入門投影片

April 16th, 2011

Android 防毒軟體試用

March 7th, 2011

自從 Android 的使用者越來越多之後, 惡意軟體也跟著入侵這塊淨土, 從今年開始就陸陸續續不少 Android Market 出現惡意軟體的報導. 有的是偽裝成可愛的小遊戲, 有的則是偽裝成工具軟體, 還有的是直接拿熱門的付費軟體重新包裝, 看準使用者不熟悉哪位才是正統開發商以及貪小便宜的心理, 植入木馬竊取使用者的資料. 雖說 Google 也都有注意, 不過速度上總是慢了一些, 對於手腳快的使用者來說, 這是不夠的. 軟體業者看好這塊大餅, 推出各式各樣的防護軟體, 除了基本的惡意軟體掃描, 各家業者對 Security 也抱持不同想法, 有的提供手機遺失時定位服務, 甚至可以遠端上鎖, 清除資料; 有的可以將程式上密碼, 有的可以為你找出掛載廣告的軟體..

不過這麼多應用程式, 到底哪一套比較適合自己呢 ? 小弟花了點時間試用幾套 focus 於 “掃描惡意軟體” 的免費程式, 在這邊跟大家分享, 希望對那些想要尋找合適防護軟體的朋友們有所幫助, 以下是試用的軟體清單:

有幾套軟體這次沒有介紹, 在這邊解釋一下:

Read the rest of this entry »