react_native笔记

2025/05/03

Tags: react native c++

Table of Contents

qt qml 中 可以把 c++对象注入 qml engine

reac native 自从收编 nitro 之后,也获得了这种能力

我已经用qt qml 在windows/linux/mac / embed linux中写gui, 但对于android和ios 一直没有实践

1是确实没有什么项目, 2是lgpl 和商城规则或多或少存在争议

所以在知道react native也可以这么说后,我打算开始玩一玩, 尝试把我自己写的c++ 静态反射库应用于其中

于是有此笔记,将和往常一样不定时整理更新

1 配置sdk版本,及兼容的最低版本

1.1 IOS

1.1.1 SDK版本选择

sdk向下兼容是有限制的,所以想开发兼容很旧的ios系统的程序,只能下载旧的xcode版本开发,且开发后上不了架,并且ios系统不一定能运行旧版本的xcode, 想开发不上架的ios app,有可能需要装虚拟机,安装旧的系统,再安装旧的xcode,再开发

xcode 版本支持的sdk版本支持参考这里

因为apple store要求sdk需要使用较新版本,所以想上架的话, 最好在apple store安装最新的xcode,更新最新的sdk

apple store 安装完的xcode 第一次打开时可能有弹出一个选择安装sdk的版本,如果有的话把ios sdk 打钩安装

下载的xcode.xip解压的好像没有这个弹窗 ,有的话也是把ios sdk打钩安装(这试了几次都没有)

选择了xcode就等于选择了sdk 版本了,想改只能切换xcode版本

附上一些在命令行中切换 xcode和sdk版本的方法

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#选择xcode
xcode-select -p
sudo xcode-select --switch /Applications/Xcode.app/Contents/Developer
xcodebuild -showsdks

#查看可用sdk
xcodebuild -showsdks
ls `xcode-select -p`/Platforms/MacOSX.platform/Developer/SDKs/

#查看当前sdk
  xcrun --show-sdk-path 
xcrun --sdk macosx --show-sdk-version



#临时配置sdk
export SDKROOT=`xcode-select -p`/Platforms/MacOSX.platform/Developer/SDKs/MacOSX13.3.sdk

#编译时配置sdk
cd build && xcodebuild -sdk macosx13.3
#or
#cmake 
cmake .. -DCMAKE_OSX_SYSROOT=`xcode-select -p`/Platforms/MacOSX.platform/Developer/SDKs/MacOSX13.3.sdk

#GN
gn gen out/Default --args='mac_sdk_path="`xcode-select -p`/Platforms/MacOSX.platform/Developer/SDKs/MacOSX13.3.sdk"'

1.1.2 向下兼容至何种版本

向下兼容至何种版本,则需要开发者指定, 且只能在xcode 支持的版本范围中选 择参考这里

有几个位置需要修改 ,以xcode 16为例,它支持 ios 16.0 - 18.2的开发, 我想兼容到16.0

…/react_active_src/ios/Podfile中的

1
platform :ios, 16.0 #安装哪种sdk的依赖库

如果已经安装过pods了,需要删除一下,重新安装 删除Podfile.lock ,还有pods目录,重新安装依赖

1
2
3
rm -rf .../react_active_src/ios/pods
rm .../react_active_src/ios/Podfile.lock
cd .../react_active_src/ios/ && pod install 

xcode打开工程设置

image-20250503144615711

如果是真机,直接选择,不用安装simulator, 如果是simulator, 提交安装想兼容的最低版本 , 最新版本的simualtor也需要安装,否则选择不了其他低版本的simulator , 图上图我选中iPhone 14 pro,但安装了simualtor 16.0和 18.2才可以选择16.0

general 页设置minimum deployments

image-20250503142804878

build setting

image-20250503142738319

显示为灰色的ios 18.2是目前的xcode最新的sdk, 不管选中的minimum deployments是什么版本, 都是用最新的sdk编译的

1.2 Andorid

react native 版本影响 JDK版本, 和 Gradle 包管理器的版本 , 它们只是参与了工程构建,不影响app 上架, 根据具体使用的react native版本按需要选择

1.2.1 SDK版本选择

指定版本需要修改

…/react_active_src/android/build.gradle

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
buildscript {
  //额外属性 extra
    ext {
        buildToolsVersion = "35.0.0"
        minSdkVersion = 24
        compileSdkVersion = 35
        targetSdkVersion = 35
        ndkVersion = "27.1.12297006"
        kotlinVersion = "2.0.21"
    }
  //源
    repositories {  
        google()
        mavenCentral()
    }
  //依赖
    dependencies {
        classpath("com.android.tools.build:gradle")
        classpath("com.facebook.react:react-native-gradle-plugin")
        classpath("org.jetbrains.kotlin:kotlin-gradle-plugin")
    }
}

apply plugin: "com.facebook.react.rootproject"

不同的目录层级可能会有多个build.gradle, 但版本相关的设置都会引用根目录的build.gradle中ext中指定的版本

1
2
3
4
5
6
7
8
9
AwesomeProject/android on  main [!?] via 🅶 v8.13 via ☕ v17.0.15 took 17m22s
❯ grep -irn "rootproject" .
./app/build.gradle:76:    ndkVersion rootProject.ext.ndkVersion
./app/build.gradle:77:    buildToolsVersion rootProject.ext.buildToolsVersion
./app/build.gradle:78:    compileSdk rootProject.ext.compileSdkVersion
./app/build.gradle:83:        minSdkVersion rootProject.ext.minSdkVersion
./app/build.gradle:84:        targetSdkVersion rootProject.ext.targetSdkVersion
./build.gradle:21:apply plugin: "com.facebook.react.rootproject"
./settings.gradle:4:rootProject.name = 'AwesomeProject'

和ios一样, 如果想上架的话,google play也sdk版本有要求

1.2.1 向下兼容至何种版本

andorid 版本, sdk版本, ndk版本, 搭配大致可以参照下表

compileSdkVersion Android API 推荐 NDK 版本 支持的 NDK 功能 支持的架构
34 Android 14 r26 ~ r27b 64位架构,arm64-v8a,逐渐放弃旧架构 arm64-v8a, armeabi-v7a, x86_64
33 Android 13 r23b ~ r26b 优化的性能、稳定性支持,支持 Android 12 及以上 arm64-v8a, armeabi-v7a, x86_64
32 Android 12L r22b ~ r25c 支持 Android 12,API 30,逐渐加入新的功能 arm64-v8a, armeabi-v7a, x86_64
31 Android 12 r21e ~ r23b 启用 64 位架构支持,NDK 特性基本稳定 arm64-v8a, armeabi-v7a
30 Android 11 r20b ~ r22b 完全支持 arm64-v8a, armeabi-v7a,向下兼容 arm64-v8a, armeabi-v7a
29 Android 10 r19c ~ r21b 默认支持 armeabi-v7a, arm64-v8a, 32 位/64 位 armeabi-v7a, arm64-v8a
28 Android 9 r18b ~ r20b 启动 64 位架构支持,目标为 armeabi-v7a armeabi-v7a
27 以下 Android 8.x r17b ~ r19b 不支持新的架构,只支持 armeabi-v7a armeabi-v7a

截止2025年5月3日 , react native 0.79.2 的模板版本配置为

1
2
3
4
5
6
        buildToolsVersion = "35.0.0"
        minSdkVersion = 24
        compileSdkVersion = 35
        targetSdkVersion = 35
        ndkVersion = "27.1.12297006"
        kotlinVersion = "2.0.21"

如果不考虑ndk的话,这个版本已经覆盖市场上95%的手机了, 建议开发新的app就用这个配置

而使用24的ndk版本,则说明 使用android 12以下的系统api有不兼容的风险,尽量避免不稳定的api 的使用即可

由于我主要使用c++ 和 react native进行开发,所以kotlin版本我比较不在意,暂时不探索

>> Home

Comments