안드로이드 스튜디오 외부 라이브러리 사용 - andeuloideu seutyudio oebu laibeuleoli sayong

이 글에서는 프로젝트에 so 라이브러리를 추가하는 방법과, Apk에 라이브러리가 포함되었는지 확인하는 방법을 알아보겠습니다. so 라이브러리는 확장자가 so인 native library를 말합니다. 보통 JNI와 c++ 코드가 컴파일되어있습니다. 일반적으로 so 라이브러리를 사용하지 않기 때문에 개별적으로 폴더를 만들어서 파일을 포함시켜야 합니다.

먼저 프로젝트에 so 라이브러리를 추가하는 방법을 알아보고, 그 다음에 Apk에 so 라이브러리가 잘 포함되었는지 확인하는 방법을 알아보겠습니다.

프로젝트에 so 라이브러리 추가

안드로이드 스튜디오 프로젝트에 so 라이브러리를 포함시키려면 먼저 폴더를 생성해야 합니다. src/main/ 아래에 jniLibs라는 폴더를 생성합니다. 그럼 전체적인 폴더 구조는 이렇게 됩니다.

app ├── libs └── src └── main ├── AndroidManifest.xml ├── java ├── res └── jniLibs <--

그리고 jniLibs에 so 라이브러리를 넣어주면 됩니다. 하지만 so 라이브러리는 CPU와 32/64bit 아키텍쳐에 의존적이기 때문에, 플랫폼 별로 다른 폴더에 넣어줘야 합니다.

아래 테이블은 플랫폼과 32/64bit에 따라 폴더 이름이 어떻게 설정되어야 하는지를 말해줍니다.

플랫폼32비트 라이브러리 폴더 이름64비트 라이브러리 폴더 이름
ARM armeabi-v7a arm64-v8a
x86 x86 x86_64

그래서 만약 ARM의 32/64bit를 모두 지원한다면 /jniLibs에 두개의 폴더를 생성하고 그 안에 so 라이브러리를 넣어야 합니다. 그럼 전체적인 폴더 구조는 아래처럼 보입니다.

app ├── libs └── src └── main ├── AndroidManifest.xml ├── java ├── res └── jniLibs ├── armeabi-v7a <-- ARM 32bit │ └── *.so 파일들 └── arm64-v8a <-- ARM 64bit └── *.so 파일들

위처럼 폴더를 만들고 파일을 넣었다면 이제 빌드해보세요. 컴파일일된 Apk를 확인해보면 so 라이브러리가 포함된 것을 확인할 수 있습니다.

Apk에 so 라이브러리(native library)가 포함되었는지 확인

빌드를 하여 Apk가 생성되면 so 라이브러리가 포함되었는지 확인할 수 있습니다. Apk파일은 zip이기 때문에 확장자를 zip으로 변경하여 압축을 풀면 /lib 폴더에 내가 넣은 so파일들이 있는 것을 확인할 수 있습니다.

하지만 안드로이드 스튜디오는 Analyze APK라는 기능을 제공합니다. 이것은 Apk에 포함된 파일을 분석하는 툴 입니다. 이 툴을 사용하면 Apk 안의 /lib 폴더에 so 라이브러리가 있는지 확인할 수 있습니다.

메뉴에서 [Build] -> [Analyze APK]를 눌러 툴을 실행합니다. 그리고 분석할 Apk를 찾아서 OK버튼을 누릅니다. 그럼 오른쪽 창에 Apk의 내부 파일들이 보입니다. /lib 폴더에 자신이 추가한 so가 있는지 확인하면 됩니다.

아래 그림은 Analyze APK로 apk를 분석한 결과입니다. 위에서 추가한 라이브러리가 모두 포함된 것을 볼 수 있습니다.

정리

안드로이드 프로젝트에 so 라이브러리를 포함하는 방법을 알아보았습니다. 자바 라이브러리는 기본적으로 폴더가 생성되어있지만 네이티브인 so 라이브러리를 사용하려면 개별적으로 폴더를 만들어줘야 합니다. so 파일을 프로젝트에 포함시켰다면 산출물인 apk에 so가 포함되었는지 Analyze APK로 확인할 수 있습니다.

Related Posts

  • Android 13, AOSP 오픈소스 다운로드 및 빌드
  • Android 13 - 세분화된 미디어 파일 권한
  • Android 13에서 Notification 권한 요청, 알림 띄우기
  • Android 13에서 'Access blocked: ComponentInfo' 에러 해결
  • 에러 해결: android gradle plugin requires java 11 to run. you are currently using java 1.8.
  • 안드로이드 - 코루틴과 Retrofit으로 비동기 통신 예제
  • 안드로이드 - 코루틴으로 URL 이미지 불러오기
  • Android - 진동, Vibrator, VibrationEffect 예제
  • Some problems were found with the configuration of task 에러 수정
  • Query method parameters should either be a type that can be converted into a database column or a List
  • 우분투에서 Android 12 오픈소스 다운로드 및 빌드
  • Android - ViewModel을 생성하는 방법
  • Android - Transformations.map(), switchMap() 차이점
  • Android - Transformations.distinctUntilChanged() 소개
  • Android - TabLayout 구현 방법 (+ ViewPager2)
  • Android - 휴대폰 전화번호 가져오는 방법
  • Android 12 - Splash Screens 알아보기
  • Android 12 - Incremental Install (Play as you Download) 소개
  • Android - adb 명령어로 bugreport 로그 파일 추출
  • Android - adb 명령어로 App 데이터 삭제
  • Android - adb 명령어로 앱 비활성화, 활성화

Android 라이브러리는 구조적으로 Android 앱 모듈과 동일합니다. Android 라이브러리에는 소스 코드, 리소스 파일, Android 매니페스트를 비롯하여 앱을 빌드하는 데 필요한 모든 항목이 포함될 수 있습니다. 하지만, 이 라이브러리는 기기에서 실행되는 APK로 컴파일되는 대신 Android 앱 모듈의 종속 항목으로 사용할 수 있는 Android 보관 파일(AAR)로 컴파일됩니다. JAR 파일과 달리, AAR 파일은 Android 애플리케이션에 다음과 같은 기능을 제공합니다.

  • AAR 파일에는 Android 리소스 및 매니페스트 파일이 포함될 수 있습니다. 이 파일에서는 자바 클래스 및 메서드 외에 레이아웃 및 드로어블과 같은 공유 리소스를 번들로 구성할 수 있습니다.
  • AAR 파일은 앱 모듈의 C/C++ 코드에서 사용할 C/C++ 라이브러리를 포함할 수 있습니다.

라이브러리 모듈은 다음과 같은 상황에 유용합니다.

  • 활동, 서비스, UI 레이아웃 등 일부 구성요소를 동일하게 사용하는 여러 앱을 빌드하는 경우
  • 여러 APK 변형(예: 무료 및 유료 버전)에 포함되는 앱을 빌드하며 두 버전에서 모두 동일한 핵심 구성요소가 필요한 경우

두 가지 경우 모두 재사용하려는 파일을 라이브러리 모듈로 이동한 후 각 앱 모듈의 종속 항목으로 라이브러리를 추가하면 됩니다. 이 페이지에서는 이 두 가지 작업을 실행하는 방법을 모두 설명합니다.

라이브러리 모듈 생성

프로젝트에서 새 라이브러리 모듈을 생성하려면 다음 단계를 따르세요.

  1. File > New > New Module을 클릭합니다.
  2. Create New Module 창이 표시되면 Android Library, Next를 차례로 클릭합니다.

    일반적인 JAR 파일을 빌드하는 Java 라이브러리를 생성하는 옵션도 있습니다. JAR 파일은 많은 프로젝트에서, 특히 다른 플랫폼과 코드를 공유하려는 경우 유용하지만, 이 파일은 Android 프로젝트에서 코드를 재사용할 때 매우 유용한 Android 리소스 또는 매니페스트 파일은 포함할 수 없습니다. 따라서 이 가이드에서는 Android 라이브러리 생성에 대해 집중적으로 설명합니다.

  3. 라이브러리에 이름을 지정하고 라이브러리의 코드를 위한 최소 SDK 버전을 선택한 후 Finish를 클릭합니다.

Gradle 프로젝트 동기화가 완료되면 라이브러리 모듈이 왼쪽 Project 패널에 표시됩니다. 새 모듈 폴더가 표시되지 않으면 Android 뷰를 표시하고 있는지 확인하세요.

앱 모듈을 라이브러리 모듈로 변환

재사용하려는 코드가 모두 포함된 기존 앱 모듈이 있는 경우 다음과 같이 이 모듈을 라이브러리 모듈로 변환할 수 있습니다.

  1. 모듈 수준의 build.gradle 파일을 엽니다.
  2. applicationId를 지정하는 줄을 삭제합니다. Android 앱 모듈에서만 지정할 수 있습니다.
  3. 파일 상단에 다음이 표시됩니다.

    Groovy

    plugins { id 'com.android.application' }

    Kotlin

    plugins { id("com.android.application") }

    다음과 같이 변경합니다.

    Groovy

    plugins { id 'com.android.library' }

    Kotlin

    plugins { id("com.android.library") }

  4. 파일을 저장하고 File > Sync Project with Gradle Files를 클릭합니다.

이상입니다. 모듈의 전체 구조는 동일하게 유지되지만, 이제 Android 라이브러리로 작동하며 빌드에서 이제 APK 대신 AAR 파일을 생성합니다.

AAR 파일을 빌드하려면 Project 창에서 라이브러리 모듈을 선택한 다음 Build > Build APK를 클릭합니다.

프로젝트 구조 대화상자를 사용하여 종속 항목 추가

동일한 프로젝트 내에서 라이브러리 사용

새 Android 라이브러리의 코드를 같은 프로젝트 내의 다른 앱이나 라이브러리 모듈에서 사용하려면 프로젝트 수준 종속 항목을 추가합니다.

  1. File > Project Structure > Dependencies로 이동합니다.
  2. 라이브러리를 사용할 모듈을 선택합니다.
  3. Declared Dependencies 탭에서
    를 클릭하고 드롭다운에서 Module Dependency를 선택합니다.

  4. Add Module Dependency 대화상자에서 라이브러리 모듈을 선택합니다.

  5. 이 종속 항목이 필요한 구성을 선택하거나, 모든 구성에 적용되는 경우 '구현'을 선택하고 OK를 클릭합니다.

스튜디오에서는 모듈의 build.gradle 파일을 수정하여 다음 형식의 종속 항목을 추가합니다.

implementation(project(path: ":example-library"))

다른 프로젝트에서 라이브러리 사용

종속 항목(JAR 및 AAR)을 공유하는 권장 방법은 Maven Central과 같은 서비스나 로컬 디스크의 디렉터리 구조에서 호스팅된 Maven 저장소를 사용하는 것입니다. Maven 저장소 사용에 관한 자세한 내용은 원격 저장소를 참고하세요.

Android 라이브러리가 Maven 저장소에 게시되면 라이브러리의 종속 항목이 사용 빌드에 포함되도록 메타데이터가 포함되므로 라이브러리가 여러 위치에서 사용되면 자동으로 중복 삭제될 수 있습니다.

Android 라이브러리의 코드를 다른 앱 모듈에 사용하려면 다음 단계를 따르세요.

  1. File > Project Structure > Dependencies로 이동합니다.
  2. Declared Dependencies 탭에서
    를 클릭하고 드롭다운에서 Library Dependency를 선택합니다.

  3. Add Library Dependency 대화상자에서 검색창을 사용하여 추가할 라이브러리를 찾습니다. 이 형식은 settings.gradle 파일의 dependencyResolutionManagement { repositories {...}} 블록에 지정된 저장소를 검색합니다.

  4. 이 종속 항목이 필요한 구성을 선택하거나, 모든 구성에 적용되는 경우 '구현'을 선택합니다.

  5. 앱의 build.gradle 파일을 검토하여 선택한 빌드 구성에 따라 다음과 유사한 선언을 확인합니다.

implementation 'com.example:examplelibrary:1.0.0'

AAR 또는 JAR을 종속 항목으로 추가

Android 라이브러리의 코드를 다른 앱 모듈에 사용하려면 다음 단계를 따르세요.

  1. File > Project Structure > Dependencies로 이동합니다.
  2. Declared Dependencies 탭에서
    를 클릭하고 드롭다운에서 Jar Dependency를 선택합니다.

  3. Add Jar/Aar Dependency 대화상자에서 먼저 .aar 또는 .jar 파일 경로를 입력하고 종속 항목이 적용되는 구성을 선택합니다. 라이브러리를 모든 구성에서 사용할 수 있어야 하는 경우 '구현' 구성을 선택합니다.

  4. 앱의 build.gradle 파일을 검토하여 선택한 빌드 구성에 따라 다음과 유사한 선언을 확인합니다.

    implementation files('my_path/my_lib.aar')

또는 Android 스튜디오 외부에서 Gradle 빌드를 실행한다면 앱의 build.gradle 파일에 종속 항목 경로를 추가하여 종속 항목을 가져올 수 있습니다. 예:

dependencies { implementation fileTree(dir: "libs", include: ["*.jar", "*.aar"]) ... }

Gradle 종속 항목 추가에 관한 자세한 내용은 빌드 종속 항목 추가를 참고하세요.

공개로 만들 리소스 선택

라이브러리에 포함된 모든 리소스는 기본적으로 공개로 설정됩니다. 모든 리소스를 무조건 비공개로 만들려면 하나 이상의 특정한 속성을 공개로 정의해야 합니다. 리소스는 프로젝트의 res/ 디렉터리에 모든 파일을 포함합니다(예: 이미지). 라이브러리 사용자가 내부용으로만 사용하도록 작성된 리소스에 액세스하지 못하도록 하려면 공개 리소스를 하나 이상 선언하는 방법으로 자동 비공개 지정 메커니즘을 사용해야 합니다. 또는 아무것도 공개로 표시하지 않고 나머지(모든 리소스)를 비공개로 만드는 빈 <public /> 태그를 추가하여 모든 리소스를 비공개로 만들 수 있습니다.

공개 리소스를 선언하려면 <public> 선언을 라이브러리의 public.xml 파일에 추가합니다. 이전에 공개 리소스를 추가한 적이 없으면 라이브러리의 res/values/ 디렉터리에 public.xml 파일을 생성해야 합니다.

다음 코드 예에서는 이름이 각각 mylib_app_name 및 mylib_public_string인 두 개의 공개 문자열 리소스를 생성합니다.

<resources> <public name="mylib_app_name" type="string"/> <public name="mylib_public_string" type="string"/> </resources>

라이브러리를 사용하는 개발자에게 계속 표시할 모든 리소스를 공개해야 합니다.

암시적으로 속성을 비공개로 하면 라이브러리 사용자에게 내부 라이브러리 리소스의 코드 완성 제안이 표시되지 않을 뿐만 아니라 라이브러리 클라이언트의 손상 없이 비공개 리소스 이름을 바꾸거나 비공개 리소스를 삭제할 수도 있습니다. 비공개 리소스는 코드 완성에서 필터링되어 제외되며, 비공개 리소스를 참조하려고 하면 린트에서 경고를 표시합니다.

라이브러리를 빌드할 때 Android Gradle 플러그인이 공개 리소스 정의를 가져와서 public.txt 파일에 추출하고 이 파일은 AAR 파일 내에 패키징됩니다.

라이브러리 모듈의 개발 고려사항

라이브러리 모듈과 종속 앱을 개발할 때에는 다음 동작 및 제한사항에 유의해야 합니다.

라이브러리 모듈에 대한 참조를 Android 앱 모듈에 추가한 후에는 모듈의 상대적인 우선순위를 설정할 수 있습니다. 빌드 시에는 가장 낮은 우선순위에서 가장 높은 우선순위 순으로 라이브러리가 한 번에 하나씩 앱과 병합됩니다.

  • 리소스 병합 충돌

    빌드 도구는 라이브러리 모듈의 리소스를 종속 앱 모듈의 리소스와 병합합니다. 지정된 리소스 ID가 두 모듈에서 모두 정의된 경우에는 앱의 리소스가 사용됩니다.

    여러 AAR 라이브러리 간에 충돌이 발생한 경우 종속 항목 목록에 가장 먼저 (dependencies 블록의 윗부분) 나열된 라이브러리의 리소스가 사용됩니다.

    일반 리소스 ID와 관련된 리소스 충돌을 방지하려면 모듈에 고유하거나 모든 프로젝트 모듈 전체에 걸쳐 고유한 접두사 또는 기타 일관된 이름 지정 체계를 사용하는 것이 좋습니다.

  • 다중 모듈 빌드에서는 JAR 종속 항목이 전이 종속 항목으로 처리됨

    AAR을 출력하는 라이브러리 프로젝트에 JAR 종속 항목을 추가하면 JAR이 라이브러리 모듈에서 처리되어 AAR과 함께 패키징됩니다.

    하지만, 프로젝트에 앱 모듈에서 사용하는 라이브러리 모듈이 포함되어 있으면 앱 모듈은 라이브러리의 로컬 JAR 종속 항목을 전이 종속 항목으로 처리합니다. 이 경우 로컬 JAR은 라이브러리 모듈이 아닌 로컬 JAR을 사용하는 앱 모듈에서 처리합니다. 이를 통해 라이브러리의 코드를 변경하면 발생하는 증분 빌드 속도가 빨라집니다.

    로컬 JAR 종속 항목에 의한 자바 리소스 충돌은 라이브러리를 사용하는 앱 모듈에서 해결되어야 합니다.

  • 라이브러리 모듈은 외부 JAR 라이브러리에 종속될 수 있음

    외부 라이브러리에 종속된 라이브러리 모듈을 개발할 수 있습니다. (예: 지도 외부 라이브러리) 이 경우 종속 앱은 외부 라이브러리(예: Google API 부가기능)를 포함하는 타겟을 대상으로 빌드해야 합니다. 라이브러리 모듈과 종속 앱 모두 매니페스트 파일의 <uses-library> 요소에서 외부 라이브러리를 선언해야 합니다.

  • 앱 모듈의 minSdkVersion은 라이브러리에서 정의된 버전보다 크거나 같아야 함

    라이브러리는 종속 앱 모듈의 일부로 컴파일되므로 라이브러리 모듈에서 사용되는 API가 앱 모듈에서 지원하는 플랫폼 버전과 호환되어야 합니다.

  • 각 라이브러리 모듈은 자체 R 클래스를 생성함

    종속 앱 모듈을 빌드하면 라이브러리 모듈이 AAR 파일로 컴파일된 후 앱 모듈에 추가됩니다. 따라서, 각 라이브러리에는 라이브러리의 패키지 이름을 따라 이름이 지정된 자체 R 클래스가 있습니다. 기본 모듈과 라이브러리 모듈에서 생성되는 R 클래스는 기본 모듈의 패키지와 라이브러리의 패키지를 비롯하여 필요한 모든 패키지에 생성됩니다.

  • 라이브러리 모듈에는 자체 ProGuard 구성 파일이 포함되어 있을 수 있음

    AAR을 빌드하고 게시하는 데 사용하는 라이브러리 프로젝트가 있는 경우 ProGuard 구성 파일을 라이브러리의 빌드 구성에 추가하면 Android Gradle 플러그인에 지정한 ProGuard 규칙이 적용됩니다. 빌드 도구는 이 파일을 라이브러리 모듈의 생성된 AAR 파일 내에 삽입합니다. 라이브러리를 앱 모듈에 추가하면 라이브러리의 ProGuard 파일이 앱 모듈의 ProGuard 구성 파일(proguard.txt)에 추가됩니다.

    라이브러리 모듈에 ProGuard 파일을 삽입하면 라이브러리에 종속된 앱 모듈이 라이브러리를 사용하도록 ProGuard 파일을 수동으로 업데이트할 필요가 없습니다. Android 스튜디오 빌드 시스템에서는 앱을 빌드할 때 앱 모듈과 라이브러리에서 모두 지시문을 사용합니다. 따라서, 별도의 단계로 라이브러리에서 코드 축소기를 실행할 필요가 없습니다.

    라이브러리 프로젝트에 ProGuard 규칙을 추가하려면 라이브러리 build.gradle 파일의 defaultConfig 블록 내에 consumerProguardFiles 속성이 포함된 파일 이름을 지정해야 합니다. 예를 들어, 다음 스니펫에서는 라이브러리의 ProGuard 구성 파일로 lib-proguard-rules.txt를 설정합니다.

    Groovy

    android { defaultConfig { consumerProguardFiles 'lib-proguard-rules.txt' } ... }

    Kotlin

    android { defaultConfig { consumerProguardFiles("lib-proguard-rules.txt") } ... }

    하지만 라이브러리 모듈이 APK로 컴파일되고 AAR을 생성하지 않는 다중 모듈 빌드에 포함된 경우 라이브러리를 사용하는 앱 모듈에서만 코드 축소를 실행해야 합니다. ProGuard 규칙 및 사용법을 자세히 알아보려면 앱의 축소, 난독화 및 최적화를 참고하세요.

  • 라이브러리 모듈 테스트는 앱 테스트와 동일함

    가장 큰 차이는 라이브러리와 종속 항목이 자동으로 테스트 APK의 종속 항목으로 포함된다는 것입니다. 즉, 테스트 APK에는 자체 코드뿐 아니라 라이브러리의 AAR과 모든 종속 항목이 포함되어 있습니다. 별도의 '테스트 중인 앱'이 없으므로 androidTest 작업이 테스트 APK만 설치(및 제거)합니다.

    여러 매니페스트 파일을 병합하면 Gradle에서 기본 우선순위에 따라 라이브러리의 매니페스트를 테스트 APK의 기본 매니페스트에 병합합니다.

AAR 파일 분석

AAR 파일의 확장자는 .aar이고, Maven 아티팩트 유형도 aar입니다. 파일 자체는 ZIP 파일입니다. 유일한 필수 항목은 /AndroidManifest.xml입니다.

또한, AAR 파일에는 다음과 같은 선택 항목도 하나 이상 포함되어 있을 수 있습니다.

  • /classes.jar
  • /res/
  • /R.txt
  • /public.txt
  • /assets/
  • /libs/name.jar
  • /jni/abi_name/name.so(여기서 abi_name은 Android 지원 ABI 중 하나임)
  • /proguard.txt
  • /lint.jar
  • /api.jar
  • /prefab/: 네이티브 라이브러리 내보내기에 사용

Toplist

최신 우편물

태그