There is a much better way to do this. I have outlined it in a prior
post, but I don't have time to dig it out or recreate it tonight.

I'm planning to turn it into a blog post at some point.

Basically, you do not need conditional compilation. The *only* Java
code which needs to change is the generated R.java file -- and even
that you should be able to generate correctly, though I wasn't able to
get it to work.

It can all be done with an ant script. The manifest needs to be
processed. It's helpful to process some resource files -- for example,
to embed the version number, etc. XSLT is your friend here, it's much
easier to manipulate XML than to deal with all the issues with
preprocessing -- including completely screwing up line numbers, in
most cases, but commenting out rather than omitting lines should avoid
that!

To avoid screwing up the debug cycle, I produce by default a dev
version, which gives access to both free and pro functionality for
test and debug.

It works really well, but there's a few quirks I wish I had time to
explain just now; I hope I covered them in my earlier message, which I
hope you can find...

Feel free to bug me more on the topic after April 1.

On Mar 30, 5:45 pm, John Seghers <jsegh...@cequint.com> wrote:
> In the J2ME world of wildly non-conforming implementations,
> conditional compilation is the norm. Sun even admited it by adding
> "configurations" (IIRC) to NetBeans 5. EclipseMe (Now the official
> Eclipse Mobile Tools for Java project--MTJ) has support for it, as
> does the Antenna extension to Ant.
>
> The most common method currently is to use a construction such as
> //#if CONDITIONAL
> ...
> //#endif
> This shields the conditional statement from language-aware but
> conditional-unaware editors. The build system then comments out the
> intervening lines of code if the condition is not met. I've used
> everything from ant processing to running the full Java code (and even
> XML files) through the C++ preprocessor for macro expansion.
>
> In Android, especially when trying to maintain two versions of a
> product (Free vs. Paid, for example) conditional compilation (or
> parallel code trees) is mandatory because the package names must
> change (at least in the manifest).  This is one case where the if
> (const) blocks will not work.  If there is a better way of handling
> this, please enlighten us.
>
> I haven't yet tackled this problem in the Android dev environment
> because it tends to disrupt the debug part of the edit-compile-debug-
> edit cycle. What I have done is to add an eclipse builder to run a
> perl script to generate a Java interface (in the gen/ directory) that
> defines constants for build time/number pulled from Team Foundation
> Server. This allows automatic version stamping for the about screen--
> though does not yet modify the version name/number in the manifest.
>
> On Mar 30, 9:42 am, Bob Kerns <r...@acm.org> wrote:
>
>
>
> > You can download a Java decompiler and investigate yourself. I suggest
> > this one:http://java.decompiler.free.fr/?q=jdgui
>
> > You'll see that it does indeed optimize when it can.
>
> > However, unlike a C file which gets linked into a .so or .dll or an
> > executable, Java classes may be combined in different ways.
>
> > So it cannot optimize away static final references in other classes,
> > because those may change.
>
> > However, tools like ProGuard can do so, because they work on an entire
> > application.
>
> > But remember, once you do something like this, that code can never be
> > used in a context with a different valiue.
>
> > It virtually never makes sense to do this for conditional compilation
> > reasons. Sometimes it makes sense to generate code (the Android tools
> > do in fact generate a couple of files). In the rare case you do need
> > to eliminate code due to extremely tight performance constraints or
> > size constraints, I'd recommend the ProGuard route, as it will do a
> > FAR more thorough job than you can do manually with conditional
> > compilation.
>
> > On Mar 30, 8:12 am, "Kevin S." <dada...@gmail.com> wrote:
>
> > >   It really isn't very easy to do this.  In general, you can do
> > > something like
>
> > > public class MyClass
> > > {
> > >    public static final boolean  HAS_CHEEZBURGER=true;
>
> > >    public void someMethod()
> > >    {
> > >        if( MyClass.HAS_CHEEZBURGER)
> > >        {
> > >            doCheezburger();
> > >        } else
> > >        {
> > >            noCheezBurger();
> > >        }
> > >    }
>
> > > }
>
> > >    The compiler I think will see that HAS_CHEEZBURGER is constant and
> > > can never change, and may optimize away the branch not taken.  Perhaps
> > > some more knowledgeable folk could comment on that.
>
> > >   If on the otherhand, you really really think you need to do
> > > preprocessing using eclipse and Java, you can.   See the following
> > > link.
>
> > >http://www.boldinventions.com/index.php?option=com_content&view=artic...
>
> > > -Kevin
>
> > > On Mar 30, 5:57 am, Dilip Dilip <dileep2m...@gmail.com> wrote:
>
> > > > Hi All,
> > > >  How to do conditional compilation in JAVA.
>
> > > > something like in C, C++ :
>
> > > > #ifdef TRUE_CONDITION
>
> > > > #else
>
> > > > #endif
>
> > > > Thanks and Regards,
> > > >   Dileep- Hide quoted text -
>
> > - Show quoted text -

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

To unsubscribe, reply using "remove me" as the subject.

Reply via email to