Android:在混淆后无法在res / raw中找到.html文件

时间:2012-03-15 12:11:36

标签: android proguard

我在res/raw中有一些html文件,我在WebView打开了这些文件。但是在混淆之后它们无法加载。

5 个答案:

答案 0 :(得分:9)

我遇到了同样的问题。我有我的帮助html文件在原始和混淆后我运行我的应用程序,并得到一个错误,无法找到该文件。

这是我的HelpActivity类:

public class HelpActivity extends BaseActivity
{
  @Override
  protected void onCreate(Bundle savedInstanceState)
  {
      super.onCreate(savedInstanceState);
      // requesting to turn the title OFF
      //requestWindowFeature(Window.FEATURE_NO_TITLE);
      // making it full screen
      getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);

      setContentView(R.layout.help);
      setTitle(getString(R.string.help_title));
      WebView webView = (WebView) findViewById(R.id.webView);
      webView.loadUrl("file:///android_" + getString(R.raw.how_to_play_zeewee));
  }
}

我通过在proguard.cfg文件中添加以下内容来修复此问题:

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

您可能已经拥有第一行,但这并不能解决问题。添加第二行完全消除了这个问题。我不认为第一行仍然需要,但我还没有测试过 - 而且因为它目前有效......;)。

答案 1 :(得分:1)

建议https://stackoverflow.com/a/19579355/6103242

-keep class **.R$*

不是最优雅的解决方案,因为它指示ProGuard保留所有R类,而不管它们所在的包。

与WebView有同样的问题,我在Logcat中看到的错误:

  

... E / AndroidProtocolHandler:无法打开资源网址:file:///android_res/raw/$MISSING_RESOURCE_NAME.css       java.lang.ClassNotFoundException:没找到类      路径上的“my.app.package.R $ raw”:DexPathList [[...

我添加到proguard-rules.pro文件的限制最多的指令:

-keepnames class my.app.package.R$raw { public static <fields>; }

显然,由于R类只包含字段,而且所有这些字段都有public static类型,实际上,上面的字段和

之间应该没有区别
-keepnames class my.app.package.R$raw { *; } 

但是,我在这里

  1. 不禁用除R以外的raw中的所有其他内部类的收缩和混淆。
  2. 仅在一个特定包中定位R

    如果您的项目中有多个模块提供了自己的资源,而您正在构建的某个特定的APK(例如,拥有多个android_application模块),那么该方法应该会更好。 APK来源 - 在您的项目中也是如此。

  3. 要了解-keepnames-keep之间的区别,请参阅

    '区分不同的ProGuard“-keep”指令'     5月29日星期二04:10:50 MSK 2018年     https://jebware.com/blog/?p=418

答案 2 :(得分:0)

proguard.cfg 中添加以下内容,看看它是否有任何区别

-keep public class com.yourPackageName.yourAppName.R
-keepclassmembers class **.R$ { public static ; }

答案 3 :(得分:0)

请在此处查看第一个答案:

Prevent Proguard to remove specific drawables

这对我有用。

答案 4 :(得分:0)

也可以通过在包含内容的 xml 文件夹中创建一个 keep.xml 文件 raw 来完成

<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:tools="http://schemas.android.com/tools"
tools:keep="@raw/*">
</resources>

它会将所有文件保存在 raw 文件夹中,如果您想将其限制为只能使用一个特定文件

tools:keep="@raw/fileName"

注意最后不要添加文件扩展名,所以不应该filename.html