[안드로이드] android.content.res.Resources$NotFoundException 및 Caused by java.io.FileNotFoundException: This file can not be opened as a file descriptor; it is probably compressed 오류 처리 방법
보통 오류가 발생하면 firebase에서 알림 메일이 오도록 설정해두었다.
이 번에 처음 받아본 메일은 긴급메일 같은 느낌을 받았다. 무엇이 문제일까 궁금하여 메일을 열어보았다.
메일 제목 : [Firebase] Crashlytics 신속 알림 – Android test.TestManagement 7.8.7
“최근 한 시간 동안 장애가 급증하고 있습니다.”
파이어베이스 콘솔에 접근하여 해당 오류를 확인하였다.
5명의 사용자로부터 150번이 넘는 비정상 종료 이벤트가 발생한 것이다.
운영체제는 Android7이 설치된 화훼이, 샤오미, 삼성 폰 등에서 발생되었다.
해당 리소스 파일이 없어서 발생된 문제는 아니다. 그럼 왜 발생했을까???
Fatal Exception:
android.content.res.Resources$NotFoundException:
File res/raw/frog_hongnanpa.mp3 from drawable resource ID #0x7f0e0000
at android.content.res.ResourcesImpl.openRawResourceFd(ResourcesImpl.java:356)
at android.content.res.Resources.openRawResourceFd(Resources.java:1330)
at android.media.MediaPlayer.create(MediaPlayer.java:939)
at android.media.MediaPlayer.create(MediaPlayer.java:922)
at test.TestManagement.TestOffActivity.CallMusic(TestOffActivity.java:283)
at test.TestManagement.TestOffActivity.access$000(TestOffActivity.java:36)
at test.TestManagement.TestOffActivity$2.run(TestOffActivity.java:98)
at android.os.Handler.handleCallback(Handler.java:761)
at android.os.Handler.dispatchMessage(Handler.java:98)
at android.os.Looper.loop(Looper.java:156)
at android.app.ActivityThread.main(ActivityThread.java:6617)
at java.lang.reflect.Method.invoke(Method.java)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:942)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:832)
Caused by java.io.FileNotFoundException: This file can not be opened as a file descriptor; it is probably compressed
at android.content.res.AssetManager.openNonAssetFdNative(AssetManager.java)
at android.content.res.AssetManager.openNonAssetFd(AssetManager.java:795)
at android.content.res.ResourcesImpl.openRawResourceFd(ResourcesImpl.java:354)
at android.content.res.Resources.openRawResourceFd(Resources.java:1330)
at android.media.MediaPlayer.create(MediaPlayer.java:939)
at android.media.MediaPlayer.create(MediaPlayer.java:922)
at test.TestManagement.TestOffActivity.CallMusic(TestOffActivity.java:283)
at test.TestManagement.TestOffActivity.access$000(TestOffActivity.java:36)
at test.TestManagement.TestOffActivity$2.run(TestOffActivity.java:98)
at android.os.Handler.handleCallback(Handler.java:761)
at android.os.Handler.dispatchMessage(Handler.java:98)
at android.os.Looper.loop(Looper.java:156)
at android.app.ActivityThread.main(ActivityThread.java:6617)
at java.lang.reflect.Method.invoke(Method.java)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:942)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:832)
다음과 같은 파일들은 apk로 생성할 때 압축되어 패키징되어 처리 됨으로 접근할 수 없는 경우가 있나보다..
그렇다면 지금까지 정상적으로 동작했던 이유는 무엇일까? 안드로이드7 사용자가 없었던 것일까?
그러나 그렇지도 않다.
/* these formats are already compressed, or don't compress well */
static const char* kNoCompressExt[] = {
".jpg", ".jpeg", ".png", ".gif",
".wav", ".mp2", ".mp3", ".ogg", ".aac",
".mpg", ".mpeg", ".mid", ".midi", ".smf", ".jet",
".rtttl", ".imy", ".xmf", ".mp4", ".m4a",
".m4v", ".3gp", ".3gpp", ".3g2", ".3gpp2",
".amr", ".awb", ".wma", ".wmv"
};
해결방법은 의외로 간단한다.
gradle build(:app) 옵션에서 특정 확장자에 대해 압축제외 조건을 추가하면 해결된다.
해당 파일이 pdf라면 pdf를 noCompress 뒤에 문자열로 추가해주면 해결할 수 있다.
aaptOptions {
noCompress "mp3"
}
Tensorflow Lite 파일로 작업하는 경우 다음과 같이 처리해주면 해결가능하다.
블록 android/app/build.gradle안의 Gradle 파일( )에 다음 줄을 추가 한다.
aaptOptions {
noCompress "tflite"
}
[build.gradle(:app) 파일 전문]
apply plugin: 'com.android.application'
apply plugin: 'com.google.firebase.crashlytics'
android {
compileSdkVersion 30
defaultConfig {
applicationId "test.TestManagement"
minSdkVersion 19
targetSdkVersion 30
versionCode 89
versionName "7.8.8"
vectorDrawables.useSupportLibrary = true //벡터이미지 사용 유무를 설정
// Enabling multidex support.
multiDexEnabled true
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
//앱에서 64비트 기기를 지원
ndk.abiFilters 'armeabi-v7a', 'arm64-v8a', 'x86', 'x86_64'
}
buildTypes {
release {
minifyEnabled true
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
debug {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
dexOptions {
jumboMode true
javaMaxHeapSize "4g"
}
aaptOptions {
noCompress "mp3"
}
lintOptions {
checkReleaseBuilds false
// Or, if you prefer, you can continue to check for errors in release builds,
// but continue the build even when errors are found:
abortOnError false
}
}
dependencies {
implementation fileTree(include: ['*.jar'], dir: 'libs')
implementation 'androidx.constraintlayout:constraintlayout:2.0.4'
implementation 'androidx.multidex:multidex:2.0.1'
implementation 'androidx.appcompat:appcompat:1.2.0'
implementation 'androidx.media:media:1.2.1'
implementation 'androidx.legacy:legacy-support-v4:1.0.0'
implementation 'androidx.vectordrawable:vectordrawable-animated:1.1.0'
//implementation 'androidx.browser:browser:1.0.0'
implementation 'com.google.android.material:material:1.0.0'
implementation 'com.google.firebase:firebase-messaging:21.1.0'
implementation 'com.google.firebase:firebase-core:18.0.3'
implementation 'com.google.firebase:firebase-ads:20.1.0'
implementation 'com.google.firebase:firebase-crashlytics:17.4.1'
implementation 'com.google.firebase:firebase-analytics:18.0.3'
testImplementation 'junit:junit:4.13'
androidTestImplementation 'androidx.test:runner:1.3.0'
androidTestImplementation 'androidx.multidex:multidex-instrumentation:2.0.0'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.3.0'
// // Executes lint checks from the ':lint' project at build time.
// lintChecks project(':lint')
// // Packages lint checks from the ':lintpublish' in the published AAR.
// lintPublish project(':lintpublish')
}
apply plugin: 'com.google.gms.google-services'
[오류가 발생한 코드 정보]
mplayer = MediaPlayer.create(this, R.raw.frog_hongnanpa);
mplayer.setLooping(false);
mplayer.start();
mplayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
@Override
public void onCompletion(MediaPlayer mp) {
...
}
[REFERENCE]
- https://stackoverflow.com/questions/6186866/java-io-filenotfoundexception-this-file-can-not-be-opened-as-a-file-descriptor
- https://stackoverflow.com/questions/11678043/filereader-csv-filenotfoundexception-this-file-can-not-be-opened-as-a-file-de