正确的方法来处理Android库的ant构建。 Build从jar文件中排除R.class

时间:2013-11-25 19:43:30

标签: android ant build

目前遇到的问题是我们使用ant进行生产构建会排除R.class文件。看一下ADT build.xml,我看到了:

<if condition="${project.is.library}">
<then>
...
    <jar destfile="${out.library.jar.file}">
        <fileset dir="${out.classes.absolute.dir}"
            includes="**/*.class"
            excludes="${project.app.package.path}/R.class ${project.app.package.path}/R$*.class ${project.app.package.path}/BuildConfig.class"/>
        <fileset dir="${source.absolute.dir}"
            excludes="**/*.java ${android.package.excludes}" />
</jar>
</then>
</if>

目前构建会抓取classes.jar文件,但正如您在上面所看到的,这不包括R.class文件,因此当库尝试获取外部化字符串时,它会在NoClassDefFoundError

更新 在此处找到以下引用:http://tools.android.com/recent/dealingwithdependenciesinandroidprojects

  

重要变化:

     

我们已经改变了Library Projects生成和打包R类的方式:

     
      
  • R class不再打包在Library Projects的jar输出中。
  •   
  • Library Project不为它们所依赖的库项目生成R类。只有主应用程序项目会自己生成Library R类。
  •   
     

这意味着库项目无法从他们依赖的另一个库项目中导入R类。无论如何,这不是必需的,因为他们自己的R类包括所有必要的资源。   请注意,应用程序项目仍然可以从引用的库项目中导入R类,但同样不需要这样做,因为它们自己的R类包含所有资源。

那么,鉴于此,打包Android库项目的正确方法是什么?

更新2: 因此,我们通过手动将R.class和R $ * .class文件打包到jar中来解决这个问题。

我不知道这是否是打包Android库的“正确”方式,因为ADT构建脚本将这些删除。如果没有人建议采用更“正确”的方式,我会将此作为答案提交。

2 个答案:

答案 0 :(得分:1)

美好的一天。

  1. R类没有打包在输出jar中,因为它可能与主项目的R类冲突。

  2. 当您从主项目中引用库项目并使用ant sript构建它时,Android SDK包含它的cretes R文件包含库包。

  3. 如果你想用已编译的源代码创建android库,你只能编译java代码。 Here您可以找到解决方案。

  4. 将R文件打包到已编译的jar中并不是一件好事。您可以通过Resources课程访问资源。例如:

    setContentView(getResources().getIdentifier("your_layout_id", "layout", getPackageName()));
    // is equals to setContentView(R.layout.your_layout_id);
    

答案 1 :(得分:0)

可能需要添加

<src path="../src"/>
<src path="../gen"/>

<javac>:

来源:SO