Android添加HelloWorldService实践

参考链接

http://blog.csdn.net/myarrow/article/details/7175204

Android硬件抽象层(HAL)概要介绍和学习计划

http://blog.csdn.net/luoshengyang/article/details/6567257

    一. 在Android内核源代码工程中编写硬件驱动程序

    二. 在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 };

猜你喜欢

转载自blog.csdn.net/zhanghao864442969/article/details/80865705