Android 4.4 KitKat 支持 u 盘功能
Android U 盘功能实现和分析
u 盘功能实现结果:
准备工作
Android 的配置
配置 init.<board>.rc
mkdir /storage/udisk0 0000 system system
mkdir /mnt/media_rw/udisk0 0700 media_rw media_rw
service fuse_udisk0 /system/bin/sdcard -u 1023 -g 1023 -w 1023 -d /mnt/media_rw/udisk0 /storage/udisk0
class late_start
disabled
配置 fstab.<board>
/block/sda /mnt/media_rw/udisk0 vfat defaults voldmanaged=udisk0:auto
配置 overlay
<storage android:mountPoint="/storage/udisk0"
android:storageDescription="@string/storage_usb"
android:primary="false"
android:removable="true" />
挂载过程:
/dev/block/vold/8:1 /mnt/media_rw/udisk0 vfat rw,dirsync,nosuid,nodev,noexec,relatime,uid=1023,gid=1023,fmask=0007,dmask=0007,allow_utime=0020,codepage=437,iocharset=iso8859-1,shortname=mixed,utf8,errors=remount-ro 0 0
/dev/fuse /storage/udisk0 fuse rw,nosuid,nodev,relatime,user_id=1023,group_id=1023,default_permissions,allow_other 0 0
root@android:/ # logcat -s Vold MountService
--------- beginning of /dev/log/main
--------- beginning of /dev/log/system
I/Vold ( 820): Vold 2.1 (the revenge) firing up
D/Vold ( 820): Volume sdcard1 state changing -1 (Initializing) -> 0 (No-Media)
D/Vold ( 820): Volume sdcard1 state changing -1 (Initializing) -> 0 (No-Media)
D/Vold ( 820): Volume udisk0 state changing -1 (Initializing) -> 0 (No-Media)
D/Vold ( 820): Volume udisk0 state changing 0 (No-Media) -> 2 (Pending)
D/Vold ( 820): Volume udisk0 state changing 2 (Pending) -> 1 (Idle-Unmounted)
D/Vold ( 820): Volume sdcard1 state changing 0 (No-Media) -> 2 (Pending)
D/Vold ( 820): Volume sdcard1 state changing 2 (Pending) -> 1 (Idle-Unmounted)
D/MountService( 1587): got storage path: /storage/sdcard0 description: Internal storage primary: true removable: false emulated: true mtpReserve: 50 allowMassStorage: false maxFileSize: 0
D/MountService( 1587): addVolumeLocked() StorageVolume:
D/MountService( 1587): mStorageId=65537 mPath=/storage/emulated/0 mDescriptionId=17040662
D/MountService( 1587): mPrimary=true mRemovable=false mEmulated=true mMtpReserveSpace=50
D/MountService( 1587): mAllowMassStorage=false mMaxFileSize=0 mOwner=UserHandle{0} mUuid=null
D/MountService( 1587): mUserLabel=null mState=null
D/MountService( 1587): got storage path: /storage/sdcard1 description: SD card primary: false removable: true emulated: false mtpReserve: 0 allowMassStorage: false maxFileSize: 4294967296
D/MountService( 1587): addVolumeLocked() StorageVolume:
D/MountService( 1587): mStorageId=0 mPath=/storage/sdcard1 mDescriptionId=17040663 mPrimary=false
D/MountService( 1587): mRemovable=true mEmulated=false mMtpReserveSpace=0 mAllowMassStorage=false
D/MountService( 1587): mMaxFileSize=4294967296 mOwner=null mUuid=null mUserLabel=null mState=null
D/MountService( 1587): got storage path: /storage/udisk0 description: USB storage primary: false removable: true emulated: false mtpReserve: 0 allowMassStorage: false maxFileSize: 0
D/MountService( 1587): addVolumeLocked() StorageVolume:
D/MountService( 1587): mStorageId=0 mPath=/storage/udisk0 mDescriptionId=17040664 mPrimary=false
D/MountService( 1587): mRemovable=true mEmulated=false mMtpReserveSpace=0 mAllowMassStorage=false
D/MountService( 1587): mMaxFileSize=0 mOwner=null mUuid=null mUserLabel=null mState=null
W/MountService( 1587): Duplicate state transition (unmounted -> unmounted) for /storage/sdcard1
D/MountService( 1587): volume state changed for /storage/sdcard1 (unmounted -> removed)
W/MountService( 1587): Duplicate state transition (unmounted -> unmounted) for /storage/udisk0
I/Vold ( 820): /dev/block/vold/8:1 being considered for volume udisk0
D/Vold ( 820): Volume udisk0 state changing 1 (Idle-Unmounted) -> 3 (Checking)
D/MountService( 1587): volume state changed for /storage/udisk0 (unmounted -> checking)
D/MountService( 1587): sendStorageIntent Intent { act=android.intent.action.MEDIA_CHECKING dat=file:///storage/udisk0 (has extras) } to UserHandle{-1}
I/Vold ( 820): Filesystem check completed OK
D/Vold ( 820): blkid identified as /dev/block/vold/8:1: UUID="402E-0EE3" TYPE="vfat"
D/Vold ( 820): Volume udisk0 state changing 3 (Checking) -> 4 (Mounted)
D/MountService( 1587): volume state changed for /storage/udisk0 (checking -> mounted)
D/MountService( 1587): sendStorageIntent Intent { act=android.intent.action.MEDIA_MOUNTED dat=file:///storage/udisk0 (has extras) } to UserHandle{-1}
W/MountService( 1587): Duplicate state transition (mounted -> mounted) for /storage/emulated/0
Vold 解析 fstab 文件
property_get("ro.hardware", propbuf, "");
snprintf(fstab_filename, sizeof(fstab_filename), FSTAB_PREFIX"%s", propbuf);
fstab = fs_mgr_read_fstab(fstab_filename);
if (!fstab) {
SLOGE("failed to open %s\n", fstab_filename);
return -1;
}
当中 #define FSTAB_PREFIX "/fstab." 所以,配置的 fatab 文件必须放在根文件夹, Vold 是 android 的后台进程,将会一直监听 fatab 里面标记为 voldmanaged 的项目
# Android fstab file.
#<src> <mnt_point> <type> <mnt_flags and opt
ions> <fs_mgr_flags>
# The filesystem that contains the filesystem checker binary (typically /system) cannot
# specify MF_CHECK, and must come before any filesystems that do specify MF_CHECK /dev/block/platform/dw_mmc.0/by-name/system /system ext4 ro
wait
/dev/block/platform/dw_mmc.0/by-name/cache /cache ext4 noatime,nosuid,nodev,nombl
k_io_submit,errors=panic wait,check
/dev/block/platform/dw_mmc.0/by-name/userdata /data ext4 noatime,nosuid,nodev,nombl
k_io_submit,errors=panic wait,check,encryptable=/dev/block/platform/dw_mmc.0/by-name/metadata
/dev/block/platform/dw_mmc.0/by-name/efs /factory ext4 noatime,nosuid,nodev,ro
wait
/dev/block/platform/dw_mmc.0/by-name/boot /boot emmc defaults
defaults
/dev/block/platform/dw_mmc.0/by-name/recovery /recovery emmc defaults
defaults
/dev/block/platform/dw_mmc.0/by-name/misc /misc emmc defaults
defaults
/dev/block/mmcblk0boot0 /bootloader emmc defaults
defaults
on fs
mkdir /factory 0775 radio radio mount_all /fstab.manta
同理。 init 的 mount 也会忽略标记为 voldmanaged 的项目
MountService 与 Vold 联合挂载 u 盘
private void readStorageListLocked() {
mVolumes.clear();
mVolumeStates.clear();
Resources resources = mContext.getResources();
int id = com.android.internal.R.xml.storage_list;
XmlResourceParser parser = resources.getXml(id);
AttributeSet attrs = Xml.asAttributeSet(parser);
try {
XmlUtils.beginDocument(parser, TAG_STORAGE_LIST);
while (true) {
XmlUtils.nextElement(parser);
Vold 获取到 list 里面的设备变化时将会发送 state change event, MountService 在 onEvent 处理各种不同 state 。当中获取到设备插入,将会运行挂载操作:
if (code == VoldResponseCode.VolumeDiskInserted) {
new Thread("MountService#VolumeDiskInserted") {
@Override
public void run() {
try {
int rc;
if ((rc = doMountVolume(path)) != StorageResultCode.OperationSucceeded) {
Slog.w(TAG, String.format("Insertion mount failed (%d)", rc));
}
} catch (Exception ex) {
Slog.w(TAG, "Failed to mount media on insertion", ex);
}
}
}.start();
doMountVolume 仅仅是发送 mount 命令给 Vold
private int doMountVolume(String path) {
int rc = StorageResultCode.OperationSucceeded;
final StorageVolume volume;
synchronized (mVolumesLock) {
volume = mVolumesByPath.get(path);
}
if (DEBUG_EVENTS) Slog.i(TAG, "doMountVolume: Mouting " + path);
try {
mConnector.execute("volume", "mount", path);
终于 Vold 里面运行对应的 mount 操作,我们的 u 盘是 vfat 格式,我仅仅測试了这个格式, Linux 下的格式没有測试,由于 Vold 仅仅支持 fat 和 ext4
int VolumeManager::mountVolume(const char *label) {
Volume *v = lookupVolume(label);
if (!v) {
errno = ENOENT;
return -1;
}
return v->mountVol();
}
if (Fat::doMount(devicePath, getMountpoint(), false, false, false,
AID_MEDIA_RW, AID_MEDIA_RW, 0007, true)) {
SLOGE("%s failed to mount via VFAT (%s)\n", devicePath, strerror(errno));
continue;
Android 4.4 KitKat 支持 u 盘功能的更多相关文章
- Android4.4KitKat支持u盘功能
Android4.4KitKat支持u盘功能 作者: 发布日期:2014-05-14 23:16:13 我来说两句(0) 0 Tag标签:功能 Android U 盘功能实现和分析 u 盘功能实 ...
- Android 4.4 Kitkat 使能 USB adb 功能
背景 在 Linux-3.8 以后,Android 的内核分支,便去掉了 f_adb,改使用 USB function FS,在用户空间实现 USB adb 功能.这篇文章依据原作者的 Google+ ...
- Android 4.4 KitKat终于支持录屏(Screen Recording)了!
本文介绍了Android 4.4 KitKat系统新增加的录屏功能以及录屏方法,和限制因素.如果App由于版权方面的原因,不想被记录屏幕录像的话,APP只需要在相应的SurfaceView请求“Sur ...
- Android 4.4 KitKat 新特性
New in Android 4.4 KitKat 本文是一个概览,关于KitKat,也即Android4.4的新东西,先是功能型的,之后是设计上的. 很多特性本文并没有提到,很多提到的特性也只是简短 ...
- 让你的短信应用迎接Android 4.4(KitKat)
原文地址:Getting Your SMS Apps Ready for KitKat 发送和接收短信是手机最基本的功能,很多的开发者也开发了很多成功的应用来增强Android这一方面的体验.你们当中 ...
- Android:让WebView支持<input type=”file”…>元素
最近在做一个活动页面:用户上传一张图片进行缩放.旋转后点击下一步填写内容后生成图片! 做好后经过各种测试是没有问题的,基本没有什么明显BUG,流程都能走通,但是嵌入到APP后,问题就来了! 在IOS上 ...
- Android 摇一摇之双甩功能
Android 摇一摇之双甩功能 最近做一个摇一摇的功能 网上相关代码很多 但是这次的需求有点奇葩 要求是摇两次才生效 看起来好像很简单 但真正要做遇到的问题还是很多 时间限制 机型灵敏性 摇动的方式 ...
- Android 4.3正式发布:四大新功能一览
在旧金山举行的新品发布会上,Google正式发布了Android 4.3,代号仍为“Jelly Bean”.此次更新并没有太大改变,只是紧跟4.1.4.2步伐, 新增了低功耗蓝牙.多用户登录等一系列功 ...
- Android 原生 Intent 分享支持的那些事
版权声明: 本账号发布文章均来自公众号,承香墨影(cxmyDev),版权归承香墨影所有. 每周会统一更新到这里,如果喜欢,可关注公众号获取最新文章. 未经允许,不得转载. 一.前言 对于一个 App ...
随机推荐
- 【主席树】BZOJ3524-[Poi2014]Couriers
[题目大意] 给一个长度为n的序列a.1≤a[i]≤n. m组询问,每次询问一个区间[l,r],是否存在一个数在[l,r]中出现的次数大于(r-l+1)/2.如果存在,输出这个数,否则输出0. [思路 ...
- ssm整合总结(一)--第一步之使用maven搭建一个web项目
本文内容来自:山硅谷,本文内容整合了任务2,任务3,任务4内容.http://www.gulixueyuan.com/my/course/50 1说明 1.1该项目使用的知识点有 1.1.1校验方式是 ...
- CountDownLatch源码分析
CountDownLatch.Semaphore(信号量)和ReentrantReadWriteLock.ReadLock(读锁)都采用AbstractOwnableSynchronizer共享排队的 ...
- python开发_dbm_键值对存储_完整_博主推荐
''' 在python的应用程序中,不需要关系型数据库时,如MySQL 可以使用python提供的持久字典dbm来存储名称和值(键值对) 这个类似于java的中的java.util.Map对象. 区别 ...
- Codeforces Beta Round #9 (Div. 2 Only) B. Running Student 水题
B. Running Student 题目连接: http://www.codeforces.com/contest/9/problem/B Description And again a misfo ...
- JLInk 各种版本图片收集
所有图片来自网络, 版权归原始所有者拥有. JLink V5 JLink V6 JLink V7 JLink V8 JLink V9 JLink Ultra JLink Pro
- ZigBee和Z-Wave的区别与未来
http://tech.c114.net/164/a702667.html ZigBee和Z-Wave短距离无线技术都用于远程监控和控制,但两种技术的规格和应用却不同.在美国应用越来越广泛的家庭局域网 ...
- 关于orcad元件库
ORCAD CAPTURE 零件库解析 ORCAD CAPTURE 零件库解析 1' AMPLIFIER.OLB 共182个零件,存放模拟放大器IC,如CA3280,TL027C,EL4093等. 2 ...
- GCC安装UBUNTU
在Ubuntu下安装GCC和其他一些Linux系统有点不一样. 方法一: 该方法超简单:sudo apt-get build-depgcc 就上面这条命令就可以搞定 方法二:sudo apt-get ...
- mysql配置文件my.ini优化详解
mysql 5.5.13参数说明:[client]character-set-server = utf8port = 3306socket = /data/mysql/3306/mysql.sock[ ...