1.准备源码
Android S 源码,基于amlogic平台
2.编写hal接口
在vendor\xxx\DVB\interfaces\下创建 自己的文件夹 例如calculate/1.0
编写hal文件
package vendor.xxx.calculate@1.0; interface ICalculate{ //加法 add(uint32_t a,uint32_t b) generates (uint32_t result); //减法 sub(uint32_t a,uint32_t b) generates (uint32_t result); //乘法 mul(uint32_t a,uint32_t b) generates (uint32_t result); //除法 div(uint32_t a,uint32_t b) generates (uint32_t result); };
3.生成Android.bp文件
执行命令 :
PACKAGE=vendor.xxx.calculate@1.0
LOC=vendor/xxx/xxx/interfaces/calculate/1.0/
hidl-gen -o $LOC -Landroidbp-impl -rvendor.xxx:vendor/xxx/DVB/interfaces/ -randroid.hidl:system/libhidl/transport $PACKAGE
在calculate/1.0下生成Android.bp文件
在calculate/下创建Android.bp文件和Android.mk
// This is an autogenerated file, do not edit. subdirs = [ "1.0", ]
include $(call all-subdir-makefiles)
4.编译so库
使用命令 mmm 对应的文件路径 就可以编译出 对应的文件了
5.使用命令生成c++文件和h文件
hidl-gen -o $LOC -Lc++-impl -rvendor.xxx:vendor/xxx/DVB/interfaces/ -randroid.hidl:system/libhidl/transport $PACKAGE
然后再创建这些编译文件 和rc文件即可
Android.bp
cc_binary { compile_multilib: "32", relative_install_path: "hw", defaults: ["hidl_defaults"], name: "vendor.xxx.calculate@1.0-service", //vintf_fragments: ["vendor.xxx.calculate@1.0.xml"], init_rc: ["vendor.xxx.calculate@1.0-service.rc"], vendor: true, srcs: [ "service.cpp" ], shared_libs: [ "liblog", "libbinder", "libutils", "libhardware", "libhidlbase", "vendor.xxx.calculate@1.0", ], }
Android.mk
LOCAL_PATH :=$(call my-dir) include $(CLEAR_VARS) LOCAL_MULTILIB := 32 LOCAL_MODULE_RELATIVE_PATH := hw LOCAL_C_INCLUDES:= \ vendor/xxx/DVB/sksdk/source/skportting \ frameworks/native/libs/binder/include \ LOCAL_SRC_FILES:= stbmedia.cpp LOCAL_SHARED_LIBRARIES:= \ libhidlbase \ libhidltransport \ libcutils \ libhardware \ liblog \ libutils \ vendor.xxx.calculate@1.0 \ libbinder \ libsk_portting LOCAL_CFLAGS +=-Wno-error=unused-parameter LOCAL_MODULE:=vendor.xxx.calculate@1.0-impl ifeq ($(SK_DVB_VENDOR_MODE),true) LOCAL_VENDOR_MODULE := true endif include $(BUILD_SHARED_LIBRARY)
vendor.xxx.calculate@1.0-service.rc
on early-init chmod 666 /sys/class/gpio/export chmod 666 /sys/class/gpio/unexport service calculate/vendor/bin/hw/vendor.xxx.calculate@1.0-service class hal user root group root media system shell media_rw sdcard_rw audio camera drmrpc mediadrm everybody ioprio rt 4 writepid /dev/cpuset/foreground/tasks
<manifest version="1.0" type="device" target-level="5"> <hal format="hidl"> <name>vendor.xxx.calculate</name> <transport>hwbinder</transport> <version>1.0</version> <interface> <name>ICalculate</name> <instance>default</instance> </interface> </hal> </manifest>
service.cpp
#include <hidl/LegacySupport.h> #include <vendor/xxx/calculate/1.0/ICalculate.h> #include <android/log.h> #include <binder/ProcessState.h> //#include "stbService.h" using vendor::xxx::calculate::V1_0::ICalculate; using android::hardware::defaultPassthroughServiceImplementation; int main() { android::ProcessState::initWithDriver("/dev/binder"); android::ProcessState::self()->setThreadPoolMaxThreadCount(4); android::ProcessState::self()->startThreadPool(); return defaultPassthroughServiceImplementation<ICalculate>(4); }
执行mmm 即可编译成功
out\target\product\HY40AX2\vendor\lib\hw下是c++文件生成的so vendor.xxx.calculate@1.0-impl.so
out\target\product\HY40AX2\vendor\bin\hw下是生成的service文件 vendor.xxx.calculate@1.0-service
out\target\product\HY40AX2\product\lib 下是 hal文件生成的 vendor.xxx.calculate@1.0.so