Android调试问题汇总

1,036 阅读1分钟

Too many open files : E Parcel : dup() failed in Parcel::read, i is 1, fds[i] is -1, fd_count is 2, error:Too many open files

解决:linux应用进程一般允许启用1024个文件描述符(FD),如果有资源占用并且忘记释放,非常容易超出,比如打开匿名共享内存或在jni中opendir不调用closedir

1. 查看应用pid
2. ls -a -l /proc/<pid>/fd 
查看异常文件描述符,对应处理

FFMPEG YUV视频抽帧

$ ffmpeg -y -s 1088x1920 -i /Users/loki/Desktop/tmp_live1_0.yuv  ../test.jpg

FFMPEG 视频抽帧

$ ffmpeg -i vid.avi -r 20 mmm%5d.png

线程绑核

#define __USE_GNU
#include<sched.h>
static int getCores() {
    return sysconf(_SC_NPROCESSORS_CONF);
}

 jint  JNI_bindToCpu(JNIEnv *env,jclass type, jint cpu) {
    int cores = getCores();
    if(cpu>=cores){
        return -2;
    }
    cpu_set_t mask;
    CPU_ZERO(&mask);
    CPU_SET(cpu,&mask);
    if(sched_setaffinity(0, sizeof(mask), &mask)==-1){
        return -1;
    }
    return 0;
}
$ adb shell ps -t -p -c

可以看出test thread以及jni内部线程均运行在1核上

Android Studio NDK问题

NDK not configured. Download it with SDK manager. Preferred NDK version is '20.0.5594570'. Log: /Users/loki/Desktop/work/proj_out/PassengerMock/moc2/.cxx/ndk_locator_record.json

 在项目local.properties中配置ndk.dir

Failed resolution of: Landroidx/localbroadcastmanager/content/LocalBroadcastManager;

解决: gradle中添加依赖: implementation 'androidx.legacy:legacy-support-v4:1.0.0'

使用命令重新签系统的签名

$ java -Djava.library.path=. -jar signapk.jar platform.x509.pem platfrom.pk8 app.apk out.apk