반응형

vendor/mycompany/interfaces/myinterface/
├── Android.bp
└── aidl/
    └── com/
        └── example/
            └── IMyService.aidl

 

 

Android.bp

aidl_interface {
    name: "com.example.myservice",
    vendor_available: true,
    srcs: ["aidl/com/example/*.aidl"],
    // path 대신 local_include_dir를 사용합니다.
    local_include_dir: "aidl", 
    stability: "vintf",
    owner: "mycompany",
    backend: {
        java: { enabled: true },
        ndk: { enabled: true },
    },
}

 

IMyService.aidl

package com.example;

@VintfStability
interface IMyService {
    /**
     * 간단한 숫자 합산 예제
     */
    int addNumbers(int a, int b);

    /**
     * 서비스 상태 확인
     */
    String getStatus();
}

 

빌드 명령어

m com.example.myservice-freeze-api

 

참고

m com.example.myservice-update-api

 

 

 

1. 개별 인터페이스 빌드 (확인용)

작성한 Android.bp가 문법적으로 맞는지, AIDL 파일에 오류가 없는지 확인하려면 아래 명령어를 사용합니다.

Bash
 
# 전체 빌드 환경 초기화 (AOSP 루트에서 실행)
source build/envsetup.sh
lunch <your_target_device_combo>

# 특정 AIDL 인터페이스만 빌드
# m <모듈이름>-<백엔드>
m com.example.myservice-V1-ndk
m com.example.myservice-V1-java

참고: 이름 뒤에 -V1-ndk 처럼 버전과 백엔드 명칭이 붙습니다. 첫 빌드 시 버전을 명시하지 않았다면 보통 V1이 기본값입니다.


2. 다른 모듈에서 참조하기 (실제 사용)

보통 AIDL만 따로 빌드하기보다는, 이를 사용하는 **서비스(Server)**나 클라이언트(Client) 모듈의 Android.bp에 의존성을 추가하여 함께 빌드합니다.

C++ (NDK) 서비스의 경우

코드 스니펫
 
cc_binary {
    name: "my_service_daemon",
    vendor: true,
    srcs: ["main.cpp"],
    shared_libs: [
        "libbinder_ndk",
        "com.example.myservice-V1-ndk", // 생성된 NDK 라이브러리 추가
    ],
}

Java 앱/서비스의 경우

코드 스니펫
 
android_app {
    name: "MyClientApp",
    platform_apis: true,
    static_libs: [
        "com.example.myservice-V1-java", // 생성된 Java 라이브러리 추가
    ],
}

3. 유용한 빌드 팁

  • 인터페이스 업데이트 시: AIDL 파일을 수정했다면 빌드 시스템이 변경 사항을 감지합니다. 하지만 stability: "vintf"가 설정된 경우, 나중에 인터페이스를 고정(frozen: true)하게 되면 API 변경 시 m update-api 명령어를 통해 API 덤프를 업데이트해야 할 수도 있습니다.
  • 출력물 확인: 빌드된 결과물(.so 파일이나 .jar 파일)은 아래 경로 근처에서 찾아볼 수 있습니다.
    • out/soong/.intermediates/<경로>/com.example.myservice-V1-ndk/

 

 

 

 

반응형