在Android中永久增加文件描述符ulimit而无需成为root

cedebl8k  于 2023-03-06  发布在  Android
关注(0)|答案(2)|浏览(215)

在我的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

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

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文件,但没有任何运气

velaa5lx

velaa5lx1#

除了使用ulimit -n来增加最大打开文件数,你可以使用ndk的system 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,也不会得到太多好处。
请从man7查看getrlimit/setrlimit的更多信息。

8i9zcol2

8i9zcol22#

我今天测试了两个设备,第一个是谷歌像素3XL,第二个是三星s20FE.

struct rlimit limit;
    getrlimit(RLIMIT_NOFILE, &limit);
__android_log_print(ANDROID_LOG_INFO, "FDTEST", "fd limit cur=%d max=%d", limit.rlim_cur, limit.rlim_max);

两个报告值均高于32k:
FD限值电流=32768最大值=32768
怎么可能?这比1024还要多

相关问题