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