使用ant构建时,com.android.ant.ApkBuilderTask.exe中的NullPointerException

时间:2010-09-26 19:10:36

标签: android ant

我配置我的android项目使用ant。使用关键字版本构建时,它会失败并显示以下消息:

java.lang.NullPointerException
at com.android.ant.ApkBuilderTask.execute(ApkBuilderTask.java:239)
at org.apache.tools.ant.UnknownElement.execute(UnknownElement.java:291)
at sun.reflect.GeneratedMethodAccessor4.invoke(Unknown Source)

它在build.xml第249行失败,其中包含:

<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}">  **LINE 249 IS HERE**
           <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>

从401行调用,其中包含以下行:

<target name="-package-release" depends="-dex, -package-resources">
    <package-helper sign.package="false" />
</target>

看起来ApkBuilderTask.java存在一些问题,但我不知道如何/在哪里获取ApkBuilderTask.java的源代码。有没有人遇到这个问题并找到了解决方案?如果有帮助,我正在使用android SDK工具修订版7。

注意:运行“ant debug”或“ant release”都会产生相同的结果。

3 个答案:

答案 0 :(得分:1)

这是r7工具中引入的更改。您需要按照上述指出的方式更新<apkbuilder>中的build.xml任务。

鉴于此错误仅在您自定义build.xml时发生,我认为您需要返回并重做自定义。如果您查找$ANDROID_SDK/tools/ant/ant_rules_r3.xml并将其粘贴到build.xml(替换上次粘贴的定义),则应该可以解决您的问题。

您可以在没有自定义的情况下离开,因为新版本的规则可以更加自定义,并且包含-pre-compile-post-compile个钩子。

答案 1 :(得分:0)

以下是ant任务的源代码:
https://android.googlesource.com/platform/sdk/+/tools_r7/anttasks/src/com/android/ant

看起来变量mDexPath为null,我在<dex>中看不到<apkbuilder>元素。您是否在任何地方看到此警告:"WARNING: Using deprecated <file> inner element in ApkBuilderTask."

您是否创建了自己的ant脚本,或者您正在使用由android工具创建的项目?您可能希望将源代码,资源,AndroidManifest.xml和其他库/资产复制到新创建的Android项目中以进行修复。

答案 2 :(得分:0)

使用r8 SDK的另一个原因是你的apkbuilder调用缺少

resourcefile="${resource.package.file.name}" 

属性。
如果你的错误是 com.android.ant.ApkBuilderTask.execute(ApkBuilderTask.java:257),将其添加到您的apkbuilder任务调用中。