NvRAM App层的使用


前言


前面有一篇文章介绍了nvram在uboot,kernel中的使用
https://blog.csdn.net/xuyewen288/article/details/127014532
这里再看一下上层怎么修改nvram的值

一、找到nvram的jar包

\alps\out\target\common\obj\JAVA_LIBRARIES\vendor.mediatek.hardware.nvram-V1.0-java_intermediates\classes.jar
这里就是nvram的jar包,还需要另外framework层的jar包作引用,不然编译不过
alps\out\target\common\obj\JAVA_LIBRARIES\framework_intermediates\classes.jar
这里两个classes.jar随便改个名字就好,不影响使用

二、代码编写

1.jar包引用方式

implementation files('libs\\nvram.jar')
compileOnly files('libs\\classes.jar')

AndroidManifest.xml中要添加
android:sharedUserId="android.uid.system"
另外要添加系统签名,这样app可以直接在androidstudio中运行起来安装进设备中
signingConfigs {
        debug {
            storeFile file('E:\\AndroidStudioProjects\\NVRAMApp\\app\\key0.keystore')
            storePassword 'xxx'
            keyAlias 'platform'
            keyPassword 'xxx'
        }
    }

2.写数据代码

这里mOffset=770;对应的就是上一篇文章中的logo_index的位置,为了不干扰其他位置的使用,
这里我们先把所有的字节读取出来,然后再写入770-773的4个字节里面

 public static final String PRODUCT_INFO_FILENAME = "/mnt/vendor/nvdata/APCFG/APRDEB/PRODUCT_INFO";
    private int mSize=1024;
    private int mOffset=770;
    private  void writeData(int n) {
        byte[] write_buff = new byte[]{0, 0, 0, 0};
        byte[] by = getBytes(n);
        for (int i = 0; i < 4; i++) {
            write_buff[i] = by[i];
        }

        //mSize=by.length;
        try {
            INvram agent = INvram.getService();
            if (agent != null) {
                String buff=null;
                if (agent != null) {
                    buff = agent.readFileByName(PRODUCT_INFO_FILENAME, mSize);
                }
                byte[] buffArr = HexDump.hexStringToByteArray(buff.substring(0, buff.length() - 1));
                System.arraycopy(write_buff,0,buffArr,mOffset,4);
                Log.i(TAG, "readData 1111: buffArr=" + Arrays.toString(buffArr));

//                ArrayList<Byte> dataArray = new ArrayList<>(4);
//                for (byte b : write_buff) {
//                    dataArray.add(new Byte(b));
//                }

                ArrayList<Byte> buffArray = new ArrayList<>(1024);
                for (byte b : buffArr) {
                    buffArray.add(new Byte(b));
                }

                int ret_1 = agent.writeFileByNamevec(PRODUCT_INFO_FILENAME, mSize, buffArray);
//                int ret_1 = agent.writeFileByNamevec(PRODUCT_INFO_FILENAME, mSize, dataArray);
                if (ret_1>=0){
                    log("write success="+ ret_1);

                }else {
                    log("write failed="+ ret_1);
                }
            } else {
                Log.e(TAG, "writeData: agent null");
            }
        } catch (Exception e) {
            Log.e(TAG, "writeData exception:" + e.getLocalizedMessage());
            e.printStackTrace();
        }
    }

    private static  byte[] getBytes(int data) {
        byte[] bytes = new byte[4];
        bytes[0] = (byte) (data & 0xff);
        bytes[1] = (byte) ((data & 0xff00) >> 8);
        bytes[2] = (byte) ((data & 0xff0000) >> 16);
        bytes[3] = (byte) ((data & 0xff000000) >> 24);
        return bytes;
    }

3.读NVRAM值代码

这里targets = (dataArr[0] & 0xff) | ((dataArr[1] << 8) & 0xff00) | ((dataArr[2] << 24) >> 8 & 0xff0000) | (dataArr[3] << 24);这句代码在上一篇文章中也有使用

public  int readData() {
        int targets = 0;
        try {
            String buff = null;
            INvram agent = INvram.getService();
            Log.i(TAG, "readData from "+PRODUCT_INFO_FILENAME);
            if (agent != null) {
                buff = agent.readFileByName(PRODUCT_INFO_FILENAME, mSize);
            }
            byte[] buffArr = HexDump.hexStringToByteArray(buff.substring(0, buff.length() - 1));
            byte[] dataArr=new byte[4];

            System.arraycopy(buffArr,mOffset,dataArr,0,4);
            Log.i(TAG, "readData 1111: buffArr=" + Arrays.toString(dataArr));

//            targets = (dataArr[0] & 0xff) | ((dataArr[1] << 8) & 0xff00) | ((dataArr[2] << 24) >>> 8) | (dataArr[3] << 24);
            targets = (dataArr[0] & 0xff) | ((dataArr[1] << 8) & 0xff00) | ((dataArr[2] << 24) >> 8 & 0xff0000) | (dataArr[3] << 24);

            Log.i(TAG, "readData: buffArr=" + Arrays.toString(dataArr) + ", targets == " + targets);
        } catch (Exception e) {
            Log.e(TAG, "readData exception:" + e.getLocalizedMessage());
            e.printStackTrace();
        }
        return targets;
    }

三、SELINUX权限修改

这里的权限是有改过其他app的,所以也不太确定哪些是否需要,所以也需要看log,自己添加se

diff --git a/alps/device/mediatek/mt8168/sepolicy/basic/system_app.te b/alps/device/mediatek/mt8168/sepolicy/basic/system_app.te
@@ -8,3 +8,9 @@ allow system_app alarm_device:chr_file read;
 allow system_app alarm_device:chr_file open;
 allow system_app alarm_device:chr_file ioctl;
 allow system_app storage_stub_file:dir getattr;
+allow system_app system_data_file:file write;
+allow system_app system_data_file:file read;
+allow system_app system_data_file:file create;
+allow system_app system_data_file:dir write;
+allow system_app system_data_file:dir read;
+allow system_app system_data_file:dir add_name;

diff --git a/alps/system/sepolicy/prebuilts/api/29.0/public/app.te b/alps/system/sepolicy/prebuilts/api/29.0/public/app.te
@@ -461,7 +461,7 @@ 
-neverallow appdomain system_data_file:dir_file_class_set
+neverallow {appdomain -system_app} system_data_file:dir_file_class_set
     { create write setattr relabelfrom relabelto append unlink link rename };
 
 # Write to various other parts of /data.
diff --git a/alps/system/sepolicy/public/app.te b/alps/system/sepolicy/public/app.te
@@ -461,7 +461,7 @@ 
-neverallow appdomain system_data_file:dir_file_class_set
+neverallow {appdomain -system_app} system_data_file:dir_file_class_set
     { create write setattr relabelfrom relabelto append unlink link rename };

总结

HexDump是在framework中的一个类。
demo地址

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 5
    评论
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

xuyewen288

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值