7

我有一个让我发疯的问题。我有一个需要包含一些图像的静态 html 文件 (assets/help/index.html)。因为我想要不同密度的不同图像,并且图像已经包含在 drawable-{ldpi,mdpi,hdpi} 中,所以我想我会使用以下 html 代码:

<img src="file:///android_res/drawable/image.png">

这在日食下效果很好!不幸的是,在生产版本(使用 maven android 插件构建)中,显示 html 页面的 webview 显示损坏的图像图标。

我尝试使用 loadUrl 和 loadDataWithBaseUrl(首先自己读取文件)打开页面,后者使用 file:///android_res/drawable 的基本 url。两种尝试都在 Eclipse 下成功,但在 Maven 版本中失败。

所以我解压了 Eclipse 生成的 apk 和 maven 生成的 apk 并在两者之间做了一个 diff -r ,因为肯定有区别。

我很困惑地发现只有一些微不足道的差异(主要是签名差异,因为 eclipse apk 是用调试证书签名的,而 maven 是用我的官方证书签名的)。除此之外,apk 的内容是相同的!

有谁知道发生了什么或如何继续发现更多信息?

4

3 回答 3

4

我在使用 proguard 时遇到了类似的问题,我在这里找到了解释(和解决方案!) 。

在我的情况下,proguard 混淆了 R 类并且 android_res/[...] 再也找不到了。

我解决了向 proguard.cfg 添加规则:

-keepclassmembers class **.R$* {
    public static <fields>;
}

-keep class **.R$*

我不了解maven,但希望这会有所帮助。

于 2014-02-22T12:45:48.083 回答
1

使用 file:///android_res 而不是 file:///android_asset 是有原因的。其中之一是 Android 库项目不能有资产。

如果您碰巧想从 WebView 访问在库项目中定义的资源并使用android-maven-plugin 的相应选项(这又依赖于某些 Android SDK 功能)重命名包名称,那么您打了一个相当奇怪的错误。

Android 在 android.webkit.BrowserFrame::inputStreamForAndroidResource 中执行此操作(至少在 4.1.2 中):

final Class<?> d = mContext.getApplicationContext().getClassLoader().loadClass(
mContext.getPackageName() + ".R$" + subClassName);

这是 R 类的动态查找,它使用应用程序的包名作为 Java 包名。但是,这不起作用,因为重命名的包名称中的 R 类将不存在。

一种可能的解决方法如下:在发布构建期间,动态地制作真实 R 类的副本并将其放入适合重命名的应用程序包名称的 Java 包中。确保也更新复制源中的“包”语句。

于 2012-11-16T16:54:45.243 回答
0

我会看看AsssetManager作为访问与应用程序捆绑的文件的一种方式。可以在此处找到教程(带有代码示例) 。或者,您可以将文件放入并使用openRawResource()res/raw读取它们

于 2011-12-27T20:01:01.613 回答