Home | History | Annotate | Download | only in am
      1 /*
      2  * Copyright (C) 2018 The Android Open Source Project
      3  *
      4  * Licensed under the Apache License, Version 2.0 (the "License");
      5  * you may not use this file except in compliance with the License.
      6  * You may obtain a copy of the License at
      7  *
      8  *      http://www.apache.org/licenses/LICENSE-2.0
      9  *
     10  * Unless required by applicable law or agreed to in writing, software
     11  * distributed under the License is distributed on an "AS IS" BASIS,
     12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13  * See the License for the specific language governing permissions and
     14  * limitations under the License
     15  */
     16 
     17 package com.android.server.am;
     18 
     19 import android.app.WaitResult;
     20 import android.os.SystemClock;
     21 import android.os.Trace;
     22 import android.util.SparseArray;
     23 
     24 /**
     25  * Tracks launch time of apps to be reported by {@link WaitResult}. Note that this is slightly
     26  * different from {@link ActivityMetricsLogger}, but should eventually merged with it.
     27  */
     28 class LaunchTimeTracker {
     29 
     30     private final SparseArray<Entry> mWindowingModeLaunchTime = new SparseArray<>();
     31 
     32     void setLaunchTime(ActivityRecord r) {
     33         Entry entry = mWindowingModeLaunchTime.get(r.getWindowingMode());
     34         if (entry == null){
     35             entry = new Entry();
     36             mWindowingModeLaunchTime.append(r.getWindowingMode(), entry);
     37         }
     38         entry.setLaunchTime(r);
     39     }
     40 
     41     void stopFullyDrawnTraceIfNeeded(int windowingMode) {
     42         final Entry entry = mWindowingModeLaunchTime.get(windowingMode);
     43         if (entry == null) {
     44             return;
     45         }
     46         entry.stopFullyDrawnTraceIfNeeded();
     47     }
     48 
     49     Entry getEntry(int windowingMode) {
     50         return mWindowingModeLaunchTime.get(windowingMode);
     51     }
     52 
     53     static class Entry {
     54 
     55         long mLaunchStartTime;
     56         long mFullyDrawnStartTime;
     57 
     58         void setLaunchTime(ActivityRecord r) {
     59             if (r.displayStartTime == 0) {
     60                 r.fullyDrawnStartTime = r.displayStartTime = SystemClock.uptimeMillis();
     61                 if (mLaunchStartTime == 0) {
     62                     startLaunchTraces(r.packageName);
     63                     mLaunchStartTime = mFullyDrawnStartTime = r.displayStartTime;
     64                 }
     65             } else if (mLaunchStartTime == 0) {
     66                 startLaunchTraces(r.packageName);
     67                 mLaunchStartTime = mFullyDrawnStartTime = SystemClock.uptimeMillis();
     68             }
     69         }
     70 
     71         private void startLaunchTraces(String packageName) {
     72             if (mFullyDrawnStartTime != 0)  {
     73                 Trace.asyncTraceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER, "drawing", 0);
     74             }
     75             Trace.asyncTraceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, "launching: " + packageName, 0);
     76             Trace.asyncTraceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, "drawing", 0);
     77         }
     78 
     79         private void stopFullyDrawnTraceIfNeeded() {
     80             if (mFullyDrawnStartTime != 0 && mLaunchStartTime == 0) {
     81                 Trace.asyncTraceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER, "drawing", 0);
     82                 mFullyDrawnStartTime = 0;
     83             }
     84         }
     85     }
     86 }
     87