$ lsusb
Bus 002 Device 023: ID 2207:0010
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 003 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub

In this case, the description of the device (a Vido N70 tablet in this case) was left empty.

  • Download and install the Android SDK. Or, alternatively, just download adb from an Ubuntu Linux with this command:
  sudo apt-get install android-tools-adb
  • Log in as root and create the file "/etc/udev/rules.d/51-android.rules" with the following content:
SUBSYSTEM=="usb", ATTR{idVendor}=="2207", MODE="0666", GROUP="plugdev"
  • As root, restart udev with "udevadm control --reload-rules"
  • Log in with your normal unix user, and edit ~/.android/adb_usb.ini, add 0x2207 at the end of the file
  • As user, restart the adb server with "adb kill-server; adb start-server"
  • As user, you should be able to list your device with "adb devices"


아래와 같은 에러가 난다면 kernel/arch/arm/mach-exynos/mach-smdk4x12.c 파일에서 다음을 확인하라.

MACHINE_START(SMDK4412, "SMDK4X12")

SMDK4X12  가 아닌 다른 것으로 되어 있어서 이다.


[    2.732117] Freeing init memory: 248K
[    2.741706] init: could not import file '/init.smdk4x12.rc' from '/init.rc'
[    2.743152] init (1): /proc/1/oom_adj is deprecated, please use /proc/1/oom_score_adj instead.
[    2.822799] init: cannot open '/initlogo.rle'
[    2.996371] init: Unable to open persistent property directory /data/property errno: 2
[    3.001587] init: cannot find '/system/bin/servicemanager', disabling 'servicemanager'
[    3.006572] init: cannot find '/system/bin/vold', disabling 'vold'
[    3.012736] init: cannot find '/system/bin/netd', disabling 'netd'
[    3.018892] init: cannot find '/system/bin/debuggerd', disabling 'debuggerd'
[    3.025924] init: cannot find '/system/bin/rild', disabling 'ril-daemon'
[    3.032609] init: cannot find '/system/bin/surfaceflinger', disabling 'surfaceflinger'
[    3.040508] init: cannot find '/system/bin/app_process', disabling 'zygote'
[    3.047451] init: cannot find '/system/bin/drmserver', disabling 'drm'
[    3.053960] init: cannot find '/system/bin/mediaserver', disabling 'media'
[    3.060824] init: cannot find '/system/bin/installd', disabling 'installd'
[    3.061130] failed to copy MFC F/W during init
[    3.072205] init: cannot find '/system/etc/install-recovery.sh', disabling 'flash_recovery'
[    3.080437] init: cannot find '/system/bin/keystore', disabling 'keystore'
[    3.087775] init: cannot find '/system/bin/sh', disabling 'console'

android build 시 mtd-utils 에서 아래와 같이 에러가 날때....


sudo apt-get install uuid-dev zlib1g-dev liblz-dev liblzo2-2 liblzo2-dev



host C: mkfs.ubifs <= external/mtd-utils/mkfs.ubifs/mkfs.ubifs.c
host C: mkfs.ubifs <= external/mtd-utils/mkfs.ubifs/devtable.c
host C: mkfs.ubifs <= external/mtd-utils/mkfs.ubifs/lpt.c
In file included from external/mtd-utils/mkfs.ubifs/devtable.c:47:0:
external/mtd-utils/mkfs.ubifs/mkfs.ubifs.h:48:23: fatal error: uuid/uuid.h: 그런 파일이나 디렉터리가 없습니다
 #include <uuid/uuid.h>
                       ^
compilation terminated.
In file included from external/mtd-utils/mkfs.ubifs/lpt.c:23:0:
external/mtd-utils/mkfs.ubifs/mkfs.ubifs.h:48:23: fatal error: uuid/uuid.h: 그런 파일이나 디렉터리가 없습니다
 #include <uuid/uuid.h>
                       ^
compilation terminated.
host C: mkfs.ubifs <= external/mtd-utils/mkfs.ubifs/compr.c
In file included from external/mtd-utils/mkfs.ubifs/mkfs.ubifs.c:23:0:
external/mtd-utils/mkfs.ubifs/mkfs.ubifs.h:48:23: fatal error: uuid/uuid.h: 그런 파일이나 디렉터리가 없습니다
 #include <uuid/uuid.h>
                       ^
compilation terminated.
external/mtd-utils/mkfs.ubifs/compr.c:28:23: fatal error: lzo/lzo1x.h: 그런 파일이나 디렉터리가 없습니다
 #include <lzo/lzo1x.h>
                       ^
compilation terminated.
host C: sqlite3 <= external/sqlite/dist/sqlite3.c
host C: sqlite3 <= external/sqlite/dist/shell.c
make: *** [out/host/linux-x86/obj/EXECUTABLES/mkfs.ubifs_intermediates/devtable.o] 오류 1
make: *** 끝나지 않은 작업을 기다리고 있습니다....
make: *** [out/host/linux-x86/obj/EXECUTABLES/mkfs.ubifs_intermediates/mkfs.ubifs.o] 오류 1
make: *** [out/host/linux-x86/obj/EXECUTABLES/mkfs.ubifs_intermediates/lpt.o] 오류 1
make: *** [out/host/linux-x86/obj/EXECUTABLES/mkfs.ubifs_intermediates/compr.o] 오류 1

4d7ae7b79eda47e489669fbbe1f91ec501d42fb2.diff


Ubuntu 13.10(14.04) 에서 android build  시 에러 메세지 수정 포인트


Error 1
make gets killed at some point

Fix: you need more RAM to finish the build.


Error 2

Code:
frameworks/base/include/utils/KeyedVector.h:193:31: note: declarations in dependent base ‘android::KeyedVector<android::String8, android::sp<AaptDir> >’ are not found by unqualified lookup
frameworks/base/include/utils/KeyedVector.h:193:31: note: use ‘this->indexOfKey’ instead
make: *** [out/host/linux-x86/obj/EXECUTABLES/aapt_intermediates/AaptAssets.o] Error 1
Fix:
  • $ kwrite frameworks/base/tools/aapt/Android.mk
  • Add '-fpermissive' to line 31:
    • LOCAL_CFLAGS += -Wno-format-y2k -fpermissive


Error 3
Code:
frameworks/base/include/utils/KeyedVector.h:193:31: error: ‘indexOfKey’ was not declared in this scope, and no declarations were found by argument-dependent lookup at the point of instantiation [-fpermissive]
frameworks/base/include/utils/KeyedVector.h:193:31: note: declarations in dependent base ‘android::KeyedVector<android::String8, android::wp<android::AssetManager::SharedZip> >’ are not found by unqualified lookup

frameworks/base/include/utils/KeyedVector.h:193:31: note: use ‘this->indexOfKey’ instead
make: *** [out/host/linux-x86/obj/STATIC_LIBRARIES/libutils_intermediates/AssetManager.o] Error 1
Fix:
  • $ kwrite frameworks/base/libs/utils/Android.mk
  • Add '-fpermissive' to line 64:
    • LOCAL_CFLAGS += -DLIBUTILS_NATIVE=1 $(TOOL_CFLAGS) -fpermissive


Error 4
Code:
external/srec/tools/thirdparty/OpenFst/fst/lib/cache.h:136:11: note: use ‘this->SetState’ instead
make: *** [out/host/linux-x86/obj/EXECUTABLES/grxmlcompile_intermediates/grxmlcompile.o] Error 1
Fix:
  • $ cd external/srec
  • $ wget "https://github.com/CyanogenMod/android_external_srec/commit/4d7ae7b79eda47e489669fbbe1f91ec501d42fb2.diff"
  • $ patch -p1 < 4d7ae7b79eda47e489669fbbe1f91ec501d42fb2.diff
  • $ rm -f 4d7ae7b79eda47e489669fbbe1f91ec501d42fb2.diff
  • $ cd ../..


Error 5
Code:
development/tools/emulator/opengl/host/tools/emugen/main.cpp:79:9: error: ‘optind’ was not declared in this scope
development/tools/emulator/opengl/host/tools/emugen/main.cpp:92:45: error: ‘optind’ was not declared in this scope
make: *** [out/host/linux-x86/obj/EXECUTABLES/emugen_intermediates/main.o] Error 1
Fix:
  • $ kwrite development/tools/emulator/opengl/host/tools/emugen/main.cpp
  • Add '#include <getopt.h>' to list of includes:
    • #include <getopt.h>


Error 6
Code:
host C++: liboprofile_pp <= external/oprofile/libpp/arrange_profiles.cpp
In file included from external/oprofile/libpp/arrange_profiles.cpp:24:0:
external/oprofile/libpp/format_output.h:94:22: error: reference ‘counts’ cannot be declared ‘mutable’ [-fpermissive]
make: *** [out/host/linux-x86/obj/STATIC_LIBRARIES/liboprofile_pp_intermediates/arrange_profiles.o] Error 1
Fix:
  • $ kwrite external/oprofile/libpp/format_output.h
  • Remove 'mutable' from 'mutable counts_t & counts;' on line 94:
    • counts_t & counts;


Error 7
Code:
development/tools/emulator/opengl/shared/OpenglCodecCommon/GLSharedGroup.cpp:345:65:   required from here

frameworks/base/include/utils/KeyedVector.h:193:31: error: ‘indexOfKey’ was not declared in this scope, and no declarations were found by argument-dependent lookup at the point of instantiation [-fpermissive]
frameworks/base/include/utils/KeyedVector.h:193:31: note: declarations in dependent base ‘android::KeyedVector<unsigned int, ShaderData*>’ are not found by unqualified lookup

frameworks/base/include/utils/KeyedVector.h:193:31: note: use ‘this->indexOfKey’ instead
make: *** [out/host/linux-x86/obj/STATIC_LIBRARIES/libOpenglCodecCommon_intermediates/GLSharedGroup.o] Error 1
Fix:
  • $ kwrite development/tools/emulator/opengl/Android.mk
  • Add '-fpermissive' to line 25:
    • EMUGL_COMMON_CFLAGS := -DWITH_GLES2 -fpermissive


Error 8
Code:
/usr/bin/ld: note: 'XInitThreads' is defined in DSO /lib/libX11.so.6 so try adding it to the linker command line
/lib/libX11.so.6: could not read symbols: Invalid operation
collect2: error: ld returned 1 exit status
make: *** [out/host/linux-x86/obj/EXECUTABLES/emulator_renderer_intermediates/emulator_renderer] Error 1
Fix:
  • $ kwrite development/tools/emulator/opengl/host/renderer/Android.mk
  • Add new entry 'LOCAL_LDLIBS += -lX11' after line 6 as shown:
    • LOCAL_SRC_FILES := main.cpp
      LOCAL_CFLAGS += -O0 -g
      LOCAL_LDLIBS += -lX11

      #ifeq ($(HOST_OS),windows)
      #LOCAL_LDLIBS += -lws2_32


Error 9
Code:
external/llvm/include/llvm/ADT/PointerUnion.h:56:10: error: enumeral mismatch in conditional expression: ‘llvm::PointerLikeTypeTraits<llvm::PointerUnion<clang::Stmt*, const clang::Type*> >::<anonymous enum>’ vs ‘llvm::PointerLikeTypeTraits<clang::eek:bjCInterfaceDecl*>::<anonymous enum>’ [-Werror]
cc1plus: all warnings being treated as errors
make: *** [out/host/linux-x86/obj/EXECUTABLES/llvm-rs-cc_intermediates/slang_rs.o] Error 1
Fix:
  • $ kwrite frameworks/compile/slang/Android.mk
  • Remove '-Werror' from line 22:
    • local_cflags_for_slang := -Wno-sign-promo -Wall -Wno-unused-parameter


Error 10
Code:
frameworks/base/libs/rs/rsFont.cpp:224:76:   required from here

frameworks/base/include/utils/KeyedVector.h:193:31: error: ‘indexOfKey’ was not declared in this scope, and no declarations were found by argument-dependent lookup at the point of instantiation [-fpermissive]
frameworks/base/include/utils/KeyedVector.h:193:31: note: declarations in dependent base ‘android::KeyedVector<unsigned int, android::renderscript::Font::CachedGlyphInfo*>’ are not found by unqualified lookup

frameworks/base/include/utils/KeyedVector.h:193:31: note: use ‘this->indexOfKey’ instead
make: *** [out/host/linux-x86/obj/STATIC_LIBRARIES/libRS_intermediates/rsFont.o] Error 1
Fix:
  • $ kwrite frameworks/base/libs/rs/Android.mk
  • Add '-fpermissive' to line 183:
    • LOCAL_CFLAGS += -Werror -Wall -Wno-unused-parameter -Wno-unused-variable -fpermissive


Error 11
Code:
external/mesa3d/src/glsl/linker.cpp:1394:49: error: expected primary-expression before ‘,’ token
......
external/mesa3d/src/glsl/linker.cpp:1734:59: error: ‘offsetof’ was not declared in this scope
make: *** [out/host/linux-x86/obj/STATIC_LIBRARIES/libMesa_intermediates/src/glsl/linker.o] Error 1
Fix:
  • $ kwrite external/mesa3d/src/glsl/linker.cpp
  • Add '#include <stddef.h>' to list of includes as shown:
    • #include <climits>
      #include <stddef.h>
      #include <pixelflinger2/pixelflinger2_interface.h>


Error 12
Code:
external/gtest/src/../include/gtest/gtest-param-test.h:287:58: note: ‘template<class Container> testing::internal::ParamGenerator<typename Container::value_type> testing::ValuesIn(const Container&)’ declared here, later in the translation unit
make: *** [out/host/linux-x86/obj/STATIC_LIBRARIES/libgtest_host_intermediates/gtest-all.o] Error 1
Fix 1:
  • $ kwrite external/gtest/src/Android.mk
  • Add '-fpermissive' to lines 52 and 70 (both lines contain same info)
    • LOCAL_CFLAGS += -O0 -fpermissive
Fix 2:
  • $ kwrite external/gtest/include/gtest/internal/gtest-param-util.h
  • Add '#include <stddef.h>' to list of includes as shown:
    • #include <vector>
      #include <stddef.h>
      #include <gtest/internal/gtest-port.h>


Error 13
Code:
frameworks/compile/slang/slang_rs_export_foreach.cpp: In static member function ‘static slang::RSExportForEach* slang::RSExportForEach::Create(slang::RSContext*, const clang::FunctionDecl*)’:
frameworks/compile/slang/slang_rs_export_foreach.cpp:249:23: error: variable ‘ParamName’ set but not used [-Werror=unused-but-set-variable]
cc1plus: all warnings being treated as errors
make: *** [out/host/linux-x86/obj/EXECUTABLES/llvm-rs-cc_intermediates/slang_rs_export_foreach.o] Error 1
Fix:
  • $ kwrite kwrite frameworks/compile/slang/Android.mk
  • change
    • local_cflags_for_slang := -Wno-sign-promo -Wall -Wno-unused-parameter -Werror
  • to
    • local_cflags_for_slang := -Wno-sign-promo -Wall -Wno-unused-parameter


Error 14


Code:
dalvik/vm/native/dalvik_system_Zygote.cpp: In function ‘int setrlimitsFromArray(ArrayObject*)’:
dalvik/vm/native/dalvik_system_Zygote.cpp:199:19: error: aggregate ‘setrlimitsFromArray(ArrayObject*)::rlimit rlim’ has incomplete type and cannot be defined
     struct rlimit rlim;
                   ^
dalvik/vm/native/dalvik_system_Zygote.cpp:222:43: error: ‘setrlimit’ was not declared in this scope
         err = setrlimit(contents[0], &rlim);
                                           ^
make: *** [out/host/linux-x86/obj/SHARED_LIBRARIES/libdvm_intermediates/native/dalvik_system_Zygote.o] Error 1
make: *** Waiting for unfinished jobs....
Fix:
diff --git a/vm/native/dalvik_system_Zygote.cpp b/vm/native/dalvik_system_Zygote.cpp
index 8224656..f4102e8 100644
--- a/vm/native/dalvik_system_Zygote.cpp
+++ b/vm/native/dalvik_system_Zygote.cpp
@@ -19,6 +19,7 @@
  */
 #include "Dalvik.h"
 #include "native/InternalNativePriv.h"
+#include <sys/resource.h>
 
 #include 
 #if (__GNUC__ == 4 && __GNUC_MINOR__ == 7)



Error 15

/usr/include/zlib.h:34:fatal error: zconf.h: No such file or directory

system/core/gpttool/gpttool.c:

make[3]: ***[out/host/linux-x86/obj/EXECUTABLES/gpttool_intermediates/gpttool.o] Error 1

 

Fix.

sudo apt-get install zlib1g-dev

sudo cp  /usr/include/x86_64-linux-gnu/zconf.h  /usr/include/



Error 16

make: *** [out/host/linux-x86/obj/EXECUTABLES/obbtool_intermediates/Main.o] 오류 1


Fix.

vi  build/core/combo/HOST_linux-x86.mk

 56 ## bumnux
 57 #HOST_GLOBAL_CFLAGS += -D_FORTIFY_SOURCE=0
 58 HOST_GLOBAL_CFLAGS += -U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=0



Error 17

make: *** [out/host/linux-x86/obj/EXECUTABLES/test-librsloader_intermediates/test-librsloader] 오류 1

Fix.

vi  external/llvm/llvm-host-build.mk

 38 ## bumnux
 39 LOCAL_LDLIBS := -lpthread -ldl



Error 18

make: *** [out/host/linux-x86/obj/EXECUTABLES/llvm-rs-cc_intermediates/slang_rs_context.o] 오류 1

Fix.

 22 ## bumnux
 23 ##local_cflags_for_slang := -Wno-sign-promo -Wall -Wno-unused-parameter -Werror
 24 local_cflags_for_slang := -Wno-sign-promo -Wall -Wno-unused-parameter


Error 19
                 from art/compiler/dex/quick/x86/codegen_x86.h:20,
                 from art/compiler/dex/quick/x86/fp_x86.cc:17:
external/llvm/include/llvm/InitializePasses.h:144:49: internal compiler error: Segmentation fault
Please submit a full bug report,
with preprocessed source if appropriate.
See <http://source.android.com/source/report-bugs.html> for instructions.
make: *** [out/target/product/smdk4x12/obj/SHARED_LIBRARIES/libart-compiler_intermediates/dex/quick/x86/fp_x86.o] 오류 1


Fix.

sudo apt-get install --reinstall gcc gcc-4.6 gcc-4.6-base libgcc1 cpp-4.6


android  LOCK screen 안보이게 하기

--- frameworks/base/policy/src/com/android/internal/policy/impl/KeyguardViewMediator.java (리비전 15)

+++ frameworks/base/policy/src/com/android/internal/policy/impl/KeyguardViewMediator.java (작업 사본)

@@ -553,7 +553,7 @@

             }

 

             if (DEBUG) Log.d(TAG, "doKeyguard: showing the lock screen");

-            showLocked();

+            //showLocked();

         }

     }


bootanimation.zip


desc.txt 파일 내용

512 256 30

p 1 0 part0
p 0 0 part1

'523' is the width of the animation
'256' is the height of the animation
'30' is the desired fps of the animation
'p' defines a animation part
'1' how many times this animation part loops
'0' defines a pause (max 10)
'part0' is the folder name where the animation images are
'p' defines another animation part
'0' defines that it loops forever (until android starts)
'0' defines a pause
'part1' is the folder for the second animation part.

Android 에서 /system 영역 read-write 권한으로 마운트 하기.

mount -o remount,rw -t ext4 /dev/block/mmcblk0p2 /system

'Android > 공통' 카테고리의 다른 글

android LOCK screen 안보이게 하기  (0) 2012.09.28
bootanimation.zip  (0) 2012.09.03
Telephony 기능  (0) 2011.11.30
Bluetooth SPP test  (0) 2011.11.01
리눅스 커널과 안드로이드의 Suspend/Resume  (0) 2011.10.31
[펌] http://icess.egloos.com/3279459

안드로이드
SDK에서 단말기의 모뎀에서 제공하는 전화기능에 관련된 내용은 
android.telephony 패키지의 TelephonyManager클래스에서 담당한다.

단말기의 모뎀상태에 대한 정보를 얻기 위해서는 READ_PHONE_STATE권한이 필요하다.
AndroidManifest.xml파일에 아래 내용을 추가한다.
<uses-permission 
android:name="android.permission.READ_PHONE_STATE">
</uses-permission>

◆ 단말기의 모뎀상태 조회
TelephonyManager 객체를 얻기 위해서는 Context 객체에서 제공하는 getSystemService() 메서드를 이용한다.
TelephonyManager tm = (TelephonyManager) getSystemService(TELEPHONY_SERVICE);

음성통화 상태 조회
CALL_STATE_IDLE/CALL_STATE_OFFHOOK/CALL_STATE_RINGING 등의 값을 반환
Log.d("PHONE", "getCallState :" + tm.getCallState());
데이터통신 상태 조회
DATA_DISCONNECTED/DATA_CONNECTING/DATA_CONNECTED/DATA_SUSPENDED 등의 값을 반환
Log.d("PHONE", "getDataState :" + tm.getDataState());
단말기 ID 조회
GSM방식 IMEI 또는 CDMA방식의 MEID 값을 반환
Log.d("PHONE", "getDeviceId :" + tm.getDeviceId());
SW버전 조회
GSM방식의 IMEI/SV와 같은 SW버전을 반환
Log.d("PHONE", "getDeviceSoftwareVersion :" + tm.getDeviceSoftwareVersion());
전화번호 조회
GSM방식의 MSISDN과 같은 전화번호 반환
Log.d("PHONE", "getLine1Number :" + tm.getLine1Number());
국가코드 조회
현재 등록된 망 사업자의 MCC(Mobile Country Code)에 대한 ISO 국가코드 반환
Log.d("PHONE", "getNETWORKCountryIso :" + tm.getNetworkCountryIso());
Log.d("PHONE", "getSimCountryIso :" + tm.getSimCountryIso());
망 사업자코드 조회
현재 등록된 망 사업자의 MCC+MNC(Mobile Network Code) 반환
Log.d("PHONE", "getNetworkOperator :" + tm.getNetworkOperator());
Log.d("PHONE", "getSimOperator :" + tm.getSimOperator());
망 사업자명 조회
현재 등록된 망 사업자명 반환
Log.d("PHONE", "getNetworkOperatorName :" + tm.getNetworkOperatorName());
Log.d("PHONE", "getSimOperatorName :" + tm.getSimOperatorName());
망 시스템 방식 조회
현재 단말기에서 사용중인 망 시스템 방식을 반환
NETWORK_TYPE_UNKNOWN/
GSM방식 :  NETWORK_TYPE_GPRS/NETWORK_TYPE_EDGE/NETWORK_TYPE_UMTS/
NETWORK_TYPE_HSDPA/NETWORK_TYPE_HSUPA/NETWORK_TYPE_HSPA
CDMA방식 : NETWORK_TYPE_CDMA/NETWORK_TYPE_EVDO_0/NETWORK_TYPE_EVDO_A/NETWORK_TYPE_1xRTT
Log.d("PHONE", "getNetworkType :" + tm.getNetworkType());
단말기 종류 조회
단말기에서 지원하는 망의 종류를 반환
PHONE_TYPE_NONE/PHONE_TYPE_GSM/PHONE_TYPE_CDMA 등의 값을 반환
Log.d("PHONE", "getPhoneType :" + tm.getPhoneType());
SIM카드 Serial Number 조회
Log.d("PHONE", "getSimSerialNumber :" + tm.getSimSerialNumber());
SIM카드 상태 조회
SIM_STATE_UNKNOWN/SIM_STATE_ABSENT/SIM_STATE_PIN_REQUIRED/SIM_STATE_PUK_REQUIRED/
SIM_STATE_NETWORK_LOCKED/SIM_STATE_READY 등의 값을 반환
Log.d("PHONE", "getSimState :" + tm.getSimState());
가입자 ID 조회
GSM방식의 IMSI와 같은 가입자 ID 반환
Log.d("PHONE", "getSubscriberId :" + tm.getSubscriberId());

◆ 조회결과
getCallState :0(CALL_STATE_IDLE)
getDataState :2(DATA_ACTIVITY_OUT)
getDeviceId :000000000000000
getDeviceSoftwareVersion :null
getLine1Number :15555218135
getNetworkCountryIso :us
getNetworkOperator :310260
getNetworkOperatorName :Android
getNetworkType :3(NETWORK_TYPE_UMTS)
getPhoneType :1(PHONE_TYPE_GSM)
getSimCountryIso :us
getSimOperator :310260
getSimOperatorName :Android
getSimSerialNumber :89014103211118510720
getSimState :5(SIM_STATE_READY)
getSubscriberId :310260000000000

실제상황에서는 이와같이 현재 단말기의 상태를 직접 조회하는것이 아니라 
상태정보가 변경될 때 자동으로 인식해야하는 상황이 훨씬 많을것이다.
이럴때는 TelephonyManager의 listen()를 이용하여 콜백메서드를 등록하면 가능하다.
        tm.listen(new PhoneStateListener(){
         public void onCallStateChanged(int state, String incomingNumber){
         if (state == TelephonyManager.CALL_STATE_RINGING){
         Log.d("Telephony", "state = " + state + ", number = " + incomingNumber);
         }else{
         Log.d("Telephony", "state = " + state);
         }        
         }
        }, PhoneStateListener.LISTEN_CALL_STATE);

onCallStateChanged() 이외에도 아래와 같은 상태변화를 감지할 수 있다.
- onCallForwardingIndicatorChanged() : 호전환(Call Forwarding) 상태 변화
- onCellLocationChanged() : 단말기의 Cell위치 변화
- onDataActivity() : Data 활성화 상태 변화
- onDataConnectionStateChanged() : Data 연결상태 변화
- onMessageWaitingIndicatorChanged() : 메시지 대기상태 변화
- onServiceStateChanged() : 단말기의 서비스 상태 변화
- onSignalStrengthsChanged() : 망의 신호강도 변화

◆ 전화번호 처리
각 국가별로 전화번호의 형식이 다르다. 
한국은 01x-xxxx-xxxx 이 일반적이고,
북미는 xxx-xxx-xxxx가 된다.
PhoneNumberUtils.formatNumber() 메서드를 사용하면 설정된 Locale에 맞게 형식화 된다.
String formattedTelNumber = PhoneNumberUtils.formatNumber("01098761234");
        Log.d("Telephony", "formattedTelNumber :" + formattedTelNumber);
Locale을 English(United States)로 할경우 010-987-61234로 출력된다.
한국어로 할 경우는 01098761234가 그대로 출력된다.
formatNumber() 메서드의 구현내용을 살펴봐야 할듯 하다.

EditText에서 전화번호를 입력받을 경우에도 자동으로 형식화가 가능하다.
EditText객체의 addTextChangedListener에 PhoneNumberFormattingTextWatcher()를 등록하기만 하면 된다.
        EditText tn = (EditText) findViewById(R.id.edtTelNumber);
        tn.addTextChangedListener(new PhoneNumberFormattingTextWatcher());
그러나 역시 한국어로는 동작하지 않았다.

출처:Telephony 기능

 [펌] http://blog.naver.com/PostView.nhn?blogId=free2824&logNo=60108857440

어떤 분이 친절하게 chatting 프로그램을 만들어서 공유를 하셨다.
소스 다운받아 두 개의 device에 apk 설치하고 테스트 하면 된다.
특별히 할 건 없고 서로 pairing만 해주고 프로그램 실행시켜 chatt 해보면 된다.

[펌] http://taehyo.egloos.com/4091452

출처: http://kzjblog.appsp0t.com/2010/11/20/suspend-en.html
       (원문 번역과 더불어 내용을 추가/수정/보완/삭제 하였음을 밝힙니다.)


개요

Suspend/Resume 은 리눅스 커널이 제공하는 기능으로 모바일 환경이 점점 보급되고 빠른 부팅 시간에 대한 요구가 늘어나면서 필요성이 증대되었다. 이 글은 리눅스의 Suspend/Resume을 개괄적으로 알아보고 안드로이드가 전원을 관리하는 방법에 대해 소개한다.


Version
Linux Kernel: v2.6.35.7
Android: Gingerbread(v2.3.3)


Suspend 소개
Suspend 는 크게 3부분으로 나눌 수 있다: 프로세스와 태스크들을 프리징하고(Freezing)/모든 드라이버의 suspend 콜백 함수를 호출하고/CPU와 코어 시스템 디바이스를 Suspend한다. 프로세스의 프리징은 모든 프로세스를 멈추는 것과 동일하다. 그리고 resume을 할 때 프로세스들은 중단한 일이 없었던 것처럼 다시 실행하기 시작한다. user space프로세스와 kernel space의 태스크들은 멈췄었다는 사실을 전혀 인지하지 못한다. 그러면 사용자는 어떻게 리눅스 시스템을 suspend 시킬까? 사용자는 sys 파일시스템의 파일을 읽고 쓸 수 있다: /sys/power/state 파일을 통해 커널의 전원 관리 서비스를 이용할 수 있다.
예를 들어
      # echo standby > /sys/power/state
명령으로 시스템을 suspend 시키고,
      # cat /sys/power/state
명령으로 커널에서 제공하는 전원 관리 상태(PM method)의 수를 알 수 있다.
이 상태는 'mem' (Suspend-to-RAM), 그리고 'disk'(Suspend-to-disk)의 값으로 하드 코딩(pm_states[PM_SUSPEND_MAX])되어 있다.



리눅스 시스템의 Suspend
파일:

아래의 경로에서 해당되는 리눅스의 소스코드를 확인할 수 있다.
   - linux_soruce/kernel/power/main.c
   - linux_source/kernel/arch/xxx/mach-xxx/pm.c
이 제 Suspend가 어떻게 일어나는지 살펴보자. user space 인터페이스인 /sys/power/state는 main.c의 state_store() 함수와 관련이 있다: const char * const pm_state[]으로 정의된 문자열("mem" 또는 "standby")을 사용할 수 있다. 일반적인 리눅스 커널에서 시스템이 Suspend 상태가 될 때 제일 먼저 suspend.c의 enter_state() 함수로 들어온다. enter_state() 함수는 먼저 시스템 상태가 유효(valid)한지 검사하고 파일 시스템을 sync(do all page writeback)한다.

/-*
 * enter_state - Do common work of entering low-power state.
 * @state:  pm_state structure for state we're entering.
 *
 * Make sure we're the only ones trying to enter a sleep state. Fail
 * if someone has beat us to it, since we don't want anything weird to
 * happen when we wake up.
 * Then, do the setup for suspend, enter the state, and cleaup (after
 * we've woken up).
 *-
int enter_state(suspend_state_t state)
{
    int error;

    suspend_test_start_level(TEST_SUSPEND_TIME_TOP);

    if (!valid_state(state)) {
        error = -ENODEV;
        goto End;
    }

    if (!mutex_trylock(&pm_mutex)) {
        error = -EBUSY;
        goto End;
    }

    printk(KERN_INFO "PM: Syncing filesystems ... ");
    sys_sync();
    printk("done.\n");

    pr_debug("PM: Preparing system for %s sleep\n", pm_states[state]);
    error = suspend_prepare();
    if (error)
        goto Unlock;

    if (suspend_test(TEST_FREEZER))
        goto Finish;

    pr_debug("PM: Entering %s sleep\n", pm_states[state]);
    error = suspend_devices_and_enter(state);

    Finish:
    pr_debug("PM: Finishing wakeup.\n");
    suspend_finish();
    Unlock:
    mutex_unlock(&pm_mutex);

    End:
    suspend_test_finish_level(TEST_SUSPEND_TIME_TOP, "total transition time of resume");
    return error;
}

준비, 프로세스 프리징
suspend_prepare() 함수는 suspend를 위한 콘솔을 할당하고(pm_prepare_console()) suspend notifier를 실행하고(pm_notifier_call_chain(PM_SUSPEND_PREPARE)) user 모드 헬퍼를 비활성화하고(usermodehelper_disable()) suspend_freeze_processes() 함수를 호출한다. suspend_freeze_processes() 함수는 모든 프로세스의 현재 상태를 저장한다. 프리징 단계에서 몇몇 태스크나 user space의 프로세스가 프리징되는 것을 거부하는 경우에는 suspend 상태로 들어가는 것을 취소하고 모든 프로세스의 프리징을 해제한다.

/-*
 * suspend_prepare - Do prep work before entering low-power state.
 *
 * This is common code that is called for each state that we're entering.
 * Run suspend notifiers, allocate a console and stop all processes.
 *-
static int suspend_prepare(void)
{
    int error;

    if (!suspend_ops || !suspend_ops->enter)
        return -EPERM;

    pm_prepare_console();

    error = pm_notifier_call_chain(PM_SUSPEND_PREPARE);
    if (error)
        goto Finish;

    error = usermodehelper_disable();
    if (error)
        goto Finish;

    error = suspend_freeze_processes();
    if (!error)
        return 0;

    suspend_thaw_processes();
    usermodehelper_enable();
    Finish:
    pm_notifier_call_chain(PM_POST_SUSPEND);
    pm_restore_console();
    return error;
}

Suspend Devices
이 제 모든 프로세스(process/workqueue/kthread)가 멈췄고 이 프로세스들은 lock된 세마포어를 가지고 있을 것이다. 이 때 드라이버의 suspend 함수에서 프로세스를 기다리고 있다면 데드락이 발생한다. 그리고 커널은 나중을 위하여 어느 정도의 메모리 공간을 free한다. 마지막으로 모든 장치를 suspend하기 위하여 suspend_devices_and_enter()를 호출한다. 이 함수에서는 시스템에 suspend_ops->begin()가 있는 경우 suspend_ops->begin() 함수를 호출하고 driver/base/power/main.c의 dpm_suspend() 함수를 호출한다. dpm_suspend() 함수에서는 device_suspend() 함수를 호출하여모든 non-sysdev 장치의 suspend 콜백 함수를 호출한다. 다시 suspend_devices_and_enter() 함수로 돌아와서 suspen_enter()를 호출한다. 이 함수에서는 시스템과 관련된 준비를 하기 위해 suspend_ops->prepare()를 호출하고 레이스 컨디션을 피하기 위해 nonboot CPU를 비활성화 한다. 이 과정을 마치면 단 한개의 cpu만 실행이 되는 상태가 된다. suspend_ops는 시스템 관련 전원 관리 함수를 묶어놓은 스트럭쳐로 일반적으로 arch/xxx/mach-xxx/pm.c에서 등록된다. arch_suspend_disable_irqs() 함수를 호출하여 IRQ가 비활성화하고, sysdev_suspend() 함수를 호출하여 모든 시스템 장치를 suspend한다. 이 때 /sys/devices/system/ 위치의 모든 시스템 디바이스가 suspend된다. 마지막으로 suspend_ops->enter() 함수가 호출되는데, cpu가 파워 세이브 모드로 진입하고 시스템의 동작이 여기서 모두 멈춘다(당연히 모든 코드 수행이 여기에서 멈추게 된다).

/-*
 * suspend_devices_and_enter - suspend devices and enter the desired system
 *        sleep state.
 * @state:    state to enter
 *-
int suspend_devices_and_enter(suspend_state_t state)
{
    int error;
    gfp_t saved_mask;

    if (!suspend_ops)
        return -ENOSYS;

    if (suspend_ops->begin) {
        error = suspend_ops->begin(state);
        if (error)
            goto Close;
    }
    suspend_console();
    saved_mask = clear_gfp_allowed_mask(GFP_IOFS);
    suspend_test_start();
    error = dpm_suspend_start(PMSG_SUSPEND);
    if (error) {
        printk(KERN_ERR "PM: Some devices failed to suspend\n");
        goto Recover_platform;
    }
    suspend_test_finish("suspend devices");
    if (suspend_test(TEST_DEVICES))
        goto Recover_platform;

    suspend_enter(state);

    Resume_devices:
    suspend_test_start();
    dpm_resume_end(PMSG_RESUME);
    suspend_test_finish("resume devices");
    set_gfp_allowed_mask(saved_mask);
    resume_console();
    Close:
    if (suspend_ops->end)
        suspend_ops->end();
    return error;

    Recover_platform:
    if (suspend_ops->recover)
        suspend_ops->recover();
    goto Resume_devices;
}


Resume
만 약 시스템이 인터럽트 혹은 다른 이벤트에 의해 깨어나면 코드의 수행이 다시 시작한다. 가장 먼저 resume되는 것은 /sys/devices/system/ 위치에 있는 장치들이다(sysdev_resume()). 그리고 IRQ를 활성화하고(arch_suspend_enable_irqs()) nonboot CPU를 활성화한 후(enable_nonboot_cpus()) 시스템 resume이 시작되었다는 것을 알리기 위해 suspend_ops->wake() 함수와 suspend_ops->finish() 함수를 호출한다. suspend_devices_and_enter() 함수에서 모든 장치를 깨우기 위해 dpm_resume_end() 함수를 호출하여 모든 장치의 resume() 함수를 호출하고 콘솔을 resume 하며 마지막으로 suspend_ops->end()를 호출한다. 다시 enter_state() 함수로 돌아오면 suspend_devices_and_enter() 함수를 빠져나와 장치가 실행되는 상태이지만 user space의 프로세스와 태스크들은 여전히 프리즈된 상태이다. enter_state() 함수는 나중에 suspend_finish() 함수를 호출하여 프로세스를 깨우고(suspend_thaw_processes()) user 모드 헬퍼를 활성화하며(usermodehelper_enable()) 모든 pm에 suspend 단계에서 빠져나왔다는 것을 알린 후(pm_notifier_call_chain) 콘솔을 복구(restore)한다.
이 단계가 일반적인 리눅스의 suspend와 resume가 실행되는 과정이다.



안드로이드 Suspend
안 드로이드용으로 패치된 커널에서는 Suspend가 되기 전(enter_state() 함수를 호출하기 전)에 kernel/power/earlysuspend.c 파일의 request_suspend_state()함수를 호출한다(안드로이드는 Early Suspend와 Wake Lock 기능을 커널에 추가했다). 이를 좀 더 자세한 이해를 위해 먼저 안드로이드가 추가한 새로운 기능에 대해서 소개하겠다.

파일:
   - linux_source/kernel/power/main.c
   - linux_source/kernel/power/earlysuspend.c
   - linux_source/kernel/power/wakelock.c
 
기능
Early Suspend
Early Suspend는 안드로이드가 리눅스 커널에 새로 추가한 메커니즘이다. Early Suspend는 리눅스의 '진짜' Suspend와 LCD 스크린 오프의 사이에 존재하는 상태이다. LCD 스크린을 끄면 배터리 수명과 몇몇 기능적인 요구사항에 의해 LCD 백라이트나 G-Sensor, 터치스크린 등이 멈추게 된다.



Late Resume
Late Resume은 Early Suspend와 쌍을 이루는 메커니즘으로 커널과 시스템 Resume이 끝난 후 수행이 된다. 이 때 Early Suspend에서 Suspend된 장치들이 Resume하게 된다.



Wake Lock
Wake Lock은 안드로이드 전원 관리 시스템의 핵심을 이루는 기능이다. Wake Lock은 kernel space 혹은 user space의 서비스나 어플리케이션에서 lock을 잡고 있는 경우(timeout lock이거나 timeout lock이 아니거나)에 시스템은 Sleep 상태로 진입할 수 없도록 막는다. timeout lock은 설정한 시간이 되면 자동으로 lock이 풀리고 안드로이드용으로 패치된 리눅스 커널(이하 안드로이드 커널)은 리눅스 Suspend(pm_suspend())를 불러 전체 시스템을 Suspend시킨다.



안드로이드 Suspend
사 용자가 /sys/power/state에 "mem"이나 "standby"를 write하면 state_store()가 호출된다. 그리고 request_suspend_state() 함수로 들어온다. 이 함수에서 상태를 검사하고 Suspend 요청인 경우 early_suspend_work->early_suspend()를 큐에 넣는다.

void request_suspend_state(suspend_state_t new_state)
{
    unsigned long irqflags;
    int old_sleep;

    spin_lock_irqsave(&state_lock, irqflags);
    old_sleep = state & SUSPEND_REQUESTED;
    if (debug_mask & DEBUG_USER_STATE) {
        struct timespec ts;
        struct rtc_time tm;
        getnstimeofday(&ts);
        rtc_time_to_tm(ts.tv_sec, &tm);
        pr_info("request_suspend_state: %s (%d->%d) at %lld "
            "(%d-%02d-%02d %02d:%02d:%02d.%09lu UTC)\n",
            new_state != PM_SUSPEND_ON ? "sleep" : "wakeup",
            requested_suspend_state, new_state,
            ktime_to_ns(ktime_get()),
            tm.tm_year + 1900, tm.tm_mon + 1, tm.tm_mday,
            tm.tm_hour, tm.tm_min, tm.tm_sec, ts.tv_nsec);
    }
    if (!old_sleep && new_state != PM_SUSPEND_ON) {
        state |= SUSPEND_REQUESTED;
        queue_work(suspend_work_queue, &early_suspend_work);
    } else if (old_sleep && new_state == PM_SUSPEND_ON) {
        state &= ~SUSPEND_REQUESTED;
        wake_lock(&main_wake_lock);
        queue_work(suspend_work_queue, &late_resume_work);
    }
    requested_suspend_state = new_state;
    spin_unlock_irqrestore(&state_lock, irqflags);
}

Early Suspend
early_suspend() 함수에서는 먼저 요청한 상태를 검사하는데, 요청한 상태가 Suspend(SUSPEND_REQUESTED)인 경우 Suspend 취소 요청을 막기 위해 상태를 Suspend로 변경한다(user 프로세스가 여전히 동작하고 있기 때문에). 그리고 early suspend에 등록된 모든 핸들러의 suspend() 함수를 호출한다. 그 다음 파일 시스템을 sync하고 main_wake_lock을 푼다(unlock).

static void early_suspend(struct work_struct *work)
{
    struct early_suspend *pos;
    unsigned long irqflags;
    int abort = 0;

    mutex_lock(&early_suspend_lock);
    spin_lock_irqsave(&state_lock, irqflags);
    if (state == SUSPEND_REQUESTED)
        state |= SUSPENDED;
    else
        abort = 1;
    spin_unlock_irqrestore(&state_lock, irqflags);

    if (abort) {
        if (debug_mask & DEBUG_SUSPEND)
            pr_info("early_suspend: abort, state %d\n", state);
        mutex_unlock(&early_suspend_lock);
        goto abort;
    }

    if (debug_mask & DEBUG_SUSPEND)
        pr_info("early_suspend: call handlers\n");
    list_for_each_entry(pos, &early_suspend_handlers, link) {
        if (pos->suspend != NULL)
            pos->suspend(pos);
    }
    mutex_unlock(&early_suspend_lock);

    if (debug_mask & DEBUG_SUSPEND)
        pr_info("early_suspend: sync\n");

    sys_sync();
abort:
    spin_lock_irqsave(&state_lock, irqflags);
    if (state == SUSPEND_REQUESTED_AND_SUSPENDED)
    {
#ifndef CONFIG_EARLY_SUSPEND_ONLY
        wake_unlock(&main_wake_lock);
#endif /- EARLY_SUSPEND_ONLY *-
    }
    spin_unlock_irqrestore(&state_lock, irqflags);
}

 

Late Resume
모든 커널 Resume 과정을 마치면 user space의 프로세스와 서비스가 실행된다. 시스템이 깨어나는 경우는 다음과 같다.

  - 전화가 왔을 때
   전화가 오면 모뎀은 rild(RING 명령)로 명령을 모내고 rild는 Call 이벤트 처리를 위하여 WindowManager와 어플리케이션으로 이벤트 메시지를 보낸다. PowerManagerSerive는 또한 /sys/power/state에 "on"을 write하여 커널이 Late Resume을 수행하도록 한다.

  - 키 이벤트
   시스템이 파워키나 메뉴키 등의 키 이벤트에 의해 깨어난 경우 이벤트는 WindowManaver와 어플리케이션으로 보내지고 해당 이벤트를 처리한다. 키 이벤트는 두 가지 경우로 나눌 수 있는데 만약 리턴 키나 홈 키와 같이 시스템을 깨울 수 있는 키가 아닌 경우 WindowManager는 Wake Lock을 풀어 다시 시스템이 Suspend로 돌아가도록 한다. 반면에 키 이벤트가 시스템을 깨울 수 있는 키인 경우 WindowManager는 PowerManagerService를 호출하여 Late Resume을 수행할 수있도록 한다.


  - Late Resume은 Early Suspend 장치 리스트의 resume 함수를 호출한다.

static void late_resume(struct work_struct *work)
{
    struct early_suspend *pos;
    unsigned long irqflags;
    int abort = 0;

    mutex_lock(&early_suspend_lock);
    spin_lock_irqsave(&state_lock, irqflags);
    if (state == SUSPENDED)
        state &= ~SUSPENDED;
    else
        abort = 1;
    spin_unlock_irqrestore(&state_lock, irqflags);

    if (abort) {
        if (debug_mask & DEBUG_SUSPEND)
            pr_info("late_resume: abort, state %d\n", state);
        goto abort;
    }
    if (debug_mask & DEBUG_SUSPEND)
        pr_info("late_resume: call handlers\n");
    list_for_each_entry_reverse(pos, &early_suspend_handlers, link)
        if (pos->resume != NULL)
            pos->resume(pos);
    if (debug_mask & DEBUG_SUSPEND)
        pr_info("late_resume: done\n");
abort:
    mutex_unlock(&early_suspend_lock);
}


기존 리눅스 Suspend와 다른 점
안드로이드에서도 pm_suspend()가 enter_state()를 호출하여 suspend 상태가 되지만 기존 리눅스 커널의 suspend 과정과 100% 동일하지는 않다:
프로세스를 Freezing할 때 안드로이드는 wake lock이 있는지 확인하고, wake lock이 있는 경우 suspend 과정이 실행되지 않는다.



추가 참고 자료

Wake Lock 관련: http://www.kandroid.org/online-pdk/guide/power_management.html#androidPowerWakeLocks
RIL 관련: http://www.kandroid.org/board/board.php?board=AndroidLib&command=body&no=41

[펌] ODROID

1

How to fix problem of incompatibility between GCC 4.6 and Android 2.3 (Gingerbread)

Posted: May 27, 2011 by buildall in Android, Ubuntu
Tags: , ,
2
 
 
 
 
 
 
12 Votes

Hello everybody. Let’s see how we can fix one problem that can happen when you try to compile the Android 2.3 after you already have installed GCC 4.6.

During Android compilation you can receive the following error message:

host Executable: acp (out/host/linux-x86/obj/EXECUTABLES/acp_intermediates/acp)
host SharedLib: libneo_cs (out/host/linux-x86/obj/lib/libneo_cs.so)
host C++: libutils <= frameworks/base/libs/utils/RefBase.cpp
frameworks/base/libs/utils/RefBase.cpp: In member function ‘void android::RefBase::weakref_type::trackMe(bool, bool)’:
frameworks/base/libs/utils/RefBase.cpp:483:67: error: passing ‘const android::RefBase::weakref_impl’ as ‘this’ argument of ‘void android::RefBase::weakref_impl::trackMe(bool, bool)’ discards qualifiers [-fpermissive]
make: *** [out/host/linux-x86/obj/STATIC_LIBRARIES/libutils_intermediates/RefBase.o] Error 1
make: *** Waiting for unfinished jobs....

To fix that, open a terminal and run (assuming you are in the folder android):

gedit frameworks/base/libs/utils/Android.mk

Change the line:

LOCAL_CFLAGS += -DLIBUTILS_NATIVE=1 $(TOOL_CFLAGS)

To:

LOCAL_CFLAGS += -DLIBUTILS_NATIVE=1 $(TOOL_CFLAGS) -fpermissive

After that, save the file and recompile the Android again.

That’s it. See you next time.



2

out/host/linux-x86/obj/STATIC_LIBRARIES/libcutils_intermediates/libcutils.a(threads.o): In function `thread_store_get"":

/home/leno/works/android_dev/bin/system/core/libcutils/threads.c:27: undefined reference to `pthread_getspecific""

out/host/linux-x86/obj/STATIC_LIBRARIES/libcutils_intermediates/libcutils.a(threads.o): In function `thread_store_set"":

/home/leno/works/android_dev/bin/system/core/libcutils/threads.c:36: undefined reference to `pthread_key_create""

/home/leno/works/android_dev/bin/system/core/libcutils/threads.c:44: undefined reference to `pthread_setspecific""

collect2: ld returned 1 exit status

make: *** [out/host/linux-x86/obj/EXECUTABLES/localize_intermediates/localize]

批改./framework/base/tools/localize/Android.mk文件

ifeq (¥(HOST_OS),linux)

#LOCAL_LDLIBS += -lrt       把这行注释掉,改为下面一行。

LOCAL_LDLIBS += -lrt -lpthread

endif


3

host utable: aapt (out/host/linux-x86/obj/EXECUTABLES/aapt_intermediates/aapt)

out/host/linux-x86/obj/STATIC_LIBRARIES/libcutils_intermediates/libcutils.a(threads.o): In function `thread_store_get"":

/home/leno/works/android_dev/bin/system/core/libcutils/threads.c:27: undefined reference to `pthread_getspecific""

out/host/linux-x86/obj/STATIC_LIBRARIES/libcutils_intermediates/libcutils.a(threads.o): In function `thread_store_set"":

/home/leno/works/android_dev/bin/system/core/libcutils/threads.c:36: undefined reference to `pthread_key_create""

/home/leno/works/android_dev/bin/system/core/libcutils/threads.c:44: undefined reference to `pthread_setspecific""

collect2: ld returned 1 exit status

make: *** [out/host/linux-x86/obj/EXECUTABLES/aapt_intermediates/aapt] 错误 1

解决:

打开 frameworks/base/tools/aapt/Android.mk

然后打开文件Android.mk,编辑下面一行:

ifeq (¥(HOST_OS),linux)

#LOCAL_LDLIBS += -lrt       把这行注释掉,改为下面一行。

LOCAL_LDLIBS += -lrt -lpthread



4
    <command-line>:0:0: error: "_FORTIFY_SOURCE" redefined [-Werror]
    <built-in>:0:0: note: this is the location of the previous definition
    cc1plus: all warnings being treated as errors

error: "_FORTIFY_SOURCE" redefined [-Werror]


build/core/combo/HOST_linux-x86.mk line 61: #HOST_GLOBAL_CFLAGS += -D_FORTIFY_SOURCE=0 HOST_GLOBAL_CFLAGS += -U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=0



Android.mk 파일에 다음을 넣어 준다.

LOCAL_PRELINK_MODULE:=false
[펌] http://www.androidpub.com/3715

전체 소스를 http://source.android.com/download 에서 하라는데로 다운로드 받고 한번 빌드하는 것까지는 다들 쉽게 따라하셨을 것이라 생각합니다. 그 이후에 특정부분만 다시 빌드하고 싶을 때는 다시 make를 할 필요없이 mmm이라는 커맨드를 사용하면 됩니다. 

$. build/envsetup.sh
을 실행한 후

$ mmm packages/apps/Contacts
와 같이 시행하면 Contacts부분만 다시 빌드됩니다. Android.mk가 존재하는 Path만 적용할 수 있습니다.

$ make snod
를 실행하면 위에서 빌드한 Contacts를 적용한 system.img 를 다시 빠르게 생성합니다.

그리고 한글등이 들어갈 때 utf8 인코딩을 쓰게는데 안드로이드 플랫폼 소스 빌드시에 javac가 ascii 인코딩으로 설정되어있습니다.

build/core/definitions.mk 에서 -encoding ascii 를 -encoding utf8로 바꿔주면 됩니다. utf8 소스도 사용할 수 있습니다.

그리고 mmm과 별도로
$make sdk
를 통해 SDK를 만들 수 있습니다.


안드로이드의 BlueTooth는 1.5, 1.6버젼에서는 A2DP, AVRCP(AV Remote Control), HSP(Headset), HFP(Hands Free) 정도만 지원했다. 안드로이드 2.0 버젼부터 OOP(Push Profile), PBAP(Phone Book Access Profile) 등을 지원한다고 한다.

안드로이드에서 BlueTooth를 사용하려면 Vendor에서 정의하는 BoardConfig.mk에서 BOARD_HAVE_BLUETOOTH를 true로 설정해야 한다.

 

기본 구조에 대하여 참고할만한 곳은 다음과 같다.

http://sites.google.com/a/android.com/opensource/projects/bluetooth-faq

기본 구조

system server 와  BlueZ 와의 인터페이스를 담당하는 D-Bus는 다음을 참고한다.

http://www.freedesktop.org/wiki/Software/dbus

http://daeji.tistory.com/entry/D-BUS

http://bebop.emstone.com/research/tech/dbus/dbus_overview

아직 확실하지는 않지만

BT Power on/off 를 담당하는 소스는 다음 파일 같다.

system/bluetooth/bluedroid/bluetooth.c

실제 하드웨어를 컨트롤하는 부분은 보이지 않으며 함수 Call에 따라 내부 설정 등을 변경해 놓는다.

하드웨어 컨트롤 관련된 부부은 2.01에서는 별도로 추가된 것으로 보이며 이는 1.6 버젼까지는 이 쪽에 대충 떄려 넣어야 할 것 같다.

Make파일을 보면 공유 라이브러리 libbluedroid.so 파일로 만든다.

이 라이브러리는 Java에서 사용 가능하도록 다음에서 라이브러리를 정의한다.

frameworks/base/core/jni/Android.mk

이를 보면 결론적으로 BlueTooth와 관련된 JNI 관련 파일은 다음 세 파일이다.

android_server_BlueToothA2dpService.cpp

android_server_BlueToothDeviceService.cpp

android_server_BlueToothEventLoop.cpp

그 외 파일들은

android_bluetooth_Database.cpp

android_bluetooth_HeadsetBase.cpp

android_bluetooth_common.cpp

dbus 관련 함수

android_bluetooth_BluetoothAudioGateway.cpp

* android_bluetooth_RfcommSocket.cpp

* android_bluetooth_BluetoothSocket.cpp

socket 통신 관련 (write, read, ...)

android_bluetooth_ScoSocket.cpp

Sco socket 통신 관련 (init, connect, accept, close ...)

당연한 얘기지만 BlueTooth의 A2DP, HSP, HFP 등을 사용하면 오디오 출력에 영향을 미치므로

framework/base/libs/audioflinger 쪽도 영향을 받는다.

BlueZ에 대한 소스는 external/bluez 에 있다.

참고할만한 기사

http://ko.broadcom.com/press/release.php?id=s363853

 

 

 

원본 위치 http://blog.daum.net/baramjin/16011028

deb http://kr.archive.ubuntu.com/ubuntu 이 사이트는 오래 전에 막혔다.
따라서 /etc/apt/sources.list에서
deb http://kr.archive.ubuntu.com/ubuntu 등을  주석처리 하고 아래와 같이 다음 사이트로 변경한다.
한 네티즌의 댓글로 ftp.daum.net 에서 old-releases.ubuntu.com으로 변경

#################다음 저장소 #####################
#deb http://ftp.daum.net/ubuntu maverick main multiverse restricted universe
#deb-src http://ftp.daum.net/ubuntu maverick main multiverse restricted universe
#deb http://ftp.daum.net/ubuntu maverick-backports main multiverse restricted universe
#deb-src http://ftp.daum.net/ubuntu maverick-backports main multiverse restricted universe
#deb http://ftp.daum.net/ubuntu maverick-proposed main multiverse restricted universe
#deb-src http://ftp.daum.net/ubuntu maverick-proposed main multiverse restricted universe
#deb http://ftp.daum.net/ubuntu maverick-security main multiverse restricted universe
#deb-src http://ftp.daum.net/ubuntu maverick-security main multiverse restricted universe
#deb http://ftp.daum.net/ubuntu maverick-updates main multiverse restricted universe
#deb-src http://ftp.daum.net/ubuntu maverick-updates main multiverse restricted universe
##################################################


##################### old-releases ######################

deb http://old-releases.ubuntu.com/ubuntu/ intrepid main restricted
deb-src http://old-releases.ubuntu.com/ubuntu/ intrepid main restricted

#deb http://kr.archive.ubuntu.com/ubuntu/ intrepid main restricted
#deb-src http://kr.archive.ubuntu.com/ubuntu/ intrepid main restricted

## Major bug fix updates produced after the final release of the
## distribution.

deb http://old-releases.ubuntu.com/ubuntu/ intrepid-updates main restricted
deb-src http://old-releases.ubuntu.com/ubuntu/ intrepid-updates main restricted

#deb http://kr.archive.ubuntu.com/ubuntu/ intrepid-updates main restricted
#deb-src http://kr.archive.ubuntu.com/ubuntu/ intrepid-updates main restricted

## N.B. software from this repository is ENTIRELY UNSUPPORTED by the Ubuntu
## team. Also, please note that software in universe WILL NOT receive any
## review or updates from the Ubuntu security team.

deb http://old-releases.ubuntu.com/ubuntu/ intrepid universe
deb-src http://old-releases.ubuntu.com/ubuntu/ intrepid universe
deb http://old-releases.ubuntu.com/ubuntu/ intrepid-updates universe
deb-src http://old-releases.ubuntu.com/ubuntu/ intrepid-updates universe

#deb http://kr.archive.ubuntu.com/ubuntu/ intrepid universe
#deb-src http://kr.archive.ubuntu.com/ubuntu/ intrepid universe
#deb http://kr.archive.ubuntu.com/ubuntu/ intrepid-updates universe
#deb-src http://kr.archive.ubuntu.com/ubuntu/ intrepid-updates universe

## N.B. software from this repository is ENTIRELY UNSUPPORTED by the Ubuntu
## team, and may not be under a free licence. Please satisfy yourself as to
## your rights to use the software. Also, please note that software in
## multiverse WILL NOT receive any review or updates from the Ubuntu
## security team.

deb http://old-releases.ubuntu.com/ubuntu/ intrepid multiverse
deb-src http://old-releases.ubuntu.com/ubuntu/ intrepid multiverse
deb http://old-releases.ubuntu.com/ubuntu/ intrepid-updates multiverse
deb-src http://old-releases.ubuntu.com/ubuntu/ intrepid-updates multiverse

#deb http://kr.archive.ubuntu.com/ubuntu/ intrepid multiverse
#deb-src http://kr.archive.ubuntu.com/ubuntu/ intrepid multiverse
#deb http://kr.archive.ubuntu.com/ubuntu/ intrepid-updates multiverse
#deb-src http://kr.archive.ubuntu.com/ubuntu/ intrepid-updates multiverse

## Uncomment the following two lines to add software from the 'backports'
## repository.
## N.B. software from this repository may not have been tested as
## extensively as that contained in the main release, although it includes
## newer versions of some applications which may provide useful features.
## Also, please note that software in backports WILL NOT receive any review
## or updates from the Ubuntu security team.
# deb http://kr.archive.ubuntu.com/ubuntu/ intrepid-backports main restricted universe multiverse
# deb-src http://kr.archive.ubuntu.com/ubuntu/ intrepid-backports main restricted universe multiverse

## Uncomment the following two lines to add software from Canonical's
## 'partner' repository. This software is not part of Ubuntu, but is
## offered by Canonical and the respective vendors as a service to Ubuntu
## users.
# deb http://archive.canonical.com/ubuntu intrepid partner
# deb-src http://archive.canonical.com/ubuntu intrepid partner


deb http://old-releases.ubuntu.com/ubuntu intrepid-security main restricted
deb-src http://old-releases.ubuntu.com/ubuntu intrepid-security main restricted
deb http://old-releases.ubuntu.com/ubuntu intrepid-security universe
deb-src http://old-releases.ubuntu.com/ubuntu intrepid-security universe
deb http://old-releases.ubuntu.com/ubuntu intrepid-security multiverse
deb-src http://old-releases.ubuntu.com/ubuntu intrepid-security multiverse


#deb http://security.ubuntu.com/ubuntu intirepid-security main restricted
#deb-src http://security.ubuntu.com/ubuntu intrepid-security main restricted
#deb http://security.ubuntu.com/ubuntu intrepid-security universe
#deb-src http://security.ubuntu.com/ubuntu intrepid-security universe
#deb http://security.ubuntu.com/ubuntu intrepid-security multiverse
#deb-src http://security.ubuntu.com/ubuntu intrepid-security multiverse

########################################################


deb http://extras.ubuntu.com/ubuntu maverick main
deb-src http://extras.ubuntu.com/ubuntu maverick main

deb http://security.ubuntu.com/ubuntu maverick-security main restricted
deb-src http://security.ubuntu.com/ubuntu maverick-security main restricted
deb http://security.ubuntu.com/ubuntu maverick-security universe
deb-src http://security.ubuntu.com/ubuntu maverick-security universe
deb http://security.ubuntu.com/ubuntu maverick-security multiverse
deb-src http://security.ubuntu.com/ubuntu maverick-security multiverse

+ Recent posts