make: *** [out/target/common/obj/PACKAGING/checkapi-last-timestamp] error 38

안드로이드/프레임워크 2015. 1. 18. 02:16

 안드로이드 소스를 빌드하던 도중 다음과 같은 버그를 맞닥뜨리는 경우가 있습니다.


out/target/common/obj/PACKAGING/public_api.txt:23512: error 12: Class android.telephony.gsm.SmsManager changed static qualifier
prebuilts/sdk/api/19.txt:23496: error 9: Removed public method android.telephony.gsm.SmsManager.divideMessage
prebuilts/sdk/api/19.txt:23497: error 9: Removed public method android.telephony.gsm.SmsManager.getDefault
prebuilts/sdk/api/19.txt:23498: error 9: Removed public method android.telephony.gsm.SmsManager.sendDataMessage
prebuilts/sdk/api/19.txt:23499: error 9: Removed public method android.telephony.gsm.SmsManager.sendMultipartTextMessage
prebuilts/sdk/api/19.txt:23500: error 9: Removed public method android.telephony.gsm.SmsManager.sendTextMessage
prebuilts/sdk/api/19.txt:23501: error 10: Removed field android.telephony.gsm.SmsManager.RESULT_ERROR_GENERIC_FAILURE
prebuilts/sdk/api/19.txt:23502: error 10: Removed field android.telephony.gsm.SmsManager.RESULT_ERROR_NO_SERVICE
prebuilts/sdk/api/19.txt:23503: error 10: Removed field android.telephony.gsm.SmsManager.RESULT_ERROR_NULL_PDU
prebuilts/sdk/api/19.txt:23504: error 10: Removed field android.telephony.gsm.SmsManager.RESULT_ERROR_RADIO_OFF
prebuilts/sdk/api/19.txt:23505: error 10: Removed field android.telephony.gsm.SmsManager.STATUS_ON_SIM_FREE
prebuilts/sdk/api/19.txt:23506: error 10: Removed field android.telephony.gsm.SmsManager.STATUS_ON_SIM_READ
prebuilts/sdk/api/19.txt:23507: error 10: Removed field android.telephony.gsm.SmsManager.STATUS_ON_SIM_SENT
prebuilts/sdk/api/19.txt:23508: error 10: Removed field android.telephony.gsm.SmsManager.STATUS_ON_SIM_UNREAD
prebuilts/sdk/api/19.txt:23509: error 10: Removed field android.telephony.gsm.SmsManager.STATUS_ON_SIM_UNSENT

******************************
You have tried to change the API from what has been previously released in
an SDK.  Please fix the errors listed above.
******************************


make: *** [out/target/common/obj/PACKAGING/checkapi-last-timestamp] 오류 38
make: *** 끝나지 않은 작업을 기다리고 있습니다....
frameworks/base/api/current.txt:23496: error 9: Removed public method android.telephony.gsm.SmsManager.divideMessage
frameworks/base/api/current.txt:23497: error 9: Removed public method android.telephony.gsm.SmsManager.getDefault
frameworks/base/api/current.txt:23498: error 9: Removed public method android.telephony.gsm.SmsManager.sendDataMessage
frameworks/base/api/current.txt:23499: error 9: Removed public method android.telephony.gsm.SmsManager.sendMultipartTextMessage
frameworks/base/api/current.txt:23500: error 9: Removed public method android.telephony.gsm.SmsManager.sendTextMessage
frameworks/base/api/current.txt:23501: error 10: Removed field android.telephony.gsm.SmsManager.RESULT_ERROR_GENERIC_FAILURE
frameworks/base/api/current.txt:23502: error 10: Removed field android.telephony.gsm.SmsManager.RESULT_ERROR_NO_SERVICE
frameworks/base/api/current.txt:23503: error 10: Removed field android.telephony.gsm.SmsManager.RESULT_ERROR_NULL_PDU
frameworks/base/api/current.txt:23504: error 10: Removed field android.telephony.gsm.SmsManager.RESULT_ERROR_RADIO_OFF
frameworks/base/api/current.txt:23505: error 10: Removed field android.telephony.gsm.SmsManager.STATUS_ON_SIM_FREE
frameworks/base/api/current.txt:23506: error 10: Removed field android.telephony.gsm.SmsManager.STATUS_ON_SIM_READ
frameworks/base/api/current.txt:23507: error 10: Removed field android.telephony.gsm.SmsManager.STATUS_ON_SIM_SENT
frameworks/base/api/current.txt:23508: error 10: Removed field android.telephony.gsm.SmsManager.STATUS_ON_SIM_UNREAD
frameworks/base/api/current.txt:23509: error 10: Removed field android.telephony.gsm.SmsManager.STATUS_ON_SIM_UNSENT
out/target/common/obj/PACKAGING/public_api.txt:23512: error 12: Class android.telephony.gsm.SmsManager changed static qualifier
out/target/common/obj/PACKAGING/public_api.txt:23512: error 27: Class android.telephony.gsm.SmsManager removed final qualifier

******************************
You have tried to change the API from what has been previously approved.

To make these errors go away, you have two choices:
   1) You can add "@hide" javadoc comments to the methods, etc. listed in the
      errors above.

   2) You can update current.txt by executing the following command:
         make update-api

      To submit the revised current.txt to the main Android repository,
      you will need approval.
******************************


이는 다음과 같이 해결할 수 있습니다.


1. 특정 안드로이드 기기를 타겟으로 설정한 후 Build를 하실 경우 다음과 같이 멈추어버리는 경우가 있습니다. 이는 소스코드에 Binary와 Factory Image를 추가한 후 Build를 하여야 합니다. Binary와 Factory Image 추가법은 아래 블로그랠 참조해 주시기 바랍니다.

http://elecs.tistory.com/59


2. 다음과 같은 명령어를 입력합니다.


# make update-api

# make


※make 실행시 추가 옵선 (예를들어 -j4)을 걸고 Build를 하면 도중에 컴파일 오류를 뿜어내는 경우가 있습니다. 옵션 없이 make를 활용하시면 컴파일 시간은 늘어나지만 에러를 최대한으로 줄이실 수 있습니다.

300x250

안드로이드 프레임워크 프로그래밍(3) [NEXUS5에 소스 빌드하기]

안드로이드/프레임워크 2015. 1. 17. 23:45

 지난 포스팅에서 안드로이드 소스코드를 다운 받은 후 이를 컴파일하는 방법에 대해 알아보았습니다. 이번 포스팅에서는 소스코드를 직접 기기에 빌드하는 과정에 대해 알아보도록 하겠습니다. 작업 환경은 다음과 같습니다.


안드로이드 기기    : LG NEXUS5

빌드 버전               : Android 4.4.4(r2)

컴퓨터 운영체제    : Ubuntu 12.04(64비트)

JDK Version        : Oracle JDK 1.6


1. 자신의 안드로이드 기기에 빌드하고자 하는 안드로이드 소스코드를 다운로드 받습니다. 이 과정은 이전 포스팅을 통해 진행하실 수 있습니다.

http://elecs.tistory.com/56

본 포스팅에서 안드로이드 소스코드를 설치한 폴더는 아래와 같습니다.

~/kitkat


2. 다운로드가 완료되었다면 소스코드 빌드 환경을 초기화 합니다.

$ cd ~/kitkat

$ source build/envsetup.sh


3. 빌드 모드를 설정합니다.

$ lunch


 위에서 보시는 바와 같이 자신의 안드로이드 기기에 올리기 위한 빌드 종류를 선택해야 합니다. 다음 페이지를 참고하시면 자신의 기기에 맞는 종류를 확인하실 수 있습니다.

https://source.android.com/source/building-devices.html




 위의 사이트를 통하여 Nexus 5의 경우 aosp_hammerhead-userdebug를 사용함을 알 수 있습니다. 이를 설정하신 후 다음 단계로 넘어가시면 되겠습니다.


4. 다음으로 기기에 빌드를 하기 위해서는 해당 기기의 Binary와 Factory Image를 소스코드 폴더에 설치해야 합니다.


Binary 다운받기

https://developers.google.com/android/nexus/drivers



 자신의 기기에 해당되는 Binary를 모두 다운로드 받습니다.


Factory Image 다운받기

https://developers.google.com/android/nexus/images



 우리는 현재 4.4.4 r2를 사용하고 있으므로 해당 버전을 선택하여 다운로드 받습니다. 다운로드 받은 압축파일들의 압축을 모두 해제하신 후 해제된 파일들을 자신의 안드로이드 소스코드 폴더 상단에 다음과 같이 이동해 주시면 되겠습니다.



 5. 각 .sh 파일을 실행하여 파일을 설치합니다. 설치를 하기 위해서는 라이센스에 동의를 해야 하는데 이 과정이 살짝 골치 아픕니다.



 각 sh 파일을 실행하시면 보시는 바와 같이 라이센스 내용들이 출력됩니다. 이를 모두 읽고 동의한다만 하면 되겠지만 이 긴 글들을 일일히 읽기 귀찮아서 Enter 키를 계속 누르고 있으면 설치가 취소되는 비극(!)이 벌어집니다. 조금은 귀찮더라도 엔터키를 천천히 누르면서 동의 여부 확인이 나올 때까지 기다립니다.


동의문을 모두 읽게 되면 다음과 같이 동의 여부를 묻는 커맨드가 나옵니다. 여기서 무심코 Enter 버튼을 누르게 되면 처음부터 다시 해야 하므로 다음 커멘드가 나오면 잠시 동작을 멈춘 후 "I ACCEPT"를 입력합니다. 그러면 sh 파일이 설치되는 광경을 확인하실 수 있습니다. 다음과 같은 과정을 나머지 sh파일에서도 진행합니다.


6. 이제 빌드 조건은 모두 구축되었습니다. Make를 실행하여 본격적으로 Build 작업에 들어갑니다.


$ make update-api

$ make -j2


※make 진행시 상당히 많은 시간을 소모합니다. 만약 자신이 사용하고 있는 컴퓨터가 멀티코어를 지원할 경우 해당 코어의 갯수만큼의 옵션을 설정하시면 보다 빠르게 컴파일을 진행하실 수 있습니다. 만약 자신의 컴퓨터가 쿼드코어의 경우 다음과 같이 진행하실 수 있습니다.


$ make update-api

$ make -j4


※종종 위의 컴파일 옵션의 숫자를 너무 크게 하면 컴파일이 진행되는 도중 오류가 생기는 경우가 종종 발생합니다. 가장 안정적인 컴파일을 원하시는 분의 경우 어떠한 옵션을 설정하지 마시고 컴파일을 진행합니다.


컴파일을 무사히 끝마치실 경우 다음과 같은 화면을 보실 수 있습니다.




7. 이제 빌드한 소스코드를 안드로이드 기기에 적용해 보도록 하겠습니다. 우선 자신의 기기가 Fastboot 모드에 진입한 상태로 컴퓨터와 USB로 연결되어야 합니다. 자신이 가지고 있는 안드로이드 기기의 Fastboot 모드 진입 방법은 기기를 제공하는 회사의 웹사이트를 확인하시거나 검색 등을 통해 확인하실 수 있습니다. Nexus 5의 경우 왼쪽 음량조절 버튼의 아래버튼 + 전원버튼을 계속 누르고 있으면 Fastboot 모드에 진입하실 수 있습니다.



위에 붉은 네모로 표시한 부분을 누르시면 됩니다.

8. 위와 같은 화면이 나온다면 Fastboot 모드에 진입이 성공한 것입니다. 이제 다시 Ubuntu의 Terminal을 켜신 후 root 모드로 접근합니다.


$ su root


위의 커맨드를 입력하시면 root의 비밀번호를 묻습니다. 초기 비밀번호는 자신의 Ubuntu 로그인 아이디 혹은 0000으로 설정되어 있습니다. root 권한을 획득하셨다면 다음으로 bashrc를 수정합니다.


# vi ~/.bashrc


다음 내용을 추가합니다.


export ANDROID_TOOLS=(자신의 안드로이드 소스코드 폴더)/out/host/linux-x86
export PATH=$ANDROID_TOOLS/bin:$JAVA_HOME/bin:$PATH
export ANDROID_PRODUCT_OUT=(자신의 안드로이드 소스코드 폴더)/out/target/product/(자신의 빌드 환경)


:wq 를 입력하신 후 저장 합니다.


9. bashrc를 바로 적용합니다.


#source ~/.bashrc


10. 기기가 제대로 연결되었는지 확인합니다.


#fastboot devices



위에서 보시는 바와 같은 상황이 나온다면 안도르이드 기기가 성공적으로 연결된 것입니다. 이제 기기에 빌드를 시도해봅니다.


#fastboot oem unlock

#fastboot flashall



빌드가 완료된 안드로이드 기기의 휴대전화 정보를 확인하시면 다음과 같이 자신이 설정한 버전과 빌드 정보들을 직접 확인하실 수 있습니다.


여기까지 진행하셨다면 여러분은 드디어 안드로이드 빌드에 입문하신 겁니다!

지금까지 잘 따라오신 분들께 진심으로 축하드립니다!

중간에 에러로 인해 결과가 좋지 못하신 분들도 좀 더 자세히 들여다 보신다면 성공하실 수 있을 것입니다.




300x250

make: *** [out/target/product/generic/obj/SHARED_LIBRARIES/libwebviewchromium_intermediates/LINKED/libwebviewchromium.so] error 1

  안드로이드 커널을 다운로드한 후 열심히 빌드를 하다 보면 다음과 같은 문구가 발생합니다.


make: *** [out/target/product/generic/obj/SHARED_LIBRARIES/libwebviewchromium_intermediates/LINKED/libwebviewchromium.so] 오류 1


 이 현상은 거의 대부분이 빌드를 하는 컴퓨터의 메모리 구성에서 문제가 발생해서 생기는 것으로 보고 있습니다. 이를 해결하기 위해 다음과 같은 사항을 확인합니다.


 1. 메모리 용량이 얼마나 확보되어 있는지 확인합니다. 가상머신을 사용하시는 분의 경우 가상머신에 설정된 메모리 용량을 확인합니다.

 2. 우분투를 설치하였을 때 스왑 용량을 확인합니다. 대개 기본 설정으로 설치시 스왑 영역이 약 1~2기가 사이로 설정되어 있습니다. 이 경우 자신의 컴퓨터의 메모리가 4기가 이하의 경우 컴파일이 진행되던 도중 메모리 부족으로 프로세스가 멋대로 종료되어 버리는 경우가 발생합니다. 이를 해결하기 위해서는 처음 설치시 부터 스왑 영역을 최대한 확보하거나 설치 디스크로 부팅을 한 후 파티션을 조절하여 스왑영역을 확보합니다.


위 사항대로 수정한다면 오류 없이 컴파일이 되는 것을 확인하실 수 있습니다.


 You should have virtual memory less than 4GB. If you have the problem above, You should increase your memory size or linux-swap size.

300x250