参考链接
http://blog.csdn.net/myarrow/article/details/7175204
Android硬件抽象层(HAL)概要介绍和学习计划
http://blog.csdn.net/luoshengyang/article/details/6567257
二. 在Android系统中增加C可执行程序来访问硬件驱动程序。
三. 在Android硬件抽象层增加接口模块访问硬件驱动程序。
四. 在Android系统中编写JNI方法在应用程序框架层提供Java接口访问硬件。
五. 在Android系统的应用程序框架层增加硬件服务接口。
六. 在Android系统中编写APP通过应用程序框架层访问硬件服务。
在Ubuntu上为Android增加硬件抽象层(HAL)模块访问Linux内核驱动程序
http://blog.csdn.net/luoshengyang/article/details/6573809
在Ubuntu上为Android系统编写Linux内核驱动程序
http://blog.csdn.net/luoshengyang/article/details/6568411
一、Linuxkernel添加HelloDrv
Ø 1.1 code
release-o1-one/kernel-4.4/drivers/hello/hello.c
release-o1-one/kernel-4.4/drivers/hello/hello.h
Ø 1.2 build
1.2.1 release-o1-one/kernel-4.4/drivers/hello/Kconfig内容
config HELLO
tristate "First Android Driver"
default n
help
This is the first android driver.
1.2.2 release-o1-one/kernel-4.4/drivers/hello/Makefile内容
obj-$(CONFIG_HELLO) += hello.o
release-o1-one/kernel-4.4/drivers/Kconfig添加
menu "Device Drivers"
source"drivers/hello/Kconfig"
source "drivers/amba/Kconfig"
1.2.3 release-o1-one/kernel-4.4/drivers/Makefile添加
obj-$(CONFIG_HELLO) += hello/
1.2.4 release-o1-one/kernel-4.4/arch/arm64/configs/X605_H632_defconfig添加
CONFIG_HELLO=y
Ø 1.3 out
release-o1-one/out/target/product/X605_H632/obj/KERNEL_OBJ/drivers/hello/hello.o
Ø 1.4 notice
二、编写C语言应用程序测试HelloDrv
Ø 2.1 code
release-o1-one/external/hello/hello.c
Ø 2.2 build
release-o1-one/external/hello/Android.mk
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE_TAGS := optional
LOCAL_MODULE := hello
LOCAL_SRC_FILES := $(callall-subdir-c-files)
include $(BUILD_EXECUTABLE)
mmm external/hello/
make snod
Ø 2.3 out
./system/bin/hello
./obj/EXECUTABLES/hello_intermediates/LINKED/hello
./obj/EXECUTABLES/hello_intermediates/PACKED/hello
./obj/EXECUTABLES/hello_intermediates/hello
./symbols/system/bin/hello
Ø 2.3 notice
添加HelloHal代码访问HelloDrv
Ø code
release-o1-one/hardware/libhardware/include/hardware/hello.h
release-o1-one/hardware/libhardware/modules/hello/hello.c
Ø build
release-o1-one/hardware/libhardware/modules/hello/Android.mk
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE_TAGS := optional
LOCAL_PRELINK_MODULE := false
# LOCAL_MODULE_RELATIVE_PATH :=$(TARGET_OUT_SHARED_LIBRARIES)/hw
# LOCAL_MODULE_RELATIVE_PATH :=/system/lib64/hw
LOCAL_MODULE_RELATIVE_PATH := /hw
LOCAL_SHARED_LIBRARIES := liblog
LOCAL_SRC_FILES := hello.c
LOCAL_MODULE := hello.mt6763
include $(BUILD_SHARED_LIBRARY)
mmm hardware/libhardware/modules/hello/
Ø out
release-o1-one/out/target/product/X605_H632/obj/SHARED_LIBRARIES/hello.mt6763_intermediates/hello.o
release-o1-one/out/target/product/X605_H632/obj_arm/SHARED_LIBRARIES/hello.mt6763_intermediates/hello.o
release-o1-one/out/target/product/X605_H632/system/lib64/hw/hello.mt6763.so
release-o1-one/out/target/product/X605_H632/system/lib/hw/hello.mt6763.so
Ø notice
输出目录
LOCAL_MODULE_RELATIVE_PATH指定以x605/system/lib64/为起点的输出目录
LOCAL_MODULE_RELATIVE_PATH := /hw
release-o1-one/out/target/product/X605_H632/system/lib64/hw
release-o1-one/out/target/product/X605_H632/system/lib/hw
整编
如果不先编译生成so文件,整编之后是不会打包到system.img的
权限
system/core/rootdir/ueventd.rc
/dev/hello 0666 root root
添加HelloJNIService接口访问HelloHal
Ø code
release-o1-one/frameworks/base/services/core/jni/com_android_server_hello_HelloService.cpp
实现int register_android_server_HelloService(JNIEnv *env);接口
release-o1-one/frameworks/base/services/core/jni/onload.cpp
添加声明int register_android_server_HelloService(JNIEnv *env); //kaili add
添加函数调用register_android_server_HelloService(JNIEnv *env);
Ø build
release-o1-one/frameworks/base/services/core/jni/Android.mk添加文件编译
LOCAL_SRC_FILES += \
$(LOCAL_REL_DIR)/com_android_server_VibratorService.cpp \
$(LOCAL_REL_DIR)/com_android_server_PersistentDataBlockService.cpp \
$(LOCAL_REL_DIR)/com_android_server_GraphicsStatsService.cpp \
$(LOCAL_REL_DIR)/com_android_server_hello_HelloService.cpp\
$(LOCAL_REL_DIR)/onload.cpp
make -j24 2>&1 | tee all.c
Ø out
release-o1-one/out/target/product/X605_H632/obj_arm/SHARED_LIBRARIES/libandroid_servers_intermediates/core/jni/
com_android_server_hello_HelloService.o
release-o1-one/out/target/product/X605_H632/obj/SHARED_LIBRARIES/libandroid_servers_intermediates/core/jni/
com_android_server_hello_HelloService.o
Ø notice
mmm编译失败可以整编
添加HelloService访问HelloJNIService
Ø code
release-o1-one/frameworks/base/core/java/android/hardware/hello/IHelloService.aidl
release-o1-one/frameworks/base/services/core/java/com/android/server/hello/HelloService.java
release-o1-one/frameworks/base/services/java/com/android/server/SystemServer.java
Ø build
编译服务接口
release-o1-one/frameworks/base/Android.mk
LOCAL_SRC_FILES += \
core/java/android/hardware/radio/ITunerCallback.aidl \
core/java/android/hardware/soundtrigger/IRecognitionStatusCallback.aidl\
core/java/android/hardware/usb/IUsbManager.aidl \
core/java/android/hardware/hello/IHelloService.aidl\
core/java/android/net/ICaptivePortal.aidl \
core/java/android/net/IConnectivityManager.aidl \
core/java/android/net/IIpConnectivityMetrics.aidl \
编译服务
release-o1-one/frameworks/base/services/core/Android.mk
LOCAL_SRC_FILES += \
$(call all-java-files-under,java) \
java/com/android/server/EventLogTags.logtags \
java/com/android/server/am/EventLogTags.logtags \
../../../../system/netd/server/binder/android/net/INetd.aidl \
../../../../system/netd/server/binder/android/net/metrics/INetdEventListener.aidl\
../../../native/cmds/installd/binder/android/os/IInstalld.aidl \
mmm frameworks/base/services/core/
make snod
Ø out
Ø notice
mmm frameworks/base/services/core/jni报错用mmm frameworks/base/services/core/
添加TranHelloApp访问HelloService
Ø code
release-o1-one/vendor/mediatek/proprietary/packages/apps/TranHello建立app工程
有效工程结构
release-o1-one/vendor/mediatek/proprietary/packages/apps/TranHello/app/src/main/java/tranhello/com/src/tranhello/MainActivity.java
release-o1-one/vendor/mediatek/proprietary/packages/apps/TranHello/app/src/main/res/layout/activity_main.xml
release-o1-one/vendor/mediatek/proprietary/packages/apps/TranHello/app/src/main/res/values/strings.xml
Ø build
release-o1-one/vendor/mediatek/proprietary/packages/apps/TranHello/app/src/main/Android.mk
LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE_TAGS := optional
LOCAL_SRC_FILES := $(callall-java-files-under, ./)
LOCAL_PACKAGE_NAME := TranHello
LOCAL_MODULE_OWNER := tran
include $(BUILD_PACKAGE)
# Use the folloing include to make our testapk.
include $(call all-makefiles-under,$(LOCAL_PATH))
release-o1-one/vendor/mediatek/proprietary/packages/apps/TranHello/app/src/main/AndroidManifest.xml
<?xml version="1.0"encoding="utf-8"?>
<manifestxmlns:android="http://schemas.android.com/apk/res/android"
package="tranhello.com.src.tranhello" >
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name=".MainActivity"
android:label="@string/app_name" >
<intent-filter>
<actionandroid:name="android.intent.action.MAIN" />
<categoryandroid:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
release-o1-one/build/make/target/product/core.mk
PRODUCT_PACKAGES += \
DocumentsUI \
DownloadProviderUi \
Email \
TranHello \
ExactCalculator \
ExternalStorageProvider \
FusedLocation \
Ø out
release-o1-one/out/target/product/X605_H632/下
./system_other/app/TranHello
./system_other/app/TranHello/oat/arm64/TranHello.odex
./system_other/app/TranHello/oat/arm64/TranHello.vdex
./system/app/TranHello
./system/app/TranHello/TranHello.apk
./obj/APPS/TranHello_intermediates
Ø notice
Android.mk和AndroidManifest.xml必须在同一级目录下,否则无法编译
必须修改release-o1-one/build/make/target/product/core.mk,否则编译无法打包
TranHello.Apk
添加权限&&添加property
release-o1-one/device/mediatek/ sepolicy/custom/module/hello
Ø file_contexts
/dev/hello(/.*)? u:object_r:hello_device:s0
Ø device.te
type hello_device, dev_type;
Ø domain.te
allow domain hello_device:chr_filerw_file_perms;
Ø hello.te
allow hello_servicehello_service:service_manager add;
Ø service.te
type hello_service, system_api_service,system_server_service, service_manager_type;
Ø service_contexts
hello u:object_r:hello_service:s0
Ø system_server.te
allow system_serverdefault_android_service:service_manager add;
allow system_serverhello_service:service_manager add;
allow system_server hello_device:chr_file {read write open };
Ø untrusted_app.te
allow untrusted_appdefault_android_service:service_manager find;
allow untrusted_apphello_service:service_manager find;
allow system_serverhello_service:service_manager add;
release-o1-one/system/core/rootdir/ueventd.rc添加
/dev/hello 0666 root root
release-o1-one/system/sepolicypublic/domain.te去掉
# from service name to service_type aredefined in {,hw,vnd}service_contexts.
-neverallow * default_android_service:service_manager add;
+# neverallow *default_android_service:service_manager add;
neverallow *default_android_vndservice:service_manager { add find };