Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -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();
Expand Down Expand Up @@ -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<Double, PlatformCallBack> platformCallBackMap = new HashMap<>();

Expand Down Expand Up @@ -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) {
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -4129,15 +4139,40 @@ 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);
if (mLynxContext == null) {
LLog.e(TAG, "mLynxContext is null, can not set LayoutProxy");
} else {
mLynxContext.setEngineProxy(mEngineProxy);
mLayoutProxy = new LynxLayoutProxy(mNativePtr);
mLynxContext.setLayoutProxy(mLayoutProxy);
}
}

Expand Down Expand Up @@ -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);
}

Expand All @@ -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();
Expand Down Expand Up @@ -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;
Expand Down Expand Up @@ -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) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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);
}
Expand Down Expand Up @@ -1581,7 +1580,9 @@ public void setInstanceId(int instanceId) {
LynxFrameRecorder.inst().clearFrameCallback(mInstanceId);
}
this.mInstanceId = instanceId;
syncFrameRecorderCallback();
if (!isEmbeddedModeOn()) {
syncFrameRecorderCallback();
}
}

private void syncFrameRecorderCallback() {
Expand Down Expand Up @@ -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;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -128,6 +128,9 @@ public List<MeaningfulPaintingArea> getMeaningfulPaintingAreas() {
* @param view
*/
synchronized public void attachUIBodyView(UIBodyView view, LynxContext context) {
if (!mContext.isEnginePoolEnabled() && mBodyView == view) {
return;
}
mAttachTask = new OnceTask<>(new Callable<Void>() {
@Override
public Void call() throws Exception {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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!");
Expand Down
Loading