Skip to content

Conversation

@hannojg
Copy link
Contributor

@hannojg hannojg commented Jan 16, 2026

Summary:

Fixes crashes using component on android with props 2.0 enabled using feature flag:

enablePropsUpdateReconciliationAndroid
Crash stack
Error while updating prop source
java.lang.reflect.InvocationTargetException
	at java.lang.reflect.Method.invoke(Native Method)
	at G0.a.q(r8-map-id-1a92cc952529f7daea85f71c4ad30656f52b60c3e338ced74ff1293d461ae7b1:89)
	at com.facebook.react.uimanager.ViewManager.updateProperties(r8-map-id-1a92cc952529f7daea85f71c4ad30656f52b60c3e338ced74ff1293d461ae7b1:33)
	at com.facebook.react.uimanager.ViewManager.createViewInstance(r8-map-id-1a92cc952529f7daea85f71c4ad30656f52b60c3e338ced74ff1293d461ae7b1:12)
	at com.facebook.react.uimanager.ViewManager.createView(r8-map-id-1a92cc952529f7daea85f71c4ad30656f52b60c3e338ced74ff1293d461ae7b1:1)
	at q1.h.b(r8-map-id-1a92cc952529f7daea85f71c4ad30656f52b60c3e338ced74ff1293d461ae7b1:62)
	at r1.g.execute(r8-map-id-1a92cc952529f7daea85f71c4ad30656f52b60c3e338ced74ff1293d461ae7b1:67)
	at q1.b.d(r8-map-id-1a92cc952529f7daea85f71c4ad30656f52b60c3e338ced74ff1293d461ae7b1:71)
	at q1.b.c(r8-map-id-1a92cc952529f7daea85f71c4ad30656f52b60c3e338ced74ff1293d461ae7b1:64)
	at m1.j.a(r8-map-id-1a92cc952529f7daea85f71c4ad30656f52b60c3e338ced74ff1293d461ae7b1:100)
	at com.facebook.react.uimanager.d.doFrame(r8-map-id-1a92cc952529f7daea85f71c4ad30656f52b60c3e338ced74ff1293d461ae7b1:1)
	at E1.o.doFrame(r8-map-id-1a92cc952529f7daea85f71c4ad30656f52b60c3e338ced74ff1293d461ae7b1:98)
	at android.view.Choreographer$CallbackRecord.run(Choreographer.java:2457)
	at android.view.Choreographer$CallbackRecord.run(Choreographer.java:2468)
	at android.view.Choreographer.doCallbacks(Choreographer.java:1693)
	at android.view.Choreographer.doAnimationLoad(Choreographer.java:1523)
	at android.view.Choreographer.doFrame(Choreographer.java:1438)
	at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:2284)
	at android.os.Handler.handleCallback(Handler.java:1014)
	at android.os.Handler.dispatchMessage(Handler.java:102)
	at android.os.Looper.loopOnce(Looper.java:250)
	at android.os.Looper.loop(Looper.java:340)
	at android.app.ActivityThread.main(ActivityThread.java:9911)
	at java.lang.reflect.Method.invoke(Native Method)
	at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:621)
	at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:957)
Caused by: com.facebook.react.bridge.NoSuchKeyException: width
	at com.facebook.react.bridge.ReadableNativeMap.getValue(r8-map-id-1a92cc952529f7daea85f71c4ad30656f52b60c3e338ced74ff1293d461ae7b1:3)
	at com.facebook.react.bridge.ReadableNativeMap.getDouble(r8-map-id-1a92cc952529f7daea85f71c4ad30656f52b60c3e338ced74ff1293d461ae7b1:6)
	at r2.l.setSource(r8-map-id-1a92cc952529f7daea85f71c4ad30656f52b60c3e338ced74ff1293d461ae7b1:143)
	at com.facebook.react.views.image.ReactImageManager.setSource(r8-map-id-1a92cc952529f7daea85f71c4ad30656f52b60c3e338ced74ff1293d461ae7b1:6)
	at java.lang.reflect.Method.invoke(Native Method) 
	at G0.a.q(r8-map-id-1a92cc952529f7daea85f71c4ad30656f52b60c3e338ced74ff1293d461ae7b1:89) 
	at com.facebook.react.uimanager.ViewManager.updateProperties(r8-map-id-1a92cc952529f7daea85f71c4ad30656f52b60c3e338ced74ff1293d461ae7b1:33) 
	at com.facebook.react.uimanager.ViewManager.createViewInstance(r8-map-id-1a92cc952529f7daea85f71c4ad30656f52b60c3e338ced74ff1293d461ae7b1:12) 
	at com.facebook.react.uimanager.ViewManager.createView(r8-map-id-1a92cc952529f7daea85f71c4ad30656f52b60c3e338ced74ff1293d461ae7b1:1) 
	at q1.h.b(r8-map-id-1a92cc952529f7daea85f71c4ad30656f52b60c3e338ced74ff1293d461ae7b1:62) 
	at r1.g.execute(r8-map-id-1a92cc952529f7daea85f71c4ad30656f52b60c3e338ced74ff1293d461ae7b1:67) 
	at q1.b.d(r8-map-id-1a92cc952529f7daea85f71c4ad30656f52b60c3e338ced74ff1293d461ae7b1:71) 
	at q1.b.c(r8-map-id-1a92cc952529f7daea85f71c4ad30656f52b60c3e338ced74ff1293d461ae7b1:64) 
	at m1.j.a(r8-map-id-1a92cc952529f7daea85f71c4ad30656f52b60c3e338ced74ff1293d461ae7b1:100) 
	at com.facebook.react.uimanager.d.doFrame(r8-map-id-1a92cc952529f7daea85f71c4ad30656f52b60c3e338ced74ff1293d461ae7b1:1) 
	at E1.o.doFrame(r8-map-id-1a92cc952529f7daea85f71c4ad30656f52b60c3e338ced74ff1293d461ae7b1:98) 
	at android.view.Choreographer$CallbackRecord.run(Choreographer.java:2457) 
	at android.view.Choreographer$CallbackRecord.run(Choreographer.java:2468) 
	at android.view.Choreographer.doCallbacks(Choreographer.java:1693) 
	at android.view.Choreographer.doAnimationLoad(Choreographer.java:1523) 
	at android.view.Choreographer.doFrame(Choreographer.java:1438) 
	at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:2284) 
	at android.os.Handler.handleCallback(Handler.java:1014) 
	at android.os.Handler.dispatchMessage(Handler.java:102) 
	at android.os.Looper.loopOnce(Looper.java:250) 
	at android.os.Looper.loop(Looper.java:340) 
	at android.app.ActivityThread.main(ActivityThread.java:9911) 
	at java.lang.reflect.Method.invoke(Native Method) 
	at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:621) 
	at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:957) 
Exception thrown when executing UIFrameGuarded
com.facebook.react.bridge.JSApplicationIllegalArgumentException: Error while updating property 'source' of a view managed by: RCTImageView
	at G0.a.q(r8-map-id-1a92cc952529f7daea85f71c4ad30656f52b60c3e338ced74ff1293d461ae7b1:144)
	at com.facebook.react.uimanager.ViewManager.updateProperties(r8-map-id-1a92cc952529f7daea85f71c4ad30656f52b60c3e338ced74ff1293d461ae7b1:33)
	at com.facebook.react.uimanager.ViewManager.createViewInstance(r8-map-id-1a92cc952529f7daea85f71c4ad30656f52b60c3e338ced74ff1293d461ae7b1:12)
	at com.facebook.react.uimanager.ViewManager.createView(r8-map-id-1a92cc952529f7daea85f71c4ad30656f52b60c3e338ced74ff1293d461ae7b1:1)
	at q1.h.b(r8-map-id-1a92cc952529f7daea85f71c4ad30656f52b60c3e338ced74ff1293d461ae7b1:62)
	at r1.g.execute(r8-map-id-1a92cc952529f7daea85f71c4ad30656f52b60c3e338ced74ff1293d461ae7b1:67)
	at q1.b.d(r8-map-id-1a92cc952529f7daea85f71c4ad30656f52b60c3e338ced74ff1293d461ae7b1:71)
	at q1.b.c(r8-map-id-1a92cc952529f7daea85f71c4ad30656f52b60c3e338ced74ff1293d461ae7b1:64)
	at m1.j.a(r8-map-id-1a92cc952529f7daea85f71c4ad30656f52b60c3e338ced74ff1293d461ae7b1:100)
	at com.facebook.react.uimanager.d.doFrame(r8-map-id-1a92cc952529f7daea85f71c4ad30656f52b60c3e338ced74ff1293d461ae7b1:1)
	at E1.o.doFrame(r8-map-id-1a92cc952529f7daea85f71c4ad30656f52b60c3e338ced74ff1293d461ae7b1:98)
	at android.view.Choreographer$CallbackRecord.run(Choreographer.java:2457)
	at android.view.Choreographer$CallbackRecord.run(Choreographer.java:2468)
	at android.view.Choreographer.doCallbacks(Choreographer.java:1693)
	at android.view.Choreographer.doAnimationLoad(Choreographer.java:1523)
	at android.view.Choreographer.doFrame(Choreographer.java:1438)
	at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:2284)
	at android.os.Handler.handleCallback(Handler.java:1014)
	at android.os.Handler.dispatchMessage(Handler.java:102)
	at android.os.Looper.loopOnce(Looper.java:250)
	at android.os.Looper.loop(Looper.java:340)
	at android.app.ActivityThread.main(ActivityThread.java:9911)
	at java.lang.reflect.Method.invoke(Native Method)
	at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:621)
	at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:957)
Caused by: java.lang.reflect.InvocationTargetException
	at java.lang.reflect.Method.invoke(Native Method)
	at G0.a.q(r8-map-id-1a92cc952529f7daea85f71c4ad30656f52b60c3e338ced74ff1293d461ae7b1:89)
	at com.facebook.react.uimanager.ViewManager.updateProperties(r8-map-id-1a92cc952529f7daea85f71c4ad30656f52b60c3e338ced74ff1293d461ae7b1:33) 
	at com.facebook.react.uimanager.ViewManager.createViewInstance(r8-map-id-1a92cc952529f7daea85f71c4ad30656f52b60c3e338ced74ff1293d461ae7b1:12) 
	at com.facebook.react.uimanager.ViewManager.createView(r8-map-id-1a92cc952529f7daea85f71c4ad30656f52b60c3e338ced74ff1293d461ae7b1:1) 
	at q1.h.b(r8-map-id-1a92cc952529f7daea85f71c4ad30656f52b60c3e338ced74ff1293d461ae7b1:62) 
	at r1.g.execute(r8-map-id-1a92cc952529f7daea85f71c4ad30656f52b60c3e338ced74ff1293d461ae7b1:67) 
	at q1.b.d(r8-map-id-1a92cc952529f7daea85f71c4ad30656f52b60c3e338ced74ff1293d461ae7b1:71) 
	at q1.b.c(r8-map-id-1a92cc952529f7daea85f71c4ad30656f52b60c3e338ced74ff1293d461ae7b1:64) 
	at m1.j.a(r8-map-id-1a92cc952529f7daea85f71c4ad30656f52b60c3e338ced74ff1293d461ae7b1:100) 
	at com.facebook.react.uimanager.d.doFrame(r8-map-id-1a92cc952529f7daea85f71c4ad30656f52b60c3e338ced74ff1293d461ae7b1:1) 
	at E1.o.doFrame(r8-map-id-1a92cc952529f7daea85f71c4ad30656f52b60c3e338ced74ff1293d461ae7b1:98) 
	at android.view.Choreographer$CallbackRecord.run(Choreographer.java:2457) 
	at android.view.Choreographer$CallbackRecord.run(Choreographer.java:2468) 
	at android.view.Choreographer.doCallbacks(Choreographer.java:1693) 
	at android.view.Choreographer.doAnimationLoad(Choreographer.java:1523) 
	at android.view.Choreographer.doFrame(Choreographer.java:1438) 
	at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:2284) 
	at android.os.Handler.handleCallback(Handler.java:1014) 
	at android.os.Handler.dispatchMessage(Handler.java:102) 
	at android.os.Looper.loopOnce(Looper.java:250) 
	at android.os.Looper.loop(Looper.java:340) 
	at android.app.ActivityThread.main(ActivityThread.java:9911) 
	at java.lang.reflect.Method.invoke(Native Method) 
	at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:621) 
	at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:957) 
Caused by: com.facebook.react.bridge.NoSuchKeyException: width
	at com.facebook.react.bridge.ReadableNativeMap.getValue(r8-map-id-1a92cc952529f7daea85f71c4ad30656f52b60c3e338ced74ff1293d461ae7b1:3)
	at com.facebook.react.bridge.ReadableNativeMap.getDouble(r8-map-id-1a92cc952529f7daea85f71c4ad30656f52b60c3e338ced74ff1293d461ae7b1:6)
	at r2.l.setSource(r8-map-id-1a92cc952529f7daea85f71c4ad30656f52b60c3e338ced74ff1293d461ae7b1:143)
	at com.facebook.react.views.image.ReactImageManager.setSource(r8-map-id-1a92cc952529f7daea85f71c4ad30656f52b60c3e338ced74ff1293d461ae7b1:6)
	at java.lang.reflect.Method.invoke(Native Method) 
	at G0.a.q(r8-map-id-1a92cc952529f7daea85f71c4ad30656f52b60c3e338ced74ff1293d461ae7b1:89) 
	at com.facebook.react.uimanager.ViewManager.updateProperties(r8-map-id-1a92cc952529f7daea85f71c4ad30656f52b60c3e338ced74ff1293d461ae7b1:33) 
	at com.facebook.react.uimanager.ViewManager.createViewInstance(r8-map-id-1a92cc952529f7daea85f71c4ad30656f52b60c3e338ced74ff1293d461ae7b1:12) 
	at com.facebook.react.uimanager.ViewManager.createView(r8-map-id-1a92cc952529f7daea85f71c4ad30656f52b60c3e338ced74ff1293d461ae7b1:1) 
	at q1.h.b(r8-map-id-1a92cc952529f7daea85f71c4ad30656f52b60c3e338ced74ff1293d461ae7b1:62) 
	at r1.g.execute(r8-map-id-1a92cc952529f7daea85f71c4ad30656f52b60c3e338ced74ff1293d461ae7b1:67) 
	at q1.b.d(r8-map-id-1a92cc952529f7daea85f71c4ad30656f52b60c3e338ced74ff1293d461ae7b1:71) 
	at q1.b.c(r8-map-id-1a92cc952529f7daea85f71c4ad30656f52b60c3e338ced74ff1293d461ae7b1:64) 
	at m1.j.a(r8-map-id-1a92cc952529f7daea85f71c4ad30656f52b60c3e338ced74ff1293d461ae7b1:100) 
	at com.facebook.react.uimanager.d.doFrame(r8-map-id-1a92cc952529f7daea85f71c4ad30656f52b60c3e338ced74ff1293d461ae7b1:1) 
	at E1.o.doFrame(r8-map-id-1a92cc952529f7daea85f71c4ad30656f52b60c3e338ced74ff1293d461ae7b1:98) 
	at android.view.Choreographer$CallbackRecord.run(Choreographer.java:2457) 
	at android.view.Choreographer$CallbackRecord.run(Choreographer.java:2468) 
	at android.view.Choreographer.doCallbacks(Choreographer.java:1693) 
	at android.view.Choreographer.doAnimationLoad(Choreographer.java:1523) 
	at android.view.Choreographer.doFrame(Choreographer.java:1438) 
	at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:2284) 
	at android.os.Handler.handleCallback(Handler.java:1014) 
	at android.os.Handler.dispatchMessage(Handler.java:102) 
	at android.os.Looper.loopOnce(Looper.java:250) 
	at android.os.Looper.loop(Looper.java:340) 
	at android.app.ActivityThread.main(ActivityThread.java:9911) 
	at java.lang.reflect.Method.invoke(Native Method) 
	at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:621) 
	at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:957) 
ReactHost{0}.handleHostException(message = "Error while updating property 'source' of a view managed by: RCTImageView")
Shutting down VM
FATAL EXCEPTION: main
Process: com.facebook.react.uiapp, PID: 23676
com.facebook.react.bridge.JSApplicationIllegalArgumentException: Error while updating property 'source' of a view managed by: RCTImageView
	at G0.a.q(r8-map-id-1a92cc952529f7daea85f71c4ad30656f52b60c3e338ced74ff1293d461ae7b1:144)
	at com.facebook.react.uimanager.ViewManager.updateProperties(r8-map-id-1a92cc952529f7daea85f71c4ad30656f52b60c3e338ced74ff1293d461ae7b1:33)
	at com.facebook.react.uimanager.ViewManager.createViewInstance(r8-map-id-1a92cc952529f7daea85f71c4ad30656f52b60c3e338ced74ff1293d461ae7b1:12)
	at com.facebook.react.uimanager.ViewManager.createView(r8-map-id-1a92cc952529f7daea85f71c4ad30656f52b60c3e338ced74ff1293d461ae7b1:1)
	at q1.h.b(r8-map-id-1a92cc952529f7daea85f71c4ad30656f52b60c3e338ced74ff1293d461ae7b1:62)
	at r1.g.execute(r8-map-id-1a92cc952529f7daea85f71c4ad30656f52b60c3e338ced74ff1293d461ae7b1:67)
	at q1.b.d(r8-map-id-1a92cc952529f7daea85f71c4ad30656f52b60c3e338ced74ff1293d461ae7b1:71)
	at q1.b.c(r8-map-id-1a92cc952529f7daea85f71c4ad30656f52b60c3e338ced74ff1293d461ae7b1:64)
	at m1.j.a(r8-map-id-1a92cc952529f7daea85f71c4ad30656f52b60c3e338ced74ff1293d461ae7b1:100)
	at com.facebook.react.uimanager.d.doFrame(r8-map-id-1a92cc952529f7daea85f71c4ad30656f52b60c3e338ced74ff1293d461ae7b1:1)
	at E1.o.doFrame(r8-map-id-1a92cc952529f7daea85f71c4ad30656f52b60c3e338ced74ff1293d461ae7b1:98)
	at android.view.Choreographer$CallbackRecord.run(Choreographer.java:2457)
	at android.view.Choreographer$CallbackRecord.run(Choreographer.java:2468)
	at android.view.Choreographer.doCallbacks(Choreographer.java:1693)
	at android.view.Choreographer.doAnimationLoad(Choreographer.java:1523)
	at android.view.Choreographer.doFrame(Choreographer.java:1438)
	at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:2284)
	at android.os.Handler.handleCallback(Handler.java:1014)
	at android.os.Handler.dispatchMessage(Handler.java:102)
	at android.os.Looper.loopOnce(Looper.java:250)
	at android.os.Looper.loop(Looper.java:340)
	at android.app.ActivityThread.main(ActivityThread.java:9911)
	at java.lang.reflect.Method.invoke(Native Method)
	at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:621)
	at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:957)
Caused by: java.lang.reflect.InvocationTargetException
	at java.lang.reflect.Method.invoke(Native Method)
	at G0.a.q(r8-map-id-1a92cc952529f7daea85f71c4ad30656f52b60c3e338ced74ff1293d461ae7b1:89)
	at com.facebook.react.uimanager.ViewManager.updateProperties(r8-map-id-1a92cc952529f7daea85f71c4ad30656f52b60c3e338ced74ff1293d461ae7b1:33) 
	at com.facebook.react.uimanager.ViewManager.createViewInstance(r8-map-id-1a92cc952529f7daea85f71c4ad30656f52b60c3e338ced74ff1293d461ae7b1:12) 
	at com.facebook.react.uimanager.ViewManager.createView(r8-map-id-1a92cc952529f7daea85f71c4ad30656f52b60c3e338ced74ff1293d461ae7b1:1) 
	at q1.h.b(r8-map-id-1a92cc952529f7daea85f71c4ad30656f52b60c3e338ced74ff1293d461ae7b1:62) 
	at r1.g.execute(r8-map-id-1a92cc952529f7daea85f71c4ad30656f52b60c3e338ced74ff1293d461ae7b1:67) 
	at q1.b.d(r8-map-id-1a92cc952529f7daea85f71c4ad30656f52b60c3e338ced74ff1293d461ae7b1:71) 
	at q1.b.c(r8-map-id-1a92cc952529f7daea85f71c4ad30656f52b60c3e338ced74ff1293d461ae7b1:64) 
	at m1.j.a(r8-map-id-1a92cc952529f7daea85f71c4ad30656f52b60c3e338ced74ff1293d461ae7b1:100) 
	at com.facebook.react.uimanager.d.doFrame(r8-map-id-1a92cc952529f7daea85f71c4ad30656f52b60c3e338ced74ff1293d461ae7b1:1) 
	at E1.o.doFrame(r8-map-id-1a92cc952529f7daea85f71c4ad30656f52b60c3e338ced74ff1293d461ae7b1:98) 
	at android.view.Choreographer$CallbackRecord.run(Choreographer.java:2457) 
	at android.view.Choreographer$CallbackRecord.run(Choreographer.java:2468) 
	at android.view.Choreographer.doCallbacks(Choreographer.java:1693) 
	at android.view.Choreographer.doAnimationLoad(Choreographer.java:1523) 
	at android.view.Choreographer.doFrame(Choreographer.java:1438) 
	at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:2284) 
	at android.os.Handler.handleCallback(Handler.java:1014) 
	at android.os.Handler.dispatchMessage(Handler.java:102) 
	at android.os.Looper.loopOnce(Looper.java:250) 
	at android.os.Looper.loop(Looper.java:340) 
	at android.app.ActivityThread.main(ActivityThread.java:9911) 
	at java.lang.reflect.Method.invoke(Native Method) 
	at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:621) 
	at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:957) 
Caused by: com.facebook.react.bridge.NoSuchKeyException: width
	at com.facebook.react.bridge.ReadableNativeMap.getValue(r8-map-id-1a92cc952529f7daea85f71c4ad30656f52b60c3e338ced74ff1293d461ae7b1:3)
	at com.facebook.react.bridge.ReadableNativeMap.getDouble(r8-map-id-1a92cc952529f7daea85f71c4ad30656f52b60c3e338ced74ff1293d461ae7b1:6)
	at r2.l.setSource(r8-map-id-1a92cc952529f7daea85f71c4ad30656f52b60c3e338ced74ff1293d461ae7b1:143)
	at com.facebook.react.views.image.ReactImageManager.setSource(r8-map-id-1a92cc952529f7daea85f71c4ad30656f52b60c3e338ced74ff1293d461ae7b1:6)
	at java.lang.reflect.Method.invoke(Native Method) 
	at G0.a.q(r8-map-id-1a92cc952529f7daea85f71c4ad30656f52b60c3e338ced74ff1293d461ae7b1:89) 
	at com.facebook.react.uimanager.ViewManager.updateProperties(r8-map-id-1a92cc952529f7daea85f71c4ad30656f52b60c3e338ced74ff1293d461ae7b1:33) 
	at com.facebook.react.uimanager.ViewManager.createViewInstance(r8-map-id-1a92cc952529f7daea85f71c4ad30656f52b60c3e338ced74ff1293d461ae7b1:12) 
	at com.facebook.react.uimanager.ViewManager.createView(r8-map-id-1a92cc952529f7daea85f71c4ad30656f52b60c3e338ced74ff1293d461ae7b1:1) 
	at q1.h.b(r8-map-id-1a92cc952529f7daea85f71c4ad30656f52b60c3e338ced74ff1293d461ae7b1:62) 
	at r1.g.execute(r8-map-id-1a92cc952529f7daea85f71c4ad30656f52b60c3e338ced74ff1293d461ae7b1:67) 
	at q1.b.d(r8-map-id-1a92cc952529f7daea85f71c4ad30656f52b60c3e338ced74ff1293d461ae7b1:71) 
	at q1.b.c(r8-map-id-1a92cc952529f7daea85f71c4ad30656f52b60c3e338ced74ff1293d461ae7b1:64) 
	at m1.j.a(r8-map-id-1a92cc952529f7daea85f71c4ad30656f52b60c3e338ced74ff1293d461ae7b1:100) 
	at com.facebook.react.uimanager.d.doFrame(r8-map-id-1a92cc952529f7daea85f71c4ad30656f52b60c3e338ced74ff1293d461ae7b1:1) 
	at E1.o.doFrame(r8-map-id-1a92cc952529f7daea85f71c4ad30656f52b60c3e338ced74ff1293d461ae7b1:98) 
	at android.view.Choreographer$CallbackRecord.run(Choreographer.java:2457) 
	at android.view.Choreographer$CallbackRecord.run(Choreographer.java:2468) 
	at android.view.Choreographer.doCallbacks(Choreographer.java:1693) 
	at android.view.Choreographer.doAnimationLoad(Choreographer.java:1523) 
	at android.view.Choreographer.doFrame(Choreographer.java:1438) 
	at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:2284) 
	at android.os.Handler.handleCallback(Handler.java:1014) 
	at android.os.Handler.dispatchMessage(Handler.java:102) 
	at android.os.Looper.loopOnce(Looper.java:250) 
	at android.os.Looper.loop(Looper.java:340) 
	at android.app.ActivityThread.main(ActivityThread.java:9911) 
	at java.lang.reflect.Method.invoke(Native Method) 
	at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:621) 
	at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:957) 

On android we pass the defaultSource and loadingIndicatorSrc as strings. however, when enabling prop diffing this causes crashes, as the prop diff mechanism is parsing them to ImageSource as defined in ImageProps.h.

W/o props 2.0 diffing we simply return the props as we receive them from JS (with those sources as string):

return ReadableNativeMap::newObjectCxxArgs(newProps->rawProps);

With props diffing …

… We actually transform them to the c++ object:

if (defaultSource != oldProps->defaultSource) {
result["defaultSource"] = toDynamic(defaultSource);
}
if (loadingIndicatorSource != oldProps->loadingIndicatorSource) {
result["loadingIndicatorSource"] = toDynamic(loadingIndicatorSource);

ImageSource defaultSource{};
ImageSource loadingIndicatorSource{};

#ifdef RN_SERIALIZABLE_STATE
folly::dynamic toDynamic() const
{
folly::dynamic imageSourceResult = folly::dynamic::object();
switch (type) {
case ImageSource::Type::Remote:
imageSourceResult["type"] = "remote";
break;
case ImageSource::Type::Local:
imageSourceResult["type"] = "local";
break;
case ImageSource::Type::Invalid:
default:
imageSourceResult["type"] = "invalid";
break;
}
imageSourceResult["uri"] = uri;
imageSourceResult["bundle"] = bundle;
imageSourceResult["scale"] = scale;
folly::dynamic sizeResult = folly::dynamic::object();
sizeResult["width"] = size.width;
sizeResult["height"] = size.height;
imageSourceResult["size"] = sizeResult;
imageSourceResult["body"] = body;
imageSourceResult["method"] = method;

This throws errors and crashes the app:

Screen.Recording.2026-01-19.at.19.42.05.mov

I think the proper solution here is to pass the full objects down, with or without props 2.0 diffing and handle the objects in native code correctly. This way android aligns with the iOS implementation too.

Changelog:

[ANDROID] [FIXED] - fixed defaultSource and loadingIndicatorSrc causing a crash when enablePropsUpdateReconciliationAndroid is enabled
[ANDROID] [BREAKING] - Changed ReactImageView#setDefaultSource(String?) to ReactImageView#setDefaultSource(ReadableMap?)
[ANDROID] [BREAKING] - Changed ReactImageView#setLoadingIndicatorSource(String?) to ReactImageView#setLoadingIndicatorSource(ReadableMap?)

Test Plan:

  1. Test that the defaultProp example in RNTester is working
  2. Enable props 2.0 diffing mechanism:
diff --git a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/internal/featureflags/ReactNativeFeatureFlagsOverrides_RNOSS_Stable_Android.kt b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/internal/featureflags/ReactNativeFeatureFlagsOverrides_RNOSS_Stable_Android.kt
index bb0a6b525da..04fcbf4ba8f 100644
--- a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/internal/featureflags/ReactNativeFeatureFlagsOverrides_RNOSS_Stable_Android.kt
+++ b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/internal/featureflags/ReactNativeFeatureFlagsOverrides_RNOSS_Stable_Android.kt
@@ -11,4 +11,8 @@ public class ReactNativeFeatureFlagsOverrides_RNOSS_Stable_Android() :
     ReactNativeNewArchitectureFeatureFlagsDefaults() {
 
   override fun useFabricInterop(): Boolean = true
+
+  override fun enableAccumulatedUpdatesInRawPropsAndroid(): Boolean = true
+  override fun enablePropsUpdateReconciliationAndroid(): Boolean = true
+  override fun enableExclusivePropsUpdateAndroid(): Boolean = true
 }
  1. Test all image examples:
    • Verify there is no crash
    • Verify defaultSource example is working

Recordings:

Debug Release
debug.mov
release.mov

Note: this uses the example setup from this PR in the recordings:

@meta-cla meta-cla bot added the CLA Signed This label is managed by the Facebook bot. Authors need to sign the CLA before a PR can be reviewed. label Jan 16, 2026
@hannojg hannojg force-pushed the fix/android-diffprops-image-source-broken branch 2 times, most recently from cd67404 to 8194e3d Compare January 19, 2026 18:46
@hannojg hannojg marked this pull request as ready for review January 19, 2026 18:47
@facebook-github-bot facebook-github-bot added the Shared with Meta Applied via automation to indicate that an Issue or Pull Request has been shared with the team. label Jan 19, 2026
@hannojg hannojg force-pushed the fix/android-diffprops-image-source-broken branch from 8194e3d to 985edfb Compare January 20, 2026 09:12
@hannojg hannojg changed the title fix(android): Image source & defaultSource broken with props 2.0 fix(android): Image defaultSource & loadingIndicatorSrc broken with props 2.0 Jan 20, 2026
@hannojg hannojg changed the title fix(android): Image defaultSource & loadingIndicatorSrc broken with props 2.0 fix(android): Image defaultSource & loadingIndicatorSrc broken with props 2.0 Jan 20, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

CLA Signed This label is managed by the Facebook bot. Authors need to sign the CLA before a PR can be reviewed. Shared with Meta Applied via automation to indicate that an Issue or Pull Request has been shared with the team.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants