在 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
问题:
进程在清理仍在进行时启动,这会导致数据库损坏。
我已经试过了:
How to find out a calling activity for content provider in Android?
这有 API 级别 19 及以上的解决方案。但是我的设备有 API 级别 18
我在 onCreate()
中尝试了 Binder.getCallingPid()
这个 returns 自己的 PID
我通常直接在"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());
}
}
背景:
我想知道是谁在我停止 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
问题:
进程在清理仍在进行时启动,这会导致数据库损坏。
我已经试过了:
How to find out a calling activity for content provider in Android? 这有 API 级别 19 及以上的解决方案。但是我的设备有 API 级别 18
我在
onCreate()
中尝试了Binder.getCallingPid()
这个 returns 自己的 PID我通常直接在"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());
}
}