如何修改源码设置安卓开机默认为静态网页源码IP

2013年9月 移动平台大版内专家分月排行榜第二
2013年11月 移动开发大版内专家分月排行榜第三
2014年6月 移动开发大版内专家分月排行榜第二
本帖子已过去太久远了,不再提供回复功能。2529人阅读
最近在帮忙调试Android设备marsboard,需求就是开机设置静态IP地址。
调试过程与查找了很多资料,经过两天的测试终于成功了。
首先,init.rc文件最后添加开机自启动:
on property:sys.boot_completed=1 & &//系统启动完成后会执行以下命令设置静态IP
&/sbin/busybox ifconfig eth0 up
& & /sbin/busybox ifconfig eth0 192.168.1.48 netmask 255.255.255.0 up
& & /sbin/busybox route add default gw 192.168.1.1 dev eth0
& & setprop net.eth0.dns1 218.30.19.40&
& & setprop net.eth0.dns2 59.75.42.2
这样启动后,系统本来应该可以设置静态IP的了。可惜init.rc里有这样一个服务:
service dhcpcd_eth0 /system/bin/dhcpcd -ABKL &
& & class main
& & disabled
& & oneshot
这个服务在插拔网线时都会运行一次&/system/bin/dhcpcd,设置动态IP,就这样导致eth0一直没有IP地址。
后面想了个折中的办法,就是修改这个服务:
service dhcpcd_eth0 /system/bin/setStaticIP.sh
//把原先的“&/system/bin/dhcpcd -ABKL”改为我们自己的静态IP地址脚本/system/bin/setStaticIP.sh
& & class main
& & disabled
& & oneshot
#on property:sys.boot_completed=1 & &//系统启动完成后会执行以下命令设置静态IP
# &/sbin/busybox ifconfig eth0 up
#& & /sbin/busybox ifconfig eth0 192.168.1.48 netmask 255.255.255.0 up
#& & /sbin/busybox route add default gw 192.168.1.1 dev eth0
#& & setprop net.eth0.dns1 218.30.19.40&
#& & setprop net.eth0.dns2 59.75.42.2
这样自己每次插拔网线就会执行一次我们自己的脚本/system/bin/setStaticIP.sh
记得把脚本setStaticIP.sh放到/system/bin/目录,并且设置好执行权限:chmod 777&/system/bin/setStaticIP.sh
/system/bin/setStaticIP.sh内容如下:
#!/system/bin/sh
# eth0 network setting static ip address
& & /sbin/busybox ifconfig eth0 up
& & /sbin/busybox ifconfig eth0 192.168.1.48 netmask 255.255.255.0 up
& & /sbin/busybox route add default gw 192.168.1.1 dev eth0
& & setprop net.eth0.dns1 218.30.19.40&
& & setprop net.eth0.dns2 59.75.42.2
& & echo &set static ip done&
注意:千万别用windows上编辑器编写setStaticIP.sh,不然会出现no such file。原因就是window编辑后每行都有一个^M结尾的(推荐使用VIM编写,VIM可以看到^M字符)。
我就是因为这样,出现no such file。解决办法:fromdos&setStaticIP.sh
调试过程使用过的一些编译命令:
Android比较重要的三个img文件:
make systemimage - system.img
make userdataimage - userdata.img
make ramdisk - ramdisk.img
make snod - 快速打包system.img (with this command, it will build a new system.img very quickly. well, you cannot use “make snod” for all the situations. it would not check the dependences. if you change some code in the framework which will effect other applications)
system.img 是 從 out/target/product/xxxx/system 做出來的。
如果改了 這個 folder 的內容,想要重新產生 system.img。不要管 system folde 裡面的 file 的 dependency,可以用 snod 這個 target:
调试命令:
start&dhcpcd_eth0 //手动运行一次这个服务
stop&dhcpcd_eth0 //手工停止这个服务
挂载分区命令:
# mount //查看挂载分区情况和权限
# mount -o remount,rw rootfs /
# mount -o remount,ro /dev/block/mtdblock0 /system&
能否挂载成功,涉及权限问题。init.rc有相关的设置,可以参考以下:
参考网页:
http://blog.chinaunix.net/uid--id-3389654.html
/content/11/77.shtml
/articles/Nbu6Bv
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:69527次
积分:1268
积分:1268
排名:千里之外
原创:54篇
转载:29篇
(1)(7)(1)(2)(1)(2)(3)(2)(8)(1)(12)(20)(20)(3)热门搜索:
您的位置: -&
软件教程分类查找
非常抱歉!2345软件大全没能为您提供完善服务,万分感谢能得到您的指点!
您的建议:
精品软件课程
人气:362625
苹果iOS是由苹果公司开发的手持设备操作系
人气:113847
Android(安卓)操作系统是一种以Linux为基
人气:2609
京东(JD.com)是中国最大的自营式电商企业
人气:38798
Windows Phone 7是微软公司发布的一款手机
小游戏推荐
教你如何设置安卓手机静态IP
出处:三联
人气:2738
核心提示:PC上有静态IP,智能手机上也有,不过很多机友都会发现在Android 4.0以上无法使用静态IP。
  PC上有静态IP,智能手机上也有,不过很多机友都会发现在Android 4.0以上无法使用静态IP。  1、打开WIFI。  2、点击你需要连接的WIFI接入点名称。  3、输入密码以后,把输入法隐藏一下就会发现“显示密码”和“显示高级选项”。  4、勾选--显示高级选项。  5、下拉一下会出现“IP设置”。  6、将选项中的DHCP改为--静态。  7、改为静态以后,下面继续会出现几项,填写方式如下:  IP地址:你手机的IP地址,一般是192.168.1.XXX(XXX可以在1-255之间,不能跟路由下的任一设备设置为一样的IP地址)。  网关:你路由器的IP地址(大多数的路由默认IP会是192.168.1.1)。  网络前缀长度:不用修改。  域名1:WIFI接入点所使用的IP地址,一般是192.168.1.1或者192.168.0.1,具体要参考路由上的设置。  域名2:跟域名1一样就可以了。  这样您的手机上网可以正常使用静态IP了。  以上是教你如何设置安卓手机静态IP的全部内容,希望对大家有所帮助,感谢您对的支持,更多请关注2345软件大全。
相关教程推荐
相关软件推荐
资源统计:无插件软件:187986个 无病毒软件:188305个 昨日已处理141个带插件、病毒的软件
本站总软件:188305个 软件总下载次数:22.93亿次
软件教程文章:103559篇 总浏览次数:3.393亿次2593人阅读
由于工作一直很忙,已经有很久没有整理自己的知识了,以后还是要经常总结,这样才有进步。
好了,言归正传,最近在做一个应用,要在里面设置wifi的ip和dns等信息,而上网搜索了一下,好像并没有找到相应的方法,
网上的方法大多是在旧的android版本行得通,到了新的特别到了5.0以后的版本,很多以前旧的方法都用不了了,无法,只能
自己又去啃源码了(好在这应用也是内嵌到系统的,系统也是自己做的,所以直接就在源码里编译这个应用了,所以先分析下
设置里设置wifi的大多都在WifiSettings这个类里,但要怎样开始看,相信这也是大家看源码比较头疼的一个问题,其实有个方法
就是按照我们自己的编程习惯,一边对着系统的功能,比如这里就打开系统的wifi设置,去猜想系统的怎样去命名实现这些功能的
方法的,比如我们看到点击wifi的item时弹出的是一个dialog,我们就搜索dialog,这时我们看到,有
private WifiDialog mD
private WriteWifiConfigToNfcDialog mWifiToNfcD看名字也知道wifidialog就是我们看到的所要的那个dialog,最后修改完后有一个提交修改的按钮,我们的习惯提交的要不叫commit
,要不叫submit,所以再按关键搜索,最后果然搜到以下代码:
public void onClick(DialogInterface dialogInterface, int button) {
if (button == WifiDialog.BUTTON_FORGET && mSelectedAccessPoint != null) {
} else if (button == WifiDialog.BUTTON_SUBMIT) {
if (mDialog != null) {
submit(mDialog.getController());
/* package */ void submit(WifiConfigController configController) {
final WifiConfiguration config = configController.getConfig();
if (config == null) {
if (mSelectedAccessPoint != null
&& mSelectedAccessPoint.networkId != INVALID_NETWORK_ID) {
connect(mSelectedAccessPoint.networkId);
} else if (config.networkId != INVALID_NETWORK_ID) {
if (mSelectedAccessPoint != null) {
mWifiManager.save(config, mSaveListener);
if (configController.isEdit()) {
mWifiManager.save(config, mSaveListener);
connect(config);
if (mWifiManager.isWifiEnabled()) {
mScanner.resume();
updateAccessPoints();
由代码可以看到,当点击忘记时就调的forget方法,但我们的重点不在这,所以我们看submit方法,submit只有一个参数,WifiConfigController,
再看方法体, 里面重wificonfigController里获取到了WifiConfiguration ,如果为空,就直接重新连接wifi,如果不为空,就保存这个wifiConfiguration
,最后的updateAccessPoints()不知道什么意思?不要紧,看一下AccessPoint是settings应用里的类并不是系统的,所以也就不会影响所要实现的功能,
也就不用过于探究了。所以现在的重点就到了wificonfigController里了。再回到controller这个类,刚调的是getConfig()这个方法,所以我们首先就是要去
到这个方法里
/* package */ WifiConfiguration getConfig() {
if (mAccessPoint != null && mAccessPoint.networkId != INVALID_NETWORK_ID && !mEdit) {
WifiConfiguration config = new WifiConfiguration();
if (mAccessPoint == null) {
config.SSID = AccessPoint.convertToQuotedString(
mSsidView.getText().toString());
// If the user adds a network manually, assume that it is hidden.
config.hiddenSSID =
} else if (mAccessPoint.networkId == INVALID_NETWORK_ID) {
config.SSID = AccessPoint.convertToQuotedString(
mAccessPoint.ssid);
config.networkId = mAccessPoint.networkId;
config.setIpConfiguration(
new IpConfiguration(mIpAssignment, mProxySettings,
mStaticIpConfiguration, mHttpProxy));
这个方法很长,但刚说了AccessPoint这个类只在settings里,所以有关的代码都可以先忽略,真的不行时再回头看是不是它的问题,在方法的
最后我们看到config最后调了setIpConfiguration这个方法,所以我们也就关注这个方法,而这个方法的参数哪里来,我们再搜索一下,搜到它在
这声明了这几个成员
private IpAssignment mIpAssignment = IpAssignment.UNASSIGNED;
private ProxySettings mProxySettings = ProxySettings.UNASSIGNED;
private ProxyInfo mHttpProxy =
private StaticIpConfiguration mStaticIpConfiguration =
然而它的赋值是在哪的?继续搜,在这里找到了:
private boolean ipAndProxyFieldsAreValid() {
mIpAssignment = (mIpSettingsSpinner != null &&
mIpSettingsSpinner.getSelectedItemPosition() == STATIC_IP) ?
IpAssignment.STATIC : IpAssignment.DHCP;
if (mIpAssignment == IpAssignment.STATIC) {
mStaticIpConfiguration = new StaticIpConfiguration();
int result = validateIpConfigFields(mStaticIpConfiguration);
if (result != 0) {
final int selectedPosition = mProxySettingsSpinner.getSelectedItemPosition();
mProxySettings = ProxySettings.NONE;
mHttpProxy =
if (selectedPosition == PROXY_STATIC && mProxyHostView != null) {
mProxySettings = ProxySettings.STATIC;
String host = mProxyHostView.getText().toString();
String portStr = mProxyPortView.getText().toString();
String exclusionList = mProxyExclusionListView.getText().toString();
int port = 0;
int result = 0;
port = Integer.parseInt(portStr);
result = ProxySelector.validate(host, portStr, exclusionList);
} catch (NumberFormatException e) {
result = R.string.proxy_error_invalid_
if (result == 0) {
mHttpProxy = new ProxyInfo(host, port, exclusionList);
} else if (selectedPosition == PROXY_PAC && mProxyPacView != null) {
mProxySettings = ProxySettings.PAC;
CharSequence uriSequence = mProxyPacView.getText();
if (TextUtils.isEmpty(uriSequence)) {
Uri uri = Uri.parse(uriSequence.toString());
if (uri == null) {
mHttpProxy = new ProxyInfo(uri);
private Inet4Address getIPv4Address(String text) {
return (Inet4Address) NetworkUtils.numericToInetAddress(text);
} catch (IllegalArgumentException|ClassCastException e) {
private int validateIpConfigFields(StaticIpConfiguration staticIpConfiguration) {
if (mIpAddressView == null) return 0;
String ipAddr = mIpAddressView.getText().toString();
if (TextUtils.isEmpty(ipAddr)) return R.string.wifi_ip_settings_invalid_ip_
Inet4Address inetAddr = getIPv4Address(ipAddr);
if (inetAddr == null) {
return R.string.wifi_ip_settings_invalid_ip_
int networkPrefixLength = -1;
networkPrefixLength = Integer.parseInt(mNetworkPrefixLengthView.getText().toString());
if (networkPrefixLength & 0 || networkPrefixLength & 32) {
return R.string.wifi_ip_settings_invalid_network_prefix_
staticIpConfiguration.ipAddress = new LinkAddress(inetAddr, networkPrefixLength);
} catch (NumberFormatException e) {
// Set the hint as default after user types in ip address
mNetworkPrefixLengthView.setText(mConfigUi.getContext().getString(
R.string.wifi_network_prefix_length_hint));
String gateway = mGatewayView.getText().toString();
if (TextUtils.isEmpty(gateway)) {
//Extract a default gateway from IP address
InetAddress netPart = NetworkUtils.getNetworkPart(inetAddr, networkPrefixLength);
byte[] addr = netPart.getAddress();
addr[addr.length-1] = 1;
mGatewayView.setText(InetAddress.getByAddress(addr).getHostAddress());
} catch (RuntimeException ee) {
} catch (java.net.UnknownHostException u) {
InetAddress gatewayAddr = getIPv4Address(gateway);
if (gatewayAddr == null) {
return R.string.wifi_ip_settings_invalid_
staticIpConfiguration.gateway = gatewayA
String dns = mDns1View.getText().toString();
InetAddress dnsAddr =
if (TextUtils.isEmpty(dns)) {
//If everything else is valid, provide hint as a default option
mDns1View.setText(mConfigUi.getContext().getString(R.string.wifi_dns1_hint));
dnsAddr = getIPv4Address(dns);
if (dnsAddr == null) {
return R.string.wifi_ip_settings_invalid_
staticIpConfiguration.dnsServers.add(dnsAddr);
if (mDns2View.length() & 0) {
dns = mDns2View.getText().toString();
dnsAddr = getIPv4Address(dns);
if (dnsAddr == null) {
return R.string.wifi_ip_settings_invalid_
staticIpConfiguration.dnsServers.add(dnsAddr);
这段就是我们所要的比较关键的代码了,首先看名字就看得出来,是设置代理和ip的,首先判断是否是静态ip,如果是就IpAssignment.STATIC 将ip分配设置静态,否则 IpAssignment.DHCP设置动态分配,mIpAssignment == IpAssignment.STATIC,如果是静态分配,就调用validateIpConfigFields设置静态的ip,前缀长度,网关和dns到staticIpConfiguration,再到下面是设置代理的,这里就不详细分析了,最后再把所有的设置config.setIpConfiguration设进去再调wifimanager的save方法保存就可以了,
保存完后wifi会自动重新连接。
到这wifi ip修改的源码就分析完了,这样就有人会问了,即然sdk里这些类都有。为什么还是不能直接调,因为系统把这些方法隐藏了,直接写的编译不过的,可能是由于
安全原因吧。
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:8631次
排名:千里之外
(1)(1)(3)(6)

我要回帖

更多关于 html静态网站源码 的文章

 

随机推荐