简体   繁体   中英

Android - dexguard removes menu icons

Hey I'm obfuscating my app using dexguard and so far everything worked fine. Now I'm trying to add icons to the action bar menu. without dexguard obfuscation the icons are shown but with it they disappear(the text is still there). I feel that is has something to do with the xml <menu> tag since the obfuscation doesn't affect other liner/relative layout.

This is my actions.xml (under res.layout, icons are under 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_3_icon"
    />

</menu>

I've also tried to add them programmatically

 @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);
    }

But still obfuscation removes the menu icons.

EDIT: dexguard config

    -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.**

The solution for this issue: The Menu class (under android.view ) is using the MenuBuilder implementation (under android.support.v7.internal.view.menu ). So I've added the rule

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

and now it works.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM