在可分发的Jar文件中打包Android资源文件

Jef*_*elt 47 android android-resources

我正在研究一些可重用的Android代码,我想将其分发给其他开发人员,以便在他们自己的应用程序中使用.代码有一些资源依赖(layouts,xml和png drawables),我希望能够在单个包(Jar文件)中包含和引用.

这是可能的,如果是这样,最好的方法是什么?

J.J*_*Kim 55

由于Android 使用该文件夹R下的资源文件自动生成类/res,因此使用R该类final static是不可能的.

我找到了一个很好的解决方案来使用jar文件和res文件.我是这样做的:

  1. 在将在jar文件中导出的源代码中,不要使用 R变量,因为它将在编译时替换为最终的静态内存地址.R我没有使用,而是在下面制作了自己的方法:

    public static int getResourceIdByName(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;
    }
    
    Run Code Online (Sandbox Code Playgroud)

    例如,如果您有一个名为的布局main.xml,则可以通过调用方法来获取它:

    int id = getResourceIdByName(context.getPackageName(), "layout", "main");
    
    Run Code Online (Sandbox Code Playgroud)

    如果你有一个字符串id"text1",你可以通过调用方法得到它

    int id = getResourceIdByName(context.getPackageName(), "string", "text1");
    
    Run Code Online (Sandbox Code Playgroud)

    此方法在运行时为您提供资源ID.它使用反射API来获取R运行时的状态.

    通过使用此方法,您可以避免使用该R变量.

  2. res文件复制到目标项目.

  3. 建立.

  • 我如何达到jar的资源文件?我的意思是我制作了一个jar文件,其中有一些drawables和layouts,在我将它添加到项目后,我无法访问它们.我正在使用它像context.getResources().getDrawable(Util.getResourceIdByName("com.mgandronet","drawable","alert")); 但我知道这不符合逻辑,因为它只获取传递上下文的资源.但是我需要访问jar文件的资源并获取drawable对象.我该怎么做? (3认同)

Ram*_*mps 26

我没有任何乐观的消息.一般而言,您无法像预期的那样轻松地分发自己的包.主要问题是自动生成的R文件.你可能会对它做一些引用 - 你有你的布局和drawables.您图书馆的用户将拥有自己的R文件 - 包含其资源的ID,而不是您的图书馆提供的资源.

在可绘制资源的情况下,您可以以经典方式阅读它们,而无需R文件.但据我所知,您无法从外部xml文件中扩充布局.

因此,丑陋的黑客攻击是将您的库与所有资源一起分发,用户必须将其复制到"res"文件夹.说实话,你的问题没有很好的解决方案......对不起.问候!

  • 只是为了确认这不幸,这确实是目前最简单的方法. (5认同)
  • 我尝试了同样的事情,并且真的很失望,因为我无法将所有东西打包在我的罐子里.b.android.com上有增强请求吗?如果有的话,我想把它竖起来,但我似乎无法找到任何要求此功能的东西. (4认同)

小智 19


布局:

你的java源代码中的硬代码


xml&png:

例如,将xml&png复制到项目src文件夹并打包到jar

将a.png复制到src/com/example/test

将其加载为以下java代码:

    InputStream is = YourClassName.class.getClassLoader().getResourceAsStream("com/example/test/a.png");
    if ( null != is )
    {
          Bitmap bmp = BitmapFactory.decodeStream(is);
Run Code Online (Sandbox Code Playgroud)