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, 안 드 로 이 드 응용 프로그램 루트 권한 획득
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Kotlin의 기초 - 2부
지난 글에서는 Kotlin이 무엇인지, Kotlin의 특징, Kotlin에서 변수 및 데이터 유형을 선언하는 방법과 같은 Kotlin의 기본 개념에 대해 배웠습니다.
유형 변환은 데이터 변수의 한 유형을 다른 데이터...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.