【问题标题】:Resources from jar available from source code but not in xmljar 中的资源可从源代码获得,但不能在 xml 中获得
【发布时间】:2023-01-28 03:44:26
【问题描述】:

我编译了SettingsLib并将jar复制到我的项目中:frameworks/base/packages/SettingsLib/SettingsLib/android_common/javac/SettingsLib.jar

Jar 包含我想使用的 this drawable。它可以在 Java 代码中访问:

int id = com.android.settingslib.R.drawable.avatar_selector;

但是当我尝试在 xml 文件中使用它时:

android:drawable="@drawable/avatar_selector"

它失败由于: AAPT: error: resource drawable/avatar_selector not found.

【问题讨论】:

    标签: android jar


    【解决方案1】:

    好吧,我自己想出来了。这个过程很丑陋,所以难怪谷歌开发人员没有关于它的信息,也许他们对这个过程感到羞耻,更愿意自己保留这个 :D 如果有更好的方法,请告诉我。

    首先,如果您只是使用“make”构建 Android,您将不会在 out 目录中有 aar 文件,只有 jars(可能有一些小例外)。你需要做的是“制作”例如“make SettingsLib”(很奇怪,但这是目前的情况),这将在此处另外生成 aar:

    out/soong/.intermediates/frameworks/base/packages/SettingsLib/SettingsLib/android_common/SettingsLib.aar
    

    但这还没有结束……如果您解压并比较 SettingsLib.jar 和 SettingsLib.aar,您会注意到 jar 包含:

    META-INF, androidx, com
    

    而 aar 包含:

    META-INF, AndroidManifest.xml, classes.jar, R.txt
    

    但是......如果你打开谷歌放入源代码的“魔法”aar,例如prebuilts/sdk/current/aaos-libs/car-apps-common.aar你会注意到它还包含资源目录:

    META-INF, res, AndroidManifest.xml, classes.jar, R.txt
    

    所以你需要做的是解压缩生成的 aar(在本例中为 SettingsLib.aar),然后复制粘贴资源(在本例中为 frameworks/base/packages/SettingsLib/res),再次压缩文件,将扩展名更改为 .aar最后资源也可以从 xml 文件中获得。

    您可能还会遇到一些重复字符串或二进制资源与正常资源冲突的问题,并且您可能需要在重建时清理项目,但除此之外它应该可以工作。

    【讨论】:

      猜你喜欢
      • 2016-02-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-18
      相关资源
      最近更新 更多