Почему инициализация Fresco в фоновом режиме приведет к 3 ‰ странным сбоям в работе? - PullRequest
0 голосов
/ 31 октября 2019

Я работаю над функцией, которая перемещает инициализацию Fresco из потока пользовательского интерфейса в фоновый поток, находясь в приложении onCreate. Важнейшая часть этого заключается в том, чтобы убедиться, что Fresco должен быть инициализирован перед использованием соответствующих кодов.

Во-первых, я написал прокси для предоставления ensureInit, которые должны вызываться до того, как все API Fresco будутПозвонил.

public class FrescoProxy {

    public interface InitializeBridge {
        void initFresco(final Context context);

        Context getContext();
    }

    private static InitializeBridge sBridge;
    private static boolean sHasFrescoInitialized = false;
    private static final Object sLock = new Object();

    public static void setInitBridge(InitializeBridge bridge) {
        sBridge = bridge;
    }

    public static ImagePipeline getImagePipeline() {
        long t = SystemClock.elapsedRealtime();
        try {
            ensureInit();
            return Fresco.getImagePipelineFactory().getImagePipeline();
        } finally {
            if (DEBUG_PERF) {
                Log.d(TAG, "getImagePipeline cost ~ " + (SystemClock.elapsedRealtime() - t));
            }
        }
    }

    public static PipelineDraweeControllerBuilder newDraweeControllerBuilder() {
        long t = SystemClock.elapsedRealtime();
        try {
            ensureInit();
            return Fresco.newDraweeControllerBuilder();
        } finally {
            if (DEBUG_PERF) {
                Log.d(TAG, "newDraweeControllerBuilder cost ~ " + (SystemClock.elapsedRealtime() - t));
            }
        }
    }

    public static boolean hasBeenInitialized() {
        return sHasFrescoInitialized;
    }

    /**
     * Make sure fresco's initialization.
     */
    public static void ensureInit() {
        if (DEBUG_PERF) {
            Log.d(TAG, "Init called in [" + Thread.currentThread().getName() + ", " + Thread.currentThread().getId() + "]");
        }
        if (sHasFrescoInitialized) {
            return;
        }

        synchronized (sLock) {
            long t = SystemClock.elapsedRealtime();

            try {
                if (sBridge != null) {
                    // InitBridge is quite simple: create configs and call Fresco.init()
                    sBridge.initFresco(sBridge.getContext());
                    sHasFrescoInitialized = true;
                }
            } catch (Throwable e) {
                Log.e(TAG, "Init via bridge failed, bridge is " + sBridge, e);
            }

            if (DEBUG_PERF) {
                Log.d(TAG, "Init cost ~ " + (SystemClock.elapsedRealtime() - t));
            }
        }
    }
}

В нашей кодовой базе мы используем и плательщики, и конвейерные API.

Для трубопроводов легко сохранять инициализацию фрески перед использованием,

, например:

private static void cacheImageByUri(Uri uri) {
    ImagePipeline imagePipeline = FrescoProxy.getImagePipeline();
    imagePipeline.prefetchToDiskCache(ImageRequest.fromUri(uri), null);
}

или:

fun playMonsterNormalAnimation() {
    val uri = Uri.fromFile(animationFile)
    val controller = FrescoProxy.newDraweeControllerBuilder()
    .setUri(uri)
    .setAutoPlayAnimations(true)
    .build()
    monster_img?.controller = controller
}

Для плательщиков:не так просто внедрить мои прокси-методы, если не изменять исходный код drawee в Java. (Некоторые классы drawee используют вещи, инициализированные в Fresco.init(), в своих конструкторах, поэтому невозможно разрешить запуск моих прокси-методов до super())

Наконец, я создаю оболочки-представления drawee для инъекций ensureInitпусть все подклассы drawee расширяют эти оболочки или используют оболочки непосредственно в xmls вместо оригинальных представлений drawee. Как это:

public class SimpleDraweeViewWrapper extends SimpleDraweeView {
    static {
        FrescoProxy.ensureInit();
    }
    ...
}

или это:

        <com.mycmpy.view.SimpleDraweeViewWrapper
            fresco:placeholderImage="@drawable/ic_task_bonus"
            android:id="@+id/task_bonus"
            android:layout_marginEnd="4dp"
            android:layout_gravity="center_vertical"
            android:src="@drawable/ic_task_bonus"
            android:layout_width="14dp"
            android:layout_height="14dp" />

После того, как все замены были сделаны, я протестировал на Nexus 6p с Android 8.1.0, Galaxy S6 edge с Android 5.1.1, все работает нормально.

Но когда я публикую apk в Google Play для 5% поэтапного развертывания, я получил несколько отчетов о сбоях, которые показывают, что Freso не был инициализирован до фактического использования. Вхождение составляет около 1 ‰.

Отчеты о трассировке:

-----infromation----
device=G-TiDE_S5
hardware=mt6592
manufacturer=JITAI
model=G-TiDE S5
release=4.4.2
sdk=19
language=en
country=SA//
runtime=94162437

----exception stack trace----
android.view.InflateException: Binary XML file line #269: Error inflating class com.myksm.leaderbd.LeadBoardView
    at android.view.LayoutInflater.createView(LayoutInflater.java:620)
    at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:696)
    at android.view.LayoutInflater.rInflate(LayoutInflater.java:755)
    at android.view.LayoutInflater.parseInclude(LayoutInflater.java:839)
    at android.view.LayoutInflater.rInflate(LayoutInflater.java:745)
    at android.view.LayoutInflater.rInflate(LayoutInflater.java:758)
    at android.view.LayoutInflater.rInflate(LayoutInflater.java:758)
    at android.view.LayoutInflater.inflate(LayoutInflater.java:492)
    at android.view.LayoutInflater.inflate(LayoutInflater.java:397)
    at com.myksm.v.chat.activity.ChatFragWatchL.onCreateView(ChatFragWatchL.java:865)
    at androidx.fragment.app.Fragment.performCreateView(Fragment.java:2439)
    at androidx.fragment.app.FragmentManagerImpl.moveToState(FragmentManager.java:1460)
    at androidx.fragment.app.FragmentManagerImpl.moveFragmentToExpectedState(FragmentManager.java:1784)
    at androidx.fragment.app.FragmentManagerImpl.moveToState(FragmentManager.java:1852)
    at androidx.fragment.app.BackStackRecord.executeOps(BackStackRecord.java:802)
    at androidx.fragment.app.FragmentManagerImpl.executeOps(FragmentManager.java:2625)
    at androidx.fragment.app.FragmentManagerImpl.executeOpsTogether(FragmentManager.java:2411)
    at androidx.fragment.app.FragmentManagerImpl.removeRedundantOperationsAndExecute(FragmentManager.java:2366)
    at androidx.fragment.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:2273)
    at androidx.fragment.app.FragmentManagerImpl$1.run(FragmentManager.java:733)
    at android.os.Handler.handleCallback(Handler.java:808)
    at android.os.Handler.dispatchMessage(Handler.java:103)
    at android.os.Looper.loop(Looper.java:193)
    at android.app.ActivityThread.main(ActivityThread.java:5368)
    at java.lang.reflect.Method.invokeNative(Native Method)
    at java.lang.reflect.Method.invoke(Method.java:515)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:828)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:644)
    at dalvik.system.NativeStart.main(Native Method)
Caused by: java.lang.reflect.InvocationTargetException
    at java.lang.reflect.Constructor.constructNative(Native Method)
    at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
    at android.view.LayoutInflater.createView(LayoutInflater.java:594)
    ... 28 more
Caused by: android.view.InflateException: Binary XML file line #24: Error inflating class com.mycmpy.view.SimpleDraweeViewWrapper
    at android.view.LayoutInflater.createView(LayoutInflater.java:620)
    at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:696)
    at android.view.LayoutInflater.rInflate(LayoutInflater.java:755)
    at android.view.LayoutInflater.rInflate(LayoutInflater.java:758)
    at android.view.LayoutInflater.inflate(LayoutInflater.java:492)
    at android.view.LayoutInflater.inflate(LayoutInflater.java:397)
    at android.view.LayoutInflater.inflate(LayoutInflater.java:353)
    at com.myksm.leaderbd.LeadBoardView.a(LeadBoardView.java:67)
    at com.myksm.leaderbd.LeadBoardView.(LeadBoardView.java:58)
    ... 31 more
Caused by: java.lang.reflect.InvocationTargetException
    at java.lang.reflect.Constructor.constructNative(Native Method)
    at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
    at android.view.LayoutInflater.createView(LayoutInflater.java:594)
    ... 39 more
Caused by: java.lang.NullPointerException: SimpleDraweeView was not initialized!
    at com.facebook.common.internal.Preconditions.checkNotNull(Preconditions.java:226)
    at com.facebook.drawee.view.SimpleDraweeView.init(SimpleDraweeView.java:87)
    at com.facebook.drawee.view.SimpleDraweeView.(SimpleDraweeView.java:64)
    at com.mycmpy.view.SimpleDraweeViewWrapper.(SimpleDraweeViewWrapper.java:24)
    ... 42 more
java.lang.reflect.InvocationTargetException
    at java.lang.reflect.Constructor.constructNative(Native Method)
    at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
    at android.view.LayoutInflater.createView(LayoutInflater.java:594)
    at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:696)
    at android.view.LayoutInflater.rInflate(LayoutInflater.java:755)
    at android.view.LayoutInflater.parseInclude(LayoutInflater.java:839)
    at android.view.LayoutInflater.rInflate(LayoutInflater.java:745)
    at android.view.LayoutInflater.rInflate(LayoutInflater.java:758)
    at android.view.LayoutInflater.rInflate(LayoutInflater.java:758)
    at android.view.LayoutInflater.inflate(LayoutInflater.java:492)
    at android.view.LayoutInflater.inflate(LayoutInflater.java:397)
    at com.myksm.v.chat.activity.ChatFragWatchL.onCreateView(ChatFragWatchL.java:865)
    at androidx.fragment.app.Fragment.performCreateView(Fragment.java:2439)
    at androidx.fragment.app.FragmentManagerImpl.moveToState(FragmentManager.java:1460)
    at androidx.fragment.app.FragmentManagerImpl.moveFragmentToExpectedState(FragmentManager.java:1784)
    at androidx.fragment.app.FragmentManagerImpl.moveToState(FragmentManager.java:1852)
    at androidx.fragment.app.BackStackRecord.executeOps(BackStackRecord.java:802)
    at androidx.fragment.app.FragmentManagerImpl.executeOps(FragmentManager.java:2625)
    at androidx.fragment.app.FragmentManagerImpl.executeOpsTogether(FragmentManager.java:2411)
    at androidx.fragment.app.FragmentManagerImpl.removeRedundantOperationsAndExecute(FragmentManager.java:2366)
    at androidx.fragment.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:2273)
    at androidx.fragment.app.FragmentManagerImpl$1.run(FragmentManager.java:733)
    at android.os.Handler.handleCallback(Handler.java:808)
    at android.os.Handler.dispatchMessage(Handler.java:103)
    at android.os.Looper.loop(Looper.java:193)
    at android.app.ActivityThread.main(ActivityThread.java:5368)
    at java.lang.reflect.Method.invokeNative(Native Method)
    at java.lang.reflect.Method.invoke(Method.java:515)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:828)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:644)
    at dalvik.system.NativeStart.main(Native Method)
Caused by: android.view.InflateException: Binary XML file line #24: Error inflating class com.mycmpy.view.SimpleDraweeViewWrapper
    at android.view.LayoutInflater.createView(LayoutInflater.java:620)
    at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:696)
    at android.view.LayoutInflater.rInflate(LayoutInflater.java:755)
    at android.view.LayoutInflater.rInflate(LayoutInflater.java:758)
    at android.view.LayoutInflater.inflate(LayoutInflater.java:492)
    at android.view.LayoutInflater.inflate(LayoutInflater.java:397)
    at android.view.LayoutInflater.inflate(LayoutInflater.java:353)
    at com.myksm.leaderbd.LeadBoardView.a(LeadBoardView.java:67)
    at com.myksm.leaderbd.LeadBoardView.(LeadBoardView.java:58)
    ... 31 more
Caused by: java.lang.reflect.InvocationTargetException
    at java.lang.reflect.Constructor.constructNative(Native Method)
    at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
    at android.view.LayoutInflater.createView(LayoutInflater.java:594)
    ... 39 more
Caused by: java.lang.NullPointerException: SimpleDraweeView was not initialized!
    at com.facebook.common.internal.Preconditions.checkNotNull(Preconditions.java:226)
    at com.facebook.drawee.view.SimpleDraweeView.init(SimpleDraweeView.java:87)
    at com.facebook.drawee.view.SimpleDraweeView.(SimpleDraweeView.java:64)
    at com.mycmpy.view.SimpleDraweeViewWrapper.(SimpleDraweeViewWrapper.java:24)
    ... 42 more
android.view.InflateException: Binary XML file line #24: Error inflating class com.mycmpy.view.SimpleDraweeViewWrapper
    at android.view.LayoutInflater.createView(LayoutInflater.java:620)
    at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:696)
    at android.view.LayoutInflater.rInflate(LayoutInflater.java:755)
    at android.view.LayoutInflater.rInflate(LayoutInflater.java:758)
    at android.view.LayoutInflater.inflate(LayoutInflater.java:492)
    at android.view.LayoutInflater.inflate(LayoutInflater.java:397)
    at android.view.LayoutInflater.inflate(LayoutInflater.java:353)
    at com.myksm.leaderbd.LeadBoardView.a(LeadBoardView.java:67)
    at com.myksm.leaderbd.LeadBoardView.(LeadBoardView.java:58)
    at java.lang.reflect.Constructor.constructNative(Native Method)
    at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
    at android.view.LayoutInflater.createView(LayoutInflater.java:594)
    at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:696)
    at android.view.LayoutInflater.rInflate(LayoutInflater.java:755)
    at android.view.LayoutInflater.parseInclude(LayoutInflater.java:839)
    at android.view.LayoutInflater.rInflate(LayoutInflater.java:745)
    at android.view.LayoutInflater.rInflate(LayoutInflater.java:758)
    at android.view.LayoutInflater.rInflate(LayoutInflater.java:758)
    at android.view.LayoutInflater.inflate(LayoutInflater.java:492)
    at android.view.LayoutInflater.inflate(LayoutInflater.java:397)
    at com.myksm.v.chat.activity.ChatFragWatchL.onCreateView(ChatFragWatchL.java:865)
    at androidx.fragment.app.Fragment.performCreateView(Fragment.java:2439)
    at androidx.fragment.app.FragmentManagerImpl.moveToState(FragmentManager.java:1460)
    at androidx.fragment.app.FragmentManagerImpl.moveFragmentToExpectedState(FragmentManager.java:1784)
    at androidx.fragment.app.FragmentManagerImpl.moveToState(FragmentManager.java:1852)
    at androidx.fragment.app.BackStackRecord.executeOps(BackStackRecord.java:802)
    at androidx.fragment.app.FragmentManagerImpl.executeOps(FragmentManager.java:2625)
    at androidx.fragment.app.FragmentManagerImpl.executeOpsTogether(FragmentManager.java:2411)
    at androidx.fragment.app.FragmentManagerImpl.removeRedundantOperationsAndExecute(FragmentManager.java:2366)
    at androidx.fragment.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:2273)
    at androidx.fragment.app.FragmentManagerImpl$1.run(FragmentManager.java:733)
    at android.os.Handler.handleCallback(Handler.java:808)
    at android.os.Handler.dispatchMessage(Handler.java:103)
    at android.os.Looper.loop(Looper.java:193)
    at android.app.ActivityThread.main(ActivityThread.java:5368)
    at java.lang.reflect.Method.invokeNative(Native Method)
    at java.lang.reflect.Method.invoke(Method.java:515)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:828)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:644)
    at dalvik.system.NativeStart.main(Native Method)
Caused by: java.lang.reflect.InvocationTargetException
    at java.lang.reflect.Constructor.constructNative(Native Method)
    at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
    at android.view.LayoutInflater.createView(LayoutInflater.java:594)
    ... 39 more
Caused by: java.lang.NullPointerException: SimpleDraweeView was not initialized!
    at com.facebook.common.internal.Preconditions.checkNotNull(Preconditions.java:226)
    at com.facebook.drawee.view.SimpleDraweeView.init(SimpleDraweeView.java:87)
    at com.facebook.drawee.view.SimpleDraweeView.(SimpleDraweeView.java:64)
    at com.mycmpy.view.SimpleDraweeViewWrapper.(SimpleDraweeViewWrapper.java:24)
    ... 42 more
java.lang.reflect.InvocationTargetException
    at java.lang.reflect.Constructor.constructNative(Native Method)
    at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
    at android.view.LayoutInflater.createView(LayoutInflater.java:594)
    at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:696)
    at android.view.LayoutInflater.rInflate(LayoutInflater.java:755)
    at android.view.LayoutInflater.rInflate(LayoutInflater.java:758)
    at android.view.LayoutInflater.inflate(LayoutInflater.java:492)
    at android.view.LayoutInflater.inflate(LayoutInflater.java:397)
    at android.view.LayoutInflater.inflate(LayoutInflater.java:353)
    at com.myksm.leaderbd.LeadBoardView.a(LeadBoardView.java:67)
    at com.myksm.leaderbd.LeadBoardView.(LeadBoardView.java:58)
    at java.lang.reflect.Constructor.constructNative(Native Method)
    at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
    at android.view.LayoutInflater.createView(LayoutInflater.java:594)
    at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:696)
    at android.view.LayoutInflater.rInflate(LayoutInflater.java:755)
    at android.view.LayoutInflater.parseInclude(LayoutInflater.java:839)
    at android.view.LayoutInflater.rInflate(LayoutInflater.java:745)
    at android.view.LayoutInflater.rInflate(LayoutInflater.java:758)
    at android.view.LayoutInflater.rInflate(LayoutInflater.java:758)
    at android.view.LayoutInflater.inflate(LayoutInflater.java:492)
    at android.view.LayoutInflater.inflate(LayoutInflater.java:397)
    at com.myksm.v.chat.activity.ChatFragWatchL.onCreateView(ChatFragWatchL.java:865)
    at androidx.fragment.app.Fragment.performCreateView(Fragment.java:2439)
    at androidx.fragment.app.FragmentManagerImpl.moveToState(FragmentManager.java:1460)
    at androidx.fragment.app.FragmentManagerImpl.moveFragmentToExpectedState(FragmentManager.java:1784)
    at androidx.fragment.app.FragmentManagerImpl.moveToState(FragmentManager.java:1852)
    at androidx.fragment.app.BackStackRecord.executeOps(BackStackRecord.java:802)
    at androidx.fragment.app.FragmentManagerImpl.executeOps(FragmentManager.java:2625)
    at androidx.fragment.app.FragmentManagerImpl.executeOpsTogether(FragmentManager.java:2411)
    at androidx.fragment.app.FragmentManagerImpl.removeRedundantOperationsAndExecute(FragmentManager.java:2366)
    at androidx.fragment.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:2273)
    at androidx.fragment.app.FragmentManagerImpl$1.run(FragmentManager.java:733)
    at android.os.Handler.handleCallback(Handler.java:808)
    at android.os.Handler.dispatchMessage(Handler.java:103)
    at android.os.Looper.loop(Looper.java:193)
    at android.app.ActivityThread.main(ActivityThread.java:5368)
    at java.lang.reflect.Method.invokeNative(Native Method)
    at java.lang.reflect.Method.invoke(Method.java:515)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:828)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:644)
    at dalvik.system.NativeStart.main(Native Method)
Caused by: java.lang.NullPointerException: SimpleDraweeView was not initialized!
    at com.facebook.common.internal.Preconditions.checkNotNull(Preconditions.java:226)
    at com.facebook.drawee.view.SimpleDraweeView.init(SimpleDraweeView.java:87)
    at com.facebook.drawee.view.SimpleDraweeView.(SimpleDraweeView.java:64)
    at com.mycmpy.view.SimpleDraweeViewWrapper.(SimpleDraweeViewWrapper.java:24)
    ... 42 more
java.lang.NullPointerException: SimpleDraweeView was not initialized!
    at com.facebook.common.internal.Preconditions.checkNotNull(Preconditions.java:226)
    at com.facebook.drawee.view.SimpleDraweeView.init(SimpleDraweeView.java:87)
    at com.facebook.drawee.view.SimpleDraweeView.(SimpleDraweeView.java:64)
    at com.mycmpy.view.SimpleDraweeViewWrapper.(SimpleDraweeViewWrapper.java:24)
    at java.lang.reflect.Constructor.constructNative(Native Method)
    at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
    at android.view.LayoutInflater.createView(LayoutInflater.java:594)
    at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:696)
    at android.view.LayoutInflater.rInflate(LayoutInflater.java:755)
    at android.view.LayoutInflater.rInflate(LayoutInflater.java:758)
    at android.view.LayoutInflater.inflate(LayoutInflater.java:492)
    at android.view.LayoutInflater.inflate(LayoutInflater.java:397)
    at android.view.LayoutInflater.inflate(LayoutInflater.java:353)
    at com.myksm.leaderbd.LeadBoardView.a(LeadBoardView.java:67)
    at com.myksm.leaderbd.LeadBoardView.(LeadBoardView.java:58)
    at java.lang.reflect.Constructor.constructNative(Native Method)
    at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
    at android.view.LayoutInflater.createView(LayoutInflater.java:594)
    at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:696)
    at android.view.LayoutInflater.rInflate(LayoutInflater.java:755)
    at android.view.LayoutInflater.parseInclude(LayoutInflater.java:839)
    at android.view.LayoutInflater.rInflate(LayoutInflater.java:745)
    at android.view.LayoutInflater.rInflate(LayoutInflater.java:758)
    at android.view.LayoutInflater.rInflate(LayoutInflater.java:758)
    at android.view.LayoutInflater.inflate(LayoutInflater.java:492)
    at android.view.LayoutInflater.inflate(LayoutInflater.java:397)
    at com.myksm.v.chat.activity.ChatFragWatchL.onCreateView(ChatFragWatchL.java:865)
    at androidx.fragment.app.Fragment.performCreateView(Fragment.java:2439)
    at androidx.fragment.app.FragmentManagerImpl.moveToState(FragmentManager.java:1460)
    at androidx.fragment.app.FragmentManagerImpl.moveFragmentToExpectedState(FragmentManager.java:1784)
    at androidx.fragment.app.FragmentManagerImpl.moveToState(FragmentManager.java:1852)
    at androidx.fragment.app.BackStackRecord.executeOps(BackStackRecord.java:802)
    at androidx.fragment.app.FragmentManagerImpl.executeOps(FragmentManager.java:2625)
    at androidx.fragment.app.FragmentManagerImpl.executeOpsTogether(FragmentManager.java:2411)
    at androidx.fragment.app.FragmentManagerImpl.removeRedundantOperationsAndExecute(FragmentManager.java:2366)
    at androidx.fragment.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:2273)
    at androidx.fragment.app.FragmentManagerImpl$1.run(FragmentManager.java:733)
    at android.os.Handler.handleCallback(Handler.java:808)
    at android.os.Handler.dispatchMessage(Handler.java:103)
    at android.os.Looper.loop(Looper.java:193)
    at android.app.ActivityThread.main(ActivityThread.java:5368)
    at java.lang.reflect.Method.invokeNative(Native Method)
    at java.lang.reflect.Method.invoke(Method.java:515)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:828)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:644)
    at dalvik.system.NativeStart.main(Native Method)

Другой тип отчетов о сбоях (около 2 ‰ вхождения):

-----infromation----
device=eve_sprout
hardware=qcom
manufacturer=SHARP
model=507SH
release=8.1.0
sdk=27
language=ja
country=JP/JP/JP
runtime=305516

----exception stack trace----
android.view.InflateException: Binary XML file line #244: Binary XML file line #262: You must supply a layout_width attribute.
Caused by: java.lang.UnsupportedOperationException: Binary XML file line #262: You must supply a layout_width attribute.
    at android.content.res.TypedArray.getLayoutDimension(TypedArray.java:775)
    at android.view.ViewGroup$LayoutParams.setBaseAttributes(ViewGroup.java:7554)
    at android.view.ViewGroup$MarginLayoutParams.init(ViewGroup.java:7746)
    at android.widget.FrameLayout$LayoutParams.init(FrameLayout.java:439)
    at android.widget.FrameLayout.generateLayoutParams(FrameLayout.java:370)
    at android.widget.FrameLayout.generateLayoutParams(FrameLayout.java:368)
    at android.view.LayoutInflater.rInflate(LayoutInflater.java:865)
    at android.view.LayoutInflater.rInflateChildren(LayoutInflater.java:824)
    at android.view.LayoutInflater.parseInclude(LayoutInflater.java:995)
    at android.view.LayoutInflater.rInflate(LayoutInflater.java:859)
    at android.view.LayoutInflater.rInflateChildren(LayoutInflater.java:824)
    at android.view.LayoutInflater.rInflate(LayoutInflater.java:866)
    at android.view.LayoutInflater.rInflateChildren(LayoutInflater.java:824)
    at android.view.LayoutInflater.rInflate(LayoutInflater.java:866)
    at android.view.LayoutInflater.rInflateChildren(LayoutInflater.java:824)
    at android.view.LayoutInflater.inflate(LayoutInflater.java:515)
    at android.view.LayoutInflater.inflate(LayoutInflater.java:423)
    at com.myksm.v.activity.ChatFragWatchL.onCreateView(ChatFragWatchL.java:865)
    at androidx.fragment.app.Fragment.performCreateView(Fragment.java:2439)
    at androidx.fragment.app.FragmentManagerImpl.moveToState(FragmentManager.java:1460)
    at androidx.fragment.app.FragmentManagerImpl.moveFragmentToExpectedState(FragmentManager.java:1784)
    at androidx.fragment.app.FragmentManagerImpl.moveToState(FragmentManager.java:1852)
    at androidx.fragment.app.BackStackRecord.executeOps(BackStackRecord.java:802)
    at androidx.fragment.app.FragmentManagerImpl.executeOps(FragmentManager.java:2625)
    at androidx.fragment.app.FragmentManagerImpl.executeOpsTogether(FragmentManager.java:2411)
    at androidx.fragment.app.FragmentManagerImpl.removeRedundantOperationsAndExecute(FragmentManager.java:2366)
    at androidx.fragment.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:2273)
    at androidx.fragment.app.FragmentManagerImpl$1.run(FragmentManager.java:733)
    at android.os.Handler.handleCallback(Handler.java:790)
    at android.os.Handler.dispatchMessage(Handler.java:99)
    at android.os.Looper.loop(Looper.java:164)
    at android.app.ActivityThread.main(ActivityThread.java:6518)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:438)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:807)
java.lang.UnsupportedOperationException: Binary XML file line #262: You must supply a layout_width attribute.
    at android.content.res.TypedArray.getLayoutDimension(TypedArray.java:775)
    at android.view.ViewGroup$LayoutParams.setBaseAttributes(ViewGroup.java:7554)
    at android.view.ViewGroup$MarginLayoutParams.init(ViewGroup.java:7746)
    at android.widget.FrameLayout$LayoutParams.init(FrameLayout.java:439)
    at android.widget.FrameLayout.generateLayoutParams(FrameLayout.java:370)
    at android.widget.FrameLayout.generateLayoutParams(FrameLayout.java:368)
    at android.view.LayoutInflater.rInflate(LayoutInflater.java:865)
    at android.view.LayoutInflater.rInflateChildren(LayoutInflater.java:824)
    at android.view.LayoutInflater.parseInclude(LayoutInflater.java:995)
    at android.view.LayoutInflater.rInflate(LayoutInflater.java:859)
    at android.view.LayoutInflater.rInflateChildren(LayoutInflater.java:824)
    at android.view.LayoutInflater.rInflate(LayoutInflater.java:866)
    at android.view.LayoutInflater.rInflateChildren(LayoutInflater.java:824)
    at android.view.LayoutInflater.rInflate(LayoutInflater.java:866)
    at android.view.LayoutInflater.rInflateChildren(LayoutInflater.java:824)
    at android.view.LayoutInflater.inflate(LayoutInflater.java:515)
    at android.view.LayoutInflater.inflate(LayoutInflater.java:423)
    at com.myksm.v.activity.ChatFragWatchL.onCreateView(ChatFragWatchL.java:865)
    at androidx.fragment.app.Fragment.performCreateView(Fragment.java:2439)
    at androidx.fragment.app.FragmentManagerImpl.moveToState(FragmentManager.java:1460)
    at androidx.fragment.app.FragmentManagerImpl.moveFragmentToExpectedState(FragmentManager.java:1784)
    at androidx.fragment.app.FragmentManagerImpl.moveToState(FragmentManager.java:1852)
    at androidx.fragment.app.BackStackRecord.executeOps(BackStackRecord.java:802)
    at androidx.fragment.app.FragmentManagerImpl.executeOps(FragmentManager.java:2625)
    at androidx.fragment.app.FragmentManagerImpl.executeOpsTogether(FragmentManager.java:2411)
    at androidx.fragment.app.FragmentManagerImpl.removeRedundantOperationsAndExecute(FragmentManager.java:2366)
    at androidx.fragment.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:2273)
    at androidx.fragment.app.FragmentManagerImpl$1.run(FragmentManager.java:733)
    at android.os.Handler.handleCallback(Handler.java:790)
    at android.os.Handler.dispatchMessage(Handler.java:99)
    at android.os.Looper.loop(Looper.java:164)
    at android.app.ActivityThread.main(ActivityThread.java:6518)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:438)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:807)

выше два вида сбоев НЕ производятся, когда я возвращаюсь и публикую снова.

Может помочь некоторая дополнительная информация:

  1. вызван ли статический блок в суперклассе? Да, он вызывался как при создании конструктора, так и при создании отражения.

  2. Сколько потоков связано? Только два, один - фоновый поток, который вызывает FrescoProxy.ensureInit(), другой - основной поток.

  3. Если фон зависает, что случилось? Когда в фоновом потоке спят 60 секунд, приложение тоже зависает, а затем ANR.

  4. Если Fresco.init () вызывается более одного раза, что случилось? Это может привести к утечке памяти, но сбоев не было.

У кого-нибудь есть подсказки или опыт по этому поводу? Я не могу найти пути, чтобы решить эту проблему. Заранее спасибо!

...