更改安卓手机默认软件安装路径方法

本文介绍了一种简单的方法,可以通过对SD卡进行分区并将应用程序移动到SD卡上来扩展Android手机的存储空间。此方法适用于手机内存较小且经常需要安装新应用的用户。

谷歌Android系统手机默认只能把软件安装在手机内存里,使本来就不大的手机内存显得捉襟见肘。如果你也是个手机软件狂人,喜欢尝试各种各样新奇有趣的软件,面对越来越少的手机内存空间,不得不对已经安装的软件痛下**。你是否还在安装与卸载之间纠结?Follow Me!我们一起来给Android系统扩扩容,让“机器人”也可以“大肚能容”,免去存储空间不足的后顾之忧。

Tips:存储器分为随机存储器(RAM)和只读存储器(ROM)两种。手机ROM相当于PC上的硬盘,用于存储手机操作系统和软件,也叫FLASH ROM,决定手机存储空间的大小。手机RAM相当于PC的内存,其大小决定手机的运行速度。

要把大象装冰箱里总共分三步,而Android系统中把软件安装到SD卡上,比这还简单,两步就够了:

一、存储卡分区

首先我们需要对手机SD卡进行分区,分一个FAT32分区和一个Ext3分区,FAT32分区用于正常存储图片、音乐、视频等资料,而Linux格式的Ext3分区就是用于扩容安装软件的分区。以笔者的2G SD卡为例,FAT32分区1.35GB,Ext3分区494MB。下载并安装Acronis Disk Director Suite软件。将手机SD卡装入读卡器并连接电脑,然后运行Acronis DiskDirector Suite软件。

1.FAT32分区。找到代表SD卡的磁盘分区,点击右键,选择“删除”命令,删除已有分区。当成为“未分配”分区时,点击右键,选择“创建分区”,在弹出的对话框中,文件系统选择:FAT32,创建为“主分区”,设置好分区大小1.35GB,点击确定按钮。

2.Ext3分区。在剩余的494MB分区上,点击右键,选择“创建分区”,在弹出的对话框中,文件系统选择:Ext3,创建为“主分区”,设置好分区大小494MB,点击确定按钮。

3.确认分区。上述分区设定完成后,软件只是记录了分区操作,并没有真正在SD卡上进行分区。点击软件工具栏中的“提交”按钮,确认执行分区操作,提示“操作成功完成”说明分区成功了。

二、将软件移动到SD卡

存储卡分区完成后我们只需要把系统默认的软件安装目录/data/app转移到SD卡的Ext3分区上,然后通过ln命令建立软链接,使系统自动把软件安装到SD卡上,达到节省手机内存空间的目的。

将存储卡装回手机,重新启动,使系统识别到Ext3分区。在手机上运行超级终端,依次输入以下命令来验证系统是否识别了Ext3分区:

su

(会提示高级权限授权,选择“总是同意”)

busybox df –h

如果显示的列表中有/dev/block/mmcblk0p2的信息说明系统已成功识别了Ext3分区。

然后依次输入以下命令将/data/app目录转移到SD卡的Ext3分区:

cp –a /data/app /system/sd/

(将/data/app目录复制到/system/sd/下)

rm –r /data/app

(删除/data/app目录)

ln –s /system/sd/app /data/app

(建立软链接)

Reboot

(重启手机)

重启之后,手机上安装的所有软件就全部转移到了SD卡上,看看你的手机可用空间是不是增大了。以后再安装软件也是直接安装到SD卡上,不用担心空间不足的问题了,而且这样做还有一个好处,刷新ROM后,以前安装过的软件并没有被清除,还保存在SD卡上,输入下列命令就可以轻松恢复,不用再一一安装了,非常方便实用。

su

(取得高级权限)

cd /data

(进入/data目录)

cp –a app /system/sd/app

(将app目录中的内容复制到/system/sd/app目录)

rm –r app

(删除app目录)

ln –s /system/sd/app /data/app

(建立软链接)

reboot

(重新启动)

扩容效果体验:

刷新ROM后未安装任何软件,手机可用空间为87MB,安装若干软件后,可用空间下降为73MB。将软件目录转移到SD卡上后,可用空间变为80MB。可能有的“电筒”会有疑惑,为什么没恢复到87MB呢?这是因为我们只是将软件移动到了SD卡上,而软件的缓存数据仍然会占用手机内存,所以手机内存还是会下降。当然软件的缓存数据也可以移动到SD卡上,但这样会拖慢软件运行速度,所以不推荐大家使用。

注意事项:

1.软件移动到SD卡上后,原有的部分桌面插件会无法正常显示,删除后,重新加入桌面即可。

2.SD卡的Ext3分区可以视为手机硬件的一部分,移除SD卡后,安装的软件将无法运行。插入SD卡,重新启动手机即可正常使用。 

 

 

 

 

http://wenku.baidu.com/link?url=OI7x7M4uINYxYgWJbWPl3y78poSGMC0_Vo3KHm351-_nW9ChlpEofetbcKUlhnaaBMfKibiH5e-QKbfyXSDpDbgTzouzNnm2SvMWI6mjSky&from_mod=copy_login

<think>我们正在处理一个关于修改Android Camera2应用默认存储路径的问题。用户希望修改Android源代码中的Camera2应用的默认存储路径。根据之前的对话,用户可能遇到了编译错误,但当前问题聚焦于修改Camera2的存储路径。 在Android中,相机应用的存储路径通常由系统设置中的存储选项决定,但如果我们想修改默认存储路径(例如从内部存储改为外部SD卡),我们需要在系统级别进行修改。 步骤: 1. 了解Camera2应用存储路径的设定机制:在Android系统中,相机应用通常使用MediaStore来存储图片和视频,而MediaStore的存储位置由系统设置中的默认存储位置决定。但是,我们可能需要修改Camera2应用本身的代码来改变其默认行为。 2. 定位Camera2应用的源代码:Camera2应用位于AOSP的packages/apps/Camera2目录下。 3. 查找设置存储路径的相关代码:在Camera2应用中,存储路径的设置可能位于创建文件指定的URI。通常,在保存图片或视频,应用会通过ContentResolver向MediaStore插入一条记录,并获取一个URI,然后通过这个URI获取输出流。MediaStore会根据系统的默认存储设置来决定存储位置(内部存储或外部SD卡)。但是,如果我们想要强制修改为特定路径,我们需要修改插入MediaStore的参数。 4. 修改默认存储路径:我们可以尝试修改Camera2应用中保存媒体文件使用的URI。在Android中,MediaStore允许指定不同的存储卷(volume),我们可以通过指定外部存储卷的URI来保存到SD卡。 然而,请注意,Android从Q(10)开始引入了作用域存储(Scoped Storage),因此修改存储路径可能需要考虑新的存储机制。 具体步骤: 在Camera2应用中,保存图片和视频的代码可能位于src/com/android/camera/Storage.java(注意:不同版本的AOSP可能路径不同,但类名相似)。我们需要找到创建文件URI的地方。 例如,在插入图片到MediaStore,我们可能会看到类似这样的代码: ```java ContentValues values = new ContentValues(); values.put(MediaStore.Images.Media.DISPLAY_NAME, title); values.put(MediaStore.Images.Media.MIME_TYPE, "image/jpeg"); values.put(MediaStore.Images.Media.DATE_TAKEN, System.currentTimeMillis()); values.put(MediaStore.Images.Media.RELATIVE_PATH, Environment.DIRECTORY_DCIM + "/Camera"); Uri uri = getContentResolver().insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values); ``` 注意:上面的`MediaStore.Images.Media.EXTERNAL_CONTENT_URI`指向的是默认的外部存储(通常是内部存储模拟的外部存储)。如果我们想要存储到SD卡,我们需要使用代表SD卡的URI。 如何获取SD卡的URI?在Android中,我们可以通过MediaStore.getExternalVolumeNames()获取所有外部存储卷的名称,然后通过MediaStore.Images.Media.getContentUri(volumeName)来获取特定卷的URI。 但是,由于系统相机是系统应用,它可能具有更高的权限,可以直接访问外部存储卷。我们可以尝试修改插入操作使用的URI,将其指向外部SD卡。 然而,默认情况下,系统相机应该遵循系统设置的默认存储位置。如果我们想要强制修改为SD卡,我们需要忽略系统设置,直接使用SD卡的URI。 实现步骤: 1. 在Storage.java中,找到获取URI的方法(可能是`addImage`或`addVideo`等方法)。 2. 修改插入的URI,从`MediaStore.Images.Media.EXTERNAL_CONTENT_URI`改为SD卡的URI。 如何获取SD卡的URI?我们可以通过以下方式: 在Android中,外部存储卷(包括SD卡)可以通过`MediaStore.getExternalVolumeNames(Context)`获取。通常,内置的外部存储卷名称是"external_primary",而SD卡可能是类似"xxxx-xxxx"(卷ID)的字符串。我们可以通过遍历这些卷并判断哪个是SD卡(可移动存储)来获取。 但是,由于系统相机是系统应用,它可能具有访问所有存储的权限,我们可以尝试使用以下方法: ```java // 获取所有存储卷 Set<String> volumeNames = MediaStore.getExternalVolumeNames(context); for (String volumeName : volumeNames) { // 跳过主外部存储(内部存储) if (volumeName.equals(MediaStore.VOLUME_EXTERNAL_PRIMARY)) { continue; } // 使用这个卷(假设只有一个SD卡) Uri uri = MediaStore.Images.Media.getContentUri(volumeName); // 然后使用这个uri进行插入 // ... 插入操作 } ``` 但是,请注意,这种方法可能会在多个外部存储卷的情况下出现问题(比如多个SD卡?),而且我们需要确保在插入之前该存储卷是可写的。 另外,我们还需要考虑系统设置中是否有默认存储位置的设置,并可能覆盖用户的选择。如果系统设置中已经设置了默认存储为SD卡,那么系统相机应该会自动使用SD卡。因此,修改系统设置可能是另一种方法。 但是,用户要求修改Camera2应用的源代码,所以我们直接修改应用。 另一种思路:修改插入MediaStore的RELATIVE_PATH,直接指定一个在SD卡上的路径。但是,在Android Q及以后,应用只能通过MediaStore API访问外部存储,并且只能访问自己创建的或者授权的文件。而系统相机具有系统权限,可以访问所有存储卷。然而,MediaStore插入,RELATIVE_PATH是相对于卷的,所以我们可以指定卷和路径。 例如,我们可以将插入的URI改为SD卡的URI,然后RELATIVE_PATH设置为Environment.DIRECTORY_DCIM + "/Camera",这样就会保存在SD卡的DCIM/Camera目录下。 具体修改: 在Storage.java中,找到插入图片或视频的地方,将插入的URI改为SD卡的URI(如果SD卡存在的话),否则回退到内部存储。 示例代码(修改插入图片的URI): ```java // 原代码可能是: // Uri uri = getContentResolver().insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values); // 修改为: Uri uri = null; // 获取所有外部卷 Set<String> volumeNames = MediaStore.getExternalVolumeNames(context); for (String volumeName : volumeNames) { if (volumeName.equals(MediaStore.VOLUME_EXTERNAL_PRIMARY)) { // 这是内部存储,跳过 continue; } // 尝试使用这个卷(假设是SD卡) Uri sdcardUri = MediaStore.Images.Media.getContentUri(volumeName); try { uri = getContentResolver().insert(sdcardUri, values); if (uri != null) { break; } } catch (Exception e) { // 插入失败,可能是该卷不可写,尝试下一个 } } // 如果SD卡插入失败,则使用内部存储 if (uri == null) { uri = getContentResolver().insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values); } ``` 注意:上面的代码只是一个示例,需要根据实际代码位置和逻辑进行调整。同,我们还需要考虑视频存储的修改,因为视频存储也是类似的。 另外,我们还需要考虑权限问题:系统相机应该已经具有写入外部存储的权限,所以不需要额外申请。 5. 编译并刷机:修改后,我们需要重新编译Camera2应用,或者重新编译整个系统(取决于我们的修改是否涉及其他模块),然后将系统刷入设备。 但是,用户之前遇到了编译错误,我们需要确保在修改代码后能够成功编译。 参考用户之前遇到的编译错误: ``` ninja: error: 'out/target/product/xxxx/system/bin/linker_asan64', needed by 'out/target/product/ xxxx/system/bin/asan_test', missing and no known rule to make it ``` 这个错误可能是由于编译配置问题导致的,与Camera2应用无关。用户可能需要检查编译环境是否完整,或者尝试重新初始化编译环境。 但是,当前问题是如何修改Camera2的存储路径,因此我们聚焦于代码修改。 注意:以上修改方案适用于Android Q及更高版本。对于较低版本的Android,可能需要不同的方法,因为MediaStore的API不同。 如果用户使用的是较旧版本的Android(例如Android N),那么存储路径的设置可能位于不同的地方。在旧版本中,我们可以直接指定文件路径,例如: ```java File sdcardDir = Environment.getExternalStorageDirectory(); // 这个返回的是内部存储的根目录 // 获取SD卡的路径在旧版本中可能是通过系统环境变量,或者挂载点 ``` 在旧版本中,修改存储路径可能需要直接修改文件保存的路径,例如: ```java // 假设我们要保存到SD卡,那么我们需要获取SD卡的挂载点 File sdCard = new File("/storage/sdcard1"); // 这是一个例子,实际挂载点可能不同 File saveDir = new File(sdCard, "DCIM/Camera"); ``` 但是,这种方法不够通用,因为不同设备的SD卡挂载点可能不同。因此,建议使用MediaStore的方式。 总结: 修改Camera2应用的默认存储路径需要修改其保存图片和视频使用的MediaStore URI,将其指向外部SD卡的存储卷。具体步骤是: 1. 定位到保存媒体文件插入MediaStore的代码位置(通常在Storage.java中)。 2. 修改插入操作,优先尝试插入到SD卡的MediaStore URI,如果成功则使用,否则回退到内部存储。 由于不同Android版本可能有差异,需要根据目标Android版本进行调整。 最后,用户需要重新编译Camera2模块或整个系统,并刷入设备。 注意:修改系统应用需要一定的Android系统开发经验,并且需要设备解锁和刷机。 相关问题: 1. 如何获取Android设备上外部SD卡的挂载路径? 2. 在Android Q及以上版本,如何正确处理作用域存储(Scoped Storage)? 3. 如何单独编译Camera2应用并推送到设备? 4. 修改系统应用后如何在不重新刷机的情况下更新?</think>要修改 Android Camera2 应用的默认存储路径,需要在 Android 源代码中进行以下关键修改: ### 修改步骤 1. **定位关键配置文件** - 修改 `packages/apps/Camera2/res/xml/storage_list.xml`: ```xml <StorageList xmlns:android="http://schemas.android.com/apk/res/android"> <!-- 默认内部存储路径 --> <storage android:storageDescription="@string/storage_internal" android:primary="true" android:emulated="true" android:mtpReserve="100" /> <!-- 修改为自定义路径 --> <storage android:mountPoint="/mnt/sdcard/custom_camera" <!-- 你的自定义路径 --> android:storageDescription="@string/storage_sd_card" android:primary="true" android:removable="true" /> </StorageList> ``` 2. **修改 Java 存储逻辑** - 在 `packages/apps/Camera2/src/com/android/camera/Storage.java` 中: ```java public static File getCustomDirectory() { // 替换默认 DCIM/Camera 路径 return new File(Environment.getExternalStorageDirectory() + "/custom_camera"); } public static void ensureDirectory() { File dir = getCustomDirectory(); dir.mkdirs(); // 创建目录 } ``` 3. **更新媒体扫描路径** - 在保存文件的代码段(如 `saveImage()` 方法)中修改: ```java ContentValues values = new ContentValues(); values.put(MediaStore.Images.Media.DATA, getCustomDirectory().getPath() + "/" + filename); // 关键修改点 ``` ### 验证与编译 1. **在设备上创建目录**: ```bash adb shell mkdir /mnt/sdcard/custom_camera adb shell chmod 777 /mnt/sdcard/custom_camera ``` 2. **重新编译系统**: ```bash source build/envsetup.sh lunch <your_device_target> mmm packages/apps/Camera2 # 单独编译Camera模块 ``` 3. **刷入修改**: ```bash adb push out/target/product/<device>/system/priv-app/Camera2 /system/priv-app/ adb reboot ``` ### 注意事项 1. **权限问题**: - 在 `AndroidManifest.xml` 中确保有权限声明: ```xml <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> ``` 2. **Android 版本差异**: - Android 10+ 需适配[作用域存储](https://developer.android.com/training/data-storage),强制使用 MediaStore API - 旧版本可直访问文件路径 3. **存储策略**: ```java // 添加存储状态检查逻辑 if (!Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) { showStorageError(); } ``` ### 相关问题 1. 如何让修改后的 Camera2 应用兼容 Android 13 的作用域存储限制? 2. 当设备插入外置 SD 卡,如何实现存储路径动态切换? 3. 修改系统应用后出现 `INSTALL_FAILED_UPDATE_INCOMPATIBLE` 错误如何解决? 4. 如何在不重新编译整个 ROM 的情况下替换系统相机应用?
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值