make / 모듈 추가 방법

Posted by ironmask84
2013. 4. 1. 14:22 나는 프로그래머다!/Java & Android


테스트 라이브러리를 플랫폼에 추가하기
안드로이드는 config.mk 에서 각 프로젝트별 android.mk를 뒤져
빌드하는 형태로 구성되어 있다~


안드로이드 플랫폼내에 모듈이나 어플리케이션을 추가시키기 위해
별도의 mk 및 타겟 플랫폼 빌드환경을 구성하기에는 작업해야 하는 일이
많고, 안드로이드에 특화된 시뮬레이터, 서명 등의 문제가 발생할 여지가 있다.

(실제로 발생하는지는 모르겠다... -_-;)


아무튼 기 구성된 make 프로세스에 포함시켜 빌드하는게

가장 편한 방법이기에 해당내용을 정리해 본다. 


ex) helloworld 라는 공용라이브러리 추가하기


1. 테스트 라이브러리를 위한 폴더명 설정  "helloworld"

2. /frameworks/base/helloworld 폴더 추가(다른위치에 추가해도 됨)

3. /build/core/pathmap.mk 수정

pathmap.mk는 프레임워크의 각 서브항목에 대해 정의해둔 곳이다.

make 파일에서 FRAMEWORKS_BASE_SUBDIRS 를 찾아 마지막에 추가될

모듈(helloworld 추가)


#

# A list of all source roots under frameworks/base, which will be

# built into the android.jar.

#

FRAMEWORKS_BASE_SUBDIRS := \

$(addsuffix /java, \

   core \

   graphics \

   im \

   location \

   media \

   opengl \

   sax \

   telephony \

   wifi \

   vpn \

   keystore \

   helloworld \

)


4. 소스 복사 or 코딩

/frameworks/base/helloworld/libhelloworld/ 와 같은 폴더 생성 후 코딩 및 소스 추가


helloworld.h

namespace android {


class HelloWorldTest

{

public:

HelloWorldTest();

~HelloWorldTest();


void Test();

};

};


helloworld.cpp

#include "helloworld.h"

using namespace android;


void HelloWorldTest::Test()

{

return;

}



5. Android.mk 추가

LOCAL_PATH:= $(call my-dir)


include $(CLEAR_VARS)


#여기에 소스 목록을 등록

LOCAL_SRC_FILES:= \

helloworld.cpp


#여기에 사용하는 라이브러리들 등록

LOCAL_SHARED_LIBRARIES:= \

libui \

libcutils \

libutils


#출력 모듈명

LOCAL_MODULE:= libhelloworld

LOCAL_PRELINK_MODULE:= false


#링커 관련 플래그

ifeq ($(TARGET_OS)-$(TARGET_SIMULATOR),linux-true)

LOCAL_LDLIBS += -ldl

endif

 

#동적으로 참조할 라이브러리 추가

#에뮬레이터인 경우 libdl 을 동적참조

ifneq($(TARGET_SIMULATOR),true)

LOCAL_SHARED_LIBRARIES += libdl

endif


#헤더파일 위치

LOCAL_C_INCLUDES:= \

$(LOCAL_PATH)/include \

$(call include-path-for, graphics corecg)


#빌드방식

include $(BUILD_SHARED_LIBRARY)


6. 아웃풋 위치

out/target/product/generic/system/ 에 빌드방식에 따른 폴더가

정의되어 있다.


동적 라이브러리의 경우

out/target/product/generic/system/lib/

out/target/product/generic/obj/SHARED_LIBRARIES/xxxx/

out/target/procuct/generic/symbols/system/lib/

등이 출력 위치이다.



7. 주요 define 항목 설명

LOCAL_PRELINK_MODULE : 프리링크 활성화(true, false)


LOCAL_MODULE_TAGS : 타겟 시스템 설정을 위한 태그

이 값은 최상위의 /build/core/main.mk 에서 각 프로젝트를 빌드할때

사용되는 값으로 어플리케이션의 속성을 지정하게 된다.

설치 관련 정보나 보안 등급, 디버깅 여부 등의 설정이 이루어진다.

기본 값은 user 이다.


eng, user ,userdebug, optional


LOCAL_MODULE_CLASS

모듈의 등급을 지정하는 것으로 아래와 같은 값이 들어감

EXECUTABLES , JAVA_LIBRARIES , SHARED_LIBRARIES


LOCAL_PACKAGE_NAME

/packages/app/ 에 등록된 패키지들과 마찬가지로

패키지명으로 기본 os 에 포함될 패키지를 의미한다.


이름은 패키지의 디렉토리명과 동일해야 한다.

실제 패키지가 이미지에 포함되기 위해서는

build/target/product/generic.mk 에도 등록해야 

system.img에 패키지가 포함된다.



LOCAL_CERTIFICATE : 키 서명

설정되지 않으면 testkey가 사용되며, 해당 키에 대한 값은

/build/target/product/security/ 폴더에 pk8, x509.pem 파일이 존재한다.

이 파일의 이름이 키가 되고, 빌드시 해당 키를 사용한다고

이곳에 지정하게 된다.


테스트용 키를 생성하기 위한 mkkey.sh 스크립트도 포함하고 있다.


LOCAL_CFLAGS : C , C++ 관련 컴파일러 플래그

LOCAL_CPPFLAGS : C++ 관련 컴파일러 플래그

LOCAL_CXXFLAGS

일반적으로 gcc 관련 옵션사항을 기술한다.


기본 최적화 옵션

-O : 기본 최적화를 켠다.

-O2 : 모든 최적화를 켠다. 대부분 -O 보다 나은 선택이며, 일반적으로 사용됨.

-O3 : -O2 에 더해 추가 최적화를 켠다. 바이너리 사이즈가 증가하며 디버깅이 거의 불가능.

-Os : -O2 에 더해 사이즈 관련 최적화를 한다. 큰 어플리케이션에 유용하다.

-O2, -O3 보다 실행 속도가 빠른데, 로드 시간의 감소, 메모리 사용 및 캐쉬, 디스크 사용등

의 최적화가 이루어지기 때문이다.

-fomit-frame-pointer : x86 시스템에서 함수 호출과 관련한 스택포인터와 

이를 지시하는 프레임 포인터에 해당하는 작업을 하지 않는다. 

(각 인수들,  리턴 주소 등의 ebp 관련 레지스터 )

-march=<your_arch> 

-mtune=<your_arch>

-mcpu=<your_arch>

머신 컴파일 옵션으로 대상에 대해 최적화를 수행한다. 대상의 cpu 정보를 넣어주면 되며,

세개 모두 동일한 내용이며, -march 는 -mtune을 의미한다.

-mtune/-mcpu는 gcc 구버전에서 이용되었다. 

-pipe : 컴파일시 별도의 임시파일을 생성하지 않음.



TARGET_SIMULATOR : 대상 시뮬레이터여부 , true/false

TARGET_OS : 대상 os

TARGET_ARCH : 대상 아키텍처



LOCAL_LDLIBS : 링커 옵션

LOCAL_STATIC_LIBRARIES

LOCAL_SHAREDLIBRARIES


LOCAL_C_INCLUDES : include 폴더

LOCAL_CPP_EXTENSION : cpp 소스의 확장자. 기본값은 .cpp



빌드 규칙

include $(BUILD_PACKAGE)

include $(BUILD_EXECUTABLE)

include $(BUILD_SHARED_LIBRARY)

include $(BUILD_HOST_EXCUTABLE)

 

출처 : http://blog.daum.net/hopefullife/117