|  | // Copyright (c) 2018, the R8 project authors. Please see the AUTHORS file | 
|  | // for details. All rights reserved. Use of this source code is governed by a | 
|  | // BSD-style license that can be found in the LICENSE file. | 
|  | package classloader; | 
|  |  | 
|  | import java.lang.reflect.Method; | 
|  |  | 
|  | import dalvik.system.PathClassLoader; | 
|  |  | 
|  | // Command line application which take three arguments: | 
|  | // | 
|  | //  Parent dex file | 
|  | //  Child dex file | 
|  | //  Main class name | 
|  | // | 
|  | // The application will create a classloader hierachy with the parent dex file above the | 
|  | // system class loader, and the child dex file above the parent dex file. The it will load the | 
|  | // Main class from the child dex file class loader and run its main method. | 
|  | public class Runner { | 
|  | public static void main(String[] args) throws Exception { | 
|  | String parentFile = args[0]; | 
|  | String childFile = args[1]; | 
|  | String childClassName = args[2]; | 
|  | ClassLoader parentClassLoader = | 
|  | new PathClassLoader(parentFile, ClassLoader.getSystemClassLoader()); | 
|  | ClassLoader childClassLoader = new PathClassLoader(childFile, parentClassLoader); | 
|  |  | 
|  | Class<?> childClass = childClassLoader.loadClass(childClassName); | 
|  | runMain(childClass, new String[0]); | 
|  | } | 
|  |  | 
|  | private static void runMain(Class<?> clazz, String[] args) throws Exception { | 
|  | Method m = clazz.getMethod("main", String[].class); | 
|  | m.invoke(null, new Object[] { args }); | 
|  | } | 
|  | } |