2012/04/17

맥 파일시스템 확장 속성 변경하기

사내 공용 프린터 드라이버는 설치할때 마다 꼭 말썽을 피운다. 설치중에 항상 오류를 내는 것이다.

몇번 패키지 내부에 들어가서 preflight, postflight, VolumeCheck 파일에 실행권한을 주고 해결하곤 했는데 이번엔 제대로 동작하지 않았다.

직접 터미널로 들어가보니 평소에 보지 못하던 @ 표시가 눈에 띄었다.
이것은 무엇일까?  검색해보니 이것은 Extended file attribute 가 존재한다는 뜻! (http://en.wikipedia.org/wiki/Extended_file_attributes)

이 속성은 ls 옵션엔 -@를 추가하면 확인이 가능하다. 확인해보니
문제의 파일들에 대해서 com.apple.quarantine 속성이 걸려있었다.
$ xattr -p com.apple.quarantine preflight
0006;4f8cf8e5;Chrome;95741EED-A78B-4BC3-931A-B76D7486172A|com.google.Chrome
이 속성은 다운로드된 파일에 대해서 다시 한번 확인을 묻는데 사용되는 속성이다.
결국 이 속성 때문에 제대로 설치가 진행되고 있지 않았던 것이다.
$ xattr -d com.apple.quarantine *
위 방법으로 속성을 제거한 후 설치에 성공!

2012/04/01

ADT업데이트(r17)후 발생하는 NoClassDefFoundError 해결하기

ADT업데이트 후 혹은 이클립스 재설치후 빌드만 다시했을 뿐인데 갑자기 멀쩡하던 앱이 죽기 시작합니다.


난 아무것도 한게 없는데 왜 이런 시련이 왔을까요? 과연 무엇이 문제일까요?

원인

이름 그대로 Class가 패키지에 함께 포함되지 않아서 발생한 문제입니다. 무엇이 이 문제를 발생시켰을 까요?
ADT가 업데이트되면서 의존성을 체크하는 루틴이 크게 변경되었습니다.(자세한 내용는 요기 참고하세요. Android 프로젝트 의존성 처리 방식 변경)

기존 jar를 추가하면서 이클립스에서 build path를 추가했던것 기억하시죠?

수동 Build Path추가
일반적인 경우 libs 폴더에 jar프로젝트를 넣어두고 이렇게 수동으로 빌드패스를 추가해서 사용해 왔습니다. 그런데 이번 ADT업데이트 이후에 Android Dependencies가 만들어지면서 libs내의 jar를 자동으로  빌드패스에 추가가 됩니다. 이 jar들은 배포시에 함께 패키징 됩니다.

그럼 아무런 문제가 없지 않느냐?
맞습니다. libs폴더에 기존에 jar파일들을 넣어 두셨다면 문제가 발생하지 않습니다. libs 대신에 lib 폴더(또는 다른폴더)에 jar를 넣어두었기 때문에 NoClassDefFoundError가 발생하게됩니다.

해결방법


1) 가장 쉽고 옳은 방법

기존에 jar가 들어있는 폴더이름을 libs 로 변경하세요.


폴더를 libs로 변경하신후 기존 ADT r16이하를 사용하는 개발자 분들을 위해서 수동으로 빌드패스를 추가해주셔도 좋습니다. 하지만 공동 개발자들의 수가 그리 많지 않다면 ADT를 r17로 업데이트 하는게 더 좋은 방법입니다. (ADT r17버전은 기존 버전보다 개선사항이 매우 많습니다.
http://developer.android.com/sdk/eclipse-adt.html , SDK Tools업데이트도 꼭 함께 해주세요.)

2) 쉽지만 안좋은 방법

안드로이드 팀에서는 libs폴더를 기본 jar들의 경로로 정해두고 있기때문에 앞으로도 ADT가 업데이트 될때 마다 이러한 문제들이 계속 발생할 수 있습니다. 지금 바꾸는 것이 좋습니다. 사정상 libs 폴더를 사용하지 못한다면(그럴 이유가 있을지 모르겠지만) 다음과 같이 수동으로 추가한 jar 빌드패스를 패키징시에 포함되도록 export시켜주시면 됩니다.

하지만 이 방법은 절대 권하지 않습니다. 결국은 ADT를 업데이트 하게 될것이고 프로젝트가 매번 엉망으로 꼬이게 되는 경험을 하게 되실 겁니다.