diff --git a/platform/android/lynx_android/src/main/java/com/lynx/tasm/LynxTemplateRender.java b/platform/android/lynx_android/src/main/java/com/lynx/tasm/LynxTemplateRender.java index 511a898a41..6f3764e77f 100644 --- a/platform/android/lynx_android/src/main/java/com/lynx/tasm/LynxTemplateRender.java +++ b/platform/android/lynx_android/src/main/java/com/lynx/tasm/LynxTemplateRender.java @@ -167,6 +167,15 @@ public void handleLynxError(LynxError error) { render.onErrorOccurred(error); } } + + @Override + @RestrictTo(RestrictTo.Scope.LIBRARY) + public void runOnLayoutThread(Runnable runnable) { + LynxTemplateRender render = mRenderRef.get(); + if (render != null) { + render.runOnLayoutThread(runnable); + } + } } private final TemplateAssembler mTemplateAssembler = new TemplateAssembler(); @@ -277,7 +286,9 @@ public void handleLynxError(LynxError error) { private LynxGroup mGroup; private LynxEngineProxy mEngineProxy; - private LynxLayoutProxy mLayoutProxy; + // Serializes lazy layout proxy creation with native shell destruction. + private final Object mNativeShellLifecycleLock = new Object(); + private volatile LynxLayoutProxy mLayoutProxy; private Map platformCallBackMap = new HashMap<>(); @@ -311,9 +322,7 @@ public void handleLynxError(LynxError error) { @Nullable private LynxEngine mLynxEngineRef; private LynxModuleFactory mMainThreadModuleFactory; - @NonNull - private final LynxMemoryUsageFetcher mMemoryUsageFetcher = - new LynxTemplateRenderMemoryUsageFetcher(this); + @Nullable private LynxMemoryUsageFetcher mMemoryUsageFetcher; @Keep public LynxTemplateRender(Context context, UIBodyView bodyView, LynxViewBuilder builder) { @@ -451,11 +460,12 @@ private void init(@Nullable Context context, UIBodyView bodyView, LynxViewBuilde // compatibility, some caller still using its related interface. DisplayMetricsHolder.updateOrInitDisplayMetrics(context, mLynxViewConfigProvider.getDensity()); DisplayMetrics screenMetrics = DisplayMetricsHolder.getScreenDisplayMetrics(); - if (mLynxViewConfigProvider.getScreenWidth() != DisplayMetricsHolder.UNDEFINE_SCREEN_SIZE_VALUE - && mLynxViewConfigProvider.getScreenHeight() - != DisplayMetricsHolder.UNDEFINE_SCREEN_SIZE_VALUE) { - screenMetrics.widthPixels = mLynxViewConfigProvider.getScreenWidth(); - screenMetrics.heightPixels = mLynxViewConfigProvider.getScreenHeight(); + int screenWidth = mLynxViewConfigProvider.getScreenWidth(); + int screenHeight = mLynxViewConfigProvider.getScreenHeight(); + if (screenWidth != DisplayMetricsHolder.UNDEFINE_SCREEN_SIZE_VALUE + && screenHeight != DisplayMetricsHolder.UNDEFINE_SCREEN_SIZE_VALUE) { + screenMetrics.widthPixels = screenWidth; + screenMetrics.heightPixels = screenHeight; } // Prepare for env @@ -4129,6 +4139,33 @@ private void initPiperInternal() { } } + private void runOnLayoutThread(Runnable runnable) { + if (runnable == null) { + return; + } + LynxLayoutProxy layoutProxy = getOrCreateLayoutProxy(); + if (layoutProxy != null) { + layoutProxy.runOnLayoutThread(runnable); + } + } + + @Nullable + private LynxLayoutProxy getOrCreateLayoutProxy() { + LynxLayoutProxy layoutProxy = mLayoutProxy; + if (layoutProxy != null) { + return layoutProxy; + } + synchronized (mNativeShellLifecycleLock) { + layoutProxy = mLayoutProxy; + if (layoutProxy == null && !mIsDestroyed.get() && mNativePtr != 0) { + layoutProxy = new LynxLayoutProxy(mNativePtr); + mLynxContext.setLayoutProxy(layoutProxy); + mLayoutProxy = layoutProxy; + } + return layoutProxy; + } + } + private void initEngineAndLayoutProxies() { mEngineProxy = new LynxEngineProxy(mNativePtr); mNativeFacade.setEngineProxy(mEngineProxy); @@ -4136,8 +4173,6 @@ private void initEngineAndLayoutProxies() { LLog.e(TAG, "mLynxContext is null, can not set LayoutProxy"); } else { mLynxContext.setEngineProxy(mEngineProxy); - mLayoutProxy = new LynxLayoutProxy(mNativePtr); - mLynxContext.setLayoutProxy(mLayoutProxy); } } @@ -4222,10 +4257,19 @@ private String getJSGroupThreadNameIfNeed() { } private void registerMemoryUsageFetcherIfNeeded() { + if (EmbeddedMode.isBaseModeEnable(mEmbeddedMode)) { + return; + } + if (mMemoryUsageFetcher == null) { + mMemoryUsageFetcher = new LynxTemplateRenderMemoryUsageFetcher(this); + } LynxGlobalMemoryUsageCollector.getInstance().registerMemoryUsageFetcher(mMemoryUsageFetcher); } private void unregisterMemoryUsageFetcherIfNeeded() { + if (mMemoryUsageFetcher == null) { + return; + } LynxGlobalMemoryUsageCollector.getInstance().unregisterMemoryUsageFetcher(mMemoryUsageFetcher); } @@ -4246,8 +4290,10 @@ void queryNativeMemoryUsageForGlobalCollectorAsync( } private void destroyLynxEngine() { - if (!mIsDestroyed.compareAndSet(false, true)) { - return; + synchronized (mNativeShellLifecycleLock) { + if (!mIsDestroyed.compareAndSet(false, true)) { + return; + } } boolean shouldCacheLynxEngine = shouldCacheLynxEngine(); unregisterMemoryUsageFetcherIfNeeded(); @@ -4291,8 +4337,10 @@ public void run() { mEngineProxy.destroy(); } - if (mLayoutProxy != null) { - mLayoutProxy.destroy(); + LynxLayoutProxy layoutProxy = mLayoutProxy; + mLayoutProxy = null; + if (layoutProxy != null) { + layoutProxy.destroy(); } mTasmPlatformInvoker = null; mNativeFacade = null; @@ -4321,15 +4369,18 @@ public DestroyTask(long nativePtr, long nativeLifecycle, LynxTemplateRender rend @Override public void run() { - if ((mNativeLifecycle != 0) && (mNativePtr != 0)) { - if (nativeLifecycleTryTerminate(mNativeLifecycle)) { - nativeDestroy(mNativePtr); - mNativePtr = 0; - mNativeLifecycle = 0; - mRenderer = null; - } else { - // retry later - UIThreadUtils.runOnUiThread(this, 1); + LynxTemplateRender renderer = mRenderer; + if ((mNativeLifecycle != 0) && (mNativePtr != 0) && renderer != null) { + synchronized (renderer.mNativeShellLifecycleLock) { + if (nativeLifecycleTryTerminate(mNativeLifecycle)) { + nativeDestroy(mNativePtr); + mNativePtr = 0; + mNativeLifecycle = 0; + mRenderer = null; + } else { + // retry later + UIThreadUtils.runOnUiThread(this, 1); + } } } if (mNativeFacade != null) { diff --git a/platform/android/lynx_android/src/main/java/com/lynx/tasm/behavior/LynxContext.java b/platform/android/lynx_android/src/main/java/com/lynx/tasm/behavior/LynxContext.java index 467c7d8e65..647bfff08b 100644 --- a/platform/android/lynx_android/src/main/java/com/lynx/tasm/behavior/LynxContext.java +++ b/platform/android/lynx_android/src/main/java/com/lynx/tasm/behavior/LynxContext.java @@ -180,8 +180,7 @@ public abstract class LynxContext extends LynxBaseContext implements ExceptionHa public LynxContext(Context base, DisplayMetrics screenMetrics) { super(base); - mVirtualScreenMetrics = new DisplayMetrics(); - mVirtualScreenMetrics.setTo(screenMetrics); + mVirtualScreenMetrics = screenMetrics; if (sLynxTextService == null) { sLynxTextService = LynxServiceCenter.inst().getService(ILynxTextService.class); } @@ -1581,7 +1580,9 @@ public void setInstanceId(int instanceId) { LynxFrameRecorder.inst().clearFrameCallback(mInstanceId); } this.mInstanceId = instanceId; - syncFrameRecorderCallback(); + if (!isEmbeddedModeOn()) { + syncFrameRecorderCallback(); + } } private void syncFrameRecorderCallback() { @@ -1683,6 +1684,9 @@ public void runOnLayoutThread(Runnable runnable) { if (runnable == null) { return; } + if (mLayoutProxy == null) { + return; + } LynxLayoutProxy layoutProxy = mLayoutProxy.get(); if (layoutProxy == null) { return; diff --git a/platform/android/lynx_android/src/main/java/com/lynx/tasm/behavior/ui/UIBody.java b/platform/android/lynx_android/src/main/java/com/lynx/tasm/behavior/ui/UIBody.java index 67fc45a49c..ebbb54f3c8 100644 --- a/platform/android/lynx_android/src/main/java/com/lynx/tasm/behavior/ui/UIBody.java +++ b/platform/android/lynx_android/src/main/java/com/lynx/tasm/behavior/ui/UIBody.java @@ -128,6 +128,9 @@ public List getMeaningfulPaintingAreas() { * @param view */ synchronized public void attachUIBodyView(UIBodyView view, LynxContext context) { + if (!mContext.isEnginePoolEnabled() && mBodyView == view) { + return; + } mAttachTask = new OnceTask<>(new Callable() { @Override public Void call() throws Exception { diff --git a/platform/android/lynx_android/src/main/java/com/lynx/tasm/utils/DisplayMetricsHolder.java b/platform/android/lynx_android/src/main/java/com/lynx/tasm/utils/DisplayMetricsHolder.java index 0b9a18504d..78945c2fa6 100644 --- a/platform/android/lynx_android/src/main/java/com/lynx/tasm/utils/DisplayMetricsHolder.java +++ b/platform/android/lynx_android/src/main/java/com/lynx/tasm/utils/DisplayMetricsHolder.java @@ -183,7 +183,7 @@ public static DisplayMetrics getRealScreenDisplayMetrics(Context context) { DisplayMetrics screenDisplayMetrics = new DisplayMetrics(); DisplayMetrics windowDM = getWindowDisplayMetrics(); if (windowDM != null) { - screenDisplayMetrics.setTo(getWindowDisplayMetrics()); + screenDisplayMetrics.setTo(windowDM); } WindowManager wm = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE); Assertions.assertNotNull(wm, "WindowManager is null!");