Android 시스템 을 위 한 리 셋 기능 맞 춤 형

계획 에 따라 매주 기술 박문 한 편 을 업데이트 하고 두 번 째 편:
1. Android 시스템 재 부팅 의 실현 방식
1. 방송 방식
이전 블 로그 에 서 는 이러한 방식 을 소개 한 적 이 있 습 니 다. 응용 은 소스 코드 에서 컴 파일 되 고 응용 은 시스템 권한 이 필요 합 니 다.
2. init. rc 를 통 해 시스템 서 비 스 를 시작 하여 sh 파일 을 실행 합 니 다.
a. 셸 파일 (system reboot. sh) 을 다시 시작 하여 system/etc/디 렉 터 리 에 놓 습 니 다.
#!/system/bin/sh  
reboot

b. init. rc 에 Service 정의 추가
   service system_reboot /system/etc/system_reboot.sh
     oneshot
     disabled

c. 시스템 서비스 시작
SystemProperties.set("ctl.start", "system_reboot");

3. 직접 코드 에서 명령 행 실행
루트 권한 필요
Process proc = Runtime.getRuntime().exec(cmd);

    상기 세 가지 방법 은 리 셋 을 실현 할 수 있 지만, 지금 은 긴 버튼 을 누 르 면 알림 대화 상자 에 리 셋 옵션 이 있어 야 합 니 다. 이것 은 시스템 원본 코드 를 수정 하 는 것 을 설계 하고 원본 코드 를 수정 하 는 것 이 매우 어 려 운 작업 이 라 고 생각 합 니 다. 사실은 꺼 진 알림 상자 의 코드 위 치 를 찾 으 면 모든 것 이 간단 해 집 니 다.
2. 소스 코드 맞 춤 형 재 부팅 기능 수정
1. 추적 장 은 Power 키 관련 코드 를 누 릅 니 다.
    먼저 전원 키 를 길 게 누 르 면 팝 업 대화 상자 의 소스 코드 위 치 를 알 아야 합 니 다. 추적 을 통 해 Phone Window Manager. 자바 에서 전원 키 를 길 게 누 르 는 방법 을 찾 아야 합 니 다. 코드 를 계속 추적 하여 Runnable 을 찾 아야 합 니 다. mPowerLongPress = new Runnable (), 이 runnable 에서 showGlobalActionsdialog () 방법 을 호출 하 는 것 은 power 키 를 길 게 누 르 고 팝 업 하 는 전원 끄 기 알림 대화 상 자 를 표시 하 는 것 입 니 다. 만약 당신 의 기계 가 원생 태 라면 기본적으로 '비행 모드', '음소 거' 와 '전원 끄 기' 옵션 을 제시 합 니 다.
     showGlobalActionsDialog 에서 꺼 진 대화 상 자 를 만 드 는 코드 는 GlobalActions. 자바 에 있 습 니 다. 주요 코드 는 다음 과 같 습 니 다.
 
private AlertDialog createDialog() {
……
mItems = new ArrayList<Action>();

        // 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.
                    ShutdownThread.shutdown(mContext, true);
                }

                public boolean showDuringKeyguard() {
                    return true;
                }

                public boolean showBeforeProvisioning() {
                    return true;
                }
            });

        // next: airplane mode
        mItems.add(mAirplaneModeOn);

        // last: silent mode
        if (SHOW_SILENT_TOGGLE) {
            mItems.add(mSilentModeAction);
        }
……
}

2. 재 부팅 방법
    원본 을 여기까지 추적 하려 면 리 셋 부분 을 추가 해 야 하 는 원본 도 AlertDialog 로 갑 니 다. 여러 가 지 를 추가 하면 디 스 플레이 부분의 코드 가 이 파워 오 프 를 직접 만 들 면 됩 니 다. 논 리 를 다시 시작 하 는 코드 를 추가 하여 리 셋 방법 인 onPress 안쪽 (위쪽 코드 굵 은 부분) 을 직접 수정 해 야 합 니 다. 처음에 저 는 앞에서 제시 한 세 가지 방법 중 하나 와 방법 이 모두 통 하지 않 았 습 니 다. 나중에 원인 을 더 조사 하지 않 고 권한 문 제 를 평가 하려 고 했 습 니 다.
    사용 방법 을 다시 시도 해 보 려 고 했 는데 왜 꺼 진 논리 코드 인 Shutdown Thread. shutdown () 을 보지 않 고 Shutdown Thread. java 를 열 면 원본 코드 에 도 reboot 의 실현 방법 이 있 는 지 곧 알 수 있 습 니 다. 다음 과 같 습 니 다.
    
/**
     * 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){
     ……
     }

   이 방법의 사용 은 주석 을 직접 보면 알 수 있 습 니 다. reboot 방법의 두 매개 변 수 는 다음 과 같 습 니 다.
     reason  값 이 null 이면 정상적으로 다시 시작 합 니 다.recovery 라면 시스템 재 부팅 이 recovery mode 에 들 어 갑 니 다.
     confirm true 는 전원 끄 기 알림 상 자 를 표시 합 니 다. 사용자 [확인] 이 필요 합 니 다.false 알림 상자 표시 하지 않 고 전원 끄 기
 
3. 코드 수정
a. 전원 끄 기 알림 상자 에 재 부팅 옵션 추가
    전원 끄 기 와 관련 된 소스 코드 를 알 고 GlobalActions. java 의 createDialog 방법 에 다음 과 같은 코드 를 추가 하면 됩 니 다.
 
      ...
 	// next: reboot global_action_reboot
        mItems.add(
         new SinglePressAction(
                    com.android.internal.R.drawable.ic_lock_power_off,
                    R.string.global_action_reboot) {

                public void onPress() {
              // reboot
                 ShutdownThread.reboot(mContext,null,false);              
                }

                public boolean showDuringKeyguard() {
                    return true;
                }

                public boolean showBeforeProvisioning() {
                    return true;
                }
            });
	...

b. 꺼 진 알림 상 자 를 구분 하기 위해 재 부팅 알림 상 자 를 수정 합 니 다.
  알림 상 자 는 기본적으로 "꺼 짐"이기 때문에 Shutdown Thread. java 의 beginShutdown Sequence (context) 방법 에서 코드 를 다음 과 같이 수정 합 니 다.
/*/
//修改前:
……
 pd.setTitle(context.getText(com.android.internal.R.string.power_off));
 pd.setMessage(context.getText(com.android.internal.R.string.shutdown_progress));
……
/*/
//修改后:
……
if(mReboot){     // reboot progress
         pd.setTitle(context.getText(com.android.internal.R.string.global_action_reboot));
         pd.setMessage(context.getText(com.android.internal.R.string.reboot_progress));
     }else{          // shutdown progress
         pd.setTitle(context.getText(com.android.internal.R.string.power_off));
         pd.setMessage(context.getText(com.android.internal.R.string.shutdown_progress));
     }
……
//*/

     재 부팅 기능 이 구현 되 었 지만 여기 서 끝 낼 수 없습니다. 안 드 로 이 드 시스템 의 재 부팅 기능 을 맞 춤 형 으로 설정 하고 재 부팅 알림 상 자 를 수정 할 때 '재 부팅' 과 '재 부팅 중' 문자열 이 추가 되 었 기 때문에 시스템 자원 파일 에 새로운 문자열 을 추가 하고 소스 코드 에 있 는 자원 파일 과 관련 된 다 국적 언어 는 무시 합 니 다.저 는 values/strings. xml 과 values - zh - rCN/strings. xml 두 파일 에 만 해당 하 는 문자열 을 추가 합 니 다.
    <string name="global_action_reboot">重启</string>
    <string name="reboot_progress">"正在重启..."</string>

c. 최종 컴 파일
수정 은 시스템 자원 파일 과 관련 되 고 policy. jar 패키지 와 관련 되 기 때문에 여러 번 시도 한 결과 정확 한 컴 파일 순 서 는 다음 과 같 습 니 다.
STEP 1. frameworks/base/res 를 컴 파일 하여 out/target/produt/X 장치 이름 X/system/framework/디 렉 터 리 에서 framework - res. apk 를 생 성 합 니 다.
절차 2. frameworks/base/를 컴 파일 하고 o 같은 디 렉 터 리 에서 framework. jar 패 키 지 를 생 성 합 니 다. (무시 할 수 없습니다. 그렇지 않 으 면 절차 3 컴 파일 오류)
절차 3. frameworks/base/policy 를 컴 파일 하여 같은 디 렉 터 리 에서 policy. jar 패 키 지 를 생 성 합 니 다.
부록:
이 소스 코드 는 Android 4.0.4 를 기준 으로 (2.3 과 같 음) 전원 끄 기 관련 소스 코드 경로:
ics/frameworks/base/policy/src/com/android/internal/policy/impl/디 렉 터 리 아래:
PhoneWindowManager.java
GlobalActions.java
ics/frameworks/base/core/java/com/android/internal/app/디 렉 터 리 아래:
ShutdownThread.java
PS: 4.1.1 전원 끄 기 관련 방법 위치 변화
원본 코드 는 꺼 진 인 터 페 이 스 를 다음 과 같이 통합 시 켰 습 니 다.
public class WindowManagerService extends IWindowManager.Stub         implements Watchdog. Monitor, WindowManager Policy. WindowManager Funcs {...} 중
단, 직접 사용 가능:
import com.android.server.pm.ShutdownThread;
ShutdownThread.shutdown(mContext, true);
ShutdownThread.rebootSafeMode(mContext, true);
파일 경로:
Android4.1.1/jb/frameworks/base/services/java/com/android/server/pm/
ShutdownThread.java
Android4.1.1/jb/frameworks/base/services/java/com/android/server/wm
WindowManagerService.java
...
참조 참조:
1, 안 드 로 이 드 응용 프로그램 루트 권한 획득

좋은 웹페이지 즐겨찾기