Android模拟器网络配置的方法

来源:互联网 发布:淘宝企业店铺可靠么 编辑:程序博客网 时间:2024/05/20 11:47

------------------------------------------------------------
公司里需要设置proxy才能连接外网,proxy是http://10.193.250.16:3128,dns是10.193.250.15。这种环境下Android模拟器中的browser无法直接连接internet.

Android模拟器的每个实例运行在一个虚拟的路由器/防火墙服务后面, 以便和宿主机的网络接口隔离开来。一个模拟设备不可能看到宿主机器,或者其它的模拟设备实例, 也就是说,它只能看到自己通过以太网连接到防火墙。每个模拟器实例的虚拟路由器管理着10.0.2/24这个网络地址空间,即,被路由器管理的所有的地址,都是以10.0.2.x的形式存在。

被模拟器/路由器预先分配的地址是:
        10.0.2.1       路由器/网关地址
        10.0.2.2       宿主机loopbackup接口的别名(也就是宿主机的127.0.0.1)
        10.0.2.3       第1个DNS服务器:[net.dns1]
        10.0.2.4/10.0.2.5/10.0.2.6    可选的第2/3/4个DNS(如果有的话)
        10.0.2.15      模拟器设备自己的网络/以太网接口:[net.gprs.local-ip]
        127.0.0.1      模拟器设备自己的loopbackp接口

一般情况下模拟器的IP地址与宿主电脑(IP一般为192.168.1.100之类的私有地址)不在同一个网段,所以就会出现宿主电脑可以上网但是模拟器不能上网的情况。

要解决此问题,需要为模拟器设置与宿主电脑相同的http代理和dns服务器等属性。

解决的过程如下:

一、设置http代理
1) 检查数据库文件/data/data/com.android.providers.settings/databases/settings.db是否存在,如果存在则继续;
2)  执行sqlite3来设置http代理: 首先进入数据库: sqlite3
/data/data/com.android.providers.settings/databases/settings.db
    执行以下sqlite3命令来设置http代理:
         INSERT INTO system VALUES(99,'http_proxy','10.193.250.16:3128');
    其中“10.193.250.16:3128”就是http代理,视具体网络参数而定;或者使用另外的代理:
         INSERT INTO system VALUES(99,'http_proxy','10.193.118.30:3128');
    执行以下命令检查一下设置是否成功:
         SELECT * FROM system where _id=99;

3) 若要删除http代理,则:

    sqlite3 /data/data/com.android.providers.settings/databases/settings.db
      而后执行sql命令:
       
 DELETE FROM system WHERE _id=99;

      
 DELETE FROM system WHERE name="http_proxy";
4) 若要修改http代理:
    sqlite3 /data/data/com.android.providers.settings/databases/settings.db
      而后执行sql命令:
       
 UPDATE system SET value ='10.193.250.16:3128' WHERE  _id=99;
     或
     
 UPDATE system SET value ='10.193.118.30:3128' WHERE  _id=99;
   ------------------------------------------------------------
5) *** 临时修改http代理:
   在PC的命令行上执行:
      export SP="[[:space:]]"
      export proxy_key=`adb shell getprop | grep proxy | sed -e "s/\[\(.*\)\]${SP}*:${SP}*\[.*\]/\1/"`
      adb shell setprop ${proxy_key}  
 10.193.250.16:3128

    *** 若要临时删除http代理:
      adb shell setprop ${proxy_key}   “”

        [在模拟器中,http代理对应的系统属性(即$proxy_key)为:  "net.gprs.http-proxy"].

------------------------------------------------------------
注):在Android编程中可使用以下代码去读取此http_proxy
      String my_http_proxy =  Settings.Secure.getString( getContentResolver(), Settings.Secure.HTTP_PROXY);
可参考的源码文件为:
     frameworks/base/core/java/android/provider/Settings.java
其中有这样一行:public static final class Secure extends NameValueTable {...}
     Secure内部类的getString()/getInt()/../ 方法所使用的数据库CONTENT_URI为 content://settings/system, 实际就对应数据库”/data/data/com.android.providers.settings/databases/settings.db“。

  ------------------------------------------------------------

二、设置dns服务器
除http代理外,还要设置DNS: 这可在 PC上通过命令行来修改模拟器的property:
1) 查看原来的DNS:   adb shell getprop | grep -i dns
   输出如下:
  [net.dns1]: [10.0.2.3]
  [net.dns2]: [10.0.2.4]
2)查看ubuntu PC机使用的DNS:
        cat
 /etc/resolv.conf | grep -i nameserver
    输出类似于:
            nameserver 10.193.250.15
            nameserver 10.193.250.13
3)修改模拟器使用的dns:
   adb shell setprop 
  net.dns1   10.193.250.15

  注意:这样设置的DNS重启模拟器后会被恢复成10.0.2.3,所以要重新设置。

  ---------------------------------
以上过程也可在模拟器中直接设置: 
1)启动模拟器,然后进入 Settings->Wireless & networks->Mobile networks->Access Point Names   
2)然后打开出现在列表中的access point; 
3)然后下面这样设置: 
   - Proxy : your proxy address   
   - Port : your proxy port 
   - Username : your username if needed, or <Not set> 
   - Password : your password if needed, or <Not set>


三、与宿主机和其它模拟器的通讯

如果想在模拟器中访问宿主机,请使用10.0.2.2这个IP。

模拟器的虚拟路由器应该可以处理所有出去的TCP和UDP连接,模拟器不能处理ICMP等协议。

为了能和在虚拟路由器之后的模拟器通信,必须在虚拟路由器上安装网络端口重定向。连接到路由器上的某个指定的端口,路由器会转发这些流量给模拟器设备。这需要用到模拟器控制台命令,或者使用ADB(Android Debug Bridge )工具。

假定A是宿主PC机, B是第一个模拟器,C是第二个模拟器。 在B和C,127.0.0.1指的是模拟系统自身的环回接口,但10.0.2.2是指宿主机A的环回接口(又名 A:127.0.0.1,指向PC机)。10.0.2.15指的是模拟器自身的网络地址。执行adb devices 可以看到两个模拟器设备是否启动好,如下

List of devices attached 
emulator-5554    device
emulator-5556    device

这里将emulator-5554作为服务器,将emulator-5556 作为客户端。

1、在宿主机终端控制台窗口下执行:
          telnet   localhost   5554
    这样就连上服务器emulator-555;

2、成功连接后,在telnet中继续执行:

         redir  add  tcp:5000:6000 

这样,所有在宿主机上5000端口的tcp通信都会被重定向到模拟器
emulator-5554
的6000端口上。

添加成功后,我们可以用redir list命令来列出已经添加的映射端口,redir del可以进行删除。


通讯时,服务器端用以下java代码打开server socket,并监听客户端的连接:

     ServerSocket  serverSocket = new ServerSocket(6000);

     while(true) {

           Socket client = serverSocket.accept();

           ...

     }

客户端则可用以下java代码去连接服务器:

     Socket socket = new Socket("10.0.2.2", 5000);  //注:这里用的是宿主机的IP和被重定向的端口。


原创粉丝点击