make / 모듈 추가 방법
테스트 라이브러리를 플랫폼에 추가하기
안드로이드는 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
'나는 프로그래머다! > Java & Android' 카테고리의 다른 글
안드로이드 리소스 정책 #2 (0) | 2016.04.19 |
---|---|
안드로이드 리소스 정책 #1 (0) | 2016.04.19 |
[JAVA] Primitive type과 Reference type 그리고 Object 클래스 (0) | 2016.04.12 |
Eclipse 에서 Tap을 Space로 변경하기 (0) | 2016.03.31 |
PreferenceActivity 와 Fragment (0) | 2016.03.10 |
BroadcastReceiver 간단 정리 (0) | 2016.02.01 |
안드로이드 View 클래스 관련 깨알같은 스펙정보 (0) | 2016.01.21 |
안드로이드 App Flag_Activity 란? (0) | 2016.01.21 |
App 위젯 만들기 (in Eclipse) (0) | 2016.01.14 |
JNI & 예제 (0) | 2013.04.01 |