Android NDK开发详解之调试和性能分析的手动创建和衡量基准配置文件

Android NDK开发详解之调试和性能分析的手动创建和衡量基准配置文件


应用启动 Android Jetpack 的一部分。

App Startup 库提供了一种在应用启动时初始化组件的简单而高效的方法。库开发者和应用开发者都可以使用应用启动来简化启动序列,并明确设置初始化顺序。

通过应用启动,您可以定义共用单个 Content Provider 的组件初始化程序,而无需为需要初始化的每个组件定义单独的 Content Provider。这可以显著缩短应用启动时间。

设置

如需在库或应用中使用 Jetpack Startup,请将以下代码添加到 Gradle 文件中:
Groovy

dependencies {
    implementation "androidx.startup:startup-runtime:1.1.1"
}

Kotlin

dependencies {
    implementation "androidx.startup:startup-runtime:1.1.1"
}

在应用启动时初始化组件

应用和库通常依赖于在应用启动时立即初始化组件。您可以通过使用 content provider 来初始化每个依赖项来满足此需求,但 content provider 的实例化成本高昂,在不必要的情况下可能会拖慢启动序列。此外,Android 以不确定的顺序初始化 content provider。应用启动提供了一种更高效的方法,可在应用启动时初始化组件并明确定义其依赖项。

如需在应用启动时使用自动初始化组件,您必须为应用需要初始化的每个组件定义组件初始化程序。
实现组件初始化程序

如需定义每个组件初始化程序,您需要创建一个实现 Initializer 接口的类。此接口定义了两个重要方法:

create() 方法,其中包含初始化组件并返回 T 实例的所有必要操作。
dependencies() 方法,该方法返回初始化程序所依赖的其他 Initializer<T> 对象的列表。您可以使用此方法控制应用在启动时的顺序。

例如,假设您的应用依赖于 WorkManager,并需要在启动时对其进行初始化。定义一个实现 Initializer 的 WorkManagerInitializer 类:
Kotlin

// Initializes WorkManager.
class WorkManagerInitializer : Initializer<WorkManager> {
    override fun create(context: Context): WorkManager {
        val configuration = Configuration.Builder().build()
        WorkManager.initialize(context, configuration)
        return WorkManager.getInstance(context)
    }
    override fun dependencies(): List<Class<out Initializer<*>>> {
        // No dependencies on other libraries.
        return emptyList()
    }
}

Java

// Initializes WorkManager.
class WorkManagerInitializer : Initializer<WorkManager> {
    override fun create(context: Context): WorkManager {
        val configuration = Configuration.Builder().build()
        WorkManager.initialize(context, configuration)
        return WorkManager.getInstance(context)
    }
    override fun dependencies(): List<Class<out Initializer<*>>> {
        // No dependencies on other libraries.
        return emptyList()
    }
}

dependencies() 方法会返回一个空列表,因为 WorkManager 不依赖于任何其他库。

假设您的应用还依赖于一个名为 ExampleLogger 的库,该库进而又依赖于 WorkManager。此依赖项意味着,您需要确保应用启动会先初始化 WorkManager。定义一个实现 Initializer 的 ExampleLoggerInitializer 类:
Kotlin

// Initializes ExampleLogger.
class ExampleLoggerInitializer : Initializer<ExampleLogger> {
    override fun create(context: Context): ExampleLogger {
        // WorkManager.getInstance() is non-null only after
        // WorkManager is initialized.
        return ExampleLogger(WorkManager.getInstance(context))
    }

    override fun dependencies(): List<Class<out Initializer<*>>> {
        // Defines a dependency on WorkManagerInitializer so it can be
        // initialized after WorkManager is initialized.
        return listOf(WorkManagerInitializer::class.java)
    }
}

Java

// Initializes ExampleLogger.
class ExampleLoggerInitializer : Initializer<ExampleLogger> {
    override fun create(context: Context): ExampleLogger {
        // WorkManager.getInstance() is non-null only after
        // WorkManager is initialized.
        return ExampleLogger(WorkManager.getInstance(context))
    }

    override fun dependencies(): List<Class<out Initializer<*>>> {
        // Defines a dependency on WorkManagerInitializer so it can be
        // initialized after WorkManager is initialized.
        return listOf(WorkManagerInitializer::class.java)
    }
}

因为您在 dependencies() 方法中添加了 WorkManagerInitializer,所以应用启动会在 ExampleLogger 之前初始化 WorkManager。
注意 :如果您之前曾使用 content provider 初始化应用中的组件,请务必在使用 App Startup 时移除这些 content provider。
设置清单条目

应用启动包含一个名为 InitializationProvider 的特殊 Content Provider,它用于发现和调用组件初始化程序。应用启动会通过以下方式发现组件初始化程序:首先检查 InitializationProvider 清单条目下是否有 条目。然后,应用启动会为其已发现的所有初始化程序调用 dependencies() 方法。

这意味着,为了使应用初始化程序能够被应用启动发现,必须满足以下条件之一:

组件初始化程序在 InitializationProvider 清单条目下具有相应的 <meta-data> 条目。
组件初始化程序列于 dependencies() 方法(由易于发现的初始化程序表示)中。

我们以 WorkManagerInitializer 和 ExampleLoggerInitializer 为例。为确保应用启动可以发现这些初始化程序,请将以下代码添加到清单文件中:


<provider
    android:name="androidx.startup.InitializationProvider"
    android:authorities="${applicationId}.androidx-startup"
    android:exported="false"
    tools:node="merge">
    <!-- This entry makes ExampleLoggerInitializer discoverable. -->
    <meta-data  android:name="com.example.ExampleLoggerInitializer"
          android:value="androidx.startup" />
</provider>

您无需为 WorkManagerInitializer 添加 条目,因为 WorkManagerInitializer 是 ExampleLoggerInitializer 的依赖项。这意味着,如果 ExampleLoggerInitializer 可被发现,那么 WorkManagerInitializer 也会被发现。

tools:node=“merge” 属性可确保清单合并工具正确解析任何存在冲突的条目。
运行 lint 检查

应用启动库包含一组 lint 规则,可用于检查是否已正确定义组件初始化程序。您可以通过从命令行运行 ./gradlew :app:lintDebug 来执行这些 lint 检查。

手动初始化组件

通常,当您使用应用启动时,InitializationProvider 对象会使用名为 AppInitializer 的实体在应用启动时自动发现并运行组件初始化程序。不过,您也可以直接使用 AppInitializer,以便在启动时手动初始化应用不需要的组件。这称为“延迟初始化”,有助于将启动费用降至最低。

您必须为想要手动初始化的任何组件停用自动初始化功能。
停用单个组件的自动初始化功能

如需针对单个组件停用自动初始化功能,请从清单中移除该组件的初始化程序的 条目。

例如,向清单文件中添加以下内容会停用 ExampleLogger 的自动初始化功能:

<provider
    android:name="androidx.startup.InitializationProvider"
    android:authorities="${applicationId}.androidx-startup"
    android:exported="false"
    tools:node="merge">
    <meta-data android:name="com.example.ExampleLoggerInitializer"
              tools:node="remove" />
</provider>

在条目中使用 tools:node=“remove” 而不只是移除条目,以确保合并工具还会从所有其他合并的清单文件中移除该条目。
注意 :为某个组件停用自动初始化也会为该组件的依赖项停用自动初始化。
为所有组件停用自动初始化功能

如需停用所有自动初始化,请从清单中移除 InitializationProvider 的整个条目:

<provider
    android:name="androidx.startup.InitializationProvider"
    android:authorities="${applicationId}.androidx-startup"
    tools:node="remove" />

手动调用组件初始化程序

如果某个组件已停用自动初始化功能,您可以使用 AppInitializer 来手动初始化该组件及其依赖项。

例如,以下代码会调用 AppInitializer 并手动初始化 ExampleLogger:
Kotlin

AppInitializer.getInstance(context)
    .initializeComponent(ExampleLoggerInitializer::class.java)

Java

AppInitializer.getInstance(context)
    .initializeComponent(ExampleLoggerInitializer::class.java)

因此,应用启动还会初始化 WorkManager,因为 WorkManager 是 ExampleLogger 的依赖项。

提供反馈

通过以下资源与我们分享您的反馈和想法:

问题跟踪器
报告问题,以便我们可以修复错误。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

五一编程

程序之路有我与你同行

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

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

打赏作者

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

抵扣说明:

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

余额充值