Nano Hash - криптовалюты, майнинг, программирование

Android - dexguard удаляет значки меню

Привет, я запутываю свое приложение с помощью dexguard, и пока все работает нормально. Теперь я пытаюсь добавить значки в меню панели действий. без обфускации dexguard значки отображаются, но с ней они исчезают (текст остается). Я чувствую, что это как-то связано с тегом xml <menu>, поскольку обфускация не влияет на другой лайнер/относительный макет.

Это мои действия.xml (в res.layout значки находятся в res.drawble-xxx):

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android" android:layout_height="match_parent" android:layout_width="match_parent">

    <item android:id="@+id/action_1"
          android:title="action_1"
          android:icon="@drawable/action_1_icon"
    />

    <item android:id="@+id/action_2"
          android:title="action_2"
          android:icon="@drawable/action_2_icon"
    />

    <item android:id="@+id/action_3"
          android:title="action_3"
          android:icon="@drawable/action
 @Override
public boolean onPrepareOptionsMenu(Menu menu) {
    MenuItem action_1 = menu.findItem(R.id.action_1);
    action_1.setIcon(getResources().getDrawable(R.drawable.action_1_icon));

    MenuItem action_2 = menu.findItem(R.id.action_2);
    action_2.setIcon(getResources().getDrawable(R.drawable.action_2_icon));

    MenuItem action_3 = menu.findItem(R.id.action_3);
    action_3.setIcon(getResources().getDrawable(R.drawable.action_3_icon));

    return super.onPrepareOptionsMenu(menu);
}

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        MenuInflater inflater = getMenuInflater();
        inflater.inflate(R.layout.actions, menu);
        return super.onCreateOptionsMenu(menu);
    }
icon" /> </menu>

Я также пытался добавить их программно

 @Override
public boolean onPrepareOptionsMenu(Menu menu) {
    MenuItem action_1 = menu.findItem(R.id.action_1);
    action_1.setIcon(getResources().getDrawable(R.drawable.action_1_icon));

    MenuItem action_2 = menu.findItem(R.id.action_2);
    action_2.setIcon(getResources().getDrawable(R.drawable.action_2_icon));

    MenuItem action_3 = menu.findItem(R.id.action_3);
    action_3.setIcon(getResources().getDrawable(R.drawable.action_3_icon));

    return super.onPrepareOptionsMenu(menu);
}

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        MenuInflater inflater = getMenuInflater();
        inflater.inflate(R.layout.actions, menu);
        return super.onCreateOptionsMenu(menu);
    }

Но все же обфускация убирает значки меню.

РЕДАКТИРОВАТЬ: конфигурация dexguard

    -verbose
-dalvik

-dontshrink
-dontoptimize
-dontpreverify

-repackageclasses ''
-allowaccessmodification
-optimizations !code/simplification/arithmetic
-keepattributes *Annotation*
-keepresourcexmlattributenames
    manifest/installLocation,
    manifest/versionCode,
    manifest/application/*/intent-filter/*/name

-dontwarn javax.management.**
-dontwarn java.lang.management.**
-dontwarn org.apache.log4j.**
-dontwarn org.apache.commons.logging.**
-dontwarn org.slf4j.**
-dontwarn org.json.**

-keep public class * extends android.app.Activity
-keep public class * extends android.app.Application
-keep public class * extends android.app.Service
-keep public class * extends android.content.BroadcastReceiver
-keep public class * extends android.content.ContentProvider
-keep public class * extends android.app.backup.BackupAgentHelper
-keep public class * extends android.preference.Preference
-keep public class com.android.vending.licensing.ILicensingService
-keep class javax.** { *; }
-keep class org.** { *; }
-keep class twitter4j.** { *; }


-keepclasseswithmembernames class * {
    native <methods>;
}

-keepclasseswithmembernames class * {
    public <init>(android.content.Context, android.util.AttributeSet);
}

-keepclasseswithmembernames class * {
    public <init>(android.content.Context, android.util.AttributeSet, int);
}

-keepclassmembers enum * {
    public static **[] values();
    public static ** valueOf(java.lang.String);
}


-keep class * implements android.os.Parcelable {
  public static final android.os.Parcelable$Creator *;
}

-keep public class * extends android.app.Activity
-keep public class * extends android.app.Application
-keep public class * extends android.app.Service
-keep public class * extends android.content.BroadcastReceiver
-keep public class * extends android.content.ContentProvider

-keep public class * extends android.view.View {
    public <init>(android.content.Context);
    public <init>(android.content.Context, android.util.AttributeSet);
    public <init>(android.content.Context, android.util.AttributeSet, int);
    public void set*(...);
}


-keepclasseswithmembers class * {
    public <init>(android.content.Context, android.util.AttributeSet);
}

-keepclasseswithmembers class * {
    public <init>(android.content.Context, android.util.AttributeSet, int);
}

-keepclassmembers class * extends android.content.Context {
   public void *(android.view.View);
   public void *(android.view.MenuItem);
}

-keepclassmembers class * implements android.os.Parcelable {
    static ** CREATOR;
}

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

-keepclassmembers class * {
    @android.webkit.JavascriptInterface <methods>;
}

-keep public interface com.android.vending.licensing.ILicensingService

-dontwarn android.support.**

  • выложи конфиг dexguard 08.12.2015
  • Добавлен конфиг dexguard. 08.12.2015

Ответы:


1

Решение этой проблемы: класс Menu (под android.view) использует реализацию MenuBuilder (под android.support.v7.internal.view.menu). Поэтому я добавил правило

-keep class android.support.v7.internal.view.menu.** { *; }

и теперь это работает.

10.12.2015
Новые материалы

Кластеризация: более глубокий взгляд
Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

Как написать эффективное резюме
Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

Частный метод Python: улучшение инкапсуляции и безопасности
Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

Как я автоматизирую тестирование с помощью Jest
Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..