| # Copyright (C) 2008 The Android Open Source Project | 
 |  | 
 |  | 
 | - Description - | 
 | --------------- | 
 |  | 
 | makeLayoutLib generates a library used by the Eclipse graphical layout editor | 
 | to perform layout. | 
 |  | 
 |  | 
 |  | 
 | - Usage - | 
 | --------- | 
 |  | 
 |  ./makeLayoutLib path/to/android.jar destination.jar | 
 |  | 
 |  | 
 |  | 
 | - Implementation Notes - | 
 | ------------------------ | 
 |  | 
 | The goal of makeLayoutLib is to list all the classes from the input jar and create a new | 
 | jar that only keeps certain classes and create stubs for all their dependencies. | 
 |  | 
 | First the input jar is parsed to find all the classes defined. | 
 |  | 
 | In the Main(), the following list of classes are hardcoded (TODO config file later): | 
 | - keep all classes that derive from android.view.View. | 
 | - keep all classes in the android.view and android.widget packages (sub-packages excluded). | 
 | - keep specific classes such as android.policy.PhoneLayoutInflater. | 
 |  | 
 | For each class to keep, their dependencies are examined using BCEL. | 
 | A dependency is defined as a class needed to instantiate the given class that should be kept, | 
 | directly or indirectly. So a dependency is a class that is used by the input class, that is | 
 | defined in the input jar and that is not part of the current JRE. | 
 |  | 
 | Dependencies are computed recursively. | 
 |  | 
 | Once all dependencies are found, the final jar can be created. | 
 | There are three kind of classes to write: | 
 | - classes that are to be kept as-is. They are just dumped in the new jar unchanged. | 
 | - classes that are to be kept yet contain native methods or fields. | 
 | - classes that are just dependencies. We don't want to expose their implementation in the final | 
 |   jar. | 
 |  | 
 | The implementation of native methods and all methods of mock classes is replaced by a stub | 
 | that throws UnsupportedOperationException. | 
 |  | 
 | Incidentally, the access level of native and mock classes needs to be changed in order for | 
 | native methods to be later overridden. Methods that are "final private native" must become | 
 | non-final, non-native and at most protected. Package-default access is changed to public. | 
 | Classes that are final are made non-final. Abstract methods are left untouched. | 
 |  | 
 |  | 
 |  | 
 | ---- | 
 | 20080617 Replace Class | 
 |  | 
 | Some classes are basically wrappers over native objects. | 
 | Subclassing doesn't work as most methods are either static or we don't | 
 | control object creation. In this scenario the idea is to be able to | 
 | replace classes in the final jar. | 
 |  | 
 | Example: android.graphics.Paint would get renamed to OriginalPaint | 
 | in the generated jar. Then in the bridge we'll introduce a replacement | 
 | Paint class that derives from OriginalPaint. | 
 |  | 
 | This won't rename/replace the inner static methods of a given class. | 
 |  | 
 |  | 
 |  |