Loading services/core/java/com/android/server/pm/PackageManagerService.java +2 −1 Original line number Original line Diff line number Diff line Loading @@ -23933,7 +23933,8 @@ public class PackageManagerService extends IPackageManager.Stub writer.println("Domain verification status:"); writer.println("Domain verification status:"); writer.increaseIndent(); writer.increaseIndent(); try { try { mDomainVerificationManager.printState(writer, packageName, UserHandle.USER_ALL); mDomainVerificationManager.printState(writer, packageName, UserHandle.USER_ALL, mSettings::getPackageLPr); } catch (PackageManager.NameNotFoundException e) { } catch (PackageManager.NameNotFoundException e) { pw.println("Failure printing domain verification information"); pw.println("Failure printing domain verification information"); Slog.e(TAG, "Failure printing domain verification information", e); Slog.e(TAG, "Failure printing domain verification information", e); services/core/java/com/android/server/pm/verify/domain/DomainVerificationDebug.java +19 −4 Original line number Original line Diff line number Diff line Loading @@ -32,15 +32,30 @@ import android.util.SparseArray; import com.android.internal.util.CollectionUtils; import com.android.internal.util.CollectionUtils; import com.android.server.pm.PackageSetting; import com.android.server.pm.PackageSetting; import com.android.server.pm.parsing.pkg.AndroidPackage; import com.android.server.pm.verify.domain.models.DomainVerificationPkgState; import com.android.server.pm.verify.domain.models.DomainVerificationPkgState; import com.android.server.pm.verify.domain.models.DomainVerificationStateMap; import com.android.server.pm.verify.domain.models.DomainVerificationStateMap; import com.android.server.pm.verify.domain.models.DomainVerificationUserState; import com.android.server.pm.verify.domain.models.DomainVerificationUserState; import com.android.server.pm.parsing.pkg.AndroidPackage; import java.util.Arrays; import java.util.Arrays; import java.util.Objects; import java.util.Set; import java.util.function.Function; @SuppressWarnings("PointlessBooleanExpression") public class DomainVerificationDebug { public class DomainVerificationDebug { // Disable to turn off all logging. This is used to allow a "basic" set of debug flags to be // enabled and checked in, without having everything be on or off. public static final boolean DEBUG_ANY = false; // Enable to turn on all logging. Requires enabling DEBUG_ANY. public static final boolean DEBUG_ALL = false; public static final boolean DEBUG_APPROVAL = DEBUG_ANY && (DEBUG_ALL || true); public static final boolean DEBUG_BROADCASTS = DEBUG_ANY && (DEBUG_ALL || false); public static final boolean DEBUG_PROXIES = DEBUG_ANY && (DEBUG_ALL || false); @NonNull @NonNull private final DomainVerificationCollector mCollector; private final DomainVerificationCollector mCollector; Loading @@ -50,7 +65,7 @@ public class DomainVerificationDebug { public void printState(@NonNull IndentingPrintWriter writer, @Nullable String packageName, public void printState(@NonNull IndentingPrintWriter writer, @Nullable String packageName, @Nullable @UserIdInt Integer userId, @Nullable @UserIdInt Integer userId, @NonNull DomainVerificationService.Connection connection, @NonNull Function<String, PackageSetting> pkgSettingFunction, @NonNull DomainVerificationStateMap<DomainVerificationPkgState> stateMap) @NonNull DomainVerificationStateMap<DomainVerificationPkgState> stateMap) throws NameNotFoundException { throws NameNotFoundException { ArrayMap<String, Integer> reusedMap = new ArrayMap<>(); ArrayMap<String, Integer> reusedMap = new ArrayMap<>(); Loading @@ -61,7 +76,7 @@ public class DomainVerificationDebug { for (int index = 0; index < size; index++) { for (int index = 0; index < size; index++) { DomainVerificationPkgState pkgState = stateMap.valueAt(index); DomainVerificationPkgState pkgState = stateMap.valueAt(index); String pkgName = pkgState.getPackageName(); String pkgName = pkgState.getPackageName(); PackageSetting pkgSetting = connection.getPackageSettingLocked(pkgName); PackageSetting pkgSetting = pkgSettingFunction.apply(pkgName); if (pkgSetting == null || pkgSetting.getPkg() == null) { if (pkgSetting == null || pkgSetting.getPkg() == null) { continue; continue; } } Loading @@ -77,7 +92,7 @@ public class DomainVerificationDebug { throw DomainVerificationUtils.throwPackageUnavailable(packageName); throw DomainVerificationUtils.throwPackageUnavailable(packageName); } } PackageSetting pkgSetting = connection.getPackageSettingLocked(packageName); PackageSetting pkgSetting = pkgSettingFunction.apply(packageName); if (pkgSetting == null || pkgSetting.getPkg() == null) { if (pkgSetting == null || pkgSetting.getPkg() == null) { throw DomainVerificationUtils.throwPackageUnavailable(packageName); throw DomainVerificationUtils.throwPackageUnavailable(packageName); } } Loading services/core/java/com/android/server/pm/verify/domain/DomainVerificationManagerInternal.java +25 −6 Original line number Original line Diff line number Diff line Loading @@ -32,15 +32,16 @@ import android.util.TypedXmlPullParser; import android.util.TypedXmlSerializer; import android.util.TypedXmlSerializer; import com.android.server.pm.PackageSetting; import com.android.server.pm.PackageSetting; import com.android.server.pm.parsing.pkg.AndroidPackage; import com.android.server.pm.verify.domain.models.DomainVerificationPkgState; import com.android.server.pm.verify.domain.models.DomainVerificationPkgState; import com.android.server.pm.verify.domain.proxy.DomainVerificationProxy; import com.android.server.pm.verify.domain.proxy.DomainVerificationProxy; import com.android.server.pm.parsing.pkg.AndroidPackage; import org.xmlpull.v1.XmlPullParserException; import org.xmlpull.v1.XmlPullParserException; import java.io.IOException; import java.io.IOException; import java.util.Set; import java.util.Set; import java.util.UUID; import java.util.UUID; import java.util.function.Function; public interface DomainVerificationManagerInternal extends DomainVerificationManager { public interface DomainVerificationManagerInternal extends DomainVerificationManager { Loading Loading @@ -191,12 +192,21 @@ public interface DomainVerificationManagerInternal extends DomainVerificationMan /** /** * Print the verification state and user selection state of a package. * Print the verification state and user selection state of a package. * * * @param packageName the package whose state to change, or all packages if none is specified * @param packageName the package whose state to change, or all packages if none is * specified * @param userId the specific user to print, or null to skip printing user selection * @param userId the specific user to print, or null to skip printing user selection * states, supports {@link android.os.UserHandle#USER_ALL} * states, supports {@link android.os.UserHandle#USER_ALL} * @param pkgSettingFunction the method by which to retrieve package data; if this is called * from {@link com.android.server.pm.PackageManagerService}, it is * expected to pass in the snapshot of {@link PackageSetting} objects, * or if null is passed, the manager may decide to lock {@link * com.android.server.pm.PackageManagerService} through {@link * Connection#getPackageSettingLocked(String)} */ */ void printState(@NonNull IndentingPrintWriter writer, @Nullable String packageName, void printState(@NonNull IndentingPrintWriter writer, @Nullable String packageName, @Nullable @UserIdInt Integer userId) throws NameNotFoundException; @Nullable @UserIdInt Integer userId, @Nullable Function<String, PackageSetting> pkgSettingFunction) throws NameNotFoundException; @NonNull @NonNull DomainVerificationShell getShell(); DomainVerificationShell getShell(); Loading Loading @@ -225,7 +235,7 @@ public interface DomainVerificationManagerInternal extends DomainVerificationMan throws IllegalArgumentException, NameNotFoundException; throws IllegalArgumentException, NameNotFoundException; interface Connection { interface Connection extends Function<String, PackageSetting> { /** /** * Notify that a settings change has been made and that eventually * Notify that a settings change has been made and that eventually Loading @@ -249,10 +259,19 @@ public interface DomainVerificationManagerInternal extends DomainVerificationMan */ */ void schedule(int code, @Nullable Object object); void schedule(int code, @Nullable Object object); // TODO(b/178733426): Make DomainVerificationService PMS snapshot aware so it can avoid // locking package state at all. This can be as simple as removing this method in favor of // accepting a PackageSetting function in at every method call, although should probably // be abstracted to a wrapper class. @Nullable @Nullable PackageSetting getPackageSettingLocked(@NonNull String pkgName); PackageSetting getPackageSettingLocked(@NonNull String pkgName); @Nullable @Nullable AndroidPackage getPackageLocked(@NonNull String pkgName); AndroidPackage getPackageLocked(@NonNull String pkgName); @Override default PackageSetting apply(@NonNull String pkgName) { return getPackageSettingLocked(pkgName); } } } } } services/core/java/com/android/server/pm/verify/domain/DomainVerificationService.java +19 −3 Original line number Original line Diff line number Diff line Loading @@ -64,13 +64,14 @@ import java.util.List; import java.util.Map; import java.util.Map; import java.util.Set; import java.util.Set; import java.util.UUID; import java.util.UUID; import java.util.function.Function; public class DomainVerificationService extends SystemService public class DomainVerificationService extends SystemService implements DomainVerificationManagerInternal, DomainVerificationShell.Callback { implements DomainVerificationManagerInternal, DomainVerificationShell.Callback { private static final String TAG = "DomainVerificationService"; private static final String TAG = "DomainVerificationService"; public static final boolean DEBUG_APPROVAL = true; public static final boolean DEBUG_APPROVAL = DomainVerificationDebug.DEBUG_APPROVAL; /** /** * The new user preference API for verifying domains marked autoVerify=true in * The new user preference API for verifying domains marked autoVerify=true in Loading Loading @@ -890,9 +891,24 @@ public class DomainVerificationService extends SystemService @Override @Override public void printState(@NonNull IndentingPrintWriter writer, @Nullable String packageName, public void printState(@NonNull IndentingPrintWriter writer, @Nullable String packageName, @Nullable @UserIdInt Integer userId) throws NameNotFoundException { @Nullable Integer userId) throws NameNotFoundException { // This method is only used by DomainVerificationShell, which doesn't lock PMS, so it's // safe to pass mConnection directly here and lock PMS. This method is not exposed // to the general system server/PMS. printState(writer, packageName, userId, mConnection); } @Override public void printState(@NonNull IndentingPrintWriter writer, @Nullable String packageName, @Nullable @UserIdInt Integer userId, @Nullable Function<String, PackageSetting> pkgSettingFunction) throws NameNotFoundException { if (pkgSettingFunction == null) { pkgSettingFunction = mConnection; } synchronized (mLock) { synchronized (mLock) { mDebug.printState(writer, packageName, userId, mConnection, mAttachedPkgStates); mDebug.printState(writer, packageName, userId, pkgSettingFunction, mAttachedPkgStates); } } } } Loading services/core/java/com/android/server/pm/verify/domain/proxy/DomainVerificationProxy.java +3 −2 Original line number Original line Diff line number Diff line Loading @@ -23,9 +23,10 @@ import android.content.Context; import android.util.Slog; import android.util.Slog; import com.android.server.DeviceIdleInternal; import com.android.server.DeviceIdleInternal; import com.android.server.pm.verify.domain.DomainVerificationMessageCodes; import com.android.server.pm.verify.domain.DomainVerificationCollector; import com.android.server.pm.verify.domain.DomainVerificationCollector; import com.android.server.pm.verify.domain.DomainVerificationDebug; import com.android.server.pm.verify.domain.DomainVerificationManagerInternal; import com.android.server.pm.verify.domain.DomainVerificationManagerInternal; import com.android.server.pm.verify.domain.DomainVerificationMessageCodes; import java.util.Objects; import java.util.Objects; import java.util.Set; import java.util.Set; Loading @@ -35,7 +36,7 @@ public interface DomainVerificationProxy { String TAG = "DomainVerificationProxy"; String TAG = "DomainVerificationProxy"; boolean DEBUG_PROXIES = false; boolean DEBUG_PROXIES = DomainVerificationDebug.DEBUG_PROXIES; static <ConnectionType extends DomainVerificationProxyV1.Connection static <ConnectionType extends DomainVerificationProxyV1.Connection & DomainVerificationProxyV2.Connection> DomainVerificationProxy makeProxy( & DomainVerificationProxyV2.Connection> DomainVerificationProxy makeProxy( Loading Loading
services/core/java/com/android/server/pm/PackageManagerService.java +2 −1 Original line number Original line Diff line number Diff line Loading @@ -23933,7 +23933,8 @@ public class PackageManagerService extends IPackageManager.Stub writer.println("Domain verification status:"); writer.println("Domain verification status:"); writer.increaseIndent(); writer.increaseIndent(); try { try { mDomainVerificationManager.printState(writer, packageName, UserHandle.USER_ALL); mDomainVerificationManager.printState(writer, packageName, UserHandle.USER_ALL, mSettings::getPackageLPr); } catch (PackageManager.NameNotFoundException e) { } catch (PackageManager.NameNotFoundException e) { pw.println("Failure printing domain verification information"); pw.println("Failure printing domain verification information"); Slog.e(TAG, "Failure printing domain verification information", e); Slog.e(TAG, "Failure printing domain verification information", e);
services/core/java/com/android/server/pm/verify/domain/DomainVerificationDebug.java +19 −4 Original line number Original line Diff line number Diff line Loading @@ -32,15 +32,30 @@ import android.util.SparseArray; import com.android.internal.util.CollectionUtils; import com.android.internal.util.CollectionUtils; import com.android.server.pm.PackageSetting; import com.android.server.pm.PackageSetting; import com.android.server.pm.parsing.pkg.AndroidPackage; import com.android.server.pm.verify.domain.models.DomainVerificationPkgState; import com.android.server.pm.verify.domain.models.DomainVerificationPkgState; import com.android.server.pm.verify.domain.models.DomainVerificationStateMap; import com.android.server.pm.verify.domain.models.DomainVerificationStateMap; import com.android.server.pm.verify.domain.models.DomainVerificationUserState; import com.android.server.pm.verify.domain.models.DomainVerificationUserState; import com.android.server.pm.parsing.pkg.AndroidPackage; import java.util.Arrays; import java.util.Arrays; import java.util.Objects; import java.util.Set; import java.util.function.Function; @SuppressWarnings("PointlessBooleanExpression") public class DomainVerificationDebug { public class DomainVerificationDebug { // Disable to turn off all logging. This is used to allow a "basic" set of debug flags to be // enabled and checked in, without having everything be on or off. public static final boolean DEBUG_ANY = false; // Enable to turn on all logging. Requires enabling DEBUG_ANY. public static final boolean DEBUG_ALL = false; public static final boolean DEBUG_APPROVAL = DEBUG_ANY && (DEBUG_ALL || true); public static final boolean DEBUG_BROADCASTS = DEBUG_ANY && (DEBUG_ALL || false); public static final boolean DEBUG_PROXIES = DEBUG_ANY && (DEBUG_ALL || false); @NonNull @NonNull private final DomainVerificationCollector mCollector; private final DomainVerificationCollector mCollector; Loading @@ -50,7 +65,7 @@ public class DomainVerificationDebug { public void printState(@NonNull IndentingPrintWriter writer, @Nullable String packageName, public void printState(@NonNull IndentingPrintWriter writer, @Nullable String packageName, @Nullable @UserIdInt Integer userId, @Nullable @UserIdInt Integer userId, @NonNull DomainVerificationService.Connection connection, @NonNull Function<String, PackageSetting> pkgSettingFunction, @NonNull DomainVerificationStateMap<DomainVerificationPkgState> stateMap) @NonNull DomainVerificationStateMap<DomainVerificationPkgState> stateMap) throws NameNotFoundException { throws NameNotFoundException { ArrayMap<String, Integer> reusedMap = new ArrayMap<>(); ArrayMap<String, Integer> reusedMap = new ArrayMap<>(); Loading @@ -61,7 +76,7 @@ public class DomainVerificationDebug { for (int index = 0; index < size; index++) { for (int index = 0; index < size; index++) { DomainVerificationPkgState pkgState = stateMap.valueAt(index); DomainVerificationPkgState pkgState = stateMap.valueAt(index); String pkgName = pkgState.getPackageName(); String pkgName = pkgState.getPackageName(); PackageSetting pkgSetting = connection.getPackageSettingLocked(pkgName); PackageSetting pkgSetting = pkgSettingFunction.apply(pkgName); if (pkgSetting == null || pkgSetting.getPkg() == null) { if (pkgSetting == null || pkgSetting.getPkg() == null) { continue; continue; } } Loading @@ -77,7 +92,7 @@ public class DomainVerificationDebug { throw DomainVerificationUtils.throwPackageUnavailable(packageName); throw DomainVerificationUtils.throwPackageUnavailable(packageName); } } PackageSetting pkgSetting = connection.getPackageSettingLocked(packageName); PackageSetting pkgSetting = pkgSettingFunction.apply(packageName); if (pkgSetting == null || pkgSetting.getPkg() == null) { if (pkgSetting == null || pkgSetting.getPkg() == null) { throw DomainVerificationUtils.throwPackageUnavailable(packageName); throw DomainVerificationUtils.throwPackageUnavailable(packageName); } } Loading
services/core/java/com/android/server/pm/verify/domain/DomainVerificationManagerInternal.java +25 −6 Original line number Original line Diff line number Diff line Loading @@ -32,15 +32,16 @@ import android.util.TypedXmlPullParser; import android.util.TypedXmlSerializer; import android.util.TypedXmlSerializer; import com.android.server.pm.PackageSetting; import com.android.server.pm.PackageSetting; import com.android.server.pm.parsing.pkg.AndroidPackage; import com.android.server.pm.verify.domain.models.DomainVerificationPkgState; import com.android.server.pm.verify.domain.models.DomainVerificationPkgState; import com.android.server.pm.verify.domain.proxy.DomainVerificationProxy; import com.android.server.pm.verify.domain.proxy.DomainVerificationProxy; import com.android.server.pm.parsing.pkg.AndroidPackage; import org.xmlpull.v1.XmlPullParserException; import org.xmlpull.v1.XmlPullParserException; import java.io.IOException; import java.io.IOException; import java.util.Set; import java.util.Set; import java.util.UUID; import java.util.UUID; import java.util.function.Function; public interface DomainVerificationManagerInternal extends DomainVerificationManager { public interface DomainVerificationManagerInternal extends DomainVerificationManager { Loading Loading @@ -191,12 +192,21 @@ public interface DomainVerificationManagerInternal extends DomainVerificationMan /** /** * Print the verification state and user selection state of a package. * Print the verification state and user selection state of a package. * * * @param packageName the package whose state to change, or all packages if none is specified * @param packageName the package whose state to change, or all packages if none is * specified * @param userId the specific user to print, or null to skip printing user selection * @param userId the specific user to print, or null to skip printing user selection * states, supports {@link android.os.UserHandle#USER_ALL} * states, supports {@link android.os.UserHandle#USER_ALL} * @param pkgSettingFunction the method by which to retrieve package data; if this is called * from {@link com.android.server.pm.PackageManagerService}, it is * expected to pass in the snapshot of {@link PackageSetting} objects, * or if null is passed, the manager may decide to lock {@link * com.android.server.pm.PackageManagerService} through {@link * Connection#getPackageSettingLocked(String)} */ */ void printState(@NonNull IndentingPrintWriter writer, @Nullable String packageName, void printState(@NonNull IndentingPrintWriter writer, @Nullable String packageName, @Nullable @UserIdInt Integer userId) throws NameNotFoundException; @Nullable @UserIdInt Integer userId, @Nullable Function<String, PackageSetting> pkgSettingFunction) throws NameNotFoundException; @NonNull @NonNull DomainVerificationShell getShell(); DomainVerificationShell getShell(); Loading Loading @@ -225,7 +235,7 @@ public interface DomainVerificationManagerInternal extends DomainVerificationMan throws IllegalArgumentException, NameNotFoundException; throws IllegalArgumentException, NameNotFoundException; interface Connection { interface Connection extends Function<String, PackageSetting> { /** /** * Notify that a settings change has been made and that eventually * Notify that a settings change has been made and that eventually Loading @@ -249,10 +259,19 @@ public interface DomainVerificationManagerInternal extends DomainVerificationMan */ */ void schedule(int code, @Nullable Object object); void schedule(int code, @Nullable Object object); // TODO(b/178733426): Make DomainVerificationService PMS snapshot aware so it can avoid // locking package state at all. This can be as simple as removing this method in favor of // accepting a PackageSetting function in at every method call, although should probably // be abstracted to a wrapper class. @Nullable @Nullable PackageSetting getPackageSettingLocked(@NonNull String pkgName); PackageSetting getPackageSettingLocked(@NonNull String pkgName); @Nullable @Nullable AndroidPackage getPackageLocked(@NonNull String pkgName); AndroidPackage getPackageLocked(@NonNull String pkgName); @Override default PackageSetting apply(@NonNull String pkgName) { return getPackageSettingLocked(pkgName); } } } } }
services/core/java/com/android/server/pm/verify/domain/DomainVerificationService.java +19 −3 Original line number Original line Diff line number Diff line Loading @@ -64,13 +64,14 @@ import java.util.List; import java.util.Map; import java.util.Map; import java.util.Set; import java.util.Set; import java.util.UUID; import java.util.UUID; import java.util.function.Function; public class DomainVerificationService extends SystemService public class DomainVerificationService extends SystemService implements DomainVerificationManagerInternal, DomainVerificationShell.Callback { implements DomainVerificationManagerInternal, DomainVerificationShell.Callback { private static final String TAG = "DomainVerificationService"; private static final String TAG = "DomainVerificationService"; public static final boolean DEBUG_APPROVAL = true; public static final boolean DEBUG_APPROVAL = DomainVerificationDebug.DEBUG_APPROVAL; /** /** * The new user preference API for verifying domains marked autoVerify=true in * The new user preference API for verifying domains marked autoVerify=true in Loading Loading @@ -890,9 +891,24 @@ public class DomainVerificationService extends SystemService @Override @Override public void printState(@NonNull IndentingPrintWriter writer, @Nullable String packageName, public void printState(@NonNull IndentingPrintWriter writer, @Nullable String packageName, @Nullable @UserIdInt Integer userId) throws NameNotFoundException { @Nullable Integer userId) throws NameNotFoundException { // This method is only used by DomainVerificationShell, which doesn't lock PMS, so it's // safe to pass mConnection directly here and lock PMS. This method is not exposed // to the general system server/PMS. printState(writer, packageName, userId, mConnection); } @Override public void printState(@NonNull IndentingPrintWriter writer, @Nullable String packageName, @Nullable @UserIdInt Integer userId, @Nullable Function<String, PackageSetting> pkgSettingFunction) throws NameNotFoundException { if (pkgSettingFunction == null) { pkgSettingFunction = mConnection; } synchronized (mLock) { synchronized (mLock) { mDebug.printState(writer, packageName, userId, mConnection, mAttachedPkgStates); mDebug.printState(writer, packageName, userId, pkgSettingFunction, mAttachedPkgStates); } } } } Loading
services/core/java/com/android/server/pm/verify/domain/proxy/DomainVerificationProxy.java +3 −2 Original line number Original line Diff line number Diff line Loading @@ -23,9 +23,10 @@ import android.content.Context; import android.util.Slog; import android.util.Slog; import com.android.server.DeviceIdleInternal; import com.android.server.DeviceIdleInternal; import com.android.server.pm.verify.domain.DomainVerificationMessageCodes; import com.android.server.pm.verify.domain.DomainVerificationCollector; import com.android.server.pm.verify.domain.DomainVerificationCollector; import com.android.server.pm.verify.domain.DomainVerificationDebug; import com.android.server.pm.verify.domain.DomainVerificationManagerInternal; import com.android.server.pm.verify.domain.DomainVerificationManagerInternal; import com.android.server.pm.verify.domain.DomainVerificationMessageCodes; import java.util.Objects; import java.util.Objects; import java.util.Set; import java.util.Set; Loading @@ -35,7 +36,7 @@ public interface DomainVerificationProxy { String TAG = "DomainVerificationProxy"; String TAG = "DomainVerificationProxy"; boolean DEBUG_PROXIES = false; boolean DEBUG_PROXIES = DomainVerificationDebug.DEBUG_PROXIES; static <ConnectionType extends DomainVerificationProxyV1.Connection static <ConnectionType extends DomainVerificationProxyV1.Connection & DomainVerificationProxyV2.Connection> DomainVerificationProxy makeProxy( & DomainVerificationProxyV2.Connection> DomainVerificationProxy makeProxy( Loading