パフォーマンスの最適化10_JobSchedulerソース

Androidのパフォーマンスの最適化の概要

1 jobschedulerのアクセスを実現

 JobScheduler tm = (JobScheduler) getSystemService(Context.JOB_SCHEDULER_SERVICE);

二つの側面:

  1. システムは、サービスを開始すると
  2. そこJobSchedulerServiceクラスかどうかを確認するには

結果:JobSchedulerServiceのが存在

JobSchedulerService extends com.android.server.SystemService implements StateChangedListener, JobCompletedListener

2 AIDL

jobschedulerの追跡できない抽象クラスであり、
それはgetSystemServiceによって得られるので、それらのサービスおよびシステム・サービスが通信する必要がある、それはクロスプロセスのアクセス、プロセス間通信(IPC、バインダー、AIDL)に関連するべきである
JobScheduleServiceにも対応を見つけます。クラス:JobSchedulerStubはIJobScheduler.Stubを拡張

3スケジュール方法

JobScheduler.schedule - > IJobScheduler.Stub.schedule

4上にベリファイ

そして、任意のjobschedulerの実装クラスの独自の実装を探して(最終的にJobSchedulerImplがjobschedulerのを拡張しました)

public class JobSchedulerImpl extends JobScheduler {
    IJobScheduler mBinder;

    /* package */ JobSchedulerImpl(IJobScheduler binder) {
        mBinder = binder;
    }

    @Override
    public int schedule(JobInfo job) {
        try {
            return mBinder.schedule(job);
        } catch (RemoteException e) {
            return JobScheduler.RESULT_FAILURE;
        }
    }

    @Override
    public int enqueue(JobInfo job, JobWorkItem work) {
        try {
            return mBinder.enqueue(job, work);
        } catch (RemoteException e) {
            return JobScheduler.RESULT_FAILURE;
        }
    }

    @Override
    public int scheduleAsPackage(JobInfo job, String packageName, int userId, String tag) {
        try {
            return mBinder.scheduleAsPackage(job, packageName, userId, tag);
        } catch (RemoteException e) {
            return JobScheduler.RESULT_FAILURE;
        }
    }

    @Override
    public void cancel(int jobId) {
        try {
            mBinder.cancel(jobId);
        } catch (RemoteException e) {}

    }

    @Override
    public void cancelAll() {
        try {
            mBinder.cancelAll();
        } catch (RemoteException e) {}

    }

    @Override
    public List<JobInfo> getAllPendingJobs() {
        try {
            return mBinder.getAllPendingJobs().getList();
        } catch (RemoteException e) {
            return null;
        }
    }

    @Override
    public JobInfo getPendingJob(int jobId) {
        try {
            return mBinder.getPendingJob(jobId);
        } catch (RemoteException e) {
            return null;
        }
    }

    @Override
    public List<JobInfo> getStartedJobs() {
        try {
            return mBinder.getStartedJobs();
        } catch (RemoteException e) {
            return null;
        }
    }

    @Override
    public List<JobSnapshot> getAllJobSnapshots() {
        try {
            return mBinder.getAllJobSnapshots().getList();
        } catch (RemoteException e) {
            return null;
        }
    }
}

5 IJobScheduler.Stub.schedule

- > JobSchedulerService.this.scheduleAsPackage
- > startTrackingJobLocked

	 private void startTrackingJobLocked(JobStatus jobStatus, JobStatus lastJob) {
    
        jobStatus.enqueueTime = sElapsedRealtimeClock.millis();
        final boolean update = mJobs.add(jobStatus);
		//mJob是一个队列,先进先出
        if (mReadyToRock) {
            for (int i = 0; i < mControllers.size(); i++) {
                StateController controller = mControllers.get(i);
                if (update) {
					//把之前存在的同样工作移除,重新开启
                    controller.maybeStopTrackingJobLocked(jobStatus, null, true);
                }
                controller.maybeStartTrackingJobLocked(jobStatus, lastJob);
            }
        }
    }

プログラムエントリ6

受精卵プロセス-システムプロセスは、開始SystemServer -オープンシステムは、次のような重要なサービスの範囲を処理:AMS / PMS / WMB / JobSchedulerService
メインエントリを

public static void main(String[] args) {
        new SystemServer().run();
}

RUN:startOtherServices()
- > startOtherServices:mSystemServiceManager.startService(JobSchedulerService.class);
- > SystemServiceManager.startService:STARTSERVICE( -サービス)//取得JobSchedulerServiceコンストラクタ反射、所与の例による;
- > service.onStart();

7ジョブスケジューラサービス

1)JobSchedulerServiceコンストラクタ

public JobSchedulerService(Context context) {
        super(context);

        mLocalPM = LocalServices.getService(PackageManagerInternal.class);
        mActivityManagerInternal = Preconditions.checkNotNull(
                LocalServices.getService(ActivityManagerInternal.class));

        mHandler = new JobHandler(context.getMainLooper());
        mConstants = new Constants();
        mConstantsObserver = new ConstantsObserver(mHandler);
        mJobSchedulerStub = new JobSchedulerStub();

        mConcurrencyManager = new JobConcurrencyManager(this);

        // Set up the app standby bucketing tracker
        mStandbyTracker = new StandbyTracker();
        mUsageStats = LocalServices.getService(UsageStatsManagerInternal.class);
        mUsageStats.addAppIdleStateChangeListener(mStandbyTracker);

        // The job store needs to call back
        publishLocalService(JobSchedulerInternal.class, new LocalService());

        // Initialize the job store and set up any persisted jobs
        mJobs = JobStore.initAndGet(this);

        // Create the controllers.
        mControllers = new ArrayList<StateController>();
        mControllers.add(new ConnectivityController(this));
        mControllers.add(new TimeController(this));
        mControllers.add(new IdleController(this));
        mBatteryController = new BatteryController(this);
        mControllers.add(mBatteryController);
        mStorageController = new StorageController(this);
        mControllers.add(mStorageController);
        mControllers.add(new BackgroundJobsController(this));
        mControllers.add(new ContentObserverController(this));
        mDeviceIdleJobsController = new DeviceIdleJobsController(this);
        mControllers.add(mDeviceIdleJobsController);
        mControllers.add(new QuotaController(this));

        // If the job store determined that it can't yet reschedule persisted jobs,
        // we need to start watching the clock.
        if (!mJobs.jobTimesInflatedValid()) {
            Slog.w(TAG, "!!! RTC not yet good; tracking time updates for job scheduling");
            context.registerReceiver(mTimeSetReceiver, new IntentFilter(Intent.ACTION_TIME_CHANGED));
        }
    }

- > JobHandler検査タスク

case MSG_CHECK_JOB:
		 maybeQueueReadyJobsForExecutionLocked();//看情况执行任务
	 case MSG_JOB_EXPIRED任务到期了
		 // runNow can be null, which is a controller's way of indicating that its
                        // state is such that all ready jobs should be run immediately.

- >コンストラクタに戻っ:
JobStore.initAndGetは永久的なミッション/data/system/job/jobs.xmlのいくつかを読んで

- > StateController
maybeStartTrackingJobLocked
maybeStopTrackingJobLocked

2)JobSchedulerService.onStart方法

 publishBinderService(Context.JOB_SCHEDULER_SERVICE, mJobSchedulerStub);

9 ConnectivityController Aケーススタディ

ConnectivityControllerはStateController実装拡張
ConnectivityManager.OnNetworkActiveListenerを

  public void maybeStartTrackingJobLocked(JobStatus jobStatus, JobStatus lastJob) {
        if (jobStatus.hasConnectivityConstraint()) {
            updateConstraintsSatisfied(jobStatus);
            ArraySet<JobStatus> jobs = mTrackedJobs.get(jobStatus.getSourceUid());
            if (jobs == null) {
                jobs = new ArraySet<>();
                mTrackedJobs.put(jobStatus.getSourceUid(), jobs);
            }
            jobs.add(jobStatus);
            jobStatus.setTrackingController(JobStatus.TRACKING_CONNECTIVITY);
        }
    }

- > mTrackedJobs.put(jobStatus.getSourceUid()、ジョブ);リスナーを追加

- > mStateChangedListener.onControllerStateChanged
- > StateController.mStateChangedListener:
- > JobSchedulerService構成mControllers.add(新しい新しい接続コントローラー(本));
- >接続コントローラー:スーパー( -サービス);
- > StateController(JobSchedulerService-サービス):= mStateChangedListener-サービス;従って、 mStateChangedListenerはJobSchedulerServiceがある
(JobSchedulerServiceがStateChangedListener実現)
と呼ばれることonControllerStateChanged:mHandler.obtainMessage(MSG_CHECK_JOB).sendToTarget()> JobSchedulerService - 。

公開された229元の記事 ウォン称賛72 ビュー15万+

おすすめ

転載: blog.csdn.net/baopengjian/article/details/104089297