Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to generate android apk with Prebop using Ant

I'm working on an Android project that need multiple versions from the same codebase (e.g. Lite/Pro) but Java doesn't allow preprocessing directives. A search on Google only throws this this tutorial about the Prebop preprocessor. The problem is that the tutorial is not for Android and I don't know how to generate the apk after compile given an specific version. This is the ant code:

<?xml version="1.0"?>
<project name="Hello" default="compile" basedir=".">
    <property file="local.properties" />
    <property file="ant.properties" />
    <loadproperties srcFile="project.properties" />
    <property name="android-home" value="../android-sdks" />
    <property name="android-version" value="3" />
    <property name="android-platform-specific" value="${android-home}/platforms/android-${android-version}" />
    <property name="android-jar" value="${android-platform-specific}/android.jar" />
    <property name="android-tools" value="${android-home}/platform-tools" />
    <property name="resource-folder" value="res" />
    <property name="gen-folder" value="gen" />

    <property name="src" location="src" />

    <property name="tmpfolder" value="/tmp/Hello" />
    <property name="src_lite" value="${tmpfolder}/src_lite"/>
    <property name="src_pro" value="${tmpfolder}/src_pro"/>   

    <property name="build" location="bin" />
    <property name="build_lite" value="${build}/lite"/>
    <property name="build_pro" value="${build}/pro"/>   

    <property name="out-folder" value="${build_lite}" />
    <property name="dex-file" value="classes.dex" />
    <property name="intermediate-dex" value="${out-folder}/${dex-file}" />
    <property name="external-libs-folder" value="bin/lite" />
    <property name="out-classes" value="${out-folder}/classes" />
    <property name="out-classes-location" value="./${out-classes}"/>

    <target name="clean">
        <delete dir="${tmpfolder}" />
        <delete dir="${build}" />
    </target>

    <target name="makedir">
        <mkdir dir="${src_lite}" />
        <mkdir dir="${src_pro}" />
        <mkdir dir="${build_lite}" />
        <mkdir dir="${build_pro}" />
    </target>

    <target name="resource-src" depends="makedir">
        <echo>Generating R.java / Manifest.java from the resources...</echo>
        <exec executable="${android-tools}/aapt.exe" failonerror="true">
            <arg value="package" />
            <arg value="-m" />
            <arg value="-J" />
            <arg path="${gen-folder}" />
            <arg value="-M" />
            <arg path="AndroidManifest.xml" />
            <arg value="-S" />
            <arg path="${resource-folder}" />
            <arg value="-I" />
            <arg path="${android-jar}" />
            <arg value="--custom-package" />
            <arg value="com.pack.name" />
        </exec>
    </target>

    <target name="copysource">
        <copy todir="${src_lite}"><fileset dir="src" /></copy>
        <copy todir="${src_pro}"><fileset dir="src" /></copy>
    </target>

    <target name="splitsource"  description="preprocessor">
        <preprocess indir="${src}" outdir="${src_lite}" out="replace">
            <var name="pro" value="false"/>
            <filetype commentend="*/" commentbegin="/*" extensions="java"/>
        </preprocess>
        <preprocess indir="${src}" outdir="${src_pro}" out="replace">
            <var name="pro" value="true"/>
            <filetype commentend="*/" commentbegin="/*" extensions="java"/>
        </preprocess>
    </target>

    <target name="compile" depends="makedir, copysource">
        <javac srcdir="${src_lite}" destdir="${build_lite}" includeantruntime="false">
            <classpath>
                <path id="application" location="${android-jar}"/>
                <path id="application" location="src" />
                <path id="application" location="res" />
            </classpath>
        </javac>
        <javac srcdir="${src_pro}" destdir="${build_pro}" includeantruntime="false">
            <classpath>
                <path id="application" location="${android-jar}"/>
                <path id="application" location="src" />
                <path id="application" location="res" />
            </classpath>
        </javac>
    </target>
    <import file="${sdk.dir}/tools/ant/build.xml" />
</project>

I hope someone can give me directions because is quite frustrating develop with multiple API's on Android.

like image 431
Raomon Avatar asked Nov 20 '25 18:11

Raomon


1 Answers

You should (at least) add "splitsource" dependency to "compile" target instead "copysource", so class files are generated with pre-processed java ones.

like image 109
azafel Avatar answered Nov 23 '25 07:11

azafel



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!