1. 程式人生 > >AP讀寫NVRAM的值

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