抱着5年的HTC G7这个古董,一直没有想法去换换。

近期微信、支付宝什么的apk应用都開始走程序巨型化,一次性就来个50MB的空间占用,让还是Android 2.2的手机怎样吃的消?

看看100多MB的空间,这家里家外都用微信,得装一个吧;大家一起出去吃饭。一人付账,AA结得有支付宝。还有12306火车票啦。手机银行什么的;

加上pm setInstallLocation 2也没有解决dex cache占空间的问题。

于是随着需求的日益强烈,最终要想办法把Android的存储空间扩展下了。

网上好多刷机的教程啊,我个人倒不喜欢刷机,刷错一次还得再改再又一次刷,太麻烦。

所以准备好环境:

- 玩具笔记本Acer一台,装有Ubuntu,Android SDK和NDK

- HTC G7手机,装有原版Android 2.2

首先,我们简单过一下存储扩展的原理:

- Android 2.2中,app应用分别装在两个地方,一个是/system/app中。一个是/data/app中。

- 官方的app都带有odex文件加速应用启动,一般在/system/app里;以后下载安装的app一般在/data/app,手机启动到桌面后apk应用程序(apk实际就是个zip,16进制看下magic是PK便是)里的内容会被解压,当中最重要的就是dex文件,会被放入/data/dalvik-cache中,程序的数据会放入/data/data中。

为了全部程序的稳定,决定不动/data/data。转而进攻的方向就是/data/app和/data/dalvik-cache,它们是在手机内置存储里的,目标就是把这两个文件夹指向sdcard。这样以后安装的apk就直接进sdcard了。

Step 1. ROOT权限

这里就不多叙述怎样ROOT了。事实上你不ROOT。手机关机,按住音量减开机就进入recovery模式,这时连上电脑用adb shell进去就是root。

当然一键ROOT方便了不少。

大家还能够学习一下ROOT相关的代码:https://github.com/ChainsDD/su-binary

事实上改改那个su.c,用NDK编译一下,扔进/system/bin。chmod 6777,就能够随时ROOT了,仅仅是把验证把关去掉不太安全,还是加个apk,过一下列表比較好。

Step 2. 准备磁盘空间

网上一堆格式化磁盘分区的做法。把sdcard变为ext2等格式,那我还得备份数据啊。太讨厌。

在Ubuntu上建一个磁盘文件,用loop设备就比較轻松(这里给它们总共500MB,应该能装不少应用了吧,改天Hack下看怎么在arm上编LXC玩,顺便把曾经编译好的vim也放进去,后面就能够随时编辑文本了):

dd if=/dev/zero of=app.img count=1 bs=300MB
dd if=/dev/zero of=cache.img count=1 bs=200MB
mkfs.ext2 app.img
mkfs.ext2 cache.img

Step 3. 编写切换脚本

手机USB连接,把那俩img文件放进sdcard里。比方放在/sdcard/extraspace/app.img /sdcard/extraspace/cache.img:

adb shell
mkdir /sdcard/extraspace
exit adb push app.img /sdcard/extraspace/
adb push cache.img /sdcard/extraspace

(话外:顺便提一下,最好在recovery模式下把busybox取出来放到/system/bin里,HTC G7 Android 2.2那个toolbox实在是太…

adb reboot recovery
# 等待手机启动到recovery模式
adb shell
mount /system
cp /sbin/busybox /system/bin
cd /system/bin
# 以下两个工具非常重要
ln -s busybox mknod
ln -s busybox losetup
# ls -l 看看哪些经常使用命令经经常使用。把toolbox替换为busybox
rm cat ls cp mount umount mv df
ln -s busybox cat
ln -s busybox ls
ln -s busybox cp
ln -s busybox mount
ln -s busybox umount
ln -s busybox mv
ln -s busybox df

以下就是写个脚本从内置存储切换到sdcard模式:

#!/bin/sh

#loop的0和1被占用了。从2開始用。这里我用3 4
mknod /dev/loop3 b 7 3
mknod /dev/loop4 b 7 4
losetup /dev/loop3 /sdcard/extraspace/app.img
losetup /devv/loop4 /sdcard/extraspace/cache.img
mount -o loop -t ext2 /dev/loop3 /data/app
mount -o loop -t ext2 /dev/loop4 /data/dalvik-cache
# 记得给权限,假设保留为root:root,升级程序,它还是原来的,删除apk程序,重新启动手机又回来了
chown system:system /data/app
chown system:system /data/dalvik-cache
# 又一次载入一遍全部apk程序,关了好多程序,最终给我逮着了
PID=$(ps | grep "/system/bin/servicemanager" | grep -oE "system +[0-9]+" | grep -oE "[0-9]+")
kill -9 $PID

要是想切换回去:

umount /data/app
umount /data/dalvik-cache
losetup -d /dev/loop3
losetup -d /dev/loop4
rm /dev/loop3 /dev/loop4
PID=$(ps | grep "/system/bin/servicemanager" | grep -oE "system +[0-9]+" | grep -oE "[0-9]+")
kill -9 $PID

以上的脚本是要在ROOT下执行的,就是su过了


Step 4. 验收

把切换那个脚本写为app2sd.sh。然后adb push到/data/local/tmp。之后安装个Terminal的apk应用,在手机上:
su
cd /data/local/tmp
sh app2sd.sh

启动画面结束后。使用一下:adb install com.tencent.mm-1.apk。OK安装完成。内置容量差点儿不降低了,登录下瞬间又少了8MB(我晕。腾讯,你是要吃我磁盘的么;阿里支付宝也是如此…),由于没有把/data/data也映射到sdcard。据说手机会变非常慢。所以有空间用就好了,以下装了一堆应用,貌似那个100多MB的植物大战僵尸也能够安装了。

今天就玩到这里了,昨天二号玩具TP-LINK来了,看看OpenWRT,想想怎么hack DIY自己的路由器吧。哈哈,下礼拜从亚马逊买的其它玩具也要陆续来啦。


J.Y.Liu
20141025






Android不刷机下的app2sd方法(dex cache占空间解决篇)的更多相关文章

  1. opencv直线检测在c#、Android和ios下的实现方法

    opencv直线检测在c#.Android和ios下的实现方法 本文为作者原创,未经允许,不得转载 :原文由作者发表在博客园:http://www.cnblogs.com/panxiaochun/p/ ...

  2. C#_IO操作_查询指定文件夹下的每个子文件夹占空间的大小

    1.前言 磁盘内存用掉太多,想查那些文件夹占的内存比较大,再找出没有用的文件去删除. 2.代码 static void Main(string[] args) { while (true) { //指 ...

  3. 【转】【Android】Android不同版本下Notification创建方法

    使用 new Notification(int icon, CharSequence tickerText, long when)构造函数时,Eclipse却提示:" The constru ...

  4. Android不同版本下Notification创建方法

    项目环境 Project Build Target:Android 6.0 问题: 使用 new Notification(int icon, CharSequence tickerText, lon ...

  5. Android真机安装sqlite3的方法

    欢迎和大家交流技术相关问题: 邮箱: jiangxinnju@163.com 博客园地址: http://www.cnblogs.com/jiangxinnju GitHub地址: https://g ...

  6. Android真机测试,连接到本地服务器的方法

    1. 前言 作为一名Android开发者,不管怎么说,都会经历使用Android真机来测试连接本地服务器这样的事情.这里所说的“本地服务器”大多数时候指的是:搭载有某种服务器软件的PC,例如搭载有To ...

  7. appium+Python真机运行测试demo的方法

    appium+Python真机运行测试demo的方法 一,    打开手机的USB调试模式 二,    连接手机到电脑 将手机用数据线连接到电脑,并授权USB调试模式.查看连接的效果,在cmd下运行命 ...

  8. 在android开发中使用multdex的方法-IT蓝豹为你整理

    Android系统在安装应用时,往往需要优化Dex,而由于处理工具DexOpt对id数目的限制,导致其处理的数目不能超过65536个,因此在Android开发中,需要使用到MultiDex来解决这个问 ...

  9. android真机自动化测试

    appium执行用例时报错问题: 问题解析: 一般该种情况都是因为来连接了多个设备,验证办法:cmd->执行adb devices  看结果是否是多个devices ,如果是这个问题,停掉多余设 ...

随机推荐

  1. 9. InnoDB通用表空间

    9. InnoDB通用表空间 通用表空间是InnoDB 使用CREATE TABLESPACE语法创建的共享表空间.本节中的以下主题描述了常规表空间功能和功能: 通用表空间功能 创建通用表空间 将表添 ...

  2. C语言程序内存分布

     一个进程的数据在内存中的布局如下图: bss段(bss segment):可读可写不可执行,通常用来存放程序中未初始化的全局变量.bss是英文Block Started by Symbol的简称.b ...

  3. svn基本使用详情

    1.增加(Add)先提到变更列表中,再commit到配置库中,选择新增文件,右键SVN菜单执行“Add“操作提交到”变更列表中”,然后右键SVN菜单执行”SVNCommit”提交到版本库中. 2.删除 ...

  4. 分分钟钟学会Python - 模块

    目录 模块 1 模块基础知识 2 random 返回随机生成的一个实数 3 hashlib 摘要算法模块 Hmac算法 4 time /datetime 时间模块 5 getpass 密码不显示(只能 ...

  5. 激活windows10(已更新工具)

    激活windows10 1.用cmd命令: 自己动手,KMS激活win10 2016 长期服务版.步骤如下:命令提示符(管理员),依次输入以下3条命令 slmgr /ipk DCPHK-NFMTC-H ...

  6. UI进阶 XML解析适配 'libxml/tree.h'file not found 错误解决办法

    Xcode 'libxml/tree.h'file not found 错误解决办法

  7. luogu1447 [NOI2010]能量采集

    考虑暴力,答案显然是 \(\sum_{i=1}^n\sum_{j=1}^m(2(\gcd(i,j)-1)+1)=\sum_{i=1}^n\sum_{j=1}^m(2\gcd(i,j)-1)\). 考虑 ...

  8. 准备新的代码迁移到cnblogs

    http://www.cnblogs.com/danghuijian/ http://www.cnblogs.com/danghuijian/

  9. bzoj2277 [Poi2011]Strongbox

    2277: [Poi2011]Strongbox Time Limit: 60 Sec  Memory Limit: 32 MBSubmit: 498  Solved: 218[Submit][Sta ...

  10. [NOIP2000] 提高组 洛谷P1018 乘积最大

    题目描述 今年是国际数学联盟确定的“2000――世界数学年”,又恰逢我国著名数学家华罗庚先生诞辰90周年.在华罗庚先生的家乡江苏金坛,组织了一场别开生面的数学智力竞赛的活动,你的一个好朋友XZ也有幸得 ...