Only initialize PermissionUsageHelper lazily or when requested

This should fix a memory leak caused by automatically registering a
PermissionManager

Bug: 204222680
Test: manual
Change-Id: I94c6da3dd89e8b158552e94c94e4d0fb3f5d6f0d
Merged-In: I94c6da3dd89e8b158552e94c94e4d0fb3f5d6f0d
This commit is contained in:
Nate Myren
2021-10-29 12:39:52 -07:00
parent cec069482f
commit 0d47a03bfa
3 changed files with 35 additions and 7 deletions

View File

@@ -159,8 +159,6 @@ public final class PermissionManager {
mPermissionManager = IPermissionManager.Stub.asInterface(ServiceManager.getServiceOrThrow(
"permissionmgr"));
mLegacyPermissionManager = context.getSystemService(LegacyPermissionManager.class);
//TODO ntmyren: there should be a way to only enable the watcher when requested
mUsageHelper = new PermissionUsageHelper(context);
}
/**
@@ -871,6 +869,29 @@ public final class PermissionManager {
return mSplitPermissionInfos;
}
/**
* Initialize the PermissionUsageHelper, which will register active app op listeners
*
* @hide
*/
public void initializeUsageHelper() {
if (mUsageHelper == null) {
mUsageHelper = new PermissionUsageHelper(mContext);
}
}
/**
* Teardown the PermissionUsageHelper, removing listeners
*
* @hide
*/
public void tearDownUsageHelper() {
if (mUsageHelper != null) {
mUsageHelper.tearDown();
mUsageHelper = null;
}
}
/**
* @return A list of permission groups currently or recently used by all apps by all users in
* the current profile group.
@@ -881,7 +902,7 @@ public final class PermissionManager {
@NonNull
@RequiresPermission(Manifest.permission.GET_APP_OPS_STATS)
public List<PermGroupUsage> getIndicatorAppOpUsageData() {
return mUsageHelper.getOpUsageData(new AudioManager().isMicrophoneMute());
return getIndicatorAppOpUsageData(new AudioManager().isMicrophoneMute());
}
/**
@@ -896,9 +917,7 @@ public final class PermissionManager {
@RequiresPermission(Manifest.permission.GET_APP_OPS_STATS)
public List<PermGroupUsage> getIndicatorAppOpUsageData(boolean micMuted) {
// Lazily initialize the usage helper
if (mUsageHelper == null) {
mUsageHelper = new PermissionUsageHelper(mContext);
}
initializeUsageHelper();
return mUsageHelper.getOpUsageData(micMuted);
}

View File

@@ -176,6 +176,11 @@ public class PermissionUsageHelper implements AppOpsManager.OnOpActiveChangedLis
return mUserContexts.get(user);
}
public void tearDown() {
mAppOpsManager.stopWatchingActive(this);
mAppOpsManager.stopWatchingStarted(this);
}
@Override
public void onOpActiveChanged(@NonNull String op, int uid, @NonNull String packageName,
boolean active) {

View File

@@ -442,7 +442,11 @@ public class FrameworkServicesModule {
@Provides
@Singleton
static PermissionManager providePermissionManager(Context context) {
return context.getSystemService(PermissionManager.class);
PermissionManager pm = context.getSystemService(PermissionManager.class);
if (pm != null) {
pm.initializeUsageHelper();
}
return pm;
}
@Provides