1. Are you ready for the Galaxy S20? Here is everything we know so far!

Apps Hi: Issues with building with ProGuard

Discussion in 'Android Development' started by kun007, Feb 14, 2011.

  1. kun007

    kun007 Lurker
    Thread Starter

    Hi,

    This is Kuntal. I'm new in this forum. Just started working on Android, and recently trying to optimize & Obfuscate my code with ProGuard. But running into some issues now. Couldn't find any solution on the web for this yet.

    When I try to build my app using Ant, I get the following error:

    BUILD FAILED
    C:\DEV\StockViewer\build.xml:350: aaptexec doesn't support the "apkbasename" attribute

    I used to get the error of "basename" attribute not found, but then I updated Ant to 1.8.2 & I used the build.xml file from the Android SDK itself.

    Any help is greatly aprpeciated. I'm attaching the build.xml file below:

    <?xml version="1.0" encoding="UTF-8"?>
    <project name="StockViewer" default="help">

    <!-- The local.properties file is created and updated by the 'android' tool.
    It contains the path to the SDK. It should *NOT* be checked in in Version
    Control Systems. -->
    <property file="local.properties" />

    <!-- The build.properties file can be created by you and is never touched
    by the 'android' tool. This is the place to change some of the default property values
    used by the Ant rules.
    Here are some properties you may want to change/update:

    application.package
    the name of your application package as defined in the manifest. Used by the
    'uninstall' rule.
    source.dir
    the name of the source directory. Default is 'src'.
    out.dir
    the name of the output directory. Default is 'bin'.

    Properties related to the SDK location or the project target should be updated
    using the 'android' tool with the 'update' action.

    This file is an integral part of the build system for your application and
    should be checked in in Version Control Systems.

    -->
    <property file="build.properties" />

    <!-- The default.properties file is created and updated by the 'android' tool, as well
    as ADT.
    This file is an integral part of the build system for your application and
    should be checked in in Version Control Systems. -->
    <property file="default.properties" />

    <!-- Custom Android task to deal with the project target, and import the proper rules.
    This requires ant 1.6.0 or above. -->
    <path id="android.antlibs">
    <pathelement path="${sdk.dir}/tools/lib/anttasks.jar" />
    <pathelement path="${sdk.dir}/tools/lib/sdklib.jar" />
    <pathelement path="${sdk.dir}/tools/lib/androidprefs.jar" />
    <pathelement path="${sdk.dir}/tools/lib/apkbuilder.jar" />
    <pathelement path="${sdk.dir}/tools/lib/jarutils.jar" />
    </path>

    <taskdef name="setup" classname="com.android.ant.SetupTask" classpathref="android.antlibs" />

    <!-- Execute the Android Setup task that will setup some properties specific to the target,
    and import the build rules files.

    The rules file is imported from
    <SDK>/platforms/<target_platform>/templates/android_rules.xml

    To customize some build steps for your project:
    - copy the content of the main node <project> from android_rules.xml
    - paste it in this build.xml below the <setup /> task.
    - disable the import by changing the setup task below to <setup import="false" />

    This will ensure that the properties are setup correctly but that your customized
    build steps are used.
    -->
    <setup import="false"/>

    <!-- Below is the area imported from platforms\android-4\templates\android_rules.xml -->

    <!--
    This rules file is meant to be imported by the custom Ant task:
    com.android.ant.SetupTask

    The following properties are put in place by the importing task:
    android.jar, android.aidl, aapt, aidl, and dx

    Additionnaly, the task sets up the following classpath reference:
    android.target.classpath
    This is used by the compiler task as the boot classpath.
    -->

    <path id="android.libraries.src"><path refid="project.libraries.src" /></path>
    <path id="android.libraries.jars"><path refid="project.libraries.jars" /></path>

    <!-- Custom tasks -->
    <taskdef name="aaptexec"
    classname="com.android.ant.AaptExecLoopTask"
    classpathref="android.antlibs" />

    <taskdef name="apkbuilder"
    classname="com.android.ant.ApkBuilderTask"
    classpathref="android.antlibs" />

    <taskdef name="xpath"
    classname="com.android.ant.XPathTask"
    classpathref="android.antlibs" />

    <!-- Properties -->

    <!-- Tells adb which device to target. You can change this from the command line
    by invoking "ant -Dadb.device.arg=-d" for device "ant -Dadb.device.arg=-e" for
    the emulator. -->
    <property name="adb.device.arg" value="" />

    <property name="android.tools.dir" location="${sdk.dir}/tools" />
    <!-- Name of the application package extracted from manifest file -->
    <xpath input="AndroidManifest.xml" expression="/manifest/@package"
    output="manifest.package" />
    <!-- Value of the debuggable attribute (Application node) extracted from manifest file -->
    <xpath input="AndroidManifest.xml" expression="/manifest/application/@android:debuggable"
    output="manifest.debuggable" default="false"/>

    <!-- Input directories -->
    <property name="source.dir" value="src" />
    <property name="source.absolute.dir" location="${source.dir}" />
    <property name="gen.dir" value="gen" />
    <property name="gen.absolute.dir" location="${gen.dir}" />
    <property name="resource.dir" value="res" />
    <property name="resource.absolute.dir" location="${resource.dir}" />
    <property name="asset.dir" value="assets" />
    <property name="asset.absolute.dir" location="${asset.dir}" />

    <!-- Directory for the third party java libraries -->
    <property name="external.libs.dir" value="libs" />
    <property name="external.libs.absolute.dir" location="${external.libs.dir}" />

    <!-- Directory for the native libraries -->
    <property name="native.libs.dir" value="libs" />
    <property name="native.libs.absolute.dir" location="${native.libs.dir}" />

    <!-- Output directories -->
    <property name="out.dir" value="bin" />
    <property name="out.absolute.dir" location="${out.dir}" />
    <property name="out.classes.dir" value="${out.absolute.dir}/classes" />
    <property name="out.classes.absolute.dir" location="${out.classes.dir}" />

    <!-- Intermediate files -->
    <property name="dex.file.name" value="classes.dex" />
    <property name="intermediate.dex.file" location="${out.absolute.dir}/${dex.file.name}" />

    <!-- The final package file to generate -->
    <property name="out.debug.unaligned.package"
    location="${out.absolute.dir}/${ant.project.name}-debug-unaligned.apk" />
    <property name="out.debug.package"
    location="${out.absolute.dir}/${ant.project.name}-debug.apk" />
    <property name="out.unsigned.package"
    location="${out.absolute.dir}/${ant.project.name}-unsigned.apk" />
    <property name="out.unaligned.package"
    location="${out.absolute.dir}/${ant.project.name}-unaligned.apk" />
    <property name="out.release.package"
    location="${out.absolute.dir}/${ant.project.name}-release.apk" />

    <!-- Verbosity -->
    <property name="verbose" value="false" />
    <!-- This is needed by emma as it uses multilevel verbosity instead of simple 'true' or 'false'
    The property 'verbosity' is not user configurable and depends exclusively on 'verbose'
    value.-->
    <condition property="verbosity" value="verbose" else="quiet">
    <istrue value="${verbose}" />
    </condition>
    <!-- This is needed to switch verbosity of zipalign. Depends exclusively on 'verbose'
    -->
    <condition property="v.option" value="-v" else="">
    <istrue value="${verbose}" />
    </condition>
    <!-- This is needed to switch verbosity of dx. Depends exclusively on 'verbose' -->
    <condition property="verbose.option" value="--verbose" else="">
    <istrue value="${verbose}" />
    </condition>

    <!-- Tools -->
    <condition property="exe" value=".exe" else=""><os family="windows" /></condition>
    <property name="adb" location="${android.tools.dir}/adb${exe}" />
    <property name="zipalign" location="${android.tools.dir}/zipalign${exe}" />

    <!-- Emma configuration -->
    <property name="emma.dir" value="${sdk.dir}/tools/lib" />
    <path id="emma.lib">
    <pathelement location="${emma.dir}/emma.jar" />
    <pathelement location="${emma.dir}/emma_ant.jar" />
    </path>
    <taskdef resource="emma_ant.properties" classpathref="emma.lib" />
    <!-- End of emma configuration -->

    <!-- Macros -->

    <!-- Configurable macro, which allows to pass as parameters output directory,
    output dex filename and external libraries to dex (optional) -->
    <macrodef name="dex-helper">
    <element name="external-libs" optional="yes" />
    <element name="extra-parameters" optional="yes" />
    <sequential>
    <echo>Converting compiled files and external libraries into ${intermediate.dex.file}...</echo>
    <apply executable="${dx}" failonerror="true" parallel="true">
    <arg value="--dex" />
    <arg value="--output=${intermediate.dex.file}" />
    <extra-parameters />
    <arg line="${verbose.option}" />
    <arg path="${out.classes.absolute.dir}" />
    <fileset dir="${external.libs.absolute.dir}" includes="*.jar" />
    <path refid="android.libraries.jars" />
    <external-libs />
    </apply>
    </sequential>
    </macrodef>

    <!-- This is macro that enable passing variable list of external jar files to ApkBuilder
    Example of use:
    <package-helper sign.package="true">
    <extra-jars>
    <jarfolder path="my_jars" />
    <jarfile path="foo/bar.jar" />
    <jarfolder path="your_jars" />
    </extra-jars>
    </package-helper> -->
    <macrodef name="package-helper">
    <attribute name="sign.package" />
    <element name="extra-jars" optional="yes" />
    <sequential>
    <apkbuilder
    outfolder="${out.absolute.dir}"
    basename="${ant.project.name}"
    signed="@{sign.package}"
    debug="${manifest.debuggable}"
    verbose="${verbose}">
    <file path="${intermediate.dex.file}" />
    <sourcefolder path="${source.absolute.dir}" />
    <sourcefolder refid="android.libraries.src" />
    <jarfolder path="${external.libs.absolute.dir}" />
    <jarfolder refid="android.libraries.libs" />
    <nativefolder path="${native.libs.absolute.dir}" />
    <nativefolder refid="android.libraries.libs" />
    <extra-jars/>
    </apkbuilder>
    </sequential>
    </macrodef>

    <!-- This is macro which zipaligns in.package and outputs it to out.package. Used by targets
    debug, -debug-with-emma and release.-->
    <macrodef name="zipalign-helper">
    <attribute name="in.package" />
    <attribute name="out.package" />
    <sequential>
    <echo>Running zip align on final apk...</echo>
    <exec executable="${zipalign}" failonerror="true">
    <arg line="${v.option}" />
    <arg value="-f" />
    <arg value="4" />
    <arg path="@{in.package}" />
    <arg path="@{out.package}" />
    </exec>
    </sequential>
    </macrodef>

    <!-- This is macro used only for sharing code among two targets, -install and
    -install-with-emma which do exactly the same but differ in dependencies -->
    <macrodef name="install-helper">
    <sequential>
    <echo>Installing ${out.debug.package} onto default emulator or device...</echo>
    <exec executable="${adb}" failonerror="true">
    <arg line="${adb.device.arg}" />
    <arg value="install" />
    <arg value="-r" />
    <arg path="${out.debug.package}" />
    </exec>
    </sequential>
    </macrodef>

    <!-- Rules -->

    <!-- Creates the output directories if they don't exist yet. -->
    <target name="-dirs">
    <echo>Creating output directories if needed...</echo>
    <mkdir dir="${resource.absolute.dir}" />
    <mkdir dir="${external.libs.absolute.dir}" />
    <mkdir dir="${gen.absolute.dir}" />
    <mkdir dir="${out.absolute.dir}" />
    <mkdir dir="${out.classes.absolute.dir}" />
    </target>

    <!-- Generates the R.java file for this project's resources. -->
    <target name="-resource-src" depends="-dirs">
    <echo>Generating R.java / Manifest.java from the resources...</echo>
    <aaptexec executable="${aapt}"
    command="package"
    verbose="${verbose}"
    manifest="AndroidManifest.xml"
    androidjar="${android.jar}"
    rfolder="${gen.absolute.dir}">
    <res path="${resource.absolute.dir}" />
    </aaptexec>
    </target>

    <!-- Generates java classes from .aidl files. -->
    <target name="-aidl" depends="-dirs">
    <echo>Compiling aidl files into Java classes...</echo>
    <apply executable="${aidl}" failonerror="true">
    <arg value="-p${android.aidl}" />
    <arg value="-I${source.absolute.dir}" />
    <arg value="-o${gen.absolute.dir}" />
    <fileset dir="${source.absolute.dir}">
    <include name="**/*.aidl" />
    </fileset>
    </apply>
    </target>

    <!-- Compiles this project's .java files into .class files. -->
    <target name="compile" depends="-resource-src, -aidl"
    description="Compiles project's .java files into .class files">
    <!-- If android rules are used for a test project, its classpath should include
    tested project's location -->
    <condition property="extensible.classpath"
    value="${tested.project.absolute.dir}/bin/classes" else=".">
    <isset property="tested.project.absolute.dir" />
    </condition>
    <condition property="extensible.libs.classpath"
    value="${tested.project.absolute.dir}/libs" else="./libs">
    <isset property="tested.project.absolute.dir" />
    </condition>
    <javac encoding="ascii" target="1.5" debug="true" extdirs=""
    destdir="${out.classes.absolute.dir}"
    bootclasspathref="android.target.classpath"
    verbose="${verbose}" classpath="${extensible.classpath}"
    classpathref="android.libraries.jars">
    <src path="${source.absolute.dir}" />
    <src path="${gen.absolute.dir}" />
    <src refid="android.libraries.src" />
    <classpath>
    <fileset dir="${external.libs.absolute.dir}" includes="*.jar" />
    <fileset dir="${extensible.libs.classpath}" includes="*.jar" />
    </classpath>
    </javac>
    </target>

    <!-- Converts this project's .class files into .dex files -->
    <target name="-dex" depends="compile">
    <dex-helper />
    </target>

    <!-- Puts the project's resources into the output package file
    This actually can create multiple resource package in case
    Some custom apk with specific configuration have been
    declared in default.properties.
    -->
    <target name="-package-resources">
    <echo>Packaging resources</echo>
    <aaptexec executable="${aapt}"
    command="package"
    manifest="AndroidManifest.xml"
    assets="${asset.absolute.dir}"
    androidjar="${android.jar}"
    apkfolder="${out.absolute.dir}"
    apkbasename="${ant.project.name}">
    <res path="${resource.absolute.dir}" />
    <!-- <nocompress /> forces no compression on any files in assets or res/raw -->
    <!-- <nocompress extension="xml" /> forces no compression on specific file extensions in assets and res/raw -->
    </aaptexec>
    </target>

    <!-- Packages the application and sign it with a debug key. -->
    <target name="-package-debug-sign" depends="-dex, -package-resources">
    <package-helper sign.package="true" />
    </target>

    <!-- Packages the application without signing it. -->
    <target name="-package-release" depends="-dex, -package-resources">
    <package-helper sign.package="false" />
    </target>

    <target name="-compile-tested-if-test" if="tested.project.dir" unless="do.not.compile.again">
    <subant target="compile">
    <fileset dir="${tested.project.absolute.dir}" includes="build.xml" />
    </subant>
    </target>

    <!-- Builds debug output package, provided all the necessary files are already dexed -->
    <target name="debug" depends="-compile-tested-if-test, -package-debug-sign"
    description="Builds the application and signs it with a debug key.">
    <zipalign-helper in.package="${out.debug.unaligned.package}"
    out.package="${out.debug.package}" />
    <echo>Debug Package: ${out.debug.package}</echo>
    </target>

    <target name="-release-check">
    <condition property="release.sign">
    <and>
    <isset property="key.store" />
    <isset property="key.alias" />
    </and>
    </condition>
    </target>

    <target name="-release-nosign" depends="-release-check" unless="release.sign">
    <echo>No key.store and key.alias properties found in build.properties.</echo>
    <echo>Please sign ${out.unsigned.package} manually</echo>
    <echo>and run zipalign from the Android SDK tools.</echo>
    </target>

    <target name="release" depends="-package-release, -release-nosign" if="release.sign"
    description="Builds the application. The generated apk file must be signed before
    it is published.">
    <!-- Gets passwords -->
    <input
    message="Please enter keystore password (store:${key.store}):"
    addproperty="key.store.password" />
    <input
    message="Please enter password for alias '${key.alias}':"
    addproperty="key.alias.password" />

    <!-- Signs the APK -->
    <echo>Signing final apk...</echo>
    <signjar
    jar="${out.unsigned.package}"
    signedjar="${out.unaligned.package}"
    keystore="${key.store}"
    storepass="${key.store.password}"
    alias="${key.alias}"
    keypass="${key.alias.password}"
    verbose="${verbose}" />

    <!-- Zip aligns the APK -->
    <zipalign-helper in.package="${out.unaligned.package}"
    out.package="${out.release.package}" />
    <echo>Release Package: ${out.release.package}</echo>
    </target>

    <target name="install" depends="debug"
    description="Installs/reinstalls the debug package onto a running
    emulator or device. If the application was previously installed,
    the signatures must match." >
    <install-helper />
    </target>

    <target name="-uninstall-check">
    <condition property="uninstall.run">
    <isset property="manifest.package" />
    </condition>
    </target>

    <target name="-uninstall-error" depends="-uninstall-check" unless="uninstall.run">
    <echo>Unable to run 'ant uninstall', manifest.package property is not defined.
    </echo>
    </target>

    <!-- Uninstalls the package from the default emulator/device -->
    <target name="uninstall" depends="-uninstall-error" if="uninstall.run"
    description="Uninstalls the application from a running emulator or device.">
    <echo>Uninstalling ${manifest.package} from the default emulator or device...</echo>
    <exec executable="${adb}" failonerror="true">
    <arg line="${adb.device.arg}" />
    <arg value="uninstall" />
    <arg value="${manifest.package}" />
    </exec>
    </target>

    <target name="clean" description="Removes output files created by other targets.">
    <delete dir="${out.absolute.dir}" verbose="${verbose}" />
    <delete dir="${gen.absolute.dir}" verbose="${verbose}" />
    </target>

    <!-- Targets for code-coverage measurement purposes, invoked from external file -->

    <!-- Emma-instruments tested project classes (compiles the tested project if necessary)
    and writes instrumented classes to ${instrumentation.absolute.dir}/classes -->
    <target name="-emma-instrument" depends="compile">
    <echo>Instrumenting classes from ${out.absolute.dir}/classes...</echo>
    <!-- It only instruments class files, not any external libs -->
    <emma enabled="true">
    <instr verbosity="${verbosity}"
    mode="overwrite"
    instrpath="${out.absolute.dir}/classes"
    outdir="${out.absolute.dir}/classes">
    </instr>
    <!-- TODO: exclusion filters on R*.class and allowing custom exclusion from
    user defined file -->
    </emma>
    </target>

    <target name="-dex-instrumented" depends="-emma-instrument">
    <dex-helper>
    <extra-parameters>
    <arg value="--no-locals" />
    </extra-parameters>
    <external-libs>
    <fileset file="${emma.dir}/emma_device.jar" />
    </external-libs>
    </dex-helper>
    </target>

    <!-- Invoked from external files for code coverage purposes -->
    <target name="-package-with-emma" depends="-dex-instrumented, -package-resources">
    <package-helper sign.package="true">
    <extra-jars>
    <!-- Injected from external file -->
    <jarfile path="${emma.dir}/emma_device.jar" />
    </extra-jars>
    </package-helper>
    </target>

    <target name="-debug-with-emma" depends="-package-with-emma">
    <zipalign-helper in.package="${out.debug.unaligned.package}"
    out.package="${out.debug.package}" />
    </target>

    <target name="-install-with-emma" depends="-debug-with-emma">
    <install-helper />
    </target>

    <!-- End of targets for code-coverage measurement purposes -->

    <target name="help">
    <!-- displays starts at col 13
    |13 80| -->
    <echo>Android Ant Build. Available targets:</echo>
    <echo> help: Displays this help.</echo>
    <echo> clean: Removes output files created by other targets.</echo>
    <echo> compile: Compiles project's .java files into .class files.</echo>
    <echo> debug: Builds the application and signs it with a debug key.</echo>
    <echo> release: Builds the application. The generated apk file must be</echo>
    <echo> signed before it is published.</echo>
    <echo> install: Installs/reinstalls the debug package onto a running</echo>
    <echo> emulator or device.</echo>
    <echo> If the application was previously installed, the</echo>
    <echo> signatures must match.</echo>
    <echo> uninstall: Uninstalls the application from a running emulator or</echo>
    <echo> device.</echo>
    </target>

    <!-- ================================================================ -->
    <!-- Below are our custom targets. -->
    <!-- ================================================================ -->

    <!-- In newer platforms, the build setup tasks were updated to begin using
    ${android.jar} instead of ${android-jar}. This makes it compatible. -->
    <target name="target-new-vars" unless="android-jar">
    <property name="android-jar" value="${android.jar}"/>
    </target>

    <!-- Copy Config.java to our source tree, replacing custom tokens with
    values in build.properties. The configuration depends on "clean"
    because otherwise the build system will not detect changes in the
    configuration. -->
    <target name="config" depends="target-new-vars,clean">

    <property name="config-target-path" value="${source.dir}/com/schwab/kuntal"/>

    <!-- Copy the configuration file, replacing tokens in the file. -->
    <copy file="config/Config.java" todir="${config-target-path}"
    overwrite="true" encoding="utf-8">
    <filterset>
    <filter token="CONFIG.LOGGING" value="${config.logging}"/>
    </filterset>
    </copy>

    <!-- Now set it to read-only, as we don't want people accidentally
    editing the wrong one. NOTE: This step is unnecessary, but I do
    it so the developers remember that this is not the original file. -->
    <chmod file="${config-target-path}/Config.java" perm="-w"/>
    <attrib file="${config-target-path}/Config.java" readonly="true"/>

    </target>

    <!-- ================================================================ -->
    <!-- Obfuscation with ProGuard -->
    <!-- ================================================================ -->

    <property name="proguard-dir" value="proguard"/>
    <property name="unoptimized" value="${proguard-dir}/unoptimized.jar"/>
    <property name="optimized" value="${proguard-dir}/optimized.jar"/>

    <target name="optimize" unless="nooptimize">
    <jar basedir="${out.classes.dir}" destfile="${unoptimized}"/>

    <java jar="${proguard-dir}/proguard.jar" fork="true" failonerror="true">
    <jvmarg value="-Dmaximum.inlined.code.length=16"/>
    <arg value="@${proguard-dir}/config.txt"/>
    <arg value="-injars ${unoptimized}"/>
    <arg value="-outjars ${optimized}"/>
    <arg value="-libraryjars '${android.jar}';'${external.libs.absolute.dir}/gson-1.6.jar'"/>
    </java>

    <!-- Delete source pre-optimized jar -->
    <!--delete file="${unoptimized}"/-->

    <!-- Unzip target optimization jar to original output, and delete optimized.jar -->
    <delete dir="${out.classes.dir}"/>
    <mkdir dir="${out.classes.dir}"/>
    <unzip src="${proguard-dir}/optimized.jar" dest="${out.classes.dir}"/>

    <!-- Delete optimized jar (now unzipped into bin directory) -->
    <delete file="optimized.jar"/>

    </target>


    </project>
     

    Advertisement

  2. NightAngel79

    NightAngel79 Bounty Hunter
    Administrator

    Welcome to Android Forums!! Was just gonna post this link and refer you to the developer section but since that just HAD to take forever to type i will just move this thread there instead:D
    Application Development - Android Forums
     
Loading...

Share This Page

Loading...