Android 在SD和Internal memory之间移动App,具体做了什么?

本文详细解析了移动应用从内部存储迁移到SD卡的过程,包括应用数据、APK文件以及lib文件的具体存放位置。

Stack Overflow上有一个答案解释了系统在移动App时具体做的事。

http://stackoverflow.com/questions/13043783/android-move-app-to-sd


Q:

Actually I want to find that what kind of items that are involved when we move the app to sd card? I have tried to search, but all the answer point me to "how to move app to sd" but actually I just want to know what items been move to sd and what items are left. I can see that there is still some memory left (in internal memory) when I move the app to sd. I am just curious what are the things left ? Where actually the app move to (in which part of the sd card)?


A:

Good Question!

Let me explain you with an example package say "com.example.app"

Now, when a app is installed for the first time, a new folder will be created by the name

/data/com.example.app

Inside this will contain all the app private data.

Similary, the APK itself is contained in

/data/app/com.example.app-1.apk

Now, when we move application to external storage, the following happens.

  • It will not be moved to /mnt/sdcard/ partition
  • Android will create a new folder under /mnt/asec partiton called /mnt/asec/com.example.app. You can reach this path using any File Manager apps as it has rw permissions
  • It will create a copy of libs directory if any and move all the files, databases here.
  • It will also copy the APK from "/data/app/com.example.app-1.apk" to /mnt/asec/com.example.app/com.example.app-1.apk

In this way, /data partition space will be saved and can be reused for other apps. This is a good trick to use when phone gets low on /data storage to move apps to external storage.


-----------------------------------------------------------------------------------------------------------------------------------------------------------------------

以我本机的UC浏览器为例,主要做了这些:

internal memory:

有一个lib文件夹,里面都是.so文件

lib: /data/data/com.UCMobile/lib

还有一个APK文件

apk: /data/app/com.UCMobile-1.apk


SDCard:

移动到SD卡以后,lib就被移动到这个位置

lib: /mnt/asec/com.UCMobile-1/lib

APK被移动到

apk: /mnt/asec/com.UCMobile-1/pkg.apk

<think>嗯,我现在要了解一下com.android.internal.app.IBatteryStats这个服务。首先,这个名字里的IBatteryStats看起来像是一个接口,因为通常以"I"开头的类名在Android中表示接口,比如IBinder。然后,这个包名是com.android.internal.app,说明这是Android内部的一个接口,可能应用层面的电池统计有关。 我记得Android系统中有一个BatteryStats服务,用来收集电池使用情况的数据,比如各个应用的耗电量、CPU使用时间等等。可能IBatteryStats就是这个服务的接口,让其他组件可以通过Binder机制来调用它的方法。 接下来,我需要确定这个接口对应的代码位置。Android的框架代码通常可以在AOSP(Android Open Source Project)中找到。com.android.internal.app包下的类应该位于frameworks/base/core/java目录下。不过具体到IBatteryStats,可能需要进一步查找。 另外,Android中的服务通常会有对应的AIDL文件,因为跨进程通信需要用到。不过IBatteryStats可能不是AIDL生成的,而是直接编写的接口,因为在内部代码中,有时候会直接定义接口而不使用AIDL。不过也有可能存在AIDL文件,比如在frameworks/base/core/java/android/os/IBatteryStats.aidl这样的路径下。 或者,可能在frameworks/base/core/java/com/android/internal/app/IBatteryStats.java这个路径下。不过实际查看代码仓库的话,可能需要确认。比如,在AOSP的代码库中搜索IBatteryStats,可能会找到具体文件位置。 另外,BatteryStatsService可能是在frameworks/base/services/core/java/com/android/server/am/BatteryStatsService.java或者其他类似的位置。而IBatteryStats作为其接口,可能被定义在com.android.internal.app包中,而实现类可能是在server下的某个地方。 比如,可能在frameworks/base/core/java/com/android/internal/app/IBatteryStats.java中定义接口,而实现在frameworks/base/services/core/java/com/android/server/am/BatteryStatsServiceImpl.java或者类似的类中。 再想想,BatteryStats相关的类可能属于系统服务的一部分,由SystemServer启动。BatteryStatsService可能会收集来自内核或其他底层组件的数据,比如CPU使用情况、WakeLock持有时间等,然后通过IBatteryStats接口提供给其他系统组件或应用使用。 另外,权限方面,访问电池统计信息可能需要特定的权限,比如BATTERY_STATS,所以IBatteryStats接口的方法可能只允许有权限的调用者访问。 总结一下,我需要确认以下几点: 1. IBatteryStats是一个接口,属于Android内部API,用于电池统计相关功能。 2. 对应的代码位置可能在frameworks/base/core/java/com/android/internal/app/IBatteryStats.java。 3. 实现该接口的服务类可能在frameworks/base/services下的某个位置,比如BatteryStatsService。 4. 该服务通过Binder机制提供给其他进程调用,管理电池使用数据的收集查询。 为了验证这些,我需要查找AOSP中的相关代码。例如,在AOSP的代码库中搜索IBatteryStats,看看它的定义在哪里。比如,可能在frameworks/base/core/java/com/android/internal/app/IBatteryStats.java中找到接口定义,而实现在frameworks/base/services/core/java/com/android/server/am/BatteryStatsService.java中。 或者,可能该接口实际上是在frameworks/base/core/java/android/os/IBatteryStats.aidl中定义的AIDL接口,这样会生成对应的Java类。不过根据包名com.android.internal.app,可能并不是在android.os包下。 可能需要进一步查阅资料或者直接查看源代码结构。例如,通过在线AOSP代码搜索工具,比如android.googlesource.com,搜索IBatteryStats,看看结果。 假设搜索后发现,IBatteryStats.java位于frameworks/base/core/java/com/android/internal/app/IBatteryStats.java,而BatteryStatsService在frameworks/base/services/core/java/com/android/server/am/BatteryStatsService.java中实现这个接口,并将其注册为系统服务。 另外,可能BatteryStats的实现类叫BatteryStatsImpl,位于frameworks/base/core/java/com/android/internal/os/BatteryStatsImpl.java,而IBatteryStats接口是其对外暴露的接口,由BatteryStatsService作为服务端实现。 不过这可能涉及到更详细的代码结构。例如,BatteryStatsImpl可能实现了IBatteryStats.Stub类,作为Binder的Stub实现,而BatteryStatsService则负责管理这个实例并将其注册到ServiceManager中。 总之,IBatteryStats是电池统计服务的接口,允许系统组件查询电池使用情况,对应的代码位于frameworks/base/core/java/com/android/internal/app/目录下的IBatteryStats.java,而具体的服务实现可能在services相关的路径下。</think>`com.android.internal.app.IBatteryStats` 是 Android 系统中的一个**内部接口**,用于提供电池使用统计相关的数据服务。它属于 Android 框架层,主要用于跟踪应用系统组件的电量消耗(如 CPU 唤醒、传感器使用、WakeLock 持有时间等),并通过 Binder 机制实现跨进程通信(IPC)。 --- ### **核心功能** - 记录应用硬件的电池使用情况(如 Wi-Fi、蓝牙、屏幕等)。 - 统计 CPU 运行时间、WakeLock 持有时间等。 - 为系统服务(如 `PowerManagerService`)提供电池数据支持。 --- ### **代码位置** #### 1. **接口定义** - **路径**: `frameworks/base/core/java/com/android/internal/app/IBatteryStats.java` [AOSP 代码链接](https://cs.android.com/android/platform/superproject/+/master:frameworks/base/core/java/com/android/internal/app/IBatteryStats.java) 这是一个 Java 接口,定义了电池统计服务的方法(如 `noteWakeUp()`、`noteWifiOn()` 等)。 #### 2. **服务实现** - **实现类**: `BatteryStatsService` - **路径**: `frameworks/base/services/core/java/com/android/server/am/BatteryStatsService.java` [AOSP 代码链接](https://cs.android.com/android/platform/superproject/+/master:frameworks/base/services/core/java/com/android/server/am/BatteryStatsService.java) 它继承自 `IBatteryStats.Stub`(由 Binder 生成),并调用底层 `BatteryStatsImpl` 完成具体逻辑。 #### 3. **数据存储与计算** - **核心逻辑类**: `BatteryStatsImpl` - **路径**: `frameworks/base/core/java/com/android/internal/os/BatteryStatsImpl.java` [AOSP 代码链接](https://cs.android.com/android/platform/superproject/+/master:frameworks/base/core/java/com/android/internal/os/BatteryStatsImpl.java) 负责实际的数据存储、统计历史记录。 --- ### **调用关系** 1. **系统服务注册** `BatteryStatsService` 在 `SystemServer` 启动时初始化,并注册到 `ServiceManager` 中,供其他组件调用。 2. **接口调用示例** 系统服务(如 `PowerManagerService`)通过 `IBatteryStats` 接口上报事件: ```java IBatteryStats batteryStats = IBatteryStats.Stub.asInterface( ServiceManager.getService("batterystats")); batteryStats.noteWakeUp("wakelock_tag"); ``` --- ### **权限与限制** - 该接口是 **@hide 的 internal API**,仅限系统级组件(如系统服务)调用。 - 普通应用无法直接访问,需声明 `android.permission.BATTERY_STATS` 权限(仅系统应用可用)。 --- ### **关联组件** - **BatteryService**: 负责底层电池状态(如电量百分比)的监控。 - **PowerManagerService**: 依赖电池统计服务管理 WakeLock 功耗策略。 - **UsageStatsService**: 结合电池数据生成应用使用统计。 如需深入代码细节,可查阅上述 AOSP 链接或下载源码本地分析。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值