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 };

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章