rk3368_android9.0添加launcher备份功能

一、问题描述

为了防止system/app/下的launcher在升级时损坏或者丢失,造成用户不能使用,对launcher apk进行备份,在开机检测system/app/launcher是否存在,不存在则进行复制

二、mount指令的制作

2.1、描述

以为我们的launcher是我们自己制作的分区/producta/app/treadmill/路径下,并进行连接到/system/app/treadmill,所以在系统启动cp时需要mount指令让系统可以修改producta下的内容。

2.2、如图所示需要将main.cpp编译成可执行命令

main.cpp内容如下

#include <sys/types.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/stat.h>
#include <string.h>
#include <pthread.h>
#include <fcntl.h>
#include <android/log.h>

#define LOG_TAG "mount_test"
#define LOGD(...) __android_log_print(ANDROID_LOG_DEBUG, LOG_TAG, __VA_ARGS__)

int command(char *cmd,char *result)
{
    FILE *fpRead;
    char buf[4096];

    fpRead = popen(cmd, "r");
    memset(buf,'\0',sizeof(buf));
    while(fgets(buf,4096-1,fpRead)!=NULL)
    {
        strcat(result,buf);
    }
    if(fpRead!=NULL)
        pclose(fpRead);
    LOGD("command() result=%s\n", result);
    return 1;

}
int main(void)
{
	int ret = 0;
    char buf[4096]={0};

	command("mount -o remount,rw /producta",buf);//我们所需要的指令
	
	LOGD("mount system end\n");
	
	return 0;

}

Android.mk内容如下:

# Copyright 2006 The Android Open Source Project
LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)
LOCAL_SRC_FILES:= main.cpp \
LOCAL_SHARED_LIBRARIES := liblog libcutils
LOCAL_MODULE:= apk_recovery
include $(BUILD_EXECUTABLE)

2.3、制作流程

(1)将apk_recovery放入android/system/core路径下

(2)源码目录下执行source build/envsetup.sh

(3)mmm android/system/core/apk_recovery —mm单独编译

(4)android/out/target/product/rk3188/system/bin路径下找到apk_recovery即可

三、备份apk机制

3.1、操作流程

(1)将apk_recovery放入生产目录的system/bin 如:android/out_userdebug/target/product/rk3368_32bit/system/bin下

(2)制作init_apk_recovery.rc,并将其放入android/out_userdebug/target/product/rk3368_32bit、system/etc/init路径下,init_apk_recovery.rc内容如下:

on property:persist.treadmill.apkrecovery=1
	start apk_recovery
	chmod 777 /producta
	copy /system/backup/treadmill.apk /system/app/treadmill/treadmill.apk
	chmod 777 /system/app/treadmill/treadmill.apk
	chown root root /system/app/treadmill/treadmill.apk

on property:sys.boot_completed=1
	chmod 0777 metadata

service apk_recovery /system/bin/apk_recovery
    disabled
    seclabel u:r:ueventd:s0
    oneshot

(3)在system/backup路径下放入我们要备份的apk

(4)修改BootAnimation.cpp,让系统在初始化是cp system/backup路径下的launcher到system/app下即可

3.2、BootAnimation.cpp的修改

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6cI6RI1d-1676019732106)(C:\Users\dai79\AppData\Roaming\Typora\typora-user-images\image-20230210164855483.png)]

如图所示在BootAnimation.cpp中添加检测/system/app/treadmill/中launcher是否存在,添加代码如下:

#define TARGETFILE_DIRECTORY "/system/app/treadmill/treadmill.apk"

ZipFileRO* mZipFile = NULL;

property_set("persist.treadmill.apkrecovery", "0");
if ((mZipFile = ZipFileRO::open(TARGETFILE_DIRECTORY)) == NULL) {
	ALOGD("*** framework[%s: %d] ***: Oops, WRONG apk package: '%s'\n", __FUNCTION__, __LINE__, TARGETFILE_DIRECTORY);
	property_set("persist.treadmill.apkrecovery", "1");
}

3.3、测试功能是否正常

(1)设置/producta路径权限

adb root    
adb remount  
adb shell
mount -o remount,rw /producta
chmod 777 /producta

(2)删除/producta/app/treadmil或者/system/app/treadmill路径下的lanucher apk
(3)reboot重启,看看lanucher是否正常启动,启动成功即可

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值