开始使用内存建议API

本指南介绍如何在您的应用中集成 Jetpack 版本内存建议API,使用 Android Studio。

游戏应使用其构建环境推荐的内存建议API版本。对于Android Studio,我们推荐使用Jetpack版本。有关其他构建环境(如 Android游戏开发扩展(AGDE))的版本信息,请参阅 分发

添加库

本节介绍如何将库添加到您的Android Studio(Android Gradle插件)项目中。

添加依赖项

要将库添加到您的Android Studio项目中,请完成以下步骤

  1. 在项目级 gradle.properties 文件中启用Android Jetpack库,该文件通常位于项目的根目录中

      android.useAndroidX=true
    
  2. 打开模块级 build.gradle 文件,并在依赖项块中添加以下 implementation。这将在您的应用中声明 内存建议API依赖项

     dependencies {
         implementation 'androidx.games:games-memory-advice:1.0.0-beta01'
     }
    
  3. android 块内指定NDK版本

     ndkVersion "23.1.7779620"
    

    确保选择与内存建议API兼容的NDK版本。支持的NDK版本列表可在 Android游戏Jetpack发布页面 上找到。

  4. 为CMake声明其他构建标志。为此,请将以下代码添加到 android 块内的 defaultConfig 块中

     externalNativeBuild {
         cmake {
             cppFlags '-std=c++14'
             // c++_shared flavor is the only supported STL type.
             arguments "-DANDROID_STL=c++_shared"
         }
     }
    
  5. 启用 预制件 功能。对于Android Gradle插件(AGP) 4.1或更高版本,请将以下代码添加到 android 块中

     buildFeatures {
        prefab true
     }
    

    如果您使用的是AGP 4.0或更旧版本,请参阅 预制件页面 以获取配置说明。

  6. 保存文件。如果您看到以下消息,请单击“立即同步”按钮以更新您的项目

      Gradle files have changed since last project sync. A project sync may be
      necessary for the IDE to work properly.
    

为C/C++构建配置CMake

要将内存建议API的头文件和运行时库添加到您的项目中,请打开项目的main CMakeLists.txt 文件。在“项目”窗格中,该文件位于app > src > main > cpp 中。打开文件后,执行以下步骤

  1. 在文件顶部附近,在任何 cmake_minimum_requiredproject 行之后添加以下行

     find_package(games-memory-advice REQUIRED CONFIG)
    
  2. target_link_libraries 命令中,添加 games-memory-advice::memory_advice。这使内存建议API成为您项目原生库的依赖项,并将其包含在最终的应用程序包中。更新应类似于以下内容

     target_link_libraries(
         your-native-lib
    
         #link memory advice to the project
         games-memory-advice::memory_advice
    
         #rest of the dependencies
         #...
     )
    

配置Java文件

内存建议API附带的原生库是 libmemory_advice.so。它是您应用自己的C/C++共享库的编译依赖项,并在您的应用使用 System.loadlibrary() 函数加载自己的共享库时自动加载。

此步骤是可选的。

  1. 找到加载原生库的项目中的Java代码。如果不存在,请添加它。该代码应类似于 System.loadLibrary("your-native-lib"),并位于 static 块中。

  2. System.loadLibrary("your-native-lib") 下添加 System.loadLibrary("memory_advice")。更新应类似于以下内容

     static {
         System.loadLibrary("your-native-lib");
         // Note: loading libmemory_advice.so is optional.
         System.loadLibrary("memory_advice");
     }
    

使用库

本节介绍如何使用库。

添加头文件

在您的项目中包含以下库头文件

    #include <memory_advice/memory_advice.h>

初始化库

您需要在应用启动时初始化库一次。为此,请将此代码添加到您的项目中

    MemoryAdvice_init(env, activity);

envactivity 参数是 JNIEnv*jobject 变量,这些变量应该对您的原生库可用。对原生库的每个JNI调用都应包含这些变量。如果您使用的是 GameActivity库,请确保在调用 MemoryAdvice_init 函数之前 将调用线程附加到JavaVM

轮询内存状态

您可以通过以您选择的间隔轮询库来检索应用的内存状态。在您需要轮询库时使用 MemoryAdvice_getMemoryState 函数

    MemoryAdvice_MemoryState state = MemoryAdvice_getMemoryState();
    switch (state) {
      case MEMORYADVICE_STATE_OK:
        // The application can safely allocate significant memory.
        break;
      case MEMORYADVICE_STATE_APPROACHING_LIMIT:
        //The application should minimize memory allocation.
        break;
      case MEMORYADVICE_STATE_CRITICAL:
        // The application should free memory as soon as possible,
        // until the memory state changes.
        break;
    }

设置观察者

您还可以设置 观察者 并注册内存建议API,当状态即将达到限制或临界 内存状态 时(但不包括正常状态),您的观察者函数将被调用。例如,以下代码创建了一个观察者并请求每2秒通知一次内存建议API

    static int USER_DATA;
    constexpr int callback_waittime_ms = 2000;

    void callback(MemoryAdvice_MemoryState state, void* context) {
        switch (state) {
          case MEMORYADVICE_STATE_APPROACHING_LIMIT:
            //The application should minimize memory allocation.
            break;
          case MEMORYADVICE_STATE_CRITICAL:
            // The application should free memory as soon as possible,
            // until the memory state changes.
            break;
        }
    }

    MemoryAdvice_registerWatcher(callback_waittime_ms, callback, &USER_DATA);

后续步骤

请参阅 概述 以获取 其他资源报告问题