某些情况下,要调试的apk需要一些共享库,而这些库要放/system/lib下才能在运行时连接到。

但android模拟器每次启动后,系统分区/system是以只读方式挂载的,不能用向/system分区拷贝文件。


事情到这里,有两种方法解决,一是重新生成system.img文件,将自己的库也打包进去,但重新打包system.img貌似需要linux环境,步骤也不少,而且每次修改共享库后都要重新打包,对于调试应用程序来说,非常不划算。


另一种,方法是将/system分区修改为可以读写的,这个可以在adb shell中通过下面的命令实现:

#mount -o remount  /dev/block/mtdblock0 /system <回车>

命令中/dev/block/mtdblock0表示/system分区实际设备,可通过mount <回车>查看。

即使把/system分区修改为可读写的,也不能向里面拷贝文件,拷贝时会报错:

failed to copy 'xxx' to '/system/xxx': Out of memory

这是因为eclipse启动模拟器时,系统分区的内容实际上是分配一块与system.img等大小的内存空间,来作为系统分区的,所以会出现内存不足的提示。这个可以用df命令查看:

/dev: 63304K total, 0K used, 63304K available (block size 4096)
/mnt/asec: 63304K total, 0K used, 63304K available (block size 4096)
/system: 77568K total, 77568K used,0K available(block size 4096)
/data: 65536K total, 26152K used, 39384K available (block size 4096)
/cache: 65536K total, 1156K used, 64380K available (block size 4096)
/mnt/sdcard: 64504K total, 1K used, 64502K available (block size 512)
/mnt/secure/asec: 64504K total, 1K used, 64502K available (block size 512)


关于/system分区内存不足也有两种解决方法,一是增大/system占用的内存,可以通过命令行启动模拟器,设置内存大小:

emulator -avd [YOUR_AVD_NAME] -partition-size 512
这里设置内存大小为512MB,启动后,remount /system分区为读写状态,就可以拷贝文件到/system分区了,如果要添加到/system分区的文件较大,可以采用这种方式,启动模拟器。

另一种方法是,删除/system分区中一些不用的文件,腾出空间,就可以向里面拷贝文件了,需要拷贝的东西较小时,可以用这种方法。


但由于上面的修改都只是在内存中,不会写到system.img中,每次重启模拟器后,这些改动都不会存在了。又需要重新修改一次,每次修改都奔波于cmd端和adb shell端,操作也不少,容易漏掉步骤。用批处理可以实现自动化处理,解决这个问题。


关于批处理一些问题可以参考在android运行脚本的注意事项http://blog.csdn.net/victoryckl/article/details/7408771

这里给出这些操作的批处理:push.bat

adb shell mount

adb shell mount -o remount /dev/block/mtdblock0 /system

adb shell /system/bin/rm /system/app/Email.*

adb shell /system/bin/rm /system/app/Mms.*

adb shell /system/bin/rm /system/app/Phone.*

adb shell /system/bin/rm /system/app/Browser.*

adb shell /system/bin/df

adb push libxxx1.so /system/lib

adb push libxxx2.so /system/lib

adb push libxxx3.so /system/lib

在启动模拟器后,运行批处理,就可以直接在eclipse中启动运行apk了。



Logo

更多推荐