mtk INvram服务使用
在android 12平台 只有此目录XX:/mnt/vendor/nvdata/APCFG/APRDEB # ls
BT_Addr GPS WIFI WIFI_CUSTOM
XX:/mnt/vendor/nvdata/APCFG/APRDEB #
网络中所说的/vendor/nvdata/APCFG/APRDEB/是不存在,/mnt/vendor 与/vendor是两个完全不同的目录
/mnt/vendor/nvdata/APCFG/APRDEB/PRODUCT_INFO //此网络中大部文章都是介绍通过修改此节点从而修改SN号,但博主的项目并没有此节点,应该是android 8.0之后的平台开始就没有此节点,
所以如果平台是高于Android8.0 是无法通过以 INvram.getService()服务以下面两方法来修改SN值 ,因为PRODUCT_INFO 节点都已不存在,
buff = agent.readFileByName(PRODUCT_INFO_FILENAME, ADDRESS_OFFSET);
int ret = agent.writeFileByNamevec(PRODUCT_INFO_FILENAME, ADDRESS_OFFSET, dataArray);
MTK NVRAM的读写---上层实现SN和MAC读写 [博主按此文章操作,并没有实现对SN值的修改,博主平台是android12,是没有PRODUCT_INFO节点的,只能通过LID方式来修改SN值]
博主自测通过INvram.getService()服务更新wifi mac地址后,通过android api去读wifi mac地址仍是更新前的数据 ,且执行恢复出厂设置节点的值会恢复至修改前的值,
但通过INvram.getService()服务更新wifi mac地址再使用flashtool以download only刷入ROM,此时再通过android api去读wifi mac地址则是正常,其中的问题请知道原因的朋友留言指点一下(是否与nvdata写入保护机制有关联),
谢谢
原作出处:Android10.0 压力测试--恢复出厂自动测试工具
如果项目是android.mk文件则如下引用nvram.jar
LOCAL_STATIC_JAVA_LIBRARIES += vendor.mediatek.hardware.nvram-V1.0-java
public static String PRODUCT_INFO_FILENAME = "/mnt/vendor/nvdata/APCFG/APRDEB/PRODUCT_INFO";
private static void writeData(int n) {
byte[] write_buff = new byte[]{0, 0, 0, 0};
byte[] btyeContent = getBytes(n);
for (int i = 0; i < 4; i++) {
write_buff[i] = btyeContent[i];
}
try {
INvram agent = INvram.getService();
if (agent != null) {
ArrayList<Byte> dataArray = new ArrayList<>(4);
for (byte b : write_buff) {
dataArray.add(new Byte(b));
}
int ret = agent.writeFileByNamevec(PRODUCT_INFO_FILENAME, ADDRESS_OFFSET, dataArray);
if (ret>0){
Log.i(TAG,write success"+ ret);
}else {
Log.i(TAG,"write failed"+ ret);
}
} else {
Log.i((TAG, "writeData: agent null");
}
} catch (Exception e) {
Log.e(TAG, "writeData exception:" + e.getLocalizedMessage());
e.printStackTrace();
}
}
public static 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, ADDRESS_OFFSET);//10
}
byte[] buffArr = HexDump.hexStringToByteArray(buff.substring(0, buff.length() - 1));
targets = (buffArr[0] & 0xff) | ((buffArr[1] << 8) & 0xff00) | ((buffArr[2] << 24) >>> 8) | (buffArr[3] << 24);
Log.i(TAG, "readData: buffArr=" + Arrays.toString(buffArr) + ", targets == " + targets);
} catch (Exception e) {
Log.e(TAG, "readData exception:" + e.getLocalizedMessage());
e.printStackTrace();
}
return targets;
}
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;
}
}
【删除写入保护set_write_protect】
vendor\mediatek\proprietary\bootable\bootloader\lk\platform\mt6765\write_protect.c
if (!bypass_wp) {
//set_write_protect(); //注释此行
pal_log_err("write protect Done! \n");
} else
pal_log_err("Bypass write protect! \n");
[4]android10通过nvram读写wifi蓝牙MAC
final String MAC_WIFI_ADDRESS_FILENAME = "/mnt/vendor/nvdata/APCFG/APRDEB/WIFI";
final String MAC_BT_ADDRESS_FILENAME = "/mnt/vendor/nvdata/APCFG/APRDEB/BT_Addr";
final int MAC_WIFI_ADDRESS_OFFSET = 4;
final int MAC_BT_ADDRESS_OFFSET = 0;
final int MAC_ADDRESS_DIGITS = 6;
public String getMacAddr(String file, int offset, int size) {
Log.d(TAG, "getMacAddress(): start");
StringBuffer nvramBuf = new StringBuffer();
try {
int i = 0;
String buff = null;
INvram agent = INvram.getService();
if (agent == null) {
Log.e(TAG, "NvRAMAgent is null");
}
try {
buff = agent.readFileByName(file, offset + size);
} catch (Exception e) {
e.printStackTrace();
}
Log.i(TAG, "Raw data:" + buff);
if (buff.length() < 2 * (offset + size)) {
}
// Remove the \0 special character.
int macLen = buff.length() - 1;
for (i = offset * 2; i < macLen; i += 2) {
if ((i + 2) < macLen) {
nvramBuf.append(buff.substring(i, i + 2));
nvramBuf.append(":");
} else {
nvramBuf.append(buff.substring(i));
}
}
Log.d(TAG, "buff:" + nvramBuf.toString());
} catch (RemoteException re) {
re.printStackTrace();
} catch (IndexOutOfBoundsException iobe) {
iobe.printStackTrace();
} finally {
Log.d(TAG, "getMacAddress(): end");
}
return nvramBuf.toString();
}
private void updateMacAddr(String file, String mac, int offset, int size) {//此方法对WIFI,BT的更新都适用,支持动态移位
try {
int i = 0;
INvram agent = INvram.getService();
byte[] macAddr = new byte[size];
if (agent == null) {
Log.e(TAG, "NvRAMAgent is null");
return;
}
//parse mac address firstly
StringTokenizer txtBuffer = new StringTokenizer(mac, ":");
while (txtBuffer.hasMoreTokens()) {
macAddr[i] = (byte) Integer.parseInt(txtBuffer.nextToken(), 16);
i++;
}
if (i != size) {
Log.e(TAG, "Wrong length of macAddr:" + i);
Log.d(TAG, "The format of mac address is not correct");
return;
}
String buff = null;
try {
buff = agent.readFileByName(file, offset + size);
} catch (Exception e) {
e.printStackTrace();
return;
}
// Remove \0 in the end
byte[] buffArr = HexDump.hexStringToByteArray(buff.substring(0, buff.length() - 1));
for (i = 0; i < size; i ++) {
Log.e(TAG, "i:" + i);
Log.e(TAG, "size:" + size);
if(file.equals(MAC_WIFI_ADDRESS_FILENAME))
buffArr[i + MAC_WIFI_ADDRESS_OFFSET] = macAddr[i];
else if(file.equals(MAC_BT_ADDRESS_FILENAME))
buffArr[i + MAC_BT_ADDRESS_OFFSET] = macAddr[i];
else {
Log.e(TAG, "Wrong file of name:" + file);
return;
}
}
ArrayList<Byte> dataArray = new ArrayList<Byte>(offset + size);
for (i = 0; i < offset + size; i++) {
dataArray.add(i, new Byte(buffArr[i]));
}
int flag = 0;
try {
flag = agent.writeFileByNamevec(file, offset + size, dataArray);
} catch (Exception e) {
e.printStackTrace();
Log.d(TAG, e.getMessage() + ":" + e.getCause());
return;
}
Log.d(TAG, "Update successfully.\r\nPlease reboot this device");
} catch (Exception e) {
Log.d(TAG,e.getMessage() + ":" + e.getCause());
e.printStackTrace();
}
}
}
评论