Android: не могу найти файл .html в res / raw после запутывания - PullRequest
3 голосов
/ 15 марта 2012

У меня есть несколько html-файлов в res/raw, которые я открываю в WebView. Но после запутывания они не могут загружаться.

Ответы [ 4 ]

9 голосов
/ 25 октября 2013

Я столкнулся с точно такой же проблемой. У меня есть 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$*

Возможно, у вас уже есть первая строка, но это не предотвращает проблему. Добавление второй строки устранило проблему полностью. Я не думаю, что первая строка все еще нужна, но я еще не проверял это - и так как она в настоящее время работает ...;).

2 голосов
/ 29 мая 2018

Предложено в https://stackoverflow.com/a/19579355/6103242

-keep class **.R$*

- не самое элегантное решение, поскольку оно дает ProGuard команду сохранить все классы R независимо от того, в каком пакете они находятся.

Имея ту же проблему с WebView, я вижу ошибку в Logcat:

... E / AndroidProtocolHandler: Невозможно открыть URL ресурса: файл: ///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 - и в вашем проекте).

Чтобы понять разницу между -keepnames и -keep, пожалуйста, обратитесь к

«Различие между различными директивами ProGuard« -keep »*
Вт 29 мая 04:10:50 мск 2018
https://jebware.com/blog/?p=418

0 голосов
/ 28 марта 2012

Пожалуйста, смотрите первый ответ здесь:

Запрет Proguard для удаления определенных объектов

Это сработало для меня.

0 голосов
/ 15 марта 2012

добавьте следующее в ваш proguard.cfg и посмотрите, имеет ли это значение

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