Android12系统源码分析:NativeTombstoneManager (2)

值得注意的是CompletableFuture,函数式编程,可参考:CompletableFuture基本用法

tombstone文件的清理

目前有两种场景会清理文件

主动调用接口删除,AppExitInfoTracker-->purge()

app被卸载时,registerForPackageRemoval-->purgePackage()-->purge()

clearHistoryProcessExitInfo

frameworks/base/services/core/java/com/android/server/am/AppExitInfoTracker.java

void clearHistoryProcessExitInfo(String packageName, int userId) { NativeTombstoneManager tombstoneService = LocalServices.getService( NativeTombstoneManager.class); Optional<Integer> appId = Optional.empty(); if (TextUtils.isEmpty(packageName)) { synchronized (mLock) { removeByUserIdLocked(userId); } } else { final int uid = mService.mPackageManagerInt.getPackageUid(packageName, PackageManager.MATCH_ALL, userId); appId = Optional.of(UserHandle.getAppId(uid)); synchronized (mLock) { removePackageLocked(packageName, uid, true, userId); } } tombstoneService.purge(Optional.of(userId), appId); schedulePersistProcessExitInfo(true); }

frameworks/base/services/core/java/com/android/server/os/NativeTombstoneManager.java

* Remove native tombstones matching a user and/or app. public void purge(Optional<Integer> userId, Optional<Integer> appId) { mHandler.post(() -> { synchronized (mLock) { for (int i = mTombstones.size() - 1; i >= 0; --i) { TombstoneFile tombstone = mTombstones.valueAt(i); if (tombstone.matches(userId, appId)) { tombstone.purge(); mTombstones.removeAt(i); ---------------------------------------------------------------------- static class TombstoneFile { public void purge() { if (!mPurged) { try { Os.ftruncate(mPfd.getFileDescriptor(), 0); } catch (ErrnoException ex) { Slog.e(TAG, "Failed to truncate tombstone", ex); } mPurged = true; purgePackage

frameworks/base/services/core/java/com/android/server/os/NativeTombstoneManager.java

private void registerForPackageRemoval() { final IntentFilter filter = new IntentFilter(); filter.addAction(Intent.ACTION_PACKAGE_FULLY_REMOVED); filter.addDataScheme("package"); mContext.registerReceiverForAllUsers(new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { final int uid = intent.getIntExtra(Intent.EXTRA_UID, UserHandle.USER_NULL); if (uid == UserHandle.USER_NULL) return; final boolean allUsers = intent.getBooleanExtra( Intent.EXTRA_REMOVED_FOR_ALL_USERS, false); purgePackage(uid, allUsers); } }, filter, null, mHandler); } --------------------------------------------- private void purgePackage(int uid, boolean allUsers) { final int appId = UserHandle.getAppId(uid); Optional<Integer> userId; if (allUsers) { userId = Optional.empty(); } else { userId = Optional.of(UserHandle.getUserId(uid)); } purge(userId, Optional.of(appId)); } private void purgeUser(int uid) { purge(Optional.of(uid), Optional.empty()); }

f服务启动时registerForPackageRemoval调用,开启对广播的监听:ACTION_PACKAGE_FULLY_REMOVED

当app卸载时,此处也删除其对应uid的tombstone文件

同这个包删除类似,还有用户删除时也会删对应的文件:

private void registerForUserRemoval() { filter.addAction(Intent.ACTION_USER_REMOVED);

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zzjypg.html