MTKAndroid4.2.2再起動機能の追加

9481 ワード

Androidフレームワーク層に触れるのもしばらく時間がかかりましたが、基本的に遭遇した問題についてまとめを書いていないので、同じ問題に遭遇してもぼんやりした記憶で解決するしかありません.今日から毎日少し時間を割いて、仕事で出会った問題をまとめるつもりです.
今日はAndroidに再起動ボタンを追加し、Nineのお客様のニーズに合わせてこの機能を追加する必要があります.電源キーを長く押してポップアップメニューに再起動オプションはありません.この機能を追加する過程を記録します.
変更に関連するファイルは次のとおりです.
frameworks\base\core\java\android\view\WindowManagerPolicy.java
frameworks\base\core\res\res\values\strings.xml
frameworks\base\core\res\res\values-zh-rCN\strings.xml
frameworks\base\policy\src\com\android\internal\policy\impl\GlobalActions.java
frameworks\base\services\java\com\android\server\wm\windowManagerService.java
frameworks\base\services\java\com\android\server\power\ShutdownThread.java
frameworks\base\core\res\res\values\symbols.xml
まず、電源キーを長く押してイジェクトするダイアログボックスを見つけて、
frameworks\base\policy\src\com\android\internal\policy\impl\GlobalActions.JAvaファイル内
    /**
     * Create the global actions dialog.
     * @return A new dialog.
     */
    private GlobalActionsDialog createDialog() {
        ...
        ...
        mItems = new ArrayList();
        // first: power off
        mItems.add(
            new SinglePressAction(
                    com.android.internal.R.drawable.ic_lock_power_off,
                    R.string.global_action_power_off) {
                public void onPress() {
                    // shutdown by making sure radio and power are handled accordingly.
                    mWindowManagerFuncs.shutdown(true);
                }
                public boolean onLongPress() {
                    mWindowManagerFuncs.rebootSafeMode(true);
                    return true;
                }
                public boolean showDuringKeyguard() {
                    return true;
                }
                public boolean showBeforeProvisioning() {
                    return true;
                }
            });
            //xiaoyuguang 20130616 add reboot item
	    mItems.add(
            new SinglePressAction(
                    com.android.internal.R.drawable.ic_lock_power_off,
                    R.string.global_action_reboot) {
                public void onPress() {
		// reboot
                    mWindowManagerFuncs.reboot(true);
		}
                public boolean onLongPress() {
                    return true;
                }
                public boolean showDuringKeyguard() {
                    return true;
                }
                public boolean showBeforeProvisioning() {
                    return true;
                }
            });
	 //end xiaoyuguang 20130616
        ...
        ...}

GlobalActionsDialogメソッドではmItemsを見ることができます.addこの方法はメニューオプションを追加し、このメニューの追加の最初のオプションはシャットダウンオプションです.上のコードに示すように、シャットダウンしたItemに倣って再起動のオプションを追加できます.これにより、長押しの電源キーがイジェクトされたダイアログボックスに再起動オプションを追加することができます.もちろん、これは表示を追加するだけです.次に、このオプションに論理制御コードを追加します.
上のコードで使用するmWindowManagerFuncs.rebootメソッドとR.string.global_action_rebootリソース(リソースの追加は最後に言う)は、デフォルトでは存在しないので、自分で手動で追加する必要があります.
まずWindowManagerFuncsという場所を見つけてframeworksbasecorejavaandroidviewWindowManagerPolicy.JAvaで
    /**
     * Interface for calling back in to the window manager that is private
     * between it and the policy.
     */
    public interface WindowManagerFuncs {
        ...
        ...
        /**
         * Switch the keyboard layout for the given device.
         * Direction should be +1 or -1 to go to the next or previous keyboard layout.
         */
        public void switchKeyboardLayout(int deviceId, int direction);
        public void shutdown(boolean confirm);
        public void rebootSafeMode(boolean confirm)	
        //xiaoyuguang
        public void reboot(boolean confirm);

    }

rebootメソッドを追加します.
しかし、これはインタフェースを追加するだけで、その具体的な実現は?長い間捜していた
frameworks\base\services\java\com\android\server\wm\windowManagerService.JAvaではこのインタフェースの実装が見つかった.
/** {@hide} */
public class WindowManagerService extends IWindowManager.Stub
        implements Watchdog.Monitor, WindowManagerPolicy.WindowManagerFuncs,
                DisplayManagerService.WindowManagerFuncs, DisplayManager.DisplayListener {
     ...
     ...
     // Called by window manager policy.  Not exposed externally.
    @Override
    public void shutdown(boolean confirm) {
        ShutdownThread.shutdown(mContext, confirm);
    }
	//xiaoyuguang 20130616 add reboot
	@Override
	public void reboot(boolean confirm){
		ShutdownThread.reboot(mContext, null, confirm);
	}
	//end xiaoyuguang
    // Called by window manager policy.  Not exposed externally.
    @Override
    public void rebootSafeMode(boolean confirm) {
        ShutdownThread.rebootSafeMode(mContext, confirm);
    }
    ...
    ...}

同様にシャットダウンの原理を模倣してrebootの具体的な実装コードを追加し、ShutdownとrebootSafeModeというクラスにshutdownとrebootSafeModeの方法が提供されている以上、rebootの方法やrebootのような方法もあるはずだ.見つけたJAvaファイル、frameworksbaseservicesjavacomandroidserverpowerShutdownThread.JAvaでは、
public final class ShutdownThread extends Thread {
    ...
    ...
        /**
     * Request a clean shutdown, waiting for subsystems to clean up their
     * state etc.  Must be called from a Looper thread in which its UI
     * is shown.
     *
     * @param context Context used to display the shutdown progress dialog.
     * @param confirm true if user confirmation is needed before shutting down.
     */
    public static void shutdown(final Context context, boolean confirm) {
    ...
    }
        /**
     * Request a clean shutdown, waiting for subsystems to clean up their
     * state etc.  Must be called from a Looper thread in which its UI
     * is shown.
     *
     * @param context Context used to display the shutdown progress dialog.
     * @param reason code to pass to the kernel (e.g. "recovery"), or null.
     * @param confirm true if user confirmation is needed before shutting down.
     */
    public static void reboot(final Context context, String reason, boolean confirm) {
        mReboot = true;
        mRebootSafeMode = false;
        mRebootReason = reason;
        Log.d(TAG, "reboot");
        shutdownInner(context, confirm);
    }
    ...
    ...
}

静的なrebootメソッドが提供されているので、windowManagerServices.JAvaのreboot実装ではShutdownThreadのrebootを直接呼び出せばよい.
 public static void reboot(final Context context, String reason, boolean confirm);3つのパラメータがあり、後の2つのパラメータは以下のように解釈されます.reasonの値がnullの場合、正常に再起動します.recoveryの場合、システムはrecovery modeに再起動します.confirmはtrueのためにシャットダウンプロンプトボックスを表示し、ユーザー【確認】が必要である.falseはプロンプトボックスを表示せず、直接電源を切ります.
このリスタート機能は基本的には使用できますが(リソースが追加されていない場合を除きます)、この場合リスタートオプションを選択した場合、まだシャットダウンが足りないというメッセージが表示されますので、「リスタート」を選択した場合のダイアログボックスのヒントも変更します.
「frameworksbaseservicesjavacomandroidserverpowerShutdownThread.JAvaで
static void shutdownInner(final Context context, boolean confirm) {
    ...
    ...
        final int resourceId = mRebootSafeMode
            ? com.android.internal.R.string.reboot_safemode_confirm
            : (longPressBehavior == 2
                    ? com.android.internal.R.string.shutdown_confirm_question
                    : com.android.internal.R.string.shutdown_confirm);
    ...
    ...    
        sConfirmDialog = new AlertDialog.Builder(context)
                    .setTitle(mRebootSafeMode
                            ? com.android.internal.R.string.reboot_safemode_title
                            : com.android.internal.R.string.power_off)
                    .setMessage(resourceId)
    ...
    ...
}

次のように変更します.
        final int resourceId = mReboot
			? com.android.internal.R.string.reboot_confirm
			: (mRebootSafeMode
				? com.android.internal.R.string.reboot_safemode_confirm
				: (longPressBehavior == 2
						? com.android.internal.R.string.shutdown_confirm_question
						: com.android.internal.R.string.shutdown_confirm));
            ...
            ...
                sConfirmDialog = new AlertDialog.Builder(context)
                    .setTitle(mReboot
							? com.android.internal.R.string.global_action_reboot
							: (mRebootSafeMode
								? com.android.internal.R.string.reboot_safemode_title
								: com.android.internal.R.string.power_off))
                    .setMessage(resourceId)

これでコード部分の変更はすべて完了し、次に使用するリソースを追加します.その中で使用する文字列です.簡単にするために英語と簡体字中国語を追加しました.
対応するリソースファイルに追加:
frameworks\base\core\res\res\values\strings.xml
	
	
        Reboot
        	Do you want to reboot your device?
	

frameworks\base\core\res\res\values-zh-rCN\strings.xml
	
	  
	           ?
	

これらのリソースは追加されましたが、まだ使用できません.コンパイル中にリソースが見つからないエラーが発生し、
frameworks\base\core\res\res\values\symbols.xml
(4.1では
frameworks\base\core\res\res\values\public.xml)
ファイルでリソース宣言を行います.
  
  

これで再起動機能が追加され、コンパイル前に実行されます./mk-t update-api(インタフェースが新しく追加されたため).
もちろんこれはフレーム層からの修正にすぎず,その下層の具体的な実現はまだ検討されておらず,時間があって見に行く時間がある.