【问题标题】:How to build a jar without the r.java?如何在没有 r.java 的情况下构建 jar?
【发布时间】:2017-06-01 22:49:24
【问题描述】:

我们不能将资源 ID (R.java) 直接放在 jar 文件中。如果我们这样做,就无法保证它们是独一无二的。但是如何在没有 R.java 的情况下编译 jar 呢?在我的代码中,我经常调用 R.style.xxx 来获取 xxx 的 id,但如果我没有 r.java,那么它将无法编译:(

我像这样构造我的罐子

%JDK_PATH%\javac -cp^
 %ANDROID_PLATFORM%\android.jar;^
 -d source\output^
 source\java\com\mylib\util\r.java^
 source\java\com\mylib\view\myCustomView.java

r.java 只是一个像这样的虚拟文件:

package com.mylib;

public final class R {

  public static final class dimen {

     public static final int al_floating_toolbar_horizontal_margin=0;
     public static final int al_floating_toolbar_vertical_margin=0;
     public static final int al_floating_toolbar_preferred_width=0;
     public static final int al_floating_toolbar_minimum_overflow_height=0;
     public static final int al_floating_toolbar_maximum_overflow_height=0;
     public static final int al_content_rect_bottom_clip_allowance=0;
     public static final int al_floating_toolbar_height=0;
     public static final int al_floating_toolbar_menu_button_minimum_width=0;

  }

}

然后我删除所有 R.class 然后我创建 jar :

%JDK_PATH1_7%\jar cf lib\jar\mylib.jar -C source\output com\mylib\

【问题讨论】:

  • 编译它并将jar中的旧R.class替换为新的。但老实说,只是用一个xml文件来存储这样的数据。
  • 我做到了,我什至从 jar 中删除了 r 类,但 R.style.xxx 是指向已删除 r.java 中的值的样式:(
  • 是的,您必须在其中保留一些 R.java,否则显然无法正常工作。正如我所说,使用 xml 文件可能更容易。
  • 但是我使用了一个 xml 文件 :( 当我们创建最终的 apk 时,r.class 必须从这个 xml 文件生成。但是在我的库代码的中间,我需要一些参考,比如 R .style.xxx 目前 R.class 尚未创建:(

标签: java android jar android-resources rjava


【解决方案1】:

如果我们这样做,则无法保证它们是唯一的

更重要的是,不能保证它们会正确。这些不仅仅是随机数。它们与 APK 的打包方式以及如何读取资源有关。

但是如何在没有 R.java 的情况下编译 jar 呢?

如果这是一个库模块,您可以从项目中删除所有资源(以及从 Java 中对它们的所有引用)。然后,您可以使用a custom Gradle task 创建一个 JAR。

您唯一的选择是避免 Java 代码中的所有 R 引用,使用 getResources().getIdentifier() 在运行时查找它们。然后,将 JAR 与 JAR 之外的资源一起发送。使用 JAR 的应用程序需要将库的资源与应用程序自己的资源合并。坦率地说,我希望你发布 AAR,因为这对发布者和消费者来说都更容易、更安全。

【讨论】:

  • 谢谢!我发现了问题,这是因为我使用了 final,当你使用 final 时,即使你稍后从 jar 中删除 r.class,该值仍会存在 :(
猜你喜欢
  • 2015-09-22
  • 2020-03-18
  • 1970-01-01
  • 1970-01-01
  • 2012-12-11
  • 2010-11-20
  • 2015-09-22
  • 1970-01-01
  • 2019-08-13
相关资源
最近更新 更多