如何在没有r.java的情况下构建jar?

时间:2017-06-01 22:49:25

标签: java android jar android-resources rjava

我们不能将资源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\

1 个答案:

答案 0 :(得分:0)

  

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

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

  

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

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

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