SWTの再起動のケーススタディ(5)

非常にお勧めの記事:ようこそお気に入り
のAndroidドライシェア

5分、毎日10時、あなたと生涯学習を読んで、ここでのAndroidのプログラマです

この資料に記載されているAndroidこの記事を読んで知識の開発の一部を、次のことを刈り取ります。

、サービス登録されていない異常は電話が再起動する原因と
解決策登録されていない2を、サービス
2.1はContextImplクラス変更
2.2はTransportManagerクラスを変更

、サービス登録されていない異常は、再起動に電話を引き起こします

再起動セクションでは、Log次のとおりです。
サービスが異常な再起動を登録していません

二、サービス登録されていませんソリューション

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());
                    }
                }
            }
        }
    }

間違った場所、あなたの提案や修正を歓迎している場合これまでのところ、本明細書に、これは、終了しました。同時に、あなたの注意を楽しみにして、お読みいただきありがとうございました、ありがとうございました!

マイクロチャネル国民の関心番号:プログラマーアンドロイド、福祉を受けます

おすすめ

転載: www.cnblogs.com/wangjie1990/p/11326944.html