Skip to content

Latest commit

 

History

History
237 lines (161 loc) · 9.73 KB

201404161227.txt.md

File metadata and controls

237 lines (161 loc) · 9.73 KB

标题: Win7+红米MTP模式切换成USM模式

http://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