NvRAM App层的使用
文章目录
- 前言
- 一、找到nvram的jar包
- 二、代码编写
- 1.jar包引用方式
- 2.写数据代码
- 3.读NVRAM值代码
- 三、SELINUX权限修改
- 总结
前言
前面有一篇文章介绍了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 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地址
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
