Google은 흑인 공동체를 위한 인종 간 평등을 진전시키기 위해 노력하고 있습니다. Google에서 어떤 노력을 하고 있는지 확인하세요.

자바 SDK 라이브러리 구현

Android 플랫폼에는 다수의 공유 자바 라이브러리가 포함되어 있습니다. 이러한 라이브러리는 앱 매니페스트에 <uses-library> 태그를 사용하여 앱의 클래스 경로에 선택적으로 포함할 수 있습니다. 앱은 이러한 라이브러리에 대해 연결되므로 호환성, API 검토 및 도구 지원이라는 측면에서는 Android API의 나머지처럼 취급해야 합니다. 하지만 대부분의 라이브러리에는 이러한 기능이 없습니다.

Android 10에는 공유 자바 라이브러리의 호환성 문제 해결을 위한 새로운 빌드 규칙인 java_sdk_library가 도입되었습니다. 기기 제조업체에서는 이러한 메커니즘을 자체 공유 자바 라이브러리에 사용하여 자체 API의 하위 호환성을 유지할 수 있습니다. 기기 제조업체가 부팅 클래스 경로 대신 <uses-library> 태그를 통해 자체 공유 자바 라이브러리를 사용하는 경우 java_sdk_library는 이러한 자바 라이브러리가 API에 대해 안정적인지 확인할 수 있습니다.

java_sdk_library는 선택적 SDK API를 앱에 구현하는 자바 라이브러리입니다. makefile(Android.bp)의 java_sdk_library를 통해 구현된 라이브러리는 다음과 같은 작업을 실행합니다.

  • 스터브 라이브러리는 stubs, stubs.systemstubs.test를 포함하도록 생성됩니다. 이러한 스터브 라이브러리는 @hide, @SystemApi@TestApi 주석을 인식하는 방식으로 생성됩니다. 빌드 시의 SDK 버전이 각각 current, system_currenttest_current인 경우에는 자동으로 참조됩니다.
  • Android는 스터브 파일을 통해 API 목록을 가져오며, 마스터의 최신 API 목록을 가장 최근에 게시된 Android 버전의 API 목록과 비교하여 API가 이전 버전과 호환되는 방식으로 유지되는지 확인합니다.
  • 런타임의 구현 라이브러리가 설치되면 XML 파일이 생성 및 설치됩니다.
자바 SDK 라이브러리를 사용한 빌드 흐름
그림 1. 자바 SDK 라이브러리를 사용한 빌드 흐름

예시 및 소스

스터브 라이브러리의 최소 구성요소는 필수 속성인 srcsapi_packages입니다.

java_sdk_library {
        name: "com.android.future.usb.accessory",
        srcs: ["src/**/*.java"],
        api_packages: ["com.android.future.usb"],
    }

런타임에 사용되는 impl 라이브러리를 빌드하려면 hostdex, compile_dex, 및 errorprone과 같은 모든 java_library 속성을 채웁니다.

java_sdk_library {
        name: "android.test.base",

        srcs: ["src/**/*.java"],

        errorprone: {
          javacflags: ["-Xep:DepAnn:ERROR"],
        },

        hostdex: true,

        api_packages: [
            "android.test",
            "android.test.suitebuilder.annotation",
            "com.android.internal.util",
            "junit.framework",
        ],

        compile_dex: true,
    }

스터브 라이브러리를 생성하려면 srcs_lib, srcs_lib_whitelist_dirs, srcs_lib_whitelist_pkgs, merge_annotations_dirsmerge_inclusion_annotations_dirs와 같은 droidstubs 속성을 채웁니다. 스터브 라이브러리에도 이러한 속성을 사용할 수 있습니다.

  • api_srcs: API의 일부이지만 런타임 라이브러리의 일부는 아닌 선택적 소스 파일 목록입니다.
  • stubs_only_libs: 스터브 빌드 시 클래스 경로에 위치하는 자바 라이브러리 목록입니다.
  • hidden_api_packages: API에서 숨겨야 하는 패키지 이름 목록입니다.
  • droiddoc_options: metalava의 추가 인수입니다.
    java_sdk_library {
              name: "android.test.mock",
    
              srcs: ["src/**/*.java"],
    
              api_packages: [
                  "android.test.mock",
              ],
    
              srcs_lib: "framework",
              srcs_lib_whitelist_dirs: ["core/java"],
              srcs_lib_whitelist_pkgs: ["android"],
              compile_dex: true,
          }

이전 버전과의 호환성 유지

빌드 시스템은 최신 API 파일과 빌드 시에 생성된 API 파일을 비교하여 API가 이전 버전과의 호환성을 유지했는지 확인합니다. 이를 수행하려면 사전 빌드된 스터브 라이브러리와 API 목록 모듈을 생성하는 새로운 빌드 규칙인 prebuilt_apis를 사용해야 합니다. java_sdk_library로 빌드된 모든 라이브러리는 prebuilt_apis에 최신 버전의 api_dirs가 있어야 합니다. 버전을 출시하면 PRODUCT-sdk_phone_armv7-sdk를 포함하는 dist 빌드로 API 목록 파일과 스터브 라이브러리를 가져올 수 있습니다.

api_dirs 속성은 prebuilt_apis의 API 버전 디렉터리 목록입니다. API 버전 디렉터리는 Android.bp와 같은 디렉터리 수준에 위치해야 합니다.

prebuilt_apis {
        name: "sdk",
        api_dirs: [
            "1",
            "2",
              ....
            "28",
            "current",
        ],
    }

version/scope/api/ 구조체를 포함하는 디렉터리를 사전 빌드된 디렉터리 아래에 구성합니다. version은 API 수준에 상응하며 scope는 디렉터리가 공개, 시스템 또는 테스트인지 확인합니다.

  • version/scope에는 자바 라이브러리가 포함됩니다.
  • version/scope/api에는 API .txt 파일이 포함됩니다. 여기서 module_name.txtmodule_name-removed.txt라는 빈 텍스트 파일을 생성하세요.
    ├── 28
          │   ├── public
          │   │   ├── api
          │   │   │   ├── android.test.base-removed.txt
          │   │   │   └── android.test.base.txt
          │   │   └── android.test.base.jar
          │   ├── system
          │   │   ├── api
          │   │   │   ├── android.test.base-removed.txt
          │   │   │   └── android.test.base.txt
          │   │   └── android.test.base.jar
          │   └── test
          │       ├── api
          │       │   ├── android.test.base-removed.txt
          │       │   └── android.test.base.txt
          │       └── android.test.base.jar
          └── Android.bp