Merge "Rename DeviceOwner to Owners"
diff --git a/packages/DocumentsUI/Android.mk b/packages/DocumentsUI/Android.mk
index 3430bb4..c21c5cc 100644
--- a/packages/DocumentsUI/Android.mk
+++ b/packages/DocumentsUI/Android.mk
@@ -5,9 +5,25 @@
LOCAL_SRC_FILES := $(call all-java-files-under, src)
-LOCAL_STATIC_JAVA_LIBRARIES := android-support-v4 \
- android-support-v7-recyclerview \
- guava
+LOCAL_STATIC_JAVA_LIBRARIES := android-support-v4
+# The design lib requires that the client package use appcompat themes.
+LOCAL_STATIC_JAVA_LIBRARIES += android-support-v7-appcompat
+# Supplies material design components, e.g. Snackbar.
+LOCAL_STATIC_JAVA_LIBRARIES += android-support-design
+LOCAL_STATIC_JAVA_LIBRARIES += android-support-v7-recyclerview
+LOCAL_STATIC_JAVA_LIBRARIES += guava
+
+LOCAL_RESOURCE_DIR := $(LOCAL_PATH)/res
+# Not quite sure why it is necessary to explicitly pull in resources from the
+# appcompat lib, but the demo code indicates it's necessary (see
+# development/samples/Support7Demos/Android.mk)
+LOCAL_RESOURCE_DIR += frameworks/support/v7/appcompat/res
+LOCAL_RESOURCE_DIR += frameworks/support/design/res
+
+# Again, required to pull in appcompat resources. See abovementioned demo code.
+LOCAL_AAPT_FLAGS := --auto-add-overlay
+LOCAL_AAPT_FLAGS += --extra-packages android.support.v7.appcompat
+LOCAL_AAPT_FLAGS += --extra-packages android.support.design
LOCAL_PACKAGE_NAME := DocumentsUI
LOCAL_CERTIFICATE := platform
diff --git a/packages/DocumentsUI/res/layout/fixed_layout.xml b/packages/DocumentsUI/res/layout/fixed_layout.xml
index 221de13..9769f26 100644
--- a/packages/DocumentsUI/res/layout/fixed_layout.xml
+++ b/packages/DocumentsUI/res/layout/fixed_layout.xml
@@ -25,7 +25,8 @@
android:layout_height="?android:attr/actionBarSize"
android:background="?android:attr/colorPrimary"
android:elevation="8dp"
- android:theme="?android:attr/actionBarTheme">
+ android:theme="?actionBarTheme"
+ android:popupTheme="?actionBarPopupTheme">
<Spinner
android:id="@+id/stack"
diff --git a/packages/DocumentsUI/res/values-sw720dp/styles.xml b/packages/DocumentsUI/res/values-sw720dp/styles.xml
index 0b03a94..f4bc88e 100644
--- a/packages/DocumentsUI/res/values-sw720dp/styles.xml
+++ b/packages/DocumentsUI/res/values-sw720dp/styles.xml
@@ -16,7 +16,7 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android">
- <style name="DialogWhenReallyLarge" parent="@*android:style/Theme.Material.DayNight.Dialog">
+ <style name="DocumentsBaseTheme" parent="@*android:style/Theme.Material.DayNight.Dialog">
<!-- We do not specify width of window here because the max size of
floating window specified by windowFixedWidthis is limited. -->
<item name="*android:windowFixedHeightMajor">80%</item>
diff --git a/packages/DocumentsUI/res/values/styles.xml b/packages/DocumentsUI/res/values/styles.xml
index fa94ff1..f6c4628 100644
--- a/packages/DocumentsUI/res/values/styles.xml
+++ b/packages/DocumentsUI/res/values/styles.xml
@@ -16,12 +16,12 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android">
- <style name="DialogWhenReallyLarge" parent="@android:style/Theme.Material.DayNight.DarkActionBar" />
+ <style name="DocumentsBaseTheme" parent="@style/Theme.AppCompat.Light.DarkActionBar" />
- <style name="DocumentsTheme" parent="@style/DialogWhenReallyLarge">
- <item name="android:actionBarWidgetTheme">@null</item>
- <item name="android:actionBarTheme">@*android:style/ThemeOverlay.Material.Dark.ActionBar</item>
- <item name="android:actionBarPopupTheme">@*android:style/ThemeOverlay.Material.Light</item>
+ <style name="DocumentsTheme" parent="@style/DocumentsBaseTheme">
+ <item name="actionBarWidgetTheme">@null</item>
+ <item name="actionBarTheme">@*android:style/ThemeOverlay.Material.Dark.ActionBar</item>
+ <item name="actionBarPopupTheme">@*android:style/ThemeOverlay.Material.Light</item>
<item name="android:colorPrimaryDark">@*android:color/material_blue_grey_900</item>
<item name="android:colorPrimary">@*android:color/material_blue_grey_800</item>
@@ -37,14 +37,10 @@
<item name="android:alertDialogTheme">@android:style/Theme.Material.Light.Dialog.Alert</item>
</style>
- <style name="DocumentsNonDialogTheme" parent="@android:style/Theme.Material.DayNight.DarkActionBar">
- <item name="android:actionBarWidgetTheme">@null</item>
- <item name="android:actionBarTheme">@*android:style/ThemeOverlay.Material.Dark.ActionBar</item>
- <item name="android:actionBarPopupTheme">@*android:style/ThemeOverlay.Material.Light</item>
-
- <item name="android:colorPrimaryDark">@*android:color/material_blue_grey_900</item>
- <item name="android:colorPrimary">@*android:color/material_blue_grey_800</item>
- <item name="android:colorAccent">@*android:color/material_deep_teal_500</item>
+ <style name="DocumentsBaseTheme.FullScreen" parent="@style/Theme.AppCompat.Light.DarkActionBar">
+ <item name="actionBarWidgetTheme">@null</item>
+ <item name="actionBarTheme">@*android:style/ThemeOverlay.Material.Dark.ActionBar</item>
+ <item name="actionBarPopupTheme">@*android:style/ThemeOverlay.Material.Light</item>
<item name="android:listDivider">@*android:drawable/list_divider_material</item>
@@ -55,6 +51,12 @@
<item name="android:windowSoftInputMode">stateUnspecified|adjustUnspecified</item>
</style>
+ <style name="DocumentsNonDialogTheme" parent="@style/DocumentsBaseTheme.FullScreen">
+ <item name="android:colorPrimaryDark">@*android:color/material_blue_grey_900</item>
+ <item name="android:colorPrimary">@*android:color/material_blue_grey_800</item>
+ <item name="android:colorAccent">@*android:color/material_deep_teal_500</item>
+ </style>
+
<style name="ActionModeStyle" parent="@android:style/Widget.Material.Light.ActionMode">
<item name="android:background">@color/material_grey_600</item>
</style>
@@ -63,21 +65,12 @@
<item name="android:colorAccent">@color/material_blue_700</item>
</style>
- <style name="FilesTheme" parent="@android:style/Theme.Material.DayNight.DarkActionBar">
- <item name="android:actionBarWidgetTheme">@null</item>
-
+ <style name="FilesTheme" parent="@style/DocumentsBaseTheme.FullScreen">
<item name="android:colorPrimaryDark">@color/status_bar_background</item>
<item name="android:colorPrimary">@color/material_blue_500</item>
<item name="android:colorAccent">@color/material_blue_700</item>
<item name="android:actionModeStyle">@style/ActionModeStyle</item>
- <item name="android:listDivider">@*android:drawable/list_divider_material</item>
-
- <item name="android:windowActionBar">false</item>
- <item name="android:windowActionModeOverlay">true</item>
- <item name="android:windowNoTitle">true</item>
-
- <item name="android:windowSoftInputMode">stateUnspecified|adjustUnspecified</item>
<item name="android:alertDialogTheme">@style/AlertDialogTheme</item>
</style>
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarApps.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarApps.java
index 04038bb..5c01f01 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarApps.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarApps.java
@@ -97,11 +97,16 @@
}
};
- public NavigationBarApps(Context context, AttributeSet attrs) {
- super(context, attrs);
+ public static NavigationBarAppsModel getModel(Context context) {
if (sAppsModel == null) {
sAppsModel = new NavigationBarAppsModel(context);
}
+ return sAppsModel;
+ }
+
+ public NavigationBarApps(Context context, AttributeSet attrs) {
+ super(context, attrs);
+ getModel(context);
mPackageManager = context.getPackageManager();
mUserManager = (UserManager) getContext().getSystemService(Context.USER_SERVICE);
mLayoutInflater = LayoutInflater.from(context);
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarRecents.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarRecents.java
index 3bfa4d5..7ff56ba 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarRecents.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarRecents.java
@@ -151,7 +151,7 @@
button.setOnLongClickListener(mAppLongClickListener);
addView(button);
- ComponentName activityName = getRealActivityForTask(task);
+ ComponentName activityName = getActivityForTask(task);
CharSequence appLabel = NavigationBarApps.getAppLabel(mPackageManager, activityName);
button.setContentDescription(appLabel);
@@ -180,8 +180,17 @@
});
}
- private static ComponentName getRealActivityForTask(RecentTaskInfo task) {
- // Prefer the activity that started the task.
+ private static ComponentName getActivityForTask(RecentTaskInfo task) {
+ // If the task was started from an alias, return the actual activity component that was
+ // initially started.
+ if (task.origActivity != null) {
+ return task.origActivity;
+ }
+ // Prefer the first activity of the task.
+ if (task.baseActivity != null) {
+ return task.baseActivity;
+ }
+ // Then goes the activity that started the task.
if (task.realActivity != null) {
return task.realActivity;
}
@@ -257,16 +266,28 @@
// The drag will go to the pinned section, which wants to launch the main activity
// for the task's package.
RecentTaskInfo task = (RecentTaskInfo) v.getTag();
- String packageName = getRealActivityForTask(task).getPackageName();
- ComponentName component = getLaunchComponentForPackage(packageName, task.userId);
- if (component == null) {
- return false;
+ ComponentName componentName = getActivityForTask(task);
+ UserHandle taskUser = new UserHandle(task.userId);
+ AppInfo appInfo = new AppInfo(componentName, taskUser);
+
+ if (NavigationBarApps.getModel(mContext).buildAppLaunchIntent(appInfo) == null) {
+ // If task's activity is not launcheable, fall back to a launch component of the
+ // task's package.
+ ComponentName component = getLaunchComponentForPackage(
+ componentName.getPackageName(), task.userId);
+
+ if (component == null) {
+ return false;
+ }
+
+ appInfo = new AppInfo(component, taskUser);
}
- if (DEBUG) Slog.d(TAG, "Start drag with " + component);
+ if (DEBUG) {
+ Slog.d(TAG, "Start drag with " + appInfo.getComponentName().flattenToString());
+ }
- NavigationBarApps.startAppDrag(
- icon, new AppInfo(component, new UserHandle(task.userId)));
+ NavigationBarApps.startAppDrag(icon, appInfo);
return true;
}
}
diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java
index b25653e..e1f3528 100644
--- a/services/core/java/com/android/server/pm/PackageManagerService.java
+++ b/services/core/java/com/android/server/pm/PackageManagerService.java
@@ -1146,23 +1146,24 @@
// need to do anything. The pending install
// will be processed later on.
if (!mBound) {
- try {
- Trace.asyncTraceBegin(TRACE_TAG_PACKAGE_MANAGER, "bindMCS",
- System.identityHashCode(params));
- // If this is the only one pending we might
- // have to bind to the service again.
- if (!connectToService()) {
- Slog.e(TAG, "Failed to bind to media container service");
- params.serviceError();
- return;
- } else {
- // Once we bind to the service, the first
- // pending request will be processed.
- mPendingInstalls.add(idx, params);
+ Trace.asyncTraceBegin(TRACE_TAG_PACKAGE_MANAGER, "bindingMCS",
+ System.identityHashCode(mHandler));
+ // If this is the only one pending we might
+ // have to bind to the service again.
+ if (!connectToService()) {
+ Slog.e(TAG, "Failed to bind to media container service");
+ params.serviceError();
+ Trace.asyncTraceEnd(TRACE_TAG_PACKAGE_MANAGER, "bindingMCS",
+ System.identityHashCode(mHandler));
+ if (params.traceMethod != null) {
+ Trace.asyncTraceEnd(TRACE_TAG_PACKAGE_MANAGER, params.traceMethod,
+ params.traceCookie);
}
- } finally {
- Trace.asyncTraceEnd(TRACE_TAG_PACKAGE_MANAGER, "bindMCS",
- System.identityHashCode(params));
+ return;
+ } else {
+ // Once we bind to the service, the first
+ // pending request will be processed.
+ mPendingInstalls.add(idx, params);
}
} else {
mPendingInstalls.add(idx, params);
@@ -1178,6 +1179,8 @@
if (DEBUG_INSTALL) Slog.i(TAG, "mcs_bound");
if (msg.obj != null) {
mContainerService = (IMediaContainerService) msg.obj;
+ Trace.asyncTraceEnd(TRACE_TAG_PACKAGE_MANAGER, "bindingMCS",
+ System.identityHashCode(mHandler));
}
if (mContainerService == null) {
if (!mBound) {
@@ -1189,6 +1192,11 @@
params.serviceError();
Trace.asyncTraceEnd(TRACE_TAG_PACKAGE_MANAGER, "queueInstall",
System.identityHashCode(params));
+ if (params.traceMethod != null) {
+ Trace.asyncTraceEnd(TRACE_TAG_PACKAGE_MANAGER,
+ params.traceMethod, params.traceCookie);
+ }
+ return;
}
mPendingInstalls.clear();
} else {
@@ -1197,6 +1205,9 @@
} else if (mPendingInstalls.size() > 0) {
HandlerParams params = mPendingInstalls.get(0);
if (params != null) {
+ Trace.asyncTraceEnd(TRACE_TAG_PACKAGE_MANAGER, "queueInstall",
+ System.identityHashCode(params));
+ Trace.traceBegin(TRACE_TAG_PACKAGE_MANAGER, "startCopy");
if (params.startCopy()) {
// We are done... look for more work or to
// go idle.
@@ -1225,9 +1236,8 @@
mHandler.sendEmptyMessage(MCS_BOUND);
}
}
+ Trace.traceEnd(TRACE_TAG_PACKAGE_MANAGER);
}
- Trace.asyncTraceEnd(TRACE_TAG_PACKAGE_MANAGER, "queueInstall",
- System.identityHashCode(params));
} else {
// Should never happen ideally.
Slog.w(TAG, "Empty queue");
@@ -1468,6 +1478,11 @@
Slog.i(TAG, "Observer no longer exists.");
}
}
+ if (args.traceMethod != null) {
+ Trace.asyncTraceEnd(TRACE_TAG_PACKAGE_MANAGER, args.traceMethod,
+ args.traceCookie);
+ }
+ return;
} else {
Slog.e(TAG, "Bogus post-install token " + msg.arg1);
}
@@ -1551,11 +1566,12 @@
state.getInstallArgs().getUser());
}
+ Trace.asyncTraceEnd(
+ TRACE_TAG_PACKAGE_MANAGER, "verification", verificationId);
+
processPendingInstall(args, ret);
mHandler.sendEmptyMessage(MCS_UNBIND);
}
- Trace.asyncTraceEnd(
- TRACE_TAG_PACKAGE_MANAGER, "pendingVerification", verificationId);
break;
}
case PACKAGE_VERIFIED: {
@@ -1591,8 +1607,10 @@
ret = PackageManager.INSTALL_FAILED_VERIFICATION_FAILURE;
}
- processPendingInstall(args, ret);
+ Trace.asyncTraceEnd(
+ TRACE_TAG_PACKAGE_MANAGER, "verification", verificationId);
+ processPendingInstall(args, ret);
mHandler.sendEmptyMessage(MCS_UNBIND);
}
@@ -6264,10 +6282,26 @@
@Override
public boolean performDexOptIfNeeded(String packageName, String instructionSet) {
- return performDexOpt(packageName, instructionSet, false);
+ return performDexOptTraced(packageName, instructionSet, false);
}
- public boolean performDexOpt(String packageName, String instructionSet, boolean backgroundDexopt) {
+ public boolean performDexOpt(
+ String packageName, String instructionSet, boolean backgroundDexopt) {
+ return performDexOptTraced(packageName, instructionSet, backgroundDexopt);
+ }
+
+ private boolean performDexOptTraced(
+ String packageName, String instructionSet, boolean backgroundDexopt) {
+ Trace.traceBegin(TRACE_TAG_PACKAGE_MANAGER, "dexopt");
+ try {
+ return performDexOptInternal(packageName, instructionSet, backgroundDexopt);
+ } finally {
+ Trace.traceEnd(TRACE_TAG_PACKAGE_MANAGER);
+ }
+ }
+
+ private boolean performDexOptInternal(
+ String packageName, String instructionSet, boolean backgroundDexopt) {
boolean dexopt = mLazyDexOpt || backgroundDexopt;
boolean updateUsage = !backgroundDexopt; // Don't update usage if this is just a backgroundDexopt
if (!dexopt && !updateUsage) {
@@ -6347,8 +6381,13 @@
synchronized (mInstallLock) {
final String[] instructionSets = new String[] {
getPrimaryInstructionSet(pkg.applicationInfo) };
+
+ Trace.traceBegin(TRACE_TAG_PACKAGE_MANAGER, "dexopt");
+
final int res = mPackageDexOptimizer.performDexOpt(pkg, instructionSets,
true /*forceDex*/, false /* defer */, true /* inclDependencies */);
+
+ Trace.traceEnd(TRACE_TAG_PACKAGE_MANAGER);
if (res != PackageDexOptimizer.DEX_OPT_PERFORMED) {
throw new IllegalStateException("Failed to dexopt: " + res);
}
@@ -7234,19 +7273,24 @@
// We also need to dexopt any apps that are dependent on this library. Note that
// if these fail, we should abort the install since installing the library will
// result in some apps being broken.
- if (clientLibPkgs != null) {
- if ((scanFlags & SCAN_NO_DEX) == 0) {
- for (int i = 0; i < clientLibPkgs.size(); i++) {
- PackageParser.Package clientPkg = clientLibPkgs.get(i);
- int result = mPackageDexOptimizer.performDexOpt(clientPkg,
- null /* instruction sets */, forceDex,
- (scanFlags & SCAN_DEFER_DEX) != 0, false);
- if (result == PackageDexOptimizer.DEX_OPT_FAILED) {
- throw new PackageManagerException(INSTALL_FAILED_DEXOPT,
- "scanPackageLI failed to dexopt clientLibPkgs");
+ Trace.traceBegin(TRACE_TAG_PACKAGE_MANAGER, "dexopt");
+ try {
+ if (clientLibPkgs != null) {
+ if ((scanFlags & SCAN_NO_DEX) == 0) {
+ for (int i = 0; i < clientLibPkgs.size(); i++) {
+ PackageParser.Package clientPkg = clientLibPkgs.get(i);
+ int result = mPackageDexOptimizer.performDexOpt(clientPkg,
+ null /* instruction sets */, forceDex,
+ (scanFlags & SCAN_DEFER_DEX) != 0, false);
+ if (result == PackageDexOptimizer.DEX_OPT_FAILED) {
+ throw new PackageManagerException(INSTALL_FAILED_DEXOPT,
+ "scanPackageLI failed to dexopt clientLibPkgs");
+ }
}
}
}
+ } finally {
+ Trace.traceEnd(TRACE_TAG_PACKAGE_MANAGER);
}
// Request the ActivityManager to kill the process(only for existing packages)
@@ -7856,8 +7900,12 @@
ps.pkg.applicationInfo.primaryCpuAbi = adjustedAbi;
Slog.i(TAG, "Adjusting ABI for : " + ps.name + " to " + adjustedAbi);
+ Trace.traceBegin(TRACE_TAG_PACKAGE_MANAGER, "dexopt");
+
int result = mPackageDexOptimizer.performDexOpt(ps.pkg,
null /* instruction sets */, forceDexOpt, deferDexOpt, true);
+
+ Trace.traceEnd(TRACE_TAG_PACKAGE_MANAGER);
if (result == PackageDexOptimizer.DEX_OPT_FAILED) {
ps.primaryCpuAbiString = null;
ps.pkg.applicationInfo.primaryCpuAbi = null;
@@ -9640,16 +9688,24 @@
final OriginInfo origin = OriginInfo.fromUntrustedFile(originFile);
final Message msg = mHandler.obtainMessage(INIT_COPY);
- msg.obj = new InstallParams(origin, null, observer, installFlags, installerPackageName,
- null, verificationParams, user, packageAbiOverride, null);
+ final InstallParams params = new InstallParams(origin, null, observer, installFlags,
+ installerPackageName, null, verificationParams, user, packageAbiOverride, null);
+ params.setTraceMethod("installAsUser").setTraceCookie(System.identityHashCode(params));
+ msg.obj = params;
+
+ Trace.asyncTraceBegin(TRACE_TAG_PACKAGE_MANAGER, "installAsUser",
+ System.identityHashCode(msg.obj));
+ Trace.asyncTraceBegin(TRACE_TAG_PACKAGE_MANAGER, "queueInstall",
+ System.identityHashCode(msg.obj));
+
mHandler.sendMessage(msg);
}
void installStage(String packageName, File stagedDir, String stagedCid,
- IPackageInstallObserver2 observer, PackageInstaller.SessionParams params,
+ IPackageInstallObserver2 observer, PackageInstaller.SessionParams sessionParams,
String installerPackageName, int installerUid, UserHandle user) {
- final VerificationParams verifParams = new VerificationParams(null, params.originatingUri,
- params.referrerUri, installerUid, null);
+ final VerificationParams verifParams = new VerificationParams(
+ null, sessionParams.originatingUri, sessionParams.referrerUri, installerUid, null);
verifParams.setInstallerUid(installerUid);
final OriginInfo origin;
@@ -9660,10 +9716,15 @@
}
final Message msg = mHandler.obtainMessage(INIT_COPY);
- msg.obj = new InstallParams(origin, null, observer, params.installFlags,
- installerPackageName, params.volumeUuid, verifParams, user, params.abiOverride,
- params.grantedRuntimePermissions);
+ final InstallParams params = new InstallParams(origin, null, observer,
+ sessionParams.installFlags, installerPackageName, sessionParams.volumeUuid,
+ verifParams, user, sessionParams.abiOverride,
+ sessionParams.grantedRuntimePermissions);
+ params.setTraceMethod("installStage").setTraceCookie(System.identityHashCode(params));
+ msg.obj = params;
+ Trace.asyncTraceBegin(TRACE_TAG_PACKAGE_MANAGER, "installStage",
+ System.identityHashCode(msg.obj));
Trace.asyncTraceBegin(TRACE_TAG_PACKAGE_MANAGER, "queueInstall",
System.identityHashCode(msg.obj));
@@ -9992,6 +10053,7 @@
if (DEBUG_INSTALL) {
Slog.v(TAG, "BM finishing package install for " + token);
}
+ Trace.asyncTraceEnd(TRACE_TAG_PACKAGE_MANAGER, "restore", token);
final Message msg = mHandler.obtainMessage(POST_INSTALL, token, 0);
mHandler.sendMessage(msg);
@@ -10288,8 +10350,6 @@
} catch (Exception e) {
Slog.e(TAG, "Exception trying to enqueue restore", e);
doRestore = false;
- } finally {
- Trace.asyncTraceEnd(TRACE_TAG_PACKAGE_MANAGER, "restore", token);
}
} else {
Slog.e(TAG, "Backup Manager not found!");
@@ -10322,6 +10382,8 @@
/** User handle for the user requesting the information or installation. */
private final UserHandle mUser;
+ String traceMethod;
+ int traceCookie;
HandlerParams(UserHandle user) {
mUser = user;
@@ -10331,6 +10393,16 @@
return mUser;
}
+ HandlerParams setTraceMethod(String traceMethod) {
+ this.traceMethod = traceMethod;
+ return this;
+ }
+
+ HandlerParams setTraceCookie(int traceCookie) {
+ this.traceCookie = traceCookie;
+ return this;
+ }
+
final boolean startCopy() {
boolean res;
try {
@@ -10555,7 +10627,6 @@
final String packageAbiOverride;
final String[] grantedRuntimePermissions;
-
InstallParams(OriginInfo origin, MoveInfo move, IPackageInstallObserver2 observer,
int installFlags, String installerPackageName, String volumeUuid,
VerificationParams verificationParams, UserHandle user, String packageAbiOverride,
@@ -10863,7 +10934,7 @@
if (ret == PackageManager.INSTALL_SUCCEEDED
&& mRequiredVerifierPackage != null) {
Trace.asyncTraceBegin(
- TRACE_TAG_PACKAGE_MANAGER, "pendingVerification", verificationId);
+ TRACE_TAG_PACKAGE_MANAGER, "verification", verificationId);
/*
* Send the intent to the required verification agent,
* but only start the verification timeout after the
@@ -11001,6 +11072,9 @@
final UserHandle user;
final String abiOverride;
final String[] installGrantPermissions;
+ /** If non-null, drop an async trace when the install completes */
+ final String traceMethod;
+ final int traceCookie;
// The list of instruction sets supported by this app. This is currently
// only used during the rmdex() phase to clean up resources. We can get rid of this
@@ -11010,7 +11084,8 @@
InstallArgs(OriginInfo origin, MoveInfo move, IPackageInstallObserver2 observer,
int installFlags, String installerPackageName, String volumeUuid,
ManifestDigest manifestDigest, UserHandle user, String[] instructionSets,
- String abiOverride, String[] installGrantPermissions) {
+ String abiOverride, String[] installGrantPermissions,
+ String traceMethod, int traceCookie) {
this.origin = origin;
this.move = move;
this.installFlags = installFlags;
@@ -11022,6 +11097,8 @@
this.instructionSets = instructionSets;
this.abiOverride = abiOverride;
this.installGrantPermissions = installGrantPermissions;
+ this.traceMethod = traceMethod;
+ this.traceCookie = traceCookie;
}
abstract int copyApk(IMediaContainerService imcs, boolean temp) throws RemoteException;
@@ -11115,7 +11192,8 @@
super(params.origin, params.move, params.observer, params.installFlags,
params.installerPackageName, params.volumeUuid, params.getManifestDigest(),
params.getUser(), null /* instruction sets */, params.packageAbiOverride,
- params.grantedRuntimePermissions);
+ params.grantedRuntimePermissions,
+ params.traceMethod, params.traceCookie);
if (isFwdLocked()) {
throw new IllegalArgumentException("Forward locking only supported in ASEC");
}
@@ -11124,7 +11202,7 @@
/** Existing install */
FileInstallArgs(String codePath, String resourcePath, String[] instructionSets) {
super(OriginInfo.fromNothing(), null, null, 0, null, null, null, null, instructionSets,
- null, null);
+ null, null, null, 0);
this.codeFile = (codePath != null) ? new File(codePath) : null;
this.resourceFile = (resourcePath != null) ? new File(resourcePath) : null;
}
@@ -11350,7 +11428,8 @@
super(params.origin, params.move, params.observer, params.installFlags,
params.installerPackageName, params.volumeUuid, params.getManifestDigest(),
params.getUser(), null /* instruction sets */, params.packageAbiOverride,
- params.grantedRuntimePermissions);
+ params.grantedRuntimePermissions,
+ params.traceMethod, params.traceCookie);
}
/** Existing install */
@@ -11358,7 +11437,7 @@
boolean isExternal, boolean isForwardLocked) {
super(OriginInfo.fromNothing(), null, null, (isExternal ? INSTALL_EXTERNAL : 0)
| (isForwardLocked ? INSTALL_FORWARD_LOCK : 0), null, null, null, null,
- instructionSets, null, null);
+ instructionSets, null, null, null, 0);
// Hackily pretend we're still looking at a full code path
if (!fullCodePath.endsWith(RES_FILE_NAME)) {
fullCodePath = new File(fullCodePath, RES_FILE_NAME).getAbsolutePath();
@@ -11375,7 +11454,7 @@
AsecInstallArgs(String cid, String[] instructionSets, boolean isForwardLocked) {
super(OriginInfo.fromNothing(), null, null, (isAsecExternal(cid) ? INSTALL_EXTERNAL : 0)
| (isForwardLocked ? INSTALL_FORWARD_LOCK : 0), null, null, null, null,
- instructionSets, null, null);
+ instructionSets, null, null, null, 0);
this.cid = cid;
setMountPath(PackageHelper.getSdDir(cid));
}
@@ -11643,7 +11722,8 @@
super(params.origin, params.move, params.observer, params.installFlags,
params.installerPackageName, params.volumeUuid, params.getManifestDigest(),
params.getUser(), null /* instruction sets */, params.packageAbiOverride,
- params.grantedRuntimePermissions);
+ params.grantedRuntimePermissions,
+ params.traceMethod, params.traceCookie);
}
int copyApk(IMediaContainerService imcs, boolean temp) {
@@ -12203,7 +12283,9 @@
//note that the new package setting would have already been
//added to mPackages. It hasn't been persisted yet.
mSettings.setInstallStatus(pkgName, PackageSettingBase.PKG_INSTALL_INCOMPLETE);
+ Trace.traceBegin(TRACE_TAG_PACKAGE_MANAGER, "writeSettings");
mSettings.writeLPr();
+ Trace.traceEnd(TRACE_TAG_PACKAGE_MANAGER);
}
if (DEBUG_INSTALL) Slog.d(TAG, "New package installed in " + newPackage.codePath);
@@ -12255,7 +12337,9 @@
mSettings.setInstallerPackageName(pkgName, installerPackageName);
res.returnCode = PackageManager.INSTALL_SUCCEEDED;
//to update install status
+ Trace.traceBegin(TRACE_TAG_PACKAGE_MANAGER, "writeSettings");
mSettings.writeLPr();
+ Trace.traceEnd(TRACE_TAG_PACKAGE_MANAGER);
}
Trace.traceEnd(TRACE_TAG_PACKAGE_MANAGER);
@@ -12504,9 +12588,13 @@
}
// Run dexopt before old package gets removed, to minimize time when app is unavailable
+ Trace.traceBegin(TRACE_TAG_PACKAGE_MANAGER, "dexopt");
+
int result = mPackageDexOptimizer
.performDexOpt(pkg, null /* instruction sets */, false /* forceDex */,
false /* defer */, false /* inclDependencies */);
+
+ Trace.traceEnd(TRACE_TAG_PACKAGE_MANAGER);
if (result == PackageDexOptimizer.DEX_OPT_FAILED) {
res.setError(INSTALL_FAILED_DEXOPT, "Dexopt failed for " + pkg.codePath);
return;
@@ -16201,8 +16289,16 @@
final Message msg = mHandler.obtainMessage(INIT_COPY);
final OriginInfo origin = OriginInfo.fromExistingFile(codeFile);
- msg.obj = new InstallParams(origin, move, installObserver, installFlags,
+ final InstallParams params = new InstallParams(origin, move, installObserver, installFlags,
installerPackageName, volumeUuid, null, user, packageAbiOverride, null);
+ params.setTraceMethod("movePackage").setTraceCookie(System.identityHashCode(params));
+ msg.obj = params;
+
+ Trace.asyncTraceBegin(TRACE_TAG_PACKAGE_MANAGER, "movePackage",
+ System.identityHashCode(msg.obj));
+ Trace.asyncTraceBegin(TRACE_TAG_PACKAGE_MANAGER, "queueInstall",
+ System.identityHashCode(msg.obj));
+
mHandler.sendMessage(msg);
}