在Android 8.0之前的Nvram的使用是通过获得一个叫"NvRAMAgent"的系统服务,通过这个Binder将数据写入到Nvram分区的文件中,或从Nvram分区的文件中读
出数据,如从Nvram中读出wifi的mac地址。
Android 8.0之前:
1.获取NvRAM Binder的方法:
IBinder binder = ServiceManager.getService("NvRAMAgent");
NvRAMAgent agent = NvRAMAgent.Stub.asInterface(binder);
2.读写函数:
读取:byte[] buff = agent.readFileByName(path);
写入:int ret = agent.writeFileByName(path,buff);
Android8.0之后:
MTK的NvRAM从aidl系统服务改用hidl服务,关于hidl这里暂不做介绍。
1.获取NvRAM HwBinder的方法:
import vendor.mediatek.harware.nvram.V1_0.INvram;
INvram agent = INvram.getService();//此处详情请看HIDL相关资料
2.读写函数:
import com.android.internal.util.HexDump;
读取:String buffer = agent.readFileByName(path,size);
//size读取多长的数据,处理数据要注意直接通过字符串getBytes时长
//度会是size的两倍+1,(size是有效大小,根据Nvram存储的数据结
//构决定),+1是因为字符串带有结束符。处理数据可以转为16编码处理。
byte[] buff = HexDump.hexStringToByteArray(buffer.subString(0,buffer.length() - 1);
写入:ArrayList<Byte> dataArray = new ArrayList<Byte>(size);
修改读取buff中的某一个字节数据:如:buff[index] = 0xff;
将修改后的数据组存到Array中,
for(int index = 0; index < size; index ++) {
dataArray.add(index,new Byte(buff[index]))
}
最后agent.writeFileByNamevec(path,size,dataArray);
使用时还需要在Android.mk中添加依赖:
LOCAL_STATIC_JAVA_LIBRARIES += \
vendor.mediatek.hardware.nvram-V1.0-java-static
注意:如果在读写Nvram时提示selinux权限问题,则做以下修改:在文件
alps/device/mediatek/sepolicy/basic/non_plat/platform_app.te
alps/device/mediatek/sepolicy/bsp/non_plat/platform_app.te
alps/device/mediatek/sepolicy/full/non_plat/platform_app.te
alps/device/mediatek/sepolicy/full/plat_private/platform_app.te
alps/device/mediatek/sepolicy/full/prebuilts/api/26.0/plat_private/platform_app.te
中添加权限
allow platform_app nvram_agent_binder_hwservice:hwservice_manager find;
allow platform_app nvram_agent_binder:binder call;
以上根据实际情况进行添加。
下面这些不清楚是否需要添加,为了保证正常,添加上最好。
alps/device/mediatek/sepolicy/basic/non_plat/radio.te
alps/device/mediatek/sepolicy/bsp/non_plat/radio.te
alps/device/mediatek/sepolicy/full/non_plat/radio.te
中添加权限allow radio nvram_agent_binder_hwservice:hwservice_manager find;
另外,对于39O平台,由于/vendor/nvdata/APCFG/APRDEB/PRODUCT_INFO分区写保护的原因,需要将该分区进行保护解除:
文件:
alps/vendor/mediatek/proprietary/bootable/bootloader/lk/platform/mt6739/write_protect.c
return err;
}
+//Redmine134788 wuxuhua modified for sim lock forever 2018-4-11 begin
#ifdef MTK_PERSIST_PARTITION_SUPPORT
if (0 == is_fs_partition_ready_for_wp("persist")) {
dprintf(CRITICAL, "[%s]: persist is fmt\n", __func__);
snprintf(wp_start, WRITE_PROTECT_PARTITION_NAME_SZ, "persist");
} else
- snprintf(wp_start, WRITE_PROTECT_PARTITION_NAME_SZ, "sec1");
+ snprintf(wp_start, WRITE_PROTECT_PARTITION_NAME_SZ, "md1img");
#else
- snprintf(wp_start, WRITE_PROTECT_PARTITION_NAME_SZ, "sec1");
+ snprintf(wp_start, WRITE_PROTECT_PARTITION_NAME_SZ, "md1img");
#endif
+//Redmine134788 wuxuhua modified for sim lock forever 2018-4-11 end
#ifdef MTK_SECURITY_SW_SUPPORT
if (TRUE == seclib_sec_boot_enabled(TRUE))