android手机几个目录的介绍:/system/app; /system/vender;/data/app;/data/dalvik-cache;/mnt/asec;/mnt/secure

本文详细解析了Android系统中各文件夹的功能与用途,包括/system、/data、/sdcard等关键目录的区别及联系。同时介绍了app2sd技术的两种实现方案:app2ext和data2ext,帮助读者了解如何更好地利用SD卡空间。

看到很多android用户搞不清楚自己手机里这些目录到底是干什么的,索性就一一解释清楚,当然也会涉及到系统软件和用户自己的软件的区分,以及app2sd(软件搬家:从内存搬到SD卡)方面的知识


/system 存放的是rom的信息;

/system/app 存放rom本身附带的软件即系统软件;

/system/data 存放/system/app 中核心系统软件的数据文件信息。

 /data 存放的是用户的软件信息(非自带rom安装的软件)

/data/app 存放用户安装的软件;

/data/data 存放所有软件(包括/system/app 和 /data/app 和 /mnt/asec中装的软件)的一些lib和xml文件等数据信息;

/data/dalvik-cache 存放程序的缓存文件,这里的文件都是可以删除的。


/sdcard和/mnt/sdcard一样吗?/mnt/asce是干嘛用的?

我来谈谈/mnt/asce目录
1、android升级到2.2以上,出现了这个目录,这个目录是干什么的呢?
2、2.2以上,出现了新的功能,应用可以安装的sd卡上,哪到底安装在哪儿呢?我找遍了整个卡结果发现了所有这些应用安装在.android 的asecure目录下,要把卡放到读卡器上去看才知道。
3、那是如何与系统发生关系的,学过unix的人都知道,mnt是在/下的一个目录,sd卡是通过mount挂接上去的,/mnt叫挂接点,系统就能通过挂接点/mnt访问sd卡了
4、在/mnt下有三个目录如下:asec、secure、sdcard 其中asec就是我们安装在卡上的应用、secure是用于sd卡应用程序安装路径加密的吧自己猜想的、sdcard就是卡上的其他内容。

/mnt/asce实际上对应的真正物理目录是/mnt/sdcard/.android_secure(记住android_secure前有个点,这是个隐藏目录)

我们回过来看/sdcard和/mnt/sdcard就容易理解:

/sdcard 目录,这是一个软链接(相当于windows的文件夹的快捷方式),链接到/mnt/sdcard 目录,即这个目录的内容就是sdcard的内容。

   因此,用户程序安装到到sd卡上后,其内容可能分散到:/mnt/asec , /mnt/secure , /data/data 。

    要实现app2sd,目前比较流行有两种方案,分别是app2ext 和 data2ext,下面分别介绍下这2种方案。

    app2ext的原理是,删除data区中的app文件夹,然后在sd卡的ext分区上创建一个app文件,并通过软链接映射到data区。这样系统会以为,app这个软链接是一个真实的文件夹,会把程序都安装在里面,但实际上,这些程序都安装到卡上了。但由于操作系统并不知道,所以这种情况下,我们依然看到系统显示这个程序是安装在“内置空间”的。
    data2ext则更彻底,它不是用软链接,而是直接用“挂载”功能,Linux下所有的存储设备都必须挂载成一个文件夹才能进行文件操作(如sd卡就挂载在/mnt/sdcard目录下面)。data文件夹本来是对应手机内部Flash中的一个分区(为了保持术语的准确,这里要把内部Flash和内存相区别,内部Flash是ROM,内存是RAM)。而data2ext则是修改了挂载对应关系,使data文件夹挂载的不是内置Flash,而是sd卡的整个ext分区。这样,不仅是app,连存储程序设置的data和缓存dalvik-cache都会存储到sd卡中。

    可以看到,dalvik-cache和data这两个文件夹的位置,是这两种方式的一个重大区别。其中dalvik-cache是虚拟机预编译缓存,data(不同于/data,这个是/data/data)是存储程序数据的地方,例如游戏的存档记录,软件的配置信息等。这样有什么区别,区别在于假如你重刷了ROM,app2ext的话,所有的程序都可以保留,但是这些程序的配置信息和游戏的存档都会丢失。而data2ext则可以连同配置和存档都保留,但是dalvik-cache也是一个容易积累垃圾的地方,这些垃圾也会一同保留。

    data2ext由于是把整个data分区都放在sd卡上,因此,我们刷ROM需要WIPE的时候,这个data分区的内容就可能不会被wipe,这可以保存用户的个人资料,但是也可能造成系统莫名其妙的故障。

最后了,我也向大家推荐一下自己做的小工具:【立波软件管家马上下载>>

立波软件管家

<think>我们正在处理一个关于在Android10系统中将预编译的so库添加到vendor/lib/hw目录的问题。根据用户提供的引用和问题,我们需要解决的是预编译so库(例如gps.default.so)在编译时无法正确放置到指定目录的问题。参考引用[1]和[2]中的信息,我们可以总结出以下步骤:1.创建一个Android.mk文件来定义预编译模块。2.在device.mk(或类似的产品配置文件)中添加该模块到PRODUCT_PACKAGES中。但是,在Android10中,由于编译系统的变化,可能需要调整。另外,引用[3]提供了一个使用Android.bp(Soong构建系统)的示例,但用户的问题中主要使用的是Android.mk(Make构建系统)。用户的目标是将so库放到vendor/lib/hw目录下。注意,在Android10中,vendor分区是独立的,因此我们需要确保模块被安装到vendor分区。根据引用[1]的解决方案:-创建Android.mk文件,其中指定LOCAL_MODULE_PATH为$(TARGET_OUT_VENDOR)/lib/hw(因为用户要求vendor/lib/hw,而引用[1]中用的是TARGET_OUT,即system分区)-在device.mk中添加PRODUCT_PACKAGES+=<模块名>因此,我们需要调整路径到vendor分区。步骤:1.在合适的位置(比如device/<vendor&gt;/<device&gt;/目录下)创建一个目录(例如prebuilt)存放so库和Android.mk。2.编写Android.mk,指定模块,并设置LOCAL_MODULE_PATH为vendor的lib/hw目录。3.在产品配置文件(如device.mk)中添加该模块到PRODUCT_PACKAGES。详细步骤:1.创建预编译模块的目录结构,例如:```device/<vendor&gt;/<device&gt;/prebuilt/gps/├──Android.mk└──gps.default.so#预编译的so文件```2.编写Android.mk,内容如下:```makefileLOCAL_PATH:=$(callmy-dir)include$(CLEAR_VARS)LOCAL_MODULE:=gps.default.soLOCAL_SRC_FILES:=gps.default.soLOCAL_MODULE_TAGS:=optionalLOCAL_MODULE_CLASS:=SHARED_LIBRARIES#设置模块路径为vendor分区下的lib/hwLOCAL_MODULE_PATH:=$(TARGET_OUT_VENDOR)/lib/hw#因为预编译,所以使用BUILD_PREBUILTinclude$(BUILD_PREBUILT)```3.在产品的device.mk(或类似的产品配置文件)中,添加:```makefilePRODUCT_PACKAGES+=gps.default.so```注意:在Android10中,如果使用Soong构建系统(Android.bp),也可以采用引用[3]中的方式。但是用户的问题中使用了Android.mk,所以我们优先使用Android.mk。另外,如果so库是32位的,需要特别注意,因为64位系统中vendor/lib是32位库的目录,而vendor/lib64是64位库的目录。如果so库是32位的,则使用vendor/lib/hw;如果是64位的,则使用vendor/lib64/hw。在Android.mk中,可以通过判断目标架构来设置路径,但通常我们根据so库的位数放在对应的目录。这里,我们可以创建两个模块分别处理32位和64位,或者只提供一种位数的库。如果只提供一种,则直接按上述方式即可。如果需要同时提供32位和64位,则需要在Android.mk中定义两个模块,并分别指定路径。例如,32位so放在lib/hw,64位放在lib64/hw。但通常预编译的so库会有两个版本。假设我们有两个文件:gps.default.so(32位)和gps.default_64.so(64位),我们可以这样:```makefileLOCAL_PATH:=$(callmy-dir)#32位include$(CLEAR_VARS)LOCAL_MODULE:=gps.default_32LOCAL_SRC_FILES:=gps.default.soLOCAL_MODULE_TAGS:=optionalLOCAL_MODULE_CLASS:=SHARED_LIBRARIESLOCAL_MODULE_SUFFIX:=.soLOCAL_MULTILIB:=32LOCAL_MODULE_PATH:=$(TARGET_OUT_VENDOR)/lib/hwinclude$(BUILD_PREBUILT)#64位include$(CLEAR_VARS)LOCAL_MODULE:=gps.default_64LOCAL_SRC_FILES:=gps.default_64.soLOCAL_MODULE_TAGS:=optionalLOCAL_MODULE_CLASS:=SHARED_LIBRARIESLOCAL_MODULE_SUFFIX:=.soLOCAL_MULTILIB:=64LOCAL_MODULE_PATH:=$(TARGET_OUT_VENDOR)/lib64/hwinclude$(BUILD_PREBUILT)```然后在device.mk中添加两个模块:```makefilePRODUCT_PACKAGES+=gps.default_32gps.default_64```但是,这样安装后的文件名会带有_32和_64,我们需要重命名。或者我们可以让模块名与最终文件名一致,但源文件不同。我们可以这样:32位的模块名仍为gps.default,但通过LOCAL_MULTILIB指定32位,并放在lib/hw下,这样安装后的文件名就是gps.default.so,且放在vendor/lib/hw下。同样,64位的模块名也设置为gps.default,但放在lib64/hw下。由于构建系统会根据目标架构选择,但这样会有冲突(因为模块名相同)。所以通常做法是模块名不同,然后通过LOCAL_MODULE_RELATIVE_PATH来指定路径,但这里我们使用两个不同的模块名,然后在安装时重命名。另一种做法是,在同一个Android.mk中,使用相同的模块名但不同的多库设置,但这样会冲突。所以推荐使用两个模块,并分别设置路径和文件名。但是,我们也可以这样:只用一个模块,但通过LOCAL_MULTILIB设置both,然后分别指定32位和64位的源文件,但这样需要将32位和64位的源文件放在不同的目录(如lib和lib64)下,然后通过LOCAL_SRC_FILES_32和LOCAL_SRC_FILES_64来指定。例如:```makefileLOCAL_PATH:=$(callmy-dir)include$(CLEAR_VARS)LOCAL_MODULE:=gps.defaultLOCAL_MODULE_TAGS:=optionalLOCAL_MODULE_CLASS:=SHARED_LIBRARIESLOCAL_MODULE_SUFFIX:=.soLOCAL_MULTILIB:=both#32位LOCAL_SRC_FILES_32:=lib/gps.default.so#64位LOCAL_SRC_FILES_64:=lib64/gps.default.so#构建系统会自动安装到对应的目录(vendor/lib/hw和vendor/lib64/hw)include$(BUILD_PREBUILT)```这样,我们只需要在prebuilt目录下创建lib和lib64子目录,分别放入对应的so文件。然后在device.mk中添加gps.default模块即可。但是,我们要求安装到hw子目录,而上述方法会自动安装到lib和lib64下,而不是lib/hw和lib64/hw。因此,我们需要指定路径:```makefileLOCAL_MODULE_PATH_32:=$(TARGET_OUT_VENDOR)/lib/hwLOCAL_MODULE_PATH_64:=$(TARGET_OUT_VENDOR)/lib64/hw```所以完整的Android.mk为:```makefileLOCAL_PATH:=$(callmy-dir)include$(CLEAR_VARS)LOCAL_MODULE:=gps.defaultLOCAL_MODULE_TAGS:=optionalLOCAL_MODULE_CLASS:=SHARED_LIBRARIESLOCAL_MODULE_SUFFIX:=.soLOCAL_MULTILIB:=bothLOCAL_SRC_FILES_32:=lib/gps.default.soLOCAL_SRC_FILES_64:=lib64/gps.default.soLOCAL_MODULE_PATH_32:=$(TARGET_OUT_VENDOR)/lib/hwLOCAL_MODULE_PATH_64:=$(TARGET_OUT_VENDOR)/lib64/hwinclude$(BUILD_PREBUILT)```然后在device.mk中添加:```makefilePRODUCT_PACKAGES+=gps.default```这样,在编译时,32位的so会被安装到vendor/lib/hw,64位的安装到vendor/lib64/hw。总结:根据预编译so库的位数,选择合适的方法。如果只有一种位数,则使用第一种简单方法;如果同时有32位和64位,则使用上述第二种方法。用户的问题中只提到了一个so文件,所以可能只需要第一种方法。但为了通用性,我们提供两种方案。最后,用户需要确保在Android10的编译环境中,已经正确设置了vendor分区的相关配置。注意:在Android10中,由于Treble计划,vendor分区需要严格的兼容性,所以添加预编译库时要注意接口的稳定性。&lt;/think>在 Android 10 中将预编译的 so 库添加到 `/vendor/lib/hw` 目录,需要通过构建系统配置实现。以下是具体步骤: ### 解决方案步骤 1. **创建 Android.mk 文件** 在预编译 so 库所在目录新建 `Android.mk`,配置如下: ```makefile LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE := gps.default.so # 模块名(不含扩展名) LOCAL_SRC_FILES := gps.default.so # 源文件名 LOCAL_MODULE_CLASS := SHARED_LIBRARIES # 声明为共享库 LOCAL_MODULE_TAGS := optional LOCAL_MODULE_PATH := $(TARGET_OUT_VENDOR)/lib/hw # 目标路径 LOCAL_MODULE_RELATIVE_PATH := hw # 关键!确保安装到 hw 子目录 include $(BUILD_PREBUILT) # 预编译声明 ``` 2. **在产品配置中启用模块** 在设备配置文件(如 `device.mk` 或 `device_*.mk`)中添加: ```makefile PRODUCT_PACKAGES += gps.default.so # 与 LOCAL_MODULE 名称一致 ``` 3. **文件位置要求** 确保预编译 so 文件与 `Android.mk` 同级存放: ``` device/<厂商&gt;/<设备&gt;/prebuilt/ ├── Android.mk └── gps.default.so ``` ### 关键说明 1. **路径配置** - `LOCAL_MODULE_PATH := $(TARGET_OUT_VENDOR)/lib/hw` 指定 vendor 分区路径 - `LOCAL_MODULE_RELATIVE_PATH := hw` 确保生成 `vendor/lib/hw/` 目录结构 2. **Android 10 变化** 相比旧版本,必须明确使用: ```makefile LOCAL_MODULE_CLASS := SHARED_LIBRARIES # 而非 EXECUTABLES LOCAL_MODULE_PATH := $(TARGET_OUT_VENDOR)/... # 显式指定 vendor 路径 ``` 3. **验证安装** 编译后检查输出目录: ```bash out/target/product/<设备&gt;/vendor/lib/hw/gps.default.so ``` ### 替代方案(Android.bp) 若使用 Soong 构建系统,创建 `Android.bp`: ```python cc_prebuilt_shared_library { name: "gps.default", vendor: true, srcs: ["gps.default.so"], compile_multilib: "first", relative_install_path: "hw", # 关键路径配置 strip: { none: true, # 不裁剪符号表 }, } ``` > **注意**:实际模块名需与 `PRODUCT_PACKAGES` 中的名称严格匹配,且路径配置错误是编译失败的常见原因[^1][^2]。 ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

「已注销」

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值