在 API 级别 18 上找出内容提供程序 (acore) 进程的调用进程

Finding out calling process for content provider (acore) process on API level 18

背景:

我想知道是谁在我停止 acore 进程并在进程上调用清除数据后启动它。

日志:

Sep 12 18:50:08 localhost 172.16.4.165 ANDROID: +05:30 2015 000 0 | 09-12 18:49:48.630 I/ActivityManager( 3304): Start proc android.process.acore for content provider com.android.providers.contacts/.ContactsProvider2: pid=4805 uid=10022 gids={50022, 1028}

日志中没有任何其他内容可以让我知道是什么启动了这个过程。 acore 进程也有其他提供程序,但上面的日志将其缩小到 ContactsProvider2

问题:

进程在清理仍在进行时启动,这会导致数据库损坏。

我已经试过了:

  1. How to find out a calling activity for content provider in Android? 这有 API 级别 19 及以上的解决方案。但是我的设备有 API 级别 18

  2. 我在 onCreate() 中尝试了 Binder.getCallingPid() 这个 returns 自己的 PID

  3. 我通常直接在"Service"中使用的getCallingPid()getCallingUid()方法不适用于"ContentProvider"

最后,这就是我为那些感兴趣的人所做的。对于API 19以下的级别,我在不修改框架的情况下找不到任何方法。

下面是我 ActivityManagerService.java 的补丁,对我有帮助。

diff --git a/services/java/com/android/server/am/ActivityManagerService.java b/services/java/com/android/server/am/ActivityManagerService.java
index 0081dfc..8ec15c3 100644
--- a/services/java/com/android/server/am/ActivityManagerService.java
+++ b/services/java/com/android/server/am/ActivityManagerService.java
@@ -6676,6 +6676,9 @@ public final class ActivityManagerService  extends ActivityManagerNative
                             Slog.w(TAG, "Failed trying to unstop package "
                                     + cpr.appInfo.packageName + ": " + e);
                         }
+                       Slog.w(v, "startProcessLocked for cpi.processName = "+cpi.processName
+                           +"::cpi.applicationInfo.packageName=" + cpi.applicationInfo.packageName
+                            + " (Binder.getCallingPid()=" + Binder.getCallingPid());

                         ProcessRecord proc = startProcessLocked(cpi.processName,
                                 cpr.appInfo, false, 0, "content provider",
@@ -6692,6 +6695,7 @@ public final class ActivityManagerService  extends ActivityManagerNative
                         mLaunchingProviders.add(cpr);
                     } finally {
                         Binder.restoreCallingIdentity(origId);
+                        Slog.w(TAG, "Binder.getCallingPid() after restoreCallingIdentity(). pid=" + Binder.getCallingPid());
                     }
                 }