У меня есть несколько html-файлов в res/raw
, которые я открываю в WebView
. Но после обфускации они не загружаются.
Android: не удается найти файл .html в res / raw после обфускации
Ответы (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$*
Вероятно, у вас уже есть первая строка, но это не предотвращает проблемы. Добавление второй строки полностью устранило проблему. Я не думаю, что первая строка все еще нужна, но я еще не тестировал ее - и поскольку она в настоящее время работает ...;).
Предлагается в ответе на этот вопрос -
-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 { *; }
Однако вот я
- НЕ отключать сжатие и обфускацию для всех остальных внутренних классов в
R
, кромеraw
. таргетинг
R
только в одном конкретном пакете.Такой подход должен быть лучше в случае, если у вас есть более одного модуля в вашем проекте, который предоставляет свои собственные ресурсы, которые могут не понадобиться для одного конкретного APK, который вы создаете (например, имея более одного модуля android_application - источники APK - в вашем проекте).
Чтобы понять разницу между -keepnames
и -keep
, обратитесь к следующему.
Различие между различными директивами ProGuard -keep
- вторник, 29 мая, 04:10:50 MSK 2018
См. Первый ответ здесь:
Запретить Proguard удалить определенные чертежи
Это сработало для меня.
Это также можно сделать, создав 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