Skip to content

Commit caf223a

Browse files
committed
x86_64 support 16k page size
1 parent f527e20 commit caf223a

File tree

5 files changed

+126
-22
lines changed

5 files changed

+126
-22
lines changed

16kpatch/README.md

Lines changed: 14 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,17 @@
1-
# 16kpatch 使用说明(仅生产 arm64)
1+
# 16kpatch 使用说明(arm64 生产 + x86_64 可构建
22

33
## 适用范围
44
- 基线项目:默认 `ijkplayer`
55
- 主机环境:Darwin arm64(Apple Silicon)
66
- NDK:`22.1.7171670`(r22)
77
- FFmpeg 依赖:`CarGuo/FFmpeg` tag `ijk-n4.3-20260301-007`
8-
- 目标:仅 `arm64-v8a` 生产
8+
- ABI 策略:`arm64-v8a` 生产 + `x86_64` 可构建
99

1010
## 补丁文件说明
1111
- `ndk_r22_16k_commit.patch`
12-
- 已更新为当前 `ijkplayer` 目录改动快照(以 `9ef1d2b2..c108dc6e` 为范围,含脚本、构建参数、16K 对齐、arm64 约束、README、init 远程依赖与 tag 固定等)
12+
- 当前 `ijkplayer` 主仓改动快照(基于 `9ef1d2b2` 到当前工作树),覆盖构建脚本、16K 对齐、Stack Canary、init 固化、x86_64 构建支持、README 同步等
1313
- `ndk_r22_ffmpeg_n4.3_ijk.patch`
14-
- FFmpeg 侧补丁(`n4.3..ijk-n4.3-20260301-007` 为范围),包含 ijk 协议/demuxer 兼容、OpenSSL 探测兼容、导出头、以及 async 注册崩溃修复。
14+
- FFmpeg 侧补丁(`n4.3..ijk-n4.3-20260301-007`),包含 ijk 协议/demuxer 兼容、OpenSSL 探测兼容、导出头、async 注册崩溃修复。
1515
- `ndk_r22_soundtouch.patch`
1616
- `ijksoundtouch` 的 16K 链接与 STL 兼容补丁。
1717
- `ndk_r22_ijkyuv.patch`
@@ -43,15 +43,15 @@ git apply --check /path/to/16kpatch/ndk_r22_ijkyuv.patch
4343
git apply /path/to/16kpatch/ndk_r22_ijkyuv.patch
4444
```
4545

46-
5. 对 FFmpeg 仓库应用 n4.3 补丁(可选,若你直接使用 `ijk-n4.3-20260301-007` tag 可跳过)
46+
5. 对 FFmpeg 仓库应用 n4.3 补丁(可选,若直接使用 `ijk-n4.3-20260301-007` tag 可跳过)
4747
```bash
4848
cd /path/to/FFmpeg
4949
git checkout -B codex/n4.3-ijk-arm64 n4.3
5050
git apply --check /path/to/16kpatch/ndk_r22_ffmpeg_n4.3_ijk.patch
5151
git apply /path/to/16kpatch/ndk_r22_ffmpeg_n4.3_ijk.patch
5252
```
5353

54-
6. 回到项目根目录,初始化并编译(仅 arm64)
54+
6. 回到项目根目录,初始化并编译
5555
```bash
5656
cd ../../
5757
./init-android-openssl.sh
@@ -60,15 +60,21 @@ cd ../../
6060
cd android/contrib
6161
./compile-openssl.sh arm64
6262
./compile-ffmpeg.sh arm64
63+
./compile-ffmpeg.sh x86_64
6364

6465
cd ..
6566
./compile-ijk.sh arm64
67+
./compile-ijk.sh x86_64
6668
```
6769

6870
## 验证建议
6971
- Stack Canary:`libijkffmpeg.so` 包含 `__stack_chk_fail@LIBC`
70-
- 16K Page Size:`arm64-v8a``libijkffmpeg.so/libijksdl.so/libijkplayer.so``PT_LOAD Align` 应为 `0x4000`
72+
- 16K Page Size:`arm64-v8a``libijkffmpeg.so/libijksdl.so/libijkplayer.so``PT_LOAD Align``0x4000`
73+
- x86_64 产物存在:
74+
- `android/ijkplayer/ijkplayer-x86_64/src/main/libs/x86_64/libijkffmpeg.so`
75+
- `android/ijkplayer/ijkplayer-x86_64/src/main/libs/x86_64/libijksdl.so`
76+
- `android/ijkplayer/ijkplayer-x86_64/src/main/libs/x86_64/libijkplayer.so`
7177

7278
## 注意事项
73-
- 该补丁集只面向 arm64 生产链路,不保证其他 ABI 行为
79+
- 生产发布仍建议仅使用 arm64-v8a
7480
- 若目标仓库已存在同名改动,`git apply --check` 可能失败;请先清理冲突或基于干净分支应用。

16kpatch/ndk_r22_16k_commit.patch

Lines changed: 112 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,28 @@
11
diff --git a/README.md b/README.md
2-
index a8075543..b3027f1d 100644
2+
index a8075543..00d3e336 100644
33
--- a/README.md
44
+++ b/README.md
5-
@@ -7,7 +7,7 @@
5+
@@ -1,35 +1,46 @@
6+
# ijkplayer
7+
8+
-## 【修改说明(仅生产 arm64)】
9+
-
10+
-> 适用范围明确为:**仅关注并支持生产 arm64(arm64-v8a)**。
11+
+## 【修改说明(arm64 生产 + x86_64 可构建)】
12+
+
13+
+> 当前链路以 **arm64-v8a 生产** 为主,同时已补齐 **x86_64 动态库构建**(便于模拟器/联调场景)。
14+
615
### 1) 当前支持环境与系统版本(已验证)
716
- 主机系统:macOS 26.2(Build 25C56),Apple Silicon(Darwin arm64)
817
- Android NDK:`22.1.7171670`(r22)
918
-- FFmpeg 基线:`ff4.1.6`
10-
+- FFmpeg 基线:`n4.3`,并使用本地/远端 tag:`ijk-n4.3-20260301-007`
19+
+- FFmpeg 基线:`n4.3`,并使用远端 tag:`ijk-n4.3-20260301-007`
1120
- OpenSSL 基线:`OpenSSL_1_1_1w`
12-
- 目标 ABI:`arm64-v8a`(不再作为生产目标处理 armv5/armv7a/x86/x86_64)
21+
-- 目标 ABI:`arm64-v8a`(不再作为生产目标处理 armv5/armv7a/x86/x86_64)
22+
+- 目标 ABI:`arm64-v8a`(生产)+ `x86_64`(可构建)
1323

14-
@@ -15,11 +15,15 @@
24+
-### 修改范围
25+
+### 2) 本次关键修复与增强
1526
- 已修复 `compile-openssl.sh arm64` 在 Darwin arm64 + NDK r22 的 `aarch64-linux-android-ar` 崩溃问题
1627
方案:注入 `ar/ranlib -> llvm-ar/llvm-ranlib` 兼容 wrapper。
1728
- 已修复 `compile-ffmpeg.sh arm64` 同类 `ar` 崩溃问题
@@ -21,22 +32,96 @@ index a8075543..b3027f1d 100644
2132
方案:FFmpeg 编译参数加入 `-fstack-protector-strong`,并验证 `__stack_chk_fail@LIBC`。
2233
- 已验证 arm64 打包产物满足 16KB page size
2334
产物 `libijkffmpeg.so` / `libijksdl.so` / `libijkplayer.so` 的 `PT_LOAD Align` 均为 `0x4000`。
35+
-
36+
-### 3) 对比官方 ijkplayer 的 git diff 文件范围:
2437
+- 已修复运行时崩溃:`ijkav_register_async_protocol+24`(`SIGSEGV/SEGV_ACCERR`)
2538
+ 根因:`n4.3` 下 async 协议对象不可写,旧 ijk 逻辑 `memcpy` 覆盖触发只读段写入。
2639
+ 方案:保留注册入口但改为兼容 no-op,使用内置 async 协议实现。
27-
+- `init-android.sh` 已固定引用:`IJK_FFMPEG_COMMIT=ijk-n4.3-20260301-007`。
28-
29-
### 3) 对比官方 ijkplayer 的 git diff 文件范围:
40+
+- 已补齐 x86_64 构建链路(NDK r22)
41+
+ 方案:`compile-ijk.sh` 增加 `x86_64` 目标;`ijkplayer-x86_64` 的 `APP_STL` 迁移为 `c++_static`。
42+
+- `init-android.sh` 已固定引用:
43+
+ - `IJK_FFMPEG_UPSTREAM=https://github.com/CarGuo/FFmpeg.git`
44+
+ - `IJK_FFMPEG_FORK=https://github.com/CarGuo/FFmpeg.git`
45+
+ - `IJK_FFMPEG_COMMIT=ijk-n4.3-20260301-007`
46+
+
47+
+### 3) 对比官方 ijkplayer 的 git diff 文件范围
3048
- `android/compile-ijk.sh`
31-
@@ -45,7 +49,7 @@
32-
- `ndk_r22_ijkyuv.patch` (`ijkmedia/`下的 sub git)
33-
- `ndk_r22_16k_commit.patch` (全量)
49+
- `android/contrib/tools/do-compile-ffmpeg.sh`
50+
- `android/contrib/tools/do-compile-openssl.sh`
51+
- `android/contrib/tools/do-detect-env.sh`
52+
- `android/ijkplayer/ijkplayer-arm64/build.gradle`
53+
- `android/ijkplayer/ijkplayer-arm64/src/main/jni/Application.mk`
54+
+- `android/ijkplayer/ijkplayer-x86_64/src/main/jni/Application.mk`
55+
- `config/module-lite.sh`
56+
- `config/module.sh`
57+
+- `config/module-lite-more.sh`
58+
- `ijkmedia/ijkj4a/Android.mk`
59+
- `ijkmedia/ijkplayer/Android.mk`
60+
- `ijkmedia/ijksdl/Android.mk`
61+
@@ -37,19 +48,18 @@
62+
- `init-android-openssl.sh`
63+
- `init-android.sh`
64+
- `commit.patch`
65+
-- `config/module-lite-more.sh`
66+
+- `README.md`
3467

68+
-### 4) 上述修改相关补丁 patch (对比官方 ijkplayer)
69+
+### 4) 相关补丁(对比官方 ijkplayer)
70+
- 补丁目录:[GSYVideoPlayer/16kpatch](https://github.com/CarGuo/GSYVideoPlayer/tree/master/16kpatch)
71+
- - `ndk_r22_soundtouch.patch` (`ijkmedia/`下的 sub git)
72+
- - `ndk_r22_ijkyuv.patch` (`ijkmedia/`下的 sub git)
73+
- - `ndk_r22_16k_commit.patch` (全量)
74+
-
3575
-- 目前基于 FFmpeg 需要为 4.1.6 手动修改的 `FFmpeg/configure` : `check_lib openssl openssl/ssl.h OPENSSL_init_ssl -lssl -lcrypto`
36-
+- OpenSSL 探测补丁已固化到初始化流程(自动检查并补齐),无需每次手动改 `configure`。
76+
-
77+
-### 5) 仅 arm64 生产约束
78+
-- 本地构建、验证、问题处理均以 `arm64-v8a` 为唯一生产目标。
79+
-
80+
+ - `ndk_r22_16k_commit.patch`(ijkplayer 主仓全量补丁)
81+
+ - `ndk_r22_ffmpeg_n4.3_ijk.patch`(FFmpeg: `n4.3 -> ijk-n4.3-20260301-007`)
82+
+ - `ndk_r22_soundtouch.patch`(`ijkmedia/ijksoundtouch`)
83+
+ - `ndk_r22_ijkyuv.patch`(`ijkmedia/ijkyuv`)
84+
+
85+
+### 5) ABI 策略
86+
+- 生产发布:仅 `arm64-v8a`。
87+
+- 工程构建兼容:`arm64-v8a + x86_64`。
88+
Platform | Build Status
89+
-------- | ------------
90+
Android | [![Build Status](https://travis-ci.org/Bilibili/ci-ijk-ffmpeg-android.svg?branch=master)](https://travis-ci.org/Bilibili/ci-ijk-ffmpeg-android)
91+
diff --git a/android/compile-ijk.sh b/android/compile-ijk.sh
92+
index 9b7a3af8..eea55a60 100755
93+
--- a/android/compile-ijk.sh
94+
+++ b/android/compile-ijk.sh
95+
@@ -25,7 +25,7 @@ fi
96+
REQUEST_TARGET=$1
97+
REQUEST_SUB_CMD=$2
98+
ACT_ABI_32="armv5 armv7a x86"
99+
-ACT_ABI_64="arm64"
100+
+ACT_ABI_64="arm64 x86_64"
101+
ACT_ABI_ALL=$ACT_ABI_64
102+
UNAME_S=$(uname -s)
37103

38-
### 5) 仅 arm64 生产约束
39-
- 本地构建、验证、问题处理均以 `arm64-v8a` 为唯一生产目标。
104+
@@ -95,6 +95,9 @@ case "$REQUEST_TARGET" in
105+
arm64)
106+
do_ndk_build $REQUEST_TARGET $REQUEST_SUB_CMD;
107+
;;
108+
+ x86_64)
109+
+ do_ndk_build $REQUEST_TARGET $REQUEST_SUB_CMD;
110+
+ ;;
111+
all32)
112+
for ABI in $ACT_ABI_32
113+
do
114+
@@ -116,9 +119,9 @@ case "$REQUEST_TARGET" in
115+
*)
116+
echo "Usage:"
117+
echo " compile-ijk.sh arm64"
118+
+ echo " compile-ijk.sh x86_64"
119+
echo " compile-ijk.sh all|all32"
120+
echo " compile-ijk.sh all64"
121+
echo " compile-ijk.sh clean"
122+
;;
123+
esac
124+
-
40125
diff --git a/android/contrib/tools/do-compile-ffmpeg.sh b/android/contrib/tools/do-compile-ffmpeg.sh
41126
index dffbd591..14f7081c 100755
42127
--- a/android/contrib/tools/do-compile-ffmpeg.sh
@@ -65,6 +150,19 @@ index dffbd591..14f7081c 100755
65150
export STRIP=${FF_CROSS_PREFIX}-strip
66151

67152
FF_CFLAGS="-O3 -Wall -pipe \
153+
diff --git a/android/ijkplayer/ijkplayer-x86_64/src/main/jni/Application.mk b/android/ijkplayer/ijkplayer-x86_64/src/main/jni/Application.mk
154+
index 207b1382..8e696367 100644
155+
--- a/android/ijkplayer/ijkplayer-x86_64/src/main/jni/Application.mk
156+
+++ b/android/ijkplayer/ijkplayer-x86_64/src/main/jni/Application.mk
157+
@@ -23,7 +23,7 @@ APP_ABI := x86_64
158+
NDK_TOOLCHAIN_VERSION=4.9
159+
APP_PIE := false
160+
161+
-APP_STL := stlport_static
162+
+APP_STL := c++_static
163+
164+
APP_CFLAGS := -O3 -Wall -pipe \
165+
-ffast-math \
68166
diff --git a/ijkmedia/ijkplayer/ijkavformat/ijkasync.c b/ijkmedia/ijkplayer/ijkavformat/ijkasync.c
69167
index 0674a07d..93a17fb8 100644
70168
--- a/ijkmedia/ijkplayer/ijkavformat/ijkasync.c
-1.83 MB
Binary file not shown.
128 KB
Binary file not shown.
-122 KB
Binary file not shown.

0 commit comments

Comments
 (0)