android模拟器中,不能将文件拷贝到的/system分区的原因,以及自动化解决方法
某些情况下,要调试的apk需要一些共享库,而这些库要放/system/lib下才能在运行时连接到。但android模拟器每次启动后,系统分区/system是以只读方式挂载的,不能用向/system分区拷贝文件。事情到这里,有两种方法解决,一是重新生成system.img文件,将自己的库也打包进去,但重新打包system.img貌似需要linux环境,步骤也不少,而且每次修改共享库后
某些情况下,要调试的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了。
更多推荐
所有评论(0)