Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.
ごめんなさい
資料完成しませんでした。。。
https://github.com/operando/Notes/tree/master/Shibuya.apk_4
https://github.com/operando/JobScheduler-Code-Reading
資料内のリンクと...
About Me
• Shinobu Okano (@operandoOS)
• Mercari, Inc.
• 今週で23歳になりました!ありがとうございます!
• 最近iPhone6s Plus買いました(笑)
まったりAndroid 

Framework Code Reading #2
メルカリでやります!きてね!
https://mandroidfcr.doorkeeper.jp/events/33925
Did you know Project Volta?
Project Volta
• 簡単に言ってバッテリー消費を削減するプロジェクト
• Android Lで行われたもの
• Battery Historian
• JobScheduler
• AlarmManagerが省電力化(4.4 Kit...
Google I/O 2014
Introduction to Project Volta
https://www.youtube.com/watch?v=KzSKIpJepUw
定期処理って今までこんな感じ
• AlarmManager + IntentService
• BroadcastReceiver + Service
• Timer,ScheduledExecutorService
• 方法は様々...
条件付きで実行したいってなると...
• とりあえずIntentService動かす
• でも条件(Wi-Fiにつながってるとか)に合致し
てなくて処理を断念...
• とにかく動かしてみないとわからない...
AlarmManagerって大変だよね...
• 再起動/アプリのアップデートするとAlarmがクリアされる
• BroadcastCastでACTION_BOOT_COMPLETED拾って

Alarmセットしなおし
• COMPLETED拾...
ずっと生きてるService嫌だよね...
• 死んでほしいのにずっと生きてるService
• Killしてもすぐ蘇る
• そんなService開発者も作りたくない
• こいつはどうしようもない...
とにかく今まで辛かったよな!!
• その気持ちわかるぞ!
• 辛い!辛い!
俺はこんな辛い気持ちを

愚痴りにきたわけではない!
救世主? JobScheduler
Did you know JobScheduler?
Do you use JobScheduler?
About JobScheduler
• Android Lから導入されたAPI
• 様々な条件のJobをスケジュールしてくれるAPI
• 使うことで消費電力を意識した実装ができる
• 開発者が頑張らなくていいAPI
About JobScheduler
• Android Framework Services
• マルチユーザ用にも設計されている(当たり前か)
• Schedulerであって、Alarmではない
• 特定の時間に実行!みたいな感じではない
JobSchedulerの使い方
• Android API21から追加されたJobSchedulerに

慣れていこう
• goo.gl/OMBCrl
• Using the JobScheduler API on Android Lolli...
Frameworkでは

JobSchedulerは使われている
• Auto Bakcup
• Download
• Dex Opt
Auto Backup - Android M
• ユーザの操作コストを極力かけずにアプリの
ユーザデータの自動バックアップを作成する
• 今までBackupの実装必要だったけどいらない
• 細かいことは割愛
Auto Backup - 条件
• バックアップは24時間ごとに行われる
• バックアップは充電中、WiFi接続、アイドル状態
の3つの条件が満たされた時に行われる
• この条件(24時間,充電中,WiFi接続,アイドル状態)
を制御してるの...
Auto Backup - 条件
http://tools.oesf.biz/android-6.0.0_r1.0/xref/frameworks/base/
services/backup/java/com/android/server/ba...
Inside JobScheduler
JobService#onStartJob
• MainThreadで実行される
• なので重い処理はAnother Threadを作って処
理する
• jobFinishedしないとjobがはけないから気を
つけて。新しいjobが実行できなく...
JobService#onStopJob
• 戻り値でtrueを返せばjob作成時に、指定された再試行の基
準に基づいてjobを再スケジューリング
• 戻り値でfalseを返せばjobは止まる
• onStopJobが呼ばれるのは、保留中・実行...
scheduleの流れ
JobScheduler.schedule(JobInfo)
• JobScheduler.schedule(JobInfo)
• プロセス間通信でJobSchedulerStub#scheduleを呼び出す
• Jobの登録ができればJobS...
JobSchedulerStub#schedule
• JobSchedulerStub#schedule
• enforceValidJobRequestやcanPersistJobsでJob登録が
できるかどうかとチェック
• JobSch...
JobSchedulerService#schedule
• JobSchedulerService#schedule
• JobInfoとアプリのUIDでJobStatusを生成。Framework側では
JobInfoはJobStatusと...
JobSchedulerService#stopTrackingJobs
• JobStoreにある同じJobをremove
• 各StateControllerから同じJobをremove(removeするにもJobStatus
が各Stat...
JobSchedulerService#startTr
ackingJob
• 基本的にJobSchedulerService#stopTrackingJobと逆のことする
(JobStatusのadd)
• 各StateControllerに...
JobSchedulerService#maybeQueu
eReadyJobsForExecutionLockedH
• The state of at least one job has changed.(少なくとも一つのジョブの状態が変更...
Demo
Demo
• JobInfo.Builder#setRequiredNetworkType(JobInfo.NETWO
RK_ANY)のjobを1つずつ登録
• 1個目のjobを登録したら、jobはREADYのままで止まってい
る(Pendin...
再起動後も動くJobが作れる
• JobInfo.Builder#setPersisted(true)でJobが再起動後も

実行される
• 開発者が再起動後に自分でまたJobを登録する必要がない
• JobInfo.Builder#setEx...
あれ?

再起動後も引き継げるってことは?
• Jobの情報を再起動時のためにどこかに保持する
必要がある
• ということは、ファイルとかに書き出さないと
だよね?
• おぉ!これは面白そう!
ということで

こいつ...どこかに保存してるぞ...
• /data/system/job/jobs.xml
• JobStoreというクラスがそこら辺管理してる
• JobSchedulerにJob(Persisted = true)が

...
ということで

こいつ...どこかに保存してるぞ...
• http://tools.oesf.biz/android-6.0.0_r1.0/xref/frameworks/base/
services/core/java/com/androi...
/data/system/job/jobs.xml
<?xml version='1.0' encoding='utf-8' standalone='yes' ?>
<job-info version="0">
<job jobid="0" p...
PersistableBundleの中身
• JobにセットしたPersistableBundleの中身も書き込まれます
• xmlへの書き込み処理はここでやってる
• http://tools.oesf.biz/android-6.0.0_r...
PersistableBundleの中身
<job jobid="0" package="com.os.operando.jobschedulersample"
class="com.os.operando.jobschedulersample...
PersistableBundleの書き込み
• PersistableBundleの情報を保存する処理は、保存するXML
だけ用意してあげれば、どんなものでも使える汎用的なも
のっぽい。
• PersistableBundle#restore...
RAMサイズによって

同時実行できるJobの数が変わる!?
• System propertyのro.config.low_ram=true場合
• 同時実行できるJobの数は1つ
• System propertyのro.config.low_...
RAMサイズによって

同時実行できるJobの数が変わる!?
• え、じゃ同時に3つのJobしかできないじゃん
• はい、そうです。
• すいません・・・。(別に俺が実装したわけじゃない
• 大きなJobが走ると他のJobが実行できない
• ど...
RAMサイズによって

同時実行できるJobの数が変わる!?
• http://tools.oesf.biz/android-6.0.0_r1.0/xref/frameworks/base/services/
core/java/com/and...
Demo
StateControllerの種類
• JobManager
• 各条件の監視をして、Jobの状態をコントロールする
• Controllerの生成箇所
• http://tools.oesf.biz/android-6.0.0_r1.0/x...
Debugging JobScheduler
• adb shell dumpsys jobscheduler
• JobSchedulerに登録されているJobをDumpする。めっちゃ使う
• adb logcat -s JobSchedul...
面白コメント
// Let's go!
http://tools.oesf.biz/android-6.0.0_r1.0/xref/
frameworks/base/services/core/java/com/android/
server/job/Job...
// GO GO GO!
http://tools.oesf.biz/android-6.0.0_r1.0/xref/frameworks/
base/services/core/java/com/android/server/job/
Job...
Android M
Doze and App Standby
http://developer.android.com/about/versions/marshmallow/android-6.0-
changes.html#behavior-power
• Jo...
Thanks!
JobScheduler Code Reading
You’ve finished this document.
Download and read it offline.
Upcoming SlideShare
Android 5.0 Lollipop platform change investigation report
Next
Upcoming SlideShare
Android 5.0 Lollipop platform change investigation report
Next
Download to read offline and view in fullscreen.

Share

JobScheduler Code Reading

Download to read offline

JobScheduler Code Reading

資料内のリンクとかJobSchedulerの電波メモ
https://github.com/operando/JobScheduler-Code-Reading
https://github.com/operando/Notes/tree/master/Shibuya.apk_4

shibuya.apk #4
http://shibuya-apk.connpass.com/event/21474/

Related Books

Free with a 30 day trial from Scribd

See all

JobScheduler Code Reading

  1. 1. ごめんなさい 資料完成しませんでした。。。
  2. 2. https://github.com/operando/Notes/tree/master/Shibuya.apk_4 https://github.com/operando/JobScheduler-Code-Reading 資料内のリンクとか JobSchedulerの電波メモ
  3. 3. About Me • Shinobu Okano (@operandoOS) • Mercari, Inc. • 今週で23歳になりました!ありがとうございます! • 最近iPhone6s Plus買いました(笑)
  4. 4. まったりAndroid 
 Framework Code Reading #2 メルカリでやります!きてね! https://mandroidfcr.doorkeeper.jp/events/33925
  5. 5. Did you know Project Volta?
  6. 6. Project Volta • 簡単に言ってバッテリー消費を削減するプロジェクト • Android Lで行われたもの • Battery Historian • JobScheduler • AlarmManagerが省電力化(4.4 KitKat)
  7. 7. Google I/O 2014 Introduction to Project Volta https://www.youtube.com/watch?v=KzSKIpJepUw
  8. 8. 定期処理って今までこんな感じ • AlarmManager + IntentService • BroadcastReceiver + Service • Timer,ScheduledExecutorService • 方法は様々...
  9. 9. 条件付きで実行したいってなると... • とりあえずIntentService動かす • でも条件(Wi-Fiにつながってるとか)に合致し てなくて処理を断念... • とにかく動かしてみないとわからない...
  10. 10. AlarmManagerって大変だよね... • 再起動/アプリのアップデートするとAlarmがクリアされる • BroadcastCastでACTION_BOOT_COMPLETED拾って
 Alarmセットしなおし • COMPLETED拾って、Alarmセットしなおし • cancelめんどくさい , 同じようなAlarm作るのだるい • とにかく辛い… 俺は辛い...
  11. 11. ずっと生きてるService嫌だよね... • 死んでほしいのにずっと生きてるService • Killしてもすぐ蘇る • そんなService開発者も作りたくない • こいつはどうしようもない...
  12. 12. とにかく今まで辛かったよな!! • その気持ちわかるぞ! • 辛い!辛い!
  13. 13. 俺はこんな辛い気持ちを
 愚痴りにきたわけではない!
  14. 14. 救世主? JobScheduler
  15. 15. Did you know JobScheduler?
  16. 16. Do you use JobScheduler?
  17. 17. About JobScheduler • Android Lから導入されたAPI • 様々な条件のJobをスケジュールしてくれるAPI • 使うことで消費電力を意識した実装ができる • 開発者が頑張らなくていいAPI
  18. 18. About JobScheduler • Android Framework Services • マルチユーザ用にも設計されている(当たり前か) • Schedulerであって、Alarmではない • 特定の時間に実行!みたいな感じではない
  19. 19. JobSchedulerの使い方 • Android API21から追加されたJobSchedulerに
 慣れていこう • goo.gl/OMBCrl • Using the JobScheduler API on Android Lollipop • code.tutsplus.com/tutorials/using-the- jobscheduler-api-on-android-lollipop--cms-23562
  20. 20. Frameworkでは
 JobSchedulerは使われている • Auto Bakcup • Download • Dex Opt
  21. 21. Auto Backup - Android M • ユーザの操作コストを極力かけずにアプリの ユーザデータの自動バックアップを作成する • 今までBackupの実装必要だったけどいらない • 細かいことは割愛
  22. 22. Auto Backup - 条件 • バックアップは24時間ごとに行われる • バックアップは充電中、WiFi接続、アイドル状態 の3つの条件が満たされた時に行われる • この条件(24時間,充電中,WiFi接続,アイドル状態) を制御してるのがJobScheduler
  23. 23. Auto Backup - 条件 http://tools.oesf.biz/android-6.0.0_r1.0/xref/frameworks/base/ services/backup/java/com/android/server/backup/ FullBackupJob.java ココらへんにそれっぽい処理が書いてある
  24. 24. Inside JobScheduler
  25. 25. JobService#onStartJob • MainThreadで実行される • なので重い処理はAnother Threadを作って処 理する • jobFinishedしないとjobがはけないから気を つけて。新しいjobが実行できなくなる
  26. 26. JobService#onStopJob • 戻り値でtrueを返せばjob作成時に、指定された再試行の基 準に基づいてjobを再スケジューリング • 戻り値でfalseを返せばjobは止まる • onStopJobが呼ばれるのは、保留中・実行中のjobが何かに より(登録したjobの更新)cancelされた際に呼ばれるっぽい • job実行中にcancelAllとかすれば呼ばれる
  27. 27. scheduleの流れ
  28. 28. JobScheduler.schedule(JobInfo) • JobScheduler.schedule(JobInfo) • プロセス間通信でJobSchedulerStub#scheduleを呼び出す • Jobの登録ができればJobScheduler.RESULT • FAILUREが返ってくる。 • なので、Jobの登録ができたかどうかしっかり見てあげよう • http://tools.oesf.biz/android-6.0.0_r1.0/xref/frameworks/base/ core/java/android/app/JobSchedulerImpl.java#schedule
  29. 29. JobSchedulerStub#schedule • JobSchedulerStub#schedule • enforceValidJobRequestやcanPersistJobsでJob登録が できるかどうかとチェック • JobSchedulerService#scheduleを呼び出す • http://tools.oesf.biz/android-6.0.0_r1.0/xref/ frameworks/base/services/core/java/com/android/ server/job/JobSchedulerService.java#813
  30. 30. JobSchedulerService#schedule • JobSchedulerService#schedule • JobInfoとアプリのUIDでJobStatusを生成。Framework側では JobInfoはJobStatusとして管理される • cancelJob + cancelJobImplで同じJobが登録されていたらcancelす る(Job ID + UIDが同じJobStatus) • pendingとしてqueueに溜まってるJobもcancel。ActiveServices(実 際に動いてるJob)を全部チェックして、同じJobがあればcancel処理 を行う。
  31. 31. JobSchedulerService#stopTrackingJobs • JobStoreにある同じJobをremove • 各StateControllerから同じJobをremove(removeするにもJobStatus が各StateControllerの条件にあっているかどうかをチェックしてる) • 全JobStatusを管理するクラスとしてJobStoreが使われている • http://tools.oesf.biz/android-6.0.0_r1.0/xref/frameworks/base/ services/core/java/com/android/server/job/ JobSchedulerService.java#190
  32. 32. JobSchedulerService#startTr ackingJob • 基本的にJobSchedulerService#stopTrackingJobと逆のことする (JobStatusのadd) • 各StateControllerにJobStatusをaddする(addするにもJobStatusが各 StateControllerの条件にあっているかどうかをチェックしてる) • mReadyToRock(JobSchedulerの準備??)がtrueになっていないと、基本的 にはaddもremoveもできない • http://tools.oesf.biz/android-6.0.0_r1.0/xref/frameworks/base/services/ core/java/com/android/server/job/JobSchedulerService.java#373
  33. 33. JobSchedulerService#maybeQueu eReadyJobsForExecutionLockedH • The state of at least one job has changed.(少なくとも一つのジョブの状態が変更 された) • ready(実行可能)になっているjobがいくつ存在するかで決めているっぽい • Right now the policy is such: • If >1 of the ready jobs is idle mode we send all of them off • if more than 2 network connectivity jobs are ready we send them all off. • If more than 4 jobs total are ready we send them all off. • http://tools.oesf.biz/android-6.0.0_r1.0/xref/frameworks/base/services/core/ java/com/android/server/job/JobSchedulerService.java#622
  34. 34. Demo
  35. 35. Demo • JobInfo.Builder#setRequiredNetworkType(JobInfo.NETWO RK_ANY)のjobを1つずつ登録 • 1個目のjobを登録したら、jobはREADYのままで止まってい る(Pendingにも入ってない) • 2個目のjobを登録したら、jobがActiveになった • 上の条件に合致したので、jobをpending queueに移動させ て、実行したのだと推測
  36. 36. 再起動後も動くJobが作れる • JobInfo.Builder#setPersisted(true)でJobが再起動後も
 実行される • 開発者が再起動後に自分でまたJobを登録する必要がない • JobInfo.Builder#setExtras(PersistableBundle)で再起動後も
 値を引き継げる • 素晴らしい!
  37. 37. あれ?
 再起動後も引き継げるってことは? • Jobの情報を再起動時のためにどこかに保持する 必要がある • ということは、ファイルとかに書き出さないと だよね? • おぉ!これは面白そう!
  38. 38. ということで
 こいつ...どこかに保存してるぞ... • /data/system/job/jobs.xml • JobStoreというクラスがそこら辺管理してる • JobSchedulerにJob(Persisted = true)が
 追加された or 削除された際に内容がSyncされる
  39. 39. ということで
 こいつ...どこかに保存してるぞ... • http://tools.oesf.biz/android-6.0.0_r1.0/xref/frameworks/base/ services/core/java/com/android/server/job/JobStore.java • 書き込み処理は主にこれ • http://tools.oesf.biz/android-6.0.0_r1.0/xref/frameworks/base/ services/core/java/com/android/server/job/ JobStore.java#WriteJobsMapToDiskRunnable ココらへんにそれっぽい処理が書いてある
  40. 40. /data/system/job/jobs.xml <?xml version='1.0' encoding='utf-8' standalone='yes' ?> <job-info version="0"> <job jobid="0" package="com.os.operando.jobschedulersample" class="com.os.operando.jobschedulersample.services.MyJobService" uid="10054"> <constraints connectivity="true" /> <periodic period="1000" deadline="1446590637790" delay="1446590636790" /> <extras /> </job> <job jobid="20536" package="android" class="com.android.server.backup.FullBackupJob" uid="1000"> <constraints unmetered="true" idle="true" charging="true" /> <one-off /> <extras /> </job> <job jobid="1" package="com.android.providers.downloads" class="com.android.providers.downloads.DownloadIdleService" uid="10005"> <constraints idle="true" charging="true" /> <periodic period="86400000" deadline="1446675936870" delay="1446589536870" /> <extras /> </job> <job jobid="800" package="android" class="com.android.server.pm.BackgroundDexOptService" uid="1000"> <constraints idle="true" charging="true" /> <one-off delay="1446589526460" /> <extras /> </job> </job-info>
  41. 41. PersistableBundleの中身 • JobにセットしたPersistableBundleの中身も書き込まれます • xmlへの書き込み処理はここでやってる • http://tools.oesf.biz/android-6.0.0_r1.0/xref/frameworks/base/ core/java/android/os/PersistableBundle.java#restoreFromXml • 書き込み処理はJobStore内から呼び出される • http://tools.oesf.biz/android-6.0.0_r1.0/xref/frameworks/base/ services/core/java/com/android/server/job/JobStore.java#608
  42. 42. PersistableBundleの中身 <job jobid="0" package="com.os.operando.jobschedulersample" class="com.os.operando.jobschedulersample.services.MyJobService" uid="10059"> <constraints connectivity="true" idle="true" charging="true" /> <periodic period="1000" deadline="1446648619790" delay="1446648618790" /> <extras> <int name="id" value="0" /> </extras> </job>
  43. 43. PersistableBundleの書き込み • PersistableBundleの情報を保存する処理は、保存するXML だけ用意してあげれば、どんなものでも使える汎用的なも のっぽい。 • PersistableBundle#restoreFromXmlがhideなので、サード パーティからは使えないけど・・・。 • http://tools.oesf.biz/android-6.0.0_r1.0/xref/frameworks/ base/core/java/android/os/ PersistableBundle.java#restoreFromXml
  44. 44. RAMサイズによって
 同時実行できるJobの数が変わる!? • System propertyのro.config.low_ram=true場合 • 同時実行できるJobの数は1つ • System propertyのro.config.low_ram=faseの場合 • 同時実行できるJobの数は3つ • ro.config.low_ramはAndroid4.4で導入された、メモリ搭載量が少な いターゲット向けの設定 • Android Wearとかはro.config.low_ram=trueかな?
  45. 45. RAMサイズによって
 同時実行できるJobの数が変わる!? • え、じゃ同時に3つのJobしかできないじゃん • はい、そうです。 • すいません・・・。(別に俺が実装したわけじゃない • 大きなJobが走ると他のJobが実行できない • どんまい…
  46. 46. RAMサイズによって
 同時実行できるJobの数が変わる!? • http://tools.oesf.biz/android-6.0.0_r1.0/xref/frameworks/base/services/ core/java/com/android/server/job/JobSchedulerService.java#77 • http://tools.oesf.biz/android-6.0.0_r1.0/xref/frameworks/base/services/ core/java/com/android/server/job/JobSchedulerService.java#352 • https://source.android.com/devices/tech/config/low-ram.html ココらへんにそれっぽい処理が書いてある
  47. 47. Demo
  48. 48. StateControllerの種類 • JobManager • 各条件の監視をして、Jobの状態をコントロールする • Controllerの生成箇所 • http://tools.oesf.biz/android-6.0.0_r1.0/xref/ frameworks/base/services/core/java/com/ android/server/job/JobSchedulerService.java#313
  49. 49. Debugging JobScheduler • adb shell dumpsys jobscheduler • JobSchedulerに登録されているJobをDumpする。めっちゃ使う • adb logcat -s JobSchedulerService • JobSchedulerServiceのログ。あんまり出ないけど... • idle状態にするコマンド • adb shell dumpsys battery unplug • adb shell dumpsys deviceidle enable • adb shell dumpsys deviceidle step • adb shell dumpsys deviceidle force-idle
  50. 50. 面白コメント
  51. 51. // Let's go! http://tools.oesf.biz/android-6.0.0_r1.0/xref/ frameworks/base/services/core/java/com/android/ server/job/JobSchedulerService.java#348
  52. 52. // GO GO GO! http://tools.oesf.biz/android-6.0.0_r1.0/xref/frameworks/ base/services/core/java/com/android/server/job/ JobSchedulerService.java#367
  53. 53. Android M
  54. 54. Doze and App Standby http://developer.android.com/about/versions/marshmallow/android-6.0- changes.html#behavior-power • JobSchedulerってココらへんの話とも絡むよね? • 深掘りしたい!! • 省電力頑張りたい! • DrodiKaigiで話したい!(このテーマで??
  55. 55. Thanks!
  • HirokiSakamoto

    Nov. 7, 2015

JobScheduler Code Reading 資料内のリンクとかJobSchedulerの電波メモ https://github.com/operando/JobScheduler-Code-Reading https://github.com/operando/Notes/tree/master/Shibuya.apk_4 shibuya.apk #4 http://shibuya-apk.connpass.com/event/21474/

Views

Total views

3,695

On Slideshare

0

From embeds

0

Number of embeds

627

Actions

Downloads

9

Shares

0

Comments

0

Likes

1

×