I am using Eclipse with the ADT plugin, as well as ant.

I am trying to design a plug-in architecture. I have three projects, call 
them Main, Plugin, and Impl. Main builds a service apk, Plugin is an 
Android Library. Plugin just defines two classes, AbstractPlugin and 
PluginFactory. AbstractPlugin is an interface, and PluginFactory does what 
is necessary to set up a DexClassLoader and instantiate by reflection a 
class from Impl which implements that interface. Main uses the resulting 
AbstractPlugin in some way.

Therefore, the compile-time dependencies are Main -> Plugin and Impl -> 
Plugin. There is no compile time dependency between Main and Impl, since 
the class in Impl is instantiated by reflection. Therefore, when the 
Main.apk is built, classes from Plugin are included but classes from Impl 
are not.

The problem is then how to get those dex'd classes in Impl into the phone 
in a place where DexClassLoader can get at them.

There are two options. First, Impl can be built as an Android library, then 
the resulting classes.jar can be manually dex'd with dx, and then the 
resulting classes-dex.jar can be pushed into some predetermined directory 
on the phone. This works, but I am not entirely thrilled with it. For one 
thing, it prevents Impl from having any resources of its own, only Java 
code.

Second, Impl can be built as an apk which just happens to contain neither a 
service nor an activity. This can be installed normally, and then 
PluginFactory can get the path to the apk from the PackageManager to pass 
it to DexClassLoader. The problem with this approach is that in each 
configuration I have tried so far, Impl.apk ends up pulling in the classes 
from Plugin as well since there is a compile time dependency. Therefore 
when DexClassLoader tries to resolve something, it realizes there are now 
two different AbstractPlugin implementations in the system (which are 
really the same one in two different apks), and bails out. What I would 
like to do is keep Plugin on the classpath during the build of Impl, but 
exclude its classes from the apk. Is there a way to set this up either in 
Eclipse or in Ant directly? (What about in maven?)

This does not necessarily solve the resource problem since the active 
Context in Main would not necessarily know about the resources in Impl if 
it had any, but it would be a start.

-- 
You received this message because you are subscribed to the Google
Groups "Android Developers" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to
[email protected]
For more options, visit this group at
http://groups.google.com/group/android-developers?hl=en

Reply via email to