19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/* 29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Copyright (C) 2008 The Android Open Source Project 39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * you may not use this file except in compliance with the License. 69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * You may obtain a copy of the License at 79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Unless required by applicable law or agreed to in writing, software 119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * See the License for the specific language governing permissions and 149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * limitations under the License. 159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.Arrays; 189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.HashSet; 199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.Set; 209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/** 229d2d6e14b0932b6a74e01f393d5efed61458941bBob Lee * Policy that governs which classes are preloaded. 239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic class Policy { 259d2d6e14b0932b6a74e01f393d5efed61458941bBob Lee 269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 272e93f65cab0b4b21a1285b83e985559325e87a3aBob Lee * No constructor - use static methods only 289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 292e93f65cab0b4b21a1285b83e985559325e87a3aBob Lee private Policy() {} 309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 312e93f65cab0b4b21a1285b83e985559325e87a3aBob Lee /** 322e93f65cab0b4b21a1285b83e985559325e87a3aBob Lee * This location (in the build system) of the preloaded-classes file. 339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 349d2d6e14b0932b6a74e01f393d5efed61458941bBob Lee static final String PRELOADED_CLASS_FILE 352e93f65cab0b4b21a1285b83e985559325e87a3aBob Lee = "frameworks/base/preloaded-classes"; 369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 372e93f65cab0b4b21a1285b83e985559325e87a3aBob Lee /** 382e93f65cab0b4b21a1285b83e985559325e87a3aBob Lee * Long running services. These are restricted in their contribution to the 392e93f65cab0b4b21a1285b83e985559325e87a3aBob Lee * preloader because their launch time is less critical. 409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 419d2d6e14b0932b6a74e01f393d5efed61458941bBob Lee // TODO: Generate this automatically from package manager. 429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final Set<String> SERVICES = new HashSet<String>(Arrays.asList( 439d2d6e14b0932b6a74e01f393d5efed61458941bBob Lee "system_server", 449d2d6e14b0932b6a74e01f393d5efed61458941bBob Lee "com.google.process.content", 459d2d6e14b0932b6a74e01f393d5efed61458941bBob Lee "android.process.media", 46e9fcaa0697dcb257d0288118347f721ce8806b55Jesse Wilson "com.android.bluetooth", 47e9fcaa0697dcb257d0288118347f721ce8806b55Jesse Wilson "com.android.calendar", 48e9fcaa0697dcb257d0288118347f721ce8806b55Jesse Wilson "com.android.inputmethod.latin", 499d2d6e14b0932b6a74e01f393d5efed61458941bBob Lee "com.android.phone", 50e9fcaa0697dcb257d0288118347f721ce8806b55Jesse Wilson "com.google.android.apps.maps.FriendService", // pre froyo 51e9fcaa0697dcb257d0288118347f721ce8806b55Jesse Wilson "com.google.android.apps.maps:FriendService", // froyo 529d2d6e14b0932b6a74e01f393d5efed61458941bBob Lee "com.google.android.apps.maps.LocationFriendService", 53e9fcaa0697dcb257d0288118347f721ce8806b55Jesse Wilson "com.google.android.deskclock", 549d2d6e14b0932b6a74e01f393d5efed61458941bBob Lee "com.google.process.gapps", 559d2d6e14b0932b6a74e01f393d5efed61458941bBob Lee "android.tts" 569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project )); 579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Classes which we shouldn't load from the Zygote. 609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 612e93f65cab0b4b21a1285b83e985559325e87a3aBob Lee private static final Set<String> EXCLUDED_CLASSES 622e93f65cab0b4b21a1285b83e985559325e87a3aBob Lee = new HashSet<String>(Arrays.asList( 639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Binders 649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "android.app.AlarmManager", 659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "android.app.SearchManager", 669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "android.os.FileObserver", 679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "com.android.server.PackageManagerService$AppDirObserver", 689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Threads 709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "android.os.AsyncTask", 719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "android.pim.ContactsAsyncHelper", 729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "java.lang.ProcessManager" 739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project )); 749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 769d2d6e14b0932b6a74e01f393d5efed61458941bBob Lee * Returns true if the given process name is a "long running" process or 779d2d6e14b0932b6a74e01f393d5efed61458941bBob Lee * service. 789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static boolean isService(String processName) { 809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return SERVICES.contains(processName); 819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 829d2d6e14b0932b6a74e01f393d5efed61458941bBob Lee 839d2d6e14b0932b6a74e01f393d5efed61458941bBob Lee /**Reports if the given class should be preloaded. */ 849d2d6e14b0932b6a74e01f393d5efed61458941bBob Lee public static boolean isPreloadable(LoadedClass clazz) { 859d2d6e14b0932b6a74e01f393d5efed61458941bBob Lee return clazz.systemClass && !EXCLUDED_CLASSES.contains(clazz.name); 869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 88