[Blankj/AndroidUtilCode]LanguageUtils 导致的Crash

2024-07-15 868 views
1
描述 Bug

使用 LanguageUtils 导致的crash 。 将ActivityLifecycleImpl中的 LanguageUtils.applyLanguage(activity); 注释掉之后,就不会爆出这个 crash 了

  • AndroidUtilCode 的版本:1.29
  • 出现 Bug 的设备型号:GlocalMe S20iQ19
  • 设备的 Android 版本:28
相关代码
        @Override
        public void onActivityCreated(Activity activity, Bundle savedInstanceState) {
//            LanguageUtils.applyLanguage(activity);
            setAnimatorsEnabled();
            setTopActivity(activity);
        }
异常堆栈
2020-09-15 17:24:38.558 27235-27235/com.wws.kimifi E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.wws.kimifi, PID: 27235
    java.lang.IllegalArgumentException: Service not registered: IF@f4e9486
        at android.app.LoadedApk.forgetServiceDispatcher(LoadedApk.java:1562)
        at android.app.ContextImpl.unbindService(ContextImpl.java:1692)
        at android.content.ContextWrapper.unbindService(ContextWrapper.java:717)
        at android.content.ContextWrapper.unbindService(ContextWrapper.java:717)
        at IE.handleMessage(PG:63)
        at android.os.Handler.dispatchMessage(Handler.java:102)
        at android.os.Looper.loop(Looper.java:197)
        at android.app.ActivityThread.main(ActivityThread.java:6764)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)

回答

7

更具体的定位是:

private static void updateLanguage(final Context context, Locale locale) {
        Resources resources = context.getResources();
        Configuration config = resources.getConfiguration();
        Locale contextLocale = config.locale;
        if (isSameLocale(contextLocale, locale)) {
            return;
        }
        DisplayMetrics dm = resources.getDisplayMetrics();
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
            config.setLocale(locale);
            if (context instanceof Application) {
                Context newContext = context.createConfigurationContext(config);
                try {
                    //noinspection JavaReflectionMemberAccess
//                    Field mBaseField = ContextWrapper.class.getDeclaredField("mBase");
//                    mBaseField.setAccessible(true);
//                    mBaseField.set(context, newContext);
                } catch (Exception ignored) {/**/}
            }
        } else {

try catch 中被我注释掉的那一段。 注释掉之后就不会crash。 不注释掉就会crash。 并且注释掉之后, 切换语言失败。

8

然而,最奇怪的是我整个app中就没有调用过 unbindservice 这个方法

8

点击切换语言的地方的代码

    @Override
    public void textRightDown(View view) {
        super.textRightDown(view);
        LanguageView languageView = (LanguageView) view.getTag();
        LanguageUtils.applyLanguage(new Locale(languageView.getCountry(), languageView.getLanguage()),HomePage.class);

//        setAppLanguage(languageView.getLanguage(), languageView.getCountry());
    }
2

你这边有插件化 hook context 么?

1

项目中没有使用插件化技术

1

其他手机也会有这个问题吗

3

印象中,使用小米手机的时候也出现了。

3

我这边很多机型都出现了这个问题. 类似这些 java.lang.IllegalArgumentException: Receiver not registered: com.bumptech.glide.manager.DefaultConnectivityMonitor$1@7a46156 at android.app.LoadedApk.forgetReceiverDispatcher(LoadedApk.java:1338) at android.app.ContextImpl.unregisterReceiver(ContextImpl.java:1583) at android.content.ContextWrapper.unregisterReceiver(ContextWrapper.java:672) at com.bumptech.glide.manager.DefaultConnectivityMonitor.unregister(DefaultConnectivityMonitor.java:76) at com.bumptech.glide.manager.DefaultConnectivityMonitor.onStop(DefaultConnectivityMonitor.java:111) at com.bumptech.glide.manager.ActivityFragmentLifecycle.onStop(ActivityFragmentLifecycle.java:58) at com.bumptech.glide.manager.SupportRequestManagerFragment.onStop(SupportRequestManagerFragment.java:209) at androidx.fragment.app.Fragment.performStop(Fragment.java:2894) at androidx.fragment.app.FragmentStateManager.stop(FragmentStateManager.java:381) at androidx.fragment.app.FragmentManager.moveToState(FragmentManager.java:1209) at androidx.fragment.app.FragmentManager.moveToState(FragmentManager.java:1354) at androidx.fragment.app.FragmentManager.moveFragmentToExpectedState(FragmentManager.java:1432) at androidx.fragment.app.FragmentManager.moveToState(FragmentManager.java:1495) at androidx.fragment.app.FragmentManager.dispatchStateChange(FragmentManager.java:2617) at androidx.fragment.app.FragmentManager.dispatchStop(FragmentManager.java:2590) at androidx.fragment.app.FragmentController.dispatchStop(FragmentController.java:291) at androidx.fragment.app.FragmentActivity.onStop(FragmentActivity.java:563) at com.oversea.commonmodule.base.BaseAppActivity.onStop(BaseAppActivity.java:63) at android.app.Instrumentation.callActivityOnStop(Instrumentation.java:1432) at android.app.Activity.performStop(Activity.java:7653) at android.app.ActivityThread.callActivityOnStop(ActivityThread.java:4372)

1

经过测试出现闪退之后删除设置语言的代码之后还是会出现这些类似的闪退. 卸载重装之后才会修复, 不知道什么原因导致的.

8

@Liangwenb 去除代码要清理 app 数据才行,不然工具类会读取你上次存储的语言而调用到

1

@Blankj 好的谢谢.

7

新版本 1.30.0 已发布,已修复 bug

8

@Blankj 更新后切换语言会黑屏一下,怎么处理?

0

谢谢大哥