3.2.0

lynx-family/lynx3.2.0Apr 25, 2025by github-actions[bot]

AI Summary

Major release adding JSIObject support, fluency metric sampling APIs, multi-JSThread global switch, and cross-text selection. Includes extensive bug fixes for layout, events, list, and DevTool functionality.

Key Highlights

  • Added JSIObject support for primitive wrappers and List types
  • Introduced per-instance sampling APIs for fluency metric
  • Global switch for multi-JSThread support
  • Cross-text element selection support
  • Fixed asynchronous layout full-scale issue

New Features

  • JSIObject support for Boolean, Integer, Long, Float, Double and List types
  • Per LynxView APIs for fluency task metric configuration
  • Global switching of multiple JS threads
  • Cross-text element selection with showStartHandle and showEndHandle parameters
  • JSIObject support for @SerializedName annotation

Full Release Notes

# Changelog

## [3.2.0] - 2025-04-25

### ๐Ÿš€ Features
- [Feature] [Android] JSIObject support to get primitive wrapper and List type ([4647a37](https://github.com/lynx-family/lynx/commit/4647a3735f44a599af0ccf44788013864f3cc120)) @Awuiil

support primitive wrapper: Boolean, Integer, Long, Float, Double and List for LynxJSProperty.
Add a test case about primitive wrapper object
- [Feature] Introduce per-instance sampling APIs for fluency metric. ([515d0eb](https://github.com/lynx-family/lynx/commit/515d0ebbc46ef645ca9595a05fab974b9cc16f37)) @kazec

Introduce per LynxView APIs for fluency task metric configuration
- [Feature] Support the global switch for multi-JSThread. ([f0018ae](https://github.com/lynx-family/lynx/commit/f0018ae4ff7a8a759cf9b7fc3e54a255b250262c)) @Yellow5A5

Global switching of multiple JS threads is supported to evaluate its impact on overall application performance. This feature is exploratory in nature, and further measures will be considered based on experimental results.
- [Feature] [Android] JSIObject support SerializedName ([8c412b8](https://github.com/lynx-family/lynx/commit/8c412b8d01b2db56e8881a9725f8d1b33f07a6fe)) @Awuiil

support annotation for `@SerializedName` to resign field name

And with bugfix: global ref for jclass of JSIObject
- [Feature][Text] Support cross-text element selection. ([fbc25e0](https://github.com/lynx-family/lynx/commit/fbc25e0a1907422f9706da631b30fdad8a017360)) @Randycn

Currently, only copying text within the text element is supported. In more complex scenarios such as long article pages, each text element is a paragraph. In this case, cross-text element text copying capability is required for the copying experience to approach the web.

During text copying, the handles at both ends are drawn inside the text element. In the parameters of the `setTextSelection` function, adding two bool type parameters, `showStartHandle` and `showEndHandle`, can control whether to draw handles.

### ๐Ÿ› Bug Fixes
- [BugFix] Fix Asynchronous Layout Full-Scale issue ([dcf7699](https://github.com/lynx-family/lynx/commit/dcf76997664afae68174195e809085b312bd34fa)) @cddcoding

After enabling asynchronous layout, the layout runner will be bound to loop of UI thread for synchronous layout during the LynxView's onMeasure. Currently, the layout runner is directly obtained from the thread's loop, so LynxViews sharing the same loop will share the same layout runner instance too. This causes different LynxViews to interfere with each other when re-binding the loop of the layout runner.
This MR creates a separate layout runner instance for each LynxView.
- [BugFix][Element] fix the issue that font-size not reset to default value ([3d854a4](https://github.com/lynx-family/lynx/commit/3d854a47773cdfd65cce0d7edd09cf8c5324b609)) @linxs0211

font-size is special, we should reset font-size to default value in
element side.
- [BugFix][iOS] supress the kCTFontManagerErrorAlreadyRegistered error ([b1782d4](https://github.com/lynx-family/lynx/commit/b1782d46c71cec64514796c19ef9d074db18dd51)) @linxs0211

kCTFontManagerErrorAlreadyRegistered is not a fatal error.

It only requires a warning message
- [BugFix] Correct the error code for Element API fatal error ([3ae57de](https://github.com/lynx-family/lynx/commit/3ae57de58f61df45e52012c8eb26ef7aed6d62ae)) @PineconeSquirrel

as title
- [BugFix] Fix the issue where dependent parties inject the log function address through means other than LynxLogService. ([c80f506](https://github.com/lynx-family/lynx/commit/c80f506673a65ec273ff2f508d27cd79d06c5548)) @yongjie

1. Only allow LynxLogService to inject the log proxy function address, therefore mark the `initALog()` API as deprecated and remove its implementation.
2. Remove the unused `getALogPtr()` API and `alogNativePtr` variable.
- [BugFix] Supplement the missing 'lynx.onError' definition ([3167b31](https://github.com/lynx-family/lynx/commit/3167b31a49aabdbbca0bca93ce9a9fe66eca89fd)) @lybvinci

Add lynx.onError for lynx.d.ts
- [BugFix][List] Add variable from_layout to mark whether list scroll offset updating is triggered by layout or scroll. ([6a94ee7](https://github.com/lynx-family/lynx/commit/6a94ee702f4ac36f3a9eb22e57f850af0a388ce6)) @DwwWxx

Add variable from_layout in UpdateContentOffsetForListContainer function to mark whether list scroll offset updating is triggered by layout or scroll.
- [BugFix][iOS] Fixed iOS LynxJSCore copy path error ([e2f0f54](https://github.com/lynx-family/lynx/commit/e2f0f544def7ffc886cef082205345d6e5ee28cc)) @WindRunner

Fixed iOS LynxJSCore copy path error,Since the build is executed in the lynx directory, delete the first lynx in the copy path.
- [BugFix][Image]Fix image's optimization switch issue ([16f8096](https://github.com/lynx-family/lynx/commit/16f80965a6809c50d4bd6842602119c6105a08c5)) @cjnhust

When opening genericFetcher, we need to turn on the image optimization switch by default, otherwise some optimization logic will not take effect
- [BugFix][Android][Font] add api to clear font cache registered from lazy provider ([1f35184](https://github.com/lynx-family/lynx/commit/1f35184b02225076443396036e48f47047d74aa5)) @linxs0211

we need to add API for remove the font cache that registered through
lazy provider for Client.
- [BugFix] Fix the issue that `__ElementFromBinary` cannot create Elements based on `LazyBundle`. ([1ce1786](https://github.com/lynx-family/lynx/commit/1ce17865c1b3297f36f37cec1ac862686c5aa309)) @ShouruiSong

Currently, `__ElementFromBinary` defaults to get information from the default bundle to create Elements. The framework may need to obtain some information from the `LazyBundle` to create Elements, but `__ElementFromBinary` currently lacks this capability. Therefore, a third parameter will be added to indicate whether it is necessary to obtain the corresponding information from the `LazyBundle`, and which `LazyBundle` to retrieve it from.
- [BugFix] createViewAsync was incorrectly executed before attachLynxView ([2ec9895](https://github.com/lynx-family/lynx/commit/2ec98950920c5092dbfeaa6a47a1efbacd55ba5d)) @Yellow5A5

Before you create PaintingContext, LynxUIOwner needs to be configured correctly. Therefore, when LynxUIOwner is initialized, the ContextFree flag is set immediately.
- [BugFix] Disable some LynxService API registrations in the experimental shared context ([e44be4e](https://github.com/lynx-family/lynx/commit/e44be4e879886b50ff7ea9f74dd814d7fa3f4dbf)) @WindRunner

Since napi_env is not shared in the experimental shared context, this may result in accessing a destroyed napi_env in the global. Therefore, turn off this feature in the shared context.
- [BugFix] ensure WhiteBoard safety with uniqueLock ([0009f21](https://github.com/lynx-family/lynx/commit/0009f2170f355ae2653e47c85a6557fffc07d28b)) @nihao.royal

`unsubscribeSessionStorage` is a write operation that should be guaranteed by uniquelock.
- [BugFix] Scope mapbuffer object ([3dc27a8](https://github.com/lynx-family/lynx/commit/3dc27a8b4433e2263a1721add2edcc4d661dbe1d)) @Awuiil

To prevent local reference overflow
- [BugFix] Fix the issue where `bindtap` does not work on some devices in `defaultGesture` ([0a6e95c](https://github.com/lynx-family/lynx/commit/0a6e95c8ef143b2a87da1177f5e216ec5dd6e6d4)) @AdrianLCA

On some devices, `touchmove` event is still triggered with a very small offset when tap. These minor move events need to be ignored. Changes smaller than 1px should be considered as a click rather than a scroll.(cherry picked from commit 6439cbfee4c6797e95acf7ce058e72719064bb9b)

(cherry picked from commit 58b3a9f358ac27f92417049f9a20a99f75fc5037)
- [BugFix] Fix LynxModule TestBench crash when InvokeMethod returns an error ([b85defd](https://github.com/lynx-family/lynx/commit/b85defd29f11466ad1eef4b35dd1aa6ada8a4056)) @WindRunner

Since calling the value method when base::excepted is unexcepted is undefined behavior, it will cause TestBench to crash.
- [BugFix][Android][Event] Avoid exposure task omissions. ([e5a6059](https://github.com/lynx-family/lynx/commit/e5a6059df5b7b05fef6dc4d6cb3c6b527f7c37e0)) @rAY-ooo

description: Exposure tasks are throttled according to timestamps, and exposure tasks within a fixed time interval will be discarded, which may cause delayed triggering of exposure events in some scenarios. Therefore, we delay the first task within a fixed time interval to execute after the fixed time interval, and other tasks within the time interval will be discarded.
- [BugFix] rename FrameworkPipelineTiming to FrameworkRenderingTiming ([54e436b](https://github.com/lynx-family/lynx/commit/54e436b02b708acbf721163426b5b4669e75cd3d)) @partholon

In the official website spec, the standard name of framework rendering is defined as 'Framework Rendering'. Therefore, we modify the definition of PipelineEntry at the same time.
- [BugFix][Android][VSync] fix the NPE of displayManager issue ([427dfe2](https://github.com/lynx-family/lynx/commit/427dfe2e1f003459c452d4db294a9d14c19c08ed)) @linxs0211

try to fix the NPE exception of displayManager
- [BugFix][Android][Event] Add null protection for exposure-id. ([8178673](https://github.com/lynx-family/lynx/commit/81786737902d04ca604dfdbcd97b6d1adcac0997)) @rAY-ooo

description: When the fe sets an invalid value, getString may return null, which will cause npe for exposure-id.
- [BugFix] fix CSSLazyImport and predecode crash ([863c079](https://github.com/lynx-family/lynx/commit/863c0795bd7afde3b1231c3c020bfa66f035d396)) @YellowFishWyfCPP

When CSSLazyImport and predecode are used at the same time, it will cause the problem of unsafe multi-threaded reading and writing.
- [BugFix] Fix the issue where fixed elements cannot be removed from the page node when multiple ancestor nodes are removed during a single rendering process. ([2925fcc](https://github.com/lynx-family/lynx/commit/2925fcc5c0f0682a5b3538b77d28a4829ec6d04f)) @ShouruiSong

During a single rendering process, when multiple ancestor nodes are removed, the fixed element cannot be removed from the page node. This is because the removal operation of the fixed element is recorded on a node that has been removed, and the action for that removed node does not execute, resulting in the fixed element not being genuinely removed.

Therefore, when we remove an element, we will check if it has recorded any special actions. If so, these actions will be propagated upward.
- [BugFix][Android][Event] Avoid strong holding of LynxContext. ([c46ee98](https://github.com/lynx-family/lynx/commit/c46ee9897b44a03b1c9788795bca7e8e6f9e4cc1)) @rAY-ooo

description: In Java, non-static anonymous inner classes implicitly hold strong references to outer classes, which may cause leaks of outer classes. Therefore, we use static inner classes and explicitly pass weak references to outer classes to avoid implicitly holding strong references to outer classes.
- [BugFix] fix iOS native promise failed ([3a3a90d](https://github.com/lynx-family/lynx/commit/3a3a90ded7f66202bf4d636552161c285eada1b3)) @lybvinci

Fix iOS NativeModule native promise type run error.
And add warn for native promise user.
Add test for native promise.
- [BugFix] Fix the LynxUIOwner be incorrectly released in a sub-thread. ([e3b870d](https://github.com/lynx-family/lynx/commit/e3b870dc32a02df6dea2249c4546419ff5b70d90)) @Yellow5A5

The release timing of LynxUIOwner depends on TemplateRender, which causes it to be incorrectly released in a sub-thread. The deallocation of LynxUI should occur at the same time as LynxView, and should not depend on TemplateRender.
- [BugFix]Upgrade debug-router version to fix crash caused by multithread ([a1d915c](https://github.com/lynx-family/lynx/commit/a1d915cf824d029b3ef9d2bf306604160a0f9cd5)) @RovicnowYoyi

Fix the connection problem exposed in Lynx 3.1.
- [BugFix][DevTool] Fix all debugging capabilities which rely on DevToolPlatformAndroidDelegate being unavailable when rendering template by preloading ([feb00f6](https://github.com/lynx-family/lynx/commit/feb00f619908a2240f2c1fe5b87d50b878a4df98)) @yuweizheng

When preloading a Lynx page, the LynxView is initially null when creating LynxInspectorOwner. Subsequently, the LynxView will be reattached to LynxInspectorOwner via the attach method. However, a null check for the LynxView was added when constructing DevToolPlatformAndroidDelegate for LynxInspectorOwner.

As a result, if the LynxView is null, the DevToolPlatformAndroidDelegate object is also null and will not be created thereafter. Consequently, all UI-related debugging features that rely on DevToolPlatformAndroidDelegate become unavailable when rendering cards via the preloading method.

To fix this:
- Remove null check for LynxView when creating DevToolPlatformAndroidDelegate.
- Attach LynxView for DevToolPlatformAndroidDelegate when LynxView is ready.
- [BugFix] let version-script matching all log symbols ([079466d](https://github.com/lynx-family/lynx/commit/079466d785184099995b08f15cf37fbc88a0cf32)) @huzhanbo1996

let version-script matching all log symbols
- [BugFix][Android]Fix the issue with incomplete error message for the binderror event of image ([781dc15](https://github.com/lynx-family/lynx/commit/781dc15259a493e69954a199602323d8ea2efa0e)) @PineconeSquirrel

as title
- [BugFix] Add some missing types of built-in element `list-item` ([ba1dde1](https://github.com/lynx-family/lynx/commit/ba1dde14d7bb8a55469fe60d6df4766e50b9a57f)) @hzy


- [BugFix][Event] Make multi-finger event parameters compatible with single-finger when touch up. ([2c3c635](https://github.com/lynx-family/lynx/commit/2c3c635d8da8558a5d20e638e7bd0262c3e91b2f)) @rAY-ooo

description: Since touches and changedTouches are the same in single-finger mode, when enableMultiTouch is turned on, touches may be empty, causing a break. Therefore, we modify the touches definition to the finger on the screen before the event is triggered to be compatible with single-finger mode.
- [BugFix] [Android] keep service interface for SPI ([0bfbbe7](https://github.com/lynx-family/lynx/commit/0bfbbe7830dfb6ef39d34192b5f93083bf865c04)) @Awuiil

Add `@Keep` for service interfaces: ILynxSercuityService, ILynxDevToolService, ILynxHttpService, ILynxI18nService, ILynxImageService, ILynxLogService, ILynxTrailService
- [BugFix] Use the engine task runner for TimedTaskManager of LepusLynx ([390377c](https://github.com/lynx-family/lynx/commit/390377c731c6080598cf6cfc3d505cda23f26e87)) @cddcoding

The TimedTaskManager of LepusLynx should run on engine thread, therefore, it should use the engine task runner so that when engine task runner binds to another thread, the callback can also run on that thread.
- [BugFix][scroll-view] Fix horizontal scroll-view cannot fling. ([d115742](https://github.com/lynx-family/lynx/commit/d115742035e7fea093208705363aba1a947c6adb)) @DwwWxx

If enable horizontal scrollview support nested scroll, we should invoke super.fling() in fling method directly instead of invoking scroller.fling() by reflecting mScroller object.
- [BugFix][Text][Android[iOS] Fix inline view position error. ([df1c102](https://github.com/lynx-family/lynx/commit/df1c102bc9874e3b3a58b3266034d47c483be385)) @Randycn

1.When inline views are omitted, we currently don't invoke the align function for the omitted nodes. This causes an issue where after triggering an update that makes the inline view reappear, the inline view's position is correct but its child nodes are misplaced. The root cause is that neither the inline view nor its child nodes are marked as dirty after the update, preventing subsequent calls to their align methods. Therefore, the inline view's align function must be called during the first layout cycle.
2.On Android, there's an issue with calculating whether inline views should be displayed. When a text ends with an inline view and the inline-truncation also contains an inline view, these two inline views may overlap when rendered.
3.On iOS, using `lineFragmentUsedRectForGlyphAtIndex` replaces previous methods to avoid including blank areas in the calculated line width, which previously caused errors in truncation position calculations.

isseu:m-6168336980
- [BugFix] Fixed memory leaks caused by category overwriting ([ad12354](https://github.com/lynx-family/lynx/commit/ad1235483e18fb102d7286776609ddab87c766c2)) @FrendyChen

Fixed setResourceFetcher being overwritten by category causing the original behavior to break.
- [BugFix] fix thread-issue for whiteBoardListener. ([6b47269](https://github.com/lynx-family/lynx/commit/6b472696ee1b467b1a73afa13d4e8a1429639b41)) @nihao.royal

`listener_map` in `WhiteBoard` now is not thread-safe, we need to pre-construct the map
to avoid multi-thread calling `operator[]` causing crash.
- [BugFix][Timing] delay sending performance entry ([dea8399](https://github.com/lynx-family/lynx/commit/dea8399dd33b7be21351b7845e8373d07671f867)) @partholon

When lynx background runtime is enabled, TimingHandler should send performance entries after the background runtime is ready. Because when LoadTemplate is called repeatedly, TimingHandler will send performance entries to the incorrect runtime.

When lynx background runtime is disabled, send performance entries directly. Because all operations will be executed in the main thread through the queue. When LoadTemplate is called repeatedly, sendGlobalEvent will still be executed after LoadTemplate is completed
- [BugFix] stop setting TextEncoder/TextDecoder on GlobalThis ([c39148b](https://github.com/lynx-family/lynx/commit/c39148b3ea781bf7f8e00213334920d5472757bb)) @huzhanbo1996

Some polyfill check TextEncoder/TextDecoder defination whithout
checking the supported encoding types. Define them on GlobalThis
causes polyfill thinking TextEncoder/TextDecoder are supported
with all encoding cabability, thus stop working.
- [BugFix][Trace] Rename NativeModule's first argument from 'first_arg' to 'arg0' ([d26960f](https://github.com/lynx-family/lynx/commit/d26960f5e5ada808339bda3f059f9b0de519aec3)) @KingAlen

To maintain consistency across our codebase, we renamed the first argument of the NativeModule call trace from 'first_arg' to 'arg0'. This change aligns with our naming convention for subsequent arguments, which are labeled as 'arg1', 'arg2', etc.
- [BugFix] Try fix group_ double free ([dac4d3a](https://github.com/lynx-family/lynx/commit/dac4d3a1d7aa2d13accb90faade40e5002b6304d)) @lybvinci

set group_ to nullptr to protect group_ free twice
- [BugFix] Fix devtool unmatched TraceEvent begin and end caused by nullptr in CHECK_NULL_AND_LOG_RETURN ([ddba510](https://github.com/lynx-family/lynx/commit/ddba510a54efdbf514499b79d499380aabe23d1a)) @xiaosu906

This commit includes the following changes:
1. Fixed the issue where the first parameter being nullptr in CHECK_NULL_AND_LOG_RETURN causes TraceEvent begin and end to be unmatched.
2. Switched TRACE_EVENT_BEGIN interface to TRACE_EVENT interface, which creates a RAII C++ object to automatically insert TRACE_EVENT_END upon return from CHECK_NULL_AND_LOG_RETURN.

These changes ensure that TraceEvent begin and end are correctly matched by using a RAII C++ object to handle the end event automatically.
- [BugFix][DevTool] Fix the startup tracing failure. ([3969571](https://github.com/lynx-family/lynx/commit/3969571c8f4e0255e2b6319a435f90479e055578)) @Dango-2021

Correct the error in the function call.
- [BugFix][List] Optimize the logic of reporting list render children duration. ([33ba6f6](https://github.com/lynx-family/lynx/commit/33ba6f61581e3b2f915a3960167a48c56df09253)) @DwwWxx

If c++ list has valid children count and all list visible area has been filled with children, we will mark timing::kListFullFillRenderChildrenEnd flag and report list_full_fill_render_children duration in lynxsdk_setup_timing and lynxsdk_update_timing.
- [BugFix][ios] upgrade release/3.2 solves compilation issues at business side ([2e65594](https://github.com/lynx-family/lynx/commit/2e65594b8402f3fd427d4c5fb3f1832240a4c46c)) @ShijieZhou0523

fix headers conflict
- [BugFix] add some logs for removeUIComponent() ([1b54af1](https://github.com/lynx-family/lynx/commit/1b54af189317b507ee05bc6831f4c991ac66f045)) @keweibing

add the logs for removeUIComponent(),which will cause NPE problem.when invoking dispatchDetachedFromWindow
- [BugFix] Support __RunUpdates to align JS Signal logic, avoiding multiple executions of computation when writing multiple signals. ([6bf848b](https://github.com/lynx-family/lynx/commit/6bf848b05e55746d6480eec738259ac9ea75dfbd)) @ShouruiSong

- [BugFix] Avoid LynxTemplateRender npe problem. ([c1d987d](https://github.com/lynx-family/lynx/commit/c1d987d2f5417c8e2ee4d68a44a7e143b786d7e7)) @zsy-jason

When LynxTemplateRender destroyed, calling setExtraTiming may cause npe problem.
- [BugFix] Fix the issue of BaseDevTool crashing when distributing messages. ([a4eb81c](https://github.com/lynx-family/lynx/commit/a4eb81cbb294a8bdacf4d445cc525e27960fcd03)) @popoaichuiniu

Registering agents, registering MessageHandlers, and distributing messages will occur in different threads, resulting in data races.
- [BugFix] Avoid JSIObjectDesrciptorInfo NPE ([42a48bd](https://github.com/lynx-family/lynx/commit/42a48bd52a800ed43d90325ef82602c1e1e4b2af)) @Awuiil

Class of JSIObjectDesrciptorInfo may be unabled to be found, should add NPE protection in Native.

- [BugFix][List] Fix c++ list hit test error ([ee50f0b](https://github.com/lynx-family/lynx/commit/ee50f0b21bd30c7ab317612f22f2407ad8b02c25)) @DwwWxx

Currently, there are two issues with the c++ list:

(1) The overflow section of list item cannot respond to tap event.

(2) The hit test logic dose not consider the translateZ property of list item.

Consider LynxBaseUI::hitTest() has considered two cases above, the c++ list only need to override getScrollX() and getScrollY().
- [BugFix][iOS][Event] Use the Container to handle focus. ([18e29fe](https://github.com/lynx-family/lynx/commit/18e29fe46e7cba6c5777868ad1c7f90d6814891d)) @rAY-ooo

description: Since EndEditing is used to specify a view and its subviews to give up the first responder, when the last clicked object is not a descendant of the object clicked this time, this click cannot make the last clicked object give up the first responder and thus the keyboard cannot be retracted. Therefore, we need to use a container to ensure that the keyboard is retracted.
- [BugFix][Infra] Fixed LynxLite compilation issues caused by refactoring and feature enrichment ([c1eaef9](https://github.com/lynx-family/lynx/commit/c1eaef94a7724438a1e720d077c8960224ca3770)) @partholon

LynxDevtool depends on ENABLE_JUST_LEPUSNG after refactoring. In order to compile Lynx Lite normally, we add this macro to LynxDevtool.

When enable_lite=true, adjust the parameters in the Lynx.gni file that are associated with the enable_lite setting. Ensure these parameters are correctly configured to align with the enable_lite activation
- [BugFix] Fix the issue with the Signal API where Computation may be executed multiple times, while also supporting parameters such as equals and skipCompare. ([e2cd2e3](https://github.com/lynx-family/lynx/commit/e2cd2e3e0fd2e3f0bda66b9535927bd980c62862)) @ShouruiSong

1. When creating Signal and Memo, support passing options.equals to allow the framework to define a custom comparison function. This capability is essential in scenarios involving branch switching.

2. When executing __WriteSignal, support passing options.skipCompare to force the execution of Computation and Memo.

3. Fixed the issue with incorrect flag determination when using MarkDownStream.
- [BugFix][Android] Fix text layout error in specific scenarios. ([13353da](https://github.com/lynx-family/lynx/commit/13353da6aeae7fb47a3879353920733eb950b238)) @Randycn

In some special scenarios, the width returned by text layout will be greater than the text width limit, which will cause unexpected ellipses after the second layout.

Determine the ellipsis count of the last line to avoid secondary layout.
- [BugFix][List] Fix list hit test error when using FiberElement for RadonDiff ([005aec4](https://github.com/lynx-family/lynx/commit/005aec43199e809774e4006d22d8208f9f0bbdcf)) @DwwWxx

If using FiberElement for RadonDiff and list child RadonComponent A reusing RadonComponent B, we should set ComponentElement's componet_id_ to the RadonComponent A.
- [BugFix] Fix npe in ListContainerView ([3feebd9](https://github.com/lynx-family/lynx/commit/3feebd97a3389a0411798730b1d8fd3030493a52)) @DwwWxx

In platform RecyclerView, one LynxView which has finished loading template is resued to load another template, after loading and in platform measure pass, npe occured in ListContainerView$CustomLinearLayout onMeasure().

This commit adds npe protection and some log to ensure the root case of this crash.

- [BugFix] NPE protect for lazy bundle lifecycle ([453f953](https://github.com/lynx-family/lynx/commit/453f953515a0437dc4e259ea2574c03c86999301)) @Awuiil

As describe
- [BugFix][Android] Fix memory leak when setting background on inline text. ([542ca2d](https://github.com/lynx-family/lynx/commit/542ca2d24fc3882b5099cf6403260fd7092b076e)) @Randycn

LynxBackground strongly holds LynxContext, causing the activity referenced by LynxContext to not be released when the textRenderer is added to the cache.

Not add to cache when  setting background on inline text.
- [BugFix] [Android] SPI maybe fail, use manual registration until this problem is solved ([de2b18b](https://github.com/lynx-family/lynx/commit/de2b18b0a824eb08fee259be928131dd48c77ab3)) @Awuiil

As describe
- [BugFix] Fix occasional bitmap recycling exception ([48deabf](https://github.com/lynx-family/lynx/commit/48deabf767d419d102b7ee874ff226d853a173b8)) @cjnhust

After turning on vsync alignment, try to hold an extra bitmap reference in the inline-image to try to solve the bitmap crash problem
- [BugFix][List] Fix missing insert platform node in batch render ([5af6dff](https://github.com/lynx-family/lynx/commit/5af6dffeb31c935d772decd7c2394571ba4fdf7d)) @DwwWxx

In RL3 framework and enable list batch render, if remove and re-insert the same list-item which is on screen, the list will miss to insert list-item's platform node to list container view.

(cherry picked from commit 7f7968daeb4fc8bc06a07edb29b26ecfb5456a09)
- [BugFix][Android][List] Speed up snap to make `<list>` scroll like Cupertino ([2215433](https://github.com/lynx-family/lynx/commit/2215433112a222135efdbba3606912c301e198c2)) @MoonfaceX

Speed up the snap scroll on Android by adjusting the hardcoded factor of `snapAlignmentMillisecondsPerPx`.

In the future, the easing-curve should be able to be customized.
- [BugFix][Event] Add enableMultiTouchParamsCompatible page switch. ([622d948](https://github.com/lynx-family/lynx/commit/622d948dca075ef562847d8211403ff22ae4860e)) @rAY-ooo

description:
1. Add the enableMultiTouchParamsCompatible page switch to control whether the parameters of multi-finger events are compatible with Lynx touch events.
2. Add the feature count of enableMultiTouchParamsCompatible.
- [BugFix] The GlobalProps is not truly cloned when handled in asynchronous threads. ([f15085f](https://github.com/lynx-family/lynx/commit/f15085f97ea13e9b632538f9fbd9baa9eae35d9f)) @Yellow5A5

The GlobalProps is not truly cloned when handled in asynchronous threads.
- [BugFix] report error with url info if client set. ([c8aa7a1](https://github.com/lynx-family/lynx/commit/c8aa7a1707873e5d73ff1866cbcfeb046e574413)) @nihao.royal

if `TemplateBundle.fromTemplate` is called with `TemplateBundleOption`, and the url is set, we need to report the input url to securityService for info.
- [BugFix] fix infinite loop in UIGroup.afterDispatchDraw ([2c747e7](https://github.com/lynx-family/lynx/commit/2c747e7211a1b290d322c575a2b90fcbc0725075)) @huzhanbo1996

set child.mNextDrawUI to null to prevent infinite loop in UIGroup.afterDispatchDraw


### ๐Ÿงช Testing
- [Testing][RTF] Add log info when case time out ([2c01e7b](https://github.com/lynx-family/lynx/commit/2c01e7be73a9d4d79e29247059d870159b4aae87)) @ZhaoSongGOO

- [Testing] Add unittest for lepus::Value ([f8f1300](https://github.com/lynx-family/lynx/commit/f8f1300028f7535cef3993605f3747ecfa460729)) @FrendyChen

The lepus::Value does not have a complete unittest. As a result, bugs in lepus::Value need to be found through more post-testing methods.
Here's a full unittest for it.
- [Testing][TestBench] Support recording for attach/detach engine operations ([fb25233](https://github.com/lynx-family/lynx/commit/fb25233b472b245fa908e73cdbc5fccaa318de89)) @ZhaoSongGOO

The client uses the LynxView interface to control the relationship between the TASM thread
and the UI thread. The testbench supports the recording and playback capability of this operation.
- [Testing] Add E2E test on ci ([b1f02eb](https://github.com/lynx-family/lynx/commit/b1f02ebe1883d0573c605c1c2d7a0823ea190e81)) @Kingatnuaa0528

Add E2E test task in ci workflow


### ๐Ÿ› ๏ธ Infra
- [Infra][Testing] Issue a warning when the core dump file does not exist. ([b86e40e](https://github.com/lynx-family/lynx/commit/b86e40e079873f78c7697e0f2b96349f22d3419a)) @ZhaoSongGOO

Issue a warning when the core dump file does not exist. Due to system permission issues,
there may be instances where the core dump file cannot be generated, leading to a failure
in stack analysis. A warning log has been added here to prevent any potential confusion.
- [Infra] fix lite build ([7d37a4d](https://github.com/lynx-family/lynx/commit/7d37a4daa33b40c9a7cee8ae1cd7c3448bc84a06)) @huzhanbo1996

fix lite build, align cq check switches with publish.py

AutuSubmit: True
- [Infra][BugFix] handle concurrent vpython invocations from multiple processes ([b4017a7](https://github.com/lynx-family/lynx/commit/b4017a7b65a30106719c892236b9ac9299af5922)) @GhostFlying

In the CQ environment, vpython may be invoked by multiple processes concurrently, which can lead to incomplete venv being observed.
This patch fixes this issue by adding a locking mechanism using a lock directory.
- [Infra] Download Android Build Tools version to 29.0.1 to avoid CI failure ([b736406](https://github.com/lynx-family/lynx/commit/b736406e69976fd7860e86e233eedb2072203a55)) @jianliang00


- [Infra][Bugfix] Fix the issue of gradle clean failure ([a12e943](https://github.com/lynx-family/lynx/commit/a12e94358fcc96fad2390e3f29e88429f05c4681)) @yongjieTang

1. When executing `./gradlew clean`, it reports an error of not finding the CMakeLists.txt file, causing the clean task to fail. Now, make the clean task depend on the generateAllGnCmakeTargets task to ensure the cmake script exists during clean, thus avoiding the failure.
2. Previously, the clean task could not clean up the intermediate products of gn to cmake. Now, improve the clean logic to ensure complete cleanup of intermediate products for Android compilation.
- [Infra]update androidbase image ([4790f91](https://github.com/lynx-family/lynx/commit/4790f91f54d315f84d5e52327ad958a286dc9a00)) @deanjingshui

the base image update to debian 11
the new image will upgrade android build-tools from 29.0.1 to 29.0.2 because it is below the minimum supported version(29.0.2) for Android Gradle Plugin 4.1.0.
- [Infra] Update android sdk publish script ([f1f1751](https://github.com/lynx-family/lynx/commit/f1f1751456faa9c9ee8db67369385c3afdb7ecb5)) @Kingatnuaa0528

1. Add LynxProcessor module when publishing android modules to maven.

2. Add sources jar into the component artifact.
- [Infra] Upgrade primjs version to 2.12.0 ([280f1ec](https://github.com/lynx-family/lynx/commit/280f1ec04843e384e776882bad6ac2942fb909cf)) @jianliang00