背景介绍
- 安卓AOSP(Android Open Source Project)开发概述
- U盘插入时自动创建目录的默认行为
在安卓AOSP开发中,插入U盘时系统会自动创建一些默认目录,如Music、Pictures等。若需取消这一行为,可以通过修改系统源码来实现。
- 固定目录的内容在
packages/providers/MediaProvider/src/com/android/providers/media/util/FileUtils.java
中。
public static final String[] DEFAULT_FOLDER_NAMES;
static {
if (SdkLevel.isAtLeastS()) {
DEFAULT_FOLDER_NAMES = new String[]{
Environment.DIRECTORY_MUSIC,
Environment.DIRECTORY_PODCASTS,
Environment.DIRECTORY_RINGTONES,
Environment.DIRECTORY_ALARMS,
Environment.DIRECTORY_NOTIFICATIONS,
Environment.DIRECTORY_PICTURES,
Environment.DIRECTORY_MOVIES,
Environment.DIRECTORY_DOWNLOADS,
Environment.DIRECTORY_DCIM,
Environment.DIRECTORY_DOCUMENTS,
Environment.DIRECTORY_AUDIOBOOKS,
Environment.DIRECTORY_RECORDINGS,
};
} else {
DEFAULT_FOLDER_NAMES = new String[]{
Environment.DIRECTORY_MUSIC,
Environment.DIRECTORY_PODCASTS,
Environment.DIRECTORY_RINGTONES,
Environment.DIRECTORY_ALARMS,
Environment.DIRECTORY_NOTIFICATIONS,
Environment.DIRECTORY_PICTURES,
Environment.DIRECTORY_MOVIES,
Environment.DIRECTORY_DOWNLOADS,
Environment.DIRECTORY_DCIM,
Environment.DIRECTORY_DOCUMENTS,
Environment.DIRECTORY_AUDIOBOOKS,
DIRECTORY_RECORDINGS,
};
}
}
- 取消自动创建目录的需求场景,某些客户提出不想在插入U盘时创建这些目录。
修改AOSP源码的步骤
- 定位相关源码文件
packages/providers/MediaProvider
- 修改U盘挂载时的目录创建逻辑
- 编译与测试修改后的系统镜像
在修改完成后使用mm -j8将编译后的MediaProvider推入设备中重启即可生效,插入U盘验证会发现不会再生成那些固定的目录了
具体实现细节
- 修改
MediaProvider
服务中的挂载逻辑 - 调整
packages/providers/MediaProvider/src/com/android/providers/media/MediaProvider.java
中的目录创建逻辑 - 具体修改如下
在ensureDefaultFolders方法中加入 如下代码 getCreatefolders() 方法为可以实现定制的内容,不生成固定目录返回 true 或者false
try{
//final File path = getVolumePath(volume.getPath());
final StorageVolume vol = mStorageManager.getStorageVolume(volume.getPath());
if (vol != null && !vol.isPrimary()) {
Log.d(TAG, "ensureDefaultFolders paths ");
if(getCreatefolders()){
Log.d(TAG, "External U disk does not create folders paths ");
return;
}
}
}catch(Exception e){
e.printStackTrace();
}
private boolean getCreatefolders() {
return SystemProperties.get("persist.sys.floders", "0").equals("0");
}
在ensureThumbnailsValid 方法中添加
if (!dir.exists()) {
if (vol != null && vol.isPrimary()) {
dir.mkdirs();
}else{
if(getCreatefolders()){
return;
}else{
dir.mkdirs();
}
}
}
测试与验证
- 插入U盘并检查目录是否自动创建,可先将U盘格式化后插入查看是否任然创建固定目录。
参考资源
- 安卓AOSP官方文档
- 相关技术博客与论坛讨论
- 开源项目与代码示例安卓AOSP开发,取消插入板卡时U盘自动创建Music等目录