京东网站建设策略,微信上打开连接的网站怎么做,公司网络组建设计,畜牧养殖企业网站源码前言
高版本的android设备#xff0c;在remount之后#xff0c;如果再进行ota升级#xff0c;会产生异常#xff0c;从而无法升级成功。
如何判断设备是否remount
当前已android 10 平台为例 当我们执行 adb remount 时#xff0c;系统调用会调用到system/core/adb/dae…前言
高版本的android设备在remount之后如果再进行ota升级会产生异常从而无法升级成功。
如何判断设备是否remount
当前已android 10 平台为例 当我们执行 adb remount 时系统调用会调用到system/core/adb/daemon/remount_service.cpp
/** Copyright (C) 2008 The Android Open Source Project** Licensed under the Apache License, Version 2.0 (the License);* you may not use this file except in compliance with the License.* You may obtain a copy of the License at** http://www.apache.org/licenses/LICENSE-2.0** Unless required by applicable law or agreed to in writing, software* distributed under the License is distributed on an AS IS BASIS,* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.* See the License for the specific language governing permissions and* limitations under the License.*/#include errno.h
#include fcntl.h
#include string.h
#include sys/types.h
#include sys/wait.h
#include unistd.h
#include string#include adb.h
#include adb_io.h
#include adb_unique_fd.hstatic constexpr char kRemountCmd[] /system/bin/remount;static bool do_remount(int fd, const std::string cmd) {if (getuid() ! 0) {WriteFdExactly(fd, Not running as root. Try \adb root\ first.\n);return false;}auto pid fork();if (pid 0) {WriteFdFmt(fd, Failed to fork to %s: %s\n, kRemountCmd, strerror(errno));return false;}if (pid 0) {// child side of the forkdup2(fd, STDIN_FILENO);dup2(fd, STDOUT_FILENO);dup2(fd, STDERR_FILENO);execl(kRemountCmd, kRemountCmd, cmd.empty() ? nullptr : cmd.c_str(), nullptr);_exit(errno);}int wstatus 0;auto ret waitpid(pid, wstatus, 0);if (ret -1) {WriteFdFmt(fd, Failed to wait for %s: %s\n, kRemountCmd, strerror(errno));return false;} else if (ret ! pid) {WriteFdFmt(fd, pid %d and waitpid return %d do not match for %s\n,static_castint(pid), static_castint(ret), kRemountCmd);return false;}if (WIFSIGNALED(wstatus)) {WriteFdFmt(fd, %s terminated with signal %s\n, kRemountCmd,strsignal(WTERMSIG(wstatus)));return false;}if (!WIFEXITED(wstatus)) {WriteFdFmt(fd, %s stopped with status 0x%x\n, kRemountCmd, wstatus);return false;}if (WEXITSTATUS(wstatus)) {WriteFdFmt(fd, %s exited with status %d\n, kRemountCmd, WEXITSTATUS(wstatus));return false;}return true;
}void remount_service(unique_fd fd, const std::string cmd) {const char* success do_remount(fd.get(), cmd) ? succeeded : failed;WriteFdFmt(fd.get(), remount %s\n, success);
}
当前的思路时再执行do_remount 函数时添加一个persist变量来判断记录已经remount了并记录remount次数。 具体修改如下
#include unistd.h
//add
#include android-base/properties.h
//add
#include string
......static bool do_remount(int fd, const std::string cmd) {......//add std::string prop android::base::GetProperty(persist.sys.remount.count, 0);int count std::stoi(prop) 1;android::base::SetProperty(persist.sys.remount.count, std::to_string(count));// addreturn true;
}获取状态remount状态
java
import android.os.SystemProperties;public static final String PROP_REMOUNT_COUNT persist.sys.remount.count;/*** NULL* return device remount status*/public static boolean isRemounted(){return getRemountCount() 0;}/*** NULL* return get remount count Since first power up*/public static int getRemountCount(){return SystemProperties.getInt(PROP_ROOT_COUNT,0);}