zoukankan      html  css  js  c++  java
  • Android不刷机下的app2sd方法(dex cache占空间解决篇)

    抱着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








  • 相关阅读:
    jQuery笔记(1)
    [bzoj 1878][SDOI2009]HH的项链
    [bzoj 1968][Ahoi2005]COMMON 约数研究
    [bzoj 1899][ZJOI2004]lunch 午餐
    [bzoj 1090][SCOI2003]字符串折叠
    CodeForces 1029E div3
    [bzoj 1270][BeijingWc2008]雷涛的小猫
    [bzoj 1260][CQOI 2007]涂色paint
    [AtCoder ARC101D/ABC107D] Median of Medians
    [luogu 1070]道路游戏(NOIP2009T4)
  • 原文地址:https://www.cnblogs.com/wzzkaifa/p/6904332.html
Copyright © 2011-2022 走看看