首页 > 代码库 > 基于海思Hi3716cv200的Android源码编译及烧写之内置存储卡

基于海思Hi3716cv200的Android源码编译及烧写之内置存储卡

问题:把编译好的镜像烧写到小板上后,发现设置--->存储 里只显示0.98G的系统空间,而且在设置--->应用 点开后会崩溃。崩溃时的日志信息如下:

time( 3407): at com.android.settings.applications.ManageApplications$TabInfo.updateStorageUsage(ManageApplications.java:333) 
E/AndroidRuntime( 3407): at com.android.settings.applications.ManageApplications$TabInfo.setContainerService(ManageApplications.java:234) 
E/AndroidRuntime( 3407): at com.android.settings.applications.ManageApplications$2.onServiceConnected(ManageApplications.java:1227) 
W/ActivityManager( 2177): Process com.android.settings has crashed too many times: killing! 
W/ActivityManager( 2177): Force finishing activity com.android.settings/.Settings 
I/ActivityManager( 2177): Killing proc 3407:com.android.settings/1000: crash 
W/InputDispatcher( 2177): channel ‘417bd5b0 com.android.settings/com.android.settings.Settings (server)‘ ~ Consumer closed input channel or an error occurred. events=0x9 
E/InputDispatcher( 2177): channel ‘417bd5b0 com.android.settings/com.android.settings.Settings (server)‘ ~ Channel is unrecoverably broken and will be disposed! 
W/InputDispatcher( 2177): Attempted to unregister already unregistered input channel ‘417bd5b0 com.android.settings/com.android.settings.Settings (server)‘ 
I/WindowState( 2177): WIN DEATH: Window{417bd5b0 u0 com.android.settings/com.android.settings.Settings} 
binder: 2177:2249 transaction failed 29189, size 100-4 
binder: 2177:2517 transaction failed 29189, size 4-0 

binder: send failed reply for transaction 29309, target dead

 

仔细查看错误信息后发现,崩溃的原因跟存储设备有关。所有的问题都归结到Android系统不能完全识别存储设备这个问题上。

在shell下发现,系统能识别的存储只有4G,而我们的设备时8G的emmc

 root@android:/ # 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下查看系统分区如下:

root@android:/ # 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卡分区,用于存储下载的地图、音乐、视频等文件。