【问题标题】:Packaging drawable resources with a JAR?用 JAR 打包可绘制资源?
【发布时间】:2012-02-23 14:49:57
【问题描述】:

我已经构建了一个半推送服务(从集中式 http 服务器签入通知),我想将它分发给几个朋友和客户,这样他们就可以轻松地将类似推送的通知添加到他们的应用程序中,而不需要太多麻烦。

我已经完成了打包 JAR 并将其包含在我的其他一些项目中的工作,但现在我在资源打包方面遇到了障碍 --

  • 在我的 PushNotify 项目中,我有一个资源:R.drawable.goldstar
  • 我在应用程序中绘制了两次,一次通过引用R.drawable.goldstar,一次通过引用resources.getIdentifier('goldstar', 'drawable', 'com.com.pushnotify')
  • 当我将 PushNotify 打包为自己的 APK 时,金星正确出现在两个地方。
  • 我在eclipse中右击,将项目导出为JAR文件,从包含的文件中取消选中“ApplicationManifest.xml”,然后点击“完成”。
  • 我可以验证当我添加更多可绘制资源时此 JAR 文件的大小会增加。
  • 当我在构建路径中打包 DependantApp.apk(包括 PushNotify.jar)时,金星正确出现在两个位置。
  • 如果我卸载 PushNotify.apk,金色星星会从 DependantApp.apk 中消失,就好像它们没有与 JAR 一起打包一样;为 getIdentifier('goldstar', 'drawable', 'com.com.pushnotify') 返回 0 值。

如何分发带有可绘制资源的 JAR,并让它们出现在依赖的应用程序中?包括我的 JAR 在内的应用永远不需要访问我正在分发的图标,只有我自己的代码才需要。

尽管在我发现的搜索结果中有很多反对意见,我确信这是可能的,因为 a) 我的 JAR 文件在我添加新图像时会增长,并且 b) 我已经包含之前带有图标的 JAR 文件(Airpush 这样做,UrbanAirship 也是如此)。

提前致谢!

【问题讨论】:

    标签: android eclipse jar


    【解决方案1】:

    如何分发带有可绘制资源的 JAR,并让它们出现在依赖的应用程序中?

    目前不支持。创建可以分发资源的 Android 库项目已在工具路线图中,有望在不久的将来推出。

    【讨论】:

    • 我使用的 JAR 文件完全符合我的要求。请阅读我的最后一段。
    • @linked:目前不支持您正在执行的操作。作为可重用组件的一部分分发资源的唯一受支持的方法是 Android 库项目。这些不能直接打包为 JAR。 “目前,尚不支持直接包含 jar 文件而不是源代码的库项目。” (tools.android.com/recent/buildchangesinrevision14) 虽然该文档表明 R15 应该为此添加支持,但它没有,R16 也没有。
    • @linked:虽然有一些粗略的解决方法,但没有一个涉及当前实际存在于 JAR 中的资源。我什至不清楚 JAR 中的资源是否是工具团队计划的一部分,尽管我确实有这样的印象。 Java 拥有自己的“资源”结构比 Android 更长,它支持 JAR 中的内容,但您不会通过 R. 常量访问它们——尽管名称相同,但 Android 中的“资源”与“资源”在旧的 Java 风格中。
    • @linked:因此,我最好的猜测是,您引用的 JAR 文件使用的是旧的 Java 资源(因此在不同的屏幕密度等方面会遇到挑战)。无论您使用 project-export-as-JAR 做什么,都从未得到支持,其中“支持”是指“众所周知会发生什么,已记录在案等”。
    • 感谢您的全面回答(和跟进)。我很沮丧,这似乎是目前可用的最正确的信息,但您似乎是对的。在 Android 团队决定实现我想要的东西之前,我将开始用头撞墙,或者我可能会向上游发送补丁;)在那之前,我想我正在发送 .zip 文件。干杯!
    【解决方案2】:

    我认为您尝试这样做的方式是不可能的。 Android 在其 apk 中“构建”资源。 jar 文件中的资源(据我所知)被忽略。

    但是,您可以将其构建为包含这些 xml 布局的“android-library”。如果您不希望整个代码“易于阅读”,则可以仅将这些资源和使用它们的类放在“android-library”中,而库中的其余部分保留在 .jar 文件中

    【讨论】:

      【解决方案3】:

      这不是您所要求的,但无论如何这里是一个有趣的选择:

      getIdentifier('goldstar', 'drawable', getApplicationContext().getPackageName())代替getIdentifier('goldstar', 'drawable', 'com.com.pushnotify')

      并将图像/资源作为 .zip 文件分发,以便与目标应用程序(将使用您共享的 .jar 文件的应用程序)一起解压缩、安装和编译

      并且不要在 .jar 中包含图像。

      这未经测试,但应该可以工作。

      【讨论】:

        猜你喜欢
        • 2012-04-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-11-07
        • 2019-06-18
        • 2014-07-26
        相关资源
        最近更新 更多