Skip to content

Commit 9e2a133

Browse files
msluszniakclaude
andcommitted
feat: add Vulkan backend support for Android (arm64-v8a)
- Replace fat libexecutorch.so (with QNN) with Vulkan-only build - Add ExecuTorch static libs for arm64-v8a (stripped of debug symbols) - Switch kernel registration to liboptimized_native_cpu_ops_lib.a (208 kernels) covering all portable + optimized CPU ops required by RF-DETR and other models - Add Vulkan, XNNPACK backends via --whole-archive static linking - Update tokenizer include path to pytorch/tokenizers layout Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
1 parent adffcdd commit 9e2a133

178 files changed

Lines changed: 20797 additions & 3034 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

packages/react-native-executorch/android/CMakeLists.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ string(APPEND CMAKE_CXX_FLAGS " -DRCT_NEW_ARCH_ENABLED")
2121
set(ANDROID_CPP_DIR "${CMAKE_SOURCE_DIR}/src/main/cpp")
2222
set(COMMON_CPP_DIR "${CMAKE_SOURCE_DIR}/../common")
2323
set(LIBS_DIR "${CMAKE_SOURCE_DIR}/../third-party/android/libs")
24-
set(TOKENIZERS_DIR "${CMAKE_SOURCE_DIR}/../third-party/include/executorch/extension/llm/tokenizers/include")
24+
set(TOKENIZERS_DIR "${CMAKE_SOURCE_DIR}/../third-party/include")
2525
set(INCLUDE_DIR "${CMAKE_SOURCE_DIR}/../third-party/include")
2626

2727
# Treat third-party headers as system headers to suppress deprecation warnings

packages/react-native-executorch/android/src/main/cpp/CMakeLists.txt

Lines changed: 81 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -38,42 +38,97 @@ set(RN_VERSION_LINK_LIBRARIES
3838

3939
# ------- Executorch -------
4040

41+
# libexecutorch.so is the thin JNI wrapper (JNI_OnLoad + ASR entry points).
42+
# It has a hard NEEDED dependency on libqnn_executorch_backend.so, so both must be bundled.
43+
# All other runtime symbols are statically linked from executorch-static/*.a below.
4144
add_library(executorch SHARED IMPORTED)
42-
4345
set_target_properties(executorch PROPERTIES
4446
IMPORTED_LOCATION "${LIBS_DIR}/executorch/${ANDROID_ABI}/libexecutorch.so")
4547

4648

47-
if(ANDROID_ABI STREQUAL "arm64-v8a")
48-
target_compile_definitions(react-native-executorch PRIVATE ARCH_ARM64)
49+
set(EXECUTORCH_STATIC_DIR "${LIBS_DIR}/executorch-static/${ANDROID_ABI}")
50+
51+
# Libs that use static constructors for kernel/backend registration — must use --whole-archive
52+
# so registrations are not stripped by the linker.
53+
set(EXECUTORCH_WHOLE_ARCHIVE_LIBS
54+
"${EXECUTORCH_STATIC_DIR}/liboptimized_native_cpu_ops_lib.a"
55+
"${EXECUTORCH_STATIC_DIR}/libxnnpack_backend.a"
56+
"${EXECUTORCH_STATIC_DIR}/libvulkan_backend.a"
57+
)
4958

50-
# ------- pthreadpool -------
51-
add_library(pthreadpool SHARED IMPORTED)
59+
# Libs linked normally — only pull in symbols that are referenced.
60+
# Do NOT include libs whose symbols are already compiled by this project
61+
# (e.g. libextension_llm_runner, libextension_llm_sampler, libportable_kernels
62+
# overlap with common/runner/*.cpp).
63+
set(EXECUTORCH_STATIC_LIBS
64+
"${EXECUTORCH_STATIC_DIR}/libexecutorch_core.a"
65+
"${EXECUTORCH_STATIC_DIR}/libexecutorch.a"
66+
"${EXECUTORCH_STATIC_DIR}/libextension_module.a"
67+
"${EXECUTORCH_STATIC_DIR}/libextension_tensor.a"
68+
"${EXECUTORCH_STATIC_DIR}/libextension_threadpool.a"
69+
"${EXECUTORCH_STATIC_DIR}/libextension_data_loader.a"
70+
"${EXECUTORCH_STATIC_DIR}/libextension_runner_util.a"
71+
"${EXECUTORCH_STATIC_DIR}/libtokenizers.a"
72+
"${EXECUTORCH_STATIC_DIR}/libsentencepiece.a"
73+
"${EXECUTORCH_STATIC_DIR}/libportable_kernels.a"
74+
"${EXECUTORCH_STATIC_DIR}/liboptimized_kernels.a"
75+
"${EXECUTORCH_STATIC_DIR}/libXNNPACK.a"
76+
"${EXECUTORCH_STATIC_DIR}/libxnnpack-microkernels-prod.a"
77+
"${EXECUTORCH_STATIC_DIR}/libkleidiai.a"
78+
"${EXECUTORCH_STATIC_DIR}/libre2.a"
79+
"${EXECUTORCH_STATIC_DIR}/libcpublas.a"
80+
"${EXECUTORCH_STATIC_DIR}/libeigen_blas.a"
81+
"${EXECUTORCH_STATIC_DIR}/libpthreadpool.a"
82+
"${EXECUTORCH_STATIC_DIR}/libextension_flat_tensor.a"
83+
"${EXECUTORCH_STATIC_DIR}/libextension_named_data_map.a"
84+
"${EXECUTORCH_STATIC_DIR}/libabsl_log_internal_message.a"
85+
"${EXECUTORCH_STATIC_DIR}/libabsl_log_internal_globals.a"
86+
"${EXECUTORCH_STATIC_DIR}/libabsl_log_internal_log_sink_set.a"
87+
"${EXECUTORCH_STATIC_DIR}/libabsl_log_internal_format.a"
88+
"${EXECUTORCH_STATIC_DIR}/libabsl_log_internal_check_op.a"
89+
"${EXECUTORCH_STATIC_DIR}/libabsl_log_internal_conditions.a"
90+
"${EXECUTORCH_STATIC_DIR}/libabsl_log_internal_nullguard.a"
91+
"${EXECUTORCH_STATIC_DIR}/libabsl_log_internal_proto.a"
92+
"${EXECUTORCH_STATIC_DIR}/libabsl_log_globals.a"
93+
"${EXECUTORCH_STATIC_DIR}/libabsl_log_entry.a"
94+
"${EXECUTORCH_STATIC_DIR}/libabsl_log_sink.a"
95+
"${EXECUTORCH_STATIC_DIR}/libabsl_log_initialize.a"
96+
"${EXECUTORCH_STATIC_DIR}/libabsl_log_flags.a"
97+
"${EXECUTORCH_STATIC_DIR}/libabsl_str_format_internal.a"
98+
"${EXECUTORCH_STATIC_DIR}/libabsl_strings.a"
99+
"${EXECUTORCH_STATIC_DIR}/libabsl_strings_internal.a"
100+
"${EXECUTORCH_STATIC_DIR}/libabsl_base.a"
101+
"${EXECUTORCH_STATIC_DIR}/libabsl_raw_logging_internal.a"
102+
"${EXECUTORCH_STATIC_DIR}/libabsl_spinlock_wait.a"
103+
"${EXECUTORCH_STATIC_DIR}/libabsl_synchronization.a"
104+
"${EXECUTORCH_STATIC_DIR}/libabsl_symbolize.a"
105+
"${EXECUTORCH_STATIC_DIR}/libabsl_stacktrace.a"
106+
"${EXECUTORCH_STATIC_DIR}/libabsl_int128.a"
107+
"${EXECUTORCH_STATIC_DIR}/libabsl_time.a"
108+
"${EXECUTORCH_STATIC_DIR}/libabsl_time_zone.a"
109+
"${EXECUTORCH_STATIC_DIR}/libabsl_throw_delegate.a"
110+
"${EXECUTORCH_STATIC_DIR}/libabsl_status.a"
111+
"${EXECUTORCH_STATIC_DIR}/libabsl_statusor.a"
112+
"${EXECUTORCH_STATIC_DIR}/libabsl_malloc_internal.a"
113+
"${EXECUTORCH_STATIC_DIR}/libabsl_raw_hash_set.a"
114+
"${EXECUTORCH_STATIC_DIR}/libabsl_hash.a"
115+
"${EXECUTORCH_STATIC_DIR}/libabsl_kernel_timeout_internal.a"
116+
"${EXECUTORCH_STATIC_DIR}/libabsl_examine_stack.a"
117+
"${EXECUTORCH_STATIC_DIR}/libabsl_strerror.a"
118+
"${EXECUTORCH_STATIC_DIR}/libabsl_city.a"
119+
"${EXECUTORCH_STATIC_DIR}/libabsl_low_level_hash.a"
120+
)
52121

53-
set_target_properties(pthreadpool PROPERTIES
54-
IMPORTED_LOCATION "${LIBS_DIR}/pthreadpool/${ANDROID_ABI}/libpthreadpool.so")
122+
if(ANDROID_ABI STREQUAL "arm64-v8a")
123+
target_compile_definitions(react-native-executorch PRIVATE ARCH_ARM64)
55124

56125
# ------- cpuinfo -------
57126
add_library(cpuinfo SHARED IMPORTED)
58-
59127
set_target_properties(cpuinfo PROPERTIES
60128
IMPORTED_LOCATION "${LIBS_DIR}/cpuinfo/${ANDROID_ABI}/libcpuinfo.so")
61129

62-
# ------- QNN backend (optional, only linked if present) -------
63-
set(QNN_BACKEND_LIB "${LIBS_DIR}/executorch/${ANDROID_ABI}/libqnn_executorch_backend.so")
64-
if(EXISTS "${QNN_BACKEND_LIB}")
65-
add_library(qnn_executorch_backend SHARED IMPORTED)
66-
set_target_properties(qnn_executorch_backend PROPERTIES
67-
IMPORTED_LOCATION "${QNN_BACKEND_LIB}")
68-
set(QNN_LIBS "qnn_executorch_backend")
69-
else()
70-
set(QNN_LIBS "")
71-
endif()
72-
73130
set(EXECUTORCH_LIBS
74-
"pthreadpool"
75131
"cpuinfo"
76-
${QNN_LIBS}
77132
)
78133
endif()
79134

@@ -116,7 +171,12 @@ target_link_libraries(
116171
${OPENCV_LIBS}
117172
${OPENCV_THIRD_PARTY_LIBS}
118173
${PHONEMIS_LIBS}
174+
-Wl,--whole-archive
175+
${EXECUTORCH_WHOLE_ARCHIVE_LIBS}
176+
-Wl,--no-whole-archive
177+
${EXECUTORCH_STATIC_LIBS}
119178
executorch
120179
${EXECUTORCH_LIBS}
180+
vulkan
121181
z
122182
)

0 commit comments

Comments
 (0)