文章目录
一、问题描述
为了防止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的修改
如图所示在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是否正常启动,启动成功即可