I would prefer not to make it statically linked because I am not the one 
writing the plugins. Each plugin is potentially going to be on a different 
branch of a repository, and I would like to code to continue working 
without undue hardship when I switch branches. Different versions of the 
project files specifying static dependencies on each branch is an option, 
but not a good one.

Where the classes will be loaded from is precisely the issue. 
DexClassLoader can either take a jar containing a classes.dex or an apk. I 
mentioned both options in the original post. I'm fairly certain I can get 
things working using the jar approach, but it is inelegant in some 
respects. I prefer the paradigm of installing an apk to install a plugin, 
and therefore I need to figure out how to explicitly exclude certain 
dependencies from being included in the apk.

On Tuesday, October 2, 2012 4:11:20 PM UTC-4, Kristopher Micinski wrote:
>
> So wait, I'm not clear, why can't this be statically linked, and why 
> is this a plugin type architecture.. 
>
> It seems like you're trying to get code reuse, but still, I'm not sure 
> why something like a ClassLoader is required from.  From where will 
> the classes be loaded? 
>
> kris 
>
> On Tue, Oct 2, 2012 at 3:51 PM, Lindley <[email protected] <javascript:>> 
> wrote: 
> > I'll give a little more detail. The Impl class is supposed to be one of 
> > several pure-java implementations of the service in Main that I might 
> drop 
> > in. The purpose of Main is to abstract all Android-specific code away 
> from 
> > this implementation. In particular, the service in Main *already* has an 
> > AIDL interface, so putting on in Impl would just be silly. 
> > 
> > 
> > On Tuesday, October 2, 2012 3:47:52 PM UTC-4, Lindley wrote: 
> >> 
> >> For a variety of reasons, most notably because the plug-in portion is 
> not 
> >> supposed to be Android-specific, I don't want to use AIDL here. 
> >> 
> >> Static linking is a fallback option. I don't like it but I'll do it if 
> >> that's the only way. There really ought to be a cleaner fix for this. 
> >> 
> >> On Tuesday, October 2, 2012 3:31:58 PM UTC-4, Kristopher Micinski 
> wrote: 
> >>> 
> >>> So instead of doing this (ClassLoaders being bad...), I would use an 
> >>> AIDL service stub for the methods you needed... 
> >>> 
> >>> Alternatively, I would suggest you look at using an Android library 
> >>> project, if you can statically link. 
> >>> 
> >>> What kinds of things do you need. 
> >>> 
> >>> Multiple functional looks very much like you might want a single app, 
> >>> and not a collection of plugins. 
> >>> 
> >>> kris 
> >>> 
> >>> On Tue, Oct 2, 2012 at 3:00 PM, Lindley <[email protected]> wrote: 
> >>> > 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] <javascript:> 
> >>> > For more options, visit this group at 
> >>> > http://groups.google.com/group/android-developers?hl=en 
> > 
> > -- 
> > 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]<javascript:> 
> > To unsubscribe from this group, send email to 
> > [email protected] <javascript:> 
> > For more options, visit this group at 
> > http://groups.google.com/group/android-developers?hl=en 
>

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