AP读写NVRAM的值

在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))

猜你喜欢

转载自blog.csdn.net/qq_32869123/article/details/84866285