Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

I want to customize the build process while still using the Android Eclipse ADT plug-in

With the ADT plug-in installed, the following builders are active for an Android project:

  • Android Resource Manager
  • Android Pre Compiler
  • Java Builder
  • Android Package Builder

Looking at the output directory, the following artifacts are created:

  • resources.ap_ (just an APK/ZIP with resources and no code)
  • gen/R.java (autogenerated list of resources)
  • .class files with java bytecode
  • classes.dex
  • ${project-name}.apk

For my project, I autogenerate several code artifacts and in general need tighter control of the build process. At first, I figured that the Resource Manager was responsible for creating resources.ap_, the precompiler created R.java, java builder did the obvious, and then the Android Package Builder created classes.dex, then combined classes.dex and resources.ap_ to create the APK file.

I disabled the first two steps and created a custom pre-builder that laid down a copy of resources.ap_, figuring this would be equivalent. No such luck.

Unfortunately, the final Android Package Builder seems to slurp the resources directly from res/ and ignores my resources.ap_. In fact, the first two build steps don't seem to do much other than generate R.java.

This is where it gets really problematic. If I disable the final build step and lay down my own APK file (with the exact same name), I get the following error:

[2011-02-27 20:25:28 - android-premium] ------------------------------
[2011-02-27 20:25:28 - android-premium] Android Launch!
[2011-02-27 20:25:28 - android-premium] adb is running normally.
[2011-02-27 20:25:28 - android-premium] Could not find android-premium.apk!

So I'm stuck: with the Android Package Builder (which has no discernable configuration), I have to supply individual ./res/ files. Without it, I can't get the project to launch on the device (not from Eclipse).

Anyone have any better ideas / experience in this space?

like image 609
Dave Dopson Avatar asked Feb 28 '11 04:02

Dave Dopson


People also ask

Which is the correct steps to setup ADT plugin?

Configuring the ADT PluginSelect Window > Preferences... to open the Preferences panel (Mac OS X: Eclipse > Preferences). Select Android from the left panel. For the SDK Location in the main panel, click Browse... and locate your downloaded SDK directory. Click Apply, then OK.

What is ADT plugin for Eclipse?

ADT (Android Development Tools) is required for developing the android application in the eclipse IDE. It is the plugin for Eclipse IDE that is designed to provide the integrated environment. For downloading the ADT, you need to follow these steps: 1) Start the eclipse IDE, then select Help > Install new software...

Can Eclipse make Android apps?

To do this, open Eclipse and Launch Android AVD Manager from options Window > AVD Manager and click on New which will create a successful Android Virtual Device. Use the screenshot below to enter the correct values. Voila! You have successfully created Android Application Development environment.


2 Answers

Regarding Ant scripts, the following is my all-in-one template of the Ant steps for building an Android app (this might be useful to others trying to translate the Eclipse build to Ant as it is much simpler and more transparent than the opaque version autogenerated with the android tools):

<property name="workspace.dir" value="/workspace" />
<property name="project.dir" location="." />
<property name="android-platform.name" value="android-1.5" />


<!-- Framework Paths -->
<property name="android-sdk.dir" value="${workspace.dir}/EpicFramework/android-sdk"/>
<property name="android-tools.dir" value="${android-sdk.dir}/tools" />
<property name="android-platform.dir" value="${android-sdk.dir}/platforms/${android-platform.name}" />
<property name="android-platform-tools.dir" value="${android-platform.dir}/tools"/>
<property name="android-platform-jar" value="${android-platform.dir}/android.jar"/>
<property name="android-framework-src.dir" value="${workspace.dir}/EpicFramework/EpicAndroid"/>

<!-- Tool Binaries -->
<property name="adb" value="${android-tools.dir}/adb"/>
<property name="apkbuilder" value="${android-tools.dir}/apkbuilder"/>
<property name="aapt" value="${android-platform-tools.dir}/aapt"/>
<property name="dx" value="${android-platform-tools.dir}/dx"/>

<!-- Project Paths -->
<property name="src.dir"   value="${project.dir}/src" />
<property name="gen.dir"   value="${project.dir}/gen" />
<property name="res.dir"   value="${project.dir}/res" />
<property name="lib.dir"   value="${project.dir}/lib" />
<property name="build.dir" value="${project.dir}/bin" />
<property name="build.classes.dir" value="${build.dir}/classes" />

<property name="resources.file" value="${build.dir}/resources.ap_"/>
<property name="dex.file" value="${build.dir}/classes.dex" />
<property name="debug-apk.file" value="${build.dir}/${ant.project.name}-debug.apk"/>


<target name="dirs">
    <echo>Creating output directories if needed...</echo>
    <mkdir dir="${res.dir}" />
    <mkdir dir="${gen.dir}" />
    <mkdir dir="${lib.dir}" />
    <mkdir dir="${build.dir}" />
    <mkdir dir="${build.classes.dir}" />
</target>

<target name="android-resource-src" depends="dirs">
    <echo>Generating R.java from the resources...</echo>
    <exec executable="${aapt}" failonerror="true">
        <arg value="package" />
        <arg value="-M" />
        <arg path="AndroidManifest.xml" />
        <arg value="-S" />
        <arg path="${res.dir}" />
        <arg value="-I" />
        <arg path="${android-platform-jar}" />
        <arg value="-m" />
        <arg value="-J" />
        <arg path="${gen.dir}" />
    </exec>
</target>

<target name="android-compile" depends="android-resource-src">
   <echo>Compiling java files into class files...</echo>
    <javac 
      encoding="ascii"
      target="1.5"
      debug="true"
      extdirs=""
      destdir="${build.classes.dir}"
      includeAntRuntime="false"
      bootclasspath="${android-platform-jar}">
        <src path="${android-framework-src.dir}" />
        <src path="${src.dir}" />
        <src path="${gen.dir}" />
        <classpath>
            <fileset dir="${lib.dir}" includes="*.jar"/>
        </classpath>
     </javac>
</target>

<target name="android-dex" depends="android-compile">
    <echo>Converting compiled files and 3rd party libraries into ${dex.file} ...</echo>
    <apply executable="${dx}" failonerror="true" parallel="true">
        <arg value="--dex" />
        <arg value="--output=${dex.file}" />
        <arg path="${build.classes.dir}" />
        <fileset dir="${lib.dir}" includes="*.jar"/>
    </apply>
</target>

<target name="android-package-resources">
    <echo>Packaging Android resources into ${resources.file} ...</echo>
    <exec executable="${aapt}" failonerror="true">
        <arg value="package" />
        <arg value="-M" />
        <arg path="AndroidManifest.xml" />
        <arg value="-S" />
        <arg path="./res" />
        <arg value="-I" />
        <arg path="${android-platform-jar}" />
        <arg value="-f" />
        <arg value="-F" />
        <arg value="${resources.file}" />
    </exec>
</target>

<target name="android-debug" depends="android-dex, android-package-resources">
    <echo>Packaging app and signing it with the debug key</echo>
    <exec executable="${apkbuilder}" failonerror="true">
        <arg value="${debug-apk.file}" />
        <arg value="-d" />
        <arg value="-z" />
        <arg value="${resources.file}/" />
        <arg value="-f" />
        <arg value="${dex.file}" />
    </exec>
</target>

<target name="android-release" depends="android-dex, android-package-resources">
    <echo>Packaging App without signing, so that it can be signed with the official publishing key ...</echo>
    <exec executable="${apkbuilder}" failonerror="true">
        <arg value="${release-apk.file}" />
        <arg value="-u" />
        <arg value="-d" />
        <arg value="-z" />
        <arg value="${resources.file}/" />
        <arg value="-f" />
        <arg value="${dex.file}" />
    </exec>
    <echo>All generated packages need to be signed with jarsigner before they are published.</echo>
</target>

<target name="android-install" depends="android-debug">
    <echo>Removing all com.epicapplications APK files from default emulator ...</echo>
    <exec executable="${adb}" inputstring="echo hi; rm -f /data/app/com.epicapplications.*; exit;
    ">
        <arg value="shell"/>
    </exec>
    <echo>Installing ${debug-apk.file} onto default emulator...</echo>
    <exec executable="${adb}" failonerror="true">
        <arg value="install" />
        <arg value="-r" />
        <arg path="${debug-apk.file}" />
    </exec>
</target>

What I am looking for is to be able to use all or fragments of this Ant build script, but still have the Eclipse integration for launching and debugging the app.

like image 170
Dave Dopson Avatar answered Nov 12 '22 01:11

Dave Dopson


We have used Ant scripts to do the build process for android projects, others have also used Maven. These help as then you can script them to run every day as part of nightly builds, as a part of your CI build system. At an advanced level you can script this to do release builds complete with release tags, pre-compilation and post-compilation AndroidManifest.xml modifications and signing.

like image 35
omermuhammed Avatar answered Nov 12 '22 00:11

omermuhammed