android10通过nvram读写wifi蓝牙MAC


前言

一般在出厂的时候就会写好MAC地址,不能更改,但是有一些特殊需求,或者测试的时候,需要改到这一块,这里我们还是用NvRam来在上层做一个读写


一、怎么使用NVRAM

参考这个在上层app应用使用Nvram
找到Nvram的jar包,implementation files(‘libs\nvram.jar’)这样引用, 不然会报找不到类

二、使用方式

1.se修改

这个部分,有一些修改忘记了,可能没有diff上去, 如果碰到了权限问题,自己增加一下se就行

diff --git a/alps/device/mediatek/mt8168/sepolicy/basic/system_app.te b/alps/device/mediatek/mtxxxx/sepolicy/basic/system_app.te
@@ -8,3 +8,9 @@ allow system_app alarm_device:chr_file read;
 allow system_app alarm_device:chr_file open;
 allow system_app alarm_device:chr_file ioctl;
 allow system_app storage_stub_file:dir getattr;
+allow system_app system_data_file:file write;
+allow system_app system_data_file:file read;
+allow system_app system_data_file:file create;
+allow system_app system_data_file:dir write;
+allow system_app system_data_file:dir read;
+allow system_app system_data_file:dir add_name;

diff --git a/alps/system/sepolicy/prebuilts/api/29.0/public/app.te b/alps/system/sepolicy/prebuilts/api/29.0/public/app.te
@@ -461,7 +461,7 @@ 
-neverallow appdomain system_data_file:dir_file_class_set
+neverallow {appdomain -system_app} system_data_file:dir_file_class_set
     { create write setattr relabelfrom relabelto append unlink link rename };
 
 # Write to various other parts of /data.
diff --git a/alps/system/sepolicy/public/app.te b/alps/system/sepolicy/public/app.te
@@ -461,7 +461,7 @@ 
-neverallow appdomain system_data_file:dir_file_class_set
+neverallow {appdomain -system_app} system_data_file:dir_file_class_set
     { create write setattr relabelfrom relabelto append unlink link rename };


2.上读写代码

这里就直接贴一个Activity的代码了,要打包成系统app,其他没要求


import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;
import android.os.RemoteException;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;

import com.android.internal.util.HexDump;


import java.util.ArrayList;
import java.util.StringTokenizer;

import vendor.mediatek.hardware.nvram.V1_0.INvram;

public class MacActivity extends Activity {

    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;

    private TextView tv_wifi_mac,tv_bluetooth_mac;
    private EditText et_wifi_mac,et_bluetooth_mac;
    private Button bt_get,bt_set_wifi_mac,bt_set_bluetooth_mac;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_mac);

        //tv_wifi_mac.setText(getMacAddr(MAC_WIFI_ADDRESS_FILENAME,MAC_WIFI_ADDRESS_OFFSET,MAC_ADDRESS_DIGITS));
        //tv_wifi_mac.setText(getMacAddr(MAC_BT_ADDRESS_FILENAME,MAC_BT_ADDRESS_OFFSET,MAC_ADDRESS_DIGITS));
        tv_wifi_mac=findViewById(R.id.tv_wifi_mac);
        tv_bluetooth_mac=findViewById(R.id.tv_bluetooth_mac);
        et_wifi_mac=findViewById(R.id.et_wifi_mac);
        et_bluetooth_mac=findViewById(R.id.et_bluetooth_mac);
        bt_get=findViewById(R.id.bt_get);
        bt_set_wifi_mac=findViewById(R.id.bt_set_wifi_mac);
        bt_set_bluetooth_mac=findViewById(R.id.bt_set_bluetooth_mac);

        bt_get.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                tv_wifi_mac.setText(getMacAddr(MAC_WIFI_ADDRESS_FILENAME,MAC_WIFI_ADDRESS_OFFSET,MAC_ADDRESS_DIGITS));
                tv_bluetooth_mac.setText(getMacAddr(MAC_BT_ADDRESS_FILENAME,MAC_BT_ADDRESS_OFFSET,MAC_ADDRESS_DIGITS));
            }
        });

        bt_set_wifi_mac.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                String mac=et_wifi_mac.getText().toString();
                if(mac.length()!=12){
                    Toast.makeText(MacActivity.this,"mac错误",Toast.LENGTH_SHORT).show();
                    return;
                }
                mac=mac.toUpperCase();
                String data=mac.substring(0,2)+":"+mac.substring(2,4)+":"+mac.substring(4,6)+":"+mac.substring(6,8)
                        +":"+mac.substring(8,10)+":"+mac.substring(10,12);
                Toast.makeText(MacActivity.this,data,Toast.LENGTH_SHORT).show();
                updateMacAddr(MAC_WIFI_ADDRESS_FILENAME,data,MAC_WIFI_ADDRESS_OFFSET,MAC_ADDRESS_DIGITS);

            }
        });

        //et_wifi_mac.setText("2A4AEFE223ee");

        bt_set_bluetooth_mac.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                String mac=et_bluetooth_mac.getText().toString();
                if(mac.length()!=12){
                    Toast.makeText(MacActivity.this,"mac错误",Toast.LENGTH_SHORT).show();
                    return;
                }
                mac=mac.toUpperCase();
                String data=mac.substring(0,2)+":"+mac.substring(2,4)+":"+mac.substring(4,6)+":"+mac.substring(6,8)
                        +":"+mac.substring(8,10)+":"+mac.substring(10,12);
                Toast.makeText(MacActivity.this,data,Toast.LENGTH_SHORT).show();
                updateMacAddr(MAC_BT_ADDRESS_FILENAME,data,MAC_BT_ADDRESS_OFFSET,MAC_ADDRESS_DIGITS);

            }
        });

        //et_bluetooth_mac.setText("3E:1D:46:B3:A7:62");
        //et_bluetooth_mac.setText("3E1D46B3a762");

    }

    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) {
        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();
        }
    }
}

总结

读写位置和偏移量要写正确,具体要去底层看一下,其实底层是有读写源码的,搜一搜关键字/mnt/vendor/nvdata/APCFG/APRDEB/WIFI这种的,具体看在哪里使用

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

xuyewen288

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值