기본적으로 안드로이드에서는 안드로이드 OS 7.0버전 미만에서 .mk파일을 통해서 빌드를 진행했다. 하지만 빌드 향상을 위해 기존 .mk파일 방식에서 .bp파일을 이용한 Soong 빌드 방식으로 변경됐다.

 

0. 먼저 Android 빌드란?

안드로이드 OS 빌드를 진행하기 전에 여러 Module들의 빌드를 add 포함시키고 같이 빌드하도록 한다. Android 빌드 바이너리를 device 받으면 여러 binary, library device내에 포함되어있는데 이는 각각 하나의 모듈이며 이러한 여러 모듈들을 Android OS 빌드과정에 빌드하고 결과물을 device 산출물로써 만들어 것이다.

 

그리고 이러한 Module들을 빌드하기위한 단추가 바로 mk파일, bp파일이다.

Module빌드를 진행하기위해 Android.mk 혹은 Android.bp파일의 경로를 add해주면 컴파일러는 해당 경로에서 .mk, .bp파일을 찾고 이를 읽어들임으로써 모듈 빌드가 시작된다.

 

1. Android.bp

Android.bp파일은 기존의 Android.mk파일을 대체하며 복잡성있는 조건 등의 분기를 정의하기보다 JSON형식으로 Name:value형태 간단한 정의를 진행한다. 위에서 언급한 분기 등의 로직은 .go파일을 따로두어 go파일에서 진행하도록 하는 것이 기본원칙이다.

 

bp파일 작성을 위해 필요한 name, value 등은 이미 Android OS 정의되어있으며 Android OS 정의된 값들을 바탕으로 개발자가 원하는 빌드 진행을위해 값을 셋팅해주는 역할을 bp파일에서 진행한다.

 

soong 빌드를 위한 bp파일의 정의된 name, value등은 아래 주소에서 확인이 가능하다.

https://ci.android.com/builds/submitted/7446333/linux/latest/view/soong_build.html

예를들어 빌드를 통해 device에서 동작하기 위한 binary파일을 만들고자 한다면

cc_binary { ] 통해서 바이너리를 생성할 있고 이미지에서 정의된 값들과 같이 srcs 통해 해당 바이너리 생성을 위해 빌드하고자하는 .c파일들을 선택할 있다.

 

가지 예를들어 보면..

cc_binary {
    name: "gzip",
    srcs: ["src/test/minigzip.c"],
    shared_libs: ["libz"],
    stl: "none",
}

모듈은 device에서 실행할 있는 바이너리 파일을 output으로 soong 빌드를 통해 생성 가능하며 빌드는 src/test/minigzip.c파일을 빌드하고 libz라는 library 파일을 동적으로 연결하여 빌드한다. 생성된 binary 이름은 gzip이다.

 

cc_binary외에 주로 사용되는 모듈은 cc_library 이는 device에서 사용가능한 binary파일을 생성하는 것이 아닌 라이브러리 파일을 output으로 생성한다. 물론 cc_binary와 cc_library 모두 만들어 줌으로써 soong 빌드의 결과물로 바이너리와 라이브러리를 모두 생성할 있다.

 

1) cc_defaults

cc_defaults cc_binary cc_library 같이 output 생성하는 것이 아닌 cc_binary, cc_library에서 중복해서 사용하는 모듈이다.

예를 들어 c 코드 작성 시에 22라는 값을 중복되어 사용한다면 22라는 값을 하나의 변수에 저장하고 해당 변수를 사용하듯 cc_binary, cc_library에서도 중복해서 사용하는 부분을 별도의 모듈로 만들어 매번 모듈을 만드는 불편함과 효율성 저하를 해결하기 위한 방법이다.

cc_defaults {
    name: "gzip_defaults",
    shared_libs: ["libz"],
    stl: "none",
}

cc_binary {
    name: "gzip",
    defaults: ["gzip_defaults"],
    srcs: ["src/test/minigzip.c"],
}

위와 같이 주로 사용하는 모듈을 cc_defaults 생성하고 cc_binary에서는 해당 모듈을 가져와서 사용할 있다.

 

2. go 파일

go파일은 go문법을 통해 작성한 소스코드이다. go문법은 Google에서 java 대체하여 안드로이드 빌드를 진행하기 위해 생성한 안드로이드 생태계를 위한 하나의 언어이다.

 

Soong Build 진행하기 위해서는 위에서 언급한 바와같이 기본적으로 Android.bp에서 진행되는데

Android.bp에서는 조건문과 같은 복잡한 문구를 사용하지 않는 것이 원칙이라고 정의 했다. 하지만 빌드를 진행하는데 있어 여러 플랫폼, H/W Spec, S/W Spec 다양한 상황을 모두 cover하기 위해서 분기문은 필수적이다.

 

이러한 분기문을 진행하기 위해서 .go파일을 사용하고 Android.bp에서 .go파일로 연결하도록 정의할 있다.

위와 같이 Android.bp파일의 cc_binary에서 srcs 보면 go파일을 참조하는 것을 있다.

기존에 .c 파일들을 srcs에서 정의했을 때는 모듈을 생성하기위한 소스코드를 직접적으로 정의해서 빌드했지만

위와 같이 .go파일을 명시한 경우 .go파일내 분기문을 통해서 빌드를 위해 포함할 소스코드들(.c) 정의된다.

 

예를 들어 단말의 AP Apple chipset 경우 AP Qualcomm Chipset 경우 서로 다른 소스코드들을 포함해서 soong 빌드를 진행하고 모듈을 생성해야 한다면 Android.bp파일에서는 srcs 부분에 .go파일을 연결해주고

go파일 내부에서 Android Property 값을바탕으로(Property값을 바탕으로 AP chipset종류를 판별할 있다고 가정) AP 종류를 판별하고 각각 AP chipset종류에 맞는 .c파일들을 포함하도록 정의할 있다.

 

 

  • ref

Android Soong 빌드 시스템

https://source.android.google.cn/setup/build?hl=ko

 

Android.bp go파일 연결

https://pythonq.com/so/android/1658772

+ Recent posts