• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2006 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 package android.app;
18 
19 import android.os.Trace;
20 import dalvik.system.PathClassLoader;
21 
22 import java.util.HashMap;
23 import java.util.Map;
24 
25 class ApplicationLoaders
26 {
getDefault()27     public static ApplicationLoaders getDefault()
28     {
29         return gApplicationLoaders;
30     }
31 
getClassLoader(String zip, String libPath, ClassLoader parent)32     public ClassLoader getClassLoader(String zip, String libPath, ClassLoader parent)
33     {
34         /*
35          * This is the parent we use if they pass "null" in.  In theory
36          * this should be the "system" class loader; in practice we
37          * don't use that and can happily (and more efficiently) use the
38          * bootstrap class loader.
39          */
40         ClassLoader baseParent = ClassLoader.getSystemClassLoader().getParent();
41 
42         synchronized (mLoaders) {
43             if (parent == null) {
44                 parent = baseParent;
45             }
46 
47             /*
48              * If we're one step up from the base class loader, find
49              * something in our cache.  Otherwise, we create a whole
50              * new ClassLoader for the zip archive.
51              */
52             if (parent == baseParent) {
53                 ClassLoader loader = mLoaders.get(zip);
54                 if (loader != null) {
55                     return loader;
56                 }
57 
58                 Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, zip);
59                 PathClassLoader pathClassloader =
60                     new PathClassLoader(zip, libPath, parent);
61                 Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);
62 
63                 mLoaders.put(zip, pathClassloader);
64                 return pathClassloader;
65             }
66 
67             Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, zip);
68             PathClassLoader pathClassloader = new PathClassLoader(zip, parent);
69             Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);
70             return pathClassloader;
71         }
72     }
73 
74     private final Map<String, ClassLoader> mLoaders = new HashMap<String, ClassLoader>();
75 
76     private static final ApplicationLoaders gApplicationLoaders
77         = new ApplicationLoaders();
78 }
79