새로운 시스템 서비스를 추가하고 HAL (Hardware Abstraction Layer)을 확장하여 Android 버전 4.3을 기준으로 AOSP를 수정합니다.AOSP 4.3 : HAL 모듈을 추가 한 후 에뮬레이터가 시작되지 않음
시스템 서비스가 구현되었으며 에뮬레이터의 응용 프로그램이 바인더를 통해 서비스에 액세스 할 때 사용할 수 있습니다. 서비스 자체는 서비스의 cpp 부분에 새 HAL 모듈을로드하려고 시도합니다.
문제는 에뮬레이터가 시작되지 않아서 HAL 구현을 빌드에 추가 할 수 없다는 것입니다. HAL 모듈 자체는 간단한 C 파일과 Android.mk로 구성됩니다.
컴파일 오류가없고 빌드에 .so 라이브러리가 추가되었습니다. 나는 하드웨어/libhardware/포함/하드웨어/gen_gpio.h 에서 헤더 파일을 생성 및 SDK/에뮬레이터/gen_gpio
로 아래의 구현을 배치이 모든 안드로이드 2.3
에 대한 post 카림 Yaghmour에 따라 게시물에 제공된 예에서도 동일한 문제가 있습니다. 그래서 안드로이드 2.3과 안드로이드 4.3 사이에 큰 변화가 있었는지 궁금하고 에뮬레이터에 HAL 모듈을 추가하기 위해 다르게 수행해야 할 일이 무엇인지 궁금합니다 (Karim Yaghmour는 그의 책에서 여전히 똑같은 주제를 다룰 것입니다).
제 C 파일은 다음과 같습니다.
#include <errno.h>
#define LOG_TAG "gen_gpio_odroidxu4"
#include <cutils/log.h>
#include <cutils/sockets.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <hardware/gen_gpio.h>
static int gen_gpio_read (char* buffer, int length, int gpio_pin) {
return 0;
};
static int gen_gpio_write (char* buffer, int length, int gpio_pin) {
return 0;
};
static int open_gen_gpio(const struct hw_module_t* module, char const* name, struct hw_device_t** device) {
struct gen_gpio_device_t *dev = malloc(sizeof(struct gen_gpio_device_t)); //Reserve memory for device struct
memset(dev, 0, sizeof(*dev)); //Clear memory area
dev->common.tag = HARDWARE_DEVICE_TAG;
dev->common.version = 0;
dev->common.module = (struct hw_module_t*) module;
dev->read = gen_gpio_read;
dev->write = gen_gpio_write;
*device = (struct hw_device_t*) dev;
return 0;
};
static struct hw_module_methods_t gen_gpio_module_methods = {
.open = open_gen_gpio
};
const struct hw_module_t HAL_MODULE_INFO_SYM = {
.tag = HARDWARE_MODULE_TAG,
.version_major = 1,
.version_minor = 0,
.id = GEN_GPIO_HARDWARE_MODULE_ID,
.name = "Generic GPIO HW Module",
.author = "Christoph Fraedrich",
.methods = &gen_gpio_module_methods,
};
그리고이 같은 메이크업 파일 :
LOCAL_PATH := $(call my-dir)
ifneq ($(TARGET_PRODUCT),sim)
# HAL module implemenation, not prelinked and stored in
# hw/<GPS_HARDWARE_MODULE_ID>.<ro.hardware>.so
include $(CLEAR_VARS)
LOCAL_PRELINK_MODULE := false
LOCAL_MODULE_PATH := $(TARGET_OUT_SHARED_LIBRARIES)/hw
LOCAL_CFLAGS += -DQEMU_HARDWARE
LOCAL_SHARED_LIBRARIES := liblog libcutils libhardware
LOCAL_SRC_FILES := gen_gpio_qemu.c
LOCAL_MODULE := gen_gpio.goldfish
LOCAL_MODULE_TAGS := debug
include $(BUILD_SHARED_LIBRARY)
endif
내가 그 (것)들을 언급하지 않은 이유는 나가 HAL 단위 (장치가 그 후에 다만 적재하는 것을 무시한다)없이 그들을 시험하고 저것 거기 일했다이다. 여기서 문제는 에뮬레이터가 시작되지 않고 "Android"스플래시 화면 만 표시된다는 것입니다. – FChris