1b9a5e4ad30c9add140fd13491419ae66e947809dDianne Hackborn/* 2b9a5e4ad30c9add140fd13491419ae66e947809dDianne Hackborn * Copyright (C) 2015 The Android Open Source Project 3b9a5e4ad30c9add140fd13491419ae66e947809dDianne Hackborn * 4b9a5e4ad30c9add140fd13491419ae66e947809dDianne Hackborn * Licensed under the Apache License, Version 2.0 (the "License"); 5b9a5e4ad30c9add140fd13491419ae66e947809dDianne Hackborn * you may not use this file except in compliance with the License. 6b9a5e4ad30c9add140fd13491419ae66e947809dDianne Hackborn * You may obtain a copy of the License at 7b9a5e4ad30c9add140fd13491419ae66e947809dDianne Hackborn * 8b9a5e4ad30c9add140fd13491419ae66e947809dDianne Hackborn * http://www.apache.org/licenses/LICENSE-2.0 9b9a5e4ad30c9add140fd13491419ae66e947809dDianne Hackborn * 10b9a5e4ad30c9add140fd13491419ae66e947809dDianne Hackborn * Unless required by applicable law or agreed to in writing, software 11b9a5e4ad30c9add140fd13491419ae66e947809dDianne Hackborn * distributed under the License is distributed on an "AS IS" BASIS, 12b9a5e4ad30c9add140fd13491419ae66e947809dDianne Hackborn * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13b9a5e4ad30c9add140fd13491419ae66e947809dDianne Hackborn * See the License for the specific language governing permissions and 14b9a5e4ad30c9add140fd13491419ae66e947809dDianne Hackborn * limitations under the License. 15b9a5e4ad30c9add140fd13491419ae66e947809dDianne Hackborn */ 16b9a5e4ad30c9add140fd13491419ae66e947809dDianne Hackborn 17b9a5e4ad30c9add140fd13491419ae66e947809dDianne Hackbornpackage com.android.server.am; 18b9a5e4ad30c9add140fd13491419ae66e947809dDianne Hackborn 19b9a5e4ad30c9add140fd13491419ae66e947809dDianne Hackbornimport android.content.ContentProvider; 20b9a5e4ad30c9add140fd13491419ae66e947809dDianne Hackbornimport android.content.ContentValues; 21b9a5e4ad30c9add140fd13491419ae66e947809dDianne Hackbornimport android.database.Cursor; 22b9a5e4ad30c9add140fd13491419ae66e947809dDianne Hackbornimport android.net.Uri; 23b9a5e4ad30c9add140fd13491419ae66e947809dDianne Hackbornimport android.os.Environment; 24b9a5e4ad30c9add140fd13491419ae66e947809dDianne Hackbornimport android.os.ParcelFileDescriptor; 25b9a5e4ad30c9add140fd13491419ae66e947809dDianne Hackborn 26b9a5e4ad30c9add140fd13491419ae66e947809dDianne Hackbornimport java.io.File; 27b9a5e4ad30c9add140fd13491419ae66e947809dDianne Hackbornimport java.io.FileNotFoundException; 28b9a5e4ad30c9add140fd13491419ae66e947809dDianne Hackborn 29b9a5e4ad30c9add140fd13491419ae66e947809dDianne Hackbornpublic class DumpHeapProvider extends ContentProvider { 30b9a5e4ad30c9add140fd13491419ae66e947809dDianne Hackborn static final Object sLock = new Object(); 31b9a5e4ad30c9add140fd13491419ae66e947809dDianne Hackborn static File sHeapDumpJavaFile; 32b9a5e4ad30c9add140fd13491419ae66e947809dDianne Hackborn 33b9a5e4ad30c9add140fd13491419ae66e947809dDianne Hackborn static public File getJavaFile() { 34b9a5e4ad30c9add140fd13491419ae66e947809dDianne Hackborn synchronized (sLock) { 35b9a5e4ad30c9add140fd13491419ae66e947809dDianne Hackborn return sHeapDumpJavaFile; 36b9a5e4ad30c9add140fd13491419ae66e947809dDianne Hackborn } 37b9a5e4ad30c9add140fd13491419ae66e947809dDianne Hackborn } 38b9a5e4ad30c9add140fd13491419ae66e947809dDianne Hackborn 39b9a5e4ad30c9add140fd13491419ae66e947809dDianne Hackborn @Override 40b9a5e4ad30c9add140fd13491419ae66e947809dDianne Hackborn public boolean onCreate() { 41b9a5e4ad30c9add140fd13491419ae66e947809dDianne Hackborn synchronized (sLock) { 42b9a5e4ad30c9add140fd13491419ae66e947809dDianne Hackborn File dataDir = Environment.getDataDirectory(); 43b9a5e4ad30c9add140fd13491419ae66e947809dDianne Hackborn File systemDir = new File(dataDir, "system"); 44b9a5e4ad30c9add140fd13491419ae66e947809dDianne Hackborn File heapdumpDir = new File(systemDir, "heapdump"); 45b9a5e4ad30c9add140fd13491419ae66e947809dDianne Hackborn heapdumpDir.mkdir(); 46b9a5e4ad30c9add140fd13491419ae66e947809dDianne Hackborn sHeapDumpJavaFile = new File(heapdumpDir, "javaheap.bin"); 47b9a5e4ad30c9add140fd13491419ae66e947809dDianne Hackborn } 48b9a5e4ad30c9add140fd13491419ae66e947809dDianne Hackborn return true; 49b9a5e4ad30c9add140fd13491419ae66e947809dDianne Hackborn } 50b9a5e4ad30c9add140fd13491419ae66e947809dDianne Hackborn 51b9a5e4ad30c9add140fd13491419ae66e947809dDianne Hackborn @Override 52b9a5e4ad30c9add140fd13491419ae66e947809dDianne Hackborn public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) { 53b9a5e4ad30c9add140fd13491419ae66e947809dDianne Hackborn return null; 54b9a5e4ad30c9add140fd13491419ae66e947809dDianne Hackborn } 55b9a5e4ad30c9add140fd13491419ae66e947809dDianne Hackborn 56b9a5e4ad30c9add140fd13491419ae66e947809dDianne Hackborn @Override 57b9a5e4ad30c9add140fd13491419ae66e947809dDianne Hackborn public String getType(Uri uri) { 58b9a5e4ad30c9add140fd13491419ae66e947809dDianne Hackborn return "application/octet-stream"; 59b9a5e4ad30c9add140fd13491419ae66e947809dDianne Hackborn } 60b9a5e4ad30c9add140fd13491419ae66e947809dDianne Hackborn 61b9a5e4ad30c9add140fd13491419ae66e947809dDianne Hackborn @Override 62b9a5e4ad30c9add140fd13491419ae66e947809dDianne Hackborn public Uri insert(Uri uri, ContentValues values) { 63b9a5e4ad30c9add140fd13491419ae66e947809dDianne Hackborn return null; 64b9a5e4ad30c9add140fd13491419ae66e947809dDianne Hackborn } 65b9a5e4ad30c9add140fd13491419ae66e947809dDianne Hackborn 66b9a5e4ad30c9add140fd13491419ae66e947809dDianne Hackborn @Override 67b9a5e4ad30c9add140fd13491419ae66e947809dDianne Hackborn public int delete(Uri uri, String selection, String[] selectionArgs) { 68b9a5e4ad30c9add140fd13491419ae66e947809dDianne Hackborn return 0; 69b9a5e4ad30c9add140fd13491419ae66e947809dDianne Hackborn } 70b9a5e4ad30c9add140fd13491419ae66e947809dDianne Hackborn 71b9a5e4ad30c9add140fd13491419ae66e947809dDianne Hackborn @Override 72b9a5e4ad30c9add140fd13491419ae66e947809dDianne Hackborn public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) { 73b9a5e4ad30c9add140fd13491419ae66e947809dDianne Hackborn return 0; 74b9a5e4ad30c9add140fd13491419ae66e947809dDianne Hackborn } 75b9a5e4ad30c9add140fd13491419ae66e947809dDianne Hackborn 76b9a5e4ad30c9add140fd13491419ae66e947809dDianne Hackborn @Override 77b9a5e4ad30c9add140fd13491419ae66e947809dDianne Hackborn public ParcelFileDescriptor openFile(Uri uri, String mode) throws FileNotFoundException { 78b9a5e4ad30c9add140fd13491419ae66e947809dDianne Hackborn synchronized (sLock) { 79b9a5e4ad30c9add140fd13491419ae66e947809dDianne Hackborn String path = uri.getEncodedPath(); 80b9a5e4ad30c9add140fd13491419ae66e947809dDianne Hackborn final String tag = Uri.decode(path); 81b9a5e4ad30c9add140fd13491419ae66e947809dDianne Hackborn if (tag.equals("/java")) { 82b9a5e4ad30c9add140fd13491419ae66e947809dDianne Hackborn return ParcelFileDescriptor.open(sHeapDumpJavaFile, 83b9a5e4ad30c9add140fd13491419ae66e947809dDianne Hackborn ParcelFileDescriptor.MODE_READ_ONLY); 84b9a5e4ad30c9add140fd13491419ae66e947809dDianne Hackborn } else { 85b9a5e4ad30c9add140fd13491419ae66e947809dDianne Hackborn throw new FileNotFoundException("Invalid path for " + uri); 86b9a5e4ad30c9add140fd13491419ae66e947809dDianne Hackborn } 87b9a5e4ad30c9add140fd13491419ae66e947809dDianne Hackborn } 88b9a5e4ad30c9add140fd13491419ae66e947809dDianne Hackborn } 89b9a5e4ad30c9add140fd13491419ae66e947809dDianne Hackborn} 90