레이블이 Error인 게시물을 표시합니다. 모든 게시물 표시

IOException : Request to write 'n' bytes exceeds size in header of 0 bytes for entry 'filename' 파일/디렉토리 압축하는 동작을 구현하는 중 확인된 ...

IOException : Request to write 'n' bytes exceeds size in header of 0 bytes for entry 'filename'

파일/디렉토리 압축하는 동작을 구현하는 중 확인된 에러입니다.

위와 같은 에러를 확인했을 때 해결 방법을 정리하려고 합니다.

 

 

 

 

 

 

 

1. 원인

tar 아카이버로 파일/디렉토리를 묶어 주는 동작을 하는 중 아래 빨간 박스 부분에서 확인된 에러입니다.

private fun tar(files: Array<File>, destPath: String): File {
try {
val tarArchiveOutputStream = TarArchiveOutputStream(FileOutputStream(destPath + EXTENSION_TAR))

for (file in files) {
if (!file.exists()) {
Log.e(TAG, "[tar] file is not exists : ${file.name}")
continue
}
Log.d(TAG, "[tar] file : ${file.name}")

if (file.isDirectory) {
file.listFiles()?.let {
tarDirectory(tarArchiveOutputStream, it, "/${file.name}/")
}
} else {
val fileInputStream = FileInputStream(file)
val entry = TarArchiveEntry(file.name)

tarArchiveOutputStream.putArchiveEntry(entry)
fileInputStream.copyTo(tarArchiveOutputStream, BUFFER_SIZE) // Error Occurred

tarArchiveOutputStream.closeArchiveEntry()
fileInputStream.close()
}
}
tarArchiveOutputStream.finish()
} catch (e: Exception) {
e.printStackTrace()
}
return File(destPath + EXTENSION_TAR)
}

 

해당 에러는 지정된 entry 파일에 쓰려고 하는데 entry의 사이즈가 정의되지 않았기 때문에 (Default : 0)

파일 쓰기 동작에서 에러가 발생한 것으로 확인되었습니다.

(zip 할 때는 따로 entry 사이즈 정해주지 않아도 문제없었는데 참.. ㅠㅠ)

 

 

 

 

 

 

2. 해결 방법

entry에 내가 쓰려고 하는 파일 크기만큼 사이즈를 할당해 줍니다.

에러도 사라지고 파일 쓰기도 잘되네요..!

val fileInputStream = FileInputStream(file)
val entry = TarArchiveEntry(file.name).apply {
size = file.length() // size 할당
}

tarArchiveOutputStream.putArchiveEntry(entry)
fileInputStream.copyTo(tarArchiveOutputStream, BUFFER_SIZE)

tarArchiveOutputStream.closeArchiveEntry()
fileInputStream.close()

 

 

 

 

 

 

 

 

[Reference]

Stackoverflow

 

 

 

  IllegalThreadStateException 이 발생하고 앱이 죽는 경우가 생겼습니다. 원인과 해결방법에 대해서 정리합니다.         1. 원인 Thread 객체가 요청된 작업에 대해 적절하지 않은 경우 발생한다고 정의되어있습니다. 대표...

 

IllegalThreadStateException 이 발생하고 앱이 죽는 경우가 생겼습니다.

원인과 해결방법에 대해서 정리합니다.

 

 

 

 

1. 원인

Thread 객체가 요청된 작업에 대해 적절하지 않은 경우 발생한다고 정의되어있습니다.

대표적인 예로 아래와 같이 정의된 Thread 객체를 두 번 호출하는 경우 입니다.

Thread thread = new Thread(() -> {
Log.d("Thread", "thread start!");
});

thread.start();
thread.start();

 

 

 

2. 해결 방법

동일한 Thread 객체로 호출하지 않으면 됩니다.

new Thread(() -> {
Log.d("Thread", "thread run!");
}).start();

new Thread(() -> {
Log.d("Thread", "thread run!");
}).start();

new Thread(() -> {
Log.d("Thread", "thread run!");
}).start();

 

그런데 만약 Thread  동작이 내용도 동일하고 복잡하다고 한다면, 

사용할 때마다 위와 같은 방법은 비효율적입니다.

그렇기 때문에 전역변수를 정의해주고 호출할 때마다 안전하게 thread 실행시키는 함수를 사용하는 방법도 있습니다.

Thread thread = null;
public void startTestThread() {
if (thread != null) {
thread.interrupt();
thread = null;
}

thread = new Thread(() -> {
Log.d("Thread", "thread run!");
});
thread.start();
}
startTestThread();
startTestThread();
startTestThread();

 

 

 

[참고자료]

android developer : IllegalThreadStateException

 

 

   최근 gradle 버전을 올리면서 기존에 사용하는 HTTP 부분에서 아래와 같은 에러를 확인하였습니다. Cleartext HTTP traffic "domain" to not permitted 해당 에러에 대해서 간단한 해결방법을...

 


 최근 gradle 버전을 올리면서 기존에 사용하는 HTTP 부분에서 아래와 같은 에러를 확인하였습니다.

Cleartext HTTP traffic "domain" to not permitted

해당 에러에 대해서 간단한 해결방법을 정리하려고 합니다.



1. 문제 원인 (usesCleartextTraffic)

usesCleartextTraffic 은 앱에서 HTTP 네트워크 트래픽을 사용하는지 여부를 나타내는 속성 값입니다.

Android8 (API 27) 이하를 타겟팅하는 앱에서 기본값은 "true" 였지만,

Android9 (API 28) 이상을 타겟팅하는 앱에서는 기본값이 "false" 입니다.

보안관련하여기본적으로 HTTP 접근을 허용하지 않도록 변경되었다고 합니다.



2. 해결 방법

usesCleartextTraffic 속성값은 androidmanifest 에서 아래와 같이 설정해 줄 수 있습니다.

 

<application
.......
android:usesCleartextTraffic="true">

 

해당 속성값을 "true" 로바꿔주면 모든 HTTP URL 에 대해서 접근이 가능합니다.

추가로 아래 내용을 참조하면 좋을 것 같습니다.

 



[참고자료]  

Android Developers

 

 

 

 

  "the filename directory name or volume label syntax is incorrect" 혹시 FTP 클라이언트 측에서 위와 같은 오류가 출력 되었나요? FTP 서버 측에서 몇 개의 폴더가 있다고 가정...

 


"the filename directory name or volume label syntax is incorrect"

혹시 FTP 클라이언트 측에서 위와 같은 오류가 출력 되었나요?

FTP 서버 측에서 몇 개의 폴더가 있다고 가정했을 때,  

한글이 포함된 폴더를 Working Directory 로 변경해주면 해당 오류가 출력되는 현상을 확인하였습니다.

저와 같은 상황이였다면 아래 해결 방법을 확인해주세요.


 

 

1. 해결 방법

FTPClient connect 전에 인코딩 설정을 추가해주면 됩니다.

ftpClient.controlEncoding = "euc-kr"

 

꼭 connect 하기 전에 설정 해주세요! 

(제가 connect 한 후에 설정해줬는데 같은 문제가 있었네요..ㅠ)

 

끝으로 FTP Client 측 소스 일부를 참조 해주시면 감사하겠습니다.

try {
val ftpClient = FTPClient()

ftpClient.controlEncoding = "euc-kr"

ftpClient.connect(address, port)
val isConnected = FTPReply.isPositiveCompletion(ftpClient.replyCode)
if (!isConnected) {
Log.d("FTP", "${ftpClient.replyCode}, ${ftpClient.replyString}")
ftpClient.disconnect()
return
}

//ftpClient.controlEncoding = "euc-kr" // connect 전에 세팅을 해줘야합니다..!

ftpClient.soTimeout = 10000

val isSuccess = ftpClient.login(id, password)
if (!isSuccess) {
Log.d("FTP", "${ftpClient.replyCode}, ${ftpClient.replyString}")
ftpClient.disconnect()
return
}

val isWorking = ftpClient.changeWorkingDirectory(path) // controlEncoding 세팅이 안 되면 한글포함된 path 의 경우 문제가 발생하였습니다.
if (!isWorking) {
Log.d("FTP", "${ftpClient.replyCode}, ${ftpClient.replyString}")
ftpClient.disconnect()
return
}

/*....................*/

ftpClient.logout();
} catch (e: IOException) {
e.printStackTrace()
}

 

 

 

 

 

  "Dependent features configured but no package ID was set" 위와 같은 에러가 발생했다면 특정 library gradle 에서 plugins id 를 확인해주세요. 그리고, library...

 


"Dependent features configured but no package ID was set"

위와 같은 에러가 발생했다면 특정 library gradle 에서 plugins id 를 확인해주세요.

그리고, library gradle 에서 id 가 com.android.application 으로 정의되어있다면,

com.android.library 로 변경해주시면 됩니다.

 

(항상 복사 붙어넣기를 조심합시다...  반성합니다)

 

 

 [참고자료]

stackOverflow

 

 




 

 

   "Library projects cannot set applicationId" 위와 같은 에러가 발생했다면 특정 library gradle 에서 applicationId 정의를 찾아주세요. 그리고, library gradle 에...

 

 "Library projects cannot set applicationId"

위와 같은 에러가 발생했다면 특정 library gradle 에서 applicationId 정의를 찾아주세요.

그리고, library gradle 에서 applicationId 를 정의할 수 없기 때문에 삭제 해주시면 됩니다.

 

(항상 복사 붙어넣기를 조심합시다...  반성합니다)

 

 

 [참고자료]

stackOverflow

 


 

    보통 오픈소스나 이클립스 Tool 에서 소스를 안드로이드 스튜디오에 import 할 때 볼수 있는 에러입니다. 내용 그대로 Gradle version 이 맞지 않는게 문제입니다. Event Log 를 보시면 친절하게 해결방법이 나와있습니다....


 

 

보통 오픈소스나 이클립스 Tool 에서 소스를 안드로이드 스튜디오에 import 할 때

볼수 있는 에러입니다. 내용 그대로 Gradle version 이 맞지 않는게 문제입니다.

Event Log 를 보시면 친절하게 해결방법이 나와있습니다.

 

 

  

 

 

Event Log 에 나와있는 경로로 들어가 텍스트 에디터로 열어 줍니다.

그리고 적절한 gradle version 으로 바꿔주고 저장해주면 해결 됩니다.

(위의 에러의 경우 gradle-2.14.1-all.zip 부분을 gradle-4.1-all.zip 으로 바꿔주고 저장) 

 

 

 

Error: Usage of API documented as @since 버전 위와 같은 에러가 보게되면 해결방법은 아래와 같습니다. (안드로이드 스튜디오 기준) File > Project Structure ...





Error: Usage of API documented as @since 버전

위와 같은 에러가 보게되면 해결방법은 아래와 같습니다.
(안드로이드 스튜디오 기준)

File > Project Structure > Modules > Source Compatibility 에서 버전을 맞춰줍니다.


해당 모듈에 Build.gradle를 보시면 아래와같이 설정이되어, 
오류가 해결된 것을 확인할 수 있었네요.


compileOptions {
    sourceCompatibility 1.8}