又一個 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 的理由再添上一筆 !