背景
在recovery模式下,为了限制低内存设备的升级,添加读取RAM配置,达到不让安装OTA包的目的,个人记录一下.
方案
思路就是在OTA Install时,通过cat meminfo条件,决定是否可以安装
recovery下挂载了一个自己的分区,可以理解为类似于SD卡,便于存放OTA包。
包装了下读取memery的函数
#define MEM_1GB (1*1024*1024)
#define MEM_2GB (2*1024*1024)
#define MEM_3GB (3*1024*1024)
#define MEM_4GB (4*1024*1024)
int mRamKB;
static int readRamSize(void) {
FILE *memInfo = fopen("/proc/meminfo", "r");
int ram = -1;
if (memInfo == NULL) {
return -1;
}
char line[256];
while (fgets(line, sizeof(line), memInfo)) {
int memTotal = -1;
char* end = NULL;
char* token = strtok_r(line, ":", &end);
if ((end != NULL) && (token != NULL) && (strncmp(token, "MemTotal", 8) == 0)) {
token = strtok_r(NULL, " ", &end);
if ((end != NULL) && (token != NULL)) {
memTotal = strtol(token, &end, 10);
mRamKB = memTotal;
if (memTotal < MEM_1GB) {
ram = 1;
} else if (memTotal < MEM_2GB) {
ram = 2;
} else if (memTotal < MEM_3GB) {
ram = 3;
} else if (memTotal < MEM_4GB) {
ram = 4;
}
if(ram != -1) {
break;
}
}
}
}
fclose(memInfo);
return ram;
}
recovery安装包的流程中,对于ota包中的metadata解析比较关键,所以调用比较为了能用上metadata参数,直接在CheckPackageMetadata函数里切入比较合适
int CheckPackageMetadata(const std::map<std::string, std::string>& metadata, OtaType ota_type) {
auto package_ota_type = get_value(metadata, "ota-type");
auto expected_ota_type = OtaTypeToString(ota_type);
if (ota_type != OtaType::AB && ota_type != OtaType::BRICK) {
LOG(INFO) << "Skip package metadata check for ota type " << expected_ota_type;
return 0;
}
if (package_ota_type != expected_ota_type) {
LOG(ERROR) << "Unexpected ota package type, expects " << expected_ota_type << ", actual "
<< package_ota_type;
return INSTALL_ERROR;
}
auto device = android::base::GetProperty("ro.product.device", "");
auto pkg_device = get_value(metadata, "pre-device");
if (pkg_device != device || pkg_device.empty()) {
LOG(ERROR) << "Package is for product " << pkg_device << " but expected " << device;
if (!(pkg_device == "hon450" && device == "eda51")) {
return INSTALL_ERROR;
}
}
//call this for Downgrade and Upgrade restriction
LOG(ERROR) << " Downgrade and Upgrade, shouldWipeData " << shouldWipeData;
if(!SupportDowngradeAndUpgradeInstall(metadata)) {
LOG(ERROR) << " Hardware upgrade and downgrade restriction ";
return INSTALL_ERROR;
int ramsize = readRamSize();
if(ramsize <= 2) return INSTALL_ERROR;
...
还需要添加以下recovery的sepolicy权限
#recovery.te中添加对应权限.
allow recovery proc_meminfo:file rw_file_perms;
recovery的ota包安装流程,后续有空会简单梳理出来,因为公司产品特性,客户会有降级需求,针对A/B升级调用update_engine升降级,尤其是针对安全补丁的降级处理,也已经有相应的方案,时间空隙也会慢慢总结出来。好记性不如乱笔头.