【问题标题】:Keep classes that use reflection Android Proguard保留使用反射 Android Proguard 的类
【发布时间】:2017-03-06 01:15:45
【问题描述】:

我正在尝试使用这个类。它在调试版本上运行良好,但在发布版本上从不运行。我知道 proguard 将其删除,所以问题是如何保留该课程?

import android.support.design.internal.BottomNavigationItemView;
import android.support.design.internal.BottomNavigationMenuView;
import android.support.design.widget.BottomNavigationView;
import android.util.Log;
import java.lang.reflect.Field;

public class BottomNavigationViewHelper {
    public static void disableShiftMode(BottomNavigationView view) {
        BottomNavigationMenuView menuView = (BottomNavigationMenuView) view.getChildAt(0);
        try {
            Field shiftingMode = menuView.getClass().getDeclaredField("mShiftingMode");
            shiftingMode.setAccessible(true);
            shiftingMode.setBoolean(menuView, false);
            shiftingMode.setAccessible(false);
            for (int i = 0; i < menuView.getChildCount(); i++) {
                BottomNavigationItemView item = (BottomNavigationItemView) menuView.getChildAt(i);
                //noinspection RestrictedApi 
                item.setShiftingMode(false);
                // set once again checked value, so view will be updated 
                //noinspection RestrictedApi 
                item.setChecked(item.getItemData().isChecked());
            }
        } catch (NoSuchFieldException e) {
            Log.e("BNVHelper", "Unable to get shift mode field", e);
        } catch (IllegalAccessException e) {
            Log.e("BNVHelper", "Unable to change value of shift mode", e);
        }
    }
} 

【问题讨论】:

    标签: java android reflection android-proguard


    【解决方案1】:

    这对我有用。

    # Bottom Navigation Helper
    -keep class android.support.design.internal.BottomNavigationItemView{ *; }
    -keep class android.support.design.internal.BottomNavigationMenuView{ *; }
    

    【讨论】:

    • 也可以使用Android支持注解@Keep代替修改proguard配置文件。
    • {*;} 是做什么的?
    • 它将停止更改 BottomNavigationItemView 类中的构造函数名称和函数名称.. @Mr.Nacho
    【解决方案2】:

    继续上课

    -keep class com.example.** { *; }
    

    保持属性,

    -keepclassmembers class com.example.** { <fields>; }
    

    【讨论】:

    • 我试过这个没有运气#底部导航助手 -keep class android.support.design.widget.BottomNavigationView { *; } -keepclassmembers 类 android.support.design.widget.BottomNavigationView{ *; } -keep 类 android.support.design.internal.BottomNavigationItemView { *; } -keepclassmembers 类 android.support.design.internal.BottomNavigationItemView{ *; } -keep 类 com.maachla.android.utils.BottomNavigationViewHelper { *; } -keepclassmembers 类 com.maachla.android.utils.BottomNavigationViewHelper{ *; }
    • 不是为每个班级都这样做,你可以做 -keep class com.maachla.android.utils.** { *; }
    • 我试过了,还是不行。我认为问题出在支持库类中
    猜你喜欢
    • 1970-01-01
    • 2013-03-25
    • 2012-06-13
    • 2011-05-25
    • 1970-01-01
    • 1970-01-01
    • 2014-05-02
    • 1970-01-01
    • 2017-02-01
    相关资源
    最近更新 更多