在android平臺上(在ICS上確認),如果內容提供者在客戶端處於查詢中間時死亡(即有一個打開的遊標),框架決定終止持有的客戶端進程一個打開的光標。安卓內容提供商在提供商崩潰時的健壯性
這是一個logcat輸出,當我嘗試這個下載管理器查詢後,進行查詢睡覺。 「睡眠」是爲了重現這個問題。當提供者在正確/錯誤的時間死亡時,您可以想象它會在常規用例中發生。然後殺死com.android.media(託管downloadProvider)。
「殺com。示例(PID 12234),因爲供應商com.android.providers.downloads.DownloadProvider是在垂死android.process.media過程」
我跟蹤了這ActivityManagerService代碼:: removeDyingProviderLocked
10203 private final void removeDyingProviderLocked(ProcessRecord proc,
10204 ContentProviderRecord cpr) {
10205 synchronized (cpr) {
10206 cpr.launchingApp = null;
10207 cpr.notifyAll();
10208 }
10210 mProvidersByClass.remove(cpr.name);
10211 String names[] = cpr.info.authority.split(";");
10212 for (int j = 0; j < names.length; j++) {
10213 mProvidersByName.remove(names[j]);
10214 }
10215
10216 Iterator<ProcessRecord> cit = cpr.clients.iterator();
10217 while (cit.hasNext()) {
10218 ProcessRecord capp = cit.next();
10219 if (!capp.persistent && capp.thread != null
10220 && capp.pid != 0
10221 && capp.pid != MY_PID) {
10222 Slog.i(TAG, "Kill " + capp.processName
10223 + " (pid " + capp.pid + "): provider " + cpr.info.name
10224 + " in dying process " + (proc != null ? proc.processName : "??"));
10225 EventLog.writeEvent(EventLogTags.AM_KILL, capp.pid,
10226 capp.processName, capp.setAdj, "dying provider "
10227 + cpr.name.toShortString());
10228 Process.killProcessQuiet(capp.pid);
10229 }
10230 }
10231
10232 mLaunchingProviders.remove(cpr);
10233 }
這是一個政策決定還是遊標訪問提供者死後不安全?
它看起來像客戶端光標持有由CP填充的ashmem位置的fd。 這是客戶端被殺死的原因,而不是在服務器(提供者)死亡時拋出異常像Binders?
logcat,請給我來源?以提供您所要求的SO社區的利益。 :) – t0mm13b
編輯信息的問題! – user1298992
最好提供logcat的完整輸出,一行是不夠的!以及你的問題的性質,這將推動評論/答案猜測它是什麼......基本上猜測,並可能導致這個問題的關閉,作爲*不建設性*或*太*本地化* ...... – t0mm13b