persist应用

1.什么是persist应用?

在AndroidManifest.xml中的applicationtag中定义:android:persistent="true"

在解析此应用时,给它增加一个flag:ApplicationInfo.FLAG_PERSISTENT

// PackageParser.java parseBaseApplication
if ((flags&PARSE_IS_SYSTEM) != 0) {
    if (sa.getBoolean(
            com.android.internal.R.styleable.AndroidManifestApplication_persistent,
            false)) {
        ai.flags |= ApplicationInfo.FLAG_PERSISTENT;
    }
}

// ApplicationInfo.java
/**
 * Value for {@link #flags}: set to true if this application is persistent.
 * Comes from {@link android.R.styleable#AndroidManifestApplication_persistent
 * android:persistent} of the <application> tag.
 */
public static final int FLAG_PERSISTENT = 1<<3;

从注释可知,这代表此应用为persist app。


2.如何查询persit应用以及谁会去查询?

PackageManagerService.java提供了方法public List<ApplicationInfo> getPersistentApplications(int flags)可供查询.

依据就是查看哪个Application包含这个前面提到的flag:ApplicationInfo.FLAG_PERSISTENT

谁会查询或关注这点?

AMS会关注,在它的systemReady方法中调用,目的就是在system ready后启动这些persist应用。所以,他们会由系统自动启动,在BOOT_COMPLETED之前。

具体流程如下:

startOtherServices() //SystemServer.java
systemReady(final Runnable goingCallback) // ActivityManagerService.java
addAppLocked(info, false, null /* ABI override */);
startProcessLocked(app, "added application", app.processName, abiOverride, null /* entryPoint */, null /* entryPointArgs */);
Process.start(...)

3.log信息

// system ready
06-05 21:14:29.620509   763   763 I SystemServer: Making services ready
06-05 21:14:29.640944   763   763 I ActivityManager: Start proc com.android.systemui for service com.android.systemui/.SystemUIService: pid=864 uid=10022 gids={50022, 1028, 1015, 1035, 3002, 3001, 3003, 1007}
06-05 21:14:29.641193   763   817 I MountService: handleSystemReady
06-05 21:14:29.943741   763   763 D UsbDeviceManager: systemReady
06-05 21:14:29.949129   763   763 D AppWidgetService: systemRunning
06-05 21:14:29.949196   763   763 I AppWidgetServiceImpl: u=0: systemReady
06-05 21:14:29.979798   763   763 V WallpaperManagerService: systemReady
06-05 21:14:30.069004   763   763 I RecoveryManagerService: systemReady()
// start persist app
06-05 21:14:30.243268   763   763 I ActivityManager: Start proc com.android.phone for added application com.android.phone: pid=1007 uid=1001 gids={41001, 3002, 3001, 3003, 1028, 1015, 1013, 1006, 1004, 2002, 1023}
06-05 21:14:30.262986   763   763 I ActivityManager: Start proc com.mediatek.voicecommand for added application com.mediatek.voicecommand: pid=1019 uid=10084 gids={50084, 1028, 1015, 1013, 1006}
06-05 21:14:30.273884   763   763 I ActivityManager: Start proc com.mediatek.bluetooth for added application com.mediatek.bluetooth: pid=1033 uid=1002 gids={41002, 3003, 3002, 3001, 1028, 1015, 3005, 1016, 3008, 1023, 1035}
06-05 21:14:30.322054   763   763 I ActivityManager: Start proc com.mediatek.voiceextension for added application com.mediatek.voiceextension: pid=1047 uid=1000 gids={41000, 1007, 1028, 1015, 3005, 3003, 3006, 1023, 3002, 3001}
06-05 21:14:30.416317   763   763 I ActivityManager: Start proc android.process.acore for added application android.process.acore: pid=1125 uid=10008 gids={50008, 3003, 1028, 1015}
06-05 21:14:30.434718   763   763 I ActivityManager: Start proc com.android.incallui for added application com.android.incallui: pid=1139 uid=10049 gids={50049, 3003, 1028, 1015}
// BOOT_COMPLETED
06-05 21:14:33.021543   763  1046 V ActivityManager: Broadcast: Intent { act=android.intent.action.BOOT_COMPLETED flg=0x8000010 (has extras) } ordered=true userid=0 callerApp=null

03-23
<think>好的,用户想了解编程中“persist”的含义和用法。首先,我需要回忆一下在编程中persist通常指的是什么。记得在数据存储和状态管理中,persist通常指将数据持久化,也就是保存到非易失性存储介质中,比如数据库或文件系统,这样即使程序关闭后数据也不会丢失。 接下来,可能需要从不同编程场景来举例说明。比如在数据库操作中,使用ORM框架时,调用persist方法可以将对象保存到数据库。例如Java的JPA中,EntityManager的persist方法用于将实体对象插入数据库,这应该是一个常见的用例。此外,在内存缓存方面,像Redis这样的工具,persist命令可以移除键的过期时间,使其永久保存,这也是一个应用场景。 另外,用户可能还涉及到持久化存储的其他方面,比如文件操作中的写入操作,或者在前端开发中,使用本地存储(localStorage)来持久化用户数据。这些都属于persist的范畴。 还要注意,用户提供的引用资料中有提到Spark的RDD持久化,比如cache()和persist()方法,用于将RDD数据缓存到内存或磁盘,避免重复计算。这也需要详细说明,因为这是性能优化的重要部分。 需要检查引用内容,看看是否有相关的信息支持这些解释。比如引用[2]提到自定义对象作为键时需要正确实现hashCode和equals方法,这可能与持久化后的数据检索有关。而引用[3]中的sort和join操作可能涉及到数据处理后的持久化步骤,但需要具体分析。 另外,用户问题中的persist可能还涉及事务处理,比如引用[4]提到的finishTransaction方法,确保事务完成后再调用,这可能和持久化操作的原子性有关,比如数据库事务提交后才能保证数据的持久化。 总结下来,persist在编程中的主要用途是确保数据在程序结束后仍然存在,可以通过不同的技术实现,如数据库存储、文件写入、缓存持久化等。需要结合具体编程语言和框架来举例说明,比如Java、Python、Spark等,同时引用相关资料中的内容来增强回答的可信度。 最后,生成相关问题时要覆盖不同应用场景和技术,帮助用户进一步探索persist的不同方面,比如性能优化、数据安全、框架使用等。</think>### Persist的定义及用法 在编程中,**persist**(持久化)指将数据或状态从临时存储(如内存)保存到持久存储介质(如磁盘、数据库等),确保数据在程序终止后仍可长期保留。这一概念在数据库操作、缓存管理、分布式计算等领域广泛应用。 #### 1. 数据库中的持久化 在数据库操作中,持久化通常指将内存中的对象状态同步到数据库表中。例如: - **JPA(Java Persistence API)**:通过`EntityManager.persist()`方法将实体对象插入数据库: ```java EntityManager em = ...; User user = new User("Alice"); em.persist(user); // 将对象保存到数据库 ``` 此操作确保数据在事务提交后持久存储[^1]。 #### 2. 缓存与分布式计算中的持久化 在内存缓存或分布式框架(如Apache Spark)中,持久化用于避免重复计算: - **Spark RDD持久化**: ```python rdd = sc.textFile("data.txt").map(lambda x: x.upper()) rdd.persist(storageLevel=StorageLevel.MEMORY_AND_DISK) # 将数据缓存到内存或磁盘 ``` 通过`persist()`方法,RDD的计算结果会被保留,后续操作可直接复用,提升性能[^2]。 #### 3. 文件系统的持久化 将数据写入文件或云存储以实现长期保存: - **Python文件写入**: ```python with open("data.txt", "w") as f: f.write("Hello, World!") # 数据持久化到磁盘 ``` #### 4. 前端本地存储 在前端开发中,使用`localStorage`或`sessionStorage`实现数据持久化: - **JavaScript示例**: ```javascript localStorage.setItem("user", JSON.stringify({ name: "Bob" })); // 数据在浏览器关闭后仍保留 ``` ### 关键特性 - **存储介质选择**:根据性能需求选择内存、磁盘或混合存储。 - **事务一致性**:如引用[4]所述,持久化需与事务机制配合,确保数据完整性[^4]。 - **生命周期管理**:需手动释放资源(如Spark的`unpersist()`)。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值