Skip to main content

안드로이드 스튜디오에서 시스템 앱 빌드하기 (시스템 라이브러리 추가)

안드로이드 앱 개발을 하는데 기존에는 Eclipse를 사용하였는데 이제는 Android Studio를 사용합니다. 하지만 시스템 앱 개발을 할때엔 다른 라이브러리처럼 시스템 라이브러리를 단순히 dependencies 추가해준다고 해서 빌드가 되는게 아니었습니다. Eclipse와 큰 틀은 같으나 몇가지 추가 작업이 더 필요하더군요. 라이브러리 추가, 라이브러리 순서 설정, 컴파일 부트스트랩 클래스패스 설정…

 

Android Studio에서 작업하기 위한 라이브러리 추가 및 순서 설정

먼저 준비한 “framework.jar” 라이브러리를 준비한 뒤 “project/app/libs” 폴더에 라이브러리를 추가하여 줍니다. 그리고 “project/app/build.gradle” 파일을 열어 “dependencies” 부분에 라이브러리 경로를 추가하여 줍니다. 이때 주의 할 점은 다른 라이브러리와는 다르게 “compile” 이 아닌 “provided” 로 추가해주셔야 한다는 점 입니다. 만약, Android Studio 3.0 이상이라면 “compileOnly” 를 사용해 주셔야 합니다.

라이브러리 추가는 되었지만 아직 Android SDK를 대체하지 못 했기 때문에 시스템 라이브러리가 동작하지 않습니다. 이제 “framework.jar”가 Android SDK를 대체 할 수 있도록 “project/app/app.iml”에서 “<orderEntry />” 부분 수정해주셔야 합니다. 수동으로 수정하여 주셔도 되지만, “build.gradle” 이 수정되면 자동으로 생성되는 파일이기에 매번 수동으로 수정을 해야 하는 번거로움이 있습니다. 그래서 아래 코드와 같이 “preBuild” Task를 이전에 작업한 dependencies 아래에 추가주시면 됩니다.

이제 Sync gradle 후 시스템 API를 사용하여 코드 작성이 가능합니다. 하지만 아직 Build는 되지 않습니다.

 

Compile bootstrap classpath에 라이브러리가 전처리 되도록 설정

위에서 설정했던 작업을 통해서 시스템 라이브러리가 Android SDK보다 먼저 처리되어 Editor에서는 잘 동작했지만 Build 시에는 여전히 Android SDK가 먼저 처리되어 빌드 오류가 발생합니다. 그래서 Compile 시 “-Xbootclasspath/p” 옵션을 주어 시스템 라이브러리가 먼저 처리 될 수 있도록 해주어야 합니다. “project/build.gradle” 파일을 열어 “allprojects” 부분에 아래 코드와 같이 compile 옵션을 추가하여 줍니다.

이제 정상적으로 Build가 되는 것을 확인 하실 수 있습니다.

 

참조 1: http://www.31mins.com/android-studio-build-system-application/

참조 2: http://stackoverflow.com/questions/27441398/how-to-put-my-libraries-in-front-of-android-jar-by-editing-build-gradle-in-andro

 

17 thoughts to “안드로이드 스튜디오에서 시스템 앱 빌드하기 (시스템 라이브러리 추가)”

  1. 글 도움으로 빌드까지는 성공했습니다.

    근데 혹시 java 8 관련 에러가 난적이 있으신가요??
    Error:Error converting bytecode to dex:
    Cause: Dex cannot parse version 52 byte code.
    This is caused by library dependencies that have been compiled using Java 8 or above.
    If you are using the ‘java’ gradle plugin in a library submodule add
    targetCompatibility = ‘1.7’
    sourceCompatibility = ‘1.7’
    to that submodule’s build.gradle file.

    Error:Execution failed for task ‘:app:transformClassesWithDexForDebug’.
    > com.android.build.api.transform.TransformException: java.lang.RuntimeException: com.android.ide.common.process.ProcessException: java.util.concurrent.ExecutionException: com.android.ide.common.process.ProcessException: Return code 1 for dex process

    빌드는 되는데, run 으로 설치하려고 하면 위와같은 에러가 납니다.

    혹시 해결 하셨다면 공유 부탁드려도 될까요??

    1. 현재 셋탑박스 런처어플을 만들고 있습니다.
      framework.jar 파일을 셋탑박스에서 복사해서 위에 알려주신 방법으로 빌드를 했더니
      설치가 되지 않네요. ㅠ.ㅠ

      1. 빌드가 정상적으로 되어서 APK 파일이 확인 되었는데 설치가 안된다면 다른 문제가 있겠네요.
        기존에 설치된 패키지랑 패키지명이나 버전이 같다던지, 시스템앱이라면 signkey가 틀리다던지…

    1. dependencies 설정에서 provided를 complieOnly로 (Android Studio 최신 버전 사용시)
      Compile bootstrap classpath의 framework-net.jar를 framework.jar로… (오타네요 ㅠㅠ)
      혹시 확인 하셨나요?

  2. 안녕하세요?
    아래 부분에서 You cannot create an instance from the abstract interface ‘org.w3c.dom.Node’이렇게 에러가 나는데 왜그럴까요?

    new Node(parsedXml.component[1], ‘orderEntry’, [‘type’: ‘jdk’, ‘jdkName’: sdkString, ‘jdkType’: ‘Android SDK’])

  3. 김태이 분처럼 framework.jar 안에 있는 걸 찾지 못하네요.. error:cannot find symbol class ..

    라이브러리를 두 개 이상 넣고 있긴 하지만.. 작성하신대로 똑같이 다 적었는데도
    에디터에서는 잘되는데 빌드만 하면 저게 왜 뜨는지를 모르겟어용..

    options.compilerArgs.add(‘-Xbootclasspath/p:app\\libs\\framework.jar:app\\libs\\framework2.jar:app)

  4. 위에서 :app 은 잘못적었습니당.

    options.compilerArgs.add(‘-Xbootclasspath/p:app\\libs\\framework.jar:app\\libs\\framework2.jar’)

    눈씻고 찾아도 오타는 없는것 같은데 왜 빌드만 하면 컴파일에러와 동시에 심볼을 찾을수 없다고 난리인지.. 에디터에는 에러가 안뜨는데 ㅠㅠ

    1. 두 jar 사이를 :(콜론)이 아니라 ;(세미콜론)으로 해보셨나요?
      windows의 경우 separator를 ;(세미콜론)으로 알고 있네요. linux가 :(콜론)이구요.

      -Xbootclasspath/p:app\\libs\\framework.jar;app\\libs\\framework2.jar

댓글 남기기