포럼 회원으로 등록하신분만 다운로드가 가능합니다. 최대 업로드 가능한 용량은 20MB 입니다.
일주일동안 외부강의에 목요일날 심한 음주로 인하여 2일 정도 완전 폐인모드에
어제는
android에 새로운 multimedia player를 포팅하기 위한 작업을 노가다 한 후에....쩝...
오늘에야 겨우 자료를 올리네요...ㅎㅎ
저번에 컴파일해도 부팅이 안되는 경우가 있다고 말씀드렸는데 관련 패치부분을 올립니다.
----------------------------------------------------------------------------------------
Android source를 공식사이트에 받아서 compile하고 부팅할 경우
부팅이 안되는 경우가 나온다.
1.5와 1.6에서는 logcat으로 봤을 때
E/BatteryService( 1661): Could not open '/sys/class/power_supply/ac/online'
E/BatteryService( 1661): Could not open '/sys/class/power_supply/usb/online'
E/BatteryService( 1661): Could not open '/sys/class/power_supply/battery/present'
E/BatteryService( 1661): Could not open '/sys/class/power_supply/battery/capacity'
E/BatteryService( 1661): Could not open '/sys/class/power_supply/battery/batt_vol'
E/BatteryService( 1661): Could not open '/sys/class/power_supply/battery/batt_temp'
E/BatteryService( 1661): Could not open '/sys/class/power_supply/battery/status'
E/BatteryService( 1661): Could not open '/sys/class/power_supply/battery/health'
E/BatteryService( 1661): Could not open '/sys/class/power_supply/battery/technology'
이런 메세지가 나오면서 다음과 같은 부분때문에 system halt 가 된다.
2.0 이상의 경우는 전혀 메세지는 나오지 않고 그냥 부팅이 안될 뿐이다....
반복해서 삽질만 해댄다.......ㅎ
이는 배터리 문제로 안드로이드는 실제 장비가 완전히 hw부분이 포팅이 되었다고 가정하고
소스가 구성되었기 때문이다. 실제로도 G1 혹은 motorola droid가 실제 타겟으로 설계된 부분이 있기 때문이다.
즉, 소스 받아서 폰에 넣으면 동작한다는 얘기이다.(물론, 그렇지 않을 경우도 있지만)
1. Battery 문제
android source에서 관련된 부분을 없앤다.
(몇가지 방법이 있음)
1> system halt에 대해 JAVA application framework 단에서 수정하는 법
- 1.5/1.6의 경우
frameworks/policies/base/phone/com/android/internal/policy/impl/KeyguardUpdateMonitor.java 에서 아래 부분을 주석처리
298 line
if (batteryLevel == 0 &&
pluggedInStatus != BATTERY_STATUS_CHARGING &&
pluggedInStatus != BATTERY_STATUS_UNKNOWN) {
ShutdownThread.shutdownAfterDisablingRadio(mContext, false);
}
- 2.0 이상의 경우
frameworks/base/services/java/com/android/server/BatteryService.java
shutdown관련 함수의 내부를 주석처리하면 되고.
...
private final void shutdownIfNoPower() {
// shut down gracefully if our battery is critically low and we are not powered.
// wait until the system has booted before attempting to display the shutdown dialog.
if (mBatteryLevel == 0 && !isPowered() && ActivityManagerNative.isSystemReady()) {
Intent intent = new Intent(Intent.ACTION_REQUEST_SHUTDOWN);
intent.putExtra(Intent.EXTRA_KEY_CONFIRM, false);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
mContext.startActivity(intent);
}
}
private native void native_update();
private synchronized final void update() {
native_update();
boolean logOutlier = false;
long dischargeDuration = 0;
...
위와 같이 되어 있는 코드를 다음과 같이 수정
...
private final void shutdownIfNoPower() {
/*
// shut down gracefully if our battery is critically low and we are not powered.
// wait until the system has booted before attempting to display the shutdown dialog.
if (mBatteryLevel == 0 && !isPowered() && ActivityManagerNative.isSystemReady()) {
Intent intent = new Intent(Intent.ACTION_REQUEST_SHUTDOWN);
intent.putExtra(Intent.EXTRA_KEY_CONFIRM, false);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
mContext.startActivity(intent);
}
*/
}
private native void native_update();
private synchronized final void update() {
// native_update();
boolean logOutlier = false;
long dischargeDuration = 0;
...
2> JNI와 HAL에서 처리하는 방법
/hardware/libhardware_legacy/power/power.c
/frameworks/base/services/jni/com_android_server_BatteryService.cpp
3> 실제 커널서 battery관련 부분을 추가해 주는 법
==> 커널 코드를 수정
driver관련 HAL 실습부분에서 처리.
===============================================================================
참고. storage 용량 계산에서 문제가 발생할 경우
low on space 메세지 관련 패치
==> 이 부분은 android 버전별로 차이가 있을 수 있음. 하지만, 공식버전에는 발생하는 경우가 많다.
/*
참고
./frameworks/base/services/java/com/android/server/DeviceStorageMonitorService.java
mTotalMemory = ((long)mFileStats.getBlockCount()*(long)mBlkSize)/100;
*/
===============================================================================
2. 수정 후 다시 make하고 system 디렉토리만 update한 후 재부팅
android top directory에서 컴파일 후
타겟이 off된 상태에서
cp -a out/target/product/ntc100/system/* /root/work/rootfs/test/system
이렇게 하고 부팅하면 된다.
================================================================================
이 정도까지 하면 일단 부팅은 될겁니다.
이제는 부팅과 관련된 몇가지 얘기를 할 차례네요.
init process인데, 몇가지 다른데서 받아온 자료를 기본으로 해서 약간의 간단한 설명을 해볼까 합니다.
1> system halt에 대해 JAVA application framework 단에서 수정하는 법
- 1.5/1.6의 경우
frameworks/policies/base/phone/com/android/internal/policy/impl/KeyguardUpdateMonitor.java 에서 아래 부분을 주석처리
298 line
if (batteryLevel == 0 &&
pluggedInStatus != BATTERY_STATUS_CHARGING &&
pluggedInStatus != BATTERY_STATUS_UNKNOWN) {
ShutdownThread.shutdownAfterDisablingRadio(mContext, false);
}
이렇게 하시면 됩니다
질문을 드려도 될런지요...
오드로이드 사용자입니다.
고도리님 올려주신글 잘 읽고 따라해봤습니다.
배터리 부분에선 BatteryService.java 를 수정해서 컴파일해서 올려봤는데
초록 로봇머리 나왔다 없어지고 ANDROID 란 작은 글씨가 중앙에 나타나서 감감무소식이네요.
http://dev.odroid.com/projects/android 여기에서 받은 안드로이드 소스로 컴파일해서 올리면 잘 돌아갑니다.
# repo init -u git://android.git.kernel.org/platform/manifest.git
# repo sync
위와같이 받은 소스로 맨땅에 컴팔해서 오드로이드에 올려보고 싶은데 잘 안되네요.
참고로 커널과 boot 이미지는 http://dev.odroid.com/projects/odroid 여기에서 다운로드 받은 2.1 파일안에 있는걸 사용했습니다.
커널과 rootfs 파일들이 뭔가 꿍짝이 안 맞아서 그런가 하는 생각도 드네요.
Application 개발할려구 구입했다가 이쪽이 더 잼나는것 같아서 몇일 헤메고 있는데
왕초보라 어디를 봐야할지 도통 몰르겠어서 염치 불구하고 여기다 질문 드립니다.
죄송하네요... 넘 길게 썼네요.