环境搭建

1,安装Ubuntu 16.04 LTS 版本,按照MT6771_Basic_V1.0.pdf 安装Android O 版本所需的基本编译工具。

$ sudo apt-get install openjdk-8-jdk build-essential bc flex g++-multilib libc6-dev lib32ncurses5 lib32ncurses5-dev lib32z1 unzip zip flex bison gperf curl zlib1g zlib1g-dev tofrodos libxml2-utils git libswitch-perl

2,编译Angroid 8.0 通过,并烧录开发板后,开机成功。
使用 make -j8 2>&1 | tee build0824-1.log 进行屏幕输出build log,同时把编译日志保存到 build0824-1.log 文件中。该文件就在工程的根目录下。

关于make命令的解释,大家可以百度一下,网上有详细的说明,我这里简单解释一下参数:

-j8 这里的 8 是指编译时的线程数量,用几个线程去编译这个工程,一般会是CPU核心数的2 倍。可使用lscpu 查看cpu和核数以及每个核支持的线程,例如下面为8核,每核2线程,总共16线程。开多了可能会卡死。
CPU(s): 8 //总核数为8
Thread(s) per core: 2 //每个核能支持两个线程

2是标准错误,&1是标准输出,2>&1意思就是将标准错误输出到标准输出中。如果没有2>&1,只会有标准输出,没有错误;
tee的作用同时输出到控制台和文件

3,先使用git init 创建新的仓库, 方便后续修改追踪。 具体使用请参考网址 https://www.runoob.com/manual/git-guide/
1)git init //创建新的仓库

digipro@P510:~/Mark/alps_6771$ git init Initialized empty Git repository in /home/digipro/Mark/alps_6771/.git/

2)git status // 查看可以提交的内容

digipro@P510:~/Mark/alps_6771$ git status On branch masterInitial commitUntracked files:(use "git add <file>..." to include in what will be committed)Android.bpMakefilebionic/build/device/external/frameworks/hardware/kernel-4.4/prebuilts/sdk/system/tools/vendor/。。。

3)git add * //这一步所花时间较长, 可以分步一个文件夹一个文件夹的提交。或者选择你需要的文件夹。
4)最后就是git commit -m “添加提交备注信息”。

开始移植kernel。

一,拷贝代码至相应的目录:

1,在/kernel-4.4/drivers/input/fingerprint 目录下新建 fp_driver/ 文件夹
拷贝指纹驱动文件到/kernel-4.4/drivers/input/fingerprint /fp_driver目录下。

2,修改/kernel-4.4/drivers/input/fingerprint /的Makefile,有些Makefile 编译有宏控,要确保该宏控打开,或着把宏控去掉,确保驱动能被编译到。

 obj-$(CONFIG_GOODIX_FINGERPRINT) += fp_driver/

3,MTK_FINGERPRINT_SUPPORT 声明定义
将kernel-4.4/drivers/input/fingerprint/Kconfig以及kernel-4.4/drivers/input/Kconfig中的 MTK_FINGERPRINT_SUPPORT 默认置为y。

二,修改DTS 中的管脚配置,选择SPI1口与指纹进行通讯。
1,根据资料查找SPI以及INT 和 REST 管脚定义。 找到平台管脚定义GPIO的pinfunc头文件。此次移植选用SPI1来与指纹进行通讯。
即:kernel-4.4/include/dt-bindings/pinctrl/mt6771-pinfunc.h,只有SPI1标明脚位,暂时先选用161~164的管脚模式1进行编译测试。

         #define PINMUX_GPIO161__FUNC_SPI1_A_MI (MTK_PIN_NO(161) | 1)#define PINMUX_GPIO162__FUNC_SPI1_A_CSB (MTK_PIN_NO(162) | 1)#define PINMUX_GPIO163__FUNC_SPI1_A_MO (MTK_PIN_NO(163) | 1)#define PINMUX_GPIO164__FUNC_SPI1_A_CLK (MTK_PIN_NO(164) | 1)

2,INT脚选择GPIO8. REST 选择GPIO157.

三,修改dts文件添加驱动相关的属性, 不然可能会导致驱动 无法触发probe。 这个问题我就碰到过,打算另起一文来记录一下。
1,修改kernel-4.4/arch/arm64/boot/dts/mediatek/mt6771.dts ,这里面的mediatek,goodix-fp 用于注册驱动的。

     vim kernel-4.4/arch/arm64/boot/dts/mediatek/mt6771.dts //这里面的mediatek,goodix-fp 用于注册驱动的goodix_fp: fingerprint {compatible = "mediatek,goodix-fp";};

其中compatible = “mediatek,goodix-fp”;一定要包含在驱动的of_match_table 里面。

         static const struct of_device_id gf_of_match[] = {{ .compatible = "mediatek,goodix-fp", },{ .compatible = "goodix,goodix-fp",},{},};

2.修改vim kernel-4.4/arch/arm64/boot/dts/mediatek/k71v1_64_bsp_pre.dts 的配置,将指纹需要用到相对应的管脚以及SPI写入配置中。此处有两种方式,一种是MTK 直接使用DCT工具修改dws文件来修改相关配置; 另外一种指在dts文件中修改相关管脚的配置。

1)一种是MTK 直接使用DCT工具修改dws文件来修改相关配置;Dct工具MTK给出的源代码里面一般会包含,MT6771 dct工具在./vendor/mediatek/proprietary/scripts/dct可以下载到windows下打开运行。

找出工程下面相关的dws文件,mtk一般有4个如下:

kernel-4.4/drivers/misc/mediatek/dws/mt6771/k71v1_64_bsp_pre.dws
vendor/mediatek/proprietary/bootable/bootloader/lk/target/k71v1_64_bsp_pre/dct/dct/codegen.dws
vendor/mediatek/proprietary/bootable/bootloader/preloader/custom/k71v1_64_bsp_pre/dct/dct/codegen.dws
vendor/mediatek/proprietary/custom/k71v1_64_bsp_pre/kernel/dct/dct/codegen.dws

把相关管脚配置成如下图的样子:



kernel-4.4/arch/arm64/boot/dts/mediatek/k71v1_64_bsp_pre.dts内添加如下内容:

/* fingerprint  start */
&spi1 {#address-cells = <1>;#size-cells = <0>;fingerprint@0 {compatible = "goodix,goodix-fp";reg = <0>;spi-max-frequency = <8000000>;netlink-event = <29>;status = "okay";};
};&goodix_fp {interrupt-parent = <&pio>;interrupts = <3 IRQ_TYPE_EDGE_RISING 3 0>;pinctrl-names = "default", "reset_high", "reset_low";pinctrl-0 = <&fingerprint_default>;pinctrl-1 = <&fingerprint_reset_high>;pinctrl-2 = <&fingerprint_reset_low>;status = "okay";
};&pio {fingerprint_default: state_default {};fingerprint_reset_high: state_reset_high {pins_cmd_dat {pinmux = <PINMUX_GPIO157__FUNC_GPIO157>;slew-rate = <1>;output-high;};};fingerprint_reset_low: state_reset_low {pins_cmd_dat {pinmux = <PINMUX_GPIO157__FUNC_GPIO157>;slew-rate = <1>;output-low;};};
};
/* fingerprint  end */

2)其它平台可参考如下形式配置dts文件。

&spi1 {fingerprint@1{compatible = "goodix,goodix-fp";  //这个节点属性很重要, 填错了,将无法触发probe函数。 主要用途为寻找驱动使用的GPIO资源。reg = <0>;spi-max-frequency = <8000000>;status = "okay";interrupet-parent = <&pio>;interrupts = <3 IRQ_TYPE_EDGE_RISING 3 0>;};};&pio{fingerprint_pins_default:default{pins_cmd_dat {pins = <PINMUX_GPIO161__FUNC_SPI1_A_MI>;slew-rate = <0>;bias-pull-down;};pins_cmd1_dat {pins = <PINMUX_GPIO162__FUNC_SPI1_A_CSB>;slew-rate = <1>;bias-pull-up;};pins_cmd2_dat {pins = <PINMUX_GPIO163__FUNC_SPI1_A_MO>;slew-rate = <1>;bias-pull-down;};pins_cmd3_dat {pins = <PINMUX_GPIO164__FUNC_SPI1_A_CLK>;slew-rate = <1>;bias-pull-down;};};fingerprint_pins_rst_output1:fp_state_rst_output1{pins_cmd_dat {pins = <PINMUX_GPIO157__FUNC_GPIO157>;slew-rate = <1>;output-high;};};fingerprint_pins_rst_output0:fp_state_rst_output0{pins_cmd_dat {pins = <PINMUX_GPIO157__FUNC_GPIO157>;slew-rate = <1>;output-low;};};fingerprint_pins_irq_high:fp_state_irq_output1{pins_cmd_dat {pins = <PINMUX_GPIO156__FUNC_GPIO156>;slew-rate = <1>;output-high;};};fingerprint_pins_irq_low:fp_state_irq_output0{pins_cmd_dat {pins = <PINMUX_GPIO156__FUNC_GPIO156>;slew-rate = <1>;output-low;};};};&goodix_fp{pinctrl-names="default","reset_high","reset_low","irq_high","irq_low";  //该处的名字一定要与驱动文件里面pinctrl_lookup_state函数引用的名字一至,不然会找不到对应的管脚。有可能造成手机开机开不起来,一值重启。pinctrl-0 = <&fingerprint_pins_default>;pinctrl-1 = <&fingerprint_pins_rst_output1>;pinctrl-2 = <&fingerprint_pins_rst_output0>;pinctrl-3 = <&fingerprint_pins_irq_high>;pinctrl-4 = <&fingerprint_pins_irq_low>;    status = "okay";};/************* goodix fingerprint end *************/

驱动pinctrl_lookup_state函数引用的名字"irq_high" 与dts保持一至。

gf_dev->pins_gfirq_high = pinctrl_lookup_state(gf_dev->pinctrl_gpios, "irq_high");if (IS_ERR(gf_dev->pins_gfirq_high)) {ret = PTR_ERR(gf_dev->pins_gfirq_high);gf_debug(ERR_LOG, "%s can't find fingerprint pinctrl pins_gfirq_high\n", __func__);return ret;}

四,编译代码,建议全边。烧录,使用adb shell 查看驱动是否有goodix_fp节点生成。

上层代码配置

一,修改device.mk文件。
Android O以及以上版本 原生的配置不会编译指纹相关的原生 bin 和库文件,需要在 device.mk 中添加打包的配置,然后整编。
可能有些项目客户会把 device.mk 改成别的名字,该文件在 device/xxx(厂商)/xxx(具体项目型号)目录下,其中PRODUCT_COPY_FILES的内容一定需要添加,不然手机系统设置菜单无法找到(Fingerprint)指纹设置的选项

例如:

./device/mediatek/mt6771/device.mk

找到打包的 mk 文件添加如下配置就 ok。

#Fingerprint sensor
PRODUCT_PACKAGES += \android.hardware.biometrics.fingerprint@2.1-service \android.hardware.biometrics.fingerprint@2.1#this is for  menu  in the systen setting
PRODUCT_COPY_FILES += ./frameworks/native/data/etc/android.hardware.fingerprint.xml:vendor/etc/permissions/android.hardware.fingerprint.xml

二,修改 manifest.xml 文件。
该文件是注册指纹的 hidl,android 系统通过该注册的方式找到相应的 binder 来和 android.hardware.biometrics.fingerprint@2.1-service 进行通信,从而使得finerprintservice 能够通过 binder 调用到android.hardware.biometrics.fingerprint@2.1-service 接口,并进行指纹的相关操作。该文件在 device/xxx(厂商)/xxx(具体项目型号)目录下。例如:

./device/mediatek/mt6771/manifest.xml

具体配置如下:

  <hal format="hidl"><name>android.hardware.biometrics.fingerprint</name><transport>hwbinder</transport><impl level="generic"></impl><version>2.1</version><interface><name>IBiometricsFingerprint</name><instance>default</instance></interface></hal>

三,整编后将指纹hal的so库合入到手机当中,然后使用MTKlog 工具抓取MTK的开机log。查看指纹so库是否有正常加载。 合入方式有两种。
1,第一种合入方式:手动push到手机对应的目录下。简单,但是调试起来比较繁琐。adb push 路径如下:

 adb push libfingerprint.default.so /vendor/lib64/hw/fingerprint.default.soadb push libgf_hal.so /vendor/lib64adb push libgf_ta.so   /vendor/lib64adb push libvendor.goodix.hardware.biometrics.fingerprint@2.1.so  /vendor/lib64

2,第二种方式:使用mk文件拷贝方式合入。相对麻烦,但是后续相对省事,最终也需要这样。

1)在hardware/libhardware/modules/下创建一个文件夹用于存放指纹so库, 我这名字命名为:goodix_so
2)将指纹的so 拷贝至hardware/libhardware/modules/goodix_so下
3)修改hardware/libhardware/modules/Android.mk 包含goodix_so

hardware_modules := \audio_remote_submix \camera \gralloc \hwcomposer \input \radio \sensors \thermal \usbaudio \usbcamera \vehicle \vr \goodix_so

4)在goodix_so文件夹下创建一个Android.mk,写入拷贝命令如下:

#cp goodix fp so to vendor/lib64
LOCAL_PATH := $(call my-dir)
$(shell mkdir -p $(PRODUCT_OUT)/vendor/lib64/)
$(shell mkdir -p $(PRODUCT_OUT)/vendor/lib64/hw/)
$(shell cp -rf $(LOCAL_PATH)/libgf_hal.so $(PRODUCT_OUT)/vendor/lib64/)
$(shell cp -rf $(LOCAL_PATH)/libgf_ta.so $(PRODUCT_OUT)/vendor/lib64/)
$(shell cp -rf $(LOCAL_PATH)/libvendor.goodix.hardware.biometrics.fingerprint@2.1.so $(PRODUCT_OUT)/vendor/lib64/)
$(shell cp -rf $(LOCAL_PATH)/fingerprint.default.so $(PRODUCT_OUT)/vendor/lib64/hw/)

5)整编刷机后,adb shell 查手机的vendor/lib64 和vendor/lib64/hw 正常会有对应的so

开机验证指纹功能

一,开机验证指纹功能,目前还没有添加selinux权限,开启加载指纹so库必定会产生avc权限问题。
1,手动adb shell关闭selinux 进行指纹功能验证。
1)使用adb root \ adb remount \ adb shell setenforce 0 关闭selinux,
2) 然后使用ps -A | grep fingerprint找出指纹的进程。
3)使用kill 命名 kill 掉指纹进程。
5)然后再去验证指纹功能。

2,AndroidO 代码关闭selinux开机自启动, 进行指纹功能验证。

1)找到DALLOW_PERMISSIVE_SELINUX 宏控将其打开,

system/core/init/Android.bp"-DALLOW_PERMISSIVE_SELINUX=1",
system/core/init/Android.mk-DALLOW_PERMISSIVE_SELINUX=1 \

2)将SELINUX_ENFORCING 改为 SELINUX_PERMISSIVE

system/core/init/init.cppreturn selinux_status_from_cmdline() == SELINUX_PERMISSIVE;

3)整编刷机后,使用adb shell getenforce 查询selinux 权限状况。 如下:

k71v1_64_bsp_pre:/ $ getenforce
Permissive

添加权限

一,添加selinux 权限, 首先将selinux 权限关闭后,抓取开机以及指纹录入,指纹解锁的log, 搜索关键字avc:查找指纹相关的权限限制。
1,关于selinux权限添加方式如下:

#avc: denied { write } for name="uinput" dev="tmpfs" ino=1239 scontext=u:r:hal_fingerprint_default:s0 tcontext=u:object_r:uhid_device:s0 tclass=chr_file permissive=1denied { write } for name="uinput" dev="tmpfs" ino=1239  //denie括号里面所需权限的类型,可能是write read open等等;
scontext=u:r:hal_fingerprint_default:s0    //scontext 后面的表示访问者
tcontext=u:object_r:uhid_device:s0         //tcontext 后面的表示 **被** 访问者
tclass=chr_file                        //tclass 后面的表示被访问者类型scontext            tcontext    tclass  denied
allow hal_fingerprint_default  uhid_device:chr_file  write;

2,实际项目抓取log avc:以及添加权限如下:
根据log找出指纹相关的avc: ,并添加对应allow权限, 关于selinux权限添加

#add in debug main.boot.avc
#avc: denied { ptrace } for scontext=u:r:init:s0 tcontext=u:r:hal_fingerprint_default:s0 tclass=process permissive=1
allow init hal_fingerprint_default:process ptrace;#avc: denied { write } for name="uinput" dev="tmpfs" ino=1239 scontext=u:r:hal_fingerprint_default:s0 tcontext=u:object_r:uhid_device:s0 tclass=chr_file permissive=1
#avc: denied { open } for path="/dev/uinput" dev="tmpfs" ino=1239 scontext=u:r:hal_fingerprint_default:s0 tcontext=u:object_r:uhid_device:s0 tclass=chr_file permissive=1
#avc: denied { ioctl } for path="/dev/uinput" dev="tmpfs" ino=1239 ioctlcmd=5564 scontext=u:r:hal_fingerprint_default:s0 tcontext=u:object_r:uhid_device:s0 tclass=chr_file permissive=1
allow hal_fingerprint_default uhid_device:chr_file write;
allow hal_fingerprint_default uhid_device:chr_file open;
allow hal_fingerprint_default uhid_device:chr_file ioctl;#avc: denied { read } for name="gf_otp_info.so" dev="dm-0" ino=56 scontext=u:r:hal_fingerprint_default:s0 tcontext=u:object_r:system_data_file:s0 tclass=file permissive=1
#avc: denied { open } for path="/data/gf_otp_info.so" dev="dm-0" ino=56 scontext=u:r:hal_fingerprint_default:s0 tcontext=u:object_r:system_data_file:s0 tclass=file permissive=1
#avc: denied { getattr } for path="/data/gf_otp_info.so" dev="dm-0" ino=56 scontext=u:r:hal_fingerprint_default:s0 tcontext=u:object_r:system_data_file:s0 tclass=file permissive=1
#avc: denied { write } for name="gf_fdt_base.so" dev="dm-0" ino=57 scontext=u:r:hal_fingerprint_default:s0 tcontext=u:object_r:system_data_file:s0 tclass=file permissive=1
#avc: denied { read } for name="auth_token_0.so" dev="dm-0" ino=17 scontext=u:r:hal_fingerprint_default:s0 tcontext=u:object_r:system_data_file:s0 tclass=file permissive=1
#avc: denied { open } for path="/data/auth_token_0.so" dev="dm-0" ino=17 scontext=u:r:hal_fingerprint_default:s0 tcontext=u:object_r:system_data_file:s0 tclass=file permissive=1
#avc: denied { getattr } for path="/data/auth_token_0.so" dev="dm-0" ino=17 scontext=u:r:hal_fingerprint_default:s0 tcontext=u:object_r:system_data_file:s0 tclass=file permissive=1
#avc: denied { write } for name="finger_0_0_bak.so" dev="dm-0" ino=19 scontext=u:r:hal_fingerprint_default:s0 tcontext=u:object_r:system_data_file:s0 tclass=file permissive=1
#avc: denied { open } for path="/data/finger_0_0_bak.so" dev="dm-0" ino=19 scontext=u:r:hal_fingerprint_default:s0 tcontext=u:object_r:system_data_file:s0 tclass=file permissive=1
#avc: denied { getattr } for path="/data/finger_0_0_bak.so" dev="dm-0" ino=19 scontext=u:r:hal_fingerprint_default:s0 tcontext=u:object_r:system_data_file:s0 tclass=file permissive=1#main.boot.avc
#avc: denied { getattr } for path="/data/gf_data/auth_ratio_database.db" dev="dm-0" ino=2310147 scontext=u:r:hal_fingerprint_default:s0 tcontext=u:object_r:system_data_file:s0 tclass=file permissive=1
#avc: denied { read append } for name="auth_ratio_database.db" dev="dm-0" ino=2310147 scontext=u:r:hal_fingerprint_default:s0 tcontext=u:object_r:system_data_file:s0 tclass=file permissive=1
#avc: denied { open } for path="/data/gf_data/auth_ratio_database.db" dev="dm-0" ino=2310147 scontext=u:r:hal_fingerprint_default:s0 tcontext=u:object_r:system_data_file:s0 tclass=file permissive=1
#avc: denied { write } for name="frr_database.db" dev="dm-0" ino=2310146 scontext=u:r:hal_fingerprint_default:s0 tcontext=u:object_r:system_data_file:s0 tclass=file permissive=1
#avc: denied { read write } for name="frr_database.db" dev="dm-0" ino=2310146 scontext=u:r:hal_fingerprint_default:s0 tcontext=u:object_r:system_data_file:s0 tclass=file permissive=1
#avc: denied { open } for path="/data/gf_data/frr_database.db" dev="dm-0" ino=2310146 scontext=u:r:hal_fingerprint_default:s0 tcontext=u:object_r:system_data_file:s0 tclass=file permissive=1
#avc: denied { getattr } for path="/data/gf_data/frr_database.db" dev="dm-0" ino=2310146 scontext=u:r:hal_fingerprint_default:s0 tcontext=u:object_r:system_data_file:s0 tclass=file permissive=1allow hal_fingerprint_default system_data_file:file read;
allow hal_fingerprint_default system_data_file:file open;
allow hal_fingerprint_default system_data_file:file getattr;
allow hal_fingerprint_default system_data_file:file { write create }allow hal_fingerprint_default system_data_file:dir add_name;
allow hal_fingerprint_default system_data_file:dir write;
allow hal_fingerprint_default system_data_file:dir getattr;
allow hal_fingerprint_default system_data_file:dir read;
allow hal_fingerprint_default system_data_file:dir open;
allow hal_fingerprint_default system_data_file:dir create;
allow hal_fingerprint_default system_data_file:dir remove_name;

3,添加完权限之后常见问题是会触发编译时出现neverallow 报错编译不过,neverallow 主要是因为权限给的太大了,违反系统安全,被禁止。需要通过指定进程以及指定路径来减少该权限。

例如:

libsepol.report_failure: neverallow on line 856 of system/sepolicy/public/domain.te (or line 8784 of policy.conf) violated by allow hal_fingerprint_default system_data_file:file { write create };
libsepol.check_assertions: 1 neverallow failures occurred
Error while expanding policy

如下上allow hal_fingerprint_default system_data_file:file { write create };就是给予了hal_fingerprint_default对system_data_file:file类的创建以及写的权限。hal_fingerprint_default是vendor第三方的,不能直接创建以及写系统文件。需要限制指定进程以及文件路径来创建以及写。

因此需要添加file.te file_contexts文件来说明,
file.te 文件内容如下

#############################
# For  fingerprint   save  files  in data
# 定义fingerprint_data_file 属于file_type, data_file_type;
type  fingerprint_data_file , file_type, data_file_type;

file_contexts 文件内容如下:

#############################
# Data files
#
/dev/goodix_fp     u:object_r:fingerprint_device:s0#该句主要是规定/data/vender/goodix 目录下为fingerprint_data_file文件
/data/vender/goodix(/.*)?  u:object_r:fingerprint_data_file:s0

hal_fingerprint_default.te 文件添加hal_fingerprint_default 进程对fingerprint_data_file:file { create write }的权限

# data file
#将system_data_file, fingerprint_data_file转换,并给到hal_fingerprint_default 进程访问
file_type_auto_trans(hal_fingerprint_default, system_data_file, fingerprint_data_file)#allow  hal_fingerprint_default  create &write  fingerprint_data_file:file
allow hal_fingerprint_default fingerprint_data_file:file { create write };

4,最后去除log的te文件如下:

hal_fingerprint_default.te内容如下:

type fingerprint_device, dev_type;
type goodix_fingerprint_service, service_manager_type;binder_call(system_app, hal_fingerprint_default);
binder_call(hal_fingerprint_default, system_app);allow hal_fingerprint_default fingerprint_device:chr_file rw_file_perms;
allow hal_fingerprint_default self:netlink_socket create_socket_perms_no_ioctl;
allow hal_fingerprint_default self:unix_stream_socket { connectto };
allow hal_fingerprint_default mobicore_user_device:chr_file rw_file_perms;
allow hal_fingerprint_default mobicore_user_device:unix_stream_socket { connectto };
allow hal_fingerprint_default mobicore:unix_stream_socket { connectto };
allow hal_fingerprint_default tmpfs:chr_file rw_file_perms;
allow factory fingerprint_device:chr_file rw_file_perms;
allow factory tmpfs:chr_file rw_file_perms;
allow factory self:netlink_socket create_socket_perms_no_ioctl;#for debug
allow hal_fingerprint_default debugfs_trace_marker:file rw_file_perms;# allow TEE
allow hal_fingerprint_default tee_device:chr_file rw_file_perms;allow init hal_fingerprint_default:process ptrace;
allow hal_fingerprint_default uhid_device:chr_file {write open ioctl};
allow hal_fingerprint_default system_data_file:file {read open getattr};# data file
file_type_auto_trans(hal_fingerprint_default, system_data_file, fingerprint_data_file)
allow hal_fingerprint_default fingerprint_data_file:file { create write };
allow hal_fingerprint_default system_data_file:dir {getattr add_name write read open create remove_name};

file.te 文件内容如下:

#############################
# For  fingerprint   save  files  in data
#
type  fingerprint_data_file , file_type, data_file_type;

file_contexts 文件内容如下:

#############################
# Data files
#
/dev/goodix_fp     u:object_r:fingerprint_device:s0
/data/vender/goodix(/.*)?  u:object_r:fingerprint_data_file:s0

完结

MTK6771 Android8.0 REE 指纹代码移植相关推荐

  1. Android 8.0 学习(17)---Android8.0中对指纹的新要求

    Android8.0中对指纹的新要求 784 我们先来看一张指纹在Android6.0版本上的架构层次图: 指纹应用层,也就是手机上的指纹设置,这是Android系统层定义的指纹管理入口. 1,sys ...

  2. Android8.0、9.0、10.0、11.0的新特性兼容适配代码修改

    <Android Studio开发实战 从零基础到App上线(第2版)>在书后面的附录中给出了Android8和Android9的主要特性说明,附录表格如下图所示: 不过附录表格只涵盖了常 ...

  3. android8.0以上新增Camera(七)

      比如有人想新增一个虚拟摄像头,当用户app打开摄像头设备时,打开的不是系统默认的camera hal代码,而是自己指定的代码,用自己事先准备好的视频数据,来喂给app:也有人想在系统默认的一套ap ...

  4. android8显示广播,关于android8.0静态接收广播

    android8.0很多广播不能静态注册接受 查看log显示 Background execution not allowed: receiving 查看代码frameworks/base/servi ...

  5. Android8.0运行时权限策略变化和适配方案

    版权声明:转载必须注明本文转自严振杰的博客:http://blog.yanzhenjie.com Android8.0也就是Android O即将要发布了,有很多新特性,目前我们可以通过Android ...

  6. Android8.0恢复出厂设置失败-BroadcastQueue: Background execution not allowed

    Android7.0恢复出厂设置调用下面的代码可正常恢复出厂 Intent intent = new Intent(Intent. ACTION_MASTER_CLEAR);intent.addFla ...

  7. Socket 编程 windows到Linux代码移植遇到的问题

    Socket 编程 windows到Linux代码移植遇到的问题 1.一些常用函数的移植 http://www.vckbase.com/document/viewdoc/?id=1586 2.网络 - ...

  8. Android之解决Android8.0手机(Notification)收不到自定义消息通知以及其它手机得到数据不同步

    1 问题 app,自定义消息通知的时候,在Android8.0手机上收不到通知 2 解决办法 NotificationManager需要创建NotificationChannel,然后调用create ...

  9. 基于MPI的H.264并行编码代码移植与优化

    2010 03 25 基于MPI的H.264并行编码代码移植与优化 范 文 洛阳理工学院计算机信息工程系 洛阳 471023 摘 要 H.264获得出色压缩效果和质量的代价是压缩编码算法复杂度的增加. ...

最新文章

  1. 【Qt】QAudioDeviceInfo获取不到音频设备
  2. rails 添加外键_如何在Rails后端中添加功能强大的搜索引擎
  3. 【基本常识1】图像处理opencv
  4. ExtJS入门教程03,form中怎能没有validation
  5. linux使用wget下载https开头url的文件
  6. php子域枚举,PHP中实现多值枚举
  7. opencv 将图片合成为视频流(AVI格式)
  8. 2.select_基础运用
  9. 类的初始化列表_探索未知种族之osg类生物---渲染遍历之draw函数二
  10. AtCoder - 3954 Painting Machines
  11. jwt和传统session的区别?
  12. 判断网络问题不只ping还有tracert,以及tracert原理
  13. fileZilla服务器登录密码展示
  14. JAVA计算机毕业设计无人智慧药柜系统设计(附源码、数据库)
  15. 起风了数字简谱用计算机,起风了钢琴简谱-数字双手-买辣椒也用券
  16. 面试问到UDP,这样回答offer拿到手软
  17. 精选黑科技资源站点,总会有你需要的干货!
  18. 关于技嘉雷电扩展卡SSDT驱动教程
  19. linux 重建ext4分区表,Linux 格式化U盘为ext4格式以及修复分区表方法
  20. 3a2b递归排列java,写点关于递归的话题(一)

热门文章

  1. NC65二开单据单据追溯功能开发
  2. Unity 武器的刀光剑影效果
  3. 身边35岁程序员如何建立起技术护城河?
  4. SideBySide (SxS) 错误
  5. 66个包过面试锦囊,拿走不谢!
  6. 【c++百日刷题计划】 ———— DAY6,带你轻松学习算法
  7. c语言中的括号什么意思,C变量声明中的括号是什么意思?
  8. 顺通报修管理系统维修中心管理软件
  9. t480s控制面板打开触摸板_Thinkpad T480 T480S CPU温度主板温度过高的问题解决技巧...
  10. 七云mc服务器下载地址_我的世界1.7.2神域都城服务器-我的世界1.7.2神域都城服务器客户端下载完整版-《百度网盘下载》西西软件下载...