Android 使用ProGuard时碎片计数未按预期工作

Android 使用ProGuard时碎片计数未按预期工作,android,android-fragments,proguard,android-proguard,fragment-backstack,Android,Android Fragments,Proguard,Android Proguard,Fragment Backstack,我在AppCompatActivity上有一个函数,它确定片段列表中的片段数-下面是代码: if (getSupportFragmentManager().getBackStackEntryCount() > 0) { List<Fragment> fragmentList = getSupportFragmentManager().getFragments(); if (fragmentList != null) {

我在AppCompatActivity上有一个函数,它确定片段列表中的片段数-下面是代码:

if (getSupportFragmentManager().getBackStackEntryCount() > 0) {

            List<Fragment> fragmentList = getSupportFragmentManager().getFragments();

            if (fragmentList != null) {
                for (Fragment fragment : fragmentList) {
                    if (fragment != null) {
                        if (fragment.getClass().getSimpleName().equals("SelfCBaseFragment")) {

                            if (fragment.getChildFragmentManager().getBackStackEntryCount() > 1) {
                                fragment.getChildFragmentManager().popBackStack();

                            } else {
                                getSupportFragmentManager().popBackStack();
                                hideActionBar();
                            }
                        } else if (fragment.getClass().getSimpleName().equals("ABCFragment")) {

                            getSupportFragmentManager().popBackStackImmediate();
                        } else {
                            MyLog.d("FragmentName:", fragment.getClass().getSimpleName());
                            getSupportFragmentManager().popBackStack();
                        }
                    }

                }
            }
        } else {
            hideActionBar();
        }

这是使用
Proguard
和类名的预期行为。 你正在做:

fragment.getClass().getSimpleName().equals(“MyFragmentClassName”)

但是
MyFragmentClassName
是使用
Proguard
更改的,因此如果要解析原始类名,必须保留它

最优化的版本是只保留需要它的类的名称。 在这种情况下,您必须将以下内容添加到
Proguard
文件中:

-keepnames package.of.this.fragment.SelfCBaseFragment
-keepnames package.of.this.other.fragment.ABCFragment

解决此问题的更好方法可能是用模糊的类名称替换硬编码字符串。例如:

fragment.getClass().getName().equals(SelfCBaseFragment.class.getName())
这样,您仍然可以混淆
SelfCBaseFragment
类的名称,因为
fragment.getClass().getName()
将返回与
SelfCBaseFragment.class.getName()相同的值

fragment.getClass().getName().equals(SelfCBaseFragment.class.getName())