BlackHole开发日志-尝试基于Android的DNS服务器

2013-1-2

今天白天出门了,晚上把Android公开课看了两集。虽然这个课程是比较浅,不过详略还算得当,总得来说还算是不错的,而且只有3个小时,博主对这种速成式的比较感兴趣。后来浏览了几个国内的视频,大多数都是面向零基础的,而且面面俱到,讲的比较慢。因为自己也没打算把这个当正业,加上也有些Java和Swing的基础,了解下大概就可以先试试开发了吧。

2013-1-3

hostd for Android项目正式启动!目标是在Android下动态修改域名绑定,不需要修改hosts,不需要修改DNS服务器,也不需要重新切换APN,以用于开发环境和线上环境的快速切换。

因为博主是个猴急的开发者,秉承快速原型的的原则,今天开始了一些开发的尝试。

因为DNS服务器BlackHole要使用系统端口53,所以首先要确认其在Android上是否能够运行。部署服务艰难重重,记录如下:

第一次:

新建一个helloworld Android项目,在buildPath里加入依赖jar包,然后在MainActivity.onCreate()直接启动DNS服务器。尝试第一次,不成功:

解决:使用adb logcat查看,发现产生了NoClassDefinedError,检查APK包,发现依赖jar没有打进去。再次检查buildPath,在"Order and Export"选项里把这些jar包都勾上,然后jar包被打到APK里。

第二次:

因为在BlackHole中使用了Spring,所以出现了问题:ClassPathXmlApplicationContext解析不到xml文件路径:提示找不到对应bean。

解决:改用FileSystemXmlApplicationContext解析,并将xml存入临时目录/sdcard/spring.xml。结果大跌眼镜,抛出异常:

Unable to validate using XSD: Your JAXP provider [org.apache.harmony.xml.parsers.DocumentBuilderFactoryImpl@461a0cd0] does not support XML Schema. Are you running on Java 1.4 with Apache Crimson? Upgrade to Apache Xerces (or Java 1.5) for full XSD support.

难道Android的xmlparser不支持xsd?感觉不太可能啊,猜测应该是Spinrg底层使用XML parser和Android不兼容(Android包里似乎使用了SAXParser)。于是放弃Spring,看看以后是不是用其他IoC框架了,比如Spring for Android?

第三次:

直接启动SocketServer,绑定53端口,进行尝试。

问题如期而至,显示

java.net.SocketException: Permission denied

解决:根据网络上的解决方案,在程序中插入这一段,理论上可以在运行到这里时,提示需要root权限:

    try {
        Runtime.getRuntime().exec("su");
    } catch (IOException e) {
        e.printStackTrace();
    } 

结果:
没有出现提示,依然没有权限!

第四次:

继续搜索资料,发现模拟器没有root权限!作为一个玩安卓不刷机的人,还真不知道该怎么root。后来下载了一个Root.apk,尝试之,终于成功。

后来分析,Android root的原理,就是将su替换成另外一个文件,并且使用Superuser来管理这些权限。真是曲折!

你可能感兴趣的:(android,root,dns,BlackHoleJ)