2017-09-18 27 views
2

새로운 시스템 서비스를 추가하고 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 
+0

내가 그 (것)들을 언급하지 않은 이유는 나가 HAL 단위 (장치가 그 후에 다만 적재하는 것을 무시한다)없이 그들을 시험하고 저것 거기 일했다이다. 여기서 문제는 에뮬레이터가 시작되지 않고 "Android"스플래시 화면 만 표시된다는 것입니다. – FChris

답변

1

내가 너무 experimented with adding a HAL module to AOSP카림 Yaghmour의 책을 기반으로 몇 가지 문제가 있었다. 정확하게 기억한다면 책에서 실수는 struct hw_module_tconst으로 정의하여 에뮬레이터가 부팅되지 않도록 메모리 액세스/쓰기 오류가 발생했기 때문에 발생했습니다.

+1

실제로 이것은 잘못된 것입니다. 이와 같은 작은 실수로 인해 코드를 검색하는 일. 정말 고맙습니다 – FChris