Android: не удается найти файл .html в res / raw после обфускации

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


person nibz    schedule 15.03.2012    source источник
comment
Что вы имеете в виду под невозможностью загрузить? Можете ли вы предоставить код, который вы используете для загрузки HTML-файла?   -  person Calvin    schedule 15.03.2012
comment
AFAIK, ProGuard не запутывает ресурсы. Каковы ваши доказательства того, что эта проблема связана с ProGuard? Как вы пытаетесь загрузить эти данные? Какова ваша точная ошибка (включая трассировку стека, если это исключение во время выполнения)?   -  person CommonsWare    schedule 15.03.2012
comment
Я загружаю URL-адрес таким образом webView.loadUrl (file: ///android_res/raw/help.html); Когда я создаю сборку Obfuscate, у меня не загружается веб-страница. В противном случае он работает без сборки Obfuscate.   -  person nibz    schedule 16.03.2012
comment
Возможный дубликат Запретить Proguard удалить определенные чертежи   -  person rds    schedule 07.04.2016


Ответы (4)


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

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

person Phil_R    schedule 25.10.2013

Предлагается в ответе на этот вопрос -

-keep class **.R$*

не самое элегантное решение, поскольку оно предписывает 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>; }

Очевидно, поскольку класс 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 MSK 2018

person vladZamskoi    schedule 29.05.2018
comment
Правило proguard работает только с keep, если я добавлю правило с keepnames, веб-просмотр не сможет найти html. пример: -keep class com.example.appname.R $ raw {*; } - person norbDEV; 25.10.2019

См. Первый ответ здесь:

Запретить Proguard удалить определенные чертежи

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

person Matt Holgate    schedule 28.03.2012

Это также можно сделать, создав 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

person beginner    schedule 07.07.2021