Android 使用ProGuard时碎片计数未按预期工作
我在AppCompatActivity上有一个函数,它确定片段列表中的片段数-下面是代码: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) {
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())