先发日志
java.lang.NoSuchMethodError: No static method isNoneEmpty([Ljava/lang/CharSequence;)Z in class Lorg/apache/commons/lang3/StringUtils; or its super classes (declaration of 'org.apache.commons.lang3.StringUtils' appears in /system/framework/framework.jar:classes2.dex)
at com.xingheng.shell_basic.bean.OrderDoorBell.getData(OrderDoorBell.java)
at com.xinghengedu.shell3.view.NotVipTipsDialogFragment.toOraderAct(NotVipTipsDialogFragment.java)
at com.xinghengedu.shell3.view.NotVipTipsDialogFragment.onMTvPayClick(NotVipTipsDialogFragment.java)
at com.xinghengedu.shell3.view.NotVipTipsDialogFragment_ViewBinding$1.doClick(NotVipTipsDialogFragment_ViewBinding.java)
at butterknife.internal.DebouncingOnClickListener.onClick(DebouncingOnClickListener.java)
at android.view.View.performClick(View.java:5267)
at android.view.View$PerformClick.run(View.java:21540)
at android.os.Handler.handleCallback(Handler.java:815)
at android.os.Handler.dispatchMessage(Handler.java:104)
at android.os.Looper.loop(Looper.java:207)
at android.app.ActivityThread.main(ActivityThread.java:5710)
at java.lang.reflect.Method.invoke(Method.java)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:900)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:761)
想了很久也没有明白是怎么会儿事,只出现在小米和红米的部分机型。
反编译了代码,StringUtils 这个类是存在的。
后来,突然想明白了,应该是小米的系统内置了这个类,然后有没有isNoneEmpty()这个方法,所以报错。
写个demo测试一下。
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
public void onTestClick(View view) {
try {
showStringUtils();
} catch (ClassNotFoundException e) {
e.printStackTrace();
Toast.makeText(this, "没有找到org.apache.commons.lang3.StringUtils", Toast.LENGTH_SHORT).show();
}
}
/**
* 显示StringUtils 这个类
*
* @throws ClassNotFoundException
*/
public void showStringUtils() throws ClassNotFoundException {
Class<?> stringUtilsClass = Class.forName("org.apache.commons.lang3.StringUtils");
Method[] methods = stringUtilsClass.getMethods();
List<String> names = new ArrayList<>();
for (Method method : methods) {
names.add(method.getName());
}
String[] a = names.toArray(new String[0]);
new AlertDialog.Builder(this)
.setTitle("org.apache.commons.lang3.StringUtils")
.setMultiChoiceItems(a, null, null)
.show();
}
}
在自己的没问题的测试机上试一下。
在testin 上找一个有问题的红米3试一下
果然,是系统内置了这个类,但是没有isNoneEmpty这个方法,
至此解决了这个问题,由于小米系统内置了org.apache.commons:commons-lang3:3.5
,所以最好不要在apk中使用这个工具库。
简单的解决方案,混淆这个包,就可以了,这样就和系统内置的变成 了两个包