MTK修改动态切换开机logo,恢复出厂设置不还原


前言

android的开机动画,logo一般包含三个部分,uboot或者lk的logo,kernel的logo,开机动画;
前面两个一般是一张图片,开机动画一般是zip文件和mp3文件结合的,或者mp4文件;
这里用的mtk的方案开机动画是zip文件和mp3文件结合的;
首先了解一个概念NVRAM,( Non-Volatile Random Access Memory) 是非易失性随机访问存储器
我们的开机logo选择就是存在这个里面的

一、NVRAM值写在哪里

参考imei号的写法,增加unsigned char logo_index[4],目的是位了不干扰其他数据的存储使用,其实在这里写就是写进了proinfo的分区,我们可以在
alps\vendor\mediatek\proprietary\hardware\fstab\mt8168\fstab.in.mt8168中找到
/dev/block/platform/bootdevice/by-name/proinfo /proinfo emmc defaults defaults
就是有一个proinfo的块分区,下面定义了大小是1024,包含了imei,或者sn等内容

源文件内容
typedef struct
{
    unsigned char imei[8];
    unsigned char svn;
    unsigned char pad;
} nvram_ef_imei_imeisv_struct;

typedef struct{
	unsigned char barcode[64];
	nvram_ef_imei_imeisv_struct IMEI[4];
	unsigned char reserved0[768-40-64];
	unsigned char xocap_flag;
	unsigned char xocap_offset;
	unsigned char logo_index[4];
	unsigned char reserved[1024-768-2-4];
}PRODUCT_INFO;

下面是修改
diff --git a/alps/vendor/mediatek/proprietary/custom/aiot8365p3_64_bsp_1024/cgen/cfgfileinc/CFG_PRODUCT_INFO_File.h b/alps/vendor/mediatek/proprietary/custom/project/cgen/cfgfileinc/CFG_PRODUCT_INFO_File.h
@@ -76,7 +76,8 @@ typedef struct{
        unsigned char reserved0[768-40-64];
        unsigned char xocap_flag;
        unsigned char xocap_offset;
-       unsigned char reserved[1024-768-2];
+       unsigned char logo_index[4];
+       unsigned char reserved[1024-768-2-4];
 }PRODUCT_INFO;

二、各个模块读写NVRAM的修改

1.uboot读取NVRAM

这部分就是块设备读取,由于起来最高,也没有什么权限限制,
我们看两个定义
part_name = “proinfo”; 这个表示读取的是proinfo分区
u64 offset = 770; 这里的770就是上面定义的时候,从770字节开始表示自己储存的NVRAM的值

diff --git a/alps/vendor/mediatek/proprietary/bootable/bootloader/lk/platform/mt8168/include/platform/mt_logo.h b/alps/vendor/mediatek/proprietary/bootable/bootloader/lk/platform/mt8168/include/platform/mt_logo.h
@@ -58,7 +58,7 @@ const LOGO_CUST_IF *LOGO_GetCustomIF(void);
 void mt_disp_enter_charging_state(void);
 void mt_disp_show_battery_full(void);
 void mt_disp_show_battery_capacity(UINT32 capacity);
-void mt_disp_show_boot_logo(void);
+void mt_disp_show_boot_logo(int logo_index);
 void mt_disp_show_low_battery(void);
 
 
diff --git a/alps/vendor/mediatek/proprietary/bootable/bootloader/lk/platform/mt8168/mt_logo.c b/alps/vendor/mediatek/proprietary/bootable/bootloader/lk/platform/mt8168/mt_logo.c
@@ -232,9 +232,10 @@ void mt_logo_get_custom_if(void)
  * Show first boot logo when phone boot up
  *
  */
-void mt_disp_show_boot_logo(void)
+void mt_disp_show_boot_logo(int logo_index)
 {
     dprintf(0, "[lk logo: %s %d]\n",__FUNCTION__,__LINE__);    
+    dprintf(0, "[lk logo_index: %d]\n",logo_index);    
     mt_logo_get_custom_if();
 
     if(logo_cust_if->show_boot_logo)
@@ -245,7 +246,19 @@ void mt_disp_show_boot_logo(void)
     {
         ///show_logo(0);
         init_fb_screen();
-        fill_animation_logo(BOOT_LOGO_INDEX, mt_get_fb_addr(), (void *)mt_get_tempfb_addr(), logo_addr, phical_screen);
+               int bootindex=0;
+        if (0 == logo_index){
+                       bootindex=0;
+               }else if(1 == logo_index){
+                       bootindex=42;
+               }
+               /*
+               char cmdline[20];
+               snprintf(cmdline, 20, "logo_index=%d", logo_index);
+               cmdline_append(cmdline);
+               */
+        fill_animation_logo(bootindex, mt_get_fb_addr(), (void *)mt_get_tempfb_addr(), logo_addr, phical_screen);
+        //fill_animation_logo(BOOT_LOGO_INDEX, mt_get_fb_addr(), (void *)mt_get_tempfb_addr(), logo_addr, phical_screen);
         mt_disp_update(0, 0, CFG_DISPLAY_WIDTH, CFG_DISPLAY_HEIGHT);
     }
 
diff --git a/alps/vendor/mediatek/proprietary/bootable/bootloader/lk/platform/mt8168/platform.c b/alps/vendor/mediatek/proprietary/bootable/bootloader/lk/platform/mt8168/platform.c
@@ -672,8 +672,73
+int get_bootlogo_flag(void) {
+    long len, length;
+    u64 start_address;
+    part_t *part;
+    part_dev_t *dev;
+    char *part_name = "proinfo";
+    dev = mt_part_get_device();
+    if (!dev) {
+        //video_printf(" => !dev is true...\n");
+        return 0;
+    }
+
+    part = mt_part_get_partition(part_name);
+    if (!part) {
+        //video_printf(" => mboot_get_boot_logo_flag--- part = NULL\n");
+        dprintf(0, "mboot_get_boot_logo_flag--- part = NULL");
+        return 0;
+    }
+
+       u64 offset = 770;
+
+    dprintf(0, "mboot_get_boot_logo_flag--- get_partition 1\n");
+    //length = 1024;
+       length = 4;
+
+    start_address = (u64)part->start_sect * dev->blkdev->blksz + offset;
+    //video_printf(" => start_address=%llu\n", start_address);//524288
+           
+    unsigned char *addr;
+    addr = (unsigned char *) malloc(length * sizeof(unsigned char));
+   
+    int index = partition_get_index(part_name);
+       
+       dprintf(0, "mboot_get_boot_logo_flag--- partition_get_index =%d\n", index);
+       
+    if (index == -1) {
+        //video_printf(" => partition_get_index == -1\n");
+        return 0;
+    }
+    unsigned int part_id = partition_get_region(index);
+    len = dev->read(dev, start_address, (uchar *) addr, length, part_id);
+
+       dprintf(0, "mboot_get_boot_logo_flag--- dev->read len=%ld\n", len);
+ 
+    if (len < 0) {
+        //video_printf(" => dev->read len < 0\n");
+      
+        return 0;
+    }
+
+    dprintf(0," => part_dev->read addr=%s\n", addr);//&
+    dprintf(0,"The size of nvdata_result:%d\n", sizeof(addr));//4
+    dprintf(0,"nvramstr dex buff[0]=%d, buff[1]=%d, buff[2]=%d, buff[3]=%d \n",
+    addr[0],addr[1],addr[2],addr[3]);//26
+
+    //int result = addr[0];//boot logo flag
+    int result = (addr[0] & 0xff) | ((addr[1] << 8) & 0xff00) | ((addr[2] << 24) >> 8 & 0xff0000) | (addr[3] << 24);;//boot logo flag
+    dprintf(0,"mboot_get_boot_logo_flag addr = %d\n",result);
+    //video_printf(" => result=%d\n", result);
+
+    return result;
+}
+
+
 void platform_init(void)
-{
+{      
 #ifdef LK_PROFILING
        unsigned int time_nand_emmc;
        unsigned int time_env;
@@ -900,7 +965,7 @@ void platform_init(void)
                        mt_disp_show_boot_logo_by_index(BOOT_LOGO_PANEL_INDEX); // for panel
                        mt_disp_show_boot_logo_ext(); // for ext
                #else
-                       mt_disp_show_boot_logo();
+                       mt_disp_show_boot_logo(get_bootlogo_flag());
                #endif
 
                video_printf(" => Downloading...\n");
@@ -978,7 +1043,7 @@ void platform_init(void)
                                mt_disp_show_boot_logo_by_index(BOOT_LOGO_PANEL_INDEX); // for panel
                                mt_disp_show_boot_logo_ext(); // for ext
                        #else
-                               mt_disp_show_boot_logo();
+                               mt_disp_show_boot_logo(get_bootlogo_flag());
                        #endif
                }
        }
@@ -988,7 +1053,7 @@ void platform_init(void)
                                mt_disp_show_boot_logo_by_index(BOOT_LOGO_PANEL_INDEX); // for panel
                                mt_disp_show_boot_logo_ext(); // for ext
                        #else
-                               mt_disp_show_boot_logo();
+                               mt_disp_show_boot_logo(get_bootlogo_flag());
                        #endif
 
        }

2.在kernel中读取NVRAM

首先要知道第二幕的logo是在哪里开始的
alps\vendor\mediatek\proprietary\external\boot_logo_updater\bootlogoupdater.rc
boot_logo_updater.c调用了libshowlogo库
alps\vendor\mediatek\proprietary\external\libshowlogo\charging_animation.cpp

2.1增加libnvram的编译,修改MK

diff --git a/alps/vendor/mediatek/proprietary/external/libshowlogo/Android.mk b/alps/vendor/mediatek/proprietary/external/libshowlogo/Android.mk
@@ -50,7 +50,8 @@ endif
 
 LOCAL_CFLAGS += -DMTK_LCM_PHYSICAL_ROTATION=\"$(MTK_LCM_PHYSICAL_ROTATION)\"
 
-LOCAL_SHARED_LIBRARIES := libcutils libutils libc libstdc++ libz libdl liblog libgui libui libbase
+#LOCAL_SHARED_LIBRARIES := libcutils libutils libc libstdc++ libz libdl liblog libgui libui libbase
+LOCAL_SHARED_LIBRARIES := libcutils libutils libc libstdc++ libz libdl liblog libgui libui libbase libnvram libcustom_nvram
 
 LOCAL_STATIC_LIBRARIES += libfs_mgr
 
@@ -60,6 +61,7 @@ LOCAL_C_INCLUDES += $(TOP)/external/zlib/
 LOCAL_C_INCLUDES += $(TOP)/frameworks/native/libs/nativewindow/include
 LOCAL_C_INCLUDES += system/core/fs_mgr/include
 LOCAL_C_INCLUDES += $(TOP)/vendor/mediatek/proprietary/external/libsysenv
+LOCAL_C_INCLUDES += $(MTK_PATH_SOURCE)/external/nvram/libnvram 
 
 LOCAL_MODULE := libshowlogo
 #LOCAL_PROPRIETARY_MODULE := true

这里编译的时候会报错,意思就是platform 和vendor编译部分不能链接,增加如下修改

diff --git a/alps/build/make/core/binary.mk b/alps/build/make/core/binary.mk
index 43063a8cc4..e376546078 100644
@@ -1224,7 +1224,7 @@ my_allowed_types := native:recovery native:platform native:platform_vndk $(my_al
 else
 my_link_type := native:platform
 my_warn_types := $(my_warn_ndk_types)
-my_allowed_types := $(my_allowed_ndk_types) native:platform native:platform_vndk
+my_allowed_types := native:vendor $(my_allowed_ndk_types) native:platform native:platform_vndk
 endif
 
 my_link_deps := $(addprefix STATIC_LIBRARIES:,$(my_whole_static_libraries) $(my_static_libraries))

2.2 kernel logo部分怎么读取NVRAM

这里可以参考
alps\vendor\mediatek\proprietary\external\libnvram\nvram_hidl\1.0\Nvram.cpp中的方法
readFileByName,其实就是对libnvram的hidl封装,稍微改一下就是,这个方法是给上层调用的,所以传的的字符串,通过file_lid = NVM_GetLIDByName(cstr);来获取对应的int类型的lid,这里我们直接用AP_CFG_REEB_PRODUCT_INFO_LID就行

diff --git a/alps/vendor/mediatek/proprietary/external/libshowlogo/charging_animation.cpp b/alps/vendor/mediatek/proprietary/external/libshowlogo/charging_animation.cpp
@@ -87,6 +87,19 @@
 
 #include <fs_mgr.h>
 
+//xyw add start
+
+#include "libnvram.h"
+
+#include "../../custom/common/cgen/inc/CFG_file_lid.h"
+
+
+#include "CFG_PRODUCT_INFO_File.h"
+
+#include "Custom_NvRam_LID.h"
+
+//xyw add end
+
 #include "charging_animation.h"
 //#include <sysenv_utils.h>
 
@@ -103,6 +116,7 @@
 #define SLOGE(...) do { KLOG_ERROR("libshowlogo", __VA_ARGS__); } while (0)
 #endif
 
+
 using namespace android;
 using android::fs_mgr::Fstab;
 using android::fs_mgr::GetEntryForMountPoint;
@@ -284,7 +298,6 @@ static int get_default_operator(){
 }
 #endif
 
-
 /*
  * get Logo index when the global device feature is enabled.
  *
@@ -970,6 +983,174 @@ void show_boot_logo(void)
     }
 }
 
+int get_logo_index_cmdline(){
+       int fd;
+       int n;
+       int active_optr = -1;
+       SLOGE("[libshowlogo] get_logo_index_cmdline \n");
+       //struct env_ioctl en_ctl;
+       char *name = NULL;
+       const char *value = NULL;
+
+       //memset(&en_ctl,0x00,sizeof(struct env_ioctl));
+
+       fd= open("/proc/cmdline",O_RDWR);
+
+       if (fd<= 0) {    
+            SLOGE("[libshowlogo] ERROR open fail %d\n",fd);     
+                       SLOGE("[libshowlogo] ERROR read fail errorno: %d\n",errno);
+                       SLOGE("[libshowlogo] ERROR read fail error_msg: %s\n",strerror(errno));                 
+        return -1;
+    }
+    //if (MTK_LOG_ENABLE == 1) {
+           SLOGE("[libshowlogo] open /proc/cmdline ok\n");
+    //}
+       name = (char *)malloc(1024);
+       memset(name,0x00,1024);
+       int res=read(fd,name,1024);
+       if(res<0){
+               SLOGE("[libshowlogo] read /proc/cmdline error\n");
+               return 0;
+       }
+       SLOGE("[libshowlogo] read  %s \n",name);
+       free(name);
+       //free(value);
+       close(fd);
+       SLOGE("[libshowlogo] get_logo_index_cmdline over \n");
+       return active_optr;
+}
+
+//xyw add
+
+#define MAX_RETRY_COUNT 100
+
+int nvram_read_index(){
+    int logo_index = kernel_logo_position;
+    int size = 1024;
+    int read_nvram_ready_retry = 0;
+    
+    int nvinfo_lid = AP_CFG_REEB_PRODUCT_INFO_LID;
+   
+    char nvram_init_val[128] = {0};
+    SLOGD("Entry nvram_read_index");
+		
+    while (read_nvram_ready_retry < MAX_RETRY_COUNT) {
+        read_nvram_ready_retry++;
+        property_get("vendor.service.nvram_init", nvram_init_val, NULL);
+        if (strcmp(nvram_init_val, "Ready") == 0) {
+            break;
+        } else {
+            usleep(500 * 1000);
+        }
+    }
+
+    if (read_nvram_ready_retry >= MAX_RETRY_COUNT) {
+        SLOGD("Get nvram restore ready failed!");
+        return logo_index;
+    }
+       
+       int pRecSize=0,pRecNum=0;
+    bool IsRead=1;
+    char *buff=NULL;
+    int file_lid = -1;
+    int i = 0;
+    char *nvramstr = (char*)malloc(2*size+1);
+    char *nvramptr = nvramstr;
+    char *cstr=new char[1024];
+    if (nvramstr==NULL || size==0 || cstr==NULL) {
+    SLOGD("nvramstr==NULL\n");
+        if(nvramstr!=NULL)
+            free(nvramstr);
+        if(cstr!=NULL)
+            delete[] cstr;
+    return logo_index;
+    }
+
+    //snprintf(cstr, 1024,"%s", filename.c_str());
+
+    //file_lid = NVM_GetLIDByName(cstr);
+    file_lid = nvinfo_lid;
+    if(file_lid < 0)
+    {
+        SLOGD("Get LID by name fail! %s\n",cstr);
+        free(nvramstr);
+        delete[] cstr;
+        return logo_index;
+    }
+
+    F_ID fd=NVM_GetFileDesc(file_lid,&pRecSize,&pRecNum,IsRead);
+    if (fd.iFileDesc==-1)
+    {
+        SLOGD("open file Error!");
+        free(nvramstr);
+        delete[] cstr;
+        return logo_index;
+    }
+    //LOG(ERROR) << "RecNum is "<<pRecNum;
+    //size=pRecSize*pRecNum;
+    buff=(char *)malloc(size);
+    if(buff == NULL)
+    {
+        SLOGD("Malloc Error!\n");
+        if(!NVM_CloseFileDesc(fd))
+            SLOGD("close File error!\n");
+        free(nvramstr);
+        delete[] cstr;
+        return logo_index;
+    }
+    if((ssize_t)size == read(fd.iFileDesc,buff,(ssize_t)size))
+    {
+        if(NVM_CloseFileDesc(fd))
+        {
+            SLOGD("Read Done!Size is %d\n",size);
+            //return buff;
+        }
+        else
+        {
+            SLOGD("Close file error!\n");
+            free(buff);
+            free(nvramstr);
+            delete[] cstr;
+            return logo_index;
+        }
+    }
+    else
+    {
+        SLOGD("read File error!\n");
+        if(!NVM_CloseFileDesc(fd))
+            SLOGD("close File error!\n");
+        free(buff);
+        free(nvramstr);
+        delete[] cstr;
+        return logo_index;
+    }
+
+    //SLOGD("nvramstr buff[0]%x, buff[1]%x, buff[2]%x, buff[3]%x, buff[4]%x, buff[5]%x, buff[6]%x, buff[7]%x, buff[8]%x \n",
+    //    buff[0],buff[1],buff[2],buff[3],buff[4],buff[5],buff[6],buff[7],buff[8]);
+
+       /*
+    for(i=0; i<(int)size; i++)
+    {
+       nvramptr += sprintf(nvramptr, "%02X",buff[i]);
+    }
+    sprintf(nvramptr,"\n");
+    *(nvramptr+1)='\0';
+
+    SLOGD("nvramstr %s\n",nvramstr);
+       */
+       
+       int targets = (buff[770] & 0xff) | ((buff[771] << 8) & 0xff00) | ((buff[772] << 24) >> 8 & 0xff0000) | (buff[773] << 24);
+    
+       SLOGD("nvramstr targets %d\n",targets);
+       
+    free(buff);
+    delete[] cstr;
+    return targets;
+       
+    
+}
 /*
  * Show kernel logo when phone boot up
  *
@@ -980,6 +1161,29 @@ void show_kernel_logo() 
         SLOGD("[libshowlogo: %s %d]show kernel logo, index = 38 \n",__FUNCTION__,__LINE__);
     }
        if (error_flag == 0) {
+               //get_logo_index_cmdline();
+               
+               int logo_index = nvram_read_index();
+               
+               SLOGE("show_kernel_logo logo_index =%d ",logo_index);  
+               /*
+               char * ptr;
+               int logo_index;
+               ptr = strstr(saved_command_line, "logo_index=");
+               ptr += strlen("logo_index=");
+               logo_index = simple_strtol(ptr, NULL, 10);
+               */
+               if(logo_index==0){
+                       kernel_logo_position=38;
+               }
+               else if(logo_index==1){
+                       kernel_logo_position=43;
+               }else{
+                       kernel_logo_position=38;
+               }
+               char* logoBuffer=(char *)malloc(4); 
+               sprintf(logoBuffer, "%d", logo_index);
+               property_set("sys.logoindex", logoBuffer);
                anim_show_logo(kernel_logo_position);
     }
 }

下面是头文件增加方法
diff --git a/alps/vendor/mediatek/proprietary/external/libshowlogo/charging_animation.h b/alps/vendor/mediatek/proprietary/external/libshowlogo/charging_animation.h
@@ -112,6 +112,9 @@ void anim_surface_deinit(void);
 // show logo function
 void anim_show_logo(int index);
 
+int get_logo_index_cmdline();
+
+int  nvram_read_index();
 
 #ifdef __cplusplus
 }

这里有个get_logo_index_cmdline方法,是读取/proc/cmdline的,在uboot中可以
char cmdline[20];
snprintf(cmdline, 20, “logo_index=%d”, logo_index);
cmdline_append(cmdline);
添加logoindex到cmdline中,在kernel中是可以读取到的,但是在这里有个bug,
fd= open(“/proc/cmdline”,O_RDWR);会有权限问题,因为不知道在哪里改这个权限,所以读取cmdline暂时没用,理论上解决这个权限问题,是可以的,可以把O_RDWR这里修改一下,改成只读权限,看能不能通过;
最后同样也是读取了770开始后的4个字节为结果,
int targets = (buff[770] & 0xff) | ((buff[771] << 8) & 0xff00) | ((buff[772] << 24) >> 8 & 0xff0000) | (buff[773] << 24);

2.3 开机动画bootanimation怎么读取

这里为了节省资源,就没有用nvram的方式读取,在boot_logo_updater读取之后存入了一个
property_set(“sys.logoindex”, logoBuffer);,在bootanimation的时候读取值就好,简单快捷,也不用给bootanimation中添加另外的编译,看下面的修改,读取之后直接判断就行

diff --git a/alps/vendor/mediatek/proprietary/operator/frameworks/bootanimation/MtkBootanimation/BootAnimation.cpp b/alps/vendor/mediatek/proprietary/operator/frameworks/bootanimation/MtkBootanimation/BootAnimation.cpp
@@ -125,6 +125,8 @@ static const char* mResourcePath[MNC_COUNT][PATH_COUNT] =
      {"/system/media/shutaudio.mp3", "/custom/media/shutaudio.mp3", "/data/local/shutaudio.mp3"} /*  shutaudio path  */
     };
 #endif
+static const char* myAudioPath[2] =
+    {"/system/media/bootaudio.mp3", "/system/media/1/bootaudio.mp3"};
 
 namespace android {
 
@@ -1088,7 +1090,14 @@ bool BootAnimation::preloadZip(Animation& animation)
 }
 
 bool BootAnimation::movie()
-{
+{      
+       char nvram_logo_index[PROPERTY_VALUE_MAX];
+       property_get("sys.logoindex", nvram_logo_index, NULL);
+       ALOGD("BootAnimation movie sys.logoindex:%s",nvram_logo_index);
+       if(strcmp(nvram_logo_index, "1") == 0){
+               mZipFileName="/system/media/1/bootanimation.zip";
+       }
+       
     Animation* animation = loadAnimation(mZipFileName);
     if (animation == NULL)
         return false;
@@ -1471,6 +1480,14 @@ const char* BootAnimation::initAudioPath() {
     } else {
         index = 1;
     }
+       
+       char nvram_logo_index[PROPERTY_VALUE_MAX];
+       property_get("sys.logoindex", nvram_logo_index, NULL);
+       ALOGD("BootAnimation initAudioPath sys.logoindex:%s",nvram_logo_index);
+       if(strcmp(nvram_logo_index, "1") == 0){
+               return myAudioPath[1];
+       }
+       
 #if defined(MSSI_MSSI_MTK_CARRIEREXPRESS_PACK) && defined(MTK_TER_SERVICE)
     char AudioFileName[PROPERTY_VALUE_MAX];
     char OPTR[PROPERTY_VALUE_MAX];

三、把logo以及开机动画编译进系统

这里就可以知道为什么上面uboot切换的时候bootindex=42;
kernel_logo_position=43;了
参考kernel_logo_position=38;依次往下面加1,最后添加
( B O O T L O G O D I R ) / (BOOT_LOGO_DIR)/ (BOOTLOGODIR)/(BASE_LOGO)/$(BASE_LOGO)_uboot_xunye.raw
的时候是42;
( B O O T L O G O D I R ) / (BOOT_LOGO_DIR)/ (BOOTLOGODIR)/(BASE_LOGO)/$(BASE_LOGO)_kernel_xunye.raw
是43,后续添加依次加就行,为什么在这里加,因为前面都是一些图标,已经定义好的,
如果看串口代码就会知道,总共有多少个logo资源
[show_aimation_common: check_logo_index_valid 83]logonum =44, index =42
搜一搜这句;

diff --git a/alps/vendor/mediatek/proprietary/bootable/bootloader/lk/dev/logo/rules.mk b/alps/vendor/mediatek/proprietary/bootable/bootloader/lk/dev/logo/rules.mk
index 7ab4148619..1da0743a13 100644
--- a/alps/vendor/mediatek/proprietary/bootable/bootloader/lk/dev/logo/rules.mk
+++ b/alps/vendor/mediatek/proprietary/bootable/bootloader/lk/dev/logo/rules.mk
@@ -121,7 +121,9 @@ endif
 RESOURCE_OBJ_LIST +=   \
             $(BOOT_LOGO_DIR)/$(BASE_LOGO)/$(BASE_LOGO)_low_battery01.raw \
             $(BOOT_LOGO_DIR)/$(BASE_LOGO)/$(BASE_LOGO)_low_battery02.raw \
-            $(BOOT_LOGO_DIR)/$(BASE_LOGO)/$(BASE_LOGO)_low_battery_remind.raw
+            $(BOOT_LOGO_DIR)/$(BASE_LOGO)/$(BASE_LOGO)_low_battery_remind.raw \
+            $(BOOT_LOGO_DIR)/$(BASE_LOGO)/$(BASE_LOGO)_uboot_xunye.raw \
+            $(BOOT_LOGO_DIR)/$(BASE_LOGO)/$(BASE_LOGO)_kernel_xunye.raw
 endif
 endif
 
diff --git a/alps/vendor/mediatek/proprietary/bootable/bootloader/lk/dev/logo/update b/alps/vendor/mediatek/proprietary/bootable/bootloader/lk/dev/logo/update
index a8e2623abc..9bdac70978 100644
--- a/alps/vendor/mediatek/proprietary/bootable/bootloader/lk/dev/logo/update
+++ b/alps/vendor/mediatek/proprietary/bootable/bootloader/lk/dev/logo/update
@@ -46,6 +46,8 @@ echo $1
 ./tool/bmp_to_raw ./temp36.raw ./$p/"${p}_bat_img".bmp
 ./tool/bmp_to_raw ./temp37.raw ./$p/"${p}_bat_100".bmp
 ./tool/bmp_to_raw ./boot_logo ./$p/"${p}_kernel".bmp
+./tool/bmp_to_raw ./boot_logo ./$p/"${p}_uboot_xunye".bmp
+./tool/bmp_to_raw ./boot_logo ./$p/"${p}_kernel_xunye".bmp

至于开机动画,和mp3文件,直接复制进去就好

+PRODUCT_COPY_FILES += $(call add-to-product-copy-files-if-exists, vendor/xxx/images/1024_600/1/bootanimation.zip:system/media/1/bootanimation.zip)
+PRODUCT_COPY_FILES += $(call add-to-product-copy-files-if-exists, vendor/xxx/audios/1/bootaudio.mp3:system/media/1/bootaudio.mp3

四、boot_logo_updater运行时缺库的问题

boot_logo_updater运行的时候只会使用system/lib和system/lib64下面的库,先编译一次,然后再out目录下面拷贝下面的库,新建文件,下次编译直接拷贝到system/lib和system/lib64下面

+PRODUCT_COPY_FILES += $(call add-to-product-copy-files-if-exists, vendor/mediatek/bootanimationfile/lib/libcustom_nvram.so:system/lib/libcustom_nvram.so)
+PRODUCT_COPY_FILES += $(call add-to-product-copy-files-if-exists, vendor/mediatek/bootanimationfile/lib/libnvram.so:system/lib/libnvram.so)
+PRODUCT_COPY_FILES += $(call add-to-product-copy-files-if-exists, vendor/mediatek/bootanimationfile/lib/libnvram_daemon_callback.so:system/lib/libnvram_daemon_callback.so)
+PRODUCT_COPY_FILES += $(call add-to-product-copy-files-if-exists, vendor/mediatek/bootanimationfile/lib/libnvram_platform.so:system/lib/libnvram_platform.so)
+PRODUCT_COPY_FILES += $(call add-to-product-copy-files-if-exists, vendor/mediatek/bootanimationfile/lib/libnvram_sec.so:system/lib/libnvram_sec.so)
+PRODUCT_COPY_FILES += $(call add-to-product-copy-files-if-exists, vendor/mediatek/bootanimationfile/lib/libnvramagentclient.so:system/lib/libnvramagentclient.so)
+
+PRODUCT_COPY_FILES += $(call add-to-product-copy-files-if-exists, vendor/mediatek/bootanimationfile/lib64/libcustom_nvram.so:system/lib64/libcustom_nvram.so)
+PRODUCT_COPY_FILES += $(call add-to-product-copy-files-if-exists, vendor/mediatek/bootanimationfile/lib64/libnvram.so:system/lib64/libnvram.so)
+PRODUCT_COPY_FILES += $(call add-to-product-copy-files-if-exists, vendor/mediatek/bootanimationfile/lib64/libnvram_daemon_callback.so:system/lib64/libnvram_daemon_callback.so)
+PRODUCT_COPY_FILES += $(call add-to-product-copy-files-if-exists, vendor/mediatek/bootanimationfile/lib64/libnvram_platform.so:system/lib64/libnvram_platform.so)
+PRODUCT_COPY_FILES += $(call add-to-product-copy-files-if-exists, vendor/mediatek/bootanimationfile/lib64/libnvram_sec.so:system/lib64/libnvram_sec.so)
+PRODUCT_COPY_FILES += $(call add-to-product-copy-files-if-exists, vendor/mediatek/bootanimationfile/lib64/libnvramagentclient.so:system/lib64/libnvramagentclient.so)

五、boot_logo_updater对应的SELINUX权限修改

新建boot_logo_updater.te文件

diff --git a/alps/device/mediatek/mt8168/sepolicy/basic/boot_logo_updater.te b/alps/device/mediatek/mt8168/sepolicy/basic/boot_logo_updater.te
@@ -0,0 +1,12 @@
+
+
+allow boot_logo_updater nvram_device:blk_file { read write ioctl open };
+allow boot_logo_updater pro_info_device:blk_file { read write ioctl open };
+allow boot_logo_updater pro_info_device:chr_file { read write ioctl open };
+allow boot_logo_updater sysfs_boot_mode:file read;
+allow boot_logo_updater system_prop:property_service set;

六、上层app的使用

首先找到jar包
alps\out\target\common\obj\JAVA_LIBRARIES\vendor.mediatek.hardware.nvram-V1.0-java_intermediates\classes.jar
这里就是对 hidl文件的封装
alps\vendor\mediatek\proprietary\external\libnvram\nvram_hidl\1.0
主要方法readFileByName和writeFileByNamevec两个读写方法
具体使用,请看
nvram app层使用

总结

总的来说就是模仿SN以及IMEI号读 proinfo块分区的读写,
中间也可以用cmdline传递到kernel层,开机动画那里直接用属性值传递,最方便

  • 9
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

xuyewen288

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值