目前遇到的问题是我们使用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构建脚本将这些删除。如果没有人建议采用更“正确”的方式,我会将此作为答案提交。
答案 0 :(得分:1)
美好的一天。
R类没有打包在输出jar中,因为它可能与主项目的R类冲突。
当您从主项目中引用库项目并使用ant sript构建它时,Android SDK包含它的cretes R文件包含库包。
如果你想用已编译的源代码创建android库,你只能编译java代码。 Here您可以找到解决方案。
将R文件打包到已编译的jar中并不是一件好事。您可以通过Resources课程访问资源。例如:
setContentView(getResources().getIdentifier("your_layout_id", "layout", getPackageName()));
// is equals to setContentView(R.layout.your_layout_id);
答案 1 :(得分:0)