# byte_release_tutorial **Repository Path**: liang-chengkunniubi/byte_release_tutorial ## Basic Information - **Project Name**: byte_release_tutorial - **Description**: 鸿蒙关于release字节har包相关 - **Primary Language**: Unknown - **License**: Apache-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2025-09-04 - **Last Updated**: 2025-09-09 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # Release版本har包相关文档 ## 如何编译一个release版本的RNOH包 1. 新建新工程: ![](./picture/01.png) 2. 在工程级build-profile.json5中添加如下配置 ![](./picture/02.png) 3. 解压react_native_openharmony的har包,将解压后文件夹下的文件复制到当前工程的根目录下的react_native_openharmony文件夹(需新建)中 - 在模块级build-profile.json5中进行如下配置: ```json { apiType: 'stageMode', buildOption: { externalNativeOptions: { path: './src/main/cpp/CMakeLists.txt', arguments: '', cppFlags: '', }, }, "buildOptionSet": [ { "name": "release", "arkOptions": { "byteCodeHar": true }, "externalNativeOptions": { "path": "./src/main/cpp/CMakeLists.txt", "arguments": "", "cppFlags": "" }, "nativeLib": { "headerPath": [ "./src/main/include" ] } } ], targets: [ { name: 'default', runtimeOS: 'HarmonyOS', }, ], } ``` - 将react_native_openharmony\src\main下的module.json更改后缀名为module.json5并配置 ```json { "module": { "name": "react_native_openharmony", "type": "har", "deviceTypes": [ "default" ], "requestPermissions": [ { "name": "ohos.permission.INTERNET" }, { "name": "ohos.permission.VIBRATE" } ] } } ``` - 对react_native_openharmony\src\main\cpp下的CMakeLists.txt进行配置 ```cmake # Copyright (c) 2024 Huawei Technologies Co., Ltd. # # This source code is licensed under the MIT license found in the # LICENSE-MIT file in the root directory of this source tree. cmake_minimum_required(VERSION 3.4.1) project(rnoh_semi-semi) cmake_policy(SET CMP0079 NEW) # Allow to link libraries from different # directories than targets set(RNOH_CPP_DIR "${CMAKE_CURRENT_SOURCE_DIR}") set(NATIVERENDER_ROOT_PATH "${RNOH_CPP_DIR}") set(third_party_dir "${RNOH_CPP_DIR}/third-party") set(patches_dir "${RNOH_CPP_DIR}/patches") option(USE_HERMES "enables the Hermes JS Engine" ON) option(WITH_HITRACE_SYSTRACE "enables HiTrace-based Systrace implementation" ON) if(WITH_HITRACE_SYSTRACE) add_compile_definitions(WITH_HITRACE_SYSTRACE) endif() add_compile_options("-Wno-error=unused-command-line-argument") include_directories(${NATIVERENDER_ROOT_PATH} ${NATIVERENDER_ROOT_PATH}/include) # FMT set(fmt_include_dir "${third_party_dir}/fmt/include") set(fmt_src_dir "${third_party_dir}/fmt/src") add_library(fmt_target) target_include_directories(fmt_target PRIVATE "${fmt_include_dir}" ) target_sources(fmt_target PRIVATE "${fmt_src_dir}/format.cc" "${fmt_src_dir}/os.cc" ) # DOUBLE CONVERSION set(double_conversion_include_dir "${third_party_dir}/double-conversion") set(double_conversion_src_dir "${third_party_dir}/double-conversion/double-conversion") add_library(double_conversion_target) target_include_directories(double_conversion_target PRIVATE "${double_conversion_include_dir}" ) target_sources(double_conversion_target PRIVATE "${double_conversion_src_dir}/bignum-dtoa.cc" "${double_conversion_src_dir}/bignum.cc" "${double_conversion_src_dir}/cached-powers.cc" "${double_conversion_src_dir}/diy-fp.cc" "${double_conversion_src_dir}/double-conversion.cc" "${double_conversion_src_dir}/fast-dtoa.cc" "${double_conversion_src_dir}/fixed-dtoa.cc" "${double_conversion_src_dir}/strtod.cc" ) # GLOG set(glog_include_dir "${third_party_dir}/glog/src") set(glog_src_dir "${third_party_dir}/glog/src") add_library(glog_target) target_include_directories(glog_target PUBLIC "${glog_include_dir}" "${glog_include_dir}/base" ) target_sources(glog_target PRIVATE "${glog_src_dir}/demangle.cc" "${glog_src_dir}/logging.cc" "${glog_src_dir}/raw_logging.cc" "${glog_src_dir}/signalhandler.cc" "${glog_src_dir}/symbolize.cc" "${glog_src_dir}/utilities.cc" "${glog_src_dir}/vlog_is_on.cc" ) target_compile_options(glog_target PRIVATE -Wno-shorten-64-to-32 -Wno-header-hygiene -Wno-deprecated-declarations -fdeclspec ) # BOOST set(boost_libs_dir "${third_party_dir}/boost/libs") file(GLOB boost_include_dirs "${boost_libs_dir}/*/include") set(BOOST_ENABLE_CMAKE On) add_subdirectory("${boost_libs_dir}/core") add_subdirectory("${boost_libs_dir}/config") add_subdirectory("${boost_libs_dir}/assert") add_subdirectory("${boost_libs_dir}/static_assert") add_subdirectory("${boost_libs_dir}/type_traits") add_subdirectory("${boost_libs_dir}/throw_exception") add_subdirectory("${boost_libs_dir}/move") add_subdirectory("${boost_libs_dir}/predef") add_subdirectory("${boost_libs_dir}/pool") add_subdirectory("${boost_libs_dir}/mp11") add_subdirectory("${boost_libs_dir}/smart_ptr") add_subdirectory("${boost_libs_dir}/winapi") add_subdirectory("${boost_libs_dir}/integer") add_subdirectory("${boost_libs_dir}/context") # LIBEVENT add_library(libevent) set(libevent_src_dir "${third_party_dir}/libevent") set(libevent_include_dirs "${patches_dir}/libevent/${OHOS_ARCH}" "${third_party_dir}/libevent/include" "${third_party_dir}/libevent/compat" ) target_include_directories(libevent PUBLIC ${libevent_include_dirs} ) target_sources(libevent PRIVATE "${libevent_src_dir}/event.c" "${libevent_src_dir}/buffer.c" "${libevent_src_dir}/bufferevent.c" "${libevent_src_dir}/bufferevent_filter.c" "${libevent_src_dir}/bufferevent_pair.c" "${libevent_src_dir}/bufferevent_ratelim.c" "${libevent_src_dir}/bufferevent_sock.c" "${libevent_src_dir}/epoll.c" "${libevent_src_dir}/evmap.c" "${libevent_src_dir}/evthread.c" "${libevent_src_dir}/evthread_pthread.c" "${libevent_src_dir}/evutil.c" "${libevent_src_dir}/evutil_rand.c" "${libevent_src_dir}/evutil_time.c" "${libevent_src_dir}/listener.c" "${libevent_src_dir}/log.c" "${libevent_src_dir}/poll.c" "${libevent_src_dir}/signal.c" "${libevent_src_dir}/strlcpy.c" "${libevent_src_dir}/select.c" ) # FOLLY set(folly_include_dir "${third_party_dir}/folly") set(folly_src_dir "${third_party_dir}/folly/folly") add_library(folly_target) target_include_directories(folly_target PUBLIC "${folly_include_dir}" "${boost_include_dirs}" "${double_conversion_include_dir}" "${glog_include_dir}" "${fmt_include_dir}" ) set(folly_compile_options -DFOLLY_NO_CONFIG=1 -DFOLLY_MOBILE=1 -DFOLLY_USE_LIBCPP=1 -DFOLLY_HAVE_RECVMMSG=1 -DFOLLY_HAVE_PTHREAD=1 -Wno-comma -Wno-shorten-64-to-32 -Wno-documentation -faligned-new ) target_compile_options(folly_target PUBLIC ${folly_compile_options}) target_sources(folly_target PRIVATE "${folly_src_dir}/SharedMutex.cpp" "${folly_src_dir}/concurrency/CacheLocality.cpp" "${folly_src_dir}/detail/Futex.cpp" "${folly_src_dir}/portability/Malloc.cpp" "${folly_src_dir}/synchronization/ParkingLot.cpp" "${folly_src_dir}/system/ThreadId.cpp" "${folly_src_dir}/lang/SafeAssert.cpp" "${folly_src_dir}/lang/ToAscii.cpp" "${folly_src_dir}/dynamic.cpp" "${folly_src_dir}/hash/SpookyHashV2.cpp" "${folly_src_dir}/json_pointer.cpp" "${folly_src_dir}/Conv.cpp" "${folly_src_dir}/Format.cpp" "${folly_src_dir}/memory/detail/MallocImpl.cpp" "${folly_src_dir}/json.cpp" "${folly_src_dir}/Unicode.cpp" "${folly_src_dir}/lang/Assume.cpp" "${folly_src_dir}/ScopeGuard.cpp" ) target_link_libraries(folly_target PUBLIC fmt_target glog_target double_conversion_target ) # FOLLY FUTURES add_library(folly_futures) target_include_directories(folly_futures PUBLIC "${folly_include_dir}" "${boost_include_dirs}" "${double_conversion_include_dir}" "${glog_include_dir}" "${fmt_include_dir}" "${libevent_include_dirs}" ) target_compile_options(folly_futures PRIVATE ${folly_compile_options} "-Wno-nullability-completeness" ) target_compile_features(folly_futures PUBLIC cxx_std_17) target_sources(folly_futures PRIVATE "${patches_dir}/folly/Demangle.cpp" "${folly_src_dir}/ExceptionString.cpp" "${folly_src_dir}/ExceptionWrapper.cpp" "${folly_src_dir}/Executor.cpp" "${folly_src_dir}/FileUtil.cpp" "${folly_src_dir}/ScopeGuard.cpp" "${folly_src_dir}/String.cpp" "${folly_src_dir}/Singleton.cpp" "${folly_src_dir}/Try.cpp" # "${folly_src_dir}/concurrency/CacheLocality.cpp" "${folly_src_dir}/concurrency/DeadlockDetector.cpp" "${folly_src_dir}/concurrency/QueueObserver.cpp" "${folly_src_dir}/detail/AsyncTrace.cpp" "${folly_src_dir}/detail/AtFork.cpp" # "${folly_src_dir}/detail/Futex.cpp" "${folly_src_dir}/detail/MemoryIdler.cpp" "${folly_src_dir}/detail/SingletonStackTrace.cpp" "${folly_src_dir}/detail/StaticSingletonManager.cpp" "${folly_src_dir}/detail/ThreadLocalDetail.cpp" "${folly_src_dir}/detail/UniqueInstance.cpp" "${folly_src_dir}/executors/CPUThreadPoolExecutor.cpp" "${folly_src_dir}/executors/Codel.cpp" "${folly_src_dir}/executors/EDFThreadPoolExecutor.cpp" "${folly_src_dir}/executors/ExecutorWithPriority.cpp" "${folly_src_dir}/executors/GlobalExecutor.cpp" "${folly_src_dir}/executors/GlobalThreadPoolList.cpp" "${folly_src_dir}/executors/IOThreadPoolDeadlockDetectorObserver.cpp" "${folly_src_dir}/executors/IOThreadPoolExecutor.cpp" "${folly_src_dir}/executors/InlineExecutor.cpp" "${folly_src_dir}/executors/ManualExecutor.cpp" "${folly_src_dir}/executors/MeteredExecutor.cpp" "${folly_src_dir}/executors/QueuedImmediateExecutor.cpp" "${folly_src_dir}/executors/SerialExecutor.cpp" "${folly_src_dir}/executors/StrandExecutor.cpp" "${folly_src_dir}/executors/ThreadPoolExecutor.cpp" "${folly_src_dir}/executors/ThreadedExecutor.cpp" "${folly_src_dir}/executors/TimedDrivableExecutor.cpp" "${folly_src_dir}/executors/TimekeeperScheduledExecutor.cpp" "${folly_src_dir}/fibers/BatchSemaphore.cpp" "${folly_src_dir}/fibers/Baton.cpp" "${folly_src_dir}/fibers/Fiber.cpp" "${folly_src_dir}/fibers/FiberManager.cpp" "${folly_src_dir}/fibers/GuardPageAllocator.cpp" "${folly_src_dir}/fibers/Semaphore.cpp" "${folly_src_dir}/fibers/SemaphoreBase.cpp" "${folly_src_dir}/fibers/SimpleLoopController.cpp" "${folly_src_dir}/futures/Barrier.cpp" "${folly_src_dir}/futures/Future.cpp" "${folly_src_dir}/futures/ManualTimekeeper.cpp" "${folly_src_dir}/futures/Promise.cpp" "${folly_src_dir}/futures/SharedPromise.cpp" "${folly_src_dir}/futures/ThreadWheelTimekeeper.cpp" "${folly_src_dir}/futures/detail/Core.cpp" "${folly_src_dir}/io/Cursor.cpp" "${folly_src_dir}/io/IOBuf.cpp" "${folly_src_dir}/io/IOBufQueue.cpp" "${folly_src_dir}/io/async/AsyncTimeout.cpp" "${folly_src_dir}/io/async/EventBase.cpp" "${folly_src_dir}/io/async/EventBaseBackendBase.cpp" "${folly_src_dir}/io/async/EventBaseLocal.cpp" "${folly_src_dir}/io/async/EventBaseManager.cpp" "${folly_src_dir}/io/async/EventHandler.cpp" "${folly_src_dir}/io/async/HHWheelTimer.cpp" "${folly_src_dir}/io/async/Request.cpp" "${folly_src_dir}/io/async/TimeoutManager.cpp" "${folly_src_dir}/io/async/VirtualEventBase.cpp" "${folly_src_dir}/lang/CString.cpp" "${folly_src_dir}/lang/Exception.cpp" "${folly_src_dir}/memory/MallctlHelper.cpp" "${folly_src_dir}/net/NetOps.cpp" "${folly_src_dir}/net/NetOpsDispatcher.cpp" "${folly_src_dir}/net/TcpInfo.cpp" "${folly_src_dir}/net/detail/SocketFileDescriptorMap.cpp" "${folly_src_dir}/portability/SysMembarrier.cpp" "${folly_src_dir}/portability/SysUio.cpp" "${folly_src_dir}/synchronization/AsymmetricMemoryBarrier.cpp" "${folly_src_dir}/synchronization/AtomicNotification.cpp" "${folly_src_dir}/synchronization/DistributedMutex.cpp" "${folly_src_dir}/synchronization/Hazptr.cpp" "${folly_src_dir}/synchronization/HazptrThreadPoolExecutor.cpp" # "${folly_src_dir}/synchronization/ParkingLot.cpp" "${folly_src_dir}/synchronization/Rcu.cpp" "${folly_src_dir}/synchronization/SanitizeThread.cpp" "${folly_src_dir}/synchronization/WaitOptions.cpp" "${folly_src_dir}/synchronization/detail/Hardware.cpp" "${folly_src_dir}/synchronization/detail/Sleeper.cpp" "${folly_src_dir}/system/HardwareConcurrency.cpp" "${folly_src_dir}/system/Pid.cpp" # "${folly_src_dir}/system/ThreadId.cpp" "${folly_src_dir}/system/ThreadName.cpp" "${folly_src_dir}/tracing/AsyncStack.cpp" ) target_link_libraries(folly_futures libevent) # -------- REACT COMMON -------- set(REACT_COMMON_DIR "${RNOH_CPP_DIR}/third-party/rn/ReactCommon") set(REACT_COMMON_PATCH_DIR "${patches_dir}/react_native_core") add_library(folly_runtime ALIAS folly_target) add_library(glog ALIAS glog_target) include_directories(${REACT_COMMON_PATCH_DIR}) # dummy targets added to avoid modyfing CMakeLists located in ReactCommon add_library(boost INTERFACE) add_library(log INTERFACE) add_library(glog_init INTERFACE) add_library(android INTERFACE) add_library(fb INTERFACE) add_library(fbjni INTERFACE) add_library(reactnativejni INTERFACE) add_library(mapbufferjni INTERFACE) function(add_react_common_subdir relative_path) add_subdirectory(${REACT_COMMON_DIR}/${relative_path}) endfunction() add_react_common_subdir(yoga) add_library(yoga ALIAS yogacore) add_react_common_subdir(runtimeexecutor) add_react_common_subdir(reactperflogger) add_react_common_subdir(logger) add_react_common_subdir(jsiexecutor) add_react_common_subdir(cxxreact) add_react_common_subdir(jsi) add_react_common_subdir(butter) add_react_common_subdir(callinvoker) add_react_common_subdir(jsinspector) add_react_common_subdir(react/renderer/runtimescheduler) add_subdirectory(${REACT_COMMON_PATCH_DIR}/react/debug) add_react_common_subdir(react/config) add_react_common_subdir(react/renderer/animations) add_react_common_subdir(react/renderer/attributedstring) add_react_common_subdir(react/renderer/componentregistry) add_react_common_subdir(react/renderer/mounting) add_react_common_subdir(react/renderer/scheduler) add_react_common_subdir(react/renderer/telemetry) add_react_common_subdir(react/renderer/templateprocessor) add_react_common_subdir(react/renderer/uimanager) add_react_common_subdir(react/renderer/core) add_react_common_subdir(react/renderer/graphics) add_subdirectory(${REACT_COMMON_PATCH_DIR}/react/renderer/debug) add_react_common_subdir(react/renderer/imagemanager) add_react_common_subdir(react/renderer/components/view) # add_react_common_subdir(react/renderer/components/switch) add_subdirectory(${REACT_COMMON_PATCH_DIR}/react/renderer/components/textinput) # add_react_common_subdir(react/renderer/components/progressbar) add_react_common_subdir(react/renderer/components/root) add_react_common_subdir(react/renderer/components/image) # add_react_common_subdir(react/renderer/components/legacyviewmanagerinterop) # add_react_common_subdir(react/renderer/componentregistry/native) #add_react_common_subdir(react/renderer/components/text) add_subdirectory(${REACT_COMMON_PATCH_DIR}/react/renderer/components/text) # add_react_common_subdir(react/renderer/components/unimplementedview) add_subdirectory(${REACT_COMMON_PATCH_DIR}/react/renderer/components/rncore) add_react_common_subdir(react/renderer/components/modal) add_react_common_subdir(react/renderer/components/scrollview) add_react_common_subdir(react/renderer/leakchecker) add_subdirectory(${REACT_COMMON_PATCH_DIR}/react/renderer/textlayoutmanager) add_react_common_subdir(react/utils) add_react_common_subdir(react/bridging) add_react_common_subdir(react/renderer/mapbuffer) add_react_common_subdir(react/nativemodule/core) target_include_directories(react_nativemodule_core PRIVATE "${REACT_COMMON_DIR}/callinvoker") add_subdirectory("${RNOH_CPP_DIR}/RNOH/executor") # ---------------------------------------------------------------------------------------------------------------------- add_library(rnoh_semi SHARED "${RNOH_CPP_DIR}/RNOH/RNInstanceArkTS.cpp" "${RNOH_CPP_DIR}/RNOH/RNInstanceCAPI.cpp" "${RNOH_CPP_DIR}/RNOH/RNInstanceInternal.cpp" "${RNOH_CPP_DIR}/RNOH/JSBigStringHelpers.cpp" "${RNOH_CPP_DIR}/RNOH/SchedulerDelegate.cpp" "${RNOH_CPP_DIR}/RNOH/BlobCollector.cpp" "${RNOH_CPP_DIR}/RNOH/MessageQueueThread.cpp" "${RNOH_CPP_DIR}/RNOH/MutationsToNapiConverter.cpp" "${RNOH_CPP_DIR}/RNOH/LogSink.cpp" "${RNOH_CPP_DIR}/RNOH/NativeLogger.cpp" "${RNOH_CPP_DIR}/RNOH/ArkJS.cpp" "${RNOH_CPP_DIR}/RNOH/ArkTSBridge.cpp" "${RNOH_CPP_DIR}/RNOH/Inspector.cpp" "${RNOH_CPP_DIR}/RNOH/ComponentInstanceProvider.cpp" "${RNOH_CPP_DIR}/RNOH/MountingManagerArkTS.cpp" "${RNOH_CPP_DIR}/RNOH/MountingManagerCAPI.cpp" "${RNOH_CPP_DIR}/RNOH/ShadowViewRegistry.cpp" "${RNOH_CPP_DIR}/RNOH/TurboModuleProvider.cpp" "${RNOH_CPP_DIR}/RNOH/TurboModuleFactory.cpp" "${RNOH_CPP_DIR}/RNOH/ArkTSTurboModule.cpp" "${RNOH_CPP_DIR}/RNOH/JsiConversions.cpp" "${RNOH_CPP_DIR}/RNOH/Package.cpp" "${RNOH_CPP_DIR}/RNOH/ComponentInstancePreallocationRequestQueue.cpp" "${RNOH_CPP_DIR}/RNOH/UIManagerModule.cpp" "${RNOH_CPP_DIR}/RNOH/VSyncListener.cpp" "${RNOH_CPP_DIR}/RNOH/TouchTarget.cpp" "${RNOH_CPP_DIR}/RNOH/TextMeasurer.cpp" "${RNOH_CPP_DIR}/RNOH/TextMeasureRegistry.cpp" "${RNOH_CPP_DIR}/RNOH/TaskExecutor/TaskExecutor.cpp" "${RNOH_CPP_DIR}/RNOH/TaskExecutor/NapiTaskRunner.cpp" "${RNOH_CPP_DIR}/RNOH/TaskExecutor/EventLoopTaskRunner.cpp" "${RNOH_CPP_DIR}/RNOH/TaskExecutor/ThreadTaskRunner.cpp" "${RNOH_CPP_DIR}/RNOH/TaskExecutor/DefaultExceptionHandler.cpp" "${RNOH_CPP_DIR}/RNOH/TaskExecutor/uv/Async.cpp" "${RNOH_CPP_DIR}/RNOH/TaskExecutor/uv/Timer.cpp" "${RNOH_CPP_DIR}/RNOH/TaskExecutor/uv/EventLoop.cpp" "${RNOH_CPP_DIR}/RNOHCorePackage/TurboModules/AccessibilityInfoTurboModule.cpp" "${RNOH_CPP_DIR}/RNOHCorePackage/TurboModules/AlertManagerTurboModule.cpp" "${RNOH_CPP_DIR}/RNOHCorePackage/TurboModules/AppearanceTurboModule.cpp" "${RNOH_CPP_DIR}/RNOHCorePackage/TurboModules/AppStateTurboModule.cpp" "${RNOH_CPP_DIR}/RNOHCorePackage/TurboModules/BlobTurboModule.cpp" "${RNOH_CPP_DIR}/RNOHCorePackage/TurboModules/DeviceEventManagerTurboModule.cpp" "${RNOH_CPP_DIR}/RNOHCorePackage/TurboModules/DeviceInfoTurboModule.cpp" "${RNOH_CPP_DIR}/RNOHCorePackage/TurboModules/ExceptionsManagerTurboModule.cpp" "${RNOH_CPP_DIR}/RNOHCorePackage/TurboModules/FileReaderTurboModule.cpp" "${RNOH_CPP_DIR}/RNOHCorePackage/TurboModules/ImageLoaderTurboModule.cpp" "${RNOH_CPP_DIR}/RNOHCorePackage/TurboModules/LogBoxTurboModule.cpp" "${RNOH_CPP_DIR}/RNOHCorePackage/TurboModules/DevLoadingViewTurboModule.cpp" "${RNOH_CPP_DIR}/RNOHCorePackage/TurboModules/LinkingManagerTurboModule.cpp" "${RNOH_CPP_DIR}/RNOHCorePackage/TurboModules/NetworkingTurboModule.cpp" "${RNOH_CPP_DIR}/RNOHCorePackage/TurboModules/PlatformColorTurboModule.cpp" "${RNOH_CPP_DIR}/RNOHCorePackage/TurboModules/PlatformConstantsTurboModule.cpp" "${RNOH_CPP_DIR}/RNOHCorePackage/TurboModules/SourceCodeTurboModule.cpp" "${RNOH_CPP_DIR}/RNOHCorePackage/TurboModules/StatusBarTurboModule.cpp" "${RNOH_CPP_DIR}/RNOHCorePackage/TurboModules/TimingTurboModule.cpp" "${RNOH_CPP_DIR}/RNOHCorePackage/TurboModules/WebSocketTurboModule.cpp" "${RNOH_CPP_DIR}/RNOHCorePackage/TurboModules/SafeAreaTurboModule.cpp" "${RNOH_CPP_DIR}/RNOHCorePackage/TurboModules/DevSettingsTurboModule.cpp" "${RNOH_CPP_DIR}/RNOHCorePackage/TurboModules/DevMenuTurboModule.cpp" "${RNOH_CPP_DIR}/RNOHCorePackage/TurboModules/VibrationTurboModule.cpp" "${RNOH_CPP_DIR}/RNOHCorePackage/TurboModules/ToastAndroidTurboModule.cpp" "${RNOH_CPP_DIR}/RNOHCorePackage/TurboModules/PermissionsAndroidTurboModule.cpp" "${RNOH_CPP_DIR}/RNOHCorePackage/TurboModules/SettingsTurboModule.cpp" "${RNOH_CPP_DIR}/RNOHCorePackage/TurboModules/ShareTurboModule.cpp" "${RNOH_CPP_DIR}/RNOHCorePackage/TurboModules/ActionSheetIOSTurboModule.cpp" "${RNOH_CPP_DIR}/RNOHCorePackage/TurboModules/Animated/NativeAnimatedTurboModule.cpp" "${RNOH_CPP_DIR}/RNOHCorePackage/TurboModules/Animated/AnimatedNodesManager.cpp" "${RNOH_CPP_DIR}/RNOHCorePackage/TurboModules/Animated/Nodes/AnimatedNode.cpp" "${RNOH_CPP_DIR}/RNOHCorePackage/TurboModules/Animated/Nodes/TransformAnimatedNode.cpp" "${RNOH_CPP_DIR}/RNOHCorePackage/TurboModules/Animated/Nodes/InterpolationAnimatedNode.cpp" "${RNOH_CPP_DIR}/RNOHCorePackage/TurboModules/Animated/Nodes/DiffClampAnimatedNode.cpp" "${RNOH_CPP_DIR}/RNOHCorePackage/TurboModules/Animated/Nodes/TrackingAnimatedNode.cpp" "${RNOH_CPP_DIR}/RNOHCorePackage/TurboModules/Animated/Drivers/AnimationDriver.cpp" "${RNOH_CPP_DIR}/RNOHCorePackage/TurboModules/Animated/Drivers/FrameBasedAnimationDriver.cpp" "${RNOH_CPP_DIR}/RNOHCorePackage/TurboModules/Animated/Drivers/SpringAnimationDriver.cpp" "${RNOH_CPP_DIR}/RNOHCorePackage/TurboModules/Animated/Drivers/DecayAnimationDriver.cpp" "${RNOH_CPP_DIR}/RNOHCorePackage/TurboModules/Animated/Drivers/EventAnimationDriver.cpp" "${RNOH_CPP_DIR}/RNOHCorePackage/TurboModules/I18nManagerTurboModule.cpp" "${RNOH_CPP_DIR}/RNOHCorePackage/EventEmitRequestHandlers/TouchEventEmitRequestHandler.cpp" "${RNOH_CPP_DIR}/RNOH/arkui/UIInputEventHandler.cpp" "${RNOH_CPP_DIR}/RNOH/arkui/NativeNodeApi.cpp" "${RNOH_CPP_DIR}/RNOH/arkui/NativeDialogApi.cpp" "${RNOH_CPP_DIR}/RNOH/arkui/ArkUINodeRegistry.cpp" "${RNOH_CPP_DIR}/RNOH/arkui/NodeContentHandle.cpp" "${RNOH_CPP_DIR}/RNOH/arkui/ArkUISurface.cpp" "${RNOH_CPP_DIR}/RNOH/arkui/ArkUINode.cpp" "${RNOH_CPP_DIR}/RNOH/arkui/ColumnNode.cpp" "${RNOH_CPP_DIR}/RNOH/arkui/ImageNode.cpp" "${RNOH_CPP_DIR}/RNOH/arkui/ScrollNode.cpp" "${RNOH_CPP_DIR}/RNOH/arkui/StackNode.cpp" "${RNOH_CPP_DIR}/RNOH/arkui/TextNode.cpp" "${RNOH_CPP_DIR}/RNOH/arkui/TextAreaNode.cpp" "${RNOH_CPP_DIR}/RNOH/arkui/TextInputNode.cpp" "${RNOH_CPP_DIR}/RNOH/arkui/TextInputNodeBase.cpp" "${RNOH_CPP_DIR}/RNOH/arkui/ArkUIDialogHandler.cpp" "${RNOH_CPP_DIR}/RNOH/arkui/TouchEventDispatcher.cpp" "${RNOH_CPP_DIR}/RNOH/arkui/LoadingProgressNode.cpp" "${RNOH_CPP_DIR}/RNOH/arkui/ToggleNode.cpp" "${RNOH_CPP_DIR}/RNOH/arkui/RefreshNode.cpp" "${RNOH_CPP_DIR}/RNOH/arkui/CustomNode.cpp" "${RNOH_CPP_DIR}/RNOH/ComponentInstance.cpp" "${RNOH_CPP_DIR}/RNOHCorePackage/ComponentInstances/ImageComponentInstance.cpp" "${RNOH_CPP_DIR}/RNOHCorePackage/ComponentInstances/ViewComponentInstance.cpp" "${RNOH_CPP_DIR}/RNOHCorePackage/ComponentInstances/TextComponentInstance.cpp" "${RNOH_CPP_DIR}/RNOHCorePackage/ComponentInstances/TextConversions.cpp" "${RNOH_CPP_DIR}/RNOHCorePackage/ComponentInstances/TextInputComponentInstance.cpp" "${RNOH_CPP_DIR}/RNOHCorePackage/ComponentInstances/ScrollViewComponentInstance.cpp" "${RNOH_CPP_DIR}/RNOHCorePackage/ComponentInstances/ActivityIndicatorComponentInstance.cpp" "${RNOH_CPP_DIR}/RNOHCorePackage/ComponentInstances/ModalHostViewComponentInstance.cpp" "${RNOH_CPP_DIR}/RNOHCorePackage/ComponentInstances/SwitchComponentInstance.cpp" "${RNOH_CPP_DIR}/RNOHCorePackage/ComponentInstances/PullToRefreshViewComponentInstance.cpp" "${RNOH_CPP_DIR}/RNOHCorePackage/ComponentInstances/CustomNodeComponentInstance.cpp" "${RNOH_CPP_DIR}/RNOH/Performance/NativeTracing.cpp" "${RNOH_CPP_DIR}/RNOH/Performance/HarmonyReactMarker.cpp" "${RNOH_CPP_DIR}/RNOH/Performance/OHReactMarkerListener.cpp" "${RNOH_CPP_DIR}/RNOH/executor/hermesExecutor.cpp" ) target_include_directories(rnoh_semi PUBLIC "${RNOH_CPP_DIR}" "${REACT_COMMON_DIR}" "${REACT_COMMON_DIR}/jsiexecutor" "${folly_include_dir}" "${RNOH_APP_DIR}" ) # add hitrace systrace implementation for debugging if(DEFINED WITH_HITRACE_SYSTRACE) target_link_libraries(reactnative libhitrace_ndk.z.so) target_link_libraries(react_nativemodule_core libhitrace_ndk.z.so) target_link_libraries(react_render_debug libhitrace_ndk.z.so) endif() if(USE_HERMES) add_hermes_executor(ON) else() add_jsvm_executor(ON) endif() target_link_libraries(rnoh_semi PUBLIC libace_napi.z.so libace_ndk.z.so libhilog_ndk.z.so librawfile.z.so libnative_vsync.so libnative_drawing.so uv Boost::context reactnative react_render_scheduler hermes_executor_common rrc_image rrc_text rrc_textinput rrc_scrollview rrc_modal react_codegen_rncore react_nativemodule_core react_bridging react_render_animations ) message("USE_HERMES is set to: ${USE_HERMES}") if(USE_HERMES) target_compile_definitions(rnoh_semi PUBLIC USE_HERMES=1) else() target_compile_definitions(rnoh_semi PUBLIC USE_HERMES=0) endif() target_compile_options(rnoh_semi PUBLIC ${folly_compile_options} -DRAW_PROPS_ENABLED ) target_compile_features(rnoh_semi PUBLIC cxx_std_17) if("$ENV{RNOH_C_API_ARCH}" STREQUAL "1") message("Experimental C-API architecture enabled") target_link_libraries(rnoh_semi PUBLIC libqos.so) target_compile_definitions(rnoh_semi PUBLIC C_API_ARCH) endif() if(DEFINED LOG_VERBOSITY_LEVEL) message("LOG_VERBOSITY_LEVEL is set to: ${LOG_VERBOSITY_LEVEL}") target_compile_definitions(rnoh_semi PUBLIC LOG_VERBOSITY_LEVEL=${LOG_VERBOSITY_LEVEL}) endif() ``` - 在工程级build-profile.json5下添加如下配置后同步项目: ```json { "app": { "signingConfigs": [], "products": [ { "name": "default", "signingConfig": "default", "targetSdkVersion": "5.1.1(19)", "compatibleSdkVersion": "5.0.2(14)", "runtimeOS": "HarmonyOS", "buildOption": { "strictMode": { "caseSensitiveCheck": true, "useNormalizedOHMUrl": true } } } ], "buildModeSet": [ { "name": "debug", }, { "name": "release" } ] }, "modules": [ { "name": "entry", "srcPath": "./entry", "targets": [ { "name": "default", "applyToProducts": [ "default" ] } ] }, + { + "name": "react_native_openharmony", + "srcPath": "./react_native_openharmony" + } ] } ``` 4. react_native_openharmony\src\main\cpp的各级子目录中如果包含CMakeLists.txt,需要将CMakeLists.txt中的rnoh更改为rnoh_semi 此处以react_native_openharmony\src\main\cpp\RNOH\executor下的CMakeLists.txt为例: ![](./picture/rnoh04.png) 5. 在react_native_openharmony\src\main下需要生成include文件夹包含cpp下的所有.h头文件,可使用本工程中的rnoh_shell进行生成,脚本原地址为https://gitee.com/jarayard/rnoh_shell.git 关于该脚本后的使用: ![](./picture/rnoh05.png) 更改路径后在cmd中执行 ```cmd npm install node index.js ``` 后即可在main目录下生成include文件 6. 检查模块级react_native_openharmony下的oh-package.json的"main": "index.ets"配置是否与模块react_native_openharmony目录下的index.ets命名是否一致,改为一致 7. 对打包方式进行配置切换为Release后点击Build->Make Module ***: ![](./picture/rnoh02.png) ![](./picture/rnoh03.png) 8. 生成的字节release包所在目录结构如下: ![](./picture/rnoh06.png) 包结构如下: ![](./picture/rnoh07.png) **上述操作可以在实例工程byte_release_tutorial尝试** ## 应用如何使用release的字节RNOH包 1. 在示例工程rn_oh/harmony中新建libs文件夹,将release的字节RNOH包放入其中 ![](./picture/release_rnoh_01.png) 2. 在rn_oh/harmony/entry/oh-package.json5中进行配置: ![](./picture/release_rnoh_04.png) 3. rn_oh/harmony/entry/build-profile.json5进行配置: ```json { "apiType": 'stageMode', "buildOption": { "externalNativeOptions": { "path": "./src/main/cpp/CMakeLists.txt", "arguments": "", "cppFlags": "", "abiFilters": ["arm64-v8a"] } }, "targets": [ { "name": "default", "runtimeOS": "HarmonyOS" }, { "name": "ohosTest", } ] } ``` 4. 在rn_oh\harmony\entry\src\main\cpp下的CMakeLists.txt进行配置(下方关于svg源码包的配置是用于测试字节rnoh是否可以正常使用): ```cmake project(rnapp) cmake_minimum_required(VERSION 3.4.1) set(CMAKE_SKIP_BUILD_RPATH TRUE) set(NATIVERENDER_ROOT_PATH "${CMAKE_CURRENT_SOURCE_DIR}") set(OH_MODULE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/../../../oh_modules") set(RNOH_CPP_DIR "${OH_MODULE_DIR}/@rnoh/react-native-openharmony/include") set(REACT_COMMON_PATCH_DIR "${RNOH_CPP_DIR}/patches/react_native_core") set(CMAKE_CXX_STANDARD 17) set(LOG_VERBOSITY_LEVEL 1) set(CMAKE_ASM_FLAGS "-Wno-error=unused-command-line-argument -Qunused-arguments") set(RNOH_GENERATED_DIR "${CMAKE_CURRENT_SOURCE_DIR}/generated") set(CMAKE_CXX_FLAGS "-fstack-protector-strong -Wl,-z,relro,-z,now,-z,noexecstack -s -fPIE -pie -DNDEBUG") set(WITH_HITRACE_SYSTRACE 1) # for other CMakeLists.txt files to use add_compile_definitions(WITH_HITRACE_SYSTRACE) # folly的编译选项 set(folly_compile_options -DFOLLY_NO_CONFIG=1 -DFOLLY_MOBILE=1 -DFOLLY_USE_LIBCPP=1 -DFOLLY_HAVE_RECVMMSG=1 -DFOLLY_HAVE_PTHREAD=1 -Wno-comma -Wno-shorten-64-to-32 -Wno-documentation -faligned-new ) add_compile_options("-Wno-unused-command-line-argument") # 添加头文件目录 include_directories(${NATIVERENDER_ROOT_PATH} ${RNOH_CPP_DIR} ${REACT_COMMON_PATCH_DIR} ${RNOH_CPP_DIR}/third-party/folly ${RNOH_CPP_DIR}/third-party/rn/ReactCommon ${RNOH_CPP_DIR}/third-party/rn/ReactCommon/react/nativemodule/core ${RNOH_CPP_DIR}/third-party/rn/ReactCommon/jsi ${RNOH_CPP_DIR}/third-party/rn/ReactCommon/callinvoker ${RNOH_CPP_DIR}/third-party/boost/libs/utility/include ${RNOH_CPP_DIR}/third-party/boost/libs/stacktrace/include ${RNOH_CPP_DIR}/third-party/boost/libs/predef/include ${RNOH_CPP_DIR}/third-party/boost/libs/array/include ${RNOH_CPP_DIR}/third-party/boost/libs/throw_exception/include ${RNOH_CPP_DIR}/third-party/boost/libs/config/include ${RNOH_CPP_DIR}/third-party/boost/libs/core/include ${RNOH_CPP_DIR}/third-party/boost/libs/preprocessor/include ${RNOH_CPP_DIR}/third-party/double-conversion ${RNOH_CPP_DIR}/third-party/rn/ReactCommon/react/renderer/graphics/platform/cxx ${RNOH_CPP_DIR}/third-party/rn/ReactCommon/runtimeexecutor ${RNOH_CPP_DIR}/third-party/glog/src ${RNOH_CPP_DIR}/third-party/boost/libs/mpl/include ${RNOH_CPP_DIR}/third-party/boost/libs/type_traits/include ${RNOH_CPP_DIR}/third-party/rn/ReactCommon/yoga ${RNOH_CPP_DIR}/third-party/boost/libs/intrusive/include ${RNOH_CPP_DIR}/third-party/boost/libs/assert/include ${RNOH_CPP_DIR}/third-party/boost/libs/move/include ${RNOH_CPP_DIR}/third-party/boost/libs/static_assert/include ${RNOH_CPP_DIR}/third-party/boost/libs/container_hash/include ${RNOH_CPP_DIR}/third-party/boost/libs/describe/include ${RNOH_CPP_DIR}/third-party/boost/libs/mp11/include ${RNOH_CPP_DIR}/third-party/boost/libs/iterator/include ${RNOH_CPP_DIR}/third-party/boost/libs/detail/include ${RNOH_CPP_DIR}/patches/react_native_core/react/renderer/textlayoutmanager/platform/harmony ) configure_file( ${RNOH_CPP_DIR}/third-party/folly/CMake/folly-config.h.cmake ${RNOH_CPP_DIR}/third-party/folly/folly/folly-config.h ) file(GLOB GENERATED_CPP_FILES "./generated/*.cpp") # 添加rnoh动态共享包 add_library(rnoh SHARED "${RNOH_CPP_DIR}/RNOHOther.cpp" "${RNOH_CPP_DIR}/third-party/folly/folly/lang/SafeAssert.cpp" ) # 链接其他so target_link_directories(rnoh PUBLIC ${OH_MODULE_DIR}/@rnoh/react-native-openharmony/libs/arm64-v8a) target_link_libraries(rnoh PUBLIC rnoh_semi libace_napi.z.so libace_ndk.z.so librawfile.z.so libhilog_ndk.z.so libnative_vsync.so libnative_drawing.so libc++_shared.so libhitrace_ndk.z.so react_render_scheduler rrc_image rrc_text rrc_textinput rrc_scrollview react_nativemodule_core react_render_animations jsinspector hermes jsi logger react_config react_debug react_render_attributedstring react_render_componentregistry react_render_core react_render_debug react_render_graphics react_render_imagemanager react_render_mapbuffer react_render_mounting react_render_templateprocessor react_render_textlayoutmanager react_render_telemetry react_render_uimanager react_utils rrc_root rrc_view react_render_leakchecker react_render_runtimescheduler runtimeexecutor ) if("$ENV{RNOH_C_API_ARCH}" STREQUAL "1") message("Experimental C-API architecture enabled") target_link_libraries(rnoh PUBLIC libqos.so) target_compile_definitions(rnoh PUBLIC C_API_ARCH) endif() # RNOH_BEGIN: add_package_subdirectories # add_subdirectory("${OH_MODULE_DIR}/@rnoh/sample-package/src/main/cpp" ./sample-package) #add_subdirectory("${RNOH_CPP_DIR}" ./rn) ## RNOH_BEGIN: manual_package_linking_1 add_subdirectory("${OH_MODULE_DIR}/@react-native-oh-tpl/react-native-svg/src/main/cpp" ./svg) # 三方包得加上folly编译配置 # target_compile_options(rnoh_sample_package PUBLIC ${folly_compile_options}) target_compile_options(rnoh_svg PUBLIC ${folly_compile_options}) # RNOH_END: add_package_subdirectories # 添加rnoh_app共享包 add_library(rnoh_app SHARED ${GENERATED_CPP_FILES} "./PackageProvider.cpp" "${RNOH_CPP_DIR}/RNOHOther.cpp" "${RNOH_CPP_DIR}/RNOHAppNapiBridge.cpp" ) target_link_libraries(rnoh_app PUBLIC rnoh) target_link_libraries(rnoh_app PUBLIC rnoh_svg) # RNOH_END: link_packages target_compile_options(rnoh_app PUBLIC ${folly_compile_options} -DRAW_PROPS_ENABLED -std=c++17) ``` 5. 在rn_oh运行 ``` npm install npm run dev ``` 6. 在DevEco Studio中打开rn_oh中的harmony工程,进行签名后同步工程后运行即可 ![](./picture/release_rnoh_03.png) **上述可以在示例工程rn_oh中操作** # 三方库字节码包打包编译 1. 新建一个新的工程 ![](./picture/01.png) 2. 在工程级build-profile.json5中添加如下配置 ![](./picture/02.png) ```json "buildOption": { "strictMode": { "useNormalizedOHMUrl": true } } ``` 3. 在工程根目录新建lib文件夹,将所依赖的release版rnoh的har包放在lib文件夹中,并在工程级oh-package.json5中添加如下配置: ![](./picture/03.png) ```json "overrides": { "@rnoh/react-native-openharmony": "file:./libs/react_native_openharmony.har" } ``` 4. 将需要生成字节包的库文件目录下harmony中的鸿蒙侧文件夹复制到生成字节包工程根目录下(以react_native-image-picker为例),并在工程级build-profile.json5中添加如下配置然后同步工程: ![](./picture/04.png) ![](./picture/05.png) 5. 在image_picker模块级build-profile.json5中添加如下配置: ![](./picture/06.png) ```json { "apiType": "stageMode", "buildOption": { }, "buildOptionSet": [ { "name": "release", "arkOptions": { "obfuscation": { "ruleOptions": { "enable": true, }, }, "byteCodeHar": true }, "externalNativeOptions": { "path": "./src/main/cpp/CMakeLists.txt" }, "nativeLib": {"headerPath": './src/main/include'} }, ], "targets": [ { "name": "default" } ] } ``` 6. 对image_picker模块级下的image_picker\src\main\cpp文件夹下的cmakelist进行配置: ![](./picture/07.png) ```cmake # the minimum version of CMake project(rn_image_picker) cmake_minimum_required(VERSION 3.13) set(CMAKE_VERBOSE_MAKEFILE on) set(CMAKE_CXX_STANDARD_REQUIRED ON) set(CMAKE_CXX_STANDARD 17) set(CMAKE_SKIP_BUILD_RPATH TRUE) # 设置模块路径 set(RNOH_GENERATED_DIR "${CMAKE_CURRENT_SOURCE_DIR}/generated") set(OH_MODULE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/../../../oh_modules") set(NATIVERENDER_ROOT_PATH "${CMAKE_CURRENT_SOURCE_DIR}") set(RNOH_CPP_DIR "${OH_MODULE_DIR}/@rnoh/react-native-openharmony/include") set(REACT_COMMON_PATCH_DIR "${RNOH_CPP_DIR}/patches/react_native_core") # 设置日志等级 set(LOG_VERBOSITY_LEVEL 1) # 汇编器和 C++ 编译器选项 set(CMAKE_ASM_FLAGS "${CMAKE_ASM_FLAGS} -Wno-error=unused-command-line-argument -Qunused-arguments") set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fstack-protector-strong -Wl,-z,relro,-z,now,-z,noexecstack -s -fPIE -DIe -DNDEBUG") # 定义源头文件目录 set(HEADER_SOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}") # 你的头文件所在目录 # 定义目标输出目录 set(HEADER_OUTPUT_DIR "${CMAKE_CURRENT_SOURCE_DIR}/../include") # 确保输出目录存在 file(MAKE_DIRECTORY ${HEADER_OUTPUT_DIR}) # 使用 GLOB_RECURSE 获取所有 .h 文件(包括子目录) file(GLOB_RECURSE HEADER_FILES RELATIVE "${HEADER_SOURCE_DIR}" "${HEADER_SOURCE_DIR}/*.h") # 遍历并复制每个头文件到目标目录,并保持其相对路径结构 foreach(HEADER_FILE ${HEADER_FILES}) get_filename_component(DIR ${HEADER_FILE} DIRECTORY) file(MAKE_DIRECTORY "${HEADER_OUTPUT_DIR}/${DIR}") configure_file( "${HEADER_SOURCE_DIR}/${HEADER_FILE}" "${HEADER_OUTPUT_DIR}/${HEADER_FILE}" COPYONLY ) endforeach() # 宏定义 add_compile_definitions(WITH_HITRACE_SYSTRACE) # folly 相关编译选项 set(folly_compile_options -DFOLLY_NO_CONFIG=1 -DFOLLY_MOBILE=1 -DFOLLY_USE_LIBCPP=1 -DFOLLY_HAVE_RECVMMSG=1 -DFOLLY_HAVE_PTHREAD=1 -Wno-comma -Wno-shorten-64-to-32 -Wno-documentation -faligned-new ) add_compile_options("-Wno-unused-command-line-argument") include_directories( ${NATIVERENDER_ROOT_PATH} ${RNOH_CPP_DIR} ${REACT_COMMON_PATCH_DIR} ${RNOH_CPP_DIR}/third-party/folly ${RNOH_CPP_DIR}/third-party/rn/ReactCommon ${RNOH_CPP_DIR}/third-party/rn/ReactCommon/react/nativemodule/core ${RNOH_CPP_DIR}/third-party/rn/ReactCommon/jsi ${RNOH_CPP_DIR}/third-party/rn/ReactCommon/callinvoker ${RNOH_CPP_DIR}/third-party/boost/libs/utility/include ${RNOH_CPP_DIR}/third-party/boost/libs/stacktrace/include ${RNOH_CPP_DIR}/third-party/boost/libs/predef/include ${RNOH_CPP_DIR}/third-party/boost/libs/array/include ${RNOH_CPP_DIR}/third-party/boost/libs/throw_exception/include ${RNOH_CPP_DIR}/third-party/boost/libs/config/include ${RNOH_CPP_DIR}/third-party/boost/libs/core/include ${RNOH_CPP_DIR}/third-party/boost/libs/preprocessor/include ${RNOH_CPP_DIR}/third-party/double-conversion ${RNOH_CPP_DIR}/third-party/rn/ReactCommon/react/renderer/graphics/platform/cxx ${RNOH_CPP_DIR}/third-party/rn/ReactCommon/runtimeexecutor ${RNOH_CPP_DIR}/third-party/glog/src ${RNOH_CPP_DIR}/third-party/boost/libs/mpl/include ${RNOH_CPP_DIR}/third-party/boost/libs/type_traits/include ${RNOH_CPP_DIR}/third-party/rn/ReactCommon/yoga ${RNOH_CPP_DIR}/third-party/boost/libs/intrusive/include ${RNOH_CPP_DIR}/third-party/boost/libs/assert/include ${RNOH_CPP_DIR}/third-party/boost/libs/move/include ${RNOH_CPP_DIR}/third-party/boost/libs/static_assert/include ${RNOH_CPP_DIR}/third-party/boost/libs/container_hash/include ${RNOH_CPP_DIR}/third-party/boost/libs/describe/include ${RNOH_CPP_DIR}/third-party/boost/libs/mp11/include ${RNOH_CPP_DIR}/third-party/boost/libs/iterator/include ${RNOH_CPP_DIR}/third-party/boost/libs/detail/include ${RNOH_CPP_DIR}/patches/react_native_core/react/renderer/textlayoutmanager/platform/harmony ${RNOH_CPP_DIR}/third-party/hermes/public ${RNOH_CPP_DIR}/third-party/hermes/API ) # 配置 folly 的头文件 configure_file( ${RNOH_CPP_DIR}/third-party/folly/CMake/folly-config.h.cmake ${RNOH_CPP_DIR}/third-party/folly/folly/folly-config.h ) file(GLOB_RECURSE rn_image_picker_SRC "${CMAKE_CURRENT_SOURCE_DIR}/*.cpp" "${RNOH_GENERATED_DIR}/**/*.cpp" ) add_library(rn_image_picker SHARED ${rn_image_picker_SRC} "${RNOH_CPP_DIR}/RNOHOther.cpp" "${RNOH_CPP_DIR}/third-party/folly/folly/lang/SafeAssert.cpp" ) # 导入 rnoh 所需的原生库目录 target_link_directories(rn_image_picker PUBLIC ${OH_MODULE_DIR}/@rnoh/react-native-openharmony/libs/arm64-v8a ) # 链接所需的原生和 React Native 模块库 target_link_libraries(rn_image_picker PUBLIC rnoh_semi libc++_shared.so libace_napi.z.so libace_ndk.z.so librawfile.z.so libhilog_ndk.z.so libnative_vsync.so libnative_drawing.so libhitrace_ndk.z.so # React Native 模块 hermes jsi jsinspector logger runtimeexecutor # React Core 系列库 react_config react_debug react_utils # NativeModule 核心 react_nativemodule_core # Render 系列 react_render_scheduler react_render_core react_render_debug react_render_graphics react_render_telemetry react_render_animations react_render_mounting react_render_textlayoutmanager react_render_templateprocessor react_render_componentregistry react_render_attributedstring react_render_imagemanager react_render_leakchecker react_render_runtimescheduler react_render_mapbuffer # RRC(Render React Component) rrc_root rrc_view rrc_text rrc_textinput rrc_image rrc_scrollview ) target_include_directories(rn_image_picker PUBLIC ${CMAKE_CURRENT_SOURCE_DIR} ${RNOH_GENERATED_DIR} ) #target_link_libraries(rn_image_picker PUBLIC rnoh) target_compile_options(rn_image_picker PUBLIC ${folly_compile_options} -DRAW_PROPS_ENABLED -std=c++17 ) ``` 以上为image_picker的CMakeLists.txt配置,如需对其他库进行打字节包,搜索rn_image_picker替换为新库的即可 7. 按照下图对项目进行配置后点击Build,然后选择Make Module即可对该库进行字节release包打包 ![](./picture/08.png) ![](./picture/09.png) ![](./picture/10.png) **上述操作可以在实例工程byte_release_tutorial尝试** # 三方库字节码包集成到应用 1. 按照三方库使用教程进行配置后,需要修改的地方为应用的CMakelist.txt,此处以react-native-image-picker为例: ```cmake project(rnapp) cmake_minimum_required(VERSION 3.4.1) set(CMAKE_SKIP_BUILD_RPATH TRUE) set(NATIVERENDER_ROOT_PATH "${CMAKE_CURRENT_SOURCE_DIR}") set(OH_MODULE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/../../../oh_modules") set(RNOH_CPP_DIR "${OH_MODULE_DIR}/@rnoh/react-native-openharmony/include") set(REACT_COMMON_PATCH_DIR "${RNOH_CPP_DIR}/patches/react_native_core") set(CMAKE_CXX_STANDARD 17) set(LOG_VERBOSITY_LEVEL 1) set(CMAKE_ASM_FLAGS "-Wno-error=unused-command-line-argument -Qunused-arguments") set(RNOH_GENERATED_DIR "${CMAKE_CURRENT_SOURCE_DIR}/generated") set(CMAKE_CXX_FLAGS "-fstack-protector-strong -Wl,-z,relro,-z,now,-z,noexecstack -s -fPIE -pie -DNDEBUG") set(WITH_HITRACE_SYSTRACE 1) # for other CMakeLists.txt files to use add_compile_definitions(WITH_HITRACE_SYSTRACE) # folly的编译选项 set(folly_compile_options -DFOLLY_NO_CONFIG=1 -DFOLLY_MOBILE=1 -DFOLLY_USE_LIBCPP=1 -DFOLLY_HAVE_RECVMMSG=1 -DFOLLY_HAVE_PTHREAD=1 -Wno-comma -Wno-shorten-64-to-32 -Wno-documentation -faligned-new ) add_compile_options("-Wno-unused-command-line-argument") # 添加头文件目录 include_directories(${NATIVERENDER_ROOT_PATH} ${RNOH_CPP_DIR} ${REACT_COMMON_PATCH_DIR} ${RNOH_CPP_DIR}/third-party/folly ${RNOH_CPP_DIR}/third-party/rn/ReactCommon ${RNOH_CPP_DIR}/third-party/rn/ReactCommon/react/nativemodule/core ${RNOH_CPP_DIR}/third-party/rn/ReactCommon/jsi ${RNOH_CPP_DIR}/third-party/rn/ReactCommon/callinvoker ${RNOH_CPP_DIR}/third-party/boost/libs/utility/include ${RNOH_CPP_DIR}/third-party/boost/libs/stacktrace/include ${RNOH_CPP_DIR}/third-party/boost/libs/predef/include ${RNOH_CPP_DIR}/third-party/boost/libs/array/include ${RNOH_CPP_DIR}/third-party/boost/libs/throw_exception/include ${RNOH_CPP_DIR}/third-party/boost/libs/config/include ${RNOH_CPP_DIR}/third-party/boost/libs/core/include ${RNOH_CPP_DIR}/third-party/boost/libs/preprocessor/include ${RNOH_CPP_DIR}/third-party/double-conversion ${RNOH_CPP_DIR}/third-party/rn/ReactCommon/react/renderer/graphics/platform/cxx ${RNOH_CPP_DIR}/third-party/rn/ReactCommon/runtimeexecutor ${RNOH_CPP_DIR}/third-party/glog/src ${RNOH_CPP_DIR}/third-party/boost/libs/mpl/include ${RNOH_CPP_DIR}/third-party/boost/libs/type_traits/include ${RNOH_CPP_DIR}/third-party/rn/ReactCommon/yoga ${RNOH_CPP_DIR}/third-party/boost/libs/intrusive/include ${RNOH_CPP_DIR}/third-party/boost/libs/assert/include ${RNOH_CPP_DIR}/third-party/boost/libs/move/include ${RNOH_CPP_DIR}/third-party/boost/libs/static_assert/include ${RNOH_CPP_DIR}/third-party/boost/libs/container_hash/include ${RNOH_CPP_DIR}/third-party/boost/libs/describe/include ${RNOH_CPP_DIR}/third-party/boost/libs/mp11/include ${RNOH_CPP_DIR}/third-party/boost/libs/iterator/include ${RNOH_CPP_DIR}/third-party/boost/libs/detail/include ${RNOH_CPP_DIR}/patches/react_native_core/react/renderer/textlayoutmanager/platform/harmony + ${OH_MODULE_DIR}/@tuya-oh/react-native-image-picker/include ) configure_file( ${RNOH_CPP_DIR}/third-party/folly/CMake/folly-config.h.cmake ${RNOH_CPP_DIR}/third-party/folly/folly/folly-config.h ) file(GLOB GENERATED_CPP_FILES "./generated/*.cpp") # 添加rnoh动态共享包 add_library(rnoh SHARED "${RNOH_CPP_DIR}/RNOHOther.cpp" "${RNOH_CPP_DIR}/third-party/folly/folly/lang/SafeAssert.cpp" ) # 链接其他so target_link_directories(rnoh PUBLIC ${OH_MODULE_DIR}/@rnoh/react-native-openharmony/libs/arm64-v8a) + target_link_directories(rnoh PUBLIC ${OH_MODULE_DIR}/@tuya-oh/react-native-image-picker/libs/arm64-v8a) target_link_libraries(rnoh PUBLIC rnoh_semi libace_napi.z.so libace_ndk.z.so librawfile.z.so libhilog_ndk.z.so libnative_vsync.so libnative_drawing.so libc++_shared.so libhitrace_ndk.z.so react_render_scheduler rrc_image rrc_text rrc_textinput rrc_scrollview react_nativemodule_core react_render_animations jsinspector hermes jsi logger react_config react_debug react_render_attributedstring react_render_componentregistry react_render_core react_render_debug react_render_graphics react_render_imagemanager react_render_mapbuffer react_render_mounting react_render_templateprocessor react_render_textlayoutmanager react_render_telemetry react_render_uimanager react_utils rrc_root rrc_view react_render_leakchecker react_render_runtimescheduler runtimeexecutor + rn_image_picker ) if("$ENV{RNOH_C_API_ARCH}" STREQUAL "1") message("Experimental C-API architecture enabled") target_link_libraries(rnoh PUBLIC libqos.so) target_compile_definitions(rnoh PUBLIC C_API_ARCH) endif() # RNOH_BEGIN: add_package_subdirectories # add_subdirectory("${OH_MODULE_DIR}/@rnoh/sample-package/src/main/cpp" ./sample-package) #add_subdirectory("${RNOH_CPP_DIR}" ./rn) ## RNOH_BEGIN: manual_package_linking_1 add_subdirectory("${OH_MODULE_DIR}/@react-native-oh-tpl/react-native-svg/src/main/cpp" ./svg) # 三方包得加上folly编译配置 # target_compile_options(rnoh_sample_package PUBLIC ${folly_compile_options}) target_compile_options(rnoh_svg PUBLIC ${folly_compile_options}) # RNOH_END: add_package_subdirectories # 添加rnoh_app共享包 add_library(rnoh_app SHARED ${GENERATED_CPP_FILES} "./PackageProvider.cpp" "${RNOH_CPP_DIR}/RNOHOther.cpp" "${RNOH_CPP_DIR}/RNOHAppNapiBridge.cpp" ) target_link_libraries(rnoh_app PUBLIC rnoh) target_link_libraries(rnoh_app PUBLIC rnoh_svg) # RNOH_END: link_packages target_compile_options(rnoh_app PUBLIC ${folly_compile_options} -DRAW_PROPS_ENABLED -std=c++17) ``` ### TIP:因为字节包会包含部分字节配置通用文件,一般三方库会导致包体积变大,可以在打包的三方库build-profile.json5中添加配置: ![](./picture/007.png) ``` "nativeLib": { "headerPath": [ "./src/main/include" ], "filter": { "excludes": ["**/libc++_shared.so"] } } ```