{"id":254653,"date":"2014-05-16T11:12:42","date_gmt":"2014-05-16T03:12:42","guid":{"rendered":"http:\/\/blog.zhenglei.net\/?p=254653"},"modified":"2014-05-16T11:12:42","modified_gmt":"2014-05-16T03:12:42","slug":"android-mount-sdcard-again","status":"publish","type":"post","link":"https:\/\/blog.zhenglei.net\/?p=254653","title":{"rendered":"Android mount sdcard (again)"},"content":{"rendered":"<div>\n<p>===&gt;\u00a0 execute_media_format<br \/>\nandroid\/packages\/apps\/Settings\/src\/com\/android\/settings\/MediaFormat.java<\/p>\n<p>===&gt;\u00a0 mountService.formatVolume(extStoragePath);<br \/>\nandroid\/frameworks\/base\/core\/java\/com\/android\/internal\/os\/storage\/ExternalStorageFormatter.java<\/p>\n<p>====&gt;\u00a0 formatVolume<br \/>\n====&gt;\u00a0 doFormatVolume<br \/>\nandroid\/frameworks\/base\/services\/java\/com\/android\/server\/MountService.java<\/p>\n<p>===&gt; int CommandListener::VolumeCmd::runCommand<br \/>\n===&gt; rc = vm-&gt;formatVolume(argv[2]);<br \/>\nandroid\/system\/vold\/CommandListener.cpp<\/p>\n<p>==&gt; int VolumeManager::formatVolume<br \/>\n==&gt; mVolumes = new VolumeCollection();<br \/>\n==&gt; return v-&gt;formatVol()<br \/>\nandroid\/system\/vold\/VolumeManager.h<br \/>\nandroid\/system\/vold\/VolumeManager.cpp<\/p>\n<p>===&gt; int Volume::formatVol<br \/>\n===&gt; Fat::format(devicePath, 0))<br \/>\nandroid\/system\/vold\/Volume.cpp<\/p>\n<p>===&gt; int Fat::format(const char *fsPath, unsigned int numSectors)<br \/>\n===&gt; static char MKDOSFS_PATH[] = \u201c\/system\/bin\/newfs_msdos\u201d<br \/>\nandroid\/system\/vold\/Fat.cpp<\/p>\n<p>android\/frameworks\/base\/services\/java\/com\/android\/server\/NativeDaemonConnector.java<\/p>\n<p># C code<br \/>\nandroid\/system\/vold<\/p>\n<p># Launch sd formater in setting<br \/>\nadb shell<br \/>\nam start -n com.android.settings\/.MediaFormat<\/p>\n<p>##############################################################################<\/p>\n<p>\u4ee5\u4e0b\u662f\u6253\u5f00\u201c\u65e0\u7ebf\u548c\u7f51\u7edc\u8bbe\u7f6e\u201d\u754c\u9762\uff1a<\/p>\n<p>Intent intent = new Intent(\u201c\/\u201d);<br \/>\nComponentName cm = new ComponentName(\u201ccom.android.settings\u201d,\u201dcom.android.settings.WirelessSettings\u201d);<br \/>\nintent.setComponent(cm);<br \/>\nintent.setAction(\u201candroid.intent.action.VIEW\u201d);<br \/>\nactivity.startActivityForResult( intent , 0);<\/p>\n<p>\u4ee5\u4e0b\u662f\u53ef\u4ee5\u76f4\u63a5\u6253\u5f00\u7684\u7cfb\u7edf\u754c\u9762\uff1a<\/p>\n<p>com.android.settings.AccessibilitySettings \u8f85\u52a9\u529f\u80fd\u8bbe\u7f6e<br \/>\ncom.android.settings.ActivityPicker \u9009\u62e9\u6d3b\u52a8<br \/>\ncom.android.settings.ApnSettings APN\u8bbe\u7f6e<br \/>\ncom.android.settings.ApplicationSettings \u5e94\u7528\u7a0b\u5e8f\u8bbe\u7f6e<br \/>\ncom.android.settings.BandMode \u8bbe\u7f6eGSM\/UMTS\u6ce2\u6bb5<br \/>\ncom.android.settings.BatteryInfo \u7535\u6c60\u4fe1\u606f<br \/>\ncom.android.settings.DateTimeSettings \u65e5\u671f\u548c\u65f6\u95f4\u8bbe\u7f6e<br \/>\ncom.android.settings.DateTimeSettingsSetupWizard \u65e5\u671f\u548c\u65f6\u95f4\u8bbe\u7f6e<br \/>\ncom.android.settings.DevelopmentSettings \u5e94\u7528\u7a0b\u5e8f\u8bbe\u7f6e=\u300b\u5f00\u53d1\u8bbe\u7f6e<br \/>\ncom.android.settings.DeviceAdminSettings \u8bbe\u5907\u7ba1\u7406\u5668<br \/>\ncom.android.settings.DeviceInfoSettings \u5173\u4e8e\u624b\u673a<br \/>\ncom.android.settings.Display \u663e\u793a\u2014\u2014\u8bbe\u7f6e\u663e\u793a\u5b57\u4f53\u5927\u5c0f\u53ca\u9884\u89c8<br \/>\ncom.android.settings.DisplaySettings \u663e\u793a\u8bbe\u7f6e<br \/>\ncom.android.settings.DockSettings \u5e95\u5ea7\u8bbe\u7f6e<br \/>\ncom.android.settings.IccLockSettings SIM\u5361\u9501\u5b9a\u8bbe\u7f6e<br \/>\ncom.android.settings.InstalledAppDetails \u8bed\u8a00\u548c\u952e\u76d8\u8bbe\u7f6e<br \/>\ncom.android.settings.LanguageSettings \u8bed\u8a00\u548c\u952e\u76d8\u8bbe\u7f6e<br \/>\ncom.android.settings.LocalePicker \u9009\u62e9\u624b\u673a\u8bed\u8a00<br \/>\ncom.android.settings.LocalePickerInSetupWizard \u9009\u62e9\u624b\u673a\u8bed\u8a00<br \/>\ncom.android.settings.ManageApplications \u5df2\u4e0b\u8f7d\uff08\u5b89\u88c5\uff09\u8f6f\u4ef6\u5217\u8868<br \/>\ncom.android.settings.MasterClear \u6062\u590d\u51fa\u5382\u8bbe\u7f6e<br \/>\ncom.android.settings.MediaFormat \u683c\u5f0f\u5316\u624b\u673a\u95ea\u5b58<br \/>\ncom.android.settings.PhysicalKeyboardSettings \u8bbe\u7f6e\u952e\u76d8<br \/>\ncom.android.settings.PrivacySettings \u9690\u79c1\u8bbe\u7f6e<br \/>\ncom.android.settings.ProxySelector \u4ee3\u7406\u8bbe\u7f6e<br \/>\ncom.android.settings.RadioInfo \u624b\u673a\u4fe1\u606f<br \/>\ncom.android.settings.RunningServices \u6b63\u5728\u8fd0\u884c\u7684\u7a0b\u5e8f\uff08\u670d\u52a1\uff09<br \/>\ncom.android.settings.SecuritySettings \u4f4d\u7f6e\u548c\u5b89\u5168\u8bbe\u7f6e<br \/>\ncom.android.settings.Settings \u7cfb\u7edf\u8bbe\u7f6e<br \/>\ncom.android.settings.SettingsSafetyLegalActivity \u5b89\u5168\u4fe1\u606f<br \/>\ncom.android.settings.SoundSettings \u58f0\u97f3\u8bbe\u7f6e<br \/>\ncom.android.settings.TestingSettings \u6d4b\u8bd5\u2014\u2014\u663e\u793a\u624b\u673a\u4fe1\u606f\u3001\u7535\u6c60\u4fe1\u606f\u3001\u4f7f\u7528\u60c5\u51b5\u7edf\u8ba1\u3001Wifi information\u3001\u670d\u52a1\u4fe1\u606f<br \/>\ncom.android.settings.TetherSettings \u7ed1\u5b9a\u4e0e\u4fbf\u643a\u5f0f\u70ed\u70b9<br \/>\ncom.android.settings.TextToSpeechSettings \u6587\u5b57\u8f6c\u8bed\u97f3\u8bbe\u7f6e<br \/>\ncom.android.settings.UsageStats \u4f7f\u7528\u60c5\u51b5\u7edf\u8ba1<br \/>\ncom.android.settings.UserDictionarySettings \u7528\u6237\u8bcd\u5178<br \/>\ncom.android.settings.VoiceInputOutputSettings \u8bed\u97f3\u8f93\u5165\u4e0e\u8f93\u51fa\u8bbe\u7f6e<br \/>\ncom.android.settings.WirelessSettings \u65e0\u7ebf\u548c\u7f51\u7edc\u8bbe\u7f6e<\/p>\n<p>##############################################################################<br \/>\nGenerate SD Card Image file<\/p>\n<p>#64G:<br \/>\ndd if=\/dev\/zero of=64G.img\u00a0 count=0 seek=128M<\/p>\n<p>#8G:<br \/>\ndd if=\/dev\/zero of=64G.img\u00a0 count=0 seek=16M<\/p>\n<p>#8G (with zero filled)<br \/>\ndd if=\/dev\/zero of=64G.img count=16M<\/p>\n<p>##############################################################################<br \/>\nLoop device<\/p>\n<p>#List loop devices:<br \/>\nlosetup -a<\/p>\n<p>#Add a loop device<br \/>\nlosetup \/dev\/loop1 8G_zero.img<\/p>\n<p>#Delete loop device<br \/>\nlosetup -d \/dev\/loop1<\/p>\n<p>find . -type f |xargs grep sd_format<br \/>\nfind . -name *.java |xargs grep sd_format<\/p>\n<p>###################################################################<br \/>\nModify sd_format of android\/packages\/apps\/Settings\/res\/values, impact on:<\/p>\n<p>target R.java\/Manifest.java: Settings (out\/target\/common\/obj\/APPS\/Settings_intermediates\/src\/R.stamp)<br \/>\ntarget Java: Settings (out\/target\/common\/obj\/APPS\/Settings_intermediates\/classes)<br \/>\nNote: Some input files use or override a deprecated API.<br \/>\nNote: Recompile with -Xlint:deprecation for details.<br \/>\nNote: Some input files use unchecked or unsafe operations.<br \/>\nNote: Recompile with -Xlint:unchecked for details.<br \/>\nCopying: out\/target\/common\/obj\/APPS\/Settings_intermediates\/classes-jarjar.jar<br \/>\nCopying: out\/target\/common\/obj\/APPS\/Settings_intermediates\/emma_out\/lib\/classes-jarjar.jar<br \/>\nCopying: out\/target\/common\/obj\/APPS\/Settings_intermediates\/classes.jar<br \/>\nCopying: out\/target\/common\/obj\/APPS\/Settings_intermediates\/noproguard.classes.jar<br \/>\ntarget Dex: Settings<br \/>\nCopying: out\/target\/common\/obj\/APPS\/Settings_intermediates\/noproguard.classes.dex<br \/>\ntarget Package: Settings (out\/target\/product\/generic\/obj\/APPS\/Settings_intermediates\/package.apk)<br \/>\n\u2018out\/target\/common\/obj\/APPS\/Settings_intermediates\/classes.dex\u2019 as \u2018classes.dex\u2019\u2026<br \/>\nProcessing target\/product\/generic\/obj\/APPS\/Settings_intermediates\/package.apk<br \/>\nDone!<br \/>\nInstall: out\/target\/product\/generic\/system\/app\/Settings.odex<br \/>\nInstall: out\/target\/product\/generic\/system\/app\/Settings.apk<br \/>\nFinding NOTICE files: out\/target\/product\/generic\/obj\/NOTICE_FILES\/hash-timestamp<br \/>\nCombining NOTICE files: out\/target\/product\/generic\/obj\/NOTICE.html<br \/>\ntarget Java: SettingsTests (out\/target\/common\/obj\/APPS\/SettingsTests_intermediates\/classes)<br \/>\nNote: Some input files use or override a deprecated API.<br \/>\nNote: Recompile with -Xlint:deprecation for details.<br \/>\nInstalled file list: out\/target\/product\/generic\/installed-files.txt<br \/>\nTarget system fs image: out\/target\/product\/generic\/obj\/PACKAGING\/systemimage_intermediates\/system.img<br \/>\nInstall system fs image: out\/target\/product\/generic\/system.img<\/p>\n<p>******************************************************<br \/>\nSD FORMAT<\/p>\n<p>==&gt; StorageVolumePreferenceCategory<br \/>\n==&gt; mAllowFormat = mStorageVolume != null &amp;&amp; !mStorageVolume.isEmulated()<br \/>\nandroid\/packages\/apps\/Settings\/src\/com\/android\/settings\/deviceinfo\/StorageVolumePreferenceCategory.java<\/p>\n<p>SD Card Mount<\/p>\n<p>=&gt; \u201cPreparing SD card\u201d<br \/>\n=&gt; \u201cDamaged SD card\u201d<br \/>\n==&gt; ext_media_checking_notification_title<br \/>\n==&gt; ext_media_unmountable_notification_title<br \/>\nframeworks\/base\/core\/res\/res\/values\/strings.xml<br \/>\nframeworks\/base\/packages\/SystemUI\/src\/com\/android\/systemui\/usb\/StorageNotification.java<br \/>\n===&gt;MEDIA_UNMOUNTABLE<\/p>\n<p>*****************************************************<\/p>\n<p>#\/system\/etc\/vold.fatab<br \/>\n#\/system\/etc\/vold.conf<\/p>\n<p>=&gt;fatab<br \/>\n==&gt;system\/vold\/main.cpp<br \/>\n===&gt;process_config<br \/>\n====&gt;VolumeManager<br \/>\n=====&gt;system\/vold\/VolumeManager.cpp<br \/>\n=======&gt;CommandListener<br \/>\n========&gt;system\/vold\/CommandListener.cpp<\/p>\n<p>********************************<br \/>\nFAT<br \/>\n===&gt; system\/vold\/Fat.cpp<br \/>\n====&gt; FSCK_MSDOS_PATH<br \/>\n=====&gt; Fat::check<br \/>\n======&gt;system\/vold\/Volume.cpp<br \/>\n=======&gt;createDeviceNode<br \/>\n=========&gt;Volume::mountVol<br \/>\n=========&gt;DirectVolume::handleBlockEvent<\/p>\n<p>Volume::mountVol<br \/>\n==&gt; No impact on SDCard Mount, just for security fs<\/p>\n<p>DirectVolume::handleBlockEvent<br \/>\n==&gt;NetlinkEvent<br \/>\n===&gt;system\/core\/include\/sysutils\/NetlinkEvent.h<br \/>\n=====&gt;NetlinkEvent.mSubsystem==\u201dblock\u201d, send to volume manage ==&gt; DirectVolume::handleBlockEvent<br \/>\n======&gt;NlActionAdd<br \/>\n========&gt;system\/core\/libsysutils\/src\/NetlinkEvent.cpp<\/p>\n<p>==========&gt;system\/core\/libsysutils\/src\/NetlinkListener.cpp<br \/>\n==========&gt;NetlinkListener::onDataAvailable<\/p>\n<p>============&gt;system\/core\/libsysutils\/src\/SocketListener.cpp<br \/>\n============&gt;system\/core\/include\/sysutils\/NetlinkListener.h<br \/>\n============&gt;class NetlinkListener : public SocketListener<\/p>\n<p>***************************************************************************************<br \/>\n*** Triger of\u00a0 NlActionAdd ***<\/p>\n<p>\u201cadd\u201d:<br \/>\n=&gt;NetlinkEvent::parseAsciiNetlinkMessage,\u00a0\u00a0\u00a0 system\/core\/libsysutils\/src\/NetlinkEvent.cpp<br \/>\n==&gt;NetlinkEvent::decode<br \/>\n===&gt;NetlinkListener::onDataAvailable,\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 system\/core\/libsysutils\/src\/NetlinkListener.cpp<br \/>\n====&gt;SocketListener::runListener,\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 system\/core\/libsysutils\/src\/SocketListener.cpp<br \/>\n=====&gt;SocketListener::threadStart,\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 system\/core\/libsysutils\/src\/SocketListener.cpp<br \/>\n======&gt;SocketListener::startListener,\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 system\/core\/libsysutils\/src\/SocketListener.cpp<br \/>\n=======&gt;main,\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 system\/vold\/main.cpp<br \/>\n=======&gt;NetlinkHandler::start,\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 system\/vold\/NetlinkHandler.cpp<\/p>\n<p>*** Handle of NlActionAdd ***<\/p>\n<p>\u201cNlActionAdd\u201d<br \/>\n=&gt;DirectVolume::handleBlockEvent,\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 system\/vold\/DirectVolume.cpp<br \/>\n==&gt;VolumeManager::handleBlockEvent,\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 system\/vold\/VolumeManager.cpp<br \/>\n==&gt;NetlinkHandler::onEvent,\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 system\/vold\/NetlinkHandler.cpp<\/p>\n<p>**************************************************************************<br \/>\nFramework:\u00a0\u00a0 MountService<\/p>\n<p>frameworks\/base\/services\/java\/com\/android\/server\/SystemServer.java<br \/>\n=&gt;public MountService(Context context),\u00a0\u00a0\u00a0\u00a0 frameworks\/base\/services\/java\/com\/android\/server\/MountService.java<br \/>\n==&gt;mContext.registerReceiver(mBroadcastReceiver, filter, null, null);<br \/>\n===&gt;BroadcastReceiver mBroadcastReceiver = new BroadcastReceiver()<br \/>\n====&gt;action.equals(Intent.ACTION_BOOT_COMPLETED)<br \/>\n=====&gt;if (state.equals(Environment.MEDIA_UNMOUNTED)) {<br \/>\nint rc = doMountVolume(path);<br \/>\nif (rc != StorageResultCode.OperationSucceeded) {<br \/>\nSlog.e(TAG, String.format(\u201cBoot-time mount failed (%d)\u201d,<br \/>\nrc));<br \/>\n}<br \/>\n======&gt;private int doMountVolume(String path)<br \/>\n=======&gt;mConnector.doCommand(String.format(\u201cvolume mount %s\u201d, path));<\/p>\n<p>==&gt;mConnector = new NativeDaemonConnector<br \/>\n===&gt;class NativeDaemonConnector,\u00a0\u00a0\u00a0 frameworks\/base\/services\/java\/com\/android\/server\/NativeDaemonConnector<br \/>\n====&gt;public void run(),\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 frameworks\/base\/services\/java\/com\/android\/server\/NativeDaemonConnector.java<br \/>\n=====&gt;listenToSocket,\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 frameworks\/base\/services\/java\/com\/android\/server\/NativeDaemonConnector.java<br \/>\n======&gt;mCallbacks.onDaemonConnected();\u00a0\u00a0\u00a0\u00a0 (mCallbacks=MountService)<br \/>\n=======&gt;onDaemonConnected()\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 frameworks\/base\/services\/java\/com\/android\/server\/MountService.java<\/p>\n<p>**********************************************************************************<br \/>\nSd Card Mount Summary:<\/p>\n<p>frameworks\/base\/services\/java\/com\/android\/server\/MountService.java:<br \/>\nprivate int doMountVolume(String path):<\/p>\n<p>Use case of doMountVolume<\/p>\n<p>Case 1:\u00a0 private final BroadcastReceiver mBroadcastReceiver = new BroadcastReceiver()<br \/>\n===&gt; Boot up SD Card mount<\/p>\n<p>Case 2:\u00a0 public boolean onEvent(int code, String raw, String[] cooked)<br \/>\n===&gt;frameworks\/base\/services\/java\/com\/android\/server\/NativeDaemonConnector.java<br \/>\n===&gt;Callback<br \/>\n===&gt;public boolean handleMessage(Message msg)<br \/>\n===&gt; SD Card Insert mount<\/p>\n<p>Case 3: public int mountVolume(String path)<br \/>\n==&gt; packages\/apps\/Settings\/src\/com\/android\/settings\/deviceinfo\/Memory.java<br \/>\n==&gt; User Setting\/Mount<\/p>\n<p>Case 4: public int mountVolume(String path)<br \/>\n===&gt; frameworks\/base\/core\/java\/com\/android\/internal\/os\/storage\/ExternalStorageFormatter.java<br \/>\n===&gt; Factory Reset<\/p>\n<\/div>\n","protected":false},"excerpt":{"rendered":"<p>===&gt;\u00a0 execute_media_format android\/pa &hellip; <a href=\"https:\/\/blog.zhenglei.net\/?p=254653\">\u7ee7\u7eed\u9605\u8bfb <span class=\"meta-nav\">&rarr;<\/span><\/a><\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[5,2,18],"tags":[129],"class_list":["post-254653","post","type-post","status-publish","format-standard","hentry","category-android","category-linux","category-software-download","tag-sdcard"],"_links":{"self":[{"href":"https:\/\/blog.zhenglei.net\/index.php?rest_route=\/wp\/v2\/posts\/254653","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/blog.zhenglei.net\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blog.zhenglei.net\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blog.zhenglei.net\/index.php?rest_route=\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.zhenglei.net\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=254653"}],"version-history":[{"count":1,"href":"https:\/\/blog.zhenglei.net\/index.php?rest_route=\/wp\/v2\/posts\/254653\/revisions"}],"predecessor-version":[{"id":254654,"href":"https:\/\/blog.zhenglei.net\/index.php?rest_route=\/wp\/v2\/posts\/254653\/revisions\/254654"}],"wp:attachment":[{"href":"https:\/\/blog.zhenglei.net\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=254653"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.zhenglei.net\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=254653"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.zhenglei.net\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=254653"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}