Recovery模式下读取Ram配置

背景

在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升降级,尤其是针对安全补丁的降级处理,也已经有相应的方案,时间空隙也会慢慢总结出来。好记性不如乱笔头.

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值