Android修改WIFI/Samba主机名的正确方法

Android不是纯粹的Linux系统,所以常规的对Linux系统的经验在这里都不适用。即使使用busybox内置的hostname,也不能实现修改,修改的只是内核的/proc/sys/kernel/hostname,不能实现WIFI/Samba内显示的主机名(DHCP使用的主机名),主机名还是显示为"android_"+一串AndroidID。
查看相关资料,得知这个名字是在frameworks/base/services/java/com/android/server/ConnectivityService.java中这样生成的

[java] // setup our unique device name
String id = Settings.Secure.getString(context.getContentResolver(),
Settings.Secure.ANDROID_ID);
if (id != null && id.length() > 0) {
String name = new String("android_").concat(id);
SystemProperties.set("net.hostname", name);
}
[/java]

可见 要修改主机名,必须设置net.hostname这个系统属性
我用setprop net.hostname ihipop-Milestone修改了一下 发现是OK的,于是,
我尝试修改了init.d,创建如下内容08hostname并设置为可执行文件

#!/system/bin/sh
Hostname=ihipop-Milestone
echo "setting new Hostname $Hostname";
setprop net.hostname $Hostname
getprop net.hostname

重启后,名字还是"android_"+一串AndroidID,比如"android_a911514ddd27fb5b",但是手动执行这个文件也是Ok的。
想起来可能是因为ConnectivityService启动的比较晚,08hostname执行后又被ConnectivityService修改过来了。

CM7可以直接修改主机名,而且重启后有效,但是基于CM的MIUI确把这个功能给端掉了。于是研究了下android的init.rc 发现和一般的启动脚本也不一样 类似ubuntu的Upstart,是基于事件的。于是就创建了/etc/init.local.rc(修改根目录下的init.rc也没有用,这个文件在重启后会被还原的),写入如下内容

[bash]on property:net.hostname=android_a911514ddd27fb5b
setprop net.hostname ihipop-Milestone[/bash]

表示在系统属性net.hostname被修改为android_a911514ddd27fb5b(我的默认名字)的时候 执行setprop net.hostname ihipop-Milestone命令设置主机名,重启手机,成功~


顺便说一下 android系统的prop文件,这些个文件里面可以定义系统属性的值,但是同样不能用来修改主机名,因为他们都比ConnectivityService启动的早,即使改成更了 也会被ConnectivityService改回来。
当启动属性服务时,将从以下文件中加载默认属性:
/ default.prop
/system/build.prop
/system/default.prop
/data/local.prop
属性将会以上述顺序加载。后加载的属性将覆盖原先的值。这些属性加载之后,最后加载的属性会被保持在/data/property中。

特别属性
如果属性名称以“ro.”开头,那么这个属性被视为只读属性。一旦设置,属性值不能改变。
如果属性名称以“persist.”开头,当设置这个属性时,其值也将写入/data/property。

Author Info :
  • From:Android修改WIFI/Samba主机名的正确方法
  • URL:https://blog.ihipop.com/2011/09/2753.html
  • Please Reserve This Link,Thanks!
  • 《Android修改WIFI/Samba主机名的正确方法》上有8条评论

    1. 你好,我是完全的小白。

      根據你的文章和下面的評論,我兩個文件都更改了,但是還是不能更改手機名,請問怎麼修改,謝謝。

      我的手機是ZTE V880

    2. @大弓
      里面的那串a911514ddd27fb5b ID要换成你实际的ID 每个机器都不一样 你换了么?
      android的自定义rom太多了,不规范的也很多,如果还不行
      你把那个语句直接写到init.rc里面末尾吧吧。

    3. 博主您好!请问新建好/etc/init.local.rc这个文件之后还需要在其他文件中加入调用此文件的命令么?我按照您上述的方法尝试了一下重启机器后不成功,但手动执行init.local.rc这个文件则没问题。我的机器是moto xoom,系统是ics4.0.3。请指教!

    4. 博主您好!
      请问新建好/etc/init.local.rc这个文件之后还需要在其他文件中加入调用此文件的命令么?我按照您上述的方法尝试了一下重启机器后不成功,但手动执行init.local.rc这个文件则没问题。我的机器是moto xoom,系统是ics4.0.3。请指教!

    回复 大弓 取消回复

    您的电子邮箱地址不会被公开。 必填项已用*标注