【问题标题】:Android Jar librariesAndroid Jar 库
【发布时间】:2009-12-31 02:17:51
【问题描述】:

如何设置一个可以生成可用于 android 的 jar 库文件的项目? 我想为所有项目创建一个自定义库。

其他几个问题:

  1. 是否需要针对特定​​版本的 android sdk 进行编译?
  2. 当针对 jar 库编译 android 包时,是否将处理代码所需的类与主代码一起编译到 apk 中,还是包含整个 jar?
  3. 关于使用 jar 而不是直接集成代码,我需要了解哪些值得注意的优化或缺陷?
  4. jar 是否必须像 apk 那样签名?

【问题讨论】:

    标签: android jar


    【解决方案1】:

    Google 刚刚发布了处理共享库的 SDK 的新版本!

    https://developer.android.com/tools/projects/projects-eclipse.html#SettingUpLibraryProject

    ADT 0.9.7(2010 年 5 月)

    图书馆项目:
    现在的 ADT 插件 支持使用库项目 在开发过程中,一种能力 让您存储共享的 Android 应用程序代码和资源 单独的开发项目。你可以 然后引用库项目 来自其他 Android 项目,并且在 构建时间,工具编译 共享代码和资源作为 依赖的应用程序。更多的 有关此功能的信息是 在 Eclipse 开发中可用 与 ADT 文件。如果你不是 在 Eclipse、SDK 工具 r6 中开发 提供等效库 通过 Ant 构建的项目支持 系统。

    【讨论】:

    • 我还想提一下,在编写此 MotoDev Studio 时,如果您使用它不支持使用库的能力。它覆盖了许多标准 ADT GUI,并隐藏了允许您将项目创建为库的 GUI。我相信它会及时修复。
    • MotoDev Studio 1.2.1 现在支持共享库。
    • 是的,他们在 Google 发布新的 ADT 两天后更新了,忘记更新了。
    • ADT 0.9.7 获得了我们想要的 80%,但它仍然存在以下缺点:(1) 库项目不能保存 .aidl 文件,(2) 库项目不能依赖于另一个图书馆项目,(3)图书馆项目不能持有资产
    • 快一年了。有关限制的任何更新? “3. 关于使用 jar 而不是直接集成代码,我需要了解任何值得注意的优化或陷阱吗?” “(1) 一个库项目不能保存 .aidl 文件,(2) 一个库项目不能依赖另一个库项目,(3) 一个库项目不能保存资产”
    【解决方案2】:

    您无需对项目设置进行任何特殊操作即可创建可在 Android 应用中运行的 jar 文件。只需在 Eclipse 中创建一个普通的 Java 项目即可。

    1. 它根本不需要针对 Android 进行编译。您可以包含任何 jar 文件,只要它不引用 Android 中未包含的类即可。只需在 Eclipse 中的 Android 项目的构建路径中包含您的 jar 文件,它就会自动包含在您的 APK 文件中。

    2. 不确定,但我假设 jar 文件中的所有类都包含在 APK 中。

    3. 我不认为直接在 jar 中包含一些类与直接在项目中包含一些类会对生成的 APK 产生任何影响。

    【讨论】:

    • 4. JAR 不需要签名。
    • 我刚刚遇到了障碍。我有将 id 添加到 R.java 文件的自定义布局,并且我还有其他 Android 依赖项。如何将这些转换成 jar 格式?
    • jar 中只能有 Java 类文件。您不能将自定义布局 XML 放在那里。您只需将它们复制到您的项目中即可。
    • mbaird:不是真的! JAR 只是一个 zip 文件,您可以在其中存储任何类型的资源。只是 Android 还不知道如何去那里找到它。
    • @MarkRenouf 这正是我的意思,他问是否可以将自定义 Android 布局文件放入 jar 中,但他不能。
    【解决方案3】:

    我问自己同样的问题:我可以在 Android 中导出和重用布局吗?我尝试了以下方法:将具有 XML 资源的项目导出到 JAR 文件,然后尝试通过它的 R.layout 访问布局。当然它不起作用,因为 R.layout.main 是一个整数,与宿主项目的 R.layout 中定义的单个布局 (relative.xml) 关联的整数相同。

    Android SDK 将layout xml 文件编译到View 资源中,并且由于包含的JAR 文件中的XML 文件不是layout xml 文件,因此它们没有被编译并且在R.layout 中没有与它们关联的ID。

    如果要从项目中导出布局,则应将其导出为 XML,并将其作为布局资源导入新项目,而不是作为外部库的一部分。

    如果您想重用 JAR 中的布局,您必须创建视图的子类,并从代码构建布局。您可以实例化它并将创建的实例设置为 Activity 的视图,或者将实例添加到您的 Activity 的视图中。

    【讨论】:

      【解决方案4】:

      这对我有用!!!。如果您想将.jar 文件从一个库项目中使用到您的应用程序中,该库项目使用诸如attrs.xml 之类的资源(并假设其他资源,如布局、字符串等),这些资源会生成一个 R.java。您应该在 Eclipse 中转到 export->Java/Jar file-> 并选中 Export all output folder for checked projects -> Finish... 这将确保在运行时使用此 jar 的应用不会因缺少类和资源而生成异常。

      当然,要将 jar 包含到你的新项目中去。 project properties-> Java build path -> Libraries -> Add external jar -> 你就完成了。

      希望对您有所帮助!

      【讨论】:

        【解决方案5】:

        要创建 jar 文件,您应该使用 Eclipse 的 Export 选项。 在导出对话框中,选择 java 和子选项 JAR。 然后会显示一个向导,您需要在其中进行一些选择。您需要指定 jar 文件的存储位置。

        我第一次创建 jar 文件时犯的一个错误是包含 Android Manifest。添加创建的jar文件时,我遇到了双重android清单的冲突。

        【讨论】:

          【解决方案6】:

          您可以使用自定义方法动态访问 R 文件,示例链接如下。

          Packaging Android resource files within a distributable Jar file

          public static int getResourseIdByName(String packageName, String className, String name) {
             Class r = null;
             int id = 0;
          try {
              r = Class.forName(packageName + ".R");
          
              Class[] classes = r.getClasses();
              Class desireClass = null;
          
              for (int i = 0; i < classes.length; i++) {
                  if(classes[i].getName().split("\\$")[1].equals(className)) {
                      desireClass = classes[i];
          
                      break;
                  }
              }
          
              if(desireClass != null)
                  id = desireClass.getField(name).getInt(desireClass);
          } catch (ClassNotFoundException e) {
              e.printStackTrace();
          } catch (IllegalArgumentException e) {
              e.printStackTrace();
          } catch (SecurityException e) {
              e.printStackTrace();
          } catch (IllegalAccessException e) {
              e.printStackTrace();
          } catch (NoSuchFieldException e) {
              e.printStackTrace();
          }
          
          return id;
          }
          

          【讨论】:

            【解决方案7】:

            如果您查看platforms/android-X.X/android.jar 文件下的android.jar 文件,它确实包含布局XML 项,因此您也应该能够创建一个。我只是不确定你是如何做到这一点的,以及你如何在其他项目中引用它们。

            【讨论】:

              猜你喜欢
              • 2016-01-30
              • 2014-01-03
              • 1970-01-01
              • 2014-07-26
              • 2013-10-18
              • 1970-01-01
              • 1970-01-01
              • 2014-04-01
              • 2013-09-15
              相关资源
              最近更新 更多