文本文件  |  72行  |  2.52 KB

# 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.