最近感触最深的就是我需要赶紧提升,个人工作能力,写作能力,股票分析能力,逆向思维模式等等。为什么有这种想法,一、对自己有了更高的期盼,二、对自己现在的状况不满意。做为一个闷骚型IT男,业余活动太小,周末都少有出门,接触外面的世界太少,不会待人,生活常识也少的可伶。发一下牢骚,今天开始写作,不管是对生活的感悟还是对事情的个人看法,当然也不能少了软件bug,希望能坚持把生活的一些经历记录下来。
言归正传,这是关于framework中遇到的bug记录,项目需求,要添加一个实体reset按键,底层驱动容易实现,只要修改一下dtsi,上报一个键值即可,看硬件reset按键和power键一样是连接在pmic上的,并不是连在CPU上,所以我们只要修改pmic的dtsi就可以,如下:
pon_1是power键, pon_2是reset键。下一步我们配framework的KEYCODE。在Generic.kl 中添加key 356 REBOOT。PhoneWindowManager.java中interceptKeyBeforeQueueing()函数添加KEYCODE_REBOOT的拦截:
case KeyEvent.KEYCODE_REBOOT: { //add a power reset key by maoyuanqiu
mPowerManager.reboot("reboot");
break; }
但是这样修改后,按下reset按键走的是虽然重启了但是弹出的关机的界面。因此我在shutdownThread增加了一个重启的提示框beginShutdownSequence()函数添加了:
else if( mReason.equals("reboot")){
pd.setTitle(context.getText(com.android.internal.R.string.power_reboot));
pd.setMessage(context.getText(com.android.internal.R.string.shutdown_progress));
pd.setIndeterminate(true);
这样就可以了吗?代码没有问题了?
这样的修改经不起测试,按reset键没有暴露问题,但是当batteryService或者其他应用发送ACTION_REQUEST_SHUTDOWN广播时,系统会出现异常,系统重启到一半卡住不动。
01-01 03:06:51.960 E/AndroidRuntime( 3815): *** FATAL EXCEPTION IN SYSTEM PROCESS: PowerManagerService
01-01 03:06:51.960 E/AndroidRuntime( 3815): java.lang.NullPointerException: Attempt to invoke virtual method 'boolean java.lang.String.equals(java.lang.Object)' on a null object reference
01-01 03:06:51.960 E/AndroidRuntime( 3815): at com.android.server.power.ShutdownThread.beginShutdownSequence(ShutdownThread.java:318)
01-01 03:06:51.960 E/AndroidRuntime( 3815): at com.android.server.power.ShutdownThread.shutdownInner(ShutdownThread.java:198)
01-01 03:06:51.960 E/AndroidRuntime( 3815): at com.android.server.power.ShutdownThread.shutdown(ShutdownThread.java:139)
01-01 03:06:51.960 E/AndroidRuntime( 3815): at com.android.server.power.PowerManagerService$4.run(PowerManagerService.java:2524)
01-01 03:06:51.960 E/AndroidRuntime( 3815): at android.os.Handler.handleCallback(Handler.java:751)
01-01 03:06:51.960 E/AndroidRuntime( 3815): at android.os.Handler.dispatchMessage(Handler.java:95)
01-01 03:06:51.960 E/AndroidRuntime( 3815): at android.os.Looper.loop(Looper.java:154)
01-01 03:06:51.960 E/AndroidRuntime( 3815): at android.os.HandlerThread.run(HandlerThread.java:61)
01-01 03:06:51.960 E/AndroidRuntime( 3815): at com.android.server.ServiceThread.run(ServiceThread.java:46)
log中很明确的说明com.android.server.power.ShutdownThread.beginShutdownSequence(ShutdownThread.java:318) ShutdownThread.java:318 有问题,这里是我添加reset提示框的地方。即:
else if( mReason.equals("reboot")){
有问题。为什么?String 类型的mReason没有自检,因此这里只需要修改为:if(mReason != null && mReason.equals("reboot"))。