1742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani/* 2742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani * Copyright (C) 2011 The Android Open Source Project 3742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani * 4742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani * Licensed under the Apache License, Version 2.0 (the "License"); 5742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani * you may not use this file except in compliance with the License. 6742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani * You may obtain a copy of the License at 7742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani * 8742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani * http://www.apache.org/licenses/LICENSE-2.0 9742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani * 10742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani * Unless required by applicable law or agreed to in writing, software 11742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani * distributed under the License is distributed on an "AS IS" BASIS, 12742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani * See the License for the specific language governing permissions and 14742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani * limitations under the License. 15742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani */ 16742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani 17742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasanipackage com.android.server.am; 18742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani 19742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasaniimport android.content.ComponentName; 200b575a3cdfce8cd5394044c4c6a7092487ba93cbMakoto Onukiimport android.content.ComponentName.WithComponentName; 21742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasaniimport android.os.Binder; 22de7408c94e09a34fe0779ee894c64b4315aec17cMarco Nelissenimport android.os.RemoteException; 23f02b60aa4f367516f40cf3d60fffae0c6fe3e1b8Dianne Hackbornimport android.os.UserHandle; 24742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasaniimport android.util.Slog; 25742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasaniimport android.util.SparseArray; 26cbfd23ee6f14445c3e17c5169abbc80c216fa137Dianne Hackbornimport com.android.internal.os.TransferPipe; 270b575a3cdfce8cd5394044c4c6a7092487ba93cbMakoto Onukiimport com.android.internal.util.CollectionUtils; 280b575a3cdfce8cd5394044c4c6a7092487ba93cbMakoto Onukiimport com.android.internal.util.DumpUtils; 29742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani 30de7408c94e09a34fe0779ee894c64b4315aec17cMarco Nelissenimport java.io.FileDescriptor; 31de7408c94e09a34fe0779ee894c64b4315aec17cMarco Nelissenimport java.io.IOException; 32742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasaniimport java.io.PrintWriter; 33de7408c94e09a34fe0779ee894c64b4315aec17cMarco Nelissenimport java.util.ArrayList; 34fd55a9405e3df7a4006712651adb8b33a4b449f3Steven Timotiusimport java.util.Arrays; 350b575a3cdfce8cd5394044c4c6a7092487ba93cbMakoto Onukiimport java.util.Collections; 360b575a3cdfce8cd5394044c4c6a7092487ba93cbMakoto Onukiimport java.util.Comparator; 37742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasaniimport java.util.HashMap; 38742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasaniimport java.util.Iterator; 39742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasaniimport java.util.Map; 40540e123b14ef71f0bfda325e11773c1c510fb8baWale Ogunwaleimport java.util.Set; 410b575a3cdfce8cd5394044c4c6a7092487ba93cbMakoto Onukiimport java.util.function.Predicate; 42742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani 43742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani/** 44742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani * Keeps track of content providers by authority (name) and class. It separates the mapping by 45742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani * user and ones that are not user-specific (system providers). 46742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani */ 47be4e6aaa0252dd7da28b7aa85beba982538efa46Dianne Hackbornpublic final class ProviderMap { 48742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani 49742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani private static final String TAG = "ProviderMap"; 50742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani 51742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani private static final boolean DBG = false; 52742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani 532d1b37819112274f538d1886c379ff337eb0d9edDianne Hackborn private final ActivityManagerService mAm; 542d1b37819112274f538d1886c379ff337eb0d9edDianne Hackborn 557d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn private final HashMap<String, ContentProviderRecord> mSingletonByName 56742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani = new HashMap<String, ContentProviderRecord>(); 577d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn private final HashMap<ComponentName, ContentProviderRecord> mSingletonByClass 58742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani = new HashMap<ComponentName, ContentProviderRecord>(); 59742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani 60742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani private final SparseArray<HashMap<String, ContentProviderRecord>> mProvidersByNamePerUser 61742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani = new SparseArray<HashMap<String, ContentProviderRecord>>(); 62742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani private final SparseArray<HashMap<ComponentName, ContentProviderRecord>> mProvidersByClassPerUser 63742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani = new SparseArray<HashMap<ComponentName, ContentProviderRecord>>(); 64742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani 652d1b37819112274f538d1886c379ff337eb0d9edDianne Hackborn ProviderMap(ActivityManagerService am) { 662d1b37819112274f538d1886c379ff337eb0d9edDianne Hackborn mAm = am; 672d1b37819112274f538d1886c379ff337eb0d9edDianne Hackborn } 682d1b37819112274f538d1886c379ff337eb0d9edDianne Hackborn 69742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani ContentProviderRecord getProviderByName(String name) { 70742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani return getProviderByName(name, -1); 71742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani } 72742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani 73742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani ContentProviderRecord getProviderByName(String name, int userId) { 74742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani if (DBG) { 75742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani Slog.i(TAG, "getProviderByName: " + name + " , callingUid = " + Binder.getCallingUid()); 76742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani } 77742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani // Try to find it in the global list 787d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn ContentProviderRecord record = mSingletonByName.get(name); 79742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani if (record != null) { 80742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani return record; 81742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani } 82742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani 83742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani // Check the current user's list 84742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani return getProvidersByName(userId).get(name); 85742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani } 86742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani 87742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani ContentProviderRecord getProviderByClass(ComponentName name) { 88742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani return getProviderByClass(name, -1); 89742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani } 90742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani 91742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani ContentProviderRecord getProviderByClass(ComponentName name, int userId) { 92742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani if (DBG) { 93742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani Slog.i(TAG, "getProviderByClass: " + name + ", callingUid = " + Binder.getCallingUid()); 94742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani } 95742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani // Try to find it in the global list 967d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn ContentProviderRecord record = mSingletonByClass.get(name); 97742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani if (record != null) { 98742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani return record; 99742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani } 100742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani 101742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani // Check the current user's list 102742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani return getProvidersByClass(userId).get(name); 103742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani } 104742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani 105742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani void putProviderByName(String name, ContentProviderRecord record) { 106742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani if (DBG) { 107742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani Slog.i(TAG, "putProviderByName: " + name + " , callingUid = " + Binder.getCallingUid() 108742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani + ", record uid = " + record.appInfo.uid); 109742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani } 1107d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn if (record.singleton) { 1117d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn mSingletonByName.put(name, record); 112742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani } else { 113f02b60aa4f367516f40cf3d60fffae0c6fe3e1b8Dianne Hackborn final int userId = UserHandle.getUserId(record.appInfo.uid); 114742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani getProvidersByName(userId).put(name, record); 115742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani } 116742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani } 117742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani 118742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani void putProviderByClass(ComponentName name, ContentProviderRecord record) { 119742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani if (DBG) { 120742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani Slog.i(TAG, "putProviderByClass: " + name + " , callingUid = " + Binder.getCallingUid() 121742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani + ", record uid = " + record.appInfo.uid); 122742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani } 1237d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn if (record.singleton) { 1247d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn mSingletonByClass.put(name, record); 125742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani } else { 126f02b60aa4f367516f40cf3d60fffae0c6fe3e1b8Dianne Hackborn final int userId = UserHandle.getUserId(record.appInfo.uid); 127742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani getProvidersByClass(userId).put(name, record); 128742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani } 129742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani } 130742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani 1314120375d46091df8527bb701882e056fbb0e6b06Dianne Hackborn void removeProviderByName(String name, int userId) { 1327d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn if (mSingletonByName.containsKey(name)) { 133742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani if (DBG) 134742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani Slog.i(TAG, "Removing from globalByName name=" + name); 1357d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn mSingletonByName.remove(name); 136742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani } else { 1374120375d46091df8527bb701882e056fbb0e6b06Dianne Hackborn if (userId < 0) throw new IllegalArgumentException("Bad user " + userId); 138742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani if (DBG) 139742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani Slog.i(TAG, 1404120375d46091df8527bb701882e056fbb0e6b06Dianne Hackborn "Removing from providersByName name=" + name + " user=" + userId); 1414120375d46091df8527bb701882e056fbb0e6b06Dianne Hackborn HashMap<String, ContentProviderRecord> map = getProvidersByName(userId); 1428809004bc5125d48a1bbfc292509514374cc4fceVairavan Srinivasan // map returned by getProvidersByName wouldn't be null 1438809004bc5125d48a1bbfc292509514374cc4fceVairavan Srinivasan map.remove(name); 1448809004bc5125d48a1bbfc292509514374cc4fceVairavan Srinivasan if (map.size() == 0) { 1454120375d46091df8527bb701882e056fbb0e6b06Dianne Hackborn mProvidersByNamePerUser.remove(userId); 1468809004bc5125d48a1bbfc292509514374cc4fceVairavan Srinivasan } 147742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani } 148742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani } 149742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani 1504120375d46091df8527bb701882e056fbb0e6b06Dianne Hackborn void removeProviderByClass(ComponentName name, int userId) { 1517d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn if (mSingletonByClass.containsKey(name)) { 152742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani if (DBG) 153742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani Slog.i(TAG, "Removing from globalByClass name=" + name); 1547d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn mSingletonByClass.remove(name); 155742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani } else { 1564120375d46091df8527bb701882e056fbb0e6b06Dianne Hackborn if (userId < 0) throw new IllegalArgumentException("Bad user " + userId); 157742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani if (DBG) 158742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani Slog.i(TAG, 1594120375d46091df8527bb701882e056fbb0e6b06Dianne Hackborn "Removing from providersByClass name=" + name + " user=" + userId); 1604120375d46091df8527bb701882e056fbb0e6b06Dianne Hackborn HashMap<ComponentName, ContentProviderRecord> map = getProvidersByClass(userId); 1618809004bc5125d48a1bbfc292509514374cc4fceVairavan Srinivasan // map returned by getProvidersByClass wouldn't be null 1628809004bc5125d48a1bbfc292509514374cc4fceVairavan Srinivasan map.remove(name); 1638809004bc5125d48a1bbfc292509514374cc4fceVairavan Srinivasan if (map.size() == 0) { 1644120375d46091df8527bb701882e056fbb0e6b06Dianne Hackborn mProvidersByClassPerUser.remove(userId); 1658809004bc5125d48a1bbfc292509514374cc4fceVairavan Srinivasan } 166742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani } 167742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani } 168742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani 1694120375d46091df8527bb701882e056fbb0e6b06Dianne Hackborn private HashMap<String, ContentProviderRecord> getProvidersByName(int userId) { 1704120375d46091df8527bb701882e056fbb0e6b06Dianne Hackborn if (userId < 0) throw new IllegalArgumentException("Bad user " + userId); 171742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani final HashMap<String, ContentProviderRecord> map = mProvidersByNamePerUser.get(userId); 172742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani if (map == null) { 173742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani HashMap<String, ContentProviderRecord> newMap = new HashMap<String, ContentProviderRecord>(); 174742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani mProvidersByNamePerUser.put(userId, newMap); 175742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani return newMap; 176742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani } else { 177742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani return map; 178742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani } 179742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani } 180742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani 1814120375d46091df8527bb701882e056fbb0e6b06Dianne Hackborn HashMap<ComponentName, ContentProviderRecord> getProvidersByClass(int userId) { 1824120375d46091df8527bb701882e056fbb0e6b06Dianne Hackborn if (userId < 0) throw new IllegalArgumentException("Bad user " + userId); 1834120375d46091df8527bb701882e056fbb0e6b06Dianne Hackborn final HashMap<ComponentName, ContentProviderRecord> map 1844120375d46091df8527bb701882e056fbb0e6b06Dianne Hackborn = mProvidersByClassPerUser.get(userId); 185742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani if (map == null) { 1864120375d46091df8527bb701882e056fbb0e6b06Dianne Hackborn HashMap<ComponentName, ContentProviderRecord> newMap 1874120375d46091df8527bb701882e056fbb0e6b06Dianne Hackborn = new HashMap<ComponentName, ContentProviderRecord>(); 188742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani mProvidersByClassPerUser.put(userId, newMap); 189742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani return newMap; 190742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani } else { 191742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani return map; 192742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani } 193742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani } 194742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani 195540e123b14ef71f0bfda325e11773c1c510fb8baWale Ogunwale private boolean collectPackageProvidersLocked(String packageName, 196540e123b14ef71f0bfda325e11773c1c510fb8baWale Ogunwale Set<String> filterByClasses, boolean doit, boolean evenPersistent, 1975e03e2ca7d25b899b129baad2dd5eca6bf99d88aDianne Hackborn HashMap<ComponentName, ContentProviderRecord> providers, 1985e03e2ca7d25b899b129baad2dd5eca6bf99d88aDianne Hackborn ArrayList<ContentProviderRecord> result) { 1995e03e2ca7d25b899b129baad2dd5eca6bf99d88aDianne Hackborn boolean didSomething = false; 2005e03e2ca7d25b899b129baad2dd5eca6bf99d88aDianne Hackborn for (ContentProviderRecord provider : providers.values()) { 201540e123b14ef71f0bfda325e11773c1c510fb8baWale Ogunwale final boolean sameComponent = packageName == null 202540e123b14ef71f0bfda325e11773c1c510fb8baWale Ogunwale || (provider.info.packageName.equals(packageName) 203540e123b14ef71f0bfda325e11773c1c510fb8baWale Ogunwale && (filterByClasses == null 204540e123b14ef71f0bfda325e11773c1c510fb8baWale Ogunwale || filterByClasses.contains(provider.name.getClassName()))); 205540e123b14ef71f0bfda325e11773c1c510fb8baWale Ogunwale if (sameComponent 2065e03e2ca7d25b899b129baad2dd5eca6bf99d88aDianne Hackborn && (provider.proc == null || evenPersistent || !provider.proc.persistent)) { 2075e03e2ca7d25b899b129baad2dd5eca6bf99d88aDianne Hackborn if (!doit) { 2085e03e2ca7d25b899b129baad2dd5eca6bf99d88aDianne Hackborn return true; 2095e03e2ca7d25b899b129baad2dd5eca6bf99d88aDianne Hackborn } 2105e03e2ca7d25b899b129baad2dd5eca6bf99d88aDianne Hackborn didSomething = true; 2115e03e2ca7d25b899b129baad2dd5eca6bf99d88aDianne Hackborn result.add(provider); 2125e03e2ca7d25b899b129baad2dd5eca6bf99d88aDianne Hackborn } 2135e03e2ca7d25b899b129baad2dd5eca6bf99d88aDianne Hackborn } 2145e03e2ca7d25b899b129baad2dd5eca6bf99d88aDianne Hackborn return didSomething; 2155e03e2ca7d25b899b129baad2dd5eca6bf99d88aDianne Hackborn } 2165e03e2ca7d25b899b129baad2dd5eca6bf99d88aDianne Hackborn 217540e123b14ef71f0bfda325e11773c1c510fb8baWale Ogunwale boolean collectPackageProvidersLocked(String packageName, Set<String> filterByClasses, 2185e03e2ca7d25b899b129baad2dd5eca6bf99d88aDianne Hackborn boolean doit, boolean evenPersistent, int userId, 2195e03e2ca7d25b899b129baad2dd5eca6bf99d88aDianne Hackborn ArrayList<ContentProviderRecord> result) { 2205ff8ba7ace9b748892a2406995fe3eca87f682d4riddle_hsu boolean didSomething = false; 2217c69636c9a406265e1da368f3edfd8fb9651132cXiaohui Chen if (userId == UserHandle.USER_ALL || userId == UserHandle.USER_SYSTEM) { 2225ff8ba7ace9b748892a2406995fe3eca87f682d4riddle_hsu didSomething = collectPackageProvidersLocked(packageName, filterByClasses, 2235ff8ba7ace9b748892a2406995fe3eca87f682d4riddle_hsu doit, evenPersistent, mSingletonByClass, result); 2245ff8ba7ace9b748892a2406995fe3eca87f682d4riddle_hsu } 2255e03e2ca7d25b899b129baad2dd5eca6bf99d88aDianne Hackborn if (!doit && didSomething) { 2265e03e2ca7d25b899b129baad2dd5eca6bf99d88aDianne Hackborn return true; 2275e03e2ca7d25b899b129baad2dd5eca6bf99d88aDianne Hackborn } 2285e03e2ca7d25b899b129baad2dd5eca6bf99d88aDianne Hackborn if (userId == UserHandle.USER_ALL) { 229540e123b14ef71f0bfda325e11773c1c510fb8baWale Ogunwale for (int i = 0; i < mProvidersByClassPerUser.size(); i++) { 230540e123b14ef71f0bfda325e11773c1c510fb8baWale Ogunwale if (collectPackageProvidersLocked(packageName, filterByClasses, 231540e123b14ef71f0bfda325e11773c1c510fb8baWale Ogunwale doit, evenPersistent, mProvidersByClassPerUser.valueAt(i), result)) { 2325e03e2ca7d25b899b129baad2dd5eca6bf99d88aDianne Hackborn if (!doit) { 2335e03e2ca7d25b899b129baad2dd5eca6bf99d88aDianne Hackborn return true; 2345e03e2ca7d25b899b129baad2dd5eca6bf99d88aDianne Hackborn } 2355e03e2ca7d25b899b129baad2dd5eca6bf99d88aDianne Hackborn didSomething = true; 2365e03e2ca7d25b899b129baad2dd5eca6bf99d88aDianne Hackborn } 2375e03e2ca7d25b899b129baad2dd5eca6bf99d88aDianne Hackborn } 2385e03e2ca7d25b899b129baad2dd5eca6bf99d88aDianne Hackborn } else { 2392d1b37819112274f538d1886c379ff337eb0d9edDianne Hackborn HashMap<ComponentName, ContentProviderRecord> items 2402d1b37819112274f538d1886c379ff337eb0d9edDianne Hackborn = getProvidersByClass(userId); 2412d1b37819112274f538d1886c379ff337eb0d9edDianne Hackborn if (items != null) { 242540e123b14ef71f0bfda325e11773c1c510fb8baWale Ogunwale didSomething |= collectPackageProvidersLocked(packageName, filterByClasses, 243540e123b14ef71f0bfda325e11773c1c510fb8baWale Ogunwale doit, evenPersistent, items, result); 2442d1b37819112274f538d1886c379ff337eb0d9edDianne Hackborn } 2455e03e2ca7d25b899b129baad2dd5eca6bf99d88aDianne Hackborn } 2465e03e2ca7d25b899b129baad2dd5eca6bf99d88aDianne Hackborn return didSomething; 2475e03e2ca7d25b899b129baad2dd5eca6bf99d88aDianne Hackborn } 2485e03e2ca7d25b899b129baad2dd5eca6bf99d88aDianne Hackborn 249390517be2d60dd6e6264150c190c372d89bb331aDianne Hackborn private boolean dumpProvidersByClassLocked(PrintWriter pw, boolean dumpAll, String dumpPackage, 250390517be2d60dd6e6264150c190c372d89bb331aDianne Hackborn String header, boolean needSep, HashMap<ComponentName, ContentProviderRecord> map) { 251742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani Iterator<Map.Entry<ComponentName, ContentProviderRecord>> it = map.entrySet().iterator(); 252390517be2d60dd6e6264150c190c372d89bb331aDianne Hackborn boolean written = false; 253742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani while (it.hasNext()) { 254742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani Map.Entry<ComponentName, ContentProviderRecord> e = it.next(); 255742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani ContentProviderRecord r = e.getValue(); 256390517be2d60dd6e6264150c190c372d89bb331aDianne Hackborn if (dumpPackage != null && !dumpPackage.equals(r.appInfo.packageName)) { 257390517be2d60dd6e6264150c190c372d89bb331aDianne Hackborn continue; 258390517be2d60dd6e6264150c190c372d89bb331aDianne Hackborn } 259390517be2d60dd6e6264150c190c372d89bb331aDianne Hackborn if (needSep) { 260390517be2d60dd6e6264150c190c372d89bb331aDianne Hackborn pw.println(""); 261390517be2d60dd6e6264150c190c372d89bb331aDianne Hackborn needSep = false; 262390517be2d60dd6e6264150c190c372d89bb331aDianne Hackborn } 263390517be2d60dd6e6264150c190c372d89bb331aDianne Hackborn if (header != null) { 264390517be2d60dd6e6264150c190c372d89bb331aDianne Hackborn pw.println(header); 265390517be2d60dd6e6264150c190c372d89bb331aDianne Hackborn header = null; 266390517be2d60dd6e6264150c190c372d89bb331aDianne Hackborn } 267390517be2d60dd6e6264150c190c372d89bb331aDianne Hackborn written = true; 2686ae8d1821822296df0606c9cd1c46708cc21cb58Dianne Hackborn pw.print(" * "); 2696ae8d1821822296df0606c9cd1c46708cc21cb58Dianne Hackborn pw.println(r); 2706ae8d1821822296df0606c9cd1c46708cc21cb58Dianne Hackborn r.dump(pw, " ", dumpAll); 271742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani } 272390517be2d60dd6e6264150c190c372d89bb331aDianne Hackborn return written; 273742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani } 274742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani 275390517be2d60dd6e6264150c190c372d89bb331aDianne Hackborn private boolean dumpProvidersByNameLocked(PrintWriter pw, String dumpPackage, 276390517be2d60dd6e6264150c190c372d89bb331aDianne Hackborn String header, boolean needSep, HashMap<String, ContentProviderRecord> map) { 277742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani Iterator<Map.Entry<String, ContentProviderRecord>> it = map.entrySet().iterator(); 278390517be2d60dd6e6264150c190c372d89bb331aDianne Hackborn boolean written = false; 279742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani while (it.hasNext()) { 280742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani Map.Entry<String, ContentProviderRecord> e = it.next(); 281742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani ContentProviderRecord r = e.getValue(); 282390517be2d60dd6e6264150c190c372d89bb331aDianne Hackborn if (dumpPackage != null && !dumpPackage.equals(r.appInfo.packageName)) { 283390517be2d60dd6e6264150c190c372d89bb331aDianne Hackborn continue; 284390517be2d60dd6e6264150c190c372d89bb331aDianne Hackborn } 285390517be2d60dd6e6264150c190c372d89bb331aDianne Hackborn if (needSep) { 286390517be2d60dd6e6264150c190c372d89bb331aDianne Hackborn pw.println(""); 287390517be2d60dd6e6264150c190c372d89bb331aDianne Hackborn needSep = false; 288390517be2d60dd6e6264150c190c372d89bb331aDianne Hackborn } 289390517be2d60dd6e6264150c190c372d89bb331aDianne Hackborn if (header != null) { 290390517be2d60dd6e6264150c190c372d89bb331aDianne Hackborn pw.println(header); 291390517be2d60dd6e6264150c190c372d89bb331aDianne Hackborn header = null; 292390517be2d60dd6e6264150c190c372d89bb331aDianne Hackborn } 293390517be2d60dd6e6264150c190c372d89bb331aDianne Hackborn written = true; 294742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani pw.print(" "); 295742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani pw.print(e.getKey()); 296742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani pw.print(": "); 2976ae8d1821822296df0606c9cd1c46708cc21cb58Dianne Hackborn pw.println(r.toShortString()); 298742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani } 299390517be2d60dd6e6264150c190c372d89bb331aDianne Hackborn return written; 300742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani } 301742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani 302390517be2d60dd6e6264150c190c372d89bb331aDianne Hackborn boolean dumpProvidersLocked(PrintWriter pw, boolean dumpAll, String dumpPackage) { 303390517be2d60dd6e6264150c190c372d89bb331aDianne Hackborn boolean needSep = false; 304390517be2d60dd6e6264150c190c372d89bb331aDianne Hackborn 3057d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn if (mSingletonByClass.size() > 0) { 3067ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn needSep |= dumpProvidersByClassLocked(pw, dumpAll, dumpPackage, 307390517be2d60dd6e6264150c190c372d89bb331aDianne Hackborn " Published single-user content providers (by class):", needSep, 308390517be2d60dd6e6264150c190c372d89bb331aDianne Hackborn mSingletonByClass); 309742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani } 310742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani 3117d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn for (int i = 0; i < mProvidersByClassPerUser.size(); i++) { 3127d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn HashMap<ComponentName, ContentProviderRecord> map = mProvidersByClassPerUser.valueAt(i); 313390517be2d60dd6e6264150c190c372d89bb331aDianne Hackborn needSep |= dumpProvidersByClassLocked(pw, dumpAll, dumpPackage, 314390517be2d60dd6e6264150c190c372d89bb331aDianne Hackborn " Published user " + mProvidersByClassPerUser.keyAt(i) 315390517be2d60dd6e6264150c190c372d89bb331aDianne Hackborn + " content providers (by class):", needSep, map); 316742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani } 317742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani 318742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani if (dumpAll) { 319390517be2d60dd6e6264150c190c372d89bb331aDianne Hackborn needSep |= dumpProvidersByNameLocked(pw, dumpPackage, 320390517be2d60dd6e6264150c190c372d89bb331aDianne Hackborn " Single-user authority to provider mappings:", needSep, mSingletonByName); 321742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani 322742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani for (int i = 0; i < mProvidersByNamePerUser.size(); i++) { 323390517be2d60dd6e6264150c190c372d89bb331aDianne Hackborn needSep |= dumpProvidersByNameLocked(pw, dumpPackage, 324390517be2d60dd6e6264150c190c372d89bb331aDianne Hackborn " User " + mProvidersByNamePerUser.keyAt(i) 325390517be2d60dd6e6264150c190c372d89bb331aDianne Hackborn + " authority to provider mappings:", needSep, 326390517be2d60dd6e6264150c190c372d89bb331aDianne Hackborn mProvidersByNamePerUser.valueAt(i)); 327742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani } 328742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani } 329390517be2d60dd6e6264150c190c372d89bb331aDianne Hackborn return needSep; 330742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani } 331de7408c94e09a34fe0779ee894c64b4315aec17cMarco Nelissen 332fd55a9405e3df7a4006712651adb8b33a4b449f3Steven Timotius private ArrayList<ContentProviderRecord> getProvidersForName(String name) { 3332d1b37819112274f538d1886c379ff337eb0d9edDianne Hackborn ArrayList<ContentProviderRecord> allProviders = new ArrayList<ContentProviderRecord>(); 3340b575a3cdfce8cd5394044c4c6a7092487ba93cbMakoto Onuki final ArrayList<ContentProviderRecord> ret = new ArrayList<>(); 3350b575a3cdfce8cd5394044c4c6a7092487ba93cbMakoto Onuki 3360b575a3cdfce8cd5394044c4c6a7092487ba93cbMakoto Onuki final Predicate<ContentProviderRecord> filter = DumpUtils.filterRecord(name); 337de7408c94e09a34fe0779ee894c64b4315aec17cMarco Nelissen 3382d1b37819112274f538d1886c379ff337eb0d9edDianne Hackborn synchronized (mAm) { 3392d1b37819112274f538d1886c379ff337eb0d9edDianne Hackborn allProviders.addAll(mSingletonByClass.values()); 3402d1b37819112274f538d1886c379ff337eb0d9edDianne Hackborn for (int i=0; i<mProvidersByClassPerUser.size(); i++) { 3412d1b37819112274f538d1886c379ff337eb0d9edDianne Hackborn allProviders.addAll(mProvidersByClassPerUser.valueAt(i).values()); 342de7408c94e09a34fe0779ee894c64b4315aec17cMarco Nelissen } 3432d1b37819112274f538d1886c379ff337eb0d9edDianne Hackborn 3440b575a3cdfce8cd5394044c4c6a7092487ba93cbMakoto Onuki CollectionUtils.addIf(allProviders, ret, filter); 345de7408c94e09a34fe0779ee894c64b4315aec17cMarco Nelissen } 3460b575a3cdfce8cd5394044c4c6a7092487ba93cbMakoto Onuki // Sort by component name. 3470b575a3cdfce8cd5394044c4c6a7092487ba93cbMakoto Onuki ret.sort(Comparator.comparing(WithComponentName::getComponentName)); 3480b575a3cdfce8cd5394044c4c6a7092487ba93cbMakoto Onuki return ret; 349fd55a9405e3df7a4006712651adb8b33a4b449f3Steven Timotius } 350fd55a9405e3df7a4006712651adb8b33a4b449f3Steven Timotius 351fd55a9405e3df7a4006712651adb8b33a4b449f3Steven Timotius protected boolean dumpProvider(FileDescriptor fd, PrintWriter pw, String name, String[] args, 352fd55a9405e3df7a4006712651adb8b33a4b449f3Steven Timotius int opti, boolean dumpAll) { 353fd55a9405e3df7a4006712651adb8b33a4b449f3Steven Timotius ArrayList<ContentProviderRecord> providers = getProvidersForName(name); 354de7408c94e09a34fe0779ee894c64b4315aec17cMarco Nelissen 355de7408c94e09a34fe0779ee894c64b4315aec17cMarco Nelissen if (providers.size() <= 0) { 356de7408c94e09a34fe0779ee894c64b4315aec17cMarco Nelissen return false; 357de7408c94e09a34fe0779ee894c64b4315aec17cMarco Nelissen } 358de7408c94e09a34fe0779ee894c64b4315aec17cMarco Nelissen 359de7408c94e09a34fe0779ee894c64b4315aec17cMarco Nelissen boolean needSep = false; 360de7408c94e09a34fe0779ee894c64b4315aec17cMarco Nelissen for (int i=0; i<providers.size(); i++) { 361de7408c94e09a34fe0779ee894c64b4315aec17cMarco Nelissen if (needSep) { 362de7408c94e09a34fe0779ee894c64b4315aec17cMarco Nelissen pw.println(); 363de7408c94e09a34fe0779ee894c64b4315aec17cMarco Nelissen } 364de7408c94e09a34fe0779ee894c64b4315aec17cMarco Nelissen needSep = true; 365de7408c94e09a34fe0779ee894c64b4315aec17cMarco Nelissen dumpProvider("", fd, pw, providers.get(i), args, dumpAll); 366de7408c94e09a34fe0779ee894c64b4315aec17cMarco Nelissen } 367de7408c94e09a34fe0779ee894c64b4315aec17cMarco Nelissen return true; 368de7408c94e09a34fe0779ee894c64b4315aec17cMarco Nelissen } 369de7408c94e09a34fe0779ee894c64b4315aec17cMarco Nelissen 370de7408c94e09a34fe0779ee894c64b4315aec17cMarco Nelissen /** 3719d56bc1218759d1077b4a4014492381adc766d09Hyunyoung Song * Before invoking IApplicationThread.dumpProvider(), print meta information to the print 3729d56bc1218759d1077b4a4014492381adc766d09Hyunyoung Song * writer and handle passed flags. 373de7408c94e09a34fe0779ee894c64b4315aec17cMarco Nelissen */ 374de7408c94e09a34fe0779ee894c64b4315aec17cMarco Nelissen private void dumpProvider(String prefix, FileDescriptor fd, PrintWriter pw, 375de7408c94e09a34fe0779ee894c64b4315aec17cMarco Nelissen final ContentProviderRecord r, String[] args, boolean dumpAll) { 3769d56bc1218759d1077b4a4014492381adc766d09Hyunyoung Song for (String s: args) { 3779d56bc1218759d1077b4a4014492381adc766d09Hyunyoung Song if (!dumpAll && s.contains("--proto")) { 3789d56bc1218759d1077b4a4014492381adc766d09Hyunyoung Song if (r.proc != null && r.proc.thread != null) { 3799d56bc1218759d1077b4a4014492381adc766d09Hyunyoung Song dumpToTransferPipe(null , fd, pw, r, args); 3809d56bc1218759d1077b4a4014492381adc766d09Hyunyoung Song } 3819d56bc1218759d1077b4a4014492381adc766d09Hyunyoung Song return; 3829d56bc1218759d1077b4a4014492381adc766d09Hyunyoung Song } 3839d56bc1218759d1077b4a4014492381adc766d09Hyunyoung Song } 384de7408c94e09a34fe0779ee894c64b4315aec17cMarco Nelissen String innerPrefix = prefix + " "; 3852d1b37819112274f538d1886c379ff337eb0d9edDianne Hackborn synchronized (mAm) { 386de7408c94e09a34fe0779ee894c64b4315aec17cMarco Nelissen pw.print(prefix); pw.print("PROVIDER "); 3879d56bc1218759d1077b4a4014492381adc766d09Hyunyoung Song pw.print(r); 3889d56bc1218759d1077b4a4014492381adc766d09Hyunyoung Song pw.print(" pid="); 3899d56bc1218759d1077b4a4014492381adc766d09Hyunyoung Song if (r.proc != null) { 3909d56bc1218759d1077b4a4014492381adc766d09Hyunyoung Song pw.println(r.proc.pid); 3919d56bc1218759d1077b4a4014492381adc766d09Hyunyoung Song } else { 3929d56bc1218759d1077b4a4014492381adc766d09Hyunyoung Song pw.println("(not running)"); 3939d56bc1218759d1077b4a4014492381adc766d09Hyunyoung Song } 394de7408c94e09a34fe0779ee894c64b4315aec17cMarco Nelissen if (dumpAll) { 3956ae8d1821822296df0606c9cd1c46708cc21cb58Dianne Hackborn r.dump(pw, innerPrefix, true); 396de7408c94e09a34fe0779ee894c64b4315aec17cMarco Nelissen } 397de7408c94e09a34fe0779ee894c64b4315aec17cMarco Nelissen } 398de7408c94e09a34fe0779ee894c64b4315aec17cMarco Nelissen if (r.proc != null && r.proc.thread != null) { 399de7408c94e09a34fe0779ee894c64b4315aec17cMarco Nelissen pw.println(" Client:"); 400de7408c94e09a34fe0779ee894c64b4315aec17cMarco Nelissen pw.flush(); 4019d56bc1218759d1077b4a4014492381adc766d09Hyunyoung Song dumpToTransferPipe(" ", fd, pw, r, args); 4029d56bc1218759d1077b4a4014492381adc766d09Hyunyoung Song } 4039d56bc1218759d1077b4a4014492381adc766d09Hyunyoung Song } 4049d56bc1218759d1077b4a4014492381adc766d09Hyunyoung Song 4059d56bc1218759d1077b4a4014492381adc766d09Hyunyoung Song /** 406fd55a9405e3df7a4006712651adb8b33a4b449f3Steven Timotius * Similar to the dumpProvider, but only dumps the first matching provider. 407fd55a9405e3df7a4006712651adb8b33a4b449f3Steven Timotius * The provider is responsible for dumping as proto. 408fd55a9405e3df7a4006712651adb8b33a4b449f3Steven Timotius */ 409fd55a9405e3df7a4006712651adb8b33a4b449f3Steven Timotius protected boolean dumpProviderProto(FileDescriptor fd, PrintWriter pw, String name, 410fd55a9405e3df7a4006712651adb8b33a4b449f3Steven Timotius String[] args) { 411fd55a9405e3df7a4006712651adb8b33a4b449f3Steven Timotius //add back the --proto arg, which was stripped out by PriorityDump 412fd55a9405e3df7a4006712651adb8b33a4b449f3Steven Timotius String[] newArgs = Arrays.copyOf(args, args.length + 1); 413fd55a9405e3df7a4006712651adb8b33a4b449f3Steven Timotius newArgs[args.length] = "--proto"; 414fd55a9405e3df7a4006712651adb8b33a4b449f3Steven Timotius 415fd55a9405e3df7a4006712651adb8b33a4b449f3Steven Timotius ArrayList<ContentProviderRecord> providers = getProvidersForName(name); 416fd55a9405e3df7a4006712651adb8b33a4b449f3Steven Timotius 417fd55a9405e3df7a4006712651adb8b33a4b449f3Steven Timotius if (providers.size() <= 0) { 418fd55a9405e3df7a4006712651adb8b33a4b449f3Steven Timotius return false; 419fd55a9405e3df7a4006712651adb8b33a4b449f3Steven Timotius } 420fd55a9405e3df7a4006712651adb8b33a4b449f3Steven Timotius 421fd55a9405e3df7a4006712651adb8b33a4b449f3Steven Timotius // Only dump the first provider, since we are dumping in proto format 422fd55a9405e3df7a4006712651adb8b33a4b449f3Steven Timotius for (int i = 0; i < providers.size(); i++) { 423fd55a9405e3df7a4006712651adb8b33a4b449f3Steven Timotius final ContentProviderRecord r = providers.get(i); 424fd55a9405e3df7a4006712651adb8b33a4b449f3Steven Timotius if (r.proc != null && r.proc.thread != null) { 425fd55a9405e3df7a4006712651adb8b33a4b449f3Steven Timotius dumpToTransferPipe(null, fd, pw, r, newArgs); 426fd55a9405e3df7a4006712651adb8b33a4b449f3Steven Timotius return true; 427fd55a9405e3df7a4006712651adb8b33a4b449f3Steven Timotius } 428fd55a9405e3df7a4006712651adb8b33a4b449f3Steven Timotius } 429fd55a9405e3df7a4006712651adb8b33a4b449f3Steven Timotius return false; 430fd55a9405e3df7a4006712651adb8b33a4b449f3Steven Timotius } 431fd55a9405e3df7a4006712651adb8b33a4b449f3Steven Timotius 432fd55a9405e3df7a4006712651adb8b33a4b449f3Steven Timotius /** 4339d56bc1218759d1077b4a4014492381adc766d09Hyunyoung Song * Invokes IApplicationThread.dumpProvider() on the thread of the specified provider without 4349d56bc1218759d1077b4a4014492381adc766d09Hyunyoung Song * any meta string (e.g., provider info, indentation) written to the file descriptor. 4359d56bc1218759d1077b4a4014492381adc766d09Hyunyoung Song */ 4369d56bc1218759d1077b4a4014492381adc766d09Hyunyoung Song private void dumpToTransferPipe(String prefix, FileDescriptor fd, PrintWriter pw, 4379d56bc1218759d1077b4a4014492381adc766d09Hyunyoung Song final ContentProviderRecord r, String[] args) { 4389d56bc1218759d1077b4a4014492381adc766d09Hyunyoung Song try { 4399d56bc1218759d1077b4a4014492381adc766d09Hyunyoung Song TransferPipe tp = new TransferPipe(); 440de7408c94e09a34fe0779ee894c64b4315aec17cMarco Nelissen try { 4419d56bc1218759d1077b4a4014492381adc766d09Hyunyoung Song r.proc.thread.dumpProvider( 4429d56bc1218759d1077b4a4014492381adc766d09Hyunyoung Song tp.getWriteFd(), r.provider.asBinder(), args); 4439d56bc1218759d1077b4a4014492381adc766d09Hyunyoung Song tp.setBufferPrefix(prefix); 4449d56bc1218759d1077b4a4014492381adc766d09Hyunyoung Song // Short timeout, since blocking here can 4459d56bc1218759d1077b4a4014492381adc766d09Hyunyoung Song // deadlock with the application. 4469d56bc1218759d1077b4a4014492381adc766d09Hyunyoung Song tp.go(fd, 2000); 4479d56bc1218759d1077b4a4014492381adc766d09Hyunyoung Song } finally { 4489d56bc1218759d1077b4a4014492381adc766d09Hyunyoung Song tp.kill(); 449de7408c94e09a34fe0779ee894c64b4315aec17cMarco Nelissen } 4509d56bc1218759d1077b4a4014492381adc766d09Hyunyoung Song } catch (IOException ex) { 4519d56bc1218759d1077b4a4014492381adc766d09Hyunyoung Song pw.println(" Failure while dumping the provider: " + ex); 4529d56bc1218759d1077b4a4014492381adc766d09Hyunyoung Song } catch (RemoteException ex) { 4539d56bc1218759d1077b4a4014492381adc766d09Hyunyoung Song pw.println(" Got a RemoteException while dumping the service"); 454de7408c94e09a34fe0779ee894c64b4315aec17cMarco Nelissen } 455de7408c94e09a34fe0779ee894c64b4315aec17cMarco Nelissen } 456742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani} 457