指定 Android 项目依赖项(在 Eclipse 中)

Posted

技术标签:

【中文标题】指定 Android 项目依赖项(在 Eclipse 中)【英文标题】:Specifying Android project dependencies (in Eclipse) 【发布时间】:2010-10-09 02:01:11 【问题描述】:

我有两个 android 项目,一个包含自定义布局的“库项目”和一个包含使用该布局的应用程序的“应用程序项目”。

一切似乎都可以正常构建和执行,除了可视布局编辑器抛出 ClassNotFoundException(我认为这是插件中的一个错误),但是当我尝试开始使用我为xml 中的自定义布局,我无法再构建。那是;这行得通:

<?xml version="1.0" encoding="utf-8"?>
<se.fnord.android.layout.PredicateLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_ 
    android:layout_> 
  <TextView
    android:layout_ 
    android:layout_ 
    android:text="asdfasdf"
    />
</se.fnord.android.layout.PredicateLayout>

而这不是:

<?xml version="1.0" encoding="utf-8"?>
<se.fnord.android.layout.PredicateLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:fnord="http://schemas.android.com/apk/res/se.fnord.android"
    android:layout_ 
    android:layout_> 
  <TextView
    fnord:layout_horizontalSpacing="1px"
    android:layout_ 
    android:layout_ 
    android:text="asdfasdf"
    />
</se.fnord.android.layout.PredicateLayout>

构建失败并带有来自 aapt 的消息:

错误在包“se.fnord.android”中找不到属性“layout_horizo​​ntalSpacing”的资源标识符

R 文件中确实存在资源标识符,并且 attrs.xml 包含库项目,如果我将布局代码和资源直接放在应用程序项目中,一切正常。 layout_horizo​​ntalSpacing 属性(和 layout_verticalSpacing)是 PredicateLayout.LayoutParam 类中用于指定到下一个小部件的距离的自定义属性。

到目前为止,我已经通过指定项目引用和构建路径项目依赖项尝试了标准的 eclipse 方式。我还被告知尝试应用程序清单中的标记,但没有帮助。

那么,我需要做什么才能使 xml 文件中的引用起作用?

我不知道它是否相关,但“库”清单如下所示:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
      package="se.fnord.android"
      android:versionCode="1" android:versionName="1.0.0">
</manifest>

“应用程序”清单如下:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
      package="se.fnord.appname"
      android:versionCode="1" android:versionName="1.0.0">
    <application android:icon="@drawable/icon" android:label="@string/app_name">
        <activity android:name=".AppName"
                  android:label="@string/app_name">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>
</manifest>

(顺便说一句,'PredicateLayout' 是 this 的清理版本)。

【问题讨论】:

另见***.com/questions/8581627/…***.com/questions/9838069/jar-file-issue-with-adt-r17 【参考方案1】:

Android sdk 的最早版本并没有很好地支持源代码级别的共享。您可以将 .class 文件打包,然后将其添加到 lib/ 文件夹中,但此解决方案不允许直接共享源代码,同样重要的是不支持共享资源或aidl 文件。

然后在 2010 年 5 月,Android 引入了 Library Project 机制。库项目的结构与普通的 Android 项目非常相似,但不是用于生成 apk,它仅用于为其他项目提供代码和资源。与普通项目一样,Library Project 通常包含 src 和 res 文件夹,以及一个 AndroidManifest.xml 文件;然而,清单应该大部分是空的,除了清单元素和包属性(不再正确 - 您现在可以在图书馆项目的清单中声明活动和其他组件)。此外,库项目的 project.properties 文件需要包含以下属性:

"android.library=true"

要从普通(生成apk)项目引用库项目,您需要在普通项目的project.properties 文件中添加“android.library.reference.N”行。例如,如果我的主项目想要指向两个库项目,我的主项目的 project.properties 文件将包含以下内容:

android.library.reference.1=../LibraryA
android.library.reference.2=../../LibraryB

其中 ../ 和 ../../ 是从主项目到库项目的各自路径(这只是一个示例)。请注意,此参考列表是从 1 开始的,不应包含空白或重复。 Google 很清楚这不是一个完美的系统,但它是一个与 Ant 和 Eclipse 兼容的合理解决方案。一般来说,您的 IDE 会尝试为您维护这些文件,但有时您可能需要手动编辑它们。

一开始,Library Projects 不支持以下内容:

    指向其他图书馆项目的图书馆项目 包含辅助文件的库项目 包含资产文件夹的库项目

但是随后的 sdk 版本解决了所有这些问题。

有关图书馆项目的更多信息,请参阅the official documentation。

【讨论】:

ADT 0.9.7 获得了我们想要的 80%,但它仍然存在以下缺点:(1) 库项目不能保存 .aidl 文件,(2) 库项目不能依赖于另一个图书馆项目,(3)图书馆项目不能持有资产 (1) 自 ADT 0.9.8 起不再有效 正确。 SDK 工具修订版 7 和 ADT 0.9.8(2010 年 9 月发布)至少解决了问题 (1) 和 (2),并且可能解决了 (3)。 看起来图书馆项目系统仍然不支持图书馆项目中的“资产”,然后可以在主项目中访问。 看起来(3)仍然没有修复。也就是说,项目仍然无法引用库项目中的资产。【参考方案2】:

将项目导出为 JAR 不是通过属性 -> Java 构建路径 -> 库将库项目链接到您的应用项目的正确方法。 也不是通过 Properties -> Java Build Path -> Projects 将项目链接为必需项目。

首先,阅读 Android 开发者 -> 开发 -> 管理项目中的库项目主题:http://developer.android.com/guide/developing/projects/index.html#LibraryProjects 在此之后,在 Android 开发人员 -> 开发 -> 管理项目 -> 从 Eclipse 中使用 ADT 再次阅读设置库项目和引用库项目主题

所以...步骤是:

    通常将您的库项目创建为 Android 项目; 在项目属性中设置“is library” -> Android 创建你的应用 项目正常; 在项目属性 -> Android -> 添加中添加对库的引用。

在此之后,您可以使用所有类、组件(活动、服务、提供者、接收者)、资源等。

例如:引用 xml 布局中的任何资源,例如,您应该使用 @mylib:id/my_id 或 @mylib:layout/my_lib_layout

Obs.:如果您在应用项目中使用库的组件,则必须在应用清单中复制它们。

【讨论】:

根据库项目是以这种方式链接还是完全嵌入到应用程序中,最终的 APK 文件是否有任何差异? 我不确定,@Pacerier,但我认为将库链接为项目只会嵌入您的应用程序使用的内容,而不是完整的库。您可以通过测试两种解决方案并检查最终 apk 的大小和内容来检查这一点。无论如何,这是一个好点!【参考方案3】:

此外,我的属性工作正常,但不是我认为应该工作的方式。

您必须在使用自定义属性的元素中使用命名空间,即主应用程序的命名空间,而不是库项目的命名空间。因此,在您的示例中,如果您为“xmlns:fnord”的值指定应用项目的命名空间,它就可以工作。

此外,在您的自定义PredicateLayout(Context,AttributeSet) 构造函数中读取自定义属性时,您还必须在调用attributes.getAttributeValue() 时指定应用程序的命名空间。

这很痛苦,因为该代码在您的库应用程序中,它不/不应该知道它所使用的应用程序项目。我通过让应用程序调用静态方法 ViewUtil.setAttributeNamespace( appNamespace) 在我的应用程序的 onCreate() 中,并且库的自定义视图使用该命名空间来检索自定义属性。然后 attrs.xml 文件也可以保留在库项目中。现在唯一难看的是布局 XML 必须在自定义视图上使用应用程序的命名空间,因此您不能将这些布局 XML 放在库项目中。

【讨论】:

尝试将他 /apk/ 从架构路径中删除,如此处所述 -> ***.com/questions/3428784/…【参考方案4】:

将您的库项目导出为 JAR,并在应用程序项目的“Java 构建路径”中将其作为 JAR 引用。

【讨论】:

【参考方案5】:

“将您的库导出为 jar”解决方案”仅在您的库项目仅包含源代码时才有效。在这种情况下,OP 的问题提到他的库项目包含与 ui 相关的内容。

我的团队也有同样的问题,希望拥有包含与 ui 相关的源和资源的库项目。我们最终彻底改造了我们的 Ant 构建系统,以便在构建期间让应用程序吞没库项目。不幸的是,似乎没有这种解决方案与 Eclipse 兼容,这是开发人员感到沮丧的主要原因。我们仍然可以使用 Eclipse,但我们必须费力地让它工作,并且不得不忍受生产力下降的情况。

【讨论】:

见上面提到 ADT 0.9.7 的更新 - 它主要解决了这个问题。

以上是关于指定 Android 项目依赖项(在 Eclipse 中)的主要内容,如果未能解决你的问题,请参考以下文章

Android获取项目依赖库

Android Gradle 插件Gradle 依赖管理 ⑤ ( dependencies 依赖项拆分 | 依赖组 | 依赖名称 | 依赖版本号 | 动态指定依赖版本号 | 使用命令行查看模块 )

如何在 Eclipse 中从我的 Android 项目中删除依赖项

如何在 android 库 gradle 项目中包含依赖项?

Android Studio 库项目错误

在 Jenkins 构建期间动态添加 Android 项目依赖项