Better preload drawable logging

Bug 63136392
Test: Manual test

Change-Id: I8753b36f632cf2ff57a5ef28df29f3fc5657f607
This commit is contained in:
Makoto Onuki
2017-07-14 08:42:50 -07:00
parent 845dae5cdb
commit 1480b67635
2 changed files with 92 additions and 8 deletions

View File

@@ -15,9 +15,6 @@
*/
package android.content.res;
import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserException;
import android.animation.Animator;
import android.animation.StateListAnimator;
import android.annotation.AnyRes;
@@ -32,7 +29,7 @@ import android.content.pm.ActivityInfo;
import android.content.pm.ActivityInfo.Config;
import android.content.res.Configuration.NativeConfig;
import android.content.res.Resources.NotFoundException;
import android.graphics.FontFamily;
import android.graphics.Bitmap;
import android.graphics.Typeface;
import android.graphics.drawable.ColorDrawable;
import android.graphics.drawable.Drawable;
@@ -40,8 +37,9 @@ import android.graphics.drawable.DrawableContainer;
import android.icu.text.PluralRules;
import android.os.Build;
import android.os.LocaleList;
import android.os.SystemClock;
import android.os.SystemProperties;
import android.os.Trace;
import android.text.FontConfig;
import android.util.AttributeSet;
import android.util.DisplayMetrics;
import android.util.Log;
@@ -51,10 +49,12 @@ import android.util.TypedValue;
import android.util.Xml;
import android.view.DisplayAdjustments;
import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserException;
import java.io.IOException;
import java.io.InputStream;
import java.util.Arrays;
import java.util.List;
import java.util.Locale;
/**
@@ -72,9 +72,18 @@ public class ResourcesImpl {
private static final boolean DEBUG_LOAD = false;
private static final boolean DEBUG_CONFIG = false;
private static final boolean TRACE_FOR_PRELOAD = false;
private static final boolean TRACE_FOR_MISS_PRELOAD = false;
static final String TAG_PRELOAD = TAG + ".preload";
private static final boolean TRACE_FOR_PRELOAD = false; // Do we still need it?
private static final boolean TRACE_FOR_MISS_PRELOAD = false; // Do we still need it?
public static final boolean TRACE_FOR_DETAILED_PRELOAD =
SystemProperties.getBoolean("debug.trace_resource_preload", false);
/** Used only when TRACE_FOR_DETAILED_PRELOAD is true. */
private static int sPreloadTracingNumLoadedDrawables;
private long mPreloadTracingPreloadStartTime;
private static final int ID_OTHER = 0x01000004;
@@ -593,6 +602,16 @@ public class ResourcesImpl {
Drawable dr;
boolean needsNewDrawableAfterCache = false;
if (cs != null) {
if (TRACE_FOR_DETAILED_PRELOAD) {
// Log only framework resources
if (((id >>> 24) == 0x1) && (android.os.Process.myUid() != 0)) {
final String name = getResourceName(id);
if (name != null) {
Log.d(TAG_PRELOAD, "Hit preloaded FW drawable #"
+ Integer.toHexString(id) + " " + name);
}
}
}
dr = cs.newDrawable(wrapper);
} else if (isColorDrawable) {
dr = new ColorDrawable(value.data);
@@ -744,6 +763,18 @@ public class ResourcesImpl {
}
}
// For prelaod tracing.
long startTime = 0;
int startBitmapCount = 0;
long startBitmapSize = 0;
int startDrwableCount = 0;
if (TRACE_FOR_DETAILED_PRELOAD) {
startTime = System.nanoTime();
startBitmapCount = Bitmap.sPreloadTracingNumInstantiatedBitmaps;
startBitmapSize = Bitmap.sPreloadTracingTotalBitmapsSize;
startDrwableCount = sPreloadTracingNumLoadedDrawables;
}
if (DEBUG_LOAD) {
Log.v(TAG, "Loading drawable for cookie " + value.assetCookie + ": " + file);
}
@@ -772,6 +803,37 @@ public class ResourcesImpl {
}
Trace.traceEnd(Trace.TRACE_TAG_RESOURCES);
if (TRACE_FOR_DETAILED_PRELOAD) {
if (((id >>> 24) == 0x1)) {
final String name = getResourceName(id);
if (name != null) {
final long time = System.nanoTime() - startTime;
final int loadedBitmapCount =
Bitmap.sPreloadTracingNumInstantiatedBitmaps - startBitmapCount;
final long loadedBitmapSize =
Bitmap.sPreloadTracingTotalBitmapsSize - startBitmapSize;
final int loadedDrawables =
sPreloadTracingNumLoadedDrawables - startDrwableCount;
sPreloadTracingNumLoadedDrawables++;
final boolean isRoot = (android.os.Process.myUid() == 0);
Log.d(TAG_PRELOAD,
(isRoot ? "Preloaded FW drawable #"
: "Loaded non-preloaded FW drawable #")
+ Integer.toHexString(id)
+ " " + name
+ " " + file
+ " " + dr.getClass().getCanonicalName()
+ " #nested_drawables= " + loadedDrawables
+ " #bitmaps= " + loadedBitmapCount
+ " total_bitmap_size= " + loadedBitmapSize
+ " in[us] " + (time / 1000));
}
}
}
return dr;
}
@@ -1102,6 +1164,11 @@ public class ResourcesImpl {
mPreloading = true;
mConfiguration.densityDpi = DisplayMetrics.DENSITY_DEVICE;
updateConfiguration(null, null, null);
if (TRACE_FOR_DETAILED_PRELOAD) {
mPreloadTracingPreloadStartTime = SystemClock.uptimeMillis();
Log.d(TAG_PRELOAD, "Preload starting");
}
}
}
@@ -1111,6 +1178,11 @@ public class ResourcesImpl {
*/
void finishPreloading() {
if (mPreloading) {
if (TRACE_FOR_DETAILED_PRELOAD) {
final long time = SystemClock.uptimeMillis() - mPreloadTracingPreloadStartTime;
Log.d(TAG_PRELOAD, "Preload finished in " + time + " ms");
}
mPreloading = false;
flushLayoutCache();
}

View File

@@ -21,6 +21,7 @@ import android.annotation.ColorInt;
import android.annotation.NonNull;
import android.annotation.Nullable;
import android.annotation.Size;
import android.content.res.ResourcesImpl;
import android.os.Parcel;
import android.os.Parcelable;
import android.os.StrictMode;
@@ -82,6 +83,12 @@ public final class Bitmap implements Parcelable {
private static volatile int sDefaultDensity = -1;
/** @hide Used only when ResourcesImpl.TRACE_FOR_DETAILED_PRELOAD is true. */
public static volatile int sPreloadTracingNumInstantiatedBitmaps;
/** @hide Used only when ResourcesImpl.TRACE_FOR_DETAILED_PRELOAD is true. */
public static volatile long sPreloadTracingTotalBitmapsSize;
/**
* For backwards compatibility, allows the app layer to change the default
* density when running old apps.
@@ -128,6 +135,11 @@ public final class Bitmap implements Parcelable {
NativeAllocationRegistry registry = new NativeAllocationRegistry(
Bitmap.class.getClassLoader(), nativeGetNativeFinalizer(), nativeSize);
registry.registerNativeAllocation(this, nativeBitmap);
if (ResourcesImpl.TRACE_FOR_DETAILED_PRELOAD) {
sPreloadTracingNumInstantiatedBitmaps++;
sPreloadTracingTotalBitmapsSize += nativeSize;
}
}
/**