日前工作中遇到一个需求:要求在启动App时,启动对应的bin 服务,从而使得实现APK作为Client端,而bin 服务作为 Server端 实现两者socket通信。
首先bin 服务文件是由同事A君负责用C语言编写实现,完成后编译到Android手机的system/bin 目录下,名称为:cloudtestsuited ;
至于APK则是由本人负责编写实现,利用socket实现两者的通信。
为了实现打开apk即打开了对应的bin服务,故需要实现在apk中启动bin服务需求。
在本案中是利用通过init.rc启动系统服务来运行对应的bin服务文件;
1.Android启动文件系统后调用的会调用第一个应用程序是/init,此文件一个很重要的内容就是解析了init.rc和init.xxx.rc,然后执行解析出来的任务。而init.rc,可以在系统的初始化过程中进行一些简单的初始化操作。利用这一点,可以编写简单的关机或重启的sh脚本文件,通过系统init解析,执行相应的操作。
以mtk 6795平台工程为例(后文都是此平台),在device/amt/amt6795_evb_m/init.project.rc 文件中添加如下代码:
on post-fs-data //在此节点下添加如下代码
chmod 0777 /system/bin/cloudtestsuited
on init // 在此节点下添加如下代码
service cloudtestsuited /system/bin/cloudtestsuited
class main
oneshot
disabled
oneshot选项表示该服务只启动一次,而如果没有oneshot选项,这个可执行程序会一直存在--如果可执行程序被杀死,则会重新启动。
disabled 表示禁用服务,此服务开机时不会自动启动,但是可以在应用程序中手动启动它。
参考代码文件:
# MTK project .rc configure
import init.mt6795.usb.rc
on init
mkdir /mnt/media_rw/usbotg 0700 media_rw media_rw
mkdir /storage/usbotg 0700 root root
on post-fs-data
#
# Connectivity related device nodes & configuration (begin)
#
#/dev/ttyMT2 for Connectivity BT/FM/GPS usage
chmod 0660 /dev/ttyMT2
chown system system /dev/ttyMT2
# STP, WMT, GPS, FM and BT Driver
# insmod /system/lib/modules/mtk_hif_sdio.ko
# insmod /system/lib/modules/mtk_stp_wmt.ko
# insmod /system/lib/modules/mtk_stp_uart.ko
# insmod /system/lib/modules/mtk_stp_gps.ko
# insmod /system/lib/modules/mtk_stp_bt.ko
# insmod /system/lib/modules/mtk_fm_drv.ko
# insmod /system/lib/modules/mtk_wmt_wifi.ko
#SMB
chown system system /proc/smb/ScreenComm
chmod 0660 /proc/smb/ScreenComm
# Create char device file for WMT, GPS, BT, FM, WIFI
# mknod /dev/stpwmt c 190 0;
# mknod /dev/stpgps c 191 0;
# mknod /dev/stpbt c 192 0;
# chmod 0660 /dev/stpwmt
# chown system system /dev/stpwmt
# chmod 0660 /dev/wmtdetect
# chown system system /dev/wmtdetect
mknod /dev/wmtWifi c 153 0
chmod 0660 /dev/wmtWifi
chown system system /dev/wmtWifi
#Camera
chmod 0660 /dev/MAINAF
chown system camera /dev/MAINAF
chmod 0660 /dev/MAINAF2
chown system camera /dev/MAINAF2
chmod 0660 /dev/SUBAF
chown system camera /dev/SUBAF
chmod 0660 /dev/GAF001AF
chown system camera /dev/GAF001AF
chmod 0660 /dev/DW9714AF
chown system camera /dev/DW9714AF
chmod 0660 /dev/AD5820AF
chown system camera /dev/AD5820AF
chmod 0660 /dev/BU64745GWZAF
chown system camera /dev/BU64745GWZAF
chmod 0660 /dev/LC898212AF
chown system camera /dev/LC898212AF
chmod 0660 /dev/LC898122AF
chown system camera /dev/LC898122AF
# BT
# chmod 0660 /dev/stpbt
# chown bluetooth radio /dev/stpbt
# Add by Janning begin
chmod 0777 /system/bin/cloudtestsuited
# Add by Janning end
# GPS
# chown gps gps /dev/stpgps
chown gps gps /sys/class/gpsdrv/gps/pwrctl
chown gps gps /sys/class/gpsdrv/gps/suspend
chown gps gps /sys/class/gpsdrv/gps/state
chown gps gps /sys/class/gpsdrv/gps/pwrsave
chown gps gps /sys/class/gpsdrv/gps/status
# chmod 0660 /dev/stpgps
# WiFi
mkdir /data/misc/wifi 0770 wifi wifi
mkdir /data/misc/wifi/sockets 0770 wifi wifi
mkdir /data/misc/wpa_supplicant 0770 wifi wifi
chown wifi wifi /data/misc/wifi
# ANT
chmod 0660 /dev/stpant
chown ant radio /dev/stpant
#Disable for one Single loader
# Load WiFi Driver
# insmod /system/lib/modules/wlan_mt.ko
# Char device for BT 3.0 HS
mknod /dev/ampc0 c 151 0
chown bluetooth bluetooth /dev/ampc0
chmod 0660 /dev/ampc0
#
# Connectivity related device nodes & configuration (end)
#
on init
# Refer to http://source.android.com/devices/tech/storage/index.html
# It said, "Starting in Android 4.4, multiple external storage devices are surfaced to developers through
# Context.getExternalFilesDirs(), Context.getExternalCacheDirs(), and Context.getObbDirs().
# External storage devices surfaced through these APIs must be a semi-permanent part of the device (such as an SD card slot in a battery compartment).
# Developers expect data stored in these locations to be available over long periods of time."
# Therefore, if the target doesn't support sd hot-plugging (Ex: the SD card slot in a battery compartment), we need to export SECONDARY_STORAGE in 'boot' section
#
# export SECONDARY_STORAGE /storage/sdcard1
service fuse_usbotg /system/bin/sdcard -u 1023 -g 1023 -w 1023 -d /mnt/media_rw/usbotg /storage/usbotg
class late_start
disabled
#
# Connectivity related services (Begin)
#
service wmt_loader /system/bin/wmt_loader
class core
user root
group root
oneshot
service 66xx_launcher /system/bin/6620_launcher -m 4 -p /system/etc/firmware/
user system
group system
class core
on property:service.wcn.coredump.mode=2
start stp_dump
service stp_dump /system/bin/stp_dump3
user root
group root
class core
disabled
oneshot
# Add by Janning begin
service cloudtestsuited /system/bin/cloudtestsuited
class main
disabled
# Add by Janning end
#
# Connectivity related services (End)
#
2.添加对应的selinux权限
在device\mediatek\common\sepolicy\file_contexts 文件中添加bin服务对应的权限:
# Add by silead begin
/system/bin/cloudtestsuited u:object_r:fpsvcd_exec:s0 //此行
# Add by silead end
在
device\mediatek\common\sepolicy\
system_app.te 文件中添加bin服务对应的权限:
# Add by silead 2016/03/18 begin
# add for fp.apk create file under '/data/silead/' file path
allow system_app fpsvcd_data_file:dir { create write add_name remove_name read open search};
allow system_app fpsvcd_data_file:file { unlink getattr create write open read };
# add for starting cloudtestsuited in apk
allow system_app fpsvcd_tmpfs:file { read write open getattr };
allow system_app fpsvcd_exec:file { getattr read execute open execute_no_trans };
allow system_app fpsvcd:dir { read open };
allow system_app tmpfs:dir { read write getattr };
# Add by silead 2016/03/18 end
在
device\mediatek\common\sepolicy\ 目录下新增一个权限
文件fpsvcd.te:
type fpsvcd_exec , exec_type, file_type;
type fpsvcd ,domain;
init_daemon_domain(fpsvcd)
allow fpsvcd fpsvcd:capability { sys_nice dac_override net_admin};
allow fpsvcd fpsvcd:capability2 { block_suspend };
allow fpsvcd init_tmpfs:file {getattr read open};
allow fpsvcd tmpfs:dir { write add_name };
allow fpsvcd fpsvcd_tmpfs:file { write create read open};
allow fpsvcd silead_fp_dev_device:chr_file { read write ioctl open };
allow fpsvcd uhid_device:chr_file { write open ioctl};
allow fpsvcd fpsvcd:netlink_kobject_uevent_socket {create read write setopt bind };
allow fpsvcd sysfs_wake_lock:file {write read open};
allow fpsvcd system_app:dir { read open };
#allow fpsvcd system_data_file:dir { create write add_name read open };
#allow fpsvcd system_data_file:file { create write open read };
allow fpsvcd fpsvcd_data_file:dir { create write add_name remove_name read open search};
allow fpsvcd fpsvcd_data_file:file {unlink getattr create write open read };
#allow fpsvcd silead_data_file:dir { search create write add_name read open };
#allow fpsvcd silead_data_file:file { create write open read getattr };
allow fpsvcd platform_app_tmpfs:file { open read write };
allow fpsvcd fingerprintd:dir { open read };
allow fpsvcd fuse:dir { search open add_name remove_name read write create};
allow fpsvcd fuse:file { unlink open read write create getattr setattr rename};
allow fpsvcd property_socket:sock_file { write };
allow fpsvcd init:unix_stream_socket { connectto };
allow fpsvcd system_prop:property_service { set };
具体参考代码:
#
#############################
# Custom files
/custom(/.*)? u:object_r:custom_file:s0
/dev/block/mtd(.*)? u:object_r:mtd_device:s0
#############################
# Executables
# Meta/Factory Mode multi_init
/sbin/multi_init u:object_r:init_exec:s0
#############################
# Data files
#
/data/aee_exp(/.*)? u:object_r:aee_exp_data_file:s0
/data/agps_supl(/.*)? u:object_r:agpsd_data_file:s0
/data/misc/gps(/.*)? u:object_r:gps_data_file:s0
/data/anr/SF_RTT(/.*)? u:object_r:sf_rtt_file:s0
/data/app/mcRegistry(/.*)? u:object_r:mobicore_data_file:s0
/data/ccci_cfg(/.*)? u:object_r:ccci_cfg_file:s0
/data/flashless(/.*)? u:object_r:c2k_file:s0
/data/core(/.*)? u:object_r:aee_core_data_file:s0
/data/dontpanic(/.*)? u:object_r:dontpanic_data_file:s0
/data/dumpsys(/.*)? u:object_r:aee_dumpsys_data_file:s0
/data/extmdl(/.*)? u:object_r:mdlog_data_file:s0
/data/http-proxy-cfg(/.*)? u:object_r:http_proxy_cfg_data_file:s0
/data/log_temp(/.*)? u:object_r:logtemp_data_file:s0
/data/lost\+found(/.*)? u:object_r:lost_found_data_file:s0
/data/mdlog(/.*)? u:object_r:mdlog_data_file:s0
/data/mdl(/.*)? u:object_r:mdlog_data_file:s0
/data/mdl3(/.*)? u:object_r:mdlog_data_file:s0
/data/mediaserver(/.*)? u:object_r:mediaserver_data_file:s0
/data/misc/acdapi(/.*)? u:object_r:acdapi_data_file:s0
/data/misc/akmd_set.txt u:object_r:akmd8963_access_file1:s0
/data/misc/mblog(/.*)? u:object_r:logmisc_data_file:s0
/data/misc/xlog(/.*)? u:object_r:xlog_data_file:s0
/data/misc/PDC.ini u:object_r:akmd8963_access_file2:s0
/data/misc/ppp(/.*)? u:object_r:ppp_data_file:s0
/data/.tp(/.*)? u:object_r:thermal_manager_data_file:s0
/data/misc/radvd(/.*)? u:object_r:radvd_data_file:s0
/data/misc/sensor.log u:object_r:bmm050_sensor_log_file:s0
/data/misc/sensor(/.*)? u:object_r:sensor_data_file:s0
/data/misc/stp_dump(/.*)? u:object_r:stp_dump_data_file:s0
/data/misc/wide-dhcpv6(/.*)? u:object_r:wide_dhcpv6_data_file:s0
/data/misc/wpa_supplicant(/.*)? u:object_r:wpa_supplicant_data_file:s0
/data/nfc_socket(/.*)? u:object_r:nfc_socket:s0
/data/nvram(/.*)? u:object_r:nvram_data_file:s0
/data/cct(/.*)? u:object_r:cct_data_file:s0
/data/md3(/.*)? u:object_r:c2k_file:s0
/nvdata(/.*)? u:object_r:nvdata_file:s0
/data/SF_dump(./*)? u:object_r:sf_bqdump_data_file:s0
/data/ipsec(./*)? u:object_r:wod_ipsec_conf_file:s0
/data