整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:

一篇文章搞懂android存储目录结构

操作目录结构系统设计_操作目录结构系统包括_操作系统 目录结构

前言

前两天因为开发一个app更新的功能,我将从服务器下载的apk文件放在了内部存储目录(测试手机为小米,路径为:data/user/0//files)下面,然后安装的时候一直安装不了,提示解析包出错。后来查询发现,安装apk是调用了,没有相关权限,这个无法获取内部路径,所以会安装不了。借机也复习了一遍Android下面存储相关的知识点,总结一番。

存储分类

操作系统 目录结构_操作目录结构系统设计_操作目录结构系统包括

对于Android存储目录,我总结成一张思维导图。上面这张图很清楚的展示了Android存储的目录,接下来我们详细分析每一个目录。

内部存储位于系统中很特殊的一个位置,对于设备中每一个安装的 App,系统都会在 data/data//xxx 自动创建与之对应的文件夹。如果你想将文件存储于内部存储中,那么文件默认只能被你的应用访问到,且一个应用所创建的所有文件都在和应用包名相同的目录下。也就是说应用创建于内部存储的文件,与这个应用是关联起来的。当一个应用卸载之后,内部存储中的这些文件也被删除。对于这个内部目录,用户是无法访问的,除非获取root权限。

String fileDir = this.().();

String = this.().();

一般情况下,我们获取到的路径为data/data//xxx,小米手机下面打印出来的结果如下:

对于内部存储路径,我们一般通过以下两种方式获取,内部存储空间的获取都需要使用Context:

context.()

对应内部存储的路径为: data/data//files,但是对于有的手机如:华为,小米等获取到的路径为:data/user/0//files

context.()

对应内部存储的路径为: data/data//cache,但是对于有的手机如:华为,小米等获取到的路径为:data/user/0//cache应用程序的缓存目录,该目录内的文件在设备内存不足时会优先被删除掉,所以存放在这里的文件是没有任何保障的,可能会随时丢掉。

针对于外部存储比较容易混淆,因为在.4以前,手机机身存储就叫内部存储,插入的SD卡就是外部存储,但是在.4以后的话,就目前而言,现在的手机自带的存储就很大,现在.0的话,有的手机能达到256G的存储,针对于这种情况,手机机身自带的存储也是外部存储,如果再插入SD卡的话也叫外部存储,因此对于外部存储分为两部分:SD卡和扩展卡内存

我们通过一段代码来获取手机的外部存储目录,我们用的测试手机是三星G4,带有插入SD卡的:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
            File[] files = getExternalFilesDirs(Environment.MEDIA_MOUNTED);
            for (File file : files) {
                Log.e("file_dir", file.getAbsolutePath());
            }
}

对于以上代码,打印的结果如下:

打印出两行目录,第一行目录是机身自带的外部存储目录,目录结构为:/storage//0/Android/data//files 第二行是存储卡的目录结构,路径为:/storage//Android/data//files

操作目录结构系统包括_操作目录结构系统设计_操作系统 目录结构

扩展外部存储

此目录路径需要通过context来获取,同时在app卸载之后,这些文件也会被删除。类似于内部存储。

()

对应外部存储路径:/storage//0/Android/data//cache

(String type)

对应外部存储路径:/storage//0/Android/data//files

SD卡存储

SD卡里面的文件是可以被自由访问,即文件的数据对其他应用或者用户来说都是可以访问的,当应用被卸载之后,其卸载前创建的文件仍然保留。

对于SD卡上面的文件路径需要通过获取,同时在获取前需要判断SD的状态:

SD卡未知

SD卡移除

SD卡未安装

SD卡检查中,刚装上SD卡时

SD卡为空白或正在使用不受支持的文件系统

SD卡安装

NLY SD卡安装但是只读

SD卡共享

SD卡移除错误

存在SD卡但是不能挂载,例如发生在介质损坏

String externalStorageState = Environment.getExternalStorageState();
 if (externalStorageState.equals(Environment.MEDIA_MOUNTED)){
            //sd卡已经安装,可以进行相关文件操作
 }

rectory()

对应外部存储路径:/storage//0

(String type)

操作目录结构系统设计_操作目录结构系统包括_操作系统 目录结构

获取外部存储的共享文件夹路径如:

音乐目录

图片目录

电影目录

下载目录

相机拍照或录像文件的存储目录

文件文档目录

String externalStoragePublicDirectory = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM).getPath();

以上便是获取相机DCIM目录,对应获取的路径为:/storage//0/DCIM。

()

对应获取系统分区根路径:/system

()

对应获取用户数据目录路径:/data

ctory()

对应获取用户缓存目录路径:/cache

相关概念区别

这两个都位于内部存储目录/data/data//下面,位于同一级别,前者是file目录下面,后面是cache目录下。

操作目录结构系统设计_操作系统 目录结构_操作目录结构系统包括

前者位于内部存储目录/data/data//file下面,后者位于外部存储目录/storage//0/Android/data//files下面,它们都存在于应用包名下面,也就是说属于app应用的,所以当app卸载后,它们也会被删除的。

对于前面提到的app下载升级功能,我们从服务器端下载的app需要放到外部存储目录下面,而不是内部存储目录,因为内部存储目录的空间很小。另外我也做了相关测试,如果将apk放到内部存储目录file下面的话,安装时会出现问题,提示解析包出错。

在app中有清除数据和清除缓存这两个概念,那么这两者分别清除的是什么目录下面的数据呢?

清除数据

清除数据清除的是保存在app中所有数据,就是上面提到的位于下面的所有文件,包含内部存储(/data/data//)和外部存储(/storage//0/Android/data//)。当然除了SD卡上面的数据,SD卡上面的数据当app卸载之后还会存在的。

清除缓存

缓存是程序运行时的临时存储空间,它可以存放从网络下载的临时图片,从用户的角度出发清除缓存对用户并没有太大的影响,但是清除缓存后用户再次使用该APP时,由于本地缓存已经被清理,所有的数据需要重新从网络上获取。为了在清除缓存的时候能够正常清除与应用相关的缓存,请将缓存文件存放在()或者 ()路径下。

操作目录结构系统包括_操作目录结构系统设计_操作系统 目录结构

以上便是Android系统中管存储目录的一些知识。

Ubuntu 18.04 AOSP源码编译详尽指南

笔者简介:

金融行业、互联网行业信息安全从业划水10年+;

略懂一点技术;

数据安全治理运营;

1 编译环境准备

1.1 磁盘空间

预留足够大的硬盘空间,从实际体验来看,512g紧张,1T比较合适,所以建议至少配置超过1T的硬盘空间。

1.2操作系统准备

安装纯净的Ubuntu 18.04虚拟机操作系统,将虚拟机内存设置大一点,笔者PC机物理总内存为32G,分配给了虚拟机24G,内存分配越大,CPU越好,编译越快。

如果物理内存太小,为了防止编译过程中因为Ubuntu内存太小报错,可考虑设置SWAP分区,增加SWAP分区方法如下:

dd if=/dev/zero of=/root/swapfile bs=1G count=16 //创建交换分区的文件,这里设置swap分区为16G:bs为块大小,每个块为1G;mkswap /root/swapfile                                   swapon /root/swapfile                   

如果要SWAP在系统开机时自启动,要在文件/etc/fstab中添加一行

查看源代码的代码_源代码查看器_查看源代码有什么用

使用free -h或者htop查看配置的SWAP分区是否生效

查看源代码的代码_查看源代码有什么用_源代码查看器

扩展硬盘,硬盘分配450G;

源代码查看器_查看源代码有什么用_查看源代码的代码

VMWare上扩展磁盘后,Ubuntu 操作系统还不能识别,需要通过gparted来扩展原来分区,也可以新建一个分区,用来存放AOSP源代码。

a、采用扩展分区

下面图例直接是扩展原始分区,拖动横条,完成硬盘预扩展

查看源代码有什么用_源代码查看器_查看源代码的代码

执行扩展操作,完成分配

源代码查看器_查看源代码有什么用_查看源代码的代码

查看源代码有什么用_查看源代码的代码_源代码查看器

b、采用新建分区

首先要满足该分区足够大,另外需要通过mount命令手动挂载分区,比如挂载到桌面的COMPILE目录下:

1.3虚拟机基础设置

编译过程时间长,可能会休眠,所以设置关闭息屏、关闭休眠、时区也设置下

源代码查看器_查看源代码有什么用_查看源代码的代码

查看源代码有什么用_源代码查看器_查看源代码的代码

时区设置,选择Asia-

源代码查看器_查看源代码有什么用_查看源代码的代码

源代码查看器_查看源代码的代码_查看源代码有什么用

1.4 安装编译工具及相关依赖

更新apt源

root@ubuntu:/etc/apt#cp sources.list sources.list.bak  # 备份原始listroot@ubuntu:/etc/apt#vi /etc/apt/sources.list # 新建一个list从(https://www.jianshu.com/p/6dee223ac93e)选择一种源写入sources.list文件中sudo apt-get update # 更新

安装工具

安装adb与fastboot# sudo apt-get -y install adb fastboot安装curl# sudo apt-get -y install curlgit下载和配置# sudo apt-get install git# git config --global user.email "邮箱"# git config --global user.name "xxx"repo下载安装 # curl https://storage.googleapis.com/git-repo-downloads/repo > /usr/bin/repo# chmod a+x /usr/bin/repo

将repo访问的资源修改为清华源,在~/.bashrc文末添加配置,示例如下:

查看源代码有什么用_源代码查看器_查看源代码的代码

openjdk安装,编译不同的版本需要不同的JDK,可在源码目录下的/build/core/main.mk文件中查看编译所依赖的JDK版本

源代码查看器_查看源代码的代码_查看源代码有什么用

常见的JDK依赖如下:

Android 7.0 (Nougat) 以上:OpenJDK 8Android 5.x (Lollipop) – Android 6.0 (Marshmallow):OpenJDK 7Android 2.3.x (Gingerbread) - Android 4.4.x(KitKat):Java JDK 6Android 1.5 (Cupcake) - Android 2.2.x (Froyo): Java JDK 5

Ubuntu中安装JDK,笔者编译AOSP 版本为,所以选择

# sudo apt-get install openjdk-8-jdk

安装AOSP编译依赖

sudo apt-get install gnupg  flex bison gperf build-essential zip gcc-multilib g++-multilibsudo apt-get install libc6-dev-i386 lib32ncurses5-dev x11proto-core-dev  sudo apt-get install lib32z-dev ccache libgl1-mesa-dev  libxml2-utils xsltproc unzip m4sudo apt-get install libreadline6-dev:i386  libncurses5-dev:i386sudo apt-get install zlib1g-dev:i386  zlib1g-devsudo apt-get install tofrodos  python-markdownsudo apt-get install dpkg-dev libsdl1.2-dev sudo apt-get install libx11-dev libx11-dev:i386sudo apt-get install libssl-devsudo apt-get install libesd0-dev //可能需要新的源,如下图

源代码查看器_查看源代码的代码_查看源代码有什么用

截至目前,基础环境配置完成,可以选择打一个快照,方便后续有问题还原。

2 AOSP源码下载

本文以编译源码为例,下载AOSP源码方式有2种,根据需求选择其中一种下载即可。

2.1通过清华镜像初始化包下载

下载量很大,很慢,但很全,网络好的情况下,笔者觉得没必要采用此种方式。

2.1.1通过清华镜像初始化包下载(检出)最新版本源代码

wget -c https://mirrors.tuna.tsinghua.edu.cn/aosp-monthly/aosp-latest.tar   # 下载初始化包tar -xvf aosp-latest.tar         # 执行解压操作,解压后可删除aosp-latest.tarcd AOSP            # 解压得到的 AOSP 工程目录,里面只有一个隐藏的 .repo 目录,这里面包含了所有版本的仓库管理脚本及相关工具,所以从这里可以检出任意版本代码repo sync  -c -j4   # 在未通过repo init 指定分支时,默认为master分支,即最新版本的Android源码,同步一遍即可得到最新版本的Android源代码

2.1.2通过清华镜像初始化包下载(检出)指定版本源代码

首先在 先查询分支与对应可安装设备,记录下Build ID和tag值

查看源代码有什么用_查看源代码的代码_源代码查看器

wget -c https://mirrors.tuna.tsinghua.edu.cn/aosp-monthly/aosp-latest.tar   # 下载初始化包tar -xvf aosp-latest.tar       # 执行解压操作cd aosp                  # 解压得到的 AOSP 工程目录cd .repo/manifests # 进入manifests 目录root@ubuntu:~/Desktop/COMPILE/aosp/.repo/manifests#git branch -a | cut -d / -f 3 # 查看aosp-latest可以下载(检出)哪些版本代码root@ubuntu:~/Desktop/COMPILE/aosp#repo init -u https://aosp.tuna.tsinghua.edu.cn/platform/manifest -b android-9.0.0_r9   --depth=1 --platform=auto  # 初始化仓库,指定版本,版本号为前面记录的Tag值root@ubuntu:~/Desktop/COMPILE/aosp#repo sync -c -j4          # 下载指定版本代码到本地

2.2直接下载AOSP源码

直接下载指定版本的AOSP,家里带宽比较好的条件下,推荐此种方式,比如1000M带宽,下载aosp 31G代码只需要不到15分钟,如果带宽小,则下载时间很长,且容易断,则不推荐该方式

首先在 先查询分支与对应可安装设备,记录下Build ID和tag值

mkdir AOSPcd AOSPrepo init -u https://aosp.tuna.tsinghua.edu.cn/platform/manifest -b android-9.0.0_r9 --depth=1 --platform=auto# 初始化仓库,指定版本,版本号为前面记录的Tag值repo sync -c -j4# 只下载当前分支代码

1000M带宽下,仅用13分钟下载完成

查看源代码的代码_源代码查看器_查看源代码有什么用

查看源代码有什么用_源代码查看器_查看源代码的代码

3下载驱动

如果编译好的AOSP要刷真机,则需要驱动,模拟器不需要驱动,aosp提供的仅仅是源码,要刷真机,还需google的vender和高通的驱动,下载地址:,具体下载项需要根据Build ID、机型判断

源代码查看器_查看源代码的代码_查看源代码有什么用

下载完成后,里面是shell脚本,执行shell脚本,两个脚本产生的文件都会写入vender目录,然后将该目录放到aosp的根目录下,这个目录最终会编译生产vender.img镜像

查看源代码有什么用_查看源代码的代码_源代码查看器

查看源代码的代码_查看源代码有什么用_源代码查看器

4 编译AOSP源码

cd到AOSP源码目录root@ubuntu:~/Desktop/COMPILE/aosp# source build/envsetup.sh // 要先执行这步,不然找不到make命令root@ubuntu:~/Desktop/COMPILE/aosp# lunch

lunch命令后选择所需要编译的目标的格式,编译目标的格式组成为BUILD-,比如-eng的BUILD为,为eng,其中BUILD表示编译出的镜像可以运行在什么环境,aosp代表Android开源项目,arm表示系统是运行在arm架构的处理器上,笔者手机是pixel 3XL,,这里以编译为例,所以选择14。

源代码查看器_查看源代码有什么用_查看源代码的代码

root@ubuntu:~/Desktop/COMPILE/aosp# make -j4 //编译命令

第一次编译,我用的4个线程,耗时4小时,后来升级了PC机,改成16线程,时间缩短到2小时,下图是第一次编译,差不多4小时

源代码查看器_查看源代码的代码_查看源代码有什么用

镜像位置(/out/target/product/

/)

查看源代码有什么用_源代码查看器_查看源代码的代码

镜像说明

查看源代码有什么用_源代码查看器_查看源代码的代码

4镜像刷机

将手机连接到虚拟机

查看源代码的代码_源代码查看器_查看源代码有什么用

设置变量的值

为了避免每次启动了系统后去设置变量,可以将写入/etc/profile配置文件中。

查看源代码的代码_源代码查看器_查看源代码有什么用

以模式启动手机

# adb reboot bootloader  # fastboot devices

刷入镜像

只刷system镜像# fastboot flash system system.img #只刷系统镜像刷所有镜像完整刷入# fastboot flashall -w   // -w 是双清(Cache分区和Data分区),fastboot flashall命令会在ANDROID_PRODUCT_OUT目录中查找所有img文件,将这些img文件烧写到所有对应的分区中,并重新启动手机

查看源代码的代码_查看源代码有什么用_源代码查看器

查看源代码的代码_查看源代码有什么用_源代码查看器