AP讀寫NVRAM的值
阿新 • • 發佈:2018-12-27
在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))