sm指令分析
来源:互联网 发布:上传文件夹到linux 编辑:程序博客网 时间:2024/04/25 21:57
1, 概述
Sm主要和android机器的存储相关。
主要命令有list-disks/ list-volumes等
2,详细流程
Sm.java很简单,所以直接附上整个java类,如下
public final class Sm { private static final String TAG = "Sm"; IMountService mSm; private String[] mArgs; private int mNextArg; private String mCurArgData; public static void main(String[] args) { boolean success = false; try { new Sm().run(args); success = true; } catch (Exception e) { if (e instanceof IllegalArgumentException) { showUsage(); } Log.e(TAG, "Error", e); System.err.println("Error: " + e); } System.exit(success ? 0 : 1); } public void run(String[] args) throws Exception { if (args.length < 1) { throw new IllegalArgumentException(); } mSm = IMountService.Stub.asInterface(ServiceManager.getService("mount")); if (mSm == null) { throw new RemoteException("Failed to find running mount service"); } mArgs = args; String op = args[0]; mNextArg = 1; if ("list-disks".equals(op)) { runListDisks(); } else if ("list-volumes".equals(op)) { runListVolumes(); } else if ("has-adoptable".equals(op)) { runHasAdoptable(); } else if ("get-primary-storage-uuid".equals(op)) { runGetPrimaryStorageUuid(); } else if ("set-force-adoptable".equals(op)) { runSetForceAdoptable(); } else if ("partition".equals(op)) { runPartition(); } else if ("mount".equals(op)) { runMount(); } else if ("unmount".equals(op)) { runUnmount(); } else if ("format".equals(op)) { runFormat(); } else if ("benchmark".equals(op)) { runBenchmark(); } else if ("forget".equals(op)) { runForget(); } else { throw new IllegalArgumentException(); } } public void runListDisks() throws RemoteException { final boolean onlyAdoptable = "adoptable".equals(nextArg()); final DiskInfo[] disks = mSm.getDisks(); for (DiskInfo disk : disks) { if (!onlyAdoptable || disk.isAdoptable()) { System.out.println(disk.getId()); } } } public void runListVolumes() throws RemoteException { final String filter = nextArg(); final int filterType; if ("public".equals(filter)) { filterType = VolumeInfo.TYPE_PUBLIC; } else if ("private".equals(filter)) { filterType = VolumeInfo.TYPE_PRIVATE; } else if ("emulated".equals(filter)) { filterType = VolumeInfo.TYPE_EMULATED; } else { filterType = -1; } final VolumeInfo[] vols = mSm.getVolumes(0); for (VolumeInfo vol : vols) { if (filterType == -1 || filterType == vol.getType()) { final String envState = VolumeInfo.getEnvironmentForState(vol.getState()); System.out.println(vol.getId() + " " + envState + " " + vol.getFsUuid()); } } } public void runHasAdoptable() { System.out.println(SystemProperties.getBoolean(StorageManager.PROP_HAS_ADOPTABLE, false)); } public void runGetPrimaryStorageUuid() throws RemoteException { System.out.println(mSm.getPrimaryStorageUuid()); } public void runSetForceAdoptable() throws RemoteException { final boolean forceAdoptable = Boolean.parseBoolean(nextArg()); mSm.setDebugFlags(forceAdoptable ? StorageManager.DEBUG_FORCE_ADOPTABLE : 0, StorageManager.DEBUG_FORCE_ADOPTABLE); } public void runPartition() throws RemoteException { final String diskId = nextArg(); final String type = nextArg(); if ("public".equals(type)) { mSm.partitionPublic(diskId); } else if ("private".equals(type)) { mSm.partitionPrivate(diskId); } else if ("mixed".equals(type)) { final int ratio = Integer.parseInt(nextArg()); mSm.partitionMixed(diskId, ratio); } else { throw new IllegalArgumentException("Unsupported partition type " + type); } } public void runMount() throws RemoteException { final String volId = nextArg(); mSm.mount(volId); } public void runUnmount() throws RemoteException { final String volId = nextArg(); mSm.unmount(volId); } public void runFormat() throws RemoteException { final String volId = nextArg(); mSm.format(volId); } public void runBenchmark() throws RemoteException { final String volId = nextArg(); mSm.benchmark(volId); } public void runForget() throws RemoteException{ final String fsUuid = nextArg(); if ("all".equals(fsUuid)) { mSm.forgetAllVolumes(); } else { mSm.forgetVolume(fsUuid); } } private String nextArg() { if (mNextArg >= mArgs.length) { return null; } String arg = mArgs[mNextArg]; mNextArg++; return arg; } private static int showUsage() { System.err.println("usage: sm list-disks [adoptable]"); System.err.println(" sm list-volumes [public|private|emulated|all]"); System.err.println(" sm has-adoptable"); System.err.println(" sm get-primary-storage-uuid"); System.err.println(" sm set-force-adoptable [true|false]"); System.err.println(""); System.err.println(" sm partition DISK [public|private|mixed] [ratio]"); System.err.println(" sm mount VOLUME"); System.err.println(" sm unmount VOLUME"); System.err.println(" sm format VOLUME"); System.err.println(" sm benchmark VOLUME"); System.err.println(""); System.err.println(" sm forget [UUID|all]"); System.err.println(""); return 1; }}
0 0
- sm指令分析
- 为什么公司应该实施的Sm分析工具
- 蓝牙协议分析(11)_BLE安全机制之SM
- SM tips
- SM$TS
- js---SM
- sm整合
- PVFS2源代码分析之用户系统接口src/client/sysin/sys-get-eattr.sm状态机描述
- AutoEventWireup指令分析
- 三指令分析
- #pragma 预处理指令分析
- adr指令分析
- enter 指令分析
- powerpc汇编指令分析
- oPcode 指令代码分析
- media指令分析
- Settings指令分析
- 原子指令分析
- #define 高级用法(Ex) __FILE__ __FUNCTION__ __LINE__
- UNIX 进程--多任务原理
- MyEclipse快捷键大全
- 类初始化的顺序问题
- 树形图菜单级多级菜单显示
- sm指令分析
- mate9 的调节
- 表达式求值 递归实现(c/c++)
- 著名的北邮ACM推荐50题
- Longest Palindromic Substring
- session与cookie使用区别
- 深入理解三次握手与四次挥手
- 2017阿里技术一面总结(渣硕实习春招之路,美团offer)
- 并查集