ROM移植出现的java.lang.NullPointerException解决

在进行ROM移植过程中,遇到了开机Log提示java.lang.NullPointerException的问题。通过分析发现,这通常是因为patch时寄存器没有正确对应。以FlymeOS为例,问题出现在services.jar.out的MoveWindowService.smali中。对比源代码和修改后的代码,发现是静态方法startMoveWindowService的参数为null。进一步排查,确定是v0和v4参数的问题。经过对比上下文,发现v98应替换为v117,修复这个问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这些天弄了一下ROM移植,记录一下遇到的问题

开机Log提示java.lang.NullPointerException ……,像这类的报空指针,一般都是patch时,寄存器没对应上导致的,下面记录了其中一个例子:


I/SystemServer( 1178): Window Manager
I/WindowManager( 1178): No existing display settings /data/system/display_settings.xml; starting empty
D/PermissionCache(  255): checking android.permission.ACCESS_SURFACE_FLINGER for uid=1000 => granted (732 us)
W/Settings( 1178): Setting dev_force_show_navbar has moved from android.provider.Settings.System to android.provider.Settings.Secure, returning Secure URI.
E/System  ( 1178): ******************************************
E/System  ( 1178): ************ Failure starting core service
E/System  ( 1178): java.lang.NullPointerException: Attempt to invoke virtual method 'com.android.server.wm.MoveWindowService com.android.server.wm.WindowManagerService.startMoveWindowService(android.content.Context)' on a null object reference
E/System  ( 1178):  at com.android.server.SystemServer$FlymeInjector.startFlymeMoveWindowService(SystemServer.java:1300)
E/System  ( 1178):  at com.android.server.SystemServer.startOtherServices(SystemServer.java:510)
E/System  ( 1178):  at com.android.server.SystemServer.run(SystemServer.java:284)
E/System  ( 1178):  at com.android.server.SystemServer.main(SystemServer.java:185)
E/System  ( 1178):  at java.lang.reflect.Method.invoke(Native Method)
E/System  ( 1178):  at java.lang.reflect.Method.invoke(Method.java:372)
E/System  ( 1178):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:898)
E/System  ( 1178):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:693)
I/SystemServer( 1178): Input Method Service
I/InputMethodUtils( 1178): Adding: com.baidu.input_mz/com.meizu.input.MzInputService

这里我移植的是FlymeOS,下面称为bosp

很明显,问题出在了services里,打开services.jar.out里面的MoveWindowService.smali,搜索到调用startMoveWindowService方法的这个地方。

首先对比一下bosp在aosp改了什么:
aosp对比bosp

再对比下自己patch后的跟bosp的差别:
my对比bosp

这里bosp只是在aosp基础上插入一句调用静态方法startMoveWindowService方法的代码,既然是静态方法报空指针,那肯定是有参数为null了,这里传入参数有两个,v0和v4,那么问题来了,这两个参数是什么,怎么来?

其实只要对比一下上下文就知道了,这里它调用前,先把p0赋给v0,v98赋给v4。

p0是入参一般都没什么问题,

再看v98,在aosp里,往上看几行,就可以看到v98是调用WindowManagerService的main方法的返回值,

invoke-static {v3, v0, v5, v4, v8}, Lcom/android/server/wm/WindowManagerservice:->main(Landroid...
move-result-object v98

再看看自己机型的代码,找到上面机上调用WindowManagerService的main方法时,返回值赋给了哪个寄存器:

invoke-static {v3, v0, v4, v5, v8}, Lcom/android/server/wm/WindowManagerservice:->main(Landroid...
move-result-object v117

很明显是v117,

可能是autopatch的时候没改过来,或者自己插的时候没注意到,

这里只要把v98改为v117就可以了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值