标题: Win7+红米MTP模式切换成USM模式 https://scz.617.cn/android/201404161227.txt Q: 什么是MTP模式? A: MTP是"Media Transfer Protocol"的缩写,Windows Media Player 10/11支持。MTP有 两种角色,Initiator和Responder,WMP是Initiator,支持MTP的设备是Responder。 MTP可以跑在USB上,可以跑在TCP/IP、蓝牙上。Vista及以上版本内置对MTP的支持, XP需要安装WMP 10或以上版本。 MTP是微软搞的,有点类似iTunes那套,可以在设备与电脑之间同步东西。在MTP模式 下只有用WMP才能看到MP3播放器中的内容。 微软向数码相机、MP3播放器、手机等厂商免费提供MTP技术,这些厂商可以在Firmware 中内置对MTP的支持。数码相机用户不必像过去那样安装厂商专有的驱动程序就可以让 Windows识别数码相机。 与MTP模式相对应的是MSC模式(Mass Storage),也叫UMS模式(USB Mass Storage)。设 备通过MTP模式与电脑连接时,最明显的标志是没有盘符。 MTP与ADB(USB调试)无法同时使用。曾经发现"adb push"上去的文件在电脑里看不到, 关了USB调试也不行,重启手机后才能同步,这是MTP模式的通病。 UMS模式下,电脑拥有SD卡的完全控制,设备无法同时访问SD卡,Camera或MP3因为没 有SD卡而提示无法操作。有些设备做了针对性处理,只将外置SD卡暴露给电脑,将内 置SD卡隐藏起来,从而可以在内置SD卡上存放少量数据。 MTP模式下,SD卡的控制权属于设备而不是电脑。设备通过MTP协议向电脑提供一个虚 拟文件系统,电脑访问SD卡时,通过MTP协议向设备发起相应请求。MTP模式是一种C/S 架构,因此从电脑上移除设备时可以直接拔掉USB线,不必经过安全删除硬件环节。 MTP解决了USM的三大问题: 1) 分区通过USM连接电脑时,设备无法同时访问分区 2) USM不支持4GB以上的大文件 3) /data分区经常不够用 与USM相比,MTP的劣势: 1) MTP传输大文件较慢 2) MTP模式下不能从电脑直接修改设备上的文件,只能复制到电脑,改完后复制回设 备。有一些封装后的效果使得看上去可以直接修改。 3) USM模式与ADB(USB调试)可以同时使用,MTP不能。 4) 设备通过USM模式与电脑连接时,有盘符。MTP没有盘符。 针对第2条,可能有不同的外在表现形式,比如不能在电脑上双击打开设备上的文件, 不能预览图片。这些都不一定,要看电脑这边有没有其他封装处理。从C/S架构原理上 讲,这很好理解。 MTP是C/S架构,从电脑向设备复制文件的性能、质量受限于设备端MTP Responder实现。 除了慢,还有可能大批量复制小文件或复制超大文件时出现文件损坏、对长文件名支 持得不好、复制过程中卡死等等。 D: yangtou@SMTH 2012-07-25 一句话解释MTP与USM的区别,网上邻居(SMB)或者FTP与U盘的区别。 D: tsa300@SMTH 2012-07-25 用MTP替代UMS是巨大进步。MTP的最大优点是设备向电脑输出的内容可控。UMS输出的 是整个分区,电脑得到分区的全部控制,设备只有等从电脑断开后才能重获分区的控 制。为了防止小白把NAND Flash搞乱,设备一般将NAND Flash划成两个分区。 MTP可以设置权限。比如你设置了锁机图案,设备在锁机状态时接入电脑,电脑上看不 到设备内容,设备解锁后电脑才会看到设备内容。MTP还支持认证机制。 MTP不再限定输出的分区格式必须是FAT,可以是ext4等。 Q: Win7+红米,如何从MTP模式切换成USM模式? A: 除非你完全清楚MTP与USM的含义,否则不建议从MTP模式切换成USM模式。因为USM模式 接入电脑时会影响手机对(内置、外置)SD卡的识别,很多人不明所以地盲目切换USM模 式,常常带来一堆衍生问题,然后跑到论坛上狂喊"希望官方修正",官方也很无奈。 # cat /data/property/persist.sys.usb.config mtp,adb # busybox sed -i 's/mtp/mass_storage/g' /data/property/persist.sys.usb.config # cat /data/property/persist.sys.usb.config mass_storage,adb 重启手机使之生效。 -------------------------------------------------------------------------- 通知->作为USB存储设备使用(触摸可显示其他USB选项)->USB计算机连接 USB存储设备 每次USM接入时都会提示"是否打开USB存储",如果选中"下次不再询问",以 后想恢复这个提示较复杂 MTP 不要在这里选MTP,否则非root情况下想再次看到"其他USB选项"较复杂 PTP 只充电 据说在这个模式下充电快 内置光盘 光盘里只有一个文件,Micro-USB_1_01.pdf 通知->USB数据存储 这是一个开关,在"作为USB存储设备使用"的前提下,串行控制USM模式,实际就 是"是否打开USB存储"的另一处控制点。但这个地方有BUG,会出现与实际情况不 同步的情况,来回拨拉使之同步。 -------------------------------------------------------------------------- 前面直接操作/data/property/persist.sys.usb.config,还可以用setprop: # getprop persist.sys.usb.config mtp,adb # setprop persist.sys.usb.config mass_storage,adb 与前面相比有一个重要区别,"setprop persist.sys.usb.config"之后"adb shell"会 断开,无论是"mass_storage,adb"还是"mtp,adb"。而sed不会。 同样需要重启手机使之生效。 -------------------------------------------------------------------------- 设置->全部设置->存储 手机以USM模式接入电脑后,手机看不到外置SD卡、内置SD卡,这里二者都是灰的, 无大小。弹出U盘,拔掉USB线,手机重新看到外置SD卡、内置SD卡。 MTP模式下手机与电脑可以同时看到并操作外置SD卡、内置SD卡。 -------------------------------------------------------------------------- Q: Win7+红米,已经处在MTP模式,没有"root shell",怎么才能看到"其他USB选项" A: shell@android:/ $ am start -n com.android.settings/com.android.settings.UsbSettings 这可能是程序员最喜欢的方案,不用root,不用安装任何其他应用。 D: 关于"persist.sys.usb.config",研究/init.usb.rc,在里面发现很多组合,比如: mtp,mass_storage mtp,mass_storage,adb 测试"mtp,mass_storage,adb",手机以USM模式接入电脑,"其他USB选项"被隐藏,这 可真是一个奇葩的组合。 Q: USM接入时会提示"是否打开USB存储",我选中过"下次不再询问",后来再也见不到这 个提示了,现在想恢复这个提示。 A: 这叫请神容易送神难,手机软件不像电脑软件,很多配置项并不直接提供UI,轻易不 要选中类似"下次不再询问"这样的记忆类配置,选了就要有愿赌服输的觉悟。 为了恢复提示"是否打开USB存储",必须有"root shell"。 # ls -l /data/data/com.android.providers.settings/databases/settings.db -rw-rw---- system system 86016 2014-04-16 10:17 settings.db # cp /data/data/com.android.providers.settings/databases/settings.db /data/local/tmp/settings.db # chmod 666 /data/local/tmp/settings.db 在电脑上: > adb pull /data/local/tmp/settings.db > sqlite3 settings.db "select name,value from secure where name='usb_mode'" usb_mode|2 > sqlite3 settings.db "delete from secure where name='usb_mode'" > adb push settings.db /data/local/tmp/ 意思就是,选中"下次不再询问",会在settings.db的secure表中插入一条记录,将 usb_mode设为2,为了恢复提示"是否打开USB存储",删掉这条记录即可。 关于sqlite3,多演示一下: > sqlite3 settings.db SQLite version 3.8.4.3 2014-04-03 16:53:12 Enter ".help" for usage hints. sqlite> .database seq name file --- --------------- ---------------------------------------------------------- 0 main settings.db sqlite> .tables android_metadata bookmarks secure bluetooth_devices global system sqlite> .schema secure CREATE TABLE secure (_id INTEGER PRIMARY KEY AUTOINCREMENT,name TEXT UNIQUE ON CONFLICT REPLACE,value TEXT); CREATE INDEX secureIndex1 ON secure (name); sqlite> select name,value from secure where name='usb_mode'; usb_mode|2 sqlite> delete from secure where name='usb_mode'; sqlite> .exit 回到正题,在手机上: # cp /data/local/tmp/settings.db /data/data/com.android.providers.settings/databases/settings.db # ls -l /data/data/com.android.providers.settings/databases/settings.db -rw-rw---- system system 86016 2014-04-16 11:16 settings.db # reboot 至此,USM接入时会提示"是否打开USB存储"。 我是把settings.db从手机弄到电脑用sqlite3修改,再传回手机。也可以用SQLiteSpy, 这是个GUI程序,查看secure表更方便些。不过不建议用SQLiteSpy进行修改操作,试 了一次,结果settings.db的大小增加了不少,而sqlite3无此现象。 如果装了"Google Play商店",可以下载"SQLite Editor",直接在手机上操作前述settings.db, 同样需要root。有人还喜欢与"Root Explorer"配合。注意,"SQLite Editor"是收费 应用。我没支付通道,所以才弄回电脑修改的。 /data/data/目录下有很多应用的配置数据库,我决定全部拖回电脑,用SQLiteSpy研 究。 # cd /sdcard/downloaded_rom # du -s /data/data/ 182448 /data/data/ # busybox tar cfz data_data.tgz /data/data/ # ls -l data_data.tgz ----rwxr-x system sdcard_rw 46940992 2014-04-16 11:51 data_data.tgz # busybox tar tfz data_data.tgz > adb pull /sdcard/downloaded_rom/data_data.tgz