21 March 2015

(Android 2.3.4) YouTube同期が終了せずバッテリーが異常消耗する

Android 2.3.4が稼働するLenovo IdeaPad A1で、いつまで経っても同期処理が終わらず、バッテリーが急速に消耗していく現象が頻発するようになった。

(このエラーを回復させるため、OSを再インストールしたが問題解消できない。 原因を調べてみた…)

Androidの設定で自動同期OFFにできない…

20150321-ideapad-gb-syncsetup.jpg
設定 − アカウント の同期(Sync)設定

まず、「自動同期のチェックをON」にした状態で、全てのGoogleアカウント設定の「個別の同期のチェックをOFF」にする。その後、上の画面のページに戻り、「自動同期のチェックをOFF」とする。

これで自動同期は行われないはずだ。

しかし、WifiをONにしてしばらくすると、同期が始まり、それが終わらない… 。同期の無限ループ エラーだ。

20150321-ideapad-gb-syncsetup2.jpg
ステータスバーに同期アイコンが表示され続ける (上の矢印で示した部分)

このようになった場合は、設定 − アカウント − “それぞれのGmailアカウント” でメニューを表示し、「同期をキャンセル」(上の画面例の下の矢印で示した部分)すれば、同期を強制中断させることができる。

毎回、こんな一時しのぎはできないし、気づかず放っておくと1日でバッテリー切れを起こしてしまう。

ログを確認し、原因がYouTubeアプリと判明

Androidのログを確認すると、YouTubeの同期が勝手に行われているだけでなく、何故かそれがエラーになって暴走している…

20150321-ideapad-gb-logcat.jpg
DDMSでログを確認

実際のログはこんな感じで、5分間受信操作をしハングアップ、再び受信操作を最初から…
という無限ループ状態。

03-20 20:35:00.403: D/dalvikvm(1323): GC_EXTERNAL_ALLOC freed 149K, 50% free 2927K/5767K, external 1843K/1863K, paused 29ms
03-20 20:35:04.872: I/test(1379): I will sleep ten minutes
03-20 20:35:29.294: D/GCM(1203): Message class com.google.f.a.a.i
03-20 20:35:30.536: D/SyncManager(1118): canceling and rescheduling sync because it ran too long: authority: com.google.android.youtube.provider account: Account {name=XXXXXXXXX@gmail.com, type=com.google} extras: [initialize=true ] syncSource: 2 when: 670728 expedited: false
03-20 20:35:30.567: W/YouTube(1445): apps.youtube.app.offline.sync.OfflineSyncService.onBind:28 PUDL binding sync adapter
03-20 20:35:35.614: D/dalvikvm(1203): GC_EXPLICIT freed 184K, 43% free 4251K/7431K, external 1069K/1492K, paused 41ms
03-20 20:35:38.989: D/YouTube(1445): apps.youtube.common.e.j.b:27 Executed scheduled task of type com.google.android.apps.youtube.datalib.offline.p
03-20 20:35:38.989: D/YouTube(1445): apps.youtube.common.e.j.b:27 Executed scheduled task of type com.google.android.apps.youtube.datalib.offline.p
03-20 20:35:38.997: D/YouTube(1445): apps.youtube.datalib.offline.p.a:55 Flushing offline queue.
03-20 20:35:38.997: D/YouTube(1445): apps.youtube.datalib.offline.p.a:55 Flushing offline queue.
03-20 20:35:51.044: D/SntpClient(1118): request time failed: java.net.SocketTimeoutException: Try again
03-20 20:35:51.325: W/KeyCharacterMap(1686): No keyboard for id 0
 
 〜 中略 〜
 
03-20 20:40:05.176: D/dalvikvm(1426): GC_EXPLICIT freed 25K, 47% free 4220K/7879K, external 2115K/2642K, paused 40ms
03-20 20:40:30.559: D/SyncManager(1118): canceling and rescheduling sync because it ran too long: authority: com.google.android.youtube.provider account: Account {name=XXXXXXXXX@gmail.com, type=com.google} extras: [initialize=true ] syncSource: 2 when: 970747 expedited: false
03-20 20:40:30.583: W/YouTube(1445): apps.youtube.app.offline.sync.OfflineSyncService.onBind:28 PUDL binding sync adapter
03-20 20:41:00.231: D/dalvikvm(1323): GC_EXTERNAL_ALLOC freed 150K, 49% free 2959K/5767K, external 1702K/1722K, paused

まさしく、新入社員レベルのGoogleプログラマが作ったとしか思えん…

Youtubeアプリを強制削除

設定 − アプリケーション − アプリケーションの管理 ではYouTubeアプリは削除できないようなので、コマンドラインから強制削除を掛ける

# pm disable com.google.android.youtube
# pm clean com.google.android.youtube
# mount -o remount,rw /system /system
# rm /system/app/YouTube.apk

また、/data/system/packages.xmlをviエディタなどで開き、YouTube.apkに関連する全ての行を抹消する。

YouTubeのクリーンインストールで再確認

Google PlayよりYouTubeを再インストールし、同期の無限ループに陥らないか確認したが、やはり無限ループに陥る。

一度、YouTubeを抹消した後に再インストールしたYouTubeは、通常通り設定 − アプリケーション − アプリケーションの管理からGUI上でアンインストール可能。