【问题标题】:Permanently increase file descriptor ulimit in Android without being root在Android中永久增加文件描述符ulimit而不是root
【发布时间】:2019-07-12 13:23:30
【问题描述】:

在我的 Android 应用程序中,我遇到了几个带有 Too many open files 错误的问题。

我确定我的应用程序中没有文件描述符泄漏,并且我当前的上限设置为 1024 个打开的文件:

adb shell ulimit -a

    time(cpu-seconds)    unlimited
    file(blocks)         unlimited
    coredump(blocks)     0
    data(KiB)            unlimited
    stack(KiB)           8192
    lockedmem(KiB)       64
    nofiles(descriptors) 1024
    processes            12016
    sigpending           12016
    msgqueue(bytes)      819200
    maxnice              40
    maxrtprio            0
    resident-set(KiB)    unlimited
    address-space(KiB)   unlimited

我没有root权限,所以我尝试使用以下命令增加这个数字:

adb shell ulimit -n 2048

但限制没有改变。所以我更改了我的用户 ID 并重试:

adb shell run-as [package.name]
~ ulimit -n 2048
~ ulimit -a

    limit -a                      
    time(cpu-seconds)    unlimited
    file(blocks)         unlimited
    coredump(blocks)     0        
    data(KiB)            unlimited
    stack(KiB)           8192     
    lockedmem(KiB)       64       
    nofiles(descriptors) 2048     
    processes            12016    
    sigpending           12016    
    msgqueue(bytes)      819200   
    maxnice              40       
    maxrtprio            0        
    resident-set(KiB)    unlimited
    address-space(KiB)   unlimited

而且我已经实现了仅为当前进程增加此限制。当我重新启动应用程序时,限制再次为 1024。

还有其他方法可以永久提高此限制吗?

P.S.我也搜索了/etc/security/limits.conf文件,但没有任何运气

【问题讨论】:

    标签: android shell adb file-descriptor


    【解决方案1】:

    您可以使用 ndk 的 sytem api getrlimit/setrlimit 来获取或设置资源限制,而不是使用 ulimit -n 来增加最大打开文件数。您可以在应用启动时或应用运行期间调用这些 API。

        struct rlimit rlm {};
        if (getrlimit(RLIMIT_NOFILE, &rlm) < 0) {
            LOGE("getrlimit %s", strerror(errno));
        } else {
            __android_log_print(ANDROID_LOG_DEBUG, TAG, "%d %d", rlm.rlim_cur, rlm.rlim_max);
            rlm.rlim_cur = rlm.rlim_max;
            if (setrlimit(RLIMIT_NOFILE, &rlm) < 0) {
                LOGE("setrlimit %s", strerror(errno));
            }
        }
    

    但是你可能在Android的资源限制调整上运气不好,在我测试的Android设备中,打开文件的当前限制和最大限制分别是1024/1346。即使您将限制设置为最大值 1346,也不会获得太多好处。

    man7查看getrlimit/setrlimit的更多信息。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-07-08
      • 1970-01-01
      • 1970-01-01
      • 2017-07-23
      • 2016-03-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多