18

我正在尝试测试我的应用程序在各种情况下的行为,比如假设有很多 RAM 和 CPU 正在使用,或者网络被其他一些应用程序消耗,或者电池被另一个应用程序耗尽。

现在,假设我想要使用 (100-X)% 的 RAM(呈现不可用)并且我的应用程序只有 X% 可以使用,我该如何模拟它并在这种情况下运行我的应用程序?

同样,假设由于系统上运行了各种其他应用程序,我只有 Y% 的网络可用,现在我想渲染 (100-Y)% 的网络可用性来模拟并在这种情况下运行我的应用程序。

CPU 正忙 (100-Z)% 并且只有 Z% 的时间可用于我想要测试的应用程序。

这些是我想模拟的情况。有人可以向我展示一个工具或向我解释一种方法吗?

4

5 回答 5

9

您的要求是您希望在您可以控制的压力或释放条件下测试应用程序。所以这里我可以看到的解决方案是

  • 您可以再开发一个应用程序(主要是后台服务),负责增加或减少 CPU 周期、占用或释放内存并通过网络操作保持网络繁忙(制作简单的 UI 来提供输入)

    1. CPU 周期:创建多个线程,这些线程将执行浮点操作并消耗大量 CPU 周期,并且可以在不需要时保持睡眠

    2. 内存:需要编写 C 代码(malloc 将内存分配给指针)并通过 JNI 和函数访问它以释放它。使用 java 中的 memory 函数来监控当前使用情况

    3. 网络:在需要时从保管箱或其他服务器下载大量文件并根据需要监控状态。

在此配置运行服务后,启动所需的应用程序并在该条件下进行测试。

于 2013-06-04T04:15:58.707 回答
6

要测试应用程序的性能,您可以使用调试跟踪工具。并查看 如何测试 Android 应用程序的性能?

此链接还提供了一些测试应用程序性能的工具。

你可以使用一些这样的应用程序,或者你可以编写一些应用程序来对 CPU 和 RAM 进行压力测试。

如何以编程方式对手机的 CPU 施加压力?

于 2013-05-30T09:17:40.560 回答
3

根据我对您问题的理解,您的要求是模拟设备上其他应用程序的效果,看看它如何影响您的应用程序。

RAM - 每个进程都有自己的内存,因为在 android 中内存是每个进程的。这个 dalvik 堆限制是 VM 提供给应用程序的保证内存量。任何其他应用程序都不会侵犯此限制。然而,所有应用程序和进程也有一个本机堆。

网络 - 可以通过在连接到 Web 服务器并以固定间隔交换固定大小的消息的设备上运行应用程序来模拟网络可用性的不足。

CPU - 授予您的应用程序的 CPU 周期肯定取决于其他应用程序在 CPU 上的负载,但它完全取决于操作系统来决定如何安排 cpu 周期。为了确保您的应用程序仅获得 Z% 的 CPU 时间,充其量只是一个近似值。

如果您的要求是对您的应用程序进行性能测试(与设备上其他应用程序的影响),您可以尝试http://www.littleeye.co。它从设备上的其他应用程序中提供特定应用程序的性能数据(Memory-Dalvik+Native、Network-2G+3G+Wifi、Cpu 周期和功耗)。它能够为发布构建 apk 收集数据,这意味着您可以测试最终产品的性能。

免责声明:我与 Little Eye Labs 有关联

于 2013-06-03T22:53:02.453 回答
1

我也遇到过这个问题。有一些符合 posix 标准的负载生成工具。我发现压力是一个很有吸引力的工具,因为它可以让你控制 CPU 或 IO 上的压力。为了充分利用这一点,我正在围绕它编写一个包装器来设置正在生成的负载量。

这是为 android 编译的二进制文件。

这是原始站点,压力项目页面

于 2014-05-09T15:38:20.927 回答
0

感谢@Dinesh Prajapati,这对我帮助很大,我编写了一个线程类来进行浮点计算,并且 cpu 空闲百分比像我预期的那样下降了很多。我想把我的解决方案放在这里以供参考:

@Override
    public void run() {
        Random rd = new Random();
        float a, b;
        int x, y;
        @SuppressWarnings("unused") double r;
        while (run) {
            x = rd.nextInt(20) + 20;
            y = rd.nextInt(20) + 20;
            a = rd.nextFloat();
            b = rd.nextFloat();
            //noinspection UnusedAssignment
            r = Math.pow(a + x, b + y) / Math.tan((double) (a + x) / (b + y));
        }
    }

非常感谢。

于 2019-05-08T09:58:28.427 回答