主题 : 在ROM中集成FTP支持 复制链接 | 浏览器收藏 | 打印
级别: 骑士
UID: 29604
精华: 9
发帖: 171
金钱: 1830 两
威望: 366 点
贡献值: 9 点
综合积分: 522 分
注册时间: 2010-10-01
最后登录: 2016-04-13
楼主  发表于: 2012-07-11 10:51

 在ROM中集成FTP支持

管理提醒: 本帖被 xoom 执行加亮操作(2012-10-02)
效果图:






制作步骤
1.    在init.rc中增加如下内容
这步的作用是在根目录创建ftproot文件夹,并把U盘和sd卡的目录链接到这里,因为mnt文件夹里有些不相关的文件夹,此步要配合ftp配置文件才有用
mkdir /ftproot 0775 root system
symlink /mnt/sdcard /ftproot/sdcard
symlink /udisk /ftproot/udisk
2. 把提供的AutoFtp.apk放到/system/app
3. 然后重新制作镜像,重新烧写,启动后就可以在通知栏里看到图标。

如何使用
确保PC机能ping到开发板,开发板最好设置成固定IP,如192.168.1.79。
最好使用FlashXP这类专业的ftp上传下载工具,ftp默认端口2221
AutoFtp.apk提供了2个用户,如果你想从源码编译生成,在之后的文章里会提到如何配置用户信息
1. 匿名用户,可以读取ftproot文件夹,无法写入和删除
2. 用户名admin,密码admin,可以读写或删除ftproot文件夹内容。
如下图所示


或者也可以使用Windows资源管理器(Win7)或IE浏览器(WinXP)
在地址栏输入ftp://admin:admin@192.168.1.79:2221/


主要代码解析
采用的是apache ftp,使用起来简单方便。
1. 首先要先引用apache ftp的jar,共6个文件
2. 然后extends一个Service,比如叫做FtpService
3. 在FtpService的onStart里填入,这些都是固定套路。
FtpServerFactory serverFactory = new FtpServerFactory();
ListenerFactory factory = new ListenerFactory();
// set the port of the listener
int port = 2221;
factory.setPort(port);
// replace the default listener
serverFactory.addListener("default",factory.createListener());
PropertiesUserManagerFactory userManagerFactory = new PropertiesUserManagerFactory();
// users.properties文件放在src文件夹里就可以被找到,此文件就是配置文件
userManagerFactory.setFile(new File("users.properties"));
serverFactory.setUserManager(userManagerFactory.createUserManager());
// start the server
FtpServer server = serverFactory.createServer();
this.mFtpServer = server;
try {
    server.start();
} catch (FtpException e) {
    e.printStackTrace();
}
4. 配置文件修改
把users.properties放在src目录里,然后看看文件的内容吧
这是管理员账号,第1行密码,是admin这串字符通过MD5算出来的结果
ftpserver.user.admin.userpassword=21232F297A57A5A743894A0E4A801FC3
第2行是ftp根目录位置(改init.rc创建ftproot文件夹的目的就在这里),下面的就不解释了,看文字都能理解其含义
ftpserver.user.admin.homedirectory=/ftproot
ftpserver.user.admin.enableflag=true
ftpserver.user.admin.writepermission=true
ftpserver.user.admin.maxloginnumber=0
ftpserver.user.admin.maxloginperip=0
ftpserver.user.admin.idletime=0
ftpserver.user.admin.uploadrate=0
ftpserver.user.admin.downloadrate=0

关于密码的MD5值计算,可以用HashCalc来计算


匿名用户的配置类似,只是没有密码

5. 然后在FtpService的onCreate里填入,这步是要在任务栏里生成通知,并把服务设置为前台服务
Notification notification = new Notification(R.drawable.ftpicon,"Ftp服务正在启动",System.currentTimeMillis());
        PendingIntent p_intent = PendingIntent.getActivity(this, 0,new Intent(this, AutoFtp.class), 0);
        notification.setLatestEventInfo(this, "Ftp服务" ,"Ftp服务正在运行!",p_intent);
        startForeground(0x1982, notification);
为什么要设置成前台运行呢?
因为后台服务进程优先级太低,在实际使用时,ftp上传下载速度非常低,只有几kb/s。


6. 这里有一篇文章提到android2.2的一个bug
解决android网络异常java.net.SocketException: Bad address family
http://orgcent.com/android-bad-address-family-exception/?utm_source=rss
虽然android2.3可能不会有问题,但不管怎么样,还是加上去了……

7. 然后extends一个BroadcastReceiver用来在开机的时候启动服务,就叫AutoFtp吧
就在onReceive填入如下内容,这些也是固定套路了。
if (intent.getAction().equals(ACTION)) {  
            Intent myintent = new Intent(context, FtpService.class);  
            context.startService(myintent);
        }
8. 最后修改一下AndroidManifest.xml
添加各种权限,有些不是必须的,但加了也没事。
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" >
    </uses-permission>
    <uses-permission android:name="android.permission.INTERNET" >
    </uses-permission>
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" >
    </uses-permission>
    <uses-permission android:name="android.permission.READ_PHONE_STATE" >
    </uses-permission>
    <uses-permission android:name="android.permission.WAKE_LOCK" >
    </uses-permission>
    <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" >
    </uses-permission>
增加开机接收通知
    <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"></uses-permission>
在application段中添加 android:persistent="true" 防止服务在空闲时资源被系统回收

10.执行如下命令,可以查看进程优先级
adb shell dumpsys activity
普通后台服务(当程序放在/data/app,且默认为后台服务),优先级太低ftp速度慢
Proc # 7: adj=svc  /B 4086ca68 1175:com.bjw.autoftp/10031 (started-services)
前台服务(当程序放在/data/app,且设置为前台运行服务),速度快,但有可能会被系统回收
Proc # 8: adj=prcp /F 407f4540 1335:com.bjw.autoftp/10031 (foreground-service)
最终,当程序放在/system/app,且设置为前台运行
PERS #11: adj=core /F 407fba60 1082:com.bjw.autoftp/10013 (fixed)
这样才能保证程序的高优先级,且空闲时资源不会被系统回收

AutoFtp.apk
AutoFtpapk.rar (526 K) 下载次数:62
大附件上传不了,源代码就放在网盘里了
http://115.com/file/c2ieu212#20120711AutoFtp.rar
115不给力了,增加几个网盘
http://yunpan.cn/lk/67c1drdive[/url]
http://kanboxshare.com/link/1BMfqQaJRBvKzkSEr9XD9iOFWIM6rYumi5nfqQsBr5xJEgukS
http://pan.baidu.com/netdisk/singlepublic?fid=929760_1196360742
http://www.kuaipan.cn/file/id_51739035768455169.htm
[ 此帖被benjaminwan在2012-08-08 14:37重新编辑 ]