SWT 重啟案例分析(五)


極力推薦文章:歡迎收藏
Android 乾貨分享
本篇文章主要介紹 Android
開發中的部分知識點,通過閱讀本篇文章,您將收穫以下內容:
一、Service not registered 異常導致手機重啟
二、Service not registered 解決方案
2.1 修改ContextImpl類
2.2 修改 TransportManager 類
一、Service not registered 異常導致手機重啟
重啟 的部分 Log
如下:

Service not registered 重啟異常
二、Service not registered 解決方案
從 Log
中分析發現異常資訊,並嘗試進行如下修改。
1.修改ContextImpl類
檔案路徑如下:
\frameworks\base\core\java\android\app\ContextImpl.java
檔案
優化 unbindService
方法實現如下:
@Override public void unbindService(ServiceConnection conn) { if (conn == null) { throw new IllegalArgumentException("connection is null"); } if (mPackageInfo != null) { IServiceConnection sd = mPackageInfo.forgetServiceDispatcher( getOuterContext(), conn); try { ActivityManager.getService().unbindService(sd); } catch (RemoteException e) { throw e.rethrowFromSystemServer(); // add for Service not registered unbindService() triger reboot exception } catch (IllegalArgumentException e) { //com.google.android.gms.ui Service not registered Crash android.util.Log.e("wjwj","---ContextImpl GMS Crash---"); e.printStackTrace(); } // add for Service not registered unbindService() triger reboot exception } else { throw new RuntimeException("Not supported in system context"); } }
2.修改 TransportManager 類
檔案路徑如下:
frameworks\base\services\backup\java\com\android\server\backup\TransportManager.java
將異常捕獲,防止重啟。
優化 unbindService
方法實現如下:
void onPackageRemoved(String packageName) { // Package removed. Remove all its transports from our list. These transports have already // been removed from mBoundTransports because onServiceDisconnected would already been // called on TransportConnection objects. synchronized (mTransportLock) { Iterator<Map.Entry<ComponentName, TransportConnection>> iter = mValidTransports.entrySet().iterator(); while (iter.hasNext()) { Map.Entry<ComponentName, TransportConnection> validTransport = iter.next(); ComponentName componentName = validTransport.getKey(); if (componentName.getPackageName().equals(packageName)) { TransportConnection transportConnection = validTransport.getValue(); iter.remove(); if (transportConnection != null) { /* 360OS begin */ /* unbindService() triger reboot exception, * catch it && add log to find out witch package do it. */ try { Slog.d(TAG, "onPackageRemoved trace, componentName:" + componentName.toString(), new Throwable()); mContext.unbindService(transportConnection); } catch (IllegalArgumentException e) { Slog.e(TAG, "unbindService fail.", e); } /* 360OS end */ log_verbose("Package removed, removing transport: " + componentName.flattenToShortString()); } } } } }


長按識別二維碼,領福利
至此,本篇已結束,如有不對的地方,歡迎您的建議與指正。同時期待您的關注,感謝您的閱讀,謝謝!
如有侵權,請聯絡小編,小編對此深感抱歉,屆時小編會刪除文章,立即停止侵權行為,請您多多包涵。
