태터데스크 관리자

도움말
닫기
적용하기   첫페이지 만들기

태터데스크 메시지

저장하였습니다.

이클립스에서 안드로이드 시스템 앱 빌드하기

2012.10.03 22:04


 


보통은 안드로이드 SDK를 이용하여 개발자만의 애플리케이션을 만드는 것이 대다수이지만,

간혹 안드로이드 시스템 내에 있는 시스템 애플리케이션을 수정하거나 새로 빌드해야 하는 경우도 있습니다.


시스템 애플리케이션은 안드로이드 풀소스를 다운로드하면 모든 소스를 참조하고 그 상태 그대로 빌드할 수 있지만,

아무래도 이를 분석하거나 수정해서 새로 빌드하려면 이클립스와 같은 IDE를 사용하는 것이 편합니다.


시스템 애플리케이션을 이클립스를 사용하여 빌드하기 위한 절차는 크게 다음과 같습니다.


1. 안드로이드 풀소스(AOSP) 다운로드 & 빌드

2. 풀소스로부터 시스템 애플리케이션이 사용하는 내부 라이브러리 추출하기

3. 이클립스의 User library에 등록하기

4. 프로젝트의 Build Path에 4번에서 추가한 User library 등록하기

5. 프로젝트 생성 후 라이브러리 추가하기


안드로이드 풀소스 다운로드


시스템 애플리케이션에서는 안드로이드 SDK에 포함되어 있지 않은

Hidden API들을 사용하는 것들이 있으므로,

이들을 제대로 빌드하려면 풀소스를 받은 후 Hidden API가 포함된 라이브러리를 생성해야 합니다.

즉, 최소 한 번은 빌드가 필요한거죠.


소스 다운로드 및 빌드 방법은 다음의 공식 페이지를 참조하시면 됩니다.


http://source.android.com/source/downloading.html


리눅스가 아닌 맥 OS 환경에서 빌드하시는 분께서는

이전에 작성한 제 포스트를 참조하시면 됩니다.


2012/08/07 - Mac OS X 10.7 (Lion) 에서 안드로이드 빌드환경 설정하기


풀소스로부터 시스템 애플리케이션이 사용하는 내부 라이브러리 추출하기


풀소스를 다운로드한 후 빌드가 완료되었다면,

다음 경로에서 시스템 애플리케이션 빌드에 필요한 자바 라이브러리들을 얻을 수 있습니다.


out/target/common/obj/JAVA_LIBRARIES


폴더 이름을 통해 어떤 라이브러리인지 알 수 있고,

각 폴더 내부의 classes.jar가 해당 라이브러리 파일입니다.

다음은 core 라이브러리의 폴더 구조를 본 모습입니다.


이렇게 해서 필요한 내부 라이브러리를 얻었으니,

이를 이클립스에서 사용하는 방법에 대해 알아보도록 하겠습니다.



이클립스의 User library에 등록하기


먼저, 필요한 라이브러리의 classes.jar를 추출하여 적당한 폴더에 넣어줍니다.

저는 다음과 같은 라이브러리들을 추출하여 별도의 디렉터리에 넣어두었습니다.



다음, 이클립스의 Preferences > Java Build Path > User Libraries를 선택합니다.

저는 이미 User Library를 등록한 상태라 각 라이브러리들이 목록에 보입니다.




새로 라이브러리를 추가하려면 New... 버튼을 누른 후, 적당한 이름을 지정합니다.

다음, 추가된 라이브러리를 선택하여 Add JARs... 버튼을 누른 후,

위에서 추출한 자바 라이브러리 파일을 선택해주면 됩니다.




프로젝트 생성 후 라이브러리 추가하기


이제 프로젝트를 생성하여 테스트해 볼 차례입니다.

저는 Launcher2 (기본 런처)을 테스트해 보았습니다.


프로젝트를 생성한 후에,

풀소스에 포함되어 있는 런처의 소스를 복사해왔습니다.

각종 시스템 앱의 소스는 다음 경로에 포함되어있습니다.


packages/apps


다음, 프로젝트 속성 > Java Build Path > Libraries 탭에 간 후,

Add Library...버튼을 누른 후 User library를 선택하여

추가할 라이브러리를 선택합니다.



다음, Order and Export 탭으로 가서

위에서 추가한 라이브러리들을 가장 상위로 올려줍니다.

이렇게 하면 라이브러리를 참고할 때 SDK보다 우리가 추가한

라이브러리를 먼저 참고하게 됩니다.



이 과정까지 마치면 시스템 앱을 빌드할 모든 준비가 끝나게 됩니다.

상황에 따라 프로젝트를 Clean 하기 전까지 오류가 떠 있는 경우도 있으니,

이 과정을 마친 후 반드시 Clean을 수행하실 것을 권장합니다.


다음은 최종적으로 작업이 완료된 상태의

Project explorer 상 모습입니다.



이 상태로 빌드를 하면 정상적으로 빌드는 되지만,

테스트를 하기 위해서는 에뮬레이터/타겟 단말기의 시스템 애플리케이션을 삭제한 후

업로드해야 합니다.


때문에, 별도의 애플리케이션으로 구동하고 싶은 경우

패키지 이름을 변경해야 합니다.

이를 위해 매니페스트부터 시작하여 꽤 여러 가지를 바꿔야 하는데,

우선은 이 과정은 여기에서 다루지는 않겠습니다.


혹시나 필요하신 분들을 위해서 위에서 사용한 내부 라이브러리들을 첨부합니다.

2012년 10월 1일 기준 AOSP를 사용하여 빌드한 것이며,

안드로이드 4.1 기반입니다.



common.jar


core.jar


support-v13.jar


framework.jar


저작자 표시 비영리 변경 금지
신고

커니 AOSP , , , , , , , , , , , , , ,

  1. Blog Icon
    앙탕

    좋은정보 감사합니다. 궁금한점이 있습니다.
    특정 시스템 어플리케이션이 어떤 라이브러리가 필요한지는 어떻게 아는지요?
    Browser 어플리케이션을 따로 빌드하는데 core, framework, common 세개로는 안되더군요.

    그리고 마지막에 언급하신 별도의 어플리케이션으로 구동하는법 도 다뤄주셨으면 합니다.

  2. Blog Icon
    앙탕

    어떤라이브리러가 필요한지는 해결했습니다. 해당 폴더 내에 android.mk 파일에 적혀있군요.

    이제 수정한뒤 타겟에 올려서 테스트를 해보고 싶은데 이미 설치된 어플리케이션이라 중복이 되서 설치가 안됩니다.
    도움주실수있을까요..

  3. 패키지 이름을 변경하셔야합니다. AndroidManifest.xml에서 package name을 변경하고, 그에 따른 소스 파일들도 모드 올바른 경로로 옮겨야하며, 소스 파일에서 해당 패키지 참조하는 부분들도 모두 바꿔줘야 합니다.

    저는 매니페스트에서 패키지이름 바꾸고, 소스파일 경로 수정한 다음 이클립스에서 Search&Replace 기능으로 소스에서 언급되어있는 패키지이름을 모두 수정했습니다.

  4. Blog Icon
    지이

    너무너무 감사합니다 필요한 자료인데 정리가 잘되어있네요.

  5. Blog Icon
    55

    안녕하세요. 커니님.
    포스팅에 보시면 각 폴더에 있는 라이브러리는 classes.jar 인데..
    유저 라이브러리 등록할때는 이름이 다른데, 네이밍 변경하더라도 .jar파일 인식에는 문제 없는 건가요?

    core_intermediates\classes.jar -> core.jar 이런 부분에 대한 질문 입니다.

    만약에 맞다면 이름 변경해서 넣어야 된다 이런 부분이 포스팅에 추가되면 좋을 것 같아서요

  6. 파일이름과 라이브러리 인식과는 상관이 없습니다. 파일이름을 바꾼다고 해서 내용이 달라지거나 실행이 되지 않지 않는 것과 동일합니다~

  7. Blog Icon
    sharpen

    감사합니다. 덕분에 구글캘린더 이클립스에서 빌드 돌릴 수 있게끔 만드는 데 성공했습니다. ^^.

  8. Blog Icon
    Helpme

    안녕하세요.
    저는 Browser build가 안되네요....
    라이브러리 추가를 해도 계속 에러가 뜨네요..ㅜㅜ
    어떤 이유가 있는 지 혹시 아시나요?

  9. Blog Icon
    qestion

    git으로 받아서 보니 tests 폴더가 있는데 그건 혹시 어떻게 하는지 아세요?

  10. Blog Icon
    Android 4.2.2 빌드...

    이 글과는 관련 없지만 궁금해서 질문드립니다..
    제가 넥서스s 4.2.2 소스코드를 빌드하려 하는데요, 아시다시피 넥s 는 4.1.2까지가 마지막이라 그 이상 빌드하려면 디바이스를 별도로 추가시켜줘야 하는데요, 이게 잘 되지 않습니다..ㅠㅠ 구글에 검색을 수차례 시도했지만 그 정보는 잘 안 나오는것 같더군요..
    죄송하지만 혹시 아시는 분 계신가요?

  11. Blog Icon
    질문있어요

    좋은 게시글 잘보고 갑니다
    한가지 질문이 있는데요
    위와 같이 빌드한 경우 4.1에서만 사용이 가능한데,
    이렇게 빌드한 앱을 전 버전 4.0, 4.1, 4.2 에서 다 쓸 수 있게하는 방법이 있을까요?

  12. 앱에 따라 각 플랫폼에서 추가된 새로운 기능을 사용하는 경우가 있습니다. (당장 Launcher만 해도 4.1 버전에서 새로 추가된 기능을 사용하고 있어 4.1버전의 Launcher는 4.0에서 구동이 불가능합니다)

    이런 경우가 아니라면, 어떤 플랫폼 버전에 포함된 것인가와는 상관없이 구동이 가능합니다.

  13. 커니님!^^; 좋은글 잘 보고 갑니다. ㅎㅎㅎ 이 방법을 이제서야 알아서.. ㅜㅜ 유용하게 사용할 수 있겠네요.

  14. Blog Icon
    호창파파

    좋은글 감사합니다.
    근데 제 경우 문제가 있어 혹시나 하는 마음으로 질문을 드립니다.
    제 경우 안드로이 4.2.2 에서 커니님 방법으로
    다른 시스템앱을 빌드했는데..

    그대로 따라서 하면 ....빌드는 성공하는데...런타임에서
    "java.lang.NoClassDefFoundError: xxxxx" 라는 error 발생합니다.

    "xxxxx" 는 풀소스로부터 시스템 애플리케이션이 사용하는 내부 라이브러리를 추출한 것입니다.

    추가된 라이브러리를 apk 빌드 할떄 참조만 하고 실제 빌드에 포함을 안된것 같아서
    "java build path > order and export" 창에서 문제의 "xxxxx" 를 포함한 라이브러리
    왼쪽 checkbox 를 check 해주면.. 이번엔 빌드가 안되고 다음과 같은 error 발생합니다.

    Dx 1 error; aborting
    Conversion to Dalvik format failed with error 1

    위 현상에 대해 조언을 해주신다면 정말 감사 하겠습니다.

    ========> 해결되었습니다. 참조하시라고 자답을 남깁니다.
    중보된 lib 가 있었고 이를 제거하니, 정상 빌드되고
    실행도 문제 없었습니다.

  15. Blog Icon
    빌드에러

    메니페스트에서 <uses-permission android:name="android.permission.STATUS_BAR" /> 와 <uses-permission android:name="android.permission.WRITE_MEDIA_STORAGE" > 사용시 , Permission is granted to system apps 라는 에러가 발생하면서 빌드가 되지 않습니다. 커니님께서 말씀하신대로 모든 필요한 라이브러리들을 추가했으나, 함수 쪽 빨간줄은 사라졌지만 메니페스트에서의 빨간줄은 사라지지 않았으며 해당 기능이 정상적으로 작동하지 않습니다 . ㅜㅜ 혹시 이 문제에 대한 해결방안좀 알려주실 수 있으십니까? 부탁드립니다 ㅜ

  16. 빌드 에러가 나지 않더라도, 시스템 앱의 경우 시스템 키로 서명되어 있지 않으면 정상 동작하지 않습니다. 즉, 일반 앱을 빌드할 때 사용하는 키로는 시스템 앱을 만들어도 정상적인 기능을 사용할 수 없는 것이죠.
    제대로 동작하게 하려면 구동하는 시스템 이미지를 서명한 키와 동일한 키로 앱을 서명해야 합니다.

  17. Blog Icon
    갤클

    안녕하세요
    안드로이드 4.2 버전 이상에 있는 접근성의 확대동작 기능의 코드를 이용해
    뭔가 좀 해보려고 하는데요
    이것도 이클립스로 시스템 어플리케이션으로 빌드가 가능한가요?

    우분투에서 안드로이드 풀 소스를 다운 받은 후 실행시켜서 해보려고 했는데 잘 되지가 않아서
    혹시 이클립스로 가능한지 여쭤봅니다.ㅠㅠ

  18. 안녕하세요.확대 동작 자체는 플랫폼의 기능으로 추측되는데, 이 경우 이클립스를 이용하기엔 다소 까다로울 것 같습니다.
    해당 기능만을 떼어와서 포팅 후 애플리케이션에 적용하는 것이라면 가능할 지 몰라도, 플랫폼 전체를 이클립스로 빌드하는 것은 힘들어 보이네요.

  19. Blog Icon
    아키스

    안녕하세요. 안드로이드 공부하고 있는 학생입니다.
    제가 이번에 안드로이드 풀소스에서 웹브라우저만 떼어내서 빌드하려고 하는데 커니님의 글에서
    많은 정보를 얻었어요. 정말 감사해요 ~!!
    근데 한가지 문제에 부딛혔는데 도저히 모르겠습니다.
    올려주신 방법대로 모두 따라하였는데
    The type android.app.SearchableInfo cannot be resolved. It is indirectly referenced from required .class files
    에러 1개를 해결하지 못하였습니다.
    이 문제를 해결하기 위한 조언좀 부탁드립니다.

  20. http://developer.android.com/reference/android/app/SearchableInfo.html

    이 클래스일 거라 생각되는데요, API Level 8 (안드로이드 2.2) 부터 포함된 클래스로 이 이상 버전의 SDK 를 사용하신다면 정상적으로 떠야 하는 항목입니다. 타겟 SDK 부분을 다시 한 번 확인해 보시는 것이 좋을 것 같습니다.

  21. Blog Icon
    백수공주

    안녕하세요. 안드로이드를 이클립스가 아니라 안드로이드 스튜디오에서 개발 중에 있습니다.
    해당 상황처럼. HIDE된 API를 사용한 후 시스템 앱으로 빌드하기 위해 방법을 모색하는 중 위 글을 보게 되었습니다.
    혹시 android studio에서는 해당 Classes.jar파일을 추가하는 방법을 알 수 있을까요?
    저는 지금 아래와 같이 사용하였습니다만, 소스에서 여전히 에러가 뜨며, 빌드 시 cannot find symbol method ... error 가 표출됩니다.

    dependencies {
    compile 'com.android.support:support-v4:19.1.0'
    compile files('libs/classes.jar')
    }

    혹시 방법을 아신다면.. 조언 부탁드립니다.

  22. Blog Icon
    조동희

    안녕하세요. 커니님.
    시일이 오래 지난 포스트임에도 제게 너무 큰 도움이 되고 있습니다.
    시일이 한참지나 제글에 대한 답글이 있을지 모르겠지만, 몇일째 헤매고 있는터라 조언 구해 봅니다. ㅜ.ㅠ

    현재 런처를 신규로 개발하고 있습니다.
    커니님 덕분에 Launcher2 는 원활히 빌드하여 올려보았습니다.
    허나, 개발 중인 런처는 기존 UI구조와 상이하여 Settings 까지 수정을 해야 하는 상황입니다.
    문제는 \\packages\\apps\\Settings 가 빌드가 되지 않습니다.

    개발 환경은 4.4.2 이고요
    1. Settings 오픈소스를 다른 디렉토리로 복사하고,
    2. Eclipse에서 'Android Project From Existing Code' 로 소스 임포트했습니다.
    3. \\packages\\apps\\Settings\\Android.mk 파일내에 있는 라이브러리 모두 Java Build Path에 포함시켰습니다.
    LOCAL_JAVA_LIBRARIES := bouncycastle conscrypt telephony-common
    LOCAL_STATIC_JAVA_LIBRARIES := android-support-v4 android-support-v13 jsr305

    무언가 빠트린 작업이 있는건지...
    Settings의 경우 시스템앱이라 해당 작업이 애초 불가능했던 건지..

    어떠한 조언이라도 감사히 받겠습니다.

    감사합니다.