问题:把编译好的镜像烧写到小板上后,发现设置--->存储 里只显示0.98G的系统空间,而且在设置--->应用 点开后会崩溃。崩溃时的日志信息如下:
|
仔细查看错误信息后发现,崩溃的原因跟存储设备有关。所有的问题都归结到Android系统不能完全识别存储设备这个问题上。
在shell下发现,系统能识别的存储只有4G,而我们的设备时8G的emmc
:
[email protected]:/ # df Filesystem Size Used Free Blksize /dev 475M 68K 475M 4096 /mnt 475M 0K 475M 4096 /mnt/secure 475M 0K 475M 4096 /mnt/asec 475M 0K 475M 4096 /mnt/obb 475M 0K 475M 4096 /system 492M 254M 237M 4096 /data 1007M 72M 935M 4096 ------->这是设置里显示的内部存储。 /cache 98M 4M 94M 4096
由于我们是使用升级的方式烧写系统,所以在升级文件中应该会有对分区进行处理的脚本。搜索后发现,在update.zip的META-INF\com\google\android目录下存在updater-script升级脚本,对分区的操作就位于该脚本中,在该脚本中没有涉及Sdcard操作。在Android源码的bootable\recovery\etc\META-INF\com\google\android目录下发现了以下文件:
经过对比发现,其中updater-script-emmc就是我编译时默认使用的升级脚本,而在updater-script-produce-emmc中反现了以下代码:
ui_print("foramt sdcard......"); format("ext4", "EMMC", "/dev/block/platform/hi_mci.1/by-name/sdcard", "0", "/sdcard");
该段代码的功能就是格式化sdcard分区,接下来只需要把
updater-script-produce-emmc改名为updater-script-emmc,然后再源码根目录下执行:make updatezip -j8即可在out/target/product/hi3716c/Emmc目录下得到升级包update.zip,再利用该升级包升级系统即可。升级后,在shell下查看系统分区如下:
[email protected]:/ # df Filesystem Size Used Free Blksize /dev 475M 68K 475M 4096 /mnt 475M 0K 475M 4096 /mnt/secure 475M 0K 475M 4096 /mnt/asec 475M 0K 475M 4096 /mnt/obb 475M 0K 475M 4096 /system 492M 254M 237M 4096 /data 1007M 61M 946M 4096 /cache 98M 4M 94M 4096 /mnt/sdcard 5G 98M 5G 4096 /mnt/secure/asec 5G 98M 5G 4096
可以看到,所有分区都能识别出来了。
注意1:Android系统一般会把整个存储(如本例的8G Emmc)分为两部分,一部分作为系统分区,一部分作为内置SD卡分区。
注意2:以上修改只针对生产时使用,在提供给用户的升级包update.zip中使用的升级脚本一定不能包含对sdcard的格式化操作。也就是说,用户升级包必须使用原来的updater-script-emmc升级脚本。
============================================================================================
附录:上图中各个分区的作用。
/system分区 --->ROM信息
--app------>预安装的应用和系统软件
--data------> 预安装应用和软件的数据信息
/data分区--------->用户软件信息
--app------>用户安装软件,安装时把apk文件复制到此目录
--data------>存放所有软件(/system/app,/data/app 和/mnt/asec中装的软件)的一些lib和xml文件等信息。以及程序缓存文件。
--dalvik-cache----->将apk中的dex文件安装到dalvik-cache目录下(dex文件是dalvik虚拟机的可执行文件,其大小约为原始apk文件大小的四分之一)
/mnt 分区---------> 挂载外部设备
--sdcar --->内置sd卡分区,用于存储下载的地图、音乐、视频等文件。
基于海思Hi3716cv200的Android源码编译及烧写之内置存储卡