前言
前面有一篇文章介绍了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地址