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

use*_*865 4 android proguard

我有一些html文件res/raw,我在其中打开WebView.但是在混淆之后他们无法加载.

小智 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));
  }
}
Run Code Online (Sandbox Code Playgroud)

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

-keepclassmembers class **.R$* {public static <fields>;}
-keep class **.R$*
Run Code Online (Sandbox Code Playgroud)

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


vla*_*koi 5

在这个问题答案中建议-

-keep class **.R$*
Run Code Online (Sandbox Code Playgroud)

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

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

... E/AndroidProtocolHandler:无法打开资源 URL: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>; }
Run Code Online (Sandbox Code Playgroud)

显然,由于R类只包含字段并且所有这些字段都有public static类型,因此在实践中,上面的和

-keepnames class my.app.package.R$raw { *; } 
Run Code Online (Sandbox Code Playgroud)

然而,我在这里

  1. 不禁用Rraw.
  2. 只针对R一个特定的包。

    如果您的项目中有多个模块提供自己的资源,而您正在构建的特定 APK 可能不需要这些资源(例如,有多个 android_application 模块 – APK 源 – ),那么这种方法应该会更好。在您的项目中也是如此)。

理解上的差异之间-keepnames-keep,请参阅下面的内容。

区分不同的 ProGuard-keep指令 - 2018 年 5 月 29 日星期二 04:10:50 MSK