16

我有一个Library项目设置和一个依赖于这个库项目的项目 - 一切都编译得很好,但是我的Dependent项目运行良好;

但是,在使用项目中的活动时,我遇到了间歇性问题Library

我的Library项目可以作为库项目“未选中”,并且“选择器”活动可以单独运行。以自己的方式运行Library项目可以正常工作,没有任何问题。

当我使用Library依赖项目中的项目(和“选择器”活动)时,它会给我NullPointerExceptions(或历史上的 DexOp)错误,说“选择器”活动找不到它的资源。

谁能告诉我他们以前是否经历过这种情况?

编辑

layout.xml手动将项目活动使用的复制Library到依赖项目,使项目正确打开“选择器”活动。这是必须的吗?!确定不是吗?R.java这进一步让我想知道在项目中合并/引用整数 id 是否存在问题Library

编辑

我不确定这是否有任何后果,但我的一个Library项目是对不同前端项目中使用的一组自定义视图的包装。

这些自定义视图每个都有一个 Activity,以便可以单独测试它们。

其中一个视图具有自定义属性,这些属性在单独运行时运行良好。但是,依赖项目似乎没有正确地拉入属性并将它们保留在其原始命名空间中,从而导致导入的布局引发编译错误:

[2012-05-16 12:07:28 - Project] D:\opt\workspace\CustomGlowList\res\layout\main.xml:14: error: No resource identifier found for attribute 'listId' in package 'com.company.library.glowlist'
[2012-05-16 12:07:28 - Project] D:\opt\workspace\CustomGlowList\res\layout\main.xml:14: error: No resource identifier found for attribute 'type' in package 'com.company.library.glowlist

编辑

通过删除项目中存在的重复文件名解决了 DexOp 错误Dependent。不确定文件名是问题还是文件内容。

编辑

到目前为止,我一直无法找到解决这个问题的方法(尽管@yorkw 的回答肯定有助于 xml 属性!谢谢)。

但是,我设法使这个问题断断续续:

我浏览了每个库项目,并确保它们都有自己的命名空间(即com.company.library.component1com.company.library.component2等)。经过几次清理(每个项目都以正确的优先级排序)后,此问题自行解决,但是在切换库/不是库以测试组件时最终会再次出现。

4

5 回答 5

14

原因:

问题 9656:库项目不支持自定义类的自定义 XML 属性

解决方案:

升级到最新的 SDK 和 ADT 版本(自 r17 以来已修复)并http://schemas.android.com/apk/res-auto用作自定义属性的命名空间 URI,请参阅ADT 17.0.0 的修订

添加了对库中具有自定义属性的自定义视图的支持。使用自定义属性的布局必须使用命名空间 URI http://schemas.android.com/apk/res-auto而不是包含应用程序包名称的 URI。在构建时,此 URI 将替换为特定于应用程序的 URI。

相关主题:

帮助在 Android 库项目中自定义视图属性

于 2012-05-16T22:10:25.037 回答
2

不知道你是如何使用 android 库的,但我已经做了很多次了,没有任何问题,所以请阅读下关于使用 android 库的内容:

  1. 为了让 android 项目使用 android 库项目,您可以编辑“project.properties”并在那里添加库项目的路径,或者更简单,右键单击项目(使用库项目),选择“android”类别,然后选择“add”并选择库项目。

  2. 为了使android项目始终打开android库项目,还选择“java构建路径”->“项目”并选择库项目。

  3. 在“project.properties”上,尝试将两个项目的目标设置为相同的目标,以及您拥有的最新目标(现在最新的是 15),即使您无法在此 android 版本上测试应用程序。

  4. 源文件和所有资源文件(在 res 文件夹中)都可以在库项目中使用。

  5. assets 文件夹不能在库项目中使用。只有在实际运行的android项目上才能使用assets文件夹。同样的事情也发生在 proguard 文件中。

  6. 图书馆项目的清单几乎不需要任何东西。有关更多信息,请参阅此帖子:https ://stackoverflow.com/a/10445630/878126 。如果库项目中有您希望能够通过使用它的项目访问的活动,请不要忘记将它们包含在 android 项目的清单中(无需将它们写入 android 库的清单中) .

  7. 记得在导出应用程序之前运行 lint。它会给你很多警告,但最重要的警告是当你使用太新的函数时,这些函数不能在你的目标 API 范围内运行。这对图书馆很重要,因为如果有多个来源很容易迷路。

  8. 如果您希望在 android 库上扩展活动,则需要某种方法在它们之间进行。我知道的唯一方法是扩展应用程序并让它成为如何为每个活动创建意图的管理者。我认为您可以做其他技巧,但它们可能都与这个相似。

  9. 如果您在 android 库和 android 项目上拥有相同的资源(“res”文件夹中的任何资源),则 android 项目上的资源将替换另一个资源。这有利有弊。请记住,同一资源不能有不同的文件扩展名。

于 2012-05-16T20:25:00.680 回答
1

问题是R由每个Library项目中的文件未正确构建和引用引起的。资源文件是直接从调用项目中构建和引用的。

每个都Libraries需要有唯一的包,如AndroidManifest.xml. 这导致它的每个资源都在调用项目内的唯一命名空间中与Library包含class文件的 jar 一起编译。

位于情境中的 <code>R</code> 文件

在库和可运行项目之间切换时,问题会变得间歇性,因为clean and build需要重新生成这些文件,因为在取消单击Use as library复选框时它不会自动完成,而 jar(和 java 类)不需要那么多哄骗它们被正确引用,因为库项目在充当Library.

这可能会导致间歇性和不同的错误,包括缺少引用,DexOp并且NullPointerException取决于R.java文件被破坏或部分构建的程度以及包之间发生的冲突。

于 2012-05-29T08:46:52.250 回答
1

我有同样的问题,我有一个图书馆项目,它有一些活动。当我从主项目调用库项目的活动时,布局文件资源没有为库项目的活动正确加载,并给出“空指针异常”或“无法加载类”等。

解决方案:我注意到在我的库项目和主项目中使用了相同的布局文件名。我刚刚重命名了这些活动,它已经解决了。

可能这会对你有所帮助。

于 2012-11-22T12:50:13.520 回答
0

在 Android App 项目中引用库项目时,我遇到了类似的问题。我从库项目中删除了 R.java 文件,因此它再次生成,App 拾取了生成的文件。您应该在您的应用程序项目->gen->library_namespace_R.java 下看到生成的 R.java 文件。

于 2013-09-23T20:06:33.583 回答