在没有root的情况下永久增加Android中的文件描述符ulimit

问题描述 投票:0回答:1

在我的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个回答
0
投票

不是使用ulimit -n增加打开的最大文件数,而是可以使用ndk的sytem api getrlimit/setrlimit获取或设置资源限制。您可以在应用启动或应用运行期间调用这些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,也不会获得太多好处。

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

© www.soinside.com 2019 - 2024. All rights reserved.