@flun/node-mobile-app 4.0.6 → 4.0.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/Android /346/236/204/345/273/272/346/214/207/345/215/227.md" +84 -76
- package/CHANGELOG.md +10 -8
- package/LICENSE +9 -4
- package/README.md +170 -77
- package/bin/cli.js +9 -9
- package/cli-assets/server.js +7 -4
- package/mobileAppConfig.js +32 -32
- package/package.json +5 -5
- package/scripts/copy-files.js +1 -1
- package/src/commands/build.js +9 -4
- package/src/commands/clean.js +3 -2
- package/src/commands/test.js +13 -9
- package/src/config.js +3 -3
- package/src/copy.js +41 -36
- package/src/fingerprint.js +4 -3
- package/src/generate.js +5 -3
- package/src/install.js +38 -27
- package/src/optimize-node-modules.js +10 -5
- package/src/patcher.js +37 -32
- package/src/platform-ios.js +6 -6
- package/src/utils.js +26 -22
- package/template/App.tsx +4 -4
- package/template/Gemfile +1 -1
- package/template/android/app/build.gradle +1 -1
- package/template/android/app/proguard-rules.pro +1 -1
- package/template/android/app/src/main/java/com/myapp/MainActivity.kt +1 -1
- package/template/android/app/src/main/java/com/myapp/MainApplication.kt +1 -1
- package/template/android/app/src/main/res/drawable/rn_edit_text_material.xml +6 -3
- package/template/android/app/src/main/res/raw/keep.xml +1 -1
- package/template/android/app/src/main/res/values/strings.xml +1 -1
- package/template/android/app/src/main/res/values/styles.xml +1 -1
- package/template/android/build.gradle +1 -1
- package/template/android/gradle.properties +1 -1
- package/template/android/gradlew +3 -2
- package/template/android/gradlew.bat +3 -2
- package/template/android/settings.gradle +1 -1
- package/template/app.json +1 -1
- package/template/index.js +2 -2
- package/template/ios/.xcode.env +1 -1
- package/template/ios/MyApp/Images.xcassets/AppIcon.appiconset/Contents.json +1 -1
- package/template/ios/MyApp/Images.xcassets/Contents.json +1 -1
- package/template/ios/MyApp/Info.plist +1 -1
- package/template/ios/MyApp/LaunchScreen.storyboard +30 -12
- package/template/ios/MyApp/PrivacyInfo.xcprivacy +1 -1
- package/template/ios/MyApp.xcodeproj/project.pbxproj +34 -15
- package/template/ios/MyApp.xcodeproj/xcshareddata/xcschemes/MyApp.xcscheme +1 -1
- package/template/ios/Podfile +1 -1
- package/template/package.json +1 -1
- package//350/207/252/345/256/232/344/271/211libnode/346/214/207/345/215/227.md +131 -98
|
@@ -1,21 +1,23 @@
|
|
|
1
|
-
# 自定义 libnode.so
|
|
1
|
+
# 自定义 libnode.so 指南(Android)
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
本文档讲两件事:
|
|
4
4
|
|
|
5
|
-
1.
|
|
6
|
-
2.
|
|
5
|
+
1. **用预编译产物**(推荐,90% 用户)-- 从仓库下载 `android-libnode.zip`,替换,跑 CLI,完事
|
|
6
|
+
2. **自己编译**(进阶)-- 用 WSL + NDK 从源码编译带 full-icu 的 v22+
|
|
7
7
|
|
|
8
|
-
**使用 `@flun/node-mobile-app`
|
|
8
|
+
**使用 `@flun/node-mobile-app` 时不需要看这份文档就能打包**--CLI 会自动处理 ABI 配置、缓存清理、原生模块编译;
|
|
9
|
+
本文档只在**要换 libnode.so** 时才需要;
|
|
9
10
|
|
|
10
11
|
---
|
|
11
12
|
|
|
12
13
|
## 一、自定义 libnode.so
|
|
13
14
|
|
|
14
|
-
`@flun/node-mobile-app` 的 Node.js 运行时由 `@flun/nodejs-mobile-react-native` 提供的 `libnode.so` 决定;下载版本以该包
|
|
15
|
+
`@flun/node-mobile-app` 的 Node.js 运行时由 `@flun/nodejs-mobile-react-native` 提供的 `libnode.so` 决定;下载版本以该包
|
|
16
|
+
`package.json` 的 `prebuiltAssets.version` 字段为准,运行时版本与之一致;不同版本的产物在 ICU 支持上有差异:
|
|
15
17
|
|
|
16
18
|
| 限制 | 影响 |
|
|
17
19
|
| ------------------------------ | ------------------------------------------------------- |
|
|
18
|
-
| `--with-intl=none
|
|
20
|
+
| `--with-intl=none`(不带 ICU) | 不能用 `\p{...}` / `\P{...}` Unicode 正则 |
|
|
19
21
|
| 无法用 Express 5 | `path-to-regexp@8` 内部用 `\p{ID_Start}`,v18 加载时崩溃 |
|
|
20
22
|
| 停更 | 官方不再更新 |
|
|
21
23
|
|
|
@@ -23,58 +25,62 @@
|
|
|
23
25
|
|
|
24
26
|
---
|
|
25
27
|
|
|
26
|
-
##
|
|
28
|
+
## 二、用预编译产物(推荐)
|
|
27
29
|
|
|
28
|
-
> **注意**:从 `@flun/nodejs-mobile-react-native` 1.0.1 起,Android 的 `libnode.so` 由 postinstall 脚本从 Release
|
|
30
|
+
> **注意**:从 `@flun/nodejs-mobile-react-native` 1.0.1 起,Android 的 `libnode.so` 由 postinstall 脚本从 Release 自动下载;
|
|
31
|
+
版本以该包 `package.json` 的 `prebuiltAssets.version` 字段为准;
|
|
29
32
|
> **本节适用于**:自动下载的产物为 v22 以下(不带 full-icu),且需跑 Express 5 或使用 Unicode 正则,要换成 v22+ 自编译版本;
|
|
30
33
|
> 若产物为 v22 及以上(带 full-icu),你**不需要**看本节--装包后 `libnode.so` 已就位;
|
|
31
34
|
|
|
32
35
|
|
|
33
36
|
### 2.1 下载地址
|
|
34
37
|
|
|
35
|
-
|
|
38
|
+
**下载版本**:见 Releases 页面,按需选择;版本号以页面中的 tag 为准,不在文档中固定;
|
|
36
39
|
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
40
|
+
- GitHub
|
|
41
|
+
- 源码仓库:[OpenFlun/nodejs-mobile](https://github.com/OpenFlun/nodejs-mobile)
|
|
42
|
+
- Release 页面:[Releases](https://github.com/OpenFlun/nodejs-mobile/releases)
|
|
43
|
+
- Gitee(国内)
|
|
44
|
+
- 源码仓库:[OpenFlun/nodejs-mobile](https://gitee.com/OpenFlun/nodejs-mobile)
|
|
45
|
+
- Release 页面:[Releases](https://gitee.com/OpenFlun/nodejs-mobile/releases)
|
|
41
46
|
|
|
42
|
-
|
|
47
|
+
**文件名说明**:发布名为 `android-libnode.zip`(带 `android-` 前缀),为未来 iOS 等平台扩展预留接口(如
|
|
48
|
+
`ios-libnode.zip`);**内容仍是标准的 `libnode/` 目录**(`bin/` + `include/`);
|
|
43
49
|
|
|
44
50
|
### 2.2 支持矩阵
|
|
45
51
|
|
|
46
52
|
| 架构 | v18 | v22 |
|
|
47
53
|
| ---------------------------- | ------ | -------- |
|
|
48
|
-
| **arm64-v8a
|
|
49
|
-
| **x86_64
|
|
50
|
-
| **armeabi-v7a
|
|
54
|
+
| **arm64-v8a**(真机) | ✓ 官方 | ✓ 预编译 |
|
|
55
|
+
| **x86_64**(模拟器) | ✓ 官方 | ✓ 预编译 |
|
|
56
|
+
| **armeabi-v7a**(32 位 ARM) | ✓ 官方 | ✗ |
|
|
51
57
|
|
|
52
|
-
|
|
53
|
-
-
|
|
58
|
+
**下载入口**:
|
|
59
|
+
- 双架构(推荐):`android-libnode.zip`(约 88 MB,具体以实际产物为准)
|
|
54
60
|
- 单架构 zip 已废弃,不再发布
|
|
55
61
|
|
|
56
|
-
**armeabi-v7a
|
|
62
|
+
**armeabi-v7a 为什么放弃**:V8 v22 在 x64 主机上无法交叉编译 32 位 ARM 目标(详见 5.1);
|
|
57
63
|
|
|
58
64
|
### 2.3 下载与替换
|
|
59
65
|
|
|
60
|
-
|
|
66
|
+
**解压后的结构**:
|
|
61
67
|
|
|
62
68
|
```
|
|
63
69
|
libnode/
|
|
64
70
|
├── bin/
|
|
65
|
-
│ ├── arm64-v8a/libnode.so #
|
|
66
|
-
│ └── x86_64/libnode.so #
|
|
71
|
+
│ ├── arm64-v8a/libnode.so # 真机(约 113 MB)
|
|
72
|
+
│ └── x86_64/libnode.so # 模拟器(约 118 MB)
|
|
67
73
|
└── include/
|
|
68
|
-
└── node/ # 官方 v22 headers
|
|
74
|
+
└── node/ # 官方 v22 headers(含 ABI 适配)
|
|
69
75
|
```
|
|
70
76
|
|
|
71
|
-
|
|
77
|
+
**替换到你的项目**:
|
|
72
78
|
|
|
73
79
|
```bash
|
|
74
80
|
# 进入插件的 android 目录
|
|
75
81
|
cd <你的项目>/node_modules/@flun/nodejs-mobile-react-native/android
|
|
76
82
|
|
|
77
|
-
#
|
|
83
|
+
# 备份原产物(可选,方便回退)
|
|
78
84
|
cp -r libnode libnode.bak
|
|
79
85
|
|
|
80
86
|
# 整体替换
|
|
@@ -83,7 +89,7 @@ unzip /path/to/android-libnode.zip -d /tmp
|
|
|
83
89
|
mv /tmp/libnode ./libnode
|
|
84
90
|
```
|
|
85
91
|
|
|
86
|
-
**Windows 下用 PowerShell
|
|
92
|
+
**Windows 下用 PowerShell**:
|
|
87
93
|
|
|
88
94
|
```powershell
|
|
89
95
|
$plugin = '<你的项目>\node_modules\@flun\nodejs-mobile-react-native\android'
|
|
@@ -99,7 +105,7 @@ Move-Item "$env:TEMP\libnode-new\libnode" "$plugin\libnode"
|
|
|
99
105
|
|
|
100
106
|
### 2.4 调整 ABI 配置
|
|
101
107
|
|
|
102
|
-
**如果下载的 `android-libnode.zip`
|
|
108
|
+
**如果下载的 `android-libnode.zip` 只含一个架构**(比如只编了 arm64-v8a),在 `mobileAppConfig.js` 里同步:
|
|
103
109
|
|
|
104
110
|
```js
|
|
105
111
|
android: {
|
|
@@ -107,7 +113,7 @@ android: {
|
|
|
107
113
|
}
|
|
108
114
|
```
|
|
109
115
|
|
|
110
|
-
|
|
116
|
+
**如果双架构**(arm64-v8a + x86_64,当前预编译产物即为双架构):
|
|
111
117
|
|
|
112
118
|
```js
|
|
113
119
|
android: {
|
|
@@ -115,7 +121,7 @@ android: {
|
|
|
115
121
|
}
|
|
116
122
|
```
|
|
117
123
|
|
|
118
|
-
### 2.5 跑 CLI
|
|
124
|
+
### 2.5 跑 CLI(自动完成所有适配)
|
|
119
125
|
|
|
120
126
|
```bash
|
|
121
127
|
npx node-mobile-app test # 开发调试
|
|
@@ -123,7 +129,7 @@ npx node-mobile-app test # 开发调试
|
|
|
123
129
|
npx node-mobile-app build # 打包 APK
|
|
124
130
|
```
|
|
125
131
|
|
|
126
|
-
**CLI
|
|
132
|
+
**CLI 会自动**:
|
|
127
133
|
|
|
128
134
|
| CLI 动作 | 说明 |
|
|
129
135
|
| --------------------------------------------------------------- | ---------------------------- |
|
|
@@ -132,17 +138,19 @@ npx node-mobile-app build # 打包 APK
|
|
|
132
138
|
| Patch `app/build.gradle` 的 `ndk.abiFilters` | 用 `mobileAppConfig.js` 的值 |
|
|
133
139
|
| Patch `android/gradle.properties` 的 `reactNativeArchitectures` | 同步 ABI 列表 |
|
|
134
140
|
| Patch 插件 `build.gradle` 的 `abiFilters` | 让插件只编指定架构 |
|
|
135
|
-
|
|
|
141
|
+
| 重编原生模块(自动检测 `binding.gyp`) | 见 2.6 |
|
|
136
142
|
|
|
137
143
|
**你不需要手动清任何缓存;**
|
|
138
144
|
|
|
139
|
-
### 2.6
|
|
145
|
+
### 2.6 重编原生模块(仅当项目含原生模块)
|
|
140
146
|
|
|
141
|
-
不同 Node 主版本的 `NODE_MODULE_VERSION` 不同(如 v18 为 108,v22 为 127);**如果项目里装了带 C++ 代码的 npm 包**(如
|
|
147
|
+
不同 Node 主版本的 `NODE_MODULE_VERSION` 不同(如 v18 为 108,v22 为 127);**如果项目里装了带 C++ 代码的 npm 包**(如
|
|
148
|
+
`bcrypt`、`sqlite3`、`sharp`),替换为不同主版本的 `libnode.so` 后,原生模块需重编才能兼容;
|
|
142
149
|
|
|
143
|
-
|
|
150
|
+
**默认自动处理**:CLI 会扫描 `nodejs-project/node_modules` 下的 `binding.gyp` 判断是否有原生模块,
|
|
151
|
+
自动决定是否重编,**无需配置**;
|
|
144
152
|
|
|
145
|
-
|
|
153
|
+
**手动强制重编**(特殊场景:换过 `libnode.so` 但依赖没变,检测机制未触发):
|
|
146
154
|
|
|
147
155
|
```bash
|
|
148
156
|
# Linux / macOS
|
|
@@ -154,15 +162,15 @@ NODE_MOBILE_FORCE_REBUILD=1 npx node-mobile-app test
|
|
|
154
162
|
$env:NODE_MOBILE_FORCE_REBUILD=1; npx node-mobile-app test
|
|
155
163
|
```
|
|
156
164
|
|
|
157
|
-
|
|
165
|
+
**没有原生模块(纯 JS 依赖)**:无需关心,检测会自动跳过;
|
|
158
166
|
|
|
159
|
-
|
|
167
|
+
**切换架构(arm64 ↔ x86_64)**:不需要重编;JS 依赖跨架构,只有少数原生模块分架构;
|
|
160
168
|
|
|
161
|
-
**Windows
|
|
169
|
+
**Windows 限制**:Windows 上 nodejs-mobile 无法编译原生模块(上游限制);此功能仅 Linux / macOS 可用;
|
|
162
170
|
|
|
163
171
|
### 2.7 验证
|
|
164
172
|
|
|
165
|
-
**看 Node
|
|
173
|
+
**看 Node 版本**:
|
|
166
174
|
|
|
167
175
|
```powershell
|
|
168
176
|
$adb = "$env:LOCALAPPDATA\Android\Sdk\platform-tools\adb.exe"
|
|
@@ -173,14 +181,14 @@ Start-Sleep -Seconds 5
|
|
|
173
181
|
& $adb logcat -d | Select-String 'NODEJS-MOBILE'
|
|
174
182
|
```
|
|
175
183
|
|
|
176
|
-
|
|
184
|
+
**预期**:
|
|
177
185
|
|
|
178
186
|
```
|
|
179
187
|
D nativeloader: Load ... libnodejs-mobile-react-native-native-lib.so ... : ok
|
|
180
188
|
<I NODEJS-MOBILE: Node.js vX.Y.Z>
|
|
181
189
|
```
|
|
182
190
|
|
|
183
|
-
**验证 full-icu
|
|
191
|
+
**验证 full-icu**:临时在 `server.js` 顶部加:
|
|
184
192
|
|
|
185
193
|
```js
|
|
186
194
|
try {
|
|
@@ -191,7 +199,7 @@ try {
|
|
|
191
199
|
}
|
|
192
200
|
```
|
|
193
201
|
|
|
194
|
-
|
|
202
|
+
抓日志:
|
|
195
203
|
|
|
196
204
|
```powershell
|
|
197
205
|
& $adb logcat -c
|
|
@@ -200,7 +208,7 @@ Start-Sleep -Seconds 5
|
|
|
200
208
|
& $adb logcat -d | Select-String 'ICU check'
|
|
201
209
|
```
|
|
202
210
|
|
|
203
|
-
|
|
211
|
+
预期:`I NODEJS-MOBILE: === ICU check: \p{ID_Start} OK`
|
|
204
212
|
|
|
205
213
|
若显示 `ICU check failed` → `libnode.so` 不带 full-icu → 见第三章自己编,或回退到 Express 4;
|
|
206
214
|
|
|
@@ -208,12 +216,12 @@ Start-Sleep -Seconds 5
|
|
|
208
216
|
|
|
209
217
|
## 三、自己编译 libnode.so
|
|
210
218
|
|
|
211
|
-
|
|
219
|
+
**环境要求**:WSL(或 Linux),因为构建脚本依赖 `make` / `sed` / NDK;
|
|
212
220
|
|
|
213
221
|
### 3.1 准备源码与 NDK
|
|
214
222
|
|
|
215
223
|
```bash
|
|
216
|
-
#
|
|
224
|
+
# 克隆源码(国内推荐 Gitee)
|
|
217
225
|
git clone https://gitee.com/OpenFlun/nodejs-mobile.git
|
|
218
226
|
cd nodejs-mobile
|
|
219
227
|
|
|
@@ -223,7 +231,7 @@ wget https://dl.google.com/android/repository/android-ndk-r27-linux.zip
|
|
|
223
231
|
unzip android-ndk-r27-linux.zip
|
|
224
232
|
```
|
|
225
233
|
|
|
226
|
-
### 3.2
|
|
234
|
+
### 3.2 关键:启用 full-icu
|
|
227
235
|
|
|
228
236
|
**默认 `--with-intl=none`,必须改成 `full-icu`**,否则 Express 5 跑不了;
|
|
229
237
|
|
|
@@ -254,7 +262,7 @@ rm -rf out config.gypi config.mk config.status
|
|
|
254
262
|
./android-configure $NDK 30 arm64
|
|
255
263
|
make -j4
|
|
256
264
|
|
|
257
|
-
#
|
|
265
|
+
# 剥离符号(必须,否则 .so 会大很多)
|
|
258
266
|
cp out/Release/libnode.so out/Release/libnode.so.bak
|
|
259
267
|
$STRIP out/Release/libnode.so
|
|
260
268
|
|
|
@@ -265,12 +273,12 @@ diff <(nm -D out/Release/libnode.so.bak | awk '{print $2, $3}' | sort) \
|
|
|
265
273
|
|
|
266
274
|
# 验证 full-icu
|
|
267
275
|
strings out/Release/libnode.so | grep -c "icudt78l"
|
|
268
|
-
#
|
|
276
|
+
# 应输出几千(约 4300),否则没编进 ICU
|
|
269
277
|
```
|
|
270
278
|
|
|
271
|
-
### 3.4
|
|
279
|
+
### 3.4 多架构编译(推荐用脚本)
|
|
272
280
|
|
|
273
|
-
**一键脚本** `/mnt/d/nodejs-mobile-build/build-all-archs.sh
|
|
281
|
+
**一键脚本** `/mnt/d/nodejs-mobile-build/build-all-archs.sh`:
|
|
274
282
|
|
|
275
283
|
```bash
|
|
276
284
|
#!/bin/bash
|
|
@@ -317,11 +325,11 @@ cp $TMP/x86_64/libnode.so libnode-package/libnode/bin/x86_64/
|
|
|
317
325
|
cd libnode-package && zip -r android-libnode.zip libnode
|
|
318
326
|
mv android-libnode.zip $OUT/android-libnode.zip
|
|
319
327
|
|
|
320
|
-
echo "===
|
|
328
|
+
echo "=== 产物:$OUT/android-libnode.zip ==="
|
|
321
329
|
ls -lh $OUT
|
|
322
330
|
```
|
|
323
331
|
|
|
324
|
-
|
|
332
|
+
执行:
|
|
325
333
|
|
|
326
334
|
```bash
|
|
327
335
|
chmod +x /mnt/d/nodejs-mobile-build/build-all-archs.sh
|
|
@@ -330,10 +338,11 @@ chmod +x /mnt/d/nodejs-mobile-build/build-all-archs.sh
|
|
|
330
338
|
|
|
331
339
|
### 3.5 多架构编译注意事项
|
|
332
340
|
|
|
333
|
-
1. **每次切换架构必须清 `out
|
|
334
|
-
2. **切换架构会清空 `out
|
|
335
|
-
3. **每次切架构前确认 `--with-intl=full-icu`
|
|
336
|
-
|
|
341
|
+
1. **每次切换架构必须清 `out`**:中间文件不能混用,否则奇怪的编译错误;脚本里已经 `rm -rf out`;
|
|
342
|
+
2. **切换架构会清空 `out`**:所以脚本编完一个架构立即把 `.so` 复制到 `libnode-tmp/<arch>/` 独立保存;
|
|
343
|
+
3. **每次切架构前确认 `--with-intl=full-icu` 还在**:`android_configure.py` 是源码,不会因切换架构被重置--但如果你从 Git
|
|
344
|
+
重新 clone 或覆盖过源码,修改会丢,务必再确认;
|
|
345
|
+
4. **验证两个架构都带 ICU**:`strings libnode.so | grep -c "icudt78l"` 应输出几千(约 4300),否则该架构没编进 ICU;
|
|
337
346
|
|
|
338
347
|
---
|
|
339
348
|
|
|
@@ -341,30 +350,30 @@ chmod +x /mnt/d/nodejs-mobile-build/build-all-archs.sh
|
|
|
341
350
|
|
|
342
351
|
### 4.1 体积对照
|
|
343
352
|
|
|
344
|
-
|
|
353
|
+
**官方数据(strip 后)**:
|
|
345
354
|
|
|
346
355
|
| 版本 | arm64-v8a | x86_64 |
|
|
347
356
|
| ---------------------- | ------------- | ------------- |
|
|
348
|
-
| v18
|
|
349
|
-
| v22
|
|
357
|
+
| v18(官方,无 ICU) | 59.6 MB | 62.3 MB |
|
|
358
|
+
| v22(自编译,full-icu) | **约 113 MB** | **约 118 MB** |
|
|
350
359
|
|
|
351
|
-
**zip
|
|
360
|
+
**zip 后**:`android-libnode.zip`(含两架构 `.so` + headers)约 88 MB,具体以实际产物为准;
|
|
352
361
|
|
|
353
|
-
体积差异约 50 MB
|
|
362
|
+
体积差异约 50 MB,来自三部分:Node v22 核心引擎 + full-icu 数据(约 25–30 MB)+ V8 版本升级;**不是编译出错**;
|
|
354
363
|
|
|
355
364
|
### 4.2 full-icu 与 Express 版本
|
|
356
365
|
|
|
357
366
|
| libnode.so | Node.js | ICU | Express |
|
|
358
367
|
| --------------------- | ------- | --- | --------------------------- |
|
|
359
|
-
| 官方 v18 | v18 | 无 | **必须 4.x
|
|
360
|
-
| 自编译 v22 + full-icu | v22 | 有 | 可用 5.x
|
|
368
|
+
| 官方 v18 | v18 | 无 | **必须 4.x**(如 `4.22.2`) |
|
|
369
|
+
| 自编译 v22 + full-icu | v22 | 有 | 可用 5.x(如 `5.2.1`) |
|
|
361
370
|
|
|
362
|
-
**Express
|
|
371
|
+
**Express 版本选错的典型崩溃**:
|
|
363
372
|
|
|
364
373
|
- `number 116 is not a function` → v18 无 ICU 加载 `path-to-regexp@8`
|
|
365
374
|
- `Invalid regular expression: /^[$_\p{ID_Start}]$/u` → 同上
|
|
366
375
|
|
|
367
|
-
**Express 5
|
|
376
|
+
**Express 5 路由语法迁移**:
|
|
368
377
|
|
|
369
378
|
| Express 4 | Express 5 |
|
|
370
379
|
| --------------------------- | --------------------------------- |
|
|
@@ -374,7 +383,8 @@ chmod +x /mnt/d/nodejs-mobile-build/build-all-archs.sh
|
|
|
374
383
|
| `res.json(obj, 200)` | `res.status(200).json(obj)` |
|
|
375
384
|
| `res.send(200, body)` | `res.status(200).send(body)` |
|
|
376
385
|
|
|
377
|
-
**不要用 `@alloc/path-to-regexp`
|
|
386
|
+
**不要用 `@alloc/path-to-regexp` 替换原版**:它的 `exports` 只有 `import` 条件,CJS 下 `require()` 报
|
|
387
|
+
`No "exports" main defined`;用原版 `path-to-regexp@8.4.2`;
|
|
378
388
|
|
|
379
389
|
---
|
|
380
390
|
|
|
@@ -382,11 +392,11 @@ chmod +x /mnt/d/nodejs-mobile-build/build-all-archs.sh
|
|
|
382
392
|
|
|
383
393
|
### 5.1 armeabi-v7a 为什么放弃
|
|
384
394
|
|
|
385
|
-
|
|
395
|
+
**结论**:v22+ **放弃 armeabi-v7a(32 位 ARM)**;
|
|
386
396
|
|
|
387
|
-
|
|
397
|
+
**原因**:
|
|
388
398
|
|
|
389
|
-
1. **V8
|
|
399
|
+
1. **V8 官方限制**:x64 主机上交叉编译 32 位 arm 目标时,`deps/v8/include/v8config.h` 第 914 行硬性拒绝:
|
|
390
400
|
|
|
391
401
|
```
|
|
392
402
|
#error Target architecture arm is only supported on arm and ia32 host
|
|
@@ -394,52 +404,75 @@ chmod +x /mnt/d/nodejs-mobile-build/build-all-archs.sh
|
|
|
394
404
|
|
|
395
405
|
即使强行绕过,后续 Torque 工具仍报大量 8 字节对齐错误;
|
|
396
406
|
|
|
397
|
-
2.
|
|
407
|
+
2. **实际意义有限**:Android 从 2019 年起要求新应用提供 64 位版本,现代设备几乎全部 arm64-v8a;
|
|
398
408
|
|
|
399
|
-
|
|
409
|
+
**替代**:需 32 位 ARM 支持时,使用提供该架构的 `libnode.so`(如 v18 / v20 产物);`abiFilters` 需与之对应;
|
|
400
410
|
|
|
401
411
|
### 5.2 x86_64 的说明
|
|
402
412
|
|
|
403
413
|
x86_64 在 x64 主机上**无交叉编译问题**,与 arm64 流程一致;`android-libnode.zip` 已含 x86_64 产物;
|
|
404
414
|
|
|
405
|
-
|
|
415
|
+
**用途**:Android Studio / 命令行的 x86_64 架构 AVD(模拟器);
|
|
406
416
|
|
|
407
|
-
|
|
417
|
+
**用模拟器时**:
|
|
408
418
|
- `mobileAppConfig.js` 的 `abiFilters` 含 `x86_64`
|
|
409
419
|
- `libnode/bin/x86_64/libnode.so` 存在
|
|
410
|
-
- 模拟器镜像必须是 x86_64
|
|
420
|
+
- 模拟器镜像必须是 x86_64 架构(不是 arm64)
|
|
411
421
|
|
|
412
422
|
### 5.3 自编译相关坑
|
|
413
423
|
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
|
|
424
|
+
- **`number 116 is not a function`**
|
|
425
|
+
- 原因:`libnode.so` 无 full-icu
|
|
426
|
+
- 解决:重新用 `--with-intl=full-icu` 编译,或回退 Express 4
|
|
427
|
+
- **`\p{...}` 正则报错**
|
|
428
|
+
- 原因:同上
|
|
429
|
+
- 解决:同上
|
|
430
|
+
- **`No "exports" main defined`**
|
|
431
|
+
- 原因:用了 `@alloc/path-to-regexp`
|
|
432
|
+
- 解决:撤销 `overrides`,清 `node_modules` + `package-lock.json` 重装
|
|
433
|
+
- **`Cannot find module 'rn-bridge'`**
|
|
434
|
+
- 原因:Node 20+ 不再把链接绑定暴露给 `require()`
|
|
435
|
+
- 解决:需修改 Node.js `lib/internal/modules/cjs/loader.js`,从 `NODE_PATH` 按目录加载 `rn-bridge`(入口由该目录
|
|
436
|
+
`package.json` 的 `main` 决定)
|
|
437
|
+
- **启动即崩**
|
|
438
|
+
- 现象:`pthread_mutex_lock called on a destroyed mutex` + `Fatal signal 6 (SIGABRT)`;
|
|
439
|
+
`require('rn-bridge')` 返回的对象无 `channel` 属性
|
|
440
|
+
- 原因:v22 loader 补丁按 `rn-bridge/index.js` 硬编码定位,而插件入口因 `type: module` 已改名(如 `index.cjs`),匹配失败 →
|
|
441
|
+
Node 回退到 `process._linkedBinding('rn_bridge')` 拿裸 binding
|
|
442
|
+
- 解决:使用按**目录** `rn-bridge` 定位的 loader 补丁(入口由该目录 `package.json` 的 `main` 字段解析)
|
|
443
|
+
- **JNI 编译报 `undefined symbol: v8::Exception::Error`**
|
|
444
|
+
- 原因:插件旧头文件(v18 时代)与 v22 `libnode.so` ABI 不匹配
|
|
445
|
+
- 解决:**用 `android-libnode.zip` 整目录替换**,其 `include/node/` 是 v22 官方 headers
|
|
446
|
+
- **`NODE_MODULE_VERSION` 不匹配**
|
|
447
|
+
- 原因:原生模块未重编
|
|
448
|
+
- 解决:`NODE_MOBILE_FORCE_REBUILD=1` 后重跑 CLI
|
|
449
|
+
- **Windows 下 `Unsupported operating system for nodejs-mobile native builds`**
|
|
450
|
+
- 原因:插件硬编码只支持 macOS/Linux
|
|
451
|
+
- 解决:官方 v22 产物已含 Windows 支持(`windows-x86_64` + `host_os=win32`)
|
|
452
|
+
- **Gradle 9 报 `Could not find method exec()`**
|
|
453
|
+
- 原因:Gradle 9 移除 `exec()`
|
|
454
|
+
- 解决:官方 v22 产物已修复(改用 `providers.exec`)
|
|
425
455
|
|
|
426
456
|
---
|
|
427
457
|
|
|
428
458
|
## 六、注意事项
|
|
429
459
|
|
|
430
|
-
1.
|
|
431
|
-
|
|
432
|
-
|
|
433
|
-
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
|
|
460
|
+
1. **插件本身可能不兼容**:`nodejs-mobile-react-native` 的 C++ 胶水代码为特定 Node.js 版本编写;升级到 v22+
|
|
461
|
+
时可能需自行修改插件源码并重编;
|
|
462
|
+
2. **依赖库版本**:部分 npm 包限制 Node.js 版本;检查 `package.json` 的 `engines`;
|
|
463
|
+
3. **非官方产物**:自编译的 `libnode.so` 未经充分测试,生产环境前充分测试;
|
|
464
|
+
4. **多架构建议**:优先保证 `arm64-v8a`,按需补 `x86_64`;`armeabi-v7a` v22+ 已放弃;
|
|
465
|
+
5. **full-icu 是 Express 5 的硬前提**:不要图省事用 `--with-intl=none` 编译;
|
|
466
|
+
6. **`android-libnode.zip` 是唯一发布物**:与官方 nodejs-mobile 结构一致(`bin/` + `include/`),整目录替换,无需手动改头文件;
|
|
467
|
+
7. **CLI 会自动处理缓存**:替换 `libnode.so` 后跑 `test` / `build`,指纹机制检测到变化时清 `.cxx` / `android/build` /
|
|
468
|
+
`app/build`,并清 `nodejs-assets` 与依赖快照,触发重装、重编、重优化;**无需手动清任何缓存**;
|
|
437
469
|
|
|
438
470
|
---
|
|
439
471
|
|
|
440
472
|
## 相关文档
|
|
441
473
|
|
|
442
|
-
- [README.md](./README.md)
|
|
443
|
-
- [Android 构建指南.md](./Android 构建指南.md)
|
|
444
|
-
-
|
|
445
|
-
|
|
474
|
+
- [README.md](./README.md) -- 快速开始、配置字段、命令
|
|
475
|
+
- [Android 构建指南.md](./Android 构建指南.md) -- 环境准备、libnode.so 对照、Express 版本、调试
|
|
476
|
+
- **预编译产物下载**:[GitHub Releases](https://github.com/OpenFlun/nodejs-mobile/releases)
|
|
477
|
+
[Gitee Releases](https://gitee.com/OpenFlun/nodejs-mobile/releases)
|
|
478
|
+
- **源码仓库**:[GitHub](https://github.com/OpenFlun/nodejs-mobile) / [Gitee](https://gitee.com/OpenFlun/nodejs-mobile)
|