本篇文章讲解如果真正修改手机硬件参数。
app 会通过判断当前手机的imei、mac、imsi等参数来判断此手机多次注册过app。一般情况下的权重是 imei > imsi > mac > android_id 。
Android 获取 imei 等信息的源码主要在TelephonyManager.java中,app 能获取这些参数只有这一种途径,通过adb 和shell是获取不到。所以比较简单。
获取imei

 telephonyManager.getImei(){ //获取默认卡的imei ,就是当前正在联网的
if(true){从sd卡或者数据库读取动态imei
[size=3]}[/size]return getImei(getSlotIndex());
}[/size]
public String getImei(int slotIndex) { //如果是多卡,就获取指定的imei。不知道模拟器或者双开注意要支持ITelephony telephony = getITelephony(); if (telephony == null) return null;try {return telephony.getImeiForSlot(slotIndex, getOpPackageName());[/size]} catch (RemoteException ex) {return null;} catch (NullPointerException ex) {return null;}}

剩下 手机号 、 simnum 、iccid 的大概都是此方法,我已经通过下面代码验证,修改的参数完全起作用

private void imei() {try {TelephonyManager telephonyManager = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);if (ActivityCompat.checkSelfPermission(this, Manifest.permission.READ_PHONE_STATE) != PackageManager.PERMISSION_GRANTED) {return;}String ANDROID_ID = Settings.System.getString(this.getContentResolver(), Settings.Secure.ANDROID_ID);Log.e(TAG,"def ANDROID_ID ->" + ANDROID_ID);String imei0 = telephonyManager.getDeviceId();Log.e(TAG,"def myimei ->" + imei0);String imei1 = telephonyManager.getDeviceId(1);Log.e(TAG,"myimei1 ->" + imei1);if(Build.VERSION.SDK_INT > Build.VERSION_CODES.N_MR1){String imei2 = telephonyManager.getImei(0);Log.e(TAG,"26+ imei0 ->" + imei2);}String imsi = telephonyManager.getSubscriberId();Log.e(TAG, "imsi ->" + imsi);String phoneNumber = telephonyManager.getLine1Number();Log.e(TAG, "SIM卡中存储本机号码 phoneNumber ->" + phoneNumber);String voiceMail = telephonyManager.getVoiceMailNumber();Log.e(TAG, "语音邮件号码 voiceMail ->" + voiceMail);String simSerial = telephonyManager.getSimSerialNumber();Log.e(TAG, "SIM卡序列号 simSerial ->" + simSerial);String countryIso = telephonyManager.getNetworkCountryIso();Log.e(TAG, "SIM卡提供商的国家代码 countryIso ->" + countryIso);String carrier = telephonyManager.getNetworkOperatorName();Log.e(TAG, "当前移动网络运营商 mynetname ->" + carrier);String netid = telephonyManager.getNetworkOperator();Log.e(TAG, "当前移动网络运营商 netid ->" + netid);int count = telephonyManager.getPhoneCount();Log.e(TAG, "移动卡数量 count ->" + count);if (Build.VERSION.SDK_INT > Build.VERSION_CODES.N_MR1) {String Meid = telephonyManager.getMeid();Log.e(TAG, "移动卡数量 Meid ->" + Meid);}if (Build.VERSION.SDK_INT > 28) {String nai = telephonyManager.getNai();Log.e(TAG, "移动卡数量 Nai ->" + nai);}String simOperator = telephonyManager.getSimOperator();Log.e(TAG, "SIM的移动运营商的名称 mysmo ->" + simOperator);int phoneType = telephonyManager.getPhoneType();Log.e(TAG, "移动终端的类型 phoneType ->" + phoneType);int radioType = telephonyManager.getNetworkType();Log.e(TAG, "当前使用的网络制式 radioType ->" + radioType);String softVersion = telephonyManager.getDeviceSoftwareVersion();Log.e(TAG, "软件版本 softVersion ->" + softVersion);boolean Roam = telephonyManager.isNetworkRoaming();Log.e(TAG, "漫游 Roam ->" + Roam);} catch (Exception e) {e.printStackTrace();}}

Android 修改Android_id的方法:
Android 获取的方法是
String ANDROID_ID = Settings.System.getString(this.getContentResolver(), Settings.Secure.ANDROID_ID);
此参数read-only。如果使用 Settings.System.putString(this.getContentResolver(),“自定义id”);
会报错误,只需要把

public static boolean putStringForUser(@NonNull ContentResolver resolver,@NonNull String name, [url=home.php?mod=space&uid=1043391]@nullable[/url] String value, @Nullable String tag,boolean makeDefault, @UserIdInt int userHandle) {if (LOCAL_LOGV) {Log.v(TAG, "Global.putString(name=" + name + ", value=" + value+ " for " + userHandle);}// Global and Secure have the same access policy so we can forward writesif (MOVED_TO_SECURE.contains(name)) {Log.w(TAG, "Setting " + name + " has moved from android.provider.Settings.Global"+ " to android.provider.Settings.Secure, value is unchanged.");return Secure.putStringForUser(resolver, name, value, tag,makeDefault, userHandle);}return sNameValueCache.putStringForUser(resolver, name, value, tag,makeDefault, userHandle);}

只需要 if (MOVED_TO_SECURE.contains(name)) {}内容注释掉即可。
Android 动态修改mac 比较麻烦
Android 获取 mac 方式有以下几种
第一种执行 shell 命令:ifconfig
第二种是

private static String getMacFromHardware() {try {List<NetworkInterface> all = Collections.list(NetworkInterface.getNetworkInterfaces());Log.d("Utils", "all:" + all.size());for (NetworkInterface nif : all) {if (!nif.getName().equalsIgnoreCase("wlan0")) {continue;}byte[] macBytes = nif.getHardwareAddress();if (macBytes == null) {return null;}Log.d("Utils", "macBytes:" + macBytes.length + "," + nif.getName());StringBuilder res1 = new StringBuilder();for (byte b : macBytes) {res1.append(String.format("%02X:", b));}if (res1.length() > 0) {res1.deleteCharAt(res1.length() - 1);}return res1.toString();}} catch (Exception e) {e.printStackTrace();}return null;
}

第三种 cat /sys/class/net/wlan0/address
对于第一种 和第三种比较麻烦。如果通过修改getInetAddresses 返回动态的的 mac,无法绕过ifconfig 和 cat /sys/class/net/wlan0/address 所有我这边是直接修改mac地址,通过执行命名 ifconfig wlan0 hw ether $Mac ,修改后三种方法都起作用,不知道可有第四种通过反射的方式获取mac。但是此方法必须由root权限才行。如果手机userdebug 或者eng 就可以随便修改。如果想在代码中就可以动态修改,需要修改开机脚本。具体细节不列出了。修改 SN

public static String getSerial() {boolean flag =SystemProperties.getBoolean("persist.sys.keep.mprop",false);if(flag){返回我的sn}}else{IDeviceIdentifiersPolicyService service = IDeviceIdentifiersPolicyService.Stub.asInterface(ServiceManager.getService(Context.DEVICE_IDENTIFIERS_SERVICE));try {return service.getSerial();} catch (RemoteException e) {e.rethrowFromSystemServer();}}return UNKNOWN;}

以上修改都通过我测试app 验证过。完全可以支持动态修改, 对于动态修改屏幕分辨率和密度 、sensor类型及名字 和 apk 列表都已经完成。只是个人感觉没啥作用我的这些 很方便的移植到Lineage OS 上,可以支持多款手机
。 有兴趣的可以联系我一起研究,如果还有其他修改可以留言

android一键改机之真改机build.prop相关推荐

  1. 【iMessage苹果相册推日历真机推】改成vue的MVVM模式现在前端趋向是去dom化

    推荐内容IMESSGAE相关 作者推荐内容 iMessage苹果推软件 *** 点击即可查看作者要求内容信息 作者推荐内容 1.家庭推内容 *** 点击即可查看作者要求内容信息 作者推荐内容 2.相册 ...

  2. 安卓手机改机 抹机 硬改手机参数 手机 改串 改机器内存存储信息 虎贲T610 机器演示

    安卓手机改机 抹机 硬改手机参数 手机 改串 改机器内存存储信息 虎贲T610 机器演示 - 哔哩哔哩 国产5G 手机 改串 改机器内存存储信息 改CPU 屏幕参数信息 硬改手机参数 虎贲T610 机 ...

  3. 使用 Intel HAXM 为 Android 模拟器加速,媲美真机

    使用 Intel HAXM 为 Android 模拟器加速,媲美真机 Android 模拟器一直以运行速度慢著称, 本文介绍使用 Intel HAXM 技术为 Android 模拟器加速, 使模拟器运 ...

  4. android 程序运行不了,Android程序运行时,真机不能用

    Android程序运行时,真机不能用 下列情况均发生在手机"开发人员选项"内已经选择了USB调试的情况下. 一.Android Device chooser中不显示真机 [查找原因 ...

  5. 2022年最新android studio连接雷电模拟器 真机调试教程

    android studio连接雷电模拟器 真机调试 载雷电模拟器,打开并进入如下页面 进入设置 点击关于平板电脑 连续点击5次版本号 会提示已经打开开发者模式 退回设置页面可以看到开发者模式已经打开 ...

  6. android刷机工具推荐,刷机也能如此轻松 Android一键刷机工具

    对于许多Android用户来说,刷机乃是人生一大乐趣,但是许多刚接触Android手机不久的机友对于刷机还不够了解,既羡慕别人华丽流畅的手机系统,又害怕刷机失败而导致手机变"板砖" ...

  7. ionic+vue+capacitor系列笔记--02项目中集成Capacitor,添加android,ios平台,真机运行项目

    Capacitor是什么? Capacitor是由ionic团队开发的一款跨平台移动应用构建工具,可轻让我们轻松的构建Android.iOS.Electron和Web应用程序. Capacitor是A ...

  8. 【Android笔记】Android Studio使用vivo手机真机测试

    Android Studio使用vivo手机真机测试 /* 学习自用笔记. 由于不想下载模拟器(默认装c盘占内存)所以改用自己手机测试 */ 手机操作步骤:打开vivo手机--数据线连接电脑usb-- ...

  9. lumia 525 android 7.1,真神机!Lumia 520 吃上 Android 7.1

    原标题:真神机!Lumia 520 吃上 Android 7.1 XDA 的大神为 Lumia 520 刷上 Android 6.0.1 之后,这回继续折腾给 520 刷上基于 CM14.1 的 An ...

  10. Android studio 3.5.2真机调试_连接手机

    电脑端 一.USB驱动准备 1.打开Android studio --> 选择[File]–>[settings],进入SDK Manager. 2.在SDK Tools下勾选Google ...

最新文章

  1. Swift 开源带来的思考
  2. python画图-Python基础-画图:matplotlib
  3. java jvm 参数 -Xms -Xmx -Xmn -Xss 调优总结
  4. C/C++笔试、面试题
  5. 给Java初学者的十条小建议,快来收藏吧
  6. 异构服务器 微服务_Spring Cloud Alibaba Sidecar 多语言微服务异构
  7. Ubuntu 进入单用户模式—修改启动项利器
  8. linux 时间会跳吗,linux系统时间暂时跳跃
  9. 用sql写每年的第三周_SQL的弱点(1):复杂SQL不易理解,以及软件工程如何来帮忙...
  10. 使用阿富汗和巴基斯坦地区的SRTM数据生成山体阴影和彩色地形图
  11. 【浙大第19届校赛:G】Postman(贪心)
  12. J2ME开发模拟器KEmulator简介及使用
  13. 传统优化算法VS智能优化算法
  14. 数学建模专栏 | 第八篇:MATLAB评价型模型求解方法
  15. iOS小知识:nib本地化、图片本地化字符串本地化(APP 内的本地化切换)
  16. data[i] is underfined
  17. Rais 实现单点登录SSO
  18. 52道常见Python面试题,你都能答对吗?
  19. Win10 发布UWD图形驱动程序 有助于小幅提高性能
  20. 腾冲樱花谷原生态旅游景区公园网站制作完成

热门文章

  1. 字符编码-- Unicode(1991年)
  2. 如何在和010editor中粘贴hex
  3. Origin8画图:将多个worksheet表画在同一张图
  4. 带大家认识下Kvaser CAN总线协议
  5. SSH使用PEM文件登录
  6. pwm控制直流电机转速流程图_一例PWM直流电机转速控制器的电路图,附电路原理分析...
  7. PHP实现倒计时插件代码
  8. vue+ydui使用iconfont时图标不显示
  9. 一只基于Vue2.x的移动端微信UI。 -YDUI Touch
  10. c语言矩阵键盘控制四个led灯,51单片机矩阵键盘与左右流水灯控制C程序