react-native-skia-webgpu-video 0.0.0-stage → 0.1.0-beta.0

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.
Files changed (236) hide show
  1. package/LICENSE +22 -0
  2. package/README.md +303 -2
  3. package/android/BUILD_VALIDATION.md +62 -0
  4. package/android/CMakeLists.txt +99 -0
  5. package/android/build-validation.json +262 -0
  6. package/android/build.gradle +185 -0
  7. package/android/cpp/EncoderTargets.cpp +226 -0
  8. package/android/cpp/EncoderTargets.h +70 -0
  9. package/android/cpp/JNIHelpers.cpp +15 -0
  10. package/android/cpp/JNIHelpers.h +20 -0
  11. package/android/cpp/NativeEventDispatcher.cpp +59 -0
  12. package/android/cpp/NativeEventDispatcher.h +31 -0
  13. package/android/cpp/NativeHardwareBuffer.cpp +397 -0
  14. package/android/cpp/NativeHardwareBuffer.h +34 -0
  15. package/android/cpp/NativeRgbaBuffer.cpp +45 -0
  16. package/android/cpp/NativeRgbaBuffer.h +9 -0
  17. package/android/cpp/ReturnedVideoFrames.h +37 -0
  18. package/android/cpp/RgbaFrameLease.h +53 -0
  19. package/android/cpp/VideoCapabilities.cpp +87 -0
  20. package/android/cpp/VideoCapabilities.h +44 -0
  21. package/android/cpp/VideoComposition.cpp +170 -0
  22. package/android/cpp/VideoComposition.h +36 -0
  23. package/android/cpp/VideoCompositionFramesExtractor.cpp +82 -0
  24. package/android/cpp/VideoCompositionFramesExtractor.h +48 -0
  25. package/android/cpp/VideoCompositionFramesExtractorHostObject.cpp +230 -0
  26. package/android/cpp/VideoCompositionFramesExtractorHostObject.h +42 -0
  27. package/android/cpp/VideoCompositionFramesExtractorSyncHostObject.cpp +133 -0
  28. package/android/cpp/VideoCompositionFramesExtractorSyncHostObject.h +46 -0
  29. package/android/cpp/VideoEncoderHostObject.cpp +318 -0
  30. package/android/cpp/VideoEncoderHostObject.h +76 -0
  31. package/android/cpp/VideoFrame.cpp +293 -0
  32. package/android/cpp/VideoFrame.h +27 -0
  33. package/android/cpp/VideoPlayer.cpp +96 -0
  34. package/android/cpp/VideoPlayer.h +52 -0
  35. package/android/cpp/VideoPlayerHostObject.cpp +225 -0
  36. package/android/cpp/VideoPlayerHostObject.h +43 -0
  37. package/android/cpp/cpp-adapter.cpp +316 -0
  38. package/android/gradle.properties +5 -0
  39. package/android/instrumentation-inventory.json +178 -0
  40. package/android/proguard-rules.pro +4 -0
  41. package/android/src/main/AndroidManifest.xml +2 -0
  42. package/android/src/main/java/com/azzapp/rnskv/AudioCompositionExporter.java +537 -0
  43. package/android/src/main/java/com/azzapp/rnskv/AudioCompositionPlayer.java +321 -0
  44. package/android/src/main/java/com/azzapp/rnskv/BufferLifetime.java +55 -0
  45. package/android/src/main/java/com/azzapp/rnskv/DecodeRequests.java +100 -0
  46. package/android/src/main/java/com/azzapp/rnskv/DecoderWindow.java +55 -0
  47. package/android/src/main/java/com/azzapp/rnskv/EGLResourcesHolder.java +132 -0
  48. package/android/src/main/java/com/azzapp/rnskv/EGLUtils.java +225 -0
  49. package/android/src/main/java/com/azzapp/rnskv/FrameSize.java +50 -0
  50. package/android/src/main/java/com/azzapp/rnskv/GLFrameExtractor.java +510 -0
  51. package/android/src/main/java/com/azzapp/rnskv/JNIHelpers.java +12 -0
  52. package/android/src/main/java/com/azzapp/rnskv/NativeEventDispatcher.java +25 -0
  53. package/android/src/main/java/com/azzapp/rnskv/NativeHardwareBuffer.java +62 -0
  54. package/android/src/main/java/com/azzapp/rnskv/NativeRgbaBuffer.java +35 -0
  55. package/android/src/main/java/com/azzapp/rnskv/ReactNativeSkiaVideoModule.java +45 -0
  56. package/android/src/main/java/com/azzapp/rnskv/ReactNativeSkiaVideoPackage.java +43 -0
  57. package/android/src/main/java/com/azzapp/rnskv/ReactNativeSkiaVideoSpec.java +9 -0
  58. package/android/src/main/java/com/azzapp/rnskv/RgbaBufferAllocator.java +83 -0
  59. package/android/src/main/java/com/azzapp/rnskv/RgbaLayout.java +33 -0
  60. package/android/src/main/java/com/azzapp/rnskv/SurfaceOutputPolicy.java +13 -0
  61. package/android/src/main/java/com/azzapp/rnskv/TextureRenderer.java +150 -0
  62. package/android/src/main/java/com/azzapp/rnskv/TimeHelpers.java +11 -0
  63. package/android/src/main/java/com/azzapp/rnskv/VideoCapabilities.java +354 -0
  64. package/android/src/main/java/com/azzapp/rnskv/VideoComposition.java +147 -0
  65. package/android/src/main/java/com/azzapp/rnskv/VideoCompositionDecoder.java +772 -0
  66. package/android/src/main/java/com/azzapp/rnskv/VideoCompositionFramesExtractor.java +354 -0
  67. package/android/src/main/java/com/azzapp/rnskv/VideoCompositionFramesExtractorSync.java +241 -0
  68. package/android/src/main/java/com/azzapp/rnskv/VideoCompositionItemDecoder.java +492 -0
  69. package/android/src/main/java/com/azzapp/rnskv/VideoEncoder.java +639 -0
  70. package/android/src/main/java/com/azzapp/rnskv/VideoFrame.java +74 -0
  71. package/android/src/main/java/com/azzapp/rnskv/VideoPlayer.java +361 -0
  72. package/cpp/RNSVCheckedSizes.h +54 -0
  73. package/cpp/RNSVEventEmitter.cpp +199 -0
  74. package/cpp/RNSVEventEmitter.h +31 -0
  75. package/cpp/RNSVHostObject.cpp +79 -0
  76. package/cpp/RNSVHostObject.h +67 -0
  77. package/cpp/RNSVMemoryBudget.cpp +68 -0
  78. package/cpp/RNSVMemoryBudget.h +100 -0
  79. package/cpp/RNSVRuntimeLifecycleMonitor.cpp +88 -0
  80. package/cpp/RNSVRuntimeLifecycleMonitor.h +33 -0
  81. package/docs/ANDROID_DEVICE_306.md +95 -0
  82. package/docs/ANDROID_EXPORT_CACHE_306.md +48 -0
  83. package/docs/ANDROID_MEMORY_RETENTION_306.md +67 -0
  84. package/docs/BENCHMARKS.md +368 -0
  85. package/docs/IOS_DEVICE_TESTS.md +115 -0
  86. package/docs/IOS_SIMULATOR_TESTS.md +74 -0
  87. package/docs/MIGRATION.md +82 -0
  88. package/docs/NATIVE_MEMORY_INVESTIGATION_306.md +88 -0
  89. package/docs/PERFORMANCE_AB_IPHONE_303.md +196 -0
  90. package/docs/PERFORMANCE_AB_SIMULATOR.md +135 -0
  91. package/docs/PERFORMANCE_AB_SOAK_SIMULATOR.md +84 -0
  92. package/docs/PERFORMANCE_IPHONE_306_OPTIMIZATION.md +76 -0
  93. package/docs/PERFORMANCE_SIMULATOR.md +89 -0
  94. package/docs/PERFORMANCE_SIMULATOR_INITIAL.md +96 -0
  95. package/docs/PERFORMANCE_SOAK_IPHONE_303.md +41 -0
  96. package/docs/UPSTREAM_NOTES.md +188 -0
  97. package/docs/assets/banner.svg +26 -0
  98. package/examples/webgpu-overlay.ts +147 -0
  99. package/ios/AVAssetTrackUtils.h +24 -0
  100. package/ios/AudioCompositionUtils.h +27 -0
  101. package/ios/AudioCompositionUtils.mm +113 -0
  102. package/ios/DecoderWindow.h +52 -0
  103. package/ios/NativeResourceStats.h +32 -0
  104. package/ios/RNSVColorSpace.h +50 -0
  105. package/ios/RNSVJSIUtils.h +46 -0
  106. package/ios/RNSVScopedPixelBuffer.h +17 -0
  107. package/ios/RNSVVideoPlayer.h +46 -0
  108. package/ios/RNSVVideoPlayer.mm +410 -0
  109. package/ios/ReactNativeSkiaVideo.h +8 -0
  110. package/ios/ReactNativeSkiaVideo.mm +310 -0
  111. package/ios/SeekPolicy.h +27 -0
  112. package/ios/VideoComposition.h +148 -0
  113. package/ios/VideoCompositionFramesExtractorHostObject.h +105 -0
  114. package/ios/VideoCompositionFramesExtractorHostObject.mm +686 -0
  115. package/ios/VideoCompositionFramesExtractorSyncHostObject.h +37 -0
  116. package/ios/VideoCompositionFramesExtractorSyncHostObject.mm +168 -0
  117. package/ios/VideoCompositionItemDecoder.h +60 -0
  118. package/ios/VideoCompositionItemDecoder.mm +480 -0
  119. package/ios/VideoEncoderHostObject.h +83 -0
  120. package/ios/VideoEncoderHostObject.mm +706 -0
  121. package/ios/VideoFrame.h +66 -0
  122. package/ios/VideoFrame.mm +108 -0
  123. package/ios/VideoPlayerHostObject.h +52 -0
  124. package/ios/VideoPlayerHostObject.mm +332 -0
  125. package/lib/module/NativeReactNativeSkiaVideo.js +5 -0
  126. package/lib/module/NativeReactNativeSkiaVideo.js.map +1 -0
  127. package/lib/module/RNSkiaVideoModule.js +20 -0
  128. package/lib/module/RNSkiaVideoModule.js.map +1 -0
  129. package/lib/module/canvas.js +18 -0
  130. package/lib/module/canvas.js.map +1 -0
  131. package/lib/module/exportCache.js +22 -0
  132. package/lib/module/exportCache.js.map +1 -0
  133. package/lib/module/exportFrames.js +338 -0
  134. package/lib/module/exportFrames.js.map +1 -0
  135. package/lib/module/exportQueue.js +52 -0
  136. package/lib/module/exportQueue.js.map +1 -0
  137. package/lib/module/exportTarget.js +137 -0
  138. package/lib/module/exportTarget.js.map +1 -0
  139. package/lib/module/exportVideoComposition.js +492 -0
  140. package/lib/module/exportVideoComposition.js.map +1 -0
  141. package/lib/module/frameInterop.js +532 -0
  142. package/lib/module/frameInterop.js.map +1 -0
  143. package/lib/module/gpu.js +222 -0
  144. package/lib/module/gpu.js.map +1 -0
  145. package/lib/module/gpuDevice.js +54 -0
  146. package/lib/module/gpuDevice.js.map +1 -0
  147. package/lib/module/index.js +36 -0
  148. package/lib/module/index.js.map +1 -0
  149. package/lib/module/memory.js +38 -0
  150. package/lib/module/memory.js.map +1 -0
  151. package/lib/module/package.json +1 -0
  152. package/lib/module/previewLifecycle.js +52 -0
  153. package/lib/module/previewLifecycle.js.map +1 -0
  154. package/lib/module/runtimeYield.js +10 -0
  155. package/lib/module/runtimeYield.js.map +1 -0
  156. package/lib/module/types.js +4 -0
  157. package/lib/module/types.js.map +1 -0
  158. package/lib/module/utils/useEventListener.js +18 -0
  159. package/lib/module/utils/useEventListener.js.map +1 -0
  160. package/lib/module/videoCompositionPlayer.js +348 -0
  161. package/lib/module/videoCompositionPlayer.js.map +1 -0
  162. package/lib/module/videoFrameImage.js +185 -0
  163. package/lib/module/videoFrameImage.js.map +1 -0
  164. package/lib/module/videoPlayer.js +172 -0
  165. package/lib/module/videoPlayer.js.map +1 -0
  166. package/lib/module/yuvBlit.js +299 -0
  167. package/lib/module/yuvBlit.js.map +1 -0
  168. package/lib/typescript/package.json +1 -0
  169. package/lib/typescript/src/NativeReactNativeSkiaVideo.d.ts +7 -0
  170. package/lib/typescript/src/NativeReactNativeSkiaVideo.d.ts.map +1 -0
  171. package/lib/typescript/src/RNSkiaVideoModule.d.ts +4 -0
  172. package/lib/typescript/src/RNSkiaVideoModule.d.ts.map +1 -0
  173. package/lib/typescript/src/canvas.d.ts +4 -0
  174. package/lib/typescript/src/canvas.d.ts.map +1 -0
  175. package/lib/typescript/src/exportCache.d.ts +6 -0
  176. package/lib/typescript/src/exportCache.d.ts.map +1 -0
  177. package/lib/typescript/src/exportFrames.d.ts +57 -0
  178. package/lib/typescript/src/exportFrames.d.ts.map +1 -0
  179. package/lib/typescript/src/exportQueue.d.ts +5 -0
  180. package/lib/typescript/src/exportQueue.d.ts.map +1 -0
  181. package/lib/typescript/src/exportTarget.d.ts +28 -0
  182. package/lib/typescript/src/exportTarget.d.ts.map +1 -0
  183. package/lib/typescript/src/exportVideoComposition.d.ts +68 -0
  184. package/lib/typescript/src/exportVideoComposition.d.ts.map +1 -0
  185. package/lib/typescript/src/frameInterop.d.ts +17 -0
  186. package/lib/typescript/src/frameInterop.d.ts.map +1 -0
  187. package/lib/typescript/src/gpu.d.ts +39 -0
  188. package/lib/typescript/src/gpu.d.ts.map +1 -0
  189. package/lib/typescript/src/gpuDevice.d.ts +11 -0
  190. package/lib/typescript/src/gpuDevice.d.ts.map +1 -0
  191. package/lib/typescript/src/index.d.ts +21 -0
  192. package/lib/typescript/src/index.d.ts.map +1 -0
  193. package/lib/typescript/src/memory.d.ts +25 -0
  194. package/lib/typescript/src/memory.d.ts.map +1 -0
  195. package/lib/typescript/src/previewLifecycle.d.ts +22 -0
  196. package/lib/typescript/src/previewLifecycle.d.ts.map +1 -0
  197. package/lib/typescript/src/runtimeYield.d.ts +4 -0
  198. package/lib/typescript/src/runtimeYield.d.ts.map +1 -0
  199. package/lib/typescript/src/types.d.ts +631 -0
  200. package/lib/typescript/src/types.d.ts.map +1 -0
  201. package/lib/typescript/src/utils/useEventListener.d.ts +5 -0
  202. package/lib/typescript/src/utils/useEventListener.d.ts.map +1 -0
  203. package/lib/typescript/src/videoCompositionPlayer.d.ts +85 -0
  204. package/lib/typescript/src/videoCompositionPlayer.d.ts.map +1 -0
  205. package/lib/typescript/src/videoFrameImage.d.ts +60 -0
  206. package/lib/typescript/src/videoFrameImage.d.ts.map +1 -0
  207. package/lib/typescript/src/videoPlayer.d.ts +99 -0
  208. package/lib/typescript/src/videoPlayer.d.ts.map +1 -0
  209. package/lib/typescript/src/yuvBlit.d.ts +50 -0
  210. package/lib/typescript/src/yuvBlit.d.ts.map +1 -0
  211. package/package.json +154 -4
  212. package/patches/react-native-skia+3.7.0.patch +502 -0
  213. package/react-native-skia-webgpu-video.podspec +35 -0
  214. package/scripts/apply-skia-canvas-patch.mjs +48 -0
  215. package/scripts/skia-canvas-patch.json +291 -0
  216. package/src/NativeReactNativeSkiaVideo.ts +8 -0
  217. package/src/RNSkiaVideoModule.ts +27 -0
  218. package/src/canvas.ts +22 -0
  219. package/src/exportCache.ts +27 -0
  220. package/src/exportFrames.ts +421 -0
  221. package/src/exportQueue.ts +65 -0
  222. package/src/exportTarget.ts +179 -0
  223. package/src/exportVideoComposition.ts +718 -0
  224. package/src/frameInterop.ts +684 -0
  225. package/src/gpu.ts +290 -0
  226. package/src/gpuDevice.ts +80 -0
  227. package/src/index.tsx +45 -0
  228. package/src/memory.ts +48 -0
  229. package/src/previewLifecycle.ts +60 -0
  230. package/src/runtimeYield.ts +6 -0
  231. package/src/types.ts +661 -0
  232. package/src/utils/useEventListener.ts +22 -0
  233. package/src/videoCompositionPlayer.ts +520 -0
  234. package/src/videoFrameImage.ts +205 -0
  235. package/src/videoPlayer.ts +318 -0
  236. package/src/yuvBlit.ts +331 -0
@@ -0,0 +1,262 @@
1
+ {
2
+ "validatedAt": "2026-10-07T08:59:20.452248+00:00",
3
+ "status": "build-and-host-tests-passed",
4
+ "commands": ":app:assembleDebug :app:assembleRelease :react-native-skia-webgpu-video:assembleDebug :react-native-skia-webgpu-video:assembleDebugAndroidTest :react-native-skia-webgpu-video:testDebugUnitTest --no-daemon --max-workers=2 -PreactNativeArchitectures=arm64-v8a",
5
+ "toolchain": {
6
+ "reactNative": "0.86.2",
7
+ "skia": "3.0.6",
8
+ "webgpu": "0.12.1",
9
+ "java": "17",
10
+ "sdk": 36,
11
+ "ndk": "27.1.12297006",
12
+ "gradle": "9.3.1",
13
+ "abi": "arm64-v8a"
14
+ },
15
+ "jvm": {
16
+ "tests": 31,
17
+ "failures": 0,
18
+ "errors": 0,
19
+ "suites": [
20
+ {
21
+ "name": "com.azzapp.rnskv.BufferLifetimeTest",
22
+ "tests": "3",
23
+ "failures": "0",
24
+ "errors": "0",
25
+ "skipped": "0"
26
+ },
27
+ {
28
+ "name": "com.azzapp.rnskv.DecodeRequestsTest",
29
+ "tests": "5",
30
+ "failures": "0",
31
+ "errors": "0",
32
+ "skipped": "0"
33
+ },
34
+ {
35
+ "name": "com.azzapp.rnskv.DecoderWindowTest",
36
+ "tests": "6",
37
+ "failures": "0",
38
+ "errors": "0",
39
+ "skipped": "0"
40
+ },
41
+ {
42
+ "name": "com.azzapp.rnskv.FrameSizeTest",
43
+ "tests": "6",
44
+ "failures": "0",
45
+ "errors": "0",
46
+ "skipped": "0"
47
+ },
48
+ {
49
+ "name": "com.azzapp.rnskv.RgbaBufferAllocatorTest",
50
+ "tests": "3",
51
+ "failures": "0",
52
+ "errors": "0",
53
+ "skipped": "0"
54
+ },
55
+ {
56
+ "name": "com.azzapp.rnskv.RgbaLayoutTest",
57
+ "tests": "4",
58
+ "failures": "0",
59
+ "errors": "0",
60
+ "skipped": "0"
61
+ },
62
+ {
63
+ "name": "com.azzapp.rnskv.SurfaceOutputPolicyTest",
64
+ "tests": "4",
65
+ "failures": "0",
66
+ "errors": "0",
67
+ "skipped": "0"
68
+ }
69
+ ]
70
+ },
71
+ "device": {
72
+ "connectedDevices": [],
73
+ "instrumentationExecuted": false,
74
+ "artGcLifetimeQualified": false,
75
+ "physicalMemoryMeasured": false,
76
+ "performanceMeasured": false,
77
+ "reason": "adb devices -l outside sandbox returned an empty device list"
78
+ },
79
+ "instrumentationInventory": {
80
+ "originalNamedCases": 40,
81
+ "originalExpandedExecutions": 86,
82
+ "totalNamedCases": 44,
83
+ "totalExpandedExecutions": 94
84
+ },
85
+ "artifacts": {
86
+ "debugExampleApk": {
87
+ "path": "example/android/app/build/outputs/apk/debug/app-debug.apk",
88
+ "bytes": 141637563,
89
+ "sha256": "cf03243fda75a606b7d605c9ee62639271e28f808dfc24a1ad19fe6da621df25"
90
+ },
91
+ "unsignedReleaseExampleApk": {
92
+ "path": "example/android/app/build/outputs/apk/release/app-release-unsigned.apk",
93
+ "bytes": 75527115,
94
+ "sha256": "5dea2baefc76eac37673b9569d6b8210eb9273c134dba9e538cea7a8087669bc"
95
+ },
96
+ "debugLibraryAar": {
97
+ "path": "android/build/outputs/aar/react-native-skia-webgpu-video-debug.aar",
98
+ "bytes": 2171988,
99
+ "sha256": "c1500b0022b77898003996a0624235ccccd6adbeb1b5d0afce97de4e6b1d4d64"
100
+ },
101
+ "debugInstrumentationApk": {
102
+ "path": "android/build/outputs/apk/androidTest/debug/react-native-skia-webgpu-video-debug-androidTest.apk",
103
+ "bytes": 34849465,
104
+ "sha256": "ea6cc6b2e31391ae3caa09a3e3a47c22d5a081f12c83983df2a70a9f6de73ea7"
105
+ }
106
+ },
107
+ "sourceFingerprints": {
108
+ "android/.gitignore": "82a757990284a60404e27fcab806bdf856fa077462e62ba6a4421ef4788d1213",
109
+ "android/CMakeLists.txt": "a94f4efdf64fa5bfa2e5939d249e129b28ec8e40a03972631cb04509f1d967db",
110
+ "android/build.gradle": "49e266e4e97013d65b2fa67af56cfffc8a749481a01d8db854ad85d1ce06b495",
111
+ "android/cpp/JNIHelpers.cpp": "a7d8ac2cf3996053b89249d979dd5ec35ced3c9ecce6adb743d63092bf1ac5eb",
112
+ "android/cpp/JNIHelpers.h": "64c9e28dd204f5e028f699115e2501999f0f0f54c8b6560555f9ce06fb16b238",
113
+ "android/cpp/NativeEventDispatcher.cpp": "8c737aa0c825c3c215a210843c19d64be1ba500d909da566e0b3324764b7f1a7",
114
+ "android/cpp/NativeEventDispatcher.h": "c2b59c59ec353c1e3df24f61e0b5b38cd68e9bba634abd4c9f78e120c4a75feb",
115
+ "android/cpp/NativeRgbaBuffer.cpp": "b4d35d925e884fb8c553580559d4b5a115cefed4e08dc6c1d1c337fc22522dc1",
116
+ "android/cpp/NativeRgbaBuffer.h": "efa4a5744db8b5c37a169873bab00264fca25c0765a0cce14a4201030d7a6f47",
117
+ "android/cpp/VideoCapabilities.cpp": "232bf9b1680e6312febe958dbec57eae298667ef3930a56613208f025114087e",
118
+ "android/cpp/VideoCapabilities.h": "0904670d31d7f30b910f87dcf9c08f627095b4f545f1e6525e97c033593951eb",
119
+ "android/cpp/VideoComposition.cpp": "7ff046c04721e75298418afcdb5b1214fc2c69d08ff0cb7b42fc75d543729b2e",
120
+ "android/cpp/VideoComposition.h": "d6c17bd93c319fff49fc0f35c3fa0fe6a72d45fad793e845c682091c5973aa39",
121
+ "android/cpp/VideoCompositionFramesExtractor.cpp": "201b75377cb50e011217355c67f4c15b7570e8dd59e7dd735181962f2adeed52",
122
+ "android/cpp/VideoCompositionFramesExtractor.h": "81fe940205c438db93ce3946ee148337f81452ae52aa9e076152cac691f08c85",
123
+ "android/cpp/VideoCompositionFramesExtractorHostObject.cpp": "2022cf4e98b8bdaec27803181d67ac1bdf92a243d52d0c51967603916a9e9884",
124
+ "android/cpp/VideoCompositionFramesExtractorHostObject.h": "b694c73c9ad6e1b9d3b12cfe86ba178f630136fef6d0524b0b7a4f21b8534797",
125
+ "android/cpp/VideoCompositionFramesExtractorSyncHostObject.cpp": "40483bd59a1a994b249c6097b15a9e1438c515b603f778a92074c57ee3c70d9a",
126
+ "android/cpp/VideoCompositionFramesExtractorSyncHostObject.h": "a63ec691ff0afaae4f841e21a5a8eb000102e4866b36d1ed81951c7743ddeea6",
127
+ "android/cpp/VideoEncoderHostObject.cpp": "974b52256f4a62615915c9640e93898dd48568a1b8ee803ce0087608914515b6",
128
+ "android/cpp/VideoEncoderHostObject.h": "198a34b2bd2ecf60949aaa2c96a0a6373d19b5cfe3f79dd37bc43573044fb109",
129
+ "android/cpp/VideoFrame.cpp": "21dbf9d71a1e67e2adec29d7272725a396f3601f05cb2b5027722118db750320",
130
+ "android/cpp/VideoFrame.h": "60cb67a782df02ff739e88c57fe4ddd44bdfbfc12f83b914bf8f1d8abc0c427c",
131
+ "android/cpp/VideoPlayer.cpp": "0690a25d3d3cb92343602a7086ecf4983ad86acb3f390968282a3833d2a6248b",
132
+ "android/cpp/VideoPlayer.h": "96eb25249a7a00d9a4e596d3aebe0bc2ba918bfb23bdcf13000025707b96087b",
133
+ "android/cpp/VideoPlayerHostObject.cpp": "28b9d1d21b6bfb703904a52eaf7018a77daab0728bcb690bb99d2f3076abe8c3",
134
+ "android/cpp/VideoPlayerHostObject.h": "56c13d55b2d002ffa6b3d7107d7809fc6ff3c01f34fc11e46b17cfc76f2058b0",
135
+ "android/cpp/cpp-adapter.cpp": "301df19a79160cece06471c17214098a1023bbfa58539e29ecf4cc4c997d33ab",
136
+ "android/gradle.properties": "50aa6c7542182523e8c909115d4d3293cf1a2197390df1157baf5b99d0a546cc",
137
+ "android/instrumentation-inventory.json": "edb7f156d2c1b47a783610811b2ea22c20455178cdf26cd73318c542a1074a1e",
138
+ "android/proguard-rules.pro": "45595bd6c70a6e499c52538eefb3aa86acef6d7d8faadb83854f3d5470a2a162",
139
+ "android/scripts/validate.sh": "900810155ea222800e483b10748bb1007c84d34dd8c323c27fb4eb7cc7bba9e8",
140
+ "android/src/androidTest/java/com/azzapp/rnskv/BigMontageTest.java": "642acd18497bc005839cf013716a8e2998cda78815f93334a72c8b4e133242a2",
141
+ "android/src/androidTest/java/com/azzapp/rnskv/CompositionExportTest.java": "d6a01e05b66ef21ba3209020925bd8112760fc5f58b170a70832f5b22d1c02a1",
142
+ "android/src/androidTest/java/com/azzapp/rnskv/CompositionPreviewTest.java": "c36d0248d2a49ba3a5cb26bad01e8367a19a5c5d8d2a3e175e45d115a5c50896",
143
+ "android/src/androidTest/java/com/azzapp/rnskv/Compositions.java": "d1bfd70013000825e4c57c28ccf5ded0efefbaf87eb58cf2638b3e3ecdf79258",
144
+ "android/src/androidTest/java/com/azzapp/rnskv/DirectTextureTest.java": "4f2a9ac2c701d20e08973b6488f5a99d1b55c547a383b84bf45f7e7b31564035",
145
+ "android/src/androidTest/java/com/azzapp/rnskv/EncodeTest.java": "93381c8e9bcefc3c24492b3e215b63d910658e8919c95917426b6912b1d85f0c",
146
+ "android/src/androidTest/java/com/azzapp/rnskv/Export.java": "4b8cd4ba0ef8c395a5acd63a820c27295d6786f657bc5c2106e81c2877910bd1",
147
+ "android/src/androidTest/java/com/azzapp/rnskv/MediaTest.java": "0686b5b91c9c5527cc238ff5e06b65962ee4384be38ce4a421b18210b42528fc",
148
+ "android/src/androidTest/java/com/azzapp/rnskv/NativeRgbaBufferTest.java": "3b5d67b1276d23ffab8ecd7ee96f920fe2794210fb279f4cdd3699cb4424917f",
149
+ "android/src/androidTest/java/com/azzapp/rnskv/OpenFailureTest.java": "57d2ca38520e932cc5bff2c2b36ae5c9ca78720b09576ec63e3a45f66969318e",
150
+ "android/src/androidTest/java/com/azzapp/rnskv/Pixels.java": "cebee44a39dac406547591df1b792626d78c9778f07beca78ff285a63fbc7155",
151
+ "android/src/androidTest/java/com/azzapp/rnskv/Player.java": "320d1665f1920c02d13b7677bf1096f2ede27651a7e45fe30dc1df14206fcc5a",
152
+ "android/src/androidTest/java/com/azzapp/rnskv/PlayerTest.java": "b23f6cd555fbe448fcc1f12f5703f6ffb47a548a26931b52763f811fa38536c8",
153
+ "android/src/androidTest/java/com/azzapp/rnskv/TestVideo.java": "f0ab437d829ed6c6412c76e1a226fd789d006abefb4bc3fd646cb1978ef6c2cc",
154
+ "android/src/main/AndroidManifest.xml": "bfe643676c7bfecf2683b1ad8044a754bc53141c9e4fc6714ad58c1530937b6d",
155
+ "android/src/main/java/com/azzapp/rnskv/AudioCompositionExporter.java": "f88677b933c7a08012190144ccb6cae7672e88b140579b8b7deb65085d3b395a",
156
+ "android/src/main/java/com/azzapp/rnskv/AudioCompositionPlayer.java": "04ea9480a0e4164473e80dc26d06c1c8708942762968138f3d937db5999576f8",
157
+ "android/src/main/java/com/azzapp/rnskv/BufferLifetime.java": "0b7ed28b60dc3480bf1b5e77e6e5a0f93fe35114fc136942a24848da50c3b63a",
158
+ "android/src/main/java/com/azzapp/rnskv/DecodeRequests.java": "18ddabfa8556dce051bb23da16edf45d9e846287bd34c70b6c78eae9c565b153",
159
+ "android/src/main/java/com/azzapp/rnskv/DecoderWindow.java": "c31565ca278342657895d52ae02a79903487f0f19d15c3677ac1b9c942ef0666",
160
+ "android/src/main/java/com/azzapp/rnskv/EGLResourcesHolder.java": "210038c00b747d18ce059b3f90e9dd561b6d0159ffc37e966a0ccedb2658359d",
161
+ "android/src/main/java/com/azzapp/rnskv/EGLUtils.java": "353be2d1bb2c93b74855d84a851e08eb57063626f91f4437e90e99afbc169a44",
162
+ "android/src/main/java/com/azzapp/rnskv/FrameSize.java": "c23b35630e9e9c8a1b45e99c314f35f5a1170df51aa7624eec466e752762b0f7",
163
+ "android/src/main/java/com/azzapp/rnskv/GLFrameExtractor.java": "fac47dcf9c594fdc42f332cc6c49b036c311c65d7bcd73476583d5714c076352",
164
+ "android/src/main/java/com/azzapp/rnskv/JNIHelpers.java": "36a3121f1198b780214a26641c5f9a65221957865d6f03a9e3ea6fe7a8b10a35",
165
+ "android/src/main/java/com/azzapp/rnskv/NativeEventDispatcher.java": "38258ea4e495b0fcf94191592e3a6c116a210c3e227968190adb7ba3b30f2f33",
166
+ "android/src/main/java/com/azzapp/rnskv/NativeRgbaBuffer.java": "fbdbf4f940c039c23458a53a6765643ba0578e5d1ceb3bc3b8b39921500fc133",
167
+ "android/src/main/java/com/azzapp/rnskv/ReactNativeSkiaVideoModule.java": "d80d12f865b1c65b3658a01742c75d47d4ebd3f52d5639b66c8d816641244b7f",
168
+ "android/src/main/java/com/azzapp/rnskv/ReactNativeSkiaVideoPackage.java": "5ee788c23d80111b5582d92fe468fb993181caa93db2f7121c3e287d066ee126",
169
+ "android/src/main/java/com/azzapp/rnskv/ReactNativeSkiaVideoSpec.java": "0e0d5b0f0a78d35894edaf114f119e60625fe792bbb060c73bf3e9c579874963",
170
+ "android/src/main/java/com/azzapp/rnskv/RgbaBufferAllocator.java": "bba2b69614b1be391200a7f51843cdaf59dc0a5e7f3d1d941e5acc634c69ea9e",
171
+ "android/src/main/java/com/azzapp/rnskv/RgbaLayout.java": "8d3809ccfa60993b5c174d52e0a65f61a2ecea3935c6f85464d21a2186d89abc",
172
+ "android/src/main/java/com/azzapp/rnskv/SurfaceOutputPolicy.java": "eba1255a5dbabc93216cbfdeea6f165deed20c5e3347b0f7d6ee9fd6b9a123e8",
173
+ "android/src/main/java/com/azzapp/rnskv/TextureRenderer.java": "c5fd5ee2957b7ad01d7c4a7f285c82fb6338b6dd56e555da7d5ed0d294d2f508",
174
+ "android/src/main/java/com/azzapp/rnskv/TimeHelpers.java": "dc554a6b7cee28f5537bad60aef5b939c911886499fc6aea4cc4bc9cddeae393",
175
+ "android/src/main/java/com/azzapp/rnskv/VideoCapabilities.java": "99ddf5dd614ef48724fba5a84bceab1f54af67ffe802c415e70853d8fcaa1f09",
176
+ "android/src/main/java/com/azzapp/rnskv/VideoComposition.java": "5870bb0aff68ae992da0c02688acb2da16f8e6055f7c62e121e52b94dbf853fd",
177
+ "android/src/main/java/com/azzapp/rnskv/VideoCompositionDecoder.java": "ec1063002784416660f44f4575f68e51e1ec8ab916d9dbe1f30e4273ef348b37",
178
+ "android/src/main/java/com/azzapp/rnskv/VideoCompositionFramesExtractor.java": "3370fddb949f288cf7cacff8cba9759225b5a5061e37b4e14748e838800bf198",
179
+ "android/src/main/java/com/azzapp/rnskv/VideoCompositionFramesExtractorSync.java": "a5500525a9819ce6bd3c493685010bd20f1f36c2ab6aace1f871ea49e94f0b73",
180
+ "android/src/main/java/com/azzapp/rnskv/VideoCompositionItemDecoder.java": "b6017dc7aca7b8a458b8ad47eaeb52f15b3e3438e08bd0f0b1b7d0f5ef91573c",
181
+ "android/src/main/java/com/azzapp/rnskv/VideoEncoder.java": "c0837ac058b9515af87be4188814a617c21f281c2971c5632ee2c6d0190a76e6",
182
+ "android/src/main/java/com/azzapp/rnskv/VideoFrame.java": "cdd0e0c0d4eedf8b2eee487d0ec540535bd76721132f400b265719370262bfb5",
183
+ "android/src/main/java/com/azzapp/rnskv/VideoPlayer.java": "3b5daee2af075711e7da2457e0c8fcbed74a8ad84ae1aeabee937b06caf5c807",
184
+ "android/src/test/java/com/azzapp/rnskv/BufferLifetimeTest.java": "f2428d43ba042b06a852921c36b1b224d2658dead651ceb08e6a54fd369e5829",
185
+ "android/src/test/java/com/azzapp/rnskv/DecodeRequestsTest.java": "ee0b66e24d1b6aa2566cfd30b4b2c3f59a935c81774b0a8d5aba4ddf0d7f4080",
186
+ "android/src/test/java/com/azzapp/rnskv/DecoderWindowTest.java": "ad61801e6356f38d748c4856966aac5da27ef5345c4d274810694e99b05e3d47",
187
+ "android/src/test/java/com/azzapp/rnskv/FrameSizeTest.java": "18bf1bee65d8f6f56d939d80ea9f8c5ddc0e5737e42b65682df30eac735dde4d",
188
+ "android/src/test/java/com/azzapp/rnskv/RgbaBufferAllocatorTest.java": "bd1dacf9a2205ae858f6ef08f29152d9e0d8e3dcf2ebe182c4716f1aa34e59e9",
189
+ "android/src/test/java/com/azzapp/rnskv/RgbaLayoutTest.java": "2903e8f370f5c4e064cf4ba15136c28f2e2d02f4d8e61e2f5809cd0472faa970",
190
+ "android/src/test/java/com/azzapp/rnskv/SurfaceOutputPolicyTest.java": "05be25567eda27bddfdcd009277277b1965d6fb1e661a0e9493bdf59dd8efee9",
191
+ "example/App.tsx": "2b145607ebdee278ef51f1f39bc6ee05b1e464703067ca9c2592760366e8b1ce",
192
+ "example/android/.gitignore": "82a757990284a60404e27fcab806bdf856fa077462e62ba6a4421ef4788d1213",
193
+ "example/android/app/build.gradle": "8dbb532d236ec033f67d3ce4fa5b30487d7d82ac7778f3beea4502122be259af",
194
+ "example/android/app/src/main/AndroidManifest.xml": "30e52ba5b6a76841fbaa91170d082b3610ebfde42c859f812ca10798a87669bf",
195
+ "example/android/app/src/main/java/com/skiawebgpuvideo/tests/MainActivity.kt": "fd82d57d0bfb9de61db1d93b04033f7ddc0019d7293013c8b8a7510015aad47e",
196
+ "example/android/app/src/main/java/com/skiawebgpuvideo/tests/MainApplication.kt": "9538b053c585b907985bbd0fd66590f47865149f593a99f1516defba729a584f",
197
+ "example/android/app/src/main/java/com/skiawebgpuvideo/tests/VideoBenchmarkHarness.kt": "f655cba0882ef700f044dc44b044752a3bd88c71f63211bb9afc3716d316a903",
198
+ "example/android/app/src/main/java/com/skiawebgpuvideo/tests/VideoBenchmarkPackage.kt": "32266ee7f6ad8d72a6c9e36b202f510cbb8688ccc63d7766ce742e3f5b7ae9b3",
199
+ "example/android/app/src/main/res/values/styles.xml": "d2fc968e7a52a12eb29acd07cd4c47d0ae73d4698ec69addf61b34f2690f6d1d",
200
+ "example/android/build.gradle": "5e6f23062f98c3c12e4e159c44f4b0a995acbd0683dd0d2f6fe64fbae8ce98c7",
201
+ "example/android/gradle/wrapper/gradle-wrapper.jar": "b3a875ddc1f044746e1b1a55f645584505f4a10438c1afea9f15e92a7c42ec13",
202
+ "example/android/gradle/wrapper/gradle-wrapper.properties": "a180163249c7252412ddaee1c7adcf59f6494b1183136f690fbd9a3b8aaed00e",
203
+ "example/android/gradle.properties": "9cb899438f2cf009a00f6e79525055dfda766b15db7ebbe0d64741f879e34d14",
204
+ "example/android/gradlew": "fb68debc1b1acf8ec55dc0d5e5495e1dedd0bd6b61f304bee61613eeb2bd9b92",
205
+ "example/android/gradlew.bat": "fedad02c18e266ec094995a5751b7fe1eb6e74f66bf75db64fae2e50eb22c234",
206
+ "example/android/settings.gradle": "86c493b95c4f5b242390d55ea57d59140db6926bb841775b06dd226f1eef7196"
207
+ },
208
+ "instrumentationPackagedNativeLibraries": [],
209
+ "releaseApkContainsHermesBundle": true,
210
+ "releaseApkAbis": [
211
+ "arm64-v8a"
212
+ ],
213
+ "initialCheckpointScope": "Historical build-only evidence at 08:59 UTC; initial artifact hashes remain unchanged.",
214
+ "followUp": {
215
+ "recordedAt": "2026-10-07T15:01:33.805760+00:00",
216
+ "deviceReport": "../benchmark/android-device-306-verification.json",
217
+ "humanReport": "../docs/ANDROID_DEVICE_306.md",
218
+ "currentHostTests": {
219
+ "jvm": 43,
220
+ "failures": 0,
221
+ "errors": 0,
222
+ "skipped": 0,
223
+ "nativeFrameLease": 6,
224
+ "nativeSanitizers": [
225
+ "address",
226
+ "undefined"
227
+ ]
228
+ },
229
+ "currentInventory": {
230
+ "namedCases": 52,
231
+ "plannedExecutions": 102,
232
+ "fullSuitePassed": false
233
+ },
234
+ "scopedCopyCheckpoint": {
235
+ "apkSha256": "789735e095937cc168865986a353613d29f065feeff40bca8676ab0895b2ef0a",
236
+ "sourceSnapshotSha256": "0a842f1f6f02ca4bb6f274050adcb15897b2cbc78aa76770b1aa94171ccfca3f",
237
+ "physicalTrial": "8 operations completed; 0 strict cleanup passes",
238
+ "copyCountBeforeSkia": 1,
239
+ "zeroCopy": false
240
+ },
241
+ "ahbCheckpoint": {
242
+ "apkSha256": "59afb795cfc9fe86d5bbbbaaa487cf0129130dd6538d0f5faf5d6bc11a6edbfa",
243
+ "sourceSnapshotSha256": "35c1f59a69c1a2d6cb04170fed083e3c6f81c51cd94efc35a490181cdd06ee43",
244
+ "bundleSha256": "4e02a04173fd471cd93520ee2b90ff2d3f0bda589649bd791ac1bbda0454e178",
245
+ "nativeLibrarySha256": "8a5cb7606f82bd829cda52e62644d0152844e7d37ab8bd4273ac425b449772e6",
246
+ "instrumentationApkSha256": "81aa5c0fc0ea43bbb3296c6380b8a9d55a5d51931e41c46d456c2e9bd680a34d",
247
+ "build": "Release APK, library Release AAR, Debug instrumentation APK; BUILD SUCCESSFUL",
248
+ "hostJvmTests": 43,
249
+ "nativeOwnershipTests": 6,
250
+ "nativeOwnershipPassed": 6,
251
+ "nativeOwnershipSkipped": 0,
252
+ "pixelOracleCases": 10,
253
+ "pixelOraclePassed": 10,
254
+ "performanceQualification": "24/24 strict focused workload passes; full instrumentation suite not qualified",
255
+ "decodeCpuReadback": false,
256
+ "zeroCopyClaim": false,
257
+ "lifecycleCasesPassed": 4,
258
+ "nativeCpuOwnershipTests": 5,
259
+ "nativeCpuOwnershipPassed": 5
260
+ }
261
+ }
262
+ }
@@ -0,0 +1,185 @@
1
+ buildscript {
2
+ repositories {
3
+ maven {
4
+ url "https://plugins.gradle.org/m2/"
5
+ }
6
+ google()
7
+ mavenCentral()
8
+ }
9
+
10
+ dependencies {
11
+ classpath("com.android.tools.build:gradle")
12
+ classpath("com.facebook.react:react-native-gradle-plugin")
13
+ }
14
+ }
15
+
16
+ apply plugin: "com.android.library"
17
+ apply plugin: "com.facebook.react"
18
+
19
+
20
+ import java.nio.file.Paths
21
+
22
+ static def findNodeModules(baseDir) {
23
+ def basePath = baseDir.toPath().normalize()
24
+ // Node's module resolution algorithm searches up to the root directory,
25
+ // after which the base path will be null
26
+ while (basePath) {
27
+ def nodeModulesPath = Paths.get(basePath.toString(), "node_modules")
28
+ def reactNativePath = Paths.get(nodeModulesPath.toString(), "react-native")
29
+ if (nodeModulesPath.toFile().exists() && reactNativePath.toFile().exists()) {
30
+ return nodeModulesPath.toString()
31
+ }
32
+ basePath = basePath.getParent()
33
+ }
34
+ throw new GradleException("React-Native-Skia-Video: Failed to find node_modules/ path!")
35
+ }
36
+
37
+ def nodeModules = findNodeModules(projectDir)
38
+ logger.warn("react-native-skia-video: node_modules/ found at: ${nodeModules}")
39
+
40
+ def buildType = "debug"
41
+ tasks.all({ task ->
42
+ if (task.name == "buildCMakeRelease") {
43
+ buildType = "release"
44
+ }
45
+ })
46
+
47
+ def getExtOrDefault(name) {
48
+ return rootProject.ext.has(name) ? rootProject.ext.get(name) : project.properties["ReactNativeSkiaVideo_" + name]
49
+ }
50
+
51
+ def getExtOrIntegerDefault(name) {
52
+ return rootProject.ext.has(name) ? rootProject.ext.get(name) : (project.properties["ReactNativeSkiaVideo_" + name]).toInteger()
53
+ }
54
+
55
+ def reactNativeArchitectures() {
56
+ def value = project.getProperties().get("reactNativeArchitectures")
57
+ return value ? value.split(",") : ["armeabi-v7a", "x86", "x86_64", "arm64-v8a"]
58
+ }
59
+
60
+ android {
61
+ namespace "com.azzapp.rnskv"
62
+
63
+ ndkVersion getExtOrDefault("ndkVersion")
64
+ compileSdkVersion getExtOrIntegerDefault("compileSdkVersion")
65
+ if (getExtOrIntegerDefault("minSdkVersion") < 28) {
66
+ throw new GradleException("Skia WebGPU Video requires Android API 28 or newer; the consuming app minSdkVersion is lower")
67
+ }
68
+
69
+ defaultConfig {
70
+ minSdkVersion getExtOrIntegerDefault("minSdkVersion")
71
+ targetSdkVersion getExtOrIntegerDefault("targetSdkVersion")
72
+ consumerProguardFiles "proguard-rules.pro"
73
+ testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
74
+
75
+ externalNativeBuild {
76
+ cmake {
77
+ cppFlags "-O2 -frtti -fexceptions -Wall -fstack-protector-all"
78
+ arguments "-DANDROID_STL=c++_shared",
79
+ "-DNODE_MODULES_DIR=${nodeModules}",
80
+ "-DBUILD_TYPE=${buildType}"
81
+ abiFilters (*reactNativeArchitectures())
82
+ }
83
+ }
84
+ }
85
+
86
+ externalNativeBuild {
87
+ cmake {
88
+ path "CMakeLists.txt"
89
+ }
90
+ }
91
+
92
+ packagingOptions {
93
+ doNotStrip buildType == 'debug' ? "**/**/*.so" : ''
94
+ excludes = [
95
+ "META-INF",
96
+ "META-INF/**",
97
+ "**/libc++_shared.so",
98
+ "**/libfbjni.so",
99
+ "**/libjsi.so",
100
+ "**/libfolly_json.so",
101
+ "**/libfolly_runtime.so",
102
+ "**/libglog.so",
103
+ "**/libhermes.so",
104
+ "**/libhermes-executor-debug.so",
105
+ "**/libhermes_executor.so",
106
+ "**/libreactnative.so",
107
+ "**/libreactnativejni.so",
108
+ "**/libturbomodulejsijni.so",
109
+ "**/libreact_nativemodule_core.so",
110
+ "**/libjscexecutor.so",
111
+ "**/libruntimeexecutor.so"
112
+ ]
113
+ }
114
+
115
+ buildFeatures {
116
+ buildConfig true
117
+ prefab true
118
+ }
119
+
120
+ buildTypes {
121
+ release {
122
+ minifyEnabled false
123
+ }
124
+ }
125
+
126
+ lintOptions {
127
+ disable "GradleCompatible"
128
+ }
129
+
130
+ compileOptions {
131
+ sourceCompatibility JavaVersion.VERSION_17
132
+ targetCompatibility JavaVersion.VERSION_17
133
+ }
134
+
135
+ sourceSets {
136
+ main {
137
+ java.srcDirs += ["${project.buildDir}/generated/source/codegen/java"]
138
+ }
139
+ }
140
+ }
141
+
142
+ repositories {
143
+ mavenCentral()
144
+ google()
145
+ }
146
+
147
+ def MEDIA3_VERSION = "1.10.1"
148
+ dependencies {
149
+ implementation 'com.facebook.react:react-android:+'
150
+ implementation "androidx.media3:media3-exoplayer:${MEDIA3_VERSION}"
151
+ implementation "androidx.media3:media3-datasource:${MEDIA3_VERSION}"
152
+ implementation "androidx.media3:media3-exoplayer-hls:${MEDIA3_VERSION}"
153
+ testImplementation "junit:junit:4.13.2"
154
+ androidTestImplementation "androidx.test:runner:1.6.2"
155
+ androidTestImplementation "androidx.test.ext:junit:1.2.1"
156
+ }
157
+
158
+ tasks.whenTaskAdded { task ->
159
+ if (task.name.contains("configureCMakeDebug")) {
160
+ rootProject.getTasksByName("packageReactNdkDebugLibs", true).forEach {
161
+ task.dependsOn(it)
162
+ }
163
+ }
164
+
165
+ if (task.name.contains("configureCMakeRel")) {
166
+ rootProject.getTasksByName("packageReactNdkReleaseLibs", true).forEach {
167
+ task.dependsOn(it)
168
+ }
169
+ }
170
+ }
171
+
172
+ react {
173
+ jsRootDir = file("../src/")
174
+ libraryName = "ReactNativeSkiaVideo"
175
+ codegenJavaPackageName = "com.azzapp.rnskv"
176
+ }
177
+
178
+ // A library's device tests run in their own APK, without a consuming RN app.
179
+ // Keep transitive JNI dependencies there while the published AAR still excludes them.
180
+ androidComponents.onVariants(androidComponents.selector().all()) { variant ->
181
+ if (variant.androidTest != null) {
182
+ def unsupportedAbis = ["arm64-v8a", "armeabi-v7a", "x86", "x86_64"] - reactNativeArchitectures().toList()
183
+ variant.androidTest.packaging.jniLibs.excludes.set(unsupportedAbis.collect { "**/${it}/*.so" })
184
+ }
185
+ }