平臺
Amlogic s905 + Android 7.1
需求
使用視頻作爲開機動畫, 提供接口用於修改開機視頻動畫.
解決方案
- 打開視頻開機動畫功能:
//設置屬性:
service.bootvideo=1
- 服務註冊:
|-- device/amlogic/common/products/tv/init.amlogic.rc
service bootvideo /system/bin/bootplayer /system/etc/bootvideo
class main
user root
group system
disabled
oneshot
- 視頻開機動畫實現的程序:
修改方法相對簡單, 即是在視頻播放前, 讀取/data/bootvideo, 若不存在此文件, 則播放默認/system/etc/bootvideo
|-- vendor/amlogic/frameworks/av/LibPlayer/bootplayer/bootplayer.c
int main(int argc, char *argv[])
{
play_control_t *pCtrl = NULL;
int pid;
int pos = 0;
int speed = 0;
int tmpneedexit = 0;
int ret = -1;
int fd_di_bypass_all = -1;
media_info_t minfo;
int osd_is_blank = 0;
char tmpcommand[TMP_COMMAND_MAX];
char newframestring[30] = {0};
char newstring0[30] = {0};
int new_frame_count = 0;
EMU_STEP tmpstep = EMU_STEP_MENU;
osd1_clear = 0;
char *di_bypass_all_path = "/sys/module/di/parameters/bypass_all";
pCtrl = (play_control_t*)malloc(sizeof(play_control_t));
memset(pCtrl, 0, sizeof(play_control_t));
memset(&minfo, 0, sizeof(media_info_t));
if (argc < 2) {
ALOGD("usage:player file\n");
return -1;
}
//amsysfs_set_sysfs_str(di_bypass_all_path, "1");
set_video_axis();
player_init();
//streamsource_init();
player_register_update_callback(&pCtrl->callback_fn, &update_player_info, 1000);
ALOGD("player callback register....\n");
//嘗試讀取/data/bootvideo, 若不存在則使用默認傳進視頻文件地址.
char* videoPath = "/data/bootvideo";
FILE* fp = fopen(videoPath, "r");
if(fp){
pCtrl->file_name = strdup(videoPath);
}else{
pCtrl->file_name = strdup(argv[1]);
}
ALOGD("player pCtrl->file_name=%s", pCtrl->file_name);
//...
}
- 解決SELinux問題, 打開bootplayer的文件讀取權限.
|-- system/sepolicy/domain.te
neverallow {
domain
-system_server
-system_app
-init
-shell
-bootanim
-bootanimcp
-bootvideo
-installd # for relabelfrom and unlink, check for this in explicit neverallow
} system_data_file:file no_w_file_perms;
|-- device/amlogic/common/sepolicy/bootvideo.te
# 增加代碼
allow bootvideo system_data_file:file{read getattr open write};
結語
使用時, 只需要通過服務或應用, 把視頻文件放置到/data/bootvideo中即可. 若爲普通APP權限, 則系統可適當增加一個文件拷貝服務, 將指定文件拷貝到/data下, 並賦與相關權限即可.