-->

 

2. 전세 계약

 

내 주위에 부동산에서 일하는 친구도 있고, 임대차 계약을 많이 경험해 본 친구도 있으며, 공인중개사로 일하는 동생도 있다. 그들이 공통적으로 강조한 부분을 적어보고자 한다. 

 

1) 등기부등본 및 건축물대장을 주의 깊게 살펴볼 것

매물 찾기의 연장선이지만, 전세계약하러 가기 전에 다시 한번 살펴볼 필요가 있다.

등기부는 오프라인과 온라인으로 열람, 발급할 수 있다.

오프라인으로는 등기소, 세무서, 동주민센터, 지하철 무인민원발급기 등에서 발급이 가능하고,

온라인으로는 최악의 공공기관 사이트인 인터넷 등기소에서도 확인할 수 있다. (열람 수수료 700원, 부동산에서 사용하는 것도 이 사이트) 왜 최악의 사이트냐면 정말 구시대적인 방법으로 사이트를 구축했기 때문이다. 일단 접속 자체가 잘 안됨ㅋ 백신 프로그램도 말 많고 탈 많은 그.. 후,.. 결국 인터넷 등기소에 잘 접속하기 위해서는 꼭 인터넷 익스플로러로 실행을 해야한다. 공공기관 사이트 접속할 일이 있다면 그냥 맘 편하게 익스플로러를 켜 두자. 내가 인터넷등기소 접속만으로 너무 오랜 시간을 썼기에 여러분은 그러지 말라고 친절하게 캡처해보았다.

온라인 등기부 열람은 비회원 상태에서도 가능하다.

 

 

그냥 간단하게 주소 저런식으로만 작성하고 검색해도 된다.
반드시 '전부' 를 선택하도록 하자.

열람할 때 반드시 '전부'로 클릭하자. 다시 열람할 때도 700원 든다..

말소 사항을 포함해봤자 어차피 말소 사항이고 괜히 내용만 길어져서 나는 '현재 유효사항'을 체크해서 보았다. (말소 사항 포함으로 보면 등기권자가 계속 바뀌는지, 채권자가 계속 바뀌어 신용에 문제가 있는지 등의 여부를 판단해볼 수 있지만 난 내가 대항력 갖추면 된다고 생각해서...)

등기부는 표제부, 갑구, 을구 이렇게 세 부분으로 나누어져 있는데 을구에 근저당 및 융자 금액, 채권자가 표시되어 있다. 시세 대비 30% 미만이 거래하기에 안전하다고 한다. 시세는 사실 부동산에 물어보는 게 빠르다. 은행원도 시세 모름. 사실 내가 여기서 설명하는 것보다 한국부동산원 관련 자료를 참조하는 편이 좋겠다. 

 

건축물대장은 정부 24에서 확인할 수 있다. 이것도 열람 수수료가 500원 든다. 

건축물대장은 근데 내가 열람한 적은 없다. 부동산에서 알아서 뽑아주고 설명도 해주는 편이어서.. 혹시라도 안 받았다면 중개사에게 당연히 요청할 수 있다. 

건축물대장 보는 방법은 여기를 참조하도록 하자.

 

2) 부동산 중개사의 말을 곧이곧대로 믿지는 말 것!

 중개사는 나와 한편이 되어 임대인과의 부당한 계약에서 지켜주는 정의의 용사가 아니다.

계약을 성사시킨다는 본인의 직무에 최선을 다하는 사람일 뿐이다.

분명 집 보러 갔을 때도 집을 팔기 위해서 달콤한 말을 했을 터, 계약할 때만큼이라도 말을 곱씹어 볼 필요가 있다.

내가 찾아본 정보와 다르다면 분명하게 이의제기를 할 수 있어야 한다. 

또한 계약하기 전까지 중개사가 했던 말들이 정작 계약서를 작성하러 가서 확인하면 누락되어 있다거나, 혹은 말도 안 되는 조항이 추가되어있다거나.. 하는 일도 있다. 

계약서는 반드시 꼼꼼하게 봐야 한다.

 

3) 집주인과 대등한 관계라고 생각하지 말 것, 그렇지만 필요한 요구는 반드시 할 것.

임대차 계약을 맺는 임차인은 분명한 을이다.

나도 인터넷으로 정보를 찾던 중에 이런 글들이 있었다. 

계약은 서로가 합의해 맺는 것이니 만큼 갑을 관계가 아닌 대등한 계약자의 입장에서 작성해야 한다고..

이런 말 하시는 분들 중에 실계약 맺을 때 두 손 달달 떠시는 분 있을 것 같다..

물론 원하는 요구사항을 임대인에게 요청할 수 있다. 필요하다면 당연히 해야 한다.

그러나 사회생활이라는 게 인터넷으로 배우기만 해선 안된다. 명백히 임대인과 임차인은 대등한 관계가 아니다. 애초에 임대차 보호법이라는 것이 대등하지 않을 임대차 계약에 있어서 임차인을 보호하기 위해 만들어진 법이다.

임대인의 심기를 건드리지 않는 선에서 원하는 것을 최대한 어필하자.. ㅜ 우리는 그 매물이 절실하지만 임대인에게는 그렇지 않은 경우가 대부분이기 때문이다..

 

4) '중기청 대출 미승인 시 계약은 무효로 하고 계약금은 임차인에게 돌려준다'는 특약을 넣을 것.

 많이들 들어봤을 것이다. 특약은 반드시 필요하다. 

명확하게 쓰면 좋다고는 하는데.. 난 부동산에서 먼저 특약 챙겨줘서 별 신경 안 썼다.

가계약을 맺을 때라도 반드시 필요한 조항이다.

특약 빠뜨리고 대출 불가 떠서 계약금 날려먹으면 진짜 피눈물 나겠지...

 

5) 계약일로부터 잔금 실행일(입주일)은 최소 3주의 여유를 둘 것.

 난 한 달로 잡았다. 지금 살고 있는 방 정리하는 시간도 필요해서. 실제 대출 신청부터 실행까지는 빠르면 2주정도면 가능하지만 언제나 변수를 고려해야 한다.

평소 급한 성격이라도 이런 계약에 있어서 여유와 느긋함을 찾을 수 있도록 노력하자.

시간을 촉박하게 두면 매일 어플 들어가 확인하고 행원한테 전화하고 그런다.. 여유롭게 한달 뒤 정도로 입주일을 잡자.

 

6) 계약하기 전에 방을 최소 한 번 더 볼 것.

 금사빠 친구들이 갑자기 매물과 사랑에 빠질 수도 있다. 그러나 전세계약할 때 우리는 냉정을 되찾아야 한다. 냉정한 상태로 내가 처음 본 그 매물이 맞는지 꼼꼼히 확인해보자. 

전세계약이라는 것이 사회초년생들이 살면서 겪어보는 제일 큰 쇼핑이 아닐까 싶다. 여기서 충동구매하지 말고 신중하게 생각을 한 번 더 하자.

 

7) 싸인과 인감의 효력은 같다.

 인감이 미리 준비되어 있다면 당연히 가져가면 좋고, 없다도 굳이 새로 만들 필요도 없다. 

실제 서명과 인감은 계약서상에서 동등한 효력을 발휘하기 때문이다.

그래도 이왕이면 다홍치마라, 임대인과의 기싸움에서 지고 싶지 않은 친구들은 대왕 인감 하나 챙겨가서 양손으로 찍는 것도 방법일지도.

 

 

1. 매물 찾기

 

사실 전세대출의 처음이자 끝이라고 말할 수 있는 부분이 바로 이 매물을 구하는 과정이다.

저번에 중기청 대출은 HUG의 100%와 HF의 80% 라고 말했는데, HUG 100%로 집을 구하는 것은 저어어엉말 하늘의 별따기이다.

매물 자체가 없다. HUG는 매물의 상태에 따라 대출이 결정되기 때문에 신청 가능한 매물 자체가 레어템인 것.

매물을 찾기 전에 이미 내가 100 일지 80 일지는 정해졌을 것이다. 사실 단기간에 중기청 100프로를 구하는 것이 현실적인 계획이 아닐 수 있다. (6개월 이상을 바라보는 분이어도... 현재 중기청 대출이 올해까지 시행이라는 것을 명심하시는 게 좋을 듯) 중기청 100프로 대출을 아는 임대인이라면 쉽게 받아주지 않을 것이고, 혹여나 임대인 분이 중기청 대출에 대해 잘 모르시는 분이라면 내 상황을 설명하고 중기청 100으로 진행해도 될지 의사를 물어야 한다. 그것도 잘 설득해서 받아주시게끔 말을 조리 있게 잘해야 할 것이다.

아무래도 임차인은 대출도 받아야 하고, 또 임대인과의 거래에서 을이 될 수밖에 없으니 운 떼는 것이 쉽지 않겠지만.. 내 상황을 생각했을 때 중기청 100 아니면 힘들다고 한다면 찬밥 더운밥 가릴 때가 아닐 것이다. 내가 이렇게 고민하는 사이에도 경쟁자가 낚아채갈 수 있기 때문이다.

 

나는 매물 심사도 비교적 덜 까다롭고 목적물 변경도 가능한 중기청 80으로 진행하였다. 대출신청할 때 행원이 HUG를 추천했으나 곤조 있는 나는 HF로 진행...

그렇게 매물찾는 과정이 시작됐다... 두둥

 

방구하기 5대장

 

내가 이용한 사이트는 이 5가지이다. 직방, 다방, 피터팬, 집토스, 네이버 부동산.

먼저 네이버 부동산은 패스다. 사실 한 두 번 들어가 보고 사진 없는 매물이 너무 많아서 안 보게 됨. (난 사진 없는 집은 갈 생각 안 했고 누구는 부동산 발품 팔아야 진짜 좋은 집 나온다는데 그 불확실성에 기대기도 시간 아깝다고 생각했음... 무엇보다 나는 직장 다니면서 그렇게 할 엄두가 안 났다.)

집토스는 복비를 안 낸다고 했던 것 같다.. 임대인이 내는 걸로.. 근데 그러다 보니 매물이 없다.. 그래서 직방 다방 다 돌고 가아 끔 들어가는 정도.

피터팬은 집토스보단 매물이 많다. 그리고 직거래를 할 수 있어 복비를 안내는 경우도 있다. 임대인이 직접 올릴 경우 임대인과 디렉트로 임대차 계약을 맺을 수 있기 때문. 그래도 매물이 적다..

역시 투톱 중 하나인 직방은 매물이 아마 제일 많을 것이다. 근데 UI가 불편하다. 그리고 필터링하는 것도 불편하게 되어있다. 일부러 원하지 않는 매물까지 보게 해서 이것저것 눌러보게끔 하려는 것 같은데 ㅂㄷ... 전세대출을 희망하지 않는 매물도 많기 때문에 확인해보려면 일일이 클릭해야 한다. 심지어 매물 설명엔 안 적고 전화해보면 그제야 안 받는다고 꺼린다고 그러는 경우도 있음.. 그래서 돈 많은 사람들이 이용하면 유용한 어플이라 볼 수 있다 ㅜ

마지막으로 나는 결국 다방에서 구했다. 그리고 다방의 좋은 점은 필터링 조건이 많다는 것이다. 

 

내가 원하는 집을 콕 고를 수 있을 것 같은 수많은 필터조건

내가 원하는 매물은 회사 근처 투룸이었다.

사실 방 구하다 보면 번아웃이 올 때가 있다. 아무리 찾아도 내 맘에 드는 매물은 찾기 쉽지 않고 그러다 보니 아 이 정도 가격에 반지하면 그냥 만족할까,, 거리가 조금 떨어지지만 그냥 갈까,, 이런 잡생각이 머리를 지배한다. 

하지만 나는 정신력이 강한 편이어서 이런 잡생각이 날 때마다 두 손을 들어 내 머리를 때렸다. 그렇게 도망치듯 계약했다간 후회할 걸 알기 때문에,,,,,,,

난 끊임없이 투룸으로 매일매일 찾아봤다. 정말 하루도 빠짐없이 모든 사이트, 어플에 들어가서 매물을 확인했고 내가 원하는 지역 반경 30km까지 다 찾아봤다.

오늘은 어떤 매물이 새로 올라왔네를 눈치챌 수 있을 정도였다. 그 와중에 실제로 방을 보러 간 것은 5번 정도인 것 같다.

사진에 속아 방문한 신촌 반지하 투룸... 여름에 어떤 일이 발생할지 모르기 때문에 패스. 그리고 동네가 좀 시끄러움 ㅜ
서울역이랑 숙대 사이의 청파동 투룸. 거긴 진짜 고산지대였다. 청파동에 거주하는 숙대생분들 리스펙 합니다.
집주인이 매우 깐깐해서 숨 막혔던 아현동..
정상 깃발 꽂고 싶던 창신동...

아무래도 내가 원하는 방 크기에 원하는 위치, 원하는 가격대로 찾다 보니 대부분 언덕이나 1층 매물이 많았다.. 어쩔 수 없는 일이긴 했지만..

 

그리고 이게 허위 매물이었는지 모르겠는데 이런 일도 있었다. 

아~주 맘에 들어서 저녁에 보자마자 바로 다음날 가계약 맺으려고 한 집이 있었는데 가계약 약속시간이 1시간도 채 안 남은 상황에서 계약이 불발됐다. 입주하려는 층 아래에 물이 샌다고.. 공사를 해야 할 것 같은데 언제 끝날지 모르겠다고 이런 황당한 이유로 취소...
이태원역 근처에 반지하방을 보러 가는데 (나도 번아웃이 왔었던 것이다ㅜ) 그때 설 연휴였다. 가는 중간에도 계속 부동산에 전화 오면서 어떤 조건인지 꼬치꼬치 캐묻길래 아 이거 중개사 분이 열심히 하시네 믿고 갈 수 있겠구먼 했는데 가고 있는데 막상 그분 세입자가 계속 산대요 ^^ㅎ; 이왕 출발하신 거 다른 방도 보세요 하길래 바로 버스에서 내리고 안 간다고 했다. ㅂㄷ
어디는 풀옵션인데 옵션 사용료를 내야 한다고.. 2년간 40만 원을 내 야한 댔나? ㅋㅋㅋㅋㅋ아니 무슨 옵션 사용료가 있어 ㅋㅋㅋㅋㅋ 후... 인류애 하락이여

 

매물 찾는 과정이 인내와 고난의 시간인 것을 알고 있었으나 역시나 쉽지 않기 때문에 한 달이 지나면 반포기 상태가 된다..

난 이사가 급한 게 아니어서 그냥 여유 있게 좀 나중에 구해야지 생각하고 있었는데, 지금 있는 방을 빼야 할 일이 생겨 발등에 불 떨어짐...

그렇게 다시 시작한 과정에서 결국 내가 찾게 된 매물은 공사가 언제 끝날지 모르겠다던 바로 그 매물이었다.

내가 입주하려는 층과 상관이 없는 문제로 판명 나서 결국 세를 놓게 됐다는 것. 가계약 맺기로 한 날로부터 정확히 한 달이 지났었는데 전화받고 방방 뛰었다 ㅜ

바아로 급하게 돈을 준비해 다음날 계약을 맺고 전세대출을 신청하러 가게 되었다.

그렇게 매물 찾는 과정은 끝나게 되었다.

 

나는 이런 집은 피하려고 했다!

1. 불법증건축이 의심되는 집.

 눈으로 봐서는 알기 어렵지만 건축물대장을 보면 알 수 있다고 한다.

2. 융자가 시세대비 30% 이상 껴있는 집.

 전세보증보험을 들어놓으실 거라면 괜찮을 수도..

3. 반지하, 지층

여름에 진짜 무슨 일이 일어날지 모른다.

4. 언덕이 높은 집

운동은 체육관에서. (네이버 지도 상단에 지형 지도 클릭하면 대충 등고선 보인다)

5. 신축 원룸

 개인적은 취향이지만 신축 원룸은 사람 가두기 위한 느낌이 너무 강하다고 느껴져서.. 전용면적도 좁고 방음도 안되고..

6. 어플에서 사진 엄청 뽀샤시한 집

 무언가 감추려는 의도가 다분하다. (채광이라던지, 곰팡이나 이격이라던지)

 

[Linux / Cent OS 7] 

Alias 설정으로 편하게 로그 보기

 

 * 목표 : profile 파일을 수정해 alias를 생성해보자.

 

서버 컴퓨터를 두면서 실제로 맨 처음 설치할 때 환경 세팅을 제외하고는 리눅스 터미널을 사용하는 경우가 거의 없다...

물론 서버 개발자라면 다르지만 나같은 일개 잡 스택 개발자한테는 그렇다 ㅜ

그래도 이건 하나 알면 매우매우 유용한 기능!

그것이 바로 Alias 설정이다.

 

보통 서버의 시스템 로그를 보려고 할 때, 그 경로까지 검색하는 게 너어어무 귀찮은 이유이다.

매번 cd .. ls.. cd.. ls.. 하는 것도 질린다! 편하게 한방에 이동해보자!

 

alias [Alias Name]='[Command]'

 

내 계정만 설정하는 방법과 유저 전체에게 설정하는 방법이 있는데 사실 수정해야 하는 부분은 같고 파일만 다른 것이다.

.bashrc 파일

1. root 경로에서 etc 폴더로 들어가준다. (내 계정만 적용하려면 ~/. bashrc 파일을 확인해보자)

2. vi profile 로 파일을 들여본다.

3. i를 눌러 insert 모드로 바꾼 뒤에 다음과 같이 입력한다. (이쁘게 하겠다고 이퀄 띄어쓰기하니까 인식이 안되더라,,)

# alias
# 2021-01-25 Mingu Edited..
# ------------------------------------------
alias malias='vi /etc/profile'
alias mls='ls -ltr'
alias mlog='cd /data1/wildfly/wildfly-14.0.1.Final/standalone/log'
alias log='tail -f server.log'

# ------------------------------------------

4. 저장 후 세션을 재부팅한다.

5. 터미널에서 실행

 

저번에 중기청 대출 제도에 대해 살펴봤다. 이번에는 실제 후기를 바탕으로 조금 더 자세하게 들여다보자.

 

중소기업 청년 전월세 보증금대출에 있어 나의 과정은 다음과 같다. 

 

1. 매물찾기 - 2. 전세계약 - 3. 대출신청 - 4. 심사 - 5. 실행 (현재 진행상태!)

 

왜 매물찾기가 먼저냐면, 대출상담이 실제로 도움이 될까 하는 의문이 들었기 때문이고 실제로 대출상담이 도움이 되지 않았다.

그 이유는 매물이 준비되지 않은 상태에서 흔히 말하는 '가심사'도 볼 수 없고 할 수 있는 일이라곤 오직 필요한 서류가 무엇인지 행원에게 듣는 것 정도뿐이다. 

만약 중기청 대출에 대해서 잘 모른다 하는 사람은 은행에 먼저 가는 것을 추천드리나,, 이미 인터넷으로 알아본 분들이 많을 것이고 또 미천한 내 블로그까지 찾아올 정도로 검색을 잘하시는 분이라면 여기서 얻는 정보로도 충분히 파악할 수 있을 거란 생각이 든다.

사실 직장인이 바쁜시간 쪼개서 은행에 들리는 것부터가 굉장한 리소스 낭비다... (메모리 누수... 항상 신경 쓰자...)

따라서 나 역시도 여러분들에게 도움이 되도록 이 블로그 안에서 필요한 정보를 전달해보도록 하겠다.

 

가심사?

방금 '가심사'라는 용어를 사용했는데 말 그대로 행원이 보는 '가심사'다. 흔히 대출상담이라고 하기도 하고, 현재 직장이 중기청 조건에 해당하는지, 매물을 먼저 확보한 상태라면 매물에 대한 등기부를 가져가서 대출이 나오시겠다 안 나오시겠다, 조언을 해주는 것이지만... 난 필요 없다고 본다.

행원의 주 업무는 고객상담과 금융 처리이다. 

대출을 받는 사람이 간절하기 때문에 걱정도 되고 행원한테 조금이나마 조언을 구하고 싶지만 사실 그분들이 해줄 수 있는 조언이 별로 없다..

상담해주시는 행원분들도 지금 상담받으러 온 고객이 중기청 대출의 조건에 부합하는지 (각종 사이트나 내 블로그에도 적혀있다), 매물을 찾아오셨는지, 찾아왔으면 매물이 상태를 보고 첨언 (다가구인지, 다세대인지 다가구는 대출이 좀 불안해요 정도의 조언) 하고 근데 이 부분도 중기청 대출이 되지 않는 매물이라면 걸러지겠지만 애초에 임대인이 후 달렸으면 매물에 중기청 대출을 못 받는다고 했을 것... 그리고 그 사실을 모르고 일단 상담을 받아봤더라고 한들 가심사와 상관이 크게 있어 보이진 않는다. 매물의 상태는 부동산 중개인이 훨씬 잘 안다. 

또... 좋은 행원도 있지만 그렇지 않은 행원도 있다... 나도 중기청 대출을 알아보며 여러 후기를 봤을 때, 행원의 대처나 태도에 대해 상처를 받으신 분들을 봐서... 아무것도 모른 채로 무턱대고 찾아갔을 때 친절하게 설명해주는 행원을 못 만날 수도 있기 때문에....

결론적으로 가심사라는 것은 꼭 필요하지는 않다는 것이다.

직장인의 귀중한 반차를 가심사 받기 위해 사용하는 불상사는 없길 바라며....

 

기금e든든 어플 먼저 다운받으세요!

전세계약(혹은 가계약)을 맺고 전세대출신청을 하기 전에 먼저 기금e든든으로 대출신청을 해야한다.

어플에서 신청을 하면 필요한 서류 및 소득정보가 자동으로 스크리닝되어 수탁은행에 전달된다.

그 사이에 은행에 방문해봤자 사실 별 도움이 없다. 

그러니 반 드 시 어플을 먼저 다운로드 받고 가계약이라도 맺으면 바로 신청하자.

 

대출 중에 이사를 가고 싶은데요?

HF는 목적물변경이 가능, HUG는 만기시점에만 대출연장을 할 때 목적물 변경이 가능하다. 목적물변경 신청은 은행에 가서.

 

연장할 때 소득조건을 넘기면 어떡하죠?

연장할 때 소득조건은 보지 않는다. 다만 중소기업의 재직중인지를 확인한다. 대기업으로 이직 혹은 퇴직상태이면 중기청연장이 안되고 버팀목전세대출 금리로 변경된다 (2% 대)

 

중기청 대출은 1.2% 고정금리가 아닌가요?

엄밀히 말하면 중기청 대출은 변동금리다. 정책으로 정해진 현재 금리가 1.2%인 것으로 주관부서에 따라 금리가 내년엔 1.3%, 1.4% 이런식으로 변동이 될 수 있는 상품이다. 은행이 바꿀 수는 없다.

 

 

( 궁금하신 사항은 방명록 혹은 댓글로 남겨주시면 답변드리도록 하겠습니다. )

 

[Java] / [자바]

String을 Json객체로 형변환하기

 

* 목표 : org.json.simple.JSONObject를 이용해 String 타입에서 Json객체로 변환해보자

 

서버랑 통신 할 때 에러로그를 String 값을 보내주는데 App쪽에서 Json객체로 만들어 이용하려고 한다.

다양한 방법이 있지만 그중에 간단하게 사용할 수 있는 방법을 소개한다.

import org.json.simple.JSONObject;
import org.json.simple.parser.JSONParser;

private string2json(){
                    String strTest = "{\n" +
                            "\n" +
                            "    \"relationInfos\": null,\n" +
                            "\n" +
                            "    \"exceptionAprvs\": null,\n" +
                            "\n" +
                            "    \"groupApplication\": [\n" +
                            "\n" +
                            "        {\n" +
                            "\n" +
                            "            \"addr\": \"\",\n" +
                            "\n" +
                            "            \"applicationDate\": \"2021-01-11\",\n" +
                            "\n" +
                            "            \"createDatetime\": \"Jan 11, 2021 6:40:59 PM\",\n" +
                            "\n" +
                            "            \"createUserId\": \"ming92\",\n" +
                            "\n" +
                            "            \"customerNo\": \"20210000234\",\n" +
                            "\n" +
                            "            \"fatherName\": \"\",\n" +
                            "\n" +
                            "            \"groupAplcNo\": \"30ming9220210111001\",\n" +
                            "\n" +
                            "            \"inCharge\": \"\",\n" +
                            "\n" +
                            "            \"leaderName\": \"test5\",\n" +
                            "\n" +
                            "            \"mngtBranchCode\": \"1000\",\n" +
                            "\n" +
                            "            \"mngtUserId\": \"ming92\",\n" +
                            "\n" +
                            "            \"openBranchCode\": \"1000\",\n" +
                            "\n" +
                            "            \"openUserId\": \"ming92\",\n" +
                            "\n" +
                            "            \"productType\": \"30\",\n" +
                            "\n" +
                            "            \"residentRgstId\": \"14/LaPaTa(N)111111\",\n" +
                            "\n" +
                            "            \"serialNo\": 3.0,\n" +
                            "\n" +
                            "            \"statusCode\": \"01\",\n" +
                            "\n" +
                            "            \"tabletSyncSts\": \"00\",\n" +
                            "\n" +
                            "            \"townshipName\": \"\",\n" +
                            "\n" +
                            "            \"updateDatetime\": \"Jan 11, 2021 6:40:59 PM\",\n" +
                            "\n" +
                            "            \"updateUserId\": \"ming92\"\n" +
                            "\n" +
                            "        }\n" +
                            "\n" +
                            "    ],\n" +
                            "\n" +
                            "    \"areaEvaluations\": null,\n" +
                            "\n" +
                            "    \"guarantees\": null,\n" +
                            "\n" +
                            "    \"individualApplications\": [\n" +
                            "\n" +
                            "        {\n" +
                            "\n" +
                            "            \"addr\": \"\",\n" +
                            "\n" +
                            "            \"applicationAmt\": 500.0,\n" +
                            "\n" +
                            "            \"applicationDate\": \"2021-01-11\",\n" +
                            "\n" +
                            "            \"applicationNo\": \"10ming9220210111002\",\n" +
                            "\n" +

                            "\n" +
                            "            \"errMsg\": \"10ming9220210111002 : 오류: 중복된 키 값이 \\\"m3t_application_application_no_idx\\\" 고유 제약 조건을 위반함\\n  Detail: (application_no)=(10ming9220210111002) 키가 이미 있습니다.\"\n" +
                            "\n" +
                            "        }\n" +
                            "\n" +
                            "    ]\n" +
                            "\n" +
                            "}";
                            
                            
                    JSONParser parser = new JSONParser();
                    Object obj = null;
                    try {
                        obj = parser.parse( strTest );
                        Log.e(TAG, "obj : " + obj);
                    } catch (ParseException e) {
                        e.printStackTrace();
                    }

                    org.json.simple.JSONObject jsonObject = (org.json.simple.JSONObject) obj;

                    Log.e(TAG, "jsonObject : " + jsonObject);
                    
                    }

 

JSONParser parser = new JSONParser();
Object obj = parser.parse( jsonStr );
JSONObject jsonObj = (JSONObject) obj;

String code = (String) jsonObj.get("code");
String name = (String) jsonObj.get("name");

 

[Java] / [자바]

예외 발생 시키기

* 목표 : 고의로 예외처리를 만드는 이유와 방법에 대해 알아보자.

 

개인적으로 개발의 기본은 try catch라고 생각한다. 

예외처리 구문으로 감싸지 않은 코드에서 종류를 불문하고 에러가 발생한다면 개발자가 감당 할 수 없는 에러로 보이기 때문이다. 

예외처리를 통해 Exception이 발생할 수 있는 부분을 catch 해내고 그것에 대한 짧은 메세지라도 유저에게 출력해 보여주는 것은 개발자가 이 에러를 핸들링하고 있구나 라는 믿음을 줄 수 있다.

그리고 개발 단계에서 정상적으로 예외처리가 작동하는지 확인할 필요가 있다. 다음과 같은 코드로 말이다.

        try{
            //예외처리 발생 
            throw new Exception("error");
            //throw new RuntimeException();
            //throw new SQLiteException();
            
        } catch (Exception e){
            //예외처리 메세지 출력 
            //console.log(e);
            //System.print.out("e");
        }

 

고객정보를 REST 통신으로 서버에 업로드 하고 Response를 받아 처리하는 메소드이다. 

    private void uploadCustomers(ArrayList<Customer> customers) {
        if (!customers.isEmpty()) {

            cFunction.loading(getContext());

            Call<List<Customer>> call = SynchronizationFragment.skylarkService.insertCustomer(customers);

            call.enqueue(new Callback<List<Customer>>() {

                @Override
                public void onResponse(Call<List<Customer>> call, Response<List<Customer>> response) {
                    if (!response.isSuccessful()) {
                        Log.e(TAG, "uploadCustomers response !isSuccessful " );
                        return;
                    }

                    //Customer Return 받아서 CustomerNo update
                    try {
                        for (int i = 0; i < customers.size(); i++) {

                            Customer returnCustomer = response.body().get(i);
                            Log.w(TAG, "returnCustomer : " + returnCustomer);

                            String beforeCustomerNo = customers.get(i).getCustomerNo();
                            String AfterCustomerNo = returnCustomer.getCustomerNo();
                            String AfterTabletSyncSts = returnCustomer.getTabletSyncSts();

                            customers.get(i).setTabletSyncSts(AfterTabletSyncSts);
                            customers.get(i).setCustomerNo(AfterCustomerNo);

                            MyAppDatabase.getInstance().customerDao().updateCustomer(customers.get(i));

                            if (AfterTabletSyncSts.equals("99")){ //Error 발생!
                                Log.e(TAG, "customer Error code 99 !");
                                JSONObject jsonObject = new JSONObject(returnCustomer.toString());
                                String errMsg = jsonObject.get("errMsg").toString();
                                Log.e(TAG, "errMsg : " + errMsg);
                                cf.openPopupPad(getContext(), cFunction.POPUP_LOG_ERROR, errMsg);
                                throw new Exception(errMsg); //예외처리 만들기
                            }

                            Log.w(TAG, "Customer Update Finished [ beforeCustomerNo : " + beforeCustomerNo + " , AfterCustomerNo : " + AfterCustomerNo + " ]");

                        }

                        cf.openPopupPad(getContext(), cFunction.POPUP_LOG_OK, strLog);

                    } catch (Exception e) {
                        Log.w(TAG, "upload customer and add return customer response Error!", e);
                        cf.openPopupPad(getContext(), cFunction.POPUP_LOG_ERROR, e.toString());
                    }

                    cFunction.updateSyncDate(new Date());
                    cFunction.loadingEnd();

                }

                @Override
                public void onFailure(Call<List<Customer>> call, Throwable t) {
                    cFunction.loadingEnd();
                    Log.e(TAG, "uploadCustomers onFailure", t);
                    Toast.makeText(getContext(), "uploadCustomers onFailure", Toast.LENGTH_SHORT).show();
                }
            });
        }
    }

고객정보에 있어 적재가 되지 않는 에러가 발생하면 에러코드 "99"를 받아오고 팝업을 띄워 에러메세지를 출력하게 만들었다.

 

 

[Android / Java]

ListView 특정 아이템 클릭 막기

 * 목표 : ListView안에 특정 아이템을 클릭했을 때 클릭 이벤트가 발생하지 않도록 막아보자.

 

ListView를 사용할 때는 조회성이 아니라면 보통 클릭 리스너를 만들어준다. 조회성이어도 만들어주는 것이 대부분. 

ListView내에 아이템을 전부 클릭하게 할 수도 못 하게 할 수도 있다.

그러나 어떠한 환경에서는 특정 ListView 아이템만 클릭을 막아야 하는 상황도 벌어진다. 

예를 들면 내가 만들었던 NavigationDrawer를 한번 살펴보자.

 

화면을 Swipe 혹은 햄버거 버튼 클릭 시 등장하는 NavigationDrawer 이다. 요거 적용하는 것은 다음 시간에 해보는 것으로 하고...

아무튼 이미지를 살펴보면 하얀색 텍스트의 대메뉴가 있고 연한 하늘색의 소메뉴 항목이 존재한다. 

디자이너에게 디자인 레이아웃을 처음 받았을 때 이 부분을 어떻게 구현할지 고민을 했다. 

개발단계에서 메뉴는 특정 상황에서 추가되거나 삭제 혹은 메뉴명이 변경될 수도 있기 때문에 비교적 수정이 수월한 형태로 만들어야 했다. 

메뉴의 Depth를 정하고 그에 따라 텍스트의 크기와 색상, 첨부한 이미지가 반영되도록 했다.

 

그런데 요건에 흰색 텍스트는 클릭을 원하지 않는다고 했다. 그래서 Depth 1은 클릭 자체를 막는 방법을 찾아보았다.

import java.util.ArrayList;

import android.annotation.SuppressLint;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;

import androidx.annotation.Nullable;
import androidx.core.content.ContextCompat;
import androidx.core.content.res.ResourcesCompat;

import com.m3s.skylark.R;
import com.m3s.skylark.main.drawer.DrawerItem;

public class CustomDrawerAdapter extends BaseAdapter {

    private static final String TAG = "CustomDrawerAdapter";
    private Context mContext;
    private ArrayList<DrawerItem> drawerItems;

    public CustomDrawerAdapter(Context mContext, ArrayList<DrawerItem> drawerItems) {
        this.mContext = mContext;
        this.drawerItems = drawerItems;
    }

    @SuppressLint("ResourceAsColor")
    @Override
    public View getView(int position, View convertView, ViewGroup parent) {

        ViewHolder viewHolder;

        if (convertView == null) {
            convertView = LayoutInflater.from(mContext).inflate(R.layout.custom_drawer_item, parent, false);

            viewHolder = new ViewHolder();

            viewHolder.ItemLayout = convertView.findViewById(R.id.itemLayout);
            viewHolder.ItemName = convertView.findViewById(R.id.drawer_itemName);
            viewHolder.icon = convertView.findViewById(R.id.drawer_icon);

            convertView.setTag(viewHolder);

        } else {
            viewHolder = (ViewHolder) convertView.getTag();
        }

        DrawerItem drawerItem = drawerItems.get(position);

        viewHolder.ItemName.setText(drawerItem.getItemName());

        if (drawerItem.getCategory().equals("MAIN")) { //Main이면 set Title icon
            viewHolder.icon.setImageDrawable(ResourcesCompat.getDrawable(convertView.getResources(), drawerItem.getImgResID(), null));
            viewHolder.ItemName.setTextColor(ContextCompat.getColor(mContext, R.color.white));
            viewHolder.ItemName.setTextSize(16);

        } else if (drawerItem.getCategory().equals("SUB")) { //SUB 니까 ICON 없어도 됨.
            viewHolder.icon.setImageDrawable(null);
            viewHolder.ItemName.setTextColor(ContextCompat.getColor(mContext, R.color.navi_item_click));
            viewHolder.ItemName.setTextSize(14);
        }

        isEnabled(position);

        return convertView;
    }

    @Override
    public int getCount() {
        return drawerItems.size();
    }

    @Override
    public Object getItem(int position) {
        return drawerItems.get(position);
    }

    @Override
    public long getItemId(int position) {
        return position;
    }

    @Override
    public boolean isEnabled(int position) {
        if (!drawerItems.get(position).isClickable()) { //Clickable 여부에 따라서
            return false;
        } else {
            return true;
        }
    }

    private static class ViewHolder {
        LinearLayout ItemLayout;
        TextView ItemName;
        ImageView icon;
    }

    public void addItem(String categoryName, int imgResID, boolean clickable, @Nullable String[] subTitle) {
        DrawerItem item = new DrawerItem();

        item.setItemName(categoryName);
        item.setImgResID(imgResID);
        item.setClickable(clickable);
        item.setCategory("MAIN");

        drawerItems.add(item);

        if (subTitle != null) {
            for (int i = 0; i < subTitle.length; i++) {
                DrawerItem subItem = new DrawerItem();
                subItem.setItemName(subTitle[i]);
                subItem.setClickable(true);
                subItem.setCategory("SUB");

                drawerItems.add(subItem);
            }
        }
    }

}

 

방법은 아~주 간단하다. isEnabled(int position) 메소드를 Overide 하면 된다.

따라서 나는 해당 모델클래스에 boolean 값을 하나 추가했고 그에 따라 return 값을 지정해주어 해결됐다.

public class DrawerItem {

    private String ItemName;
    private int imgResID;
    private String category;
    private boolean isClickable;

    public DrawerItem() { }

    public String getItemName() {
        return ItemName;
    }
    public void setItemName(String itemName) {
        ItemName = itemName;
    }

    public int getImgResID() {
        return imgResID;
    }
    public void setImgResID(int imgResID) {
        this.imgResID = imgResID;
    }

    public String getCategory() { return category; }
    public void setCategory(String category) { this.category = category; }

    public boolean isClickable() { return isClickable; }
    public void setClickable(boolean clickable) { this.isClickable = clickable; }

    @Override
    public String toString(){
        return "DrawerItem [ ItemName=" + ItemName +
                ", imgResID=" + imgResID +
                ", category=" + category +
                ", clickable=" + isClickable +
                " ]";
    }

}

 

 

몇 해 전부터 청년들을 위한 복지 정책이 눈에 띄게 많아졌다.

그리고 글을 적는 나 역시 그 정책의 혜택들을 톡톡히 받아온, 받아오고 있는 사람 중 하나다.

기회가 되면 어떤 혜택들이 있고 어떤 것을 받아왔고 후기는 어땠는지 적어보겠다.

많은 대상 청년들이 확인하고 혜택을 받을 수 있으면 하는 바람에서, 준비하면서 겪는 시행착오를 덜고, 인내의 시간을 지혜롭게 버티는데 도움이 되고 싶어 새로운 카테고리를 만들게 되었다.

게다가 요새 전세집 매물 자체도 귀하고 전세보증금도 너무 올라서 (...)

매물 구하는 것도 쉽지 않지만 전셋집을 구하는 청년들에게 조금이라도 보탬이 되었으면,,,^^,,허허,,

 

 사실 사회에 나와서 '대출'이라는 경험을 처음 접하게 될 때가 바로 집을 구할 때이다. (물론 학자금 대출도 있었지만..)

월세 계약을 할 때는 사실 부모님이나 주변에 손을 빌려 보증금을 내게 되는 경우가 많은데 전세계약 혹은 매매를 할 때는 거액이다 보니 거의 대부분 은행과 대출을 끼고 계약을 하게 된다. 

그리고 상환방법에 따라 매월 정해진 금액을 납부하게 된다. 대부분 그 금액이 월세보다 훨~씬 저렴하기 때문에 정말 불가피한 경우가 아니라면(단기 임대 등) 월세에서 전세로 옮기는 것을 강력히 권한다.

 

도대체 전세집 가격이 어떻길래 은행 대출을 반드시 껴야 하는 걸까?

 

2020년 8월 22일 한겨레 기사

사람 하나 들어갈 수 있는 원룸 공간 구하는 것도 1억 6천이나 든다..  근데 2020 1분기 때는 평균가 1억 4천 정도였음ㅋ 집값 오름세 미쳤냐고 진짜... 특히나 자세하게 알아볼 중기청 대출 같은 경우는 제도가 2021년 12월 31일까지 다. 연말에 세입자 포풍 몰아닥칠 수 있으니 더 오르기 전에 미리미리 매물을 보자..ㅜ

 자 전세값이 비싸서 은행 대출 껴야 하는 건 알겠다.

그럼 은행은 얼마를 빌려주나?

이건 은행마다 상품이 다르다. 

우리은행 
IBK 기업은행
하나은행

 

( 한도는 개인마다 다르고 금리 역시 다르다. 여기서 소개해주는 것은 의미가 없고 본인의 조건에 맞추어 은행 상담을 받아볼 것을 추천한다. )

 

예를 들어 대출한도가 7,000만원이고 금리가 3.0% 일 때 매달 내야 하는 돈은 약 175,000원이다. 누군가는 비싸게 느껴질 수도, 월세를 내는 입장에선 저렴하게 느껴질 수도 있다. 그런데 최대한도 1억으로 금리가 1.2% 라면..?

1억 대출의 1.2%라면 매달 100,000원을 이자로 내는 셈이다. 획기적으로 비용을 줄일 수 있다. 

오늘 소개할 것은 바로 이 것, 중소기업청년 전월세 보증금 대출이다. 줄여서 중기청 대출이라고 말한다.

 

 

대출대상은 작년 소득기준 연 3,500만 원 이하, 무주택 세대주이다. 당장 소득 확인해서 작년에 3500 이하로 받았다면 전화해보자

 

중소기업 청년 전세자금 대출에 대해서 자세히 살펴보자. 개인 코멘트는 핑크색으로 적어봤다.

 

<1. 대상주택>

아래의 요건을 모두 충족하는 주택

  • 1. 임차 전용면적
    • 임차 전용면적 85㎡ 이하 주택(주거용 오피스텔은 85㎡이하 포함) 
  • 2. 임차보증금
    • 2억 원 이하 

 

<2. 대출한도>

다음 중 적은 금액으로 산정

    • 1. 호당 대출한도
      • 1억 원
    • 2. 소요자금에 대한 대출비율

      ① 신규계약

      • 전세금액의 100%(한국 주택금융공사 일반전세자금보증서인 경우 80%) 

      ② 갱신계약

      • 증액금액 이내에서 증액 후 보증금의 100%(한국주택금융공사 일반전세자금보증서인 경우 80%)
    • 3. 담보별 대출한도

      ① 한국주택금융공사 전세대출보증 : 해당 보증 규정에 따름

      ② 주택도시 보증 공사 전세금 안심대출보증 : 해당 보증 규정에 따름

1년 미만 재직자의 경우 대출한도가 2천만 원 이하로 제한될 수 있음

 

<3. 대출금리>

  • 1.2%

※ 1회 연장 시 당초 대출조건 미충족자로 확인되거나 2회 연장취급 시부터 버팀목 전세자금 대출 기본금리(변동금리)를 적용.

   단, 1회 연장 시 소속 기업의 휴(폐) 업으로 인해 비자발적 퇴직을 한 경우 1.2% 금리 유지

※ 자산 심사 부적격자의 경우 가산금리가 부과

   자산심사 관련 자세한 사항은 기금 포탈 [고객 서비스]-[자산 심사 및 금리 안내]-[자산 심사 안내]를 참고(바로가기)

 

<4. 이용기간>

2년(4회 연장하여 최장 10년 가능)

  • 주택도시 보증 공사 전세금 안심대출 보증서 : 최대 2년 1개월(4회 연장하여 최장 10년 5개월 가능)
  • 최장 10년 이용 후 연장 시점 기준 미성년 1자녀당 2년 추가(최장 20년 이용 가능)

 

<5. 상환방법>

  • 일시상환

 

<6. 담보취득>

아래 중 하나 선택

  • 1. 한국 주택금융공사 전세대출보증 (HF)
  • 2. 주택도시 보증 공사 전세금 안심대출보증 (HUG)

HF냐, HUG에 따라 상품의 특성이 조금 다르다. 흔히 중기청 100% 라고 불리는 것이 주택도시 보증 공사(HUG)인데 일단 심사가 매우 까다롭다고 한다. 매물을 확인하고 담보로 대출이 나오기 때문에 불법 증축이 되어있는 매물이라면 오히려 단속에 걸리니 임대인이 대출을 꺼려하는 상품이다. 게다가 이사할 때 목적물 변경이 안된다고 하는 얘기가 많으니...

 다만 매물을 담보로 하기 때문에 전세보증보험에 자동으로 가입되며 1억 한도로 보증금의 100%가 나오니 내 돈이 안 나간다는 이점이 있겠다. 매물 찾기는 하늘의 별따기 ㅎ..

 또 다른 한국 주택금융공사(HF)의 대출은 보증한도 1억, 전세보증금의 80%까지 나오고 개인의 신용을 담보로 전세대출을 하는 상품이기에 목적물 변경이 자유롭다고 한다. 나도 역시 HF로 진행하고 있다.

 

<7. 고객부담비용>

  • 인지세 : 고객/은행 각 50% 부담 (70,000원으로 대출자가 35,000원 부담)
  • 보증서 담보 취급 시 보증료 (연간 은행에서 보증하는 HF : 90%, HUG :100%의 0.05%라고 안내를 받았다. 1억대출이면 2년기준 45,000 * 2 = 90,000원)

 

<8. 대출금 지급방식>

임대인 계좌에 입금함을 원칙

  • 단, 임대인에게 이미 임차보증금을 지급한 사실이 확인될 경우에는 임차인 계좌로 입금 가능

 

<9. 대출취급 영업점>

임차대상 주택이 소재한 도내 영업점에서 취급이 원칙

  • 단, 특별시, 광역시는 동 시가 접한 도(특별시, 광역시 포함)와 동일지역으로 운용하고 영업점이 타 도 인접지역에 위치한 경우 타 도의 인접 시, 군까지 취급

 

<10. 중도상환 수수료>

  • 없음

 

<11. 유의사항>

  • 대출 취급 후 주택 취득이 확인된 경우에는 본 대출금을 상환하여야 함
  • 본 대출상품은 2021년 12월 31일까지 신청 가능하며, 생애 중 1회만 이용 가능
  • 셰어하우스 입주자의 경우 본 대출상품 이용 불가
  • 본 대출상품은 시중은행 전세자금 대출, 제2금융권 전세자금대출 대환 불가
  • 본 대출상품은 임차중도금 대출 불가
  • 주택도시 보증 공사 보증서를 담보로 취급된 경우 추가 대출 및 대출 이용기간 중도 목적물 변경 불가 (HUG는 계약기간 도중 이사가 안되고 2년채워야 만기시점에 맞물려 이사가 가능하고 HF는 1년만 이용하고도 이사를 갈 수 있다는 뜻)

 

<12. 상담문의>

  • 대출 심사 관련한 상담은 아래의 콜센터 번호 및 기금 수탁은행 지점에서 가능합니다.
  • 자산 심사 관련한 상담은 주택도시 보증 공사 콜센터 1566-9009 및 심사 진행 중 안내된 담당자 번호로 문의 바랍니다.

 

중기청 대출의 설명은 여기까지 알아보고 다음 글은 현재 진행형인 나의 대출 과정, 매물 찾는 과정, 이사 과정을 포스팅해보도록 하겠다.

 

<참고자료>

nhuf.molit.go.kr/FP/FP05/FP0502/FP05020601.jsp

 

주택도시기금

주택도시기금 소개, 주택구입(내집마련디딤돌 등), 전세자금, 월세대출, 국민주택채권, 주택청약, 신혼부부대출

nhuf.molit.go.kr

www.hani.co.kr/arti/economy/property/963133.html

 

원룸도 전세 선호…서울 평균 전셋값 1억6천만원

다방 8월 원룸 전세 실거래가격 분석 7월보다 2.1% 오른 1억6246만원 송파구는 1억8천만원대에서 2억원대로 1~2인 가구도 월세보다 전세 선호 전세대출 감안해 전세가격 올리기도

www.hani.co.kr

www.ajunews.com/view/20201112055636456

 

'중기청' 받으려면 서둘러야...연장 결정된 바 없어

1.2%대 저금리로 청년들 사이에서 큰 호응을 얻어온 중소기업취업청년 전세보증금 대출이 유효기간을 1년 남짓 남겨두고 있다.워낙 파격적인 조건 때문에 높은 인기에도 불구하고 판매 ...

www.ajunews.com

 

[Android / Java]

TextWatcher 클래스를 이용한 계산기 로직 만들기

 

* 목표 : EditText에 숫자를 입력하면 자동으로 금액이 합산되는 계산기 Class를 만들어보자.

고객의 재정상태를 입력하는 화면

설계는 다음과 같다.

Total Income - Total Expense ( detail expense...+ etc ) = Total Net Income 

먼저 상세 Expense 항목의 값들이 변화하면 그 합을 Total Expense에 나타내고 최종적으로는 Income에서 금액을 빼 Net Income을 나타내려고 한다.

저번 시간에 EditText에 addTextChangedListener() 함수를 이용해서 new TextWatcher Class를 상속받는 것을 보여주었다. 

이번에는 TextWatcher를 상속받는 Class를 생성하여 그 안에 이벤트를 작성하려고 한다.

큰 숫자를 다루기 위해서 BigDecimal Class를 이용했고 해당 로직은 100% 창작으로 이루어져 있다.. (물론 누군가 먼저 만들었을 수도..)

먼저 전체소스를 한 번 보자.

AmountTextFormatter.java

package com.m3s.skylark.converter;

import android.text.Editable;
import android.text.Selection;
import android.text.TextWatcher;
import android.widget.EditText;

import java.math.BigDecimal;
import java.text.DecimalFormat;

import cz.msebera.android.httpclient.util.TextUtils;

public class AmountTextFormatter implements TextWatcher {

    private final String TAG = this.getClass().getSimpleName().trim();

    private BigDecimal preA, A, B;
    private EditText mEditText;
    private EditText mOutputText;
    private String status;
    private String strAmount = ""; // 임시 저장값 (콤마)
    private boolean isEditing = false;

    /**
     * comma 만 적용
     * @param editText input EditText
     */
    public AmountTextFormatter(EditText editText) {
        mEditText = editText;
//        int maxLength = 23;
//        mEditText.setFilters(new InputFilter[]{new InputFilter.LengthFilter(maxLength)});
    }

    /**
     * input 값을 output 에 더하거나 빼기
     * @param input
     * @param output
     * @param s
     */
    //for Calculate
    public AmountTextFormatter(EditText input, EditText output, String s) {
        mEditText = input; //input Text
        mOutputText = output; //output Text
        status = s; //Status ('+' = add, '-' = subtract)
//        int maxLength = 23;
//        mEditText.setFilters(new InputFilter[]{new InputFilter.LengthFilter(maxLength)});
    }


    @Override
    public void afterTextChanged(Editable s) {
        // TODO Auto-generated method stub
        if (isEditing) return; //이미 했으면 리턴

        Editable e = mEditText.getText();
        Selection.setSelection(e, e.length()); //끝으로 커서이동
    }

    @Override
    public void beforeTextChanged(CharSequence s, int start, int count, int after) {
        // TODO Auto-generated method stub
        if (isEditing) return; //이미 했으면 리턴
        if (mOutputText != null) {

            boolean preANull = TextUtils.isEmpty(s.toString());

            preA = preANull ? BigDecimal.valueOf(0) : BigDecimal.valueOf(Double.parseDouble(s.toString().replaceAll("[^[0-9\\-]]", ""))); //숫자가 아닌것과 - 표시 제외
        }
    }

    @Override
    public void onTextChanged(CharSequence s, int start, int before, int count) {    //텍스트가 변경될때마다 실행

        if (!s.toString().equals(strAmount)) { // StackOverflow 방지
            if (isEditing) return; //이미 했으면 리턴

            isEditing = true; //포맷팅 과정 시작

            if (mOutputText != null && status != null) { //output 존재한다면 sum 하려는 용도

                A = BigDecimal.valueOf(0); //input
                B = BigDecimal.valueOf(0); //output

                boolean inputNull = TextUtils.isEmpty(s.toString()) || TextUtils.isEmpty(s) || s.toString().equals("") || s.toString().equals("-");
                boolean outputNull = (TextUtils.isEmpty(mOutputText.getText().toString()) || mOutputText.getText().toString().equals("-"));

                //input EditText;
                A = inputNull ? BigDecimal.valueOf(0) : BigDecimal.valueOf(Double.parseDouble(s.toString().replace(",", "")));
                B = outputNull ? BigDecimal.valueOf(0) : BigDecimal.valueOf(Double.parseDouble(mOutputText.getText().toString().replace(",", "")));

                if (status.equals("+")) {
                    B = B.subtract(preA).add(A);  //바뀌기 전 숫자 빼고 Change 된 숫자 더하기
                } else if (status.equals("-")) {
                    B = B.add(preA).subtract(A); //바뀌기 전 숫자 더하고 Change 된 숫자 빼기
                }

                mOutputText.setText(makeStringComma(String.valueOf(B))); //output에 삽입

            }

            strAmount = makeStringComma(s.toString()); //컴마붙이기

            mEditText.setText(strAmount);
            isEditing = false;
        }
    }

    protected String makeStringComma(String inputStr) {    // 천단위 콤마 처리
        if (TextUtils.isEmpty(inputStr))
            return inputStr;

        String str = inputStr.replace(",", ""); //기존 컴마 제거
        BigDecimal bigDecimal = new BigDecimal(str);
        DecimalFormat format = new DecimalFormat("###,###"); //포맷팅

        String returnStr = format.format(bigDecimal);
        return returnStr; //리턴
    }

}

두 개의 생성자를 만들어 하나를 컴마만 적용하고 하나는 합과 차를 구한다.

생성자에 주석 친 부분은 MaxLength를 만들어 적용하는 부분이고 취향 껏 하면 된다.

이 코드의 포인트는 바로 EditText의 입력 변화에 따라 이벤트가 발생하는 것이다.

그렇기 위해 beforeTextChanged() 메서드를 이용해 바뀌기 전의 수를 먼저 구하고, 그 수의 차이를 통해 유저가 원하는 대로 보여준다. 단순히 숫자가 늘어나는 순간뿐 아니라 백스페이스로 숫자를 지울 때도 적절하게 이전 값을 구해 계산한다. 

실제 소스 적용은 다음과 같이 이루어졌다.

        ...
        

        totalSaleIncomeTil.getEditText().addTextChangedListener(new AmountTextFormatter(totalSaleIncomeTil.getEditText(), businessTotalNetIncomeEt, "+"));
        totalSaleExpenseTil.getEditText().addTextChangedListener(new AmountTextFormatter(totalSaleExpenseTil.getEditText(), businessTotalNetIncomeEt, "-"));

        totalFamilyIncomeTil.getEditText().addTextChangedListener(new AmountTextFormatter(totalFamilyIncomeTil.getEditText(), familyTotalNetIncomeEt, "+"));
        totalFamilyExpenseTil.getEditText().addTextChangedListener(new AmountTextFormatter(totalFamilyExpenseTil.getEditText(), familyTotalNetIncomeEt, "-"));

        //Last Total Net Income
        businessTotalNetIncomeEt.addTextChangedListener(new AmountTextFormatter(businessTotalNetIncomeEt, TotalNetIncomeEt, "+"));
        familyTotalNetIncomeEt.addTextChangedListener(new AmountTextFormatter(familyTotalNetIncomeEt, TotalNetIncomeEt, "+"));

        //Total Sale Expense (Sum)
        rawMaterialExpenseTil.getEditText().addTextChangedListener(new AmountTextFormatter(rawMaterialExpenseTil.getEditText(), totalSaleExpenseTil.getEditText(), "+"));
        businessBuildingRentingTil.getEditText().addTextChangedListener(new AmountTextFormatter(businessBuildingRentingTil.getEditText(), totalSaleExpenseTil.getEditText(), "+"));
        employeeExpenseTil.getEditText().addTextChangedListener(new AmountTextFormatter(employeeExpenseTil.getEditText(), totalSaleExpenseTil.getEditText(), "+"));
        transportationTil.getEditText().addTextChangedListener(new AmountTextFormatter(transportationTil.getEditText(), totalSaleExpenseTil.getEditText(), "+"));
        lossOfGoodsTil.getEditText().addTextChangedListener(new AmountTextFormatter(lossOfGoodsTil.getEditText(), totalSaleExpenseTil.getEditText(), "+"));
        busOtherExpense1Til.getEditText().addTextChangedListener(new AmountTextFormatter(busOtherExpense1Til.getEditText(), totalSaleExpenseTil.getEditText(), "+"));
        busOtherExpense2Til.getEditText().addTextChangedListener(new AmountTextFormatter(busOtherExpense2Til.getEditText(), totalSaleExpenseTil.getEditText(), "+"));

        //Total Family Expense (Sum)
        costForFoodTil.getEditText().addTextChangedListener(new AmountTextFormatter(costForFoodTil.getEditText(), totalFamilyExpenseTil.getEditText(), "+"));
        houseMaintenanceTil.getEditText().addTextChangedListener(new AmountTextFormatter(houseMaintenanceTil.getEditText(), totalFamilyExpenseTil.getEditText(), "+"));
        electricWaterPhoneTil.getEditText().addTextChangedListener(new AmountTextFormatter(electricWaterPhoneTil.getEditText(), totalFamilyExpenseTil.getEditText(), "+"));
        educationExpenseTil.getEditText().addTextChangedListener(new AmountTextFormatter(educationExpenseTil.getEditText(), totalFamilyExpenseTil.getEditText(), "+"));
        healthyExpenseTil.getEditText().addTextChangedListener(new AmountTextFormatter(healthyExpenseTil.getEditText(), totalFamilyExpenseTil.getEditText(), "+"));
        otherDebtSavingTil.getEditText().addTextChangedListener(new AmountTextFormatter(otherDebtSavingTil.getEditText(), totalFamilyExpenseTil.getEditText(), "+"));
        famOtherExpenseTil.getEditText().addTextChangedListener(new AmountTextFormatter(famOtherExpenseTil.getEditText(), totalFamilyExpenseTil.getEditText(), "+"));

        ...

Material Design의 TextInputLayout 속성을 적용했기 때문에 EditText를 구하는 코드가 조금 길어지긴 했지만..

 

 

[Android / Java]

심플한 Log TAG 설정

 

(부제 : TAG 이름을 하드 코딩하면 안 되는 것이냐고 오)

StackOverFlow에서 재밌는 글을 발견했다. 

항상 로그 찍을 때 사용하는 TAG에 관련한 글이었다.

stackoverflow.com/questions/11239882/why-use-tag-in-most-of-the-android-logging-code/41584221

 

Why use TAG in most of the Android logging code

I can see this is common practice among Android developers. public final class TasksSample extends ListActivity { private static final String TAG = "TasksSample"; private void method() { ...

stackoverflow.com

 

먼저 안드로이드 스튜디오에서 로그를 찍으려면 파라미터가 여러 개 필요하다. 

Log Class를 한번 훔쳐보자.

/*
 * Copyright (C) 2006 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package android.util;

import java.io.PrintWriter;
import java.io.StringWriter;
import java.net.UnknownHostException;

/**
 * Mock Log implementation for testing on non android host.
 */
public final class Log {

    /**
     * Priority constant for the println method; use Log.v.
     */
    public static final int VERBOSE = 2;

    /**
     * Priority constant for the println method; use Log.d.
     */
    public static final int DEBUG = 3;

    /**
     * Priority constant for the println method; use Log.i.
     */
    public static final int INFO = 4;

    /**
     * Priority constant for the println method; use Log.w.
     */
    public static final int WARN = 5;

    /**
     * Priority constant for the println method; use Log.e.
     */
    public static final int ERROR = 6;

    /**
     * Priority constant for the println method.
     */
    public static final int ASSERT = 7;

    private Log() {
    }

    /**
     * Send a {@link #VERBOSE} log message.
     * @param tag Used to identify the source of a log message.  It usually identifies
     *        the class or activity where the log call occurs.
     * @param msg The message you would like logged.
     */
    public static int v(String tag, String msg) {
        return println(LOG_ID_MAIN, VERBOSE, tag, msg);
    }

    /**
     * Send a {@link #VERBOSE} log message and log the exception.
     * @param tag Used to identify the source of a log message.  It usually identifies
     *        the class or activity where the log call occurs.
     * @param msg The message you would like logged.
     * @param tr An exception to log
     */
    public static int v(String tag, String msg, Throwable tr) {
        return println(LOG_ID_MAIN, VERBOSE, tag, msg + '\n' + getStackTraceString(tr));
    }

    /**
     * Send a {@link #DEBUG} log message.
     * @param tag Used to identify the source of a log message.  It usually identifies
     *        the class or activity where the log call occurs.
     * @param msg The message you would like logged.
     */
    public static int d(String tag, String msg) {
        return println(LOG_ID_MAIN, DEBUG, tag, msg);
    }

    /**
     * Send a {@link #DEBUG} log message and log the exception.
     * @param tag Used to identify the source of a log message.  It usually identifies
     *        the class or activity where the log call occurs.
     * @param msg The message you would like logged.
     * @param tr An exception to log
     */
    public static int d(String tag, String msg, Throwable tr) {
        return println(LOG_ID_MAIN, DEBUG, tag, msg + '\n' + getStackTraceString(tr));
    }

    /**
     * Send an {@link #INFO} log message.
     * @param tag Used to identify the source of a log message.  It usually identifies
     *        the class or activity where the log call occurs.
     * @param msg The message you would like logged.
     */
    public static int i(String tag, String msg) {
        return println(LOG_ID_MAIN, INFO, tag, msg);
    }

    /**
     * Send a {@link #INFO} log message and log the exception.
     * @param tag Used to identify the source of a log message.  It usually identifies
     *        the class or activity where the log call occurs.
     * @param msg The message you would like logged.
     * @param tr An exception to log
     */
    public static int i(String tag, String msg, Throwable tr) {
        return println(LOG_ID_MAIN, INFO, tag, msg + '\n' + getStackTraceString(tr));
    }

    /**
     * Send a {@link #WARN} log message.
     * @param tag Used to identify the source of a log message.  It usually identifies
     *        the class or activity where the log call occurs.
     * @param msg The message you would like logged.
     */
    public static int w(String tag, String msg) {
        return println(LOG_ID_MAIN, WARN, tag, msg);
    }

    /**
     * Send a {@link #WARN} log message and log the exception.
     * @param tag Used to identify the source of a log message.  It usually identifies
     *        the class or activity where the log call occurs.
     * @param msg The message you would like logged.
     * @param tr An exception to log
     */
    public static int w(String tag, String msg, Throwable tr) {
        return println(LOG_ID_MAIN, WARN, tag, msg + '\n' + getStackTraceString(tr));
    }

    /*
     * Send a {@link #WARN} log message and log the exception.
     * @param tag Used to identify the source of a log message.  It usually identifies
     *        the class or activity where the log call occurs.
     * @param tr An exception to log
     */
    public static int w(String tag, Throwable tr) {
        return println(LOG_ID_MAIN, WARN, tag, getStackTraceString(tr));
    }

    /**
     * Send an {@link #ERROR} log message.
     * @param tag Used to identify the source of a log message.  It usually identifies
     *        the class or activity where the log call occurs.
     * @param msg The message you would like logged.
     */
    public static int e(String tag, String msg) {
        return println(LOG_ID_MAIN, ERROR, tag, msg);
    }

    /**
     * Send a {@link #ERROR} log message and log the exception.
     * @param tag Used to identify the source of a log message.  It usually identifies
     *        the class or activity where the log call occurs.
     * @param msg The message you would like logged.
     * @param tr An exception to log
     */
    public static int e(String tag, String msg, Throwable tr) {
        return println(LOG_ID_MAIN, ERROR, tag, msg + '\n' + getStackTraceString(tr));
    }

    /**
     * Handy function to get a loggable stack trace from a Throwable
     * @param tr An exception to log
     */
    public static String getStackTraceString(Throwable tr) {
        if (tr == null) {
            return "";
        }

        // This is to reduce the amount of log spew that apps do in the non-error
        // condition of the network being unavailable.
        Throwable t = tr;
        while (t != null) {
            if (t instanceof UnknownHostException) {
                return "";
            }
            t = t.getCause();
        }

        StringWriter sw = new StringWriter();
        PrintWriter pw = new PrintWriter(sw);
        tr.printStackTrace(pw);
        pw.flush();
        return sw.toString();
    }

    /**
     * Low-level logging call.
     * @param priority The priority/type of this log message
     * @param tag Used to identify the source of a log message.  It usually identifies
     *        the class or activity where the log call occurs.
     * @param msg The message you would like logged.
     * @return The number of bytes written.
     */
    public static int println(int priority, String tag, String msg) {
        return println(LOG_ID_MAIN, priority, tag, msg);
    }

    /** @hide */ public static final int LOG_ID_MAIN = 0;
    /** @hide */ public static final int LOG_ID_RADIO = 1;
    /** @hide */ public static final int LOG_ID_EVENTS = 2;
    /** @hide */ public static final int LOG_ID_SYSTEM = 3;
    /** @hide */ public static final int LOG_ID_CRASH = 4;

    /** @hide */ @SuppressWarnings("unused")
    public static int println(int bufID,
            int priority, String tag, String msg) {
        return 0;
    }
}

 

각 Log Level 이 존재하고 앞 글자를 따서 메서드 이름으로 사용하고 있다.

공통적으로 String tag를 파라미터로 받는데 이 부분이 로그 찍을 때 어디서 로그를 찍었는데 나타내는 용도로 이용된다.

보통 많은 사람들이 Class를 만들고 첫 줄에 다음과 같은 코드를 작성할 것이다.

나 역시도 그랬고... 그러나 Rename 등의 Refactoring 과정을 거친다면 하드코딩된 부분은 매뉴얼로 수정할 수밖에 없다. 

그러나 다음과 같은 방법으로 이용할 수 있다. 

public class LoginActivity extends AppCompatActivity {

    private final String TAG = this.getClass().getSimpleName().trim().substring(0, 22);
    
    ....
}    

 

해당 getClass(). getName() 은 패키지 경로까지 다 나타내므로 getSimpleName()을 이용하고 trim()으로 공백도 제거해준다. 그리고 가장 중요한 것은... Log의 String tag length는 23 이하여야 한다.

그래서 substring으로 22까지 줬다. 이게 바로 간편하고 심플한 방법이다. 

그러나.. 당최 왜 23 이하로 써야 하는지 모르겠다..

따라서 다시 구글링 ㄱㄱ 그리고 한 답변을 발견했다.

 

Below API 26 (Oreo) the limit of system property keys was 31 characters. And "log.tag.".length() + 23 equals 31. If you call Log.isLoggable below Android Oreo with a tag longer than 23 characters it will throw, as described in the source code. Since Android O this limit no longer applies.

결국 오레오 이하의 버전을 위한 조치였군.. 호환성을 생각해야 하는 안드로이 드니까.. 오레오가 deprecated 될 정도로 오랜 시간이 지나면 안 써도 되겠군..

 

<참고자료>

developer.android.com/reference/android/util/Log

 

Log  |  Android 개발자  |  Android Developers

 

developer.android.com

stackoverflow.com/questions/28168622/the-logging-tag-can-be-at-most-23-characters/28168739

 

The logging tag can be at most 23 characters

Since update AS 1.1 Preview 2, I'm getting red lines under all my Log messages Log.d(TAG, "message"); With message: "The logging tag can be at most 23 characters..". I didn't update anything

stackoverflow.com

 

[Android Studio] / [안드로이드 스튜디오]

Proguard와 Sqlcipher의 충돌

 

Proguard 로 앱 최적화 좀 시킬라 했드만... 실행하자마자 엄청난 에러로그와 함께 앱이 강제종료된다.

2021-01-07 11:20:22.534 9861-9861/com.m3s.skylark W/art: CheckJNI: method to register "native_getDbLookaside" not in the given class. This is slow, consider changing your RegisterNatives calls.
2021-01-07 11:20:22.534 9861-9861/com.m3s.skylark E/art: Failed to register native method net.sqlcipher.database.SQLiteDatabase.native_getDbLookaside()I in /data/app/com.m3s.skylark-1/base.apk
2021-01-07 11:20:22.534 9861-9861/com.m3s.skylark E/art: ----- class 'Lnet/sqlcipher/database/SQLiteDatabase;' cl=0x12c3e100 -----
2021-01-07 11:20:22.534 9861-9861/com.m3s.skylark E/art:   objectSize=584 (128 from super)
2021-01-07 11:20:22.534 9861-9861/com.m3s.skylark E/art:   access=0x8008.0001
2021-01-07 11:20:22.534 9861-9861/com.m3s.skylark E/art:   super='java.lang.Class<net.sqlcipher.database.SQLiteClosable>' (cl=0x12c3e100)
2021-01-07 11:20:22.534 9861-9861/com.m3s.skylark E/art:   interfaces (1):
2021-01-07 11:20:22.534 9861-9861/com.m3s.skylark E/art:      0: java.lang.Class<androidx.sqlite.db.SupportSQLiteDatabase> (cl=0x12c3e100)
2021-01-07 11:20:22.534 9861-9861/com.m3s.skylark E/art:   vtable (35 entries, 4 in super):
2021-01-07 11:20:22.534 9861-9861/com.m3s.skylark E/art:      0: void net.sqlcipher.database.SQLiteDatabase.addSQLiteClosable(net.sqlcipher.database.SQLiteClosable)
2021-01-07 11:20:22.534 9861-9861/com.m3s.skylark E/art:      1: void net.sqlcipher.database.SQLiteDatabase.addToCompiledQueries(java.lang.String, net.sqlcipher.database.SQLiteCompiledSql)
2021-01-07 11:20:22.534 9861-9861/com.m3s.skylark E/art:      2: void net.sqlcipher.database.SQLiteDatabase.beginTransaction()
2021-01-07 11:20:22.534 9861-9861/com.m3s.skylark E/art:      3: void net.sqlcipher.database.SQLiteDatabase.beginTransactionWithListener(net.sqlcipher.database.SQLiteTransactionListener)
2021-01-07 11:20:22.534 9861-9861/com.m3s.skylark E/art:      4: void net.sqlcipher.database.SQLiteDatabase.close()
2021-01-07 11:20:22.535 9861-9861/com.m3s.skylark E/art:      5: androidx.sqlite.db.SupportSQLiteStatement net.sqlcipher.database.SQLiteDatabase.compileStatement(java.lang.String)
2021-01-07 11:20:22.535 9861-9861/com.m3s.skylark E/art:      6: net.sqlcipher.database.SQLiteStatement net.sqlcipher.database.SQLiteDatabase.compileStatement(java.lang.String)
2021-01-07 11:20:22.535 9861-9861/com.m3s.skylark E/art:      7: void net.sqlcipher.database.SQLiteDatabase.disableWriteAheadLogging()
2021-01-07 11:20:22.535 9861-9861/com.m3s.skylark E/art:      8: boolean net.sqlcipher.database.SQLiteDatabase.enableWriteAheadLogging()
2021-01-07 11:20:22.535 9861-9861/com.m3s.skylark E/art:      9: void net.sqlcipher.database.SQLiteDatabase.endTransaction()
2021-01-07 11:20:22.535 9861-9861/com.m3s.skylark E/art:     10: void net.sqlcipher.database.SQLiteDatabase.execSQL(java.lang.String)
2021-01-07 11:20:22.535 9861-9861/com.m3s.skylark E/art:     11: void net.sqlcipher.database.SQLiteDatabase.finalize()
2021-01-07 11:20:22.535 9861-9861/com.m3s.skylark E/art:     12: java.util.List net.sqlcipher.database.SQLiteDatabase.getAttachedDbs()
2021-01-07 11:20:22.535 9861-9861/com.m3s.skylark E/art:     13: net.sqlcipher.database.SQLiteCompiledSql net.sqlcipher.database.SQLiteDatabase.getCompiledStatementForSql(java.lang.String)
2021-01-07 11:20:22.535 9861-9861/com.m3s.skylark E/art:     14: java.lang.String net.sqlcipher.database.SQLiteDatabase.getPath()
2021-01-07 11:20:22.535 9861-9861/com.m3s.skylark E/art:     15: int net.sqlcipher.database.SQLiteDatabase.getVersion()
2021-01-07 11:20:22.535 9861-9861/com.m3s.skylark E/art:     16: boolean net.sqlcipher.database.SQLiteDatabase.inTransaction()
2021-01-07 11:20:22.535 9861-9861/com.m3s.skylark E/art:     17: boolean net.sqlcipher.database.SQLiteDatabase.isOpen()
2021-01-07 11:20:22.535 9861-9861/com.m3s.skylark E/art:     18: boolean net.sqlcipher.database.SQLiteDatabase.isReadOnly()
2021-01-07 11:20:22.535 9861-9861/com.m3s.skylark E/art:     19: int net.sqlcipher.database.SQLiteDatabase.lastChangeCount()
2021-01-07 11:20:22.535 9861-9861/com.m3s.skylark E/art:     20: long net.sqlcipher.database.SQLiteDatabase.lastInsertRow()
2021-01-07 11:20:22.535 9861-9861/com.m3s.skylark E/art:     21: void net.sqlcipher.database.SQLiteDatabase.lock()
2021-01-07 11:20:22.535 9861-9861/com.m3s.skylark E/art:     22: void net.sqlcipher.database.SQLiteDatabase.native_execSQL(java.lang.String)
2021-01-07 11:20:22.535 9861-9861/com.m3s.skylark E/art:     23: void net.sqlcipher.database.SQLiteDatabase.onAllReferencesReleased()
2021-01-07 11:20:22.535 9861-9861/com.m3s.skylark E/art:     24: void net.sqlcipher.database.SQLiteDatabase.onCorruption()
2021-01-07 11:20:22.535 9861-9861/com.m3s.skylark E/art:     25: android.database.Cursor net.sqlcipher.database.SQLiteDatabase.query(androidx.sqlite.db.SupportSQLiteQuery)
2021-01-07 11:20:22.535 9861-9861/com.m3s.skylark E/art:     26: android.database.Cursor net.sqlcipher.database.SQLiteDatabase.query(androidx.sqlite.db.SupportSQLiteQuery, android.os.CancellationSignal)
2021-01-07 11:20:22.535 9861-9861/com.m3s.skylark E/art:     27: android.database.Cursor net.sqlcipher.database.SQLiteDatabase.query(java.lang.String)
2021-01-07 11:20:22.535 9861-9861/com.m3s.skylark E/art:     28: void net.sqlcipher.database.SQLiteDatabase.rawExecSQL(java.lang.String)
2021-01-07 11:20:22.535 9861-9861/com.m3s.skylark E/art:     29: net.sqlcipher.Cursor net.sqlcipher.database.SQLiteDatabase.rawQuery(java.lang.String, java.lang.String[])
2021-01-07 11:20:22.535 9861-9861/com.m3s.skylark E/art:     30: net.sqlcipher.Cursor net.sqlcipher.database.SQLiteDatabase.rawQueryWithFactory(net.sqlcipher.database.SQLiteDatabase$CursorFactory, java.lang.String, java.lang.String[], java.lang.String)
2021-01-07 11:20:22.535 9861-9861/com.m3s.skylark E/art:     31: void net.sqlcipher.database.SQLiteDatabase.removeSQLiteClosable(net.sqlcipher.database.SQLiteClosable)
2021-01-07 11:20:22.535 9861-9861/com.m3s.skylark E/art:     32: void net.sqlcipher.database.SQLiteDatabase.setTransactionSuccessful()
2021-01-07 11:20:22.535 9861-9861/com.m3s.skylark E/art:     33: void net.sqlcipher.database.SQLiteDatabase.setVersion(int)
2021-01-07 11:20:22.535 9861-9861/com.m3s.skylark E/art:     34: void net.sqlcipher.database.SQLiteDatabase.unlock()
2021-01-07 11:20:22.535 9861-9861/com.m3s.skylark E/art:   direct methods (33 entries):
2021-01-07 11:20:22.535 9861-9861/com.m3s.skylark E/art:      0: void net.sqlcipher.database.SQLiteDatabase.<clinit>()
2021-01-07 11:20:22.535 9861-9861/com.m3s.skylark E/art:      1: void net.sqlcipher.database.SQLiteDatabase.<init>(java.lang.String, net.sqlcipher.database.SQLiteDatabase$CursorFactory, int, net.sqlcipher.DatabaseErrorHandler)
2021-01-07 11:20:22.535 9861-9861/com.m3s.skylark E/art:      2: void net.sqlcipher.database.SQLiteDatabase.access$000(net.sqlcipher.database.SQLiteDatabase, byte[])
2021-01-07 11:20:22.535 9861-9861/com.m3s.skylark E/art:      3: void net.sqlcipher.database.SQLiteDatabase.access$100(net.sqlcipher.database.SQLiteDatabase, char[])
2021-01-07 11:20:22.535 9861-9861/com.m3s.skylark E/art:      4: void net.sqlcipher.database.SQLiteDatabase.beginTransactionWithListenerInternal(net.sqlcipher.database.SQLiteTransactionListener, net.sqlcipher.database.SQLiteDatabase$SQLiteDatabaseTransactionType)
2021-01-07 11:20:22.535 9861-9861/com.m3s.skylark E/art:      5: void net.sqlcipher.database.SQLiteDatabase.checkLockHoldTime()
2021-01-07 11:20:22.535 9861-9861/com.m3s.skylark E/art:      6: void net.sqlcipher.database.SQLiteDatabase.closeClosable()
2021-01-07 11:20:22.535 9861-9861/com.m3s.skylark E/art:      7: boolean net.sqlcipher.database.SQLiteDatabase.containsNull(char[])
2021-01-07 11:20:22.535 9861-9861/com.m3s.skylark E/art:      8: net.sqlcipher.database.SQLiteDatabase net.sqlcipher.database.SQLiteDatabase.create(net.sqlcipher.database.SQLiteDatabase$CursorFactory, java.lang.String)
2021-01-07 11:20:22.535 9861-9861/com.m3s.skylark E/art:      9: void net.sqlcipher.database.SQLiteDatabase.dbclose()
2021-01-07 11:20:22.535 9861-9861/com.m3s.skylark E/art:     10: void net.sqlcipher.database.SQLiteDatabase.dbopen(java.lang.String, int)
2021-01-07 11:20:22.535 9861-9861/com.m3s.skylark E/art:     11: void net.sqlcipher.database.SQLiteDatabase.deallocCachedSqlStatements()
2021-01-07 11:20:22.535 9861-9861/com.m3s.skylark E/art:     12: void net.sqlcipher.database.SQLiteDatabase.enableSqlProfiling(java.lang.String)
2021-01-07 11:20:22.535 9861-9861/com.m3s.skylark E/art:     13: void net.sqlcipher.database.SQLiteDatabase.enableSqlTracing(java.lang.String)
2021-01-07 11:20:22.535 9861-9861/com.m3s.skylark E/art:     14: java.util.ArrayList net.sqlcipher.database.SQLiteDatabase.getAttachedDbs(net.sqlcipher.database.SQLiteDatabase)
2021-01-07 11:20:22.535 9861-9861/com.m3s.skylark E/art:     15: byte[] net.sqlcipher.database.SQLiteDatabase.getBytes(char[])
2021-01-07 11:20:22.535 9861-9861/com.m3s.skylark E/art:     16: char[] net.sqlcipher.database.SQLiteDatabase.getChars(byte[])
2021-01-07 11:20:22.535 9861-9861/com.m3s.skylark E/art:     17: java.lang.String net.sqlcipher.database.SQLiteDatabase.getTime()
2021-01-07 11:20:22.535 9861-9861/com.m3s.skylark E/art:     18: void net.sqlcipher.database.SQLiteDatabase.key(byte[])
2021-01-07 11:20:22.535 9861-9861/com.m3s.skylark E/art:     19: void net.sqlcipher.database.SQLiteDatabase.keyDatabase(net.sqlcipher.database.SQLiteDatabaseHook, java.lang.Runnable)
2021-01-07 11:20:22.535 9861-9861/com.m3s.skylark E/art:     20: void net.sqlcipher.database.SQLiteDatabase.key_mutf8(char[])
2021-01-07 11:20:22.535 9861-9861/com.m3s.skylark E/art:     21: void net.sqlcipher.database.SQLiteDatabase.loadLibs(android.content.Context)
2021-01-07 11:20:22.535 9861-9861/com.m3s.skylark E/art:     22: void net.sqlcipher.database.SQLiteDatabase.loadLibs(android.content.Context, java.io.File)
2021-01-07 11:20:22.535 9861-9861/com.m3s.skylark E/art:     23: void net.sqlcipher.database.SQLiteDatabase.loadLibs(android.content.Context, java.io.File, net.sqlcipher.database.SQLiteDatabase$LibraryLoader)
2021-01-07 11:20:22.535 9861-9861/com.m3s.skylark E/art:     24: void net.sqlcipher.database.SQLiteDatabase.lockForced()
2021-01-07 11:20:22.535 9861-9861/com.m3s.skylark E/art:     25: void net.sqlcipher.database.SQLiteDatabase.native_rawExecSQL(java.lang.String)
2021-01-07 11:20:22.535 9861-9861/com.m3s.skylark E/art:     26: net.sqlcipher.database.SQLiteDatabase net.sqlcipher.database.SQLiteDatabase.openDatabase(java.lang.String, byte[], net.sqlcipher.database.SQLiteDatabase$CursorFactory, int, net.sqlcipher.database.SQLiteDatabaseHook, net.sqlcipher.DatabaseErrorHandler)
2021-01-07 11:20:22.535 9861-9861/com.m3s.skylark E/art:     27: net.sqlcipher.database.SQLiteDatabase net.sqlcipher.database.SQLiteDatabase.openDatabase(java.lang.String, char[], net.sqlcipher.database.SQLiteDatabase$CursorFactory, int)
2021-01-07 11:20:22.535 9861-9861/com.m3s.skylark E/art:     28: net.sqlcipher.database.SQLiteDatabase net.sqlcipher.database.SQLiteDatabase.openDatabase(java.lang.String, char[], net.sqlcipher.database.SQLiteDatabase$CursorFactory, int, net.sqlcipher.database.SQLiteDatabaseHook, net.sqlcipher.DatabaseErrorHandler)
2021-01-07 11:20:22.535 9861-9861/com.m3s.skylark E/art:     29: void net.sqlcipher.database.SQLiteDatabase.openDatabaseInternal(byte[], net.sqlcipher.database.SQLiteDatabaseHook)
2021-01-07 11:20:22.535 9861-9861/com.m3s.skylark E/art:     30: net.sqlcipher.database.SQLiteDatabase net.sqlcipher.database.SQLiteDatabase.openOrCreateDatabase(java.lang.String, byte[], net.sqlcipher.database.SQLiteDatabase$CursorFactory, net.sqlcipher.database.SQLiteDatabaseHook, net.sqlcipher.DatabaseErrorHandler)
2021-01-07 11:20:22.535 9861-9861/com.m3s.skylark E/art:     31: void net.sqlcipher.database.SQLiteDatabase.rekey(byte[])
2021-01-07 11:20:22.535 9861-9861/com.m3s.skylark E/art:     32: void net.sqlcipher.database.SQLiteDatabase.unlockForced()
2021-01-07 11:20:22.535 9861-9861/com.m3s.skylark E/art:   static fields (1 entries):
2021-01-07 11:20:22.535 9861-9861/com.m3s.skylark E/art:      0: java.util.WeakHashMap net.sqlcipher.database.SQLiteDatabase.sActiveDatabases
2021-01-07 11:20:22.535 9861-9861/com.m3s.skylark E/art:   instance fields (20 entries):
2021-01-07 11:20:22.535 9861-9861/com.m3s.skylark E/art:      0: int net.sqlcipher.database.SQLiteDatabase.mCacheFullWarnings
2021-01-07 11:20:22.535 9861-9861/com.m3s.skylark E/art:      1: java.util.Map net.sqlcipher.database.SQLiteDatabase.mCompiledQueries
2021-01-07 11:20:22.535 9861-9861/com.m3s.skylark E/art:      2: net.sqlcipher.DatabaseErrorHandler net.sqlcipher.database.SQLiteDatabase.mErrorHandler
2021-01-07 11:20:22.535 9861-9861/com.m3s.skylark E/art:      3: net.sqlcipher.database.SQLiteDatabase$CursorFactory net.sqlcipher.database.SQLiteDatabase.mFactory
2021-01-07 11:20:22.535 9861-9861/com.m3s.skylark E/art:      4: int net.sqlcipher.database.SQLiteDatabase.mFlags
2021-01-07 11:20:22.535 9861-9861/com.m3s.skylark E/art:      5: boolean net.sqlcipher.database.SQLiteDatabase.mInnerTransactionIsSuccessful
2021-01-07 11:20:22.535 9861-9861/com.m3s.skylark E/art:      6: long net.sqlcipher.database.SQLiteDatabase.mLastLockMessageTime
2021-01-07 11:20:22.535 9861-9861/com.m3s.skylark E/art:      7: java.util.concurrent.locks.ReentrantLock net.sqlcipher.database.SQLiteDatabase.mLock
2021-01-07 11:20:22.535 9861-9861/com.m3s.skylark E/art:      8: long net.sqlcipher.database.SQLiteDatabase.mLockAcquiredThreadTime
2021-01-07 11:20:22.535 9861-9861/com.m3s.skylark E/art:      9: long net.sqlcipher.database.SQLiteDatabase.mLockAcquiredWallTime
2021-01-07 11:20:22.535 9861-9861/com.m3s.skylark E/art:     10: boolean net.sqlcipher.database.SQLiteDatabase.mLockingEnabled
2021-01-07 11:20:22.535 9861-9861/com.m3s.skylark E/art:     11: int net.sqlcipher.database.SQLiteDatabase.mMaxSqlCacheSize
2021-01-07 11:20:22.535 9861-9861/com.m3s.skylark E/art:     12: long net.sqlcipher.database.SQLiteDatabase.mNativeHandle
2021-01-07 11:20:22.535 9861-9861/com.m3s.skylark E/art:     13: int net.sqlcipher.database.SQLiteDatabase.mNumCacheHits
2021-01-07 11:20:22.535 9861-9861/com.m3s.skylark E/art:     14: int net.sqlcipher.database.SQLiteDatabase.mNumCacheMisses
2021-01-07 11:20:22.535 9861-9861/com.m3s.skylark E/art:     15: java.lang.String net.sqlcipher.database.SQLiteDatabase.mPath
2021-01-07 11:20:22.535 9861-9861/com.m3s.skylark E/art:     16: java.util.WeakHashMap net.sqlcipher.database.SQLiteDatabase.mPrograms
2021-01-07 11:20:22.535 9861-9861/com.m3s.skylark E/art:     17: int net.sqlcipher.database.SQLiteDatabase.mSlowQueryThreshold
2021-01-07 11:20:22.535 9861-9861/com.m3s.skylark E/art:     18: boolean net.sqlcipher.database.SQLiteDatabase.mTransactionIsSuccessful
2021-01-07 11:20:22.535 9861-9861/com.m3s.skylark E/art:     19: net.sqlcipher.database.SQLiteTransactionListener net.sqlcipher.database.SQLiteDatabase.mTransactionListener

 

Sqlcipher 는 생성되는 db를 암호화해서 누군가 추출하려고 해도 password 가 필요하다. 

암호화 된 db를 활용하는 용도인데.. 문제는 이게 Proguard 랑 Crash 나니까 쓰지말란다. (무려 sqlcipher 개발자 공식피셜..)

인터넷을 헤매이다 결국 찾았다. 웃긴 건 cipher 개발자는 안된다고 했는데 유저들이 모여서 해결책을 내놨음ㅋㅋㅋㅋㅋ

groups.google.com/g/sqlcipher/c/-odd0jrXH-I/m/jwdQAfwPwegJ?pli=1

 

ProGuard Android obfuscation

Hi Emery, I've recreated your issue with the supplied configuration, could you try making this small adjustment.  You currently have: -optimizations !code/simplification/arithmetic,!field/*,!class/merging/* could you try swapping this in instead: -optimiz

groups.google.com

에 의하면 pro 파일에다가 다음과 같은 코드를 추가하라는 내용이다.

proguard-rules.pro

-optimizations !code/simplification/arithmetic,!class/merging/*,!code/allocation/variable
-keep class net.sqlcipher.** {
	*;
}

근데 나는 net.sqlcipher 가 안먹어서 그냥 -keep class *.sqlcipher.** 로 했다. 

해당코드는 Proguard의 난독화를 진행하지 않고 기존파일 그대로 유지하겠다는 뜻이다.

그리고 감동의 정상작동 ㅜ

 

정말 많은 시간을 소비해 찾아봤지만..누군가는 참고하시라고 에러 로그를 올려본다..

 

2021-01-07 11:20:22.562 9861-9861/com.m3s.skylark A/art: art/runtime/java_vm_ext.cc:470] JNI DETECTED ERROR IN APPLICATION: JNI FindClass called with pending exception java.lang.NoSuchMethodError: no static or non-static method "Lnet/sqlcipher/database/SQLiteDatabase;.native_getDbLookaside()I"
2021-01-07 11:20:22.562 9861-9861/com.m3s.skylark A/art: art/runtime/java_vm_ext.cc:470]   at java.lang.String java.lang.Runtime.nativeLoad(java.lang.String, java.lang.ClassLoader, java.lang.String) (Runtime.java:-2)
2021-01-07 11:20:22.562 9861-9861/com.m3s.skylark A/art: art/runtime/java_vm_ext.cc:470]   at java.lang.String java.lang.Runtime.doLoad(java.lang.String, java.lang.ClassLoader) (Runtime.java:1060)
2021-01-07 11:20:22.562 9861-9861/com.m3s.skylark A/art: art/runtime/java_vm_ext.cc:470]   at void java.lang.Runtime.loadLibrary0(java.lang.ClassLoader, java.lang.String) (Runtime.java:975)
2021-01-07 11:20:22.562 9861-9861/com.m3s.skylark A/art: art/runtime/java_vm_ext.cc:470]   at void java.lang.System.loadLibrary(java.lang.String) (System.java:1567)
2021-01-07 11:20:22.562 9861-9861/com.m3s.skylark A/art: art/runtime/java_vm_ext.cc:470]   at void net.sqlcipher.database.SQLiteDatabase$1.loadLibraries(java.lang.String[]) (SQLiteDatabase.java:227)
2021-01-07 11:20:22.562 9861-9861/com.m3s.skylark A/art: art/runtime/java_vm_ext.cc:470]   at void net.sqlcipher.database.SQLiteDatabase.loadLibs(android.content.Context, java.io.File, net.sqlcipher.database.SQLiteDatabase$LibraryLoader) (SQLiteDatabase.java:244)
2021-01-07 11:20:22.562 9861-9861/com.m3s.skylark A/art: art/runtime/java_vm_ext.cc:470]   at void net.sqlcipher.database.SQLiteDatabase.loadLibs(android.content.Context, java.io.File) (SQLiteDatabase.java:223)
2021-01-07 11:20:22.562 9861-9861/com.m3s.skylark A/art: art/runtime/java_vm_ext.cc:470]   at void net.sqlcipher.database.SQLiteDatabase.loadLibs(android.content.Context) (SQLiteDatabase.java:216)
2021-01-07 11:20:22.562 9861-9861/com.m3s.skylark A/art: art/runtime/java_vm_ext.cc:470]   at void net.sqlcipher.database.SupportHelper.<init>(androidx.sqlite.db.SupportSQLiteOpenHelper$Configuration, byte[], net.sqlcipher.database.SQLiteDatabaseHook, boolean) (SupportHelper.java:31)
2021-01-07 11:20:22.562 9861-9861/com.m3s.skylark A/art: art/runtime/java_vm_ext.cc:470]   at androidx.sqlite.db.SupportSQLiteOpenHelper net.sqlcipher.database.SupportFactory.create(androidx.sqlite.db.SupportSQLiteOpenHelper$Configuration) (SupportFactory.java:43)
2021-01-07 11:20:22.562 9861-9861/com.m3s.skylark A/art: art/runtime/java_vm_ext.cc:470]   at androidx.sqlite.db.SupportSQLiteOpenHelper com.m3s.skylark.MyAppDatabase_Impl.createOpenHelper(androidx.room.DatabaseConfiguration) (MyAppDatabase_Impl.java:749)
2021-01-07 11:20:22.562 9861-9861/com.m3s.skylark A/art: art/runtime/java_vm_ext.cc:470]   at void androidx.room.RoomDatabase.init(androidx.room.DatabaseConfiguration) (RoomDatabase.java:161)
2021-01-07 11:20:22.562 9861-9861/com.m3s.skylark A/art: art/runtime/java_vm_ext.cc:470]   at androidx.room.RoomDatabase androidx.room.RoomDatabase$Builder.build() (RoomDatabase.java:953)
2021-01-07 11:20:22.562 9861-9861/com.m3s.skylark A/art: art/runtime/java_vm_ext.cc:470]   at com.m3s.skylark.MyAppDatabase com.m3s.skylark.MyAppDatabase.getInstance(android.content.Context) (MyAppDatabase.java:64)
2021-01-07 11:20:22.562 9861-9861/com.m3s.skylark A/art: art/runtime/java_vm_ext.cc:470]   at void com.m3s.skylark.LoginActivity.onCreate(android.os.Bundle) (LoginActivity.java:113)
2021-01-07 11:20:22.562 9861-9861/com.m3s.skylark A/art: art/runtime/java_vm_ext.cc:470]   at void android.app.Activity.performCreate(android.os.Bundle) (Activity.java:6948)
2021-01-07 11:20:22.562 9861-9861/com.m3s.skylark A/art: art/runtime/java_vm_ext.cc:470]   at void android.app.Instrumentation.callActivityOnCreate(android.app.Activity, android.os.Bundle) (Instrumentation.java:1126)
2021-01-07 11:20:22.562 9861-9861/com.m3s.skylark A/art: art/runtime/java_vm_ext.cc:470]   at android.app.Activity android.app.ActivityThread.performLaunchActivity(android.app.ActivityThread$ActivityClientRecord, android.content.Intent) (ActivityThread.java:2924)
2021-01-07 11:20:22.562 9861-9861/com.m3s.skylark A/art: art/runtime/java_vm_ext.cc:470]   at void android.app.ActivityThread.handleLaunchActivity(android.app.ActivityThread$ActivityClientRecord, android.content.Intent, java.lang.String) (ActivityThread.java:3042)
2021-01-07 11:20:22.562 9861-9861/com.m3s.skylark A/art: art/runtime/java_vm_ext.cc:470]   at void android.app.ActivityThread.-wrap14(android.app.ActivityThread, android.app.ActivityThread$ActivityClientRecord, android.content.Intent, java.lang.String) (ActivityThread.java:-1)
2021-01-07 11:20:22.562 9861-9861/com.m3s.skylark A/art: art/runtime/java_vm_ext.cc:470]   at void android.app.ActivityThread$H.handleMessage(android.os.Message) (ActivityThread.java:1639)
2021-01-07 11:20:22.562 9861-9861/com.m3s.skylark A/art: art/runtime/java_vm_ext.cc:470]   at void android.os.Handler.dispatchMessage(android.os.Message) (Handler.java:102)
2021-01-07 11:20:22.562 9861-9861/com.m3s.skylark A/art: art/runtime/java_vm_ext.cc:470]   at void android.os.Looper.loop() (Looper.java:154)
2021-01-07 11:20:22.563 9861-9861/com.m3s.skylark A/art: art/runtime/java_vm_ext.cc:470]   at void android.app.ActivityThread.main(java.lang.String[]) (ActivityThread.java:6780)
2021-01-07 11:20:22.563 9861-9861/com.m3s.skylark A/art: art/runtime/java_vm_ext.cc:470]   at java.lang.Object java.lang.reflect.Method.invoke!(java.lang.Object, java.lang.Object[]) (Method.java:-2)
2021-01-07 11:20:22.563 9861-9861/com.m3s.skylark A/art: art/runtime/java_vm_ext.cc:470]   at void com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run() (ZygoteInit.java:1496)
2021-01-07 11:20:22.563 9861-9861/com.m3s.skylark A/art: art/runtime/java_vm_ext.cc:470]   at void com.android.internal.os.ZygoteInit.main(java.lang.String[]) (ZygoteInit.java:1386)
2021-01-07 11:20:22.563 9861-9861/com.m3s.skylark A/art: art/runtime/java_vm_ext.cc:470] 
2021-01-07 11:20:22.563 9861-9861/com.m3s.skylark A/art: art/runtime/java_vm_ext.cc:470]     in call to FindClass
2021-01-07 11:20:22.563 9861-9861/com.m3s.skylark A/art: art/runtime/java_vm_ext.cc:470]     from java.lang.String java.lang.Runtime.nativeLoad(java.lang.String, java.lang.ClassLoader, java.lang.String)
2021-01-07 11:20:22.563 9861-9861/com.m3s.skylark A/art: art/runtime/java_vm_ext.cc:470] "main" prio=5 tid=1 Runnable
2021-01-07 11:20:22.563 9861-9861/com.m3s.skylark A/art: art/runtime/java_vm_ext.cc:470]   | group="main" sCount=0 dsCount=0 obj=0x75cf0268 self=0xa6485400
2021-01-07 11:20:22.563 9861-9861/com.m3s.skylark A/art: art/runtime/java_vm_ext.cc:470]   | sysTid=9861 nice=0 cgrp=default sched=0/0 handle=0xa96c9534
2021-01-07 11:20:22.563 9861-9861/com.m3s.skylark A/art: art/runtime/java_vm_ext.cc:470]   | state=R schedstat=( 0 0 0 ) utm=33 stm=7 core=5 HZ=100
2021-01-07 11:20:22.563 9861-9861/com.m3s.skylark A/art: art/runtime/java_vm_ext.cc:470]   | stack=0xbe7cb000-0xbe7cd000 stackSize=8MB
2021-01-07 11:20:22.563 9861-9861/com.m3s.skylark A/art: art/runtime/java_vm_ext.cc:470]   | held mutexes= "mutator lock"(shared held)
2021-01-07 11:20:22.563 9861-9861/com.m3s.skylark A/art: art/runtime/java_vm_ext.cc:470]   native: #00 pc 00351c09  /system/lib/libart.so (_ZN3art15DumpNativeStackERNSt3__113basic_ostreamIcNS0_11char_traitsIcEEEEiP12BacktraceMapPKcPNS_9ArtMethodEPv+128)
2021-01-07 11:20:22.563 9861-9861/com.m3s.skylark A/art: art/runtime/java_vm_ext.cc:470]   native: #01 pc 00332125  /system/lib/libart.so (_ZNK3art6Thread9DumpStackERNSt3__113basic_ostreamIcNS1_11char_traitsIcEEEEbP12BacktraceMap+304)
2021-01-07 11:20:22.563 9861-9861/com.m3s.skylark A/art: art/runtime/java_vm_ext.cc:470]   native: #02 pc 0023a07f  /system/lib/libart.so (_ZN3art9JavaVMExt8JniAbortEPKcS2_+846)
2021-01-07 11:20:22.563 9861-9861/com.m3s.skylark A/art: art/runtime/java_vm_ext.cc:470]   native: #03 pc 0023a5b7  /system/lib/libart.so (_ZN3art9JavaVMExt9JniAbortVEPKcS2_St9__va_list+58)
2021-01-07 11:20:22.563 9861-9861/com.m3s.skylark A/art: art/runtime/java_vm_ext.cc:470]   native: #04 pc 000ca893  /system/lib/libart.so (_ZN3art11ScopedCheck6AbortFEPKcz+42)
2021-01-07 11:20:22.563 9861-9861/com.m3s.skylark A/art: art/runtime/java_vm_ext.cc:470]   native: #05 pc 000ca483  /system/lib/libart.so (_ZN3art11ScopedCheck11CheckThreadEP7_JNIEnv+362)
2021-01-07 11:20:22.563 9861-9861/com.m3s.skylark A/art: art/runtime/java_vm_ext.cc:470]   native: #06 pc 000c9497  /system/lib/libart.so (_ZN3art11ScopedCheck22CheckPossibleHeapValueERNS_18ScopedObjectAccessEcNS_12JniValueTypeE+26)
2021-01-07 11:20:22.563 9861-9861/com.m3s.skylark A/art: art/runtime/java_vm_ext.cc:470]   native: #07 pc 000c8969  /system/lib/libart.so (_ZN3art11ScopedCheck5CheckERNS_18ScopedObjectAccessEbPKcPNS_12JniValueTypeE+800)
2021-01-07 11:20:22.563 9861-9861/com.m3s.skylark A/art: art/runtime/java_vm_ext.cc:470]   native: #08 pc 000bda85  /system/lib/libart.so (_ZN3art8CheckJNI9FindClassEP7_JNIEnvPKc+444)
2021-01-07 11:20:22.563 9861-9861/com.m3s.skylark A/art: art/runtime/java_vm_ext.cc:470]   native: #09 pc 000b055f  /data/app/com.m3s.skylark-1/lib/arm/libsqlcipher.so (_ZN9sqlcipher43register_android_database_SQLiteCompiledSqlEP7_JNIEnv+34)
2021-01-07 11:20:22.563 9861-9861/com.m3s.skylark A/art: art/runtime/java_vm_ext.cc:470]   native: #10 pc 000b0cbf  /data/app/com.m3s.skylark-1/lib/arm/libsqlcipher.so (JNI_OnLoad+42)
2021-01-07 11:20:22.563 9861-9861/com.m3s.skylark A/art: art/runtime/java_vm_ext.cc:470]   native: #11 pc 0023c02d  /system/lib/libart.so (_ZN3art9JavaVMExt17LoadNativeLibraryEP7_JNIEnvRKNSt3__112basic_stringIcNS3_11char_traitsIcEENS3_9allocatorIcEEEEP8_jobjectP8_jstringPS9_+1844)
2021-01-07 11:20:22.563 9861-9861/com.m3s.skylark A/art: art/runtime/java_vm_ext.cc:470]   native: #12 pc 0000315f  /system/lib/libopenjdkjvm.so (JVM_NativeLoad+178)
2021-01-07 11:20:22.563 9861-9861/com.m3s.skylark A/art: art/runtime/java_vm_ext.cc:470]   native: #13 pc 0007118d  /system/framework/arm/boot.oat (Java_java_lang_Runtime_nativeLoad__Ljava_lang_String_2Ljava_lang_ClassLoader_2Ljava_lang_String_2+144)
2021-01-07 11:20:22.563 9861-9861/com.m3s.skylark A/art: art/runtime/java_vm_ext.cc:470]   at java.lang.Runtime.nativeLoad(Native method)
2021-01-07 11:20:22.563 9861-9861/com.m3s.skylark A/art: art/runtime/java_vm_ext.cc:470]   at java.lang.Runtime.doLoad(Runtime.java:1060)
2021-01-07 11:20:22.563 9861-9861/com.m3s.skylark A/art: art/runtime/java_vm_ext.cc:470]   - locked <0x066c9d40> (a java.lang.Runtime)
2021-01-07 11:20:22.563 9861-9861/com.m3s.skylark A/art: art/runtime/java_vm_ext.cc:470]   at java.lang.Runtime.loadLibrary0(Runtime.java:975)
2021-01-07 11:20:22.563 9861-9861/com.m3s.skylark A/art: art/runtime/java_vm_ext.cc:470]   - locked <0x066c9d40> (a java.lang.Runtime)
2021-01-07 11:20:22.563 9861-9861/com.m3s.skylark A/art: art/runtime/java_vm_ext.cc:470]   at java.lang.System.loadLibrary(System.java:1567)
2021-01-07 11:20:22.563 9861-9861/com.m3s.skylark A/art: art/runtime/java_vm_ext.cc:470]   at net.sqlcipher.database.SQLiteDatabase$1.loadLibraries(SQLiteDatabase.java:227)
2021-01-07 11:20:22.563 9861-9861/com.m3s.skylark A/art: art/runtime/java_vm_ext.cc:470]   at net.sqlcipher.database.SQLiteDatabase.loadLibs(SQLiteDatabase.java:244)
2021-01-07 11:20:22.563 9861-9861/com.m3s.skylark A/art: art/runtime/java_vm_ext.cc:470]   - locked <0x03a8a479> (a java.lang.Class<net.sqlcipher.database.SQLiteDatabase>)
2021-01-07 11:20:22.563 9861-9861/com.m3s.skylark A/art: art/runtime/java_vm_ext.cc:470]   at net.sqlcipher.database.SQLiteDatabase.loadLibs(SQLiteDatabase.java:223)
2021-01-07 11:20:22.563 9861-9861/com.m3s.skylark A/art: art/runtime/java_vm_ext.cc:470]   - locked <0x03a8a479> (a java.lang.Class<net.sqlcipher.database.SQLiteDatabase>)
2021-01-07 11:20:22.563 9861-9861/com.m3s.skylark A/art: art/runtime/java_vm_ext.cc:470]   at net.sqlcipher.database.SQLiteDatabase.loadLibs(SQLiteDatabase.java:216)
2021-01-07 11:20:22.563 9861-9861/com.m3s.skylark A/art: art/runtime/java_vm_ext.cc:470]   - locked <0x03a8a479> (a java.lang.Class<net.sqlcipher.database.SQLiteDatabase>)
2021-01-07 11:20:22.563 9861-9861/com.m3s.skylark A/art: art/runtime/java_vm_ext.cc:470]   at net.sqlcipher.database.SupportHelper.<init>(SupportHelper.java:31)
2021-01-07 11:20:22.563 9861-9861/com.m3s.skylark A/art: art/runtime/java_vm_ext.cc:470]   at net.sqlcipher.database.SupportFactory.create(SupportFactory.java:43)
2021-01-07 11:20:22.563 9861-9861/com.m3s.skylark A/art: art/runtime/java_vm_ext.cc:470]   at com.m3s.skylark.MyAppDatabase_Impl.createOpenHelper(MyAppDatabase_Impl.java:749)
2021-01-07 11:20:22.563 9861-9861/com.m3s.skylark A/art: art/runtime/java_vm_ext.cc:470]   at androidx.room.RoomDatabase.init(RoomDatabase.java:161)
2021-01-07 11:20:22.563 9861-9861/com.m3s.skylark A/art: art/runtime/java_vm_ext.cc:470]   at androidx.room.RoomDatabase$Builder.build(RoomDatabase.java:953)
2021-01-07 11:20:22.563 9861-9861/com.m3s.skylark A/art: art/runtime/java_vm_ext.cc:470]   at com.m3s.skylark.MyAppDatabase.getInstance(MyAppDatabase.java:64)
2021-01-07 11:20:22.563 9861-9861/com.m3s.skylark A/art: art/runtime/java_vm_ext.cc:470]   at com.m3s.skylark.LoginActivity.onCreate(LoginActivity.java:113)
2021-01-07 11:20:22.563 9861-9861/com.m3s.skylark A/art: art/runtime/java_vm_ext.cc:470]   at android.app.Activity.performCreate(Activity.java:6948)
2021-01-07 11:20:22.563 9861-9861/com.m3s.skylark A/art: art/runtime/java_vm_ext.cc:470]   at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1126)
2021-01-07 11:20:22.563 9861-9861/com.m3s.skylark A/art: art/runtime/java_vm_ext.cc:470]   at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2924)
2021-01-07 11:20:22.563 9861-9861/com.m3s.skylark A/art: art/runtime/java_vm_ext.cc:470]   at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3042)
2021-01-07 11:20:22.563 9861-9861/com.m3s.skylark A/art: art/runtime/java_vm_ext.cc:470]   at android.app.ActivityThread.-wrap14(ActivityThread.java:-1)
2021-01-07 11:20:22.563 9861-9861/com.m3s.skylark A/art: art/runtime/java_vm_ext.cc:470]   at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1639)
2021-01-07 11:20:22.563 9861-9861/com.m3s.skylark A/art: art/runtime/java_vm_ext.cc:470]   at android.os.Handler.dispatchMessage(Handler.java:102)
2021-01-07 11:20:22.563 9861-9861/com.m3s.skylark A/art: art/runtime/java_vm_ext.cc:470]   at android.os.Looper.loop(Looper.java:154)
2021-01-07 11:20:22.563 9861-9861/com.m3s.skylark A/art: art/runtime/java_vm_ext.cc:470]   at android.app.ActivityThread.main(ActivityThread.java:6780)
2021-01-07 11:20:22.563 9861-9861/com.m3s.skylark A/art: art/runtime/java_vm_ext.cc:470]   at java.lang.reflect.Method.invoke!(Native method)
2021-01-07 11:20:22.563 9861-9861/com.m3s.skylark A/art: art/runtime/java_vm_ext.cc:470]   at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1496)
2021-01-07 11:20:22.563 9861-9861/com.m3s.skylark A/art: art/runtime/java_vm_ext.cc:470]   at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1386)
2021-01-07 11:20:22.563 9861-9861/com.m3s.skylark A/art: art/runtime/java_vm_ext.cc:470] 
2021-01-07 11:20:22.564 9861-9866/com.m3s.skylark I/art: After code cache collection, code=3KB, data=13KB
2021-01-07 11:20:22.564 9861-9866/com.m3s.skylark I/art: Increasing code cache capacity to 128KB
2021-01-07 11:20:22.648 9861-9861/com.m3s.skylark A/art: art/runtime/runtime.cc:419] Runtime aborting...
2021-01-07 11:20:22.648 9861-9861/com.m3s.skylark A/art: art/runtime/runtime.cc:419] Aborting thread:
2021-01-07 11:20:22.648 9861-9861/com.m3s.skylark A/art: art/runtime/runtime.cc:419] "main" prio=5 tid=1 Native
2021-01-07 11:20:22.649 9861-9861/com.m3s.skylark A/art: art/runtime/runtime.cc:419]   | group="" sCount=0 dsCount=0 obj=0x75cf0268 self=0xa6485400
2021-01-07 11:20:22.649 9861-9861/com.m3s.skylark A/art: art/runtime/runtime.cc:419]   | sysTid=9861 nice=0 cgrp=default sched=0/0 handle=0xa96c9534
2021-01-07 11:20:22.649 9861-9861/com.m3s.skylark A/art: art/runtime/runtime.cc:419]   | state=R schedstat=( 0 0 0 ) utm=34 stm=9 core=5 HZ=100
2021-01-07 11:20:22.649 9861-9861/com.m3s.skylark A/art: art/runtime/runtime.cc:419]   | stack=0xbe7cb000-0xbe7cd000 stackSize=8MB
2021-01-07 11:20:22.649 9861-9861/com.m3s.skylark A/art: art/runtime/runtime.cc:419]   | held mutexes= "abort lock"
2021-01-07 11:20:22.649 9861-9861/com.m3s.skylark A/art: art/runtime/runtime.cc:419]   native: #00 pc 00351c09  /system/lib/libart.so (_ZN3art15DumpNativeStackERNSt3__113basic_ostreamIcNS0_11char_traitsIcEEEEiP12BacktraceMapPKcPNS_9ArtMethodEPv+128)
2021-01-07 11:20:22.649 9861-9861/com.m3s.skylark A/art: art/runtime/runtime.cc:419]   native: #01 pc 00332125  /system/lib/libart.so (_ZNK3art6Thread9DumpStackERNSt3__113basic_ostreamIcNS1_11char_traitsIcEEEEbP12BacktraceMap+304)
2021-01-07 11:20:22.649 9861-9861/com.m3s.skylark A/art: art/runtime/runtime.cc:419]   native: #02 pc 003250d1  /system/lib/libart.so (_ZNK3art10AbortState10DumpThreadERNSt3__113basic_ostreamIcNS1_11char_traitsIcEEEEPNS_6ThreadE+24)
2021-01-07 11:20:22.649 9861-9861/com.m3s.skylark A/art: art/runtime/runtime.cc:419]   native: #03 pc 00324f59  /system/lib/libart.so (_ZNK3art10AbortState4DumpERNSt3__113basic_ostreamIcNS1_11char_traitsIcEEEE+424)
2021-01-07 11:20:22.649 9861-9861/com.m3s.skylark A/art: art/runtime/runtime.cc:419]   native: #04 pc 0031bce7  /system/lib/libart.so (_ZN3art7Runtime5AbortEv+90)
2021-01-07 11:20:22.649 9861-9861/com.m3s.skylark A/art: art/runtime/runtime.cc:419]   native: #05 pc 000b4dcb  /system/lib/libart.so (_ZN3art10LogMessageD2Ev+866)
2021-01-07 11:20:22.649 9861-9861/com.m3s.skylark A/art: art/runtime/runtime.cc:419]   native: #06 pc 0023a361  /system/lib/libart.so (_ZN3art9JavaVMExt8JniAbortEPKcS2_+1584)
2021-01-07 11:20:22.649 9861-9861/com.m3s.skylark A/art: art/runtime/runtime.cc:419]   native: #07 pc 0023a5b7  /system/lib/libart.so (_ZN3art9JavaVMExt9JniAbortVEPKcS2_St9__va_list+58)
2021-01-07 11:20:22.649 9861-9861/com.m3s.skylark A/art: art/runtime/runtime.cc:419]   native: #08 pc 000ca893  /system/lib/libart.so (_ZN3art11ScopedCheck6AbortFEPKcz+42)
2021-01-07 11:20:22.649 9861-9861/com.m3s.skylark A/art: art/runtime/runtime.cc:419]   native: #09 pc 000ca483  /system/lib/libart.so (_ZN3art11ScopedCheck11CheckThreadEP7_JNIEnv+362)
2021-01-07 11:20:22.649 9861-9861/com.m3s.skylark A/art: art/runtime/runtime.cc:419]   native: #10 pc 000c9497  /system/lib/libart.so (_ZN3art11ScopedCheck22CheckPossibleHeapValueERNS_18ScopedObjectAccessEcNS_12JniValueTypeE+26)
2021-01-07 11:20:22.649 9861-9861/com.m3s.skylark A/art: art/runtime/runtime.cc:419]   native: #11 pc 000c8969  /system/lib/libart.so (_ZN3art11ScopedCheck5CheckERNS_18ScopedObjectAccessEbPKcPNS_12JniValueTypeE+800)
2021-01-07 11:20:22.649 9861-9861/com.m3s.skylark A/art: art/runtime/runtime.cc:419]   native: #12 pc 000bda85  /system/lib/libart.so (_ZN3art8CheckJNI9FindClassEP7_JNIEnvPKc+444)
2021-01-07 11:20:22.649 9861-9861/com.m3s.skylark A/art: art/runtime/runtime.cc:419]   native: #13 pc 000b055f  /data/app/com.m3s.skylark-1/lib/arm/libsqlcipher.so (_ZN9sqlcipher43register_android_database_SQLiteCompiledSqlEP7_JNIEnv+34)
2021-01-07 11:20:22.649 9861-9861/com.m3s.skylark A/art: art/runtime/runtime.cc:419]   native: #14 pc 000b0cbf  /data/app/com.m3s.skylark-1/lib/arm/libsqlcipher.so (JNI_OnLoad+42)
2021-01-07 11:20:22.649 9861-9861/com.m3s.skylark A/art: art/runtime/runtime.cc:419]   native: #15 pc 0023c02d  /system/lib/libart.so (_ZN3art9JavaVMExt17LoadNativeLibraryEP7_JNIEnvRKNSt3__112basic_stringIcNS3_11char_traitsIcEENS3_9allocatorIcEEEEP8_jobjectP8_jstringPS9_+1844)
2021-01-07 11:20:22.649 9861-9861/com.m3s.skylark A/art: art/runtime/runtime.cc:419]   native: #16 pc 0000315f  /system/lib/libopenjdkjvm.so (JVM_NativeLoad+178)
2021-01-07 11:20:22.649 9861-9861/com.m3s.skylark A/art: art/runtime/runtime.cc:419]   native: #17 pc 0007118d  /system/framework/arm/boot.oat (???)
2021-01-07 11:20:22.649 9861-9861/com.m3s.skylark A/art: art/runtime/runtime.cc:419]   at java.lang.Runtime.nativeLoad(Native method)
2021-01-07 11:20:22.649 9861-9861/com.m3s.skylark A/art: art/runtime/runtime.cc:419]   at java.lang.Runtime.doLoad(Runtime.java:1060)
2021-01-07 11:20:22.649 9861-9861/com.m3s.skylark A/art: art/runtime/runtime.cc:419]   - locked <0x066c9d40> (a java.lang.Runtime)
2021-01-07 11:20:22.649 9861-9861/com.m3s.skylark A/art: art/runtime/runtime.cc:419]   at java.lang.Runtime.loadLibrary0(Runtime.java:975)
2021-01-07 11:20:22.649 9861-9861/com.m3s.skylark A/art: art/runtime/runtime.cc:419]   - locked <0x066c9d40> (a java.lang.Runtime)
2021-01-07 11:20:22.649 9861-9861/com.m3s.skylark A/art: art/runtime/runtime.cc:419]   at java.lang.System.loadLibrary(System.java:1567)
2021-01-07 11:20:22.649 9861-9861/com.m3s.skylark A/art: art/runtime/runtime.cc:419]   at net.sqlcipher.database.SQLiteDatabase$1.loadLibraries(SQLiteDatabase.java:227)
2021-01-07 11:20:22.649 9861-9861/com.m3s.skylark A/art: art/runtime/runtime.cc:419]   at net.sqlcipher.database.SQLiteDatabase.loadLibs(SQLiteDatabase.java:244)
2021-01-07 11:20:22.649 9861-9861/com.m3s.skylark A/art: art/runtime/runtime.cc:419]   - locked <0x03a8a479> (a java.lang.Class<net.sqlcipher.database.SQLiteDatabase>)
2021-01-07 11:20:22.649 9861-9861/com.m3s.skylark A/art: art/runtime/runtime.cc:419]   at net.sqlcipher.database.SQLiteDatabase.loadLibs(SQLiteDatabase.java:223)
2021-01-07 11:20:22.649 9861-9861/com.m3s.skylark A/art: art/runtime/runtime.cc:419]   - locked <0x03a8a479> (a java.lang.Class<net.sqlcipher.database.SQLiteDatabase>)
2021-01-07 11:20:22.649 9861-9861/com.m3s.skylark A/art: art/runtime/runtime.cc:419]   at net.sqlcipher.database.SQLiteDatabase.loadLibs(SQLiteDatabase.java:216)
2021-01-07 11:20:22.649 9861-9861/com.m3s.skylark A/art: art/runtime/runtime.cc:419]   - locked <0x03a8a479> (a java.lang.Class<net.sqlcipher.database.SQLiteDatabase>)
2021-01-07 11:20:22.649 9861-9861/com.m3s.skylark A/art: art/runtime/runtime.cc:419]   at net.sqlcipher.database.SupportHelper.<init>(SupportHelper.java:31)
2021-01-07 11:20:22.649 9861-9861/com.m3s.skylark A/art: art/runtime/runtime.cc:419]   at net.sqlcipher.database.SupportFactory.create(SupportFactory.java:43)
2021-01-07 11:20:22.649 9861-9861/com.m3s.skylark A/art: art/runtime/runtime.cc:419]   at com.m3s.skylark.MyAppDatabase_Impl.createOpenHelper(MyAppDatabase_Impl.java:749)
2021-01-07 11:20:22.649 9861-9861/com.m3s.skylark A/art: art/runtime/runtime.cc:419]   at androidx.room.RoomDatabase.init(RoomDatabase.java:161)
2021-01-07 11:20:22.649 9861-9861/com.m3s.skylark A/art: art/runtime/runtime.cc:419]   at androidx.room.RoomDatabase$Builder.build(RoomDatabase.java:953)
2021-01-07 11:20:22.649 9861-9861/com.m3s.skylark A/art: art/runtime/runtime.cc:419]   at com.m3s.skylark.MyAppDatabase.getInstance(MyAppDatabase.java:64)
2021-01-07 11:20:22.649 9861-9861/com.m3s.skylark A/art: art/runtime/runtime.cc:419]   at com.m3s.skylark.LoginActivity.onCreate(LoginActivity.java:113)
2021-01-07 11:20:22.649 9861-9861/com.m3s.skylark A/art: art/runtime/runtime.cc:419]   at android.app.Activity.performCreate(Activity.java:6948)
2021-01-07 11:20:22.649 9861-9861/com.m3s.skylark A/art: art/runtime/runtime.cc:419]   at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1126)
2021-01-07 11:20:22.649 9861-9861/com.m3s.skylark A/art: art/runtime/runtime.cc:419]   at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2924)
2021-01-07 11:20:22.649 9861-9861/com.m3s.skylark A/art: art/runtime/runtime.cc:419]   at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3042)
2021-01-07 11:20:22.649 9861-9861/com.m3s.skylark A/art: art/runtime/runtime.cc:419]   at android.app.ActivityThread.-wrap14(ActivityThread.java:-1)
2021-01-07 11:20:22.649 9861-9861/com.m3s.skylark A/art: art/runtime/runtime.cc:419]   at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1639)
2021-01-07 11:20:22.649 9861-9861/com.m3s.skylark A/art: art/runtime/runtime.cc:419]   at android.os.Handler.dispatchMessage(Handler.java:102)
2021-01-07 11:20:22.649 9861-9861/com.m3s.skylark A/art: art/runtime/runtime.cc:419]   at android.os.Looper.loop(Looper.java:154)
2021-01-07 11:20:22.649 9861-9861/com.m3s.skylark A/art: art/runtime/runtime.cc:419]   at android.app.ActivityThread.main(ActivityThread.java:6780)
2021-01-07 11:20:22.649 9861-9861/com.m3s.skylark A/art: art/runtime/runtime.cc:419]   at java.lang.reflect.Method.invoke!(Native method)
2021-01-07 11:20:22.649 9861-9861/com.m3s.skylark A/art: art/runtime/runtime.cc:419]   at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1496)
2021-01-07 11:20:22.649 9861-9861/com.m3s.skylark A/art: art/runtime/runtime.cc:419]   at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1386)
2021-01-07 11:20:22.649 9861-9861/com.m3s.skylark A/art: art/runtime/runtime.cc:419] Pending exception java.lang.NoSuchMethodError: no static or non-static method "Lnet/sqlcipher/database/SQLiteDatabase;.native_getDbLookaside()I"
2021-01-07 11:20:22.649 9861-9861/com.m3s.skylark A/art: art/runtime/runtime.cc:419]   at java.lang.String java.lang.Runtime.nativeLoad(java.lang.String, java.lang.ClassLoader, java.lang.String) (Runtime.java:-2)
2021-01-07 11:20:22.649 9861-9861/com.m3s.skylark A/art: art/runtime/runtime.cc:419]   at java.lang.String java.lang.Runtime.doLoad(java.lang.String, java.lang.ClassLoader) (Runtime.java:1060)
2021-01-07 11:20:22.649 9861-9861/com.m3s.skylark A/art: art/runtime/runtime.cc:419]   at void java.lang.Runtime.loadLibrary0(java.lang.ClassLoader, java.lang.String) (Runtime.java:975)
2021-01-07 11:20:22.649 9861-9861/com.m3s.skylark A/art: art/runtime/runtime.cc:419]   at void java.lang.System.loadLibrary(java.lang.String) (System.java:1567)
2021-01-07 11:20:22.649 9861-9861/com.m3s.skylark A/art: art/runtime/runtime.cc:419]   at void net.sqlcipher.database.SQLiteDatabase$1.loadLibraries(java.lang.String[]) (SQLiteDatabase.java:227)
2021-01-07 11:20:22.649 9861-9861/com.m3s.skylark A/art: art/runtime/runtime.cc:419]   at void net.sqlcipher.database.SQLiteDatabase.loadLibs(android.content.Context, java.io.File, net.sqlcipher.database.SQLiteDatabase$LibraryLoader) (SQLiteDatabase.java:244)
2021-01-07 11:20:22.649 9861-9861/com.m3s.skylark A/art: art/runtime/runtime.cc:419]   at void net.sqlcipher.database.SQLiteDatabase.loadLibs(android.content.Context, java.io.File) (SQLiteDatabase.java:223)
2021-01-07 11:20:22.649 9861-9861/com.m3s.skylark A/art: art/runtime/runtime.cc:419]   at void net.sqlcipher.database.SQLiteDatabase.loadLibs(android.content.Context) (SQLiteDatabase.java:216)
2021-01-07 11:20:22.649 9861-9861/com.m3s.skylark A/art: art/runtime/runtime.cc:419]   at void net.sqlcipher.database.SupportHelper.<init>(androidx.sqlite.db.SupportSQLiteOpenHelper$Configuration, byte[], net.sqlcipher.database.SQLiteDatabaseHook, boolean) (SupportHelper.java:31)
2021-01-07 11:20:22.649 9861-9861/com.m3s.skylark A/art: art/runtime/runtime.cc:419]   at androidx.sqlite.db.SupportSQLiteOpenHelper net.sqlcipher.database.SupportFactory.create(androidx.sqlite.db.SupportSQLiteOpenHelper$Configuration) (SupportFactory.java:43)
2021-01-07 11:20:22.649 9861-9861/com.m3s.skylark A/art: art/runtime/runtime.cc:419]   at androidx.sqlite.db.SupportSQLiteOpenHelper com.m3s.skylark.MyAppDatabase_Impl.createOpenHelper(androidx.room.DatabaseConfiguration) (MyAppDatabase_Impl.java:749)
2021-01-07 11:20:22.649 9861-9861/com.m3s.skylark A/art: art/runtime/runtime.cc:419]   at void androidx.room.RoomDatabase.init(androidx.room.DatabaseConfiguration) (RoomDatabase.java:161)
2021-01-07 11:20:22.649 9861-9861/com.m3s.skylark A/art: art/runtime/runtime.cc:419]   at androidx.room.RoomDatabase androidx.room.RoomDatabase$Builder.build() (RoomDatabase.java:953)
2021-01-07 11:20:22.649 9861-9861/com.m3s.skylark A/art: art/runtime/runtime.cc:419]   at com.m3s.skylark.MyAppDatabase com.m3s.skylark.MyAppDatabase.getInstance(android.content.Context) (MyAppDatabase.java:64)
2021-01-07 11:20:22.649 9861-9861/com.m3s.skylark A/art: art/runtime/runtime.cc:419]   at void com.m3s.skylark.LoginActivity.onCreate(android.os.Bundle) (LoginActivity.java:113)
2021-01-07 11:20:22.649 9861-9861/com.m3s.skylark A/art: art/runtime/runtime.cc:419]   at void android.app.Activity.performCreate(android.os.Bundle) (Activity.java:6948)
2021-01-07 11:20:22.649 9861-9861/com.m3s.skylark A/art: art/runtime/runtime.cc:419]   at void android.app.Instrumentation.callActivityOnCreate(android.app.Activity, android.os.Bundle) (Instrumentation.java:1126)
2021-01-07 11:20:22.649 9861-9861/com.m3s.skylark A/art: art/runtime/runtime.cc:419]   at android.app.Activity android.app.ActivityThread.performLaunchActivity(android.app.ActivityThread$ActivityClientRecord, android.content.Intent) (ActivityThread.java:2924)
2021-01-07 11:20:22.649 9861-9861/com.m3s.skylark A/art: art/runtime/runtime.cc:419]   at void android.app.ActivityThread.handleLaunchActivity(android.app.ActivityThread$ActivityClientRecord, android.content.Intent, java.lang.String) (ActivityThread.java:3042)
2021-01-07 11:20:22.649 9861-9861/com.m3s.skylark A/art: art/runtime/runtime.cc:419]   at void android.app.ActivityThread.-wrap14(android.app.ActivityThread, android.app.ActivityThread$ActivityClientRecord, android.content.Intent, java.lang.String) (ActivityThread.java:-1)
2021-01-07 11:20:22.649 9861-9861/com.m3s.skylark A/art: art/runtime/runtime.cc:419]   at void android.app.ActivityThread$H.handleMessage(android.os.Message) (ActivityThread.java:1639)
2021-01-07 11:20:22.649 9861-9861/com.m3s.skylark A/art: art/runtime/runtime.cc:419]   at void android.os.Handler.dispatchMessage(android.os.Message) (Handler.java:102)
2021-01-07 11:20:22.649 9861-9861/com.m3s.skylark A/art: art/runtime/runtime.cc:419]   at void android.os.Looper.loop() (Looper.java:154)
2021-01-07 11:20:22.649 9861-9861/com.m3s.skylark A/art: art/runtime/runtime.cc:419]   at void android.app.ActivityThread.main(java.lang.String[]) (ActivityThread.java:6780)
2021-01-07 11:20:22.649 9861-9861/com.m3s.skylark A/art: art/runtime/runtime.cc:419]   at java.lang.Object java.lang.reflect.Method.invoke!(java.lang.Object, java.lang.Object[]) (Method.java:-2)
2021-01-07 11:20:22.649 9861-9861/com.m3s.skylark A/art: art/runtime/runtime.cc:419]   at void com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run() (ZygoteInit.java:1496)
2021-01-07 11:20:22.649 9861-9861/com.m3s.skylark A/art: art/runtime/runtime.cc:419]   at void com.android.internal.os.ZygoteInit.main(java.lang.String[]) (ZygoteInit.java:1386)
2021-01-07 11:20:22.649 9861-9861/com.m3s.skylark A/art: art/runtime/runtime.cc:419] Dumping all threads without appropriate locks held: thread list lock mutator lock
2021-01-07 11:20:22.649 9861-9861/com.m3s.skylark A/art: art/runtime/runtime.cc:419] All threads:
2021-01-07 11:20:22.649 9861-9861/com.m3s.skylark A/art: art/runtime/runtime.cc:419] DALVIK THREADS (14):
2021-01-07 11:20:22.649 9861-9861/com.m3s.skylark A/art: art/runtime/runtime.cc:419] "main" prio=5 tid=1 Runnable
2021-01-07 11:20:22.649 9861-9861/com.m3s.skylark A/art: art/runtime/runtime.cc:419]   | group="" sCount=0 dsCount=0 obj=0x75cf0268 self=0xa6485400
2021-01-07 11:20:22.649 9861-9861/com.m3s.skylark A/art: art/runtime/runtime.cc:419]   | sysTid=9861 nice=0 cgrp=default sched=0/0 handle=0xa96c9534
2021-01-07 11:20:22.649 9861-9861/com.m3s.skylark A/art: art/runtime/runtime.cc:419]   | state=R schedstat=( 0 0 0 ) utm=36 stm=11 core=5 HZ=100
2021-01-07 11:20:22.649 9861-9861/com.m3s.skylark A/art: art/runtime/runtime.cc:419]   | stack=0xbe7cb000-0xbe7cd000 stackSize=8MB
2021-01-07 11:20:22.649 9861-9861/com.m3s.skylark A/art: art/runtime/runtime.cc:419]   | held mutexes= "abort lock" "mutator lock"(shared held)
2021-01-07 11:20:22.649 9861-9861/com.m3s.skylark A/art: art/runtime/runtime.cc:419]   native: #00 pc 00351c09  /system/lib/libart.so (_ZN3art15DumpNativeStackERNSt3__113basic_ostreamIcNS0_11char_traitsIcEEEEiP12BacktraceMapPKcPNS_9ArtMethodEPv+128)
2021-01-07 11:20:22.649 9861-9861/com.m3s.skylark A/art: art/runtime/runtime.cc:419]   native: #01 pc 00332125  /system/lib/libart.so (_ZNK3art6Thread9DumpStackERNSt3__113basic_ostreamIcNS1_11char_traitsIcEEEEbP12BacktraceMap+304)
2021-01-07 11:20:22.649 9861-9861/com.m3s.skylark A/art: art/runtime/runtime.cc:419]   native: #02 pc 00344277  /system/lib/libart.so (_ZN3art14DumpCheckpoint3RunEPNS_6ThreadE+622)
2021-01-07 11:20:22.649 9861-9861/com.m3s.skylark A/art: art/runtime/runtime.cc:419]   native: #03 pc 0033e001  /system/lib/libart.so (_ZN3art10ThreadList13RunCheckpointEPNS_7ClosureE+336)
2021-01-07 11:20:22.649 9861-9861/com.m3s.skylark A/art: art/runtime/runtime.cc:419]   native: #04 pc 0033dd21  /system/lib/libart.so (_ZN3art10ThreadList4DumpERNSt3__113basic_ostreamIcNS1_11char_traitsIcEEEEb+180)
2021-01-07 11:20:22.649 9861-9861/com.m3s.skylark A/art: art/runtime/runtime.cc:419]   native: #05 pc 00324f25  /system/lib/libart.so (_ZNK3art10AbortState4DumpERNSt3__113basic_ostreamIcNS1_11char_traitsIcEEEE+372)
2021-01-07 11:20:22.649 9861-9861/com.m3s.skylark A/art: art/runtime/runtime.cc:419]   native: #06 pc 0031bce7  /system/lib/libart.so (_ZN3art7Runtime5AbortEv+90)
2021-01-07 11:20:22.649 9861-9861/com.m3s.skylark A/art: art/runtime/runtime.cc:419]   native: #07 pc 000b4dcb  /system/lib/libart.so (_ZN3art10LogMessageD2Ev+866)
2021-01-07 11:20:22.649 9861-9861/com.m3s.skylark A/art: art/runtime/runtime.cc:419]   native: #08 pc 0023a361  /system/lib/libart.so (_ZN3art9JavaVMExt8JniAbortEPKcS2_+1584)
2021-01-07 11:20:22.649 9861-9861/com.m3s.skylark A/art: art/runtime/runtime.cc:419]   native: #09 pc 0023a5b7  /system/lib/libart.so (_ZN3art9JavaVMExt9JniAbortVEPKcS2_St9__va_list+58)
2021-01-07 11:20:22.649 9861-9861/com.m3s.skylark A/art: art/runtime/runtime.cc:419]   native: #10 pc 000ca893  /system/lib/libart.so (_ZN3art11ScopedCheck6AbortFEPKcz+42)
2021-01-07 11:20:22.649 9861-9861/com.m3s.skylark A/art: art/runtime/runtime.cc:419]   native: #11 pc 000ca483  /system/lib/libart.so (_ZN3art11ScopedCheck11CheckThreadEP7_JNIEnv+362)
2021-01-07 11:20:22.649 9861-9861/com.m3s.skylark A/art: art/runtime/runtime.cc:419]   native: #12 pc 000c9497  /system/lib/libart.so (_ZN3art11ScopedCheck22CheckPossibleHeapValueERNS_18ScopedObjectAccessEcNS_12JniValueTypeE+26)
2021-01-07 11:20:22.649 9861-9861/com.m3s.skylark A/art: art/runtime/runtime.cc:419]   native: #13 pc 000c8969  /system/lib/libart.so (_ZN3art11ScopedCheck5CheckERNS_18ScopedObjectAccessEbPKcPNS_12JniValueTypeE+800)
2021-01-07 11:20:22.649 9861-9861/com.m3s.skylark A/art: art/runtime/runtime.cc:419]   native: #14 pc 000bda85  /system/lib/libart.so (_ZN3art8CheckJNI9FindClassEP7_JNIEnvPKc+444)
2021-01-07 11:20:22.649 9861-9861/com.m3s.skylark A/art: art/runtime/runtime.cc:419]   native: #15 pc 000b055f  /data/app/com.m3s.skylark-1/lib/arm/libsqlcipher.so (_ZN9sqlcipher43register_android_database_SQLiteCompiledSqlEP7_JNIEnv+34)
2021-01-07 11:20:22.649 9861-9861/com.m3s.skylark A/art: art/runtime/runtime.cc:419]   native: #16 pc 000b0cbf  /data/app/com.m3s.skylark-1/lib/arm/libsqlcipher.so (JNI_OnLoad+42)
2021-01-07 11:20:22.649 9861-9861/com.m3s.skylark A/art: art/runtime/runtime.cc:419]   native: #17 pc 0023c02d  /system/lib/libart.so (_ZN3art9JavaVMExt17LoadNativeLibraryEP7_JNIEnvRKNSt3__112basic_stringIcNS3_11char_traitsIcEENS3_9allocatorIcEEEEP8_jobjectP8_jstringPS9_+1844)
2021-01-07 11:20:22.649 9861-9861/com.m3s.skylark A/art: art/runtime/runtime.cc:419]   native: #18 pc 0000315f  /system/lib/libopenjdkjvm.so (JVM_NativeLoad+178)
2021-01-07 11:20:22.649 9861-9861/com.m3s.skylark A/art: art/runtime/runtime.cc:419]   native: #19 pc 0007118d  /system/framework/arm/boot.oat (Java_java_lang_Runtime_nativeLoad__Ljava_lang_String_2Ljava_lang_ClassLoader_2Ljava_lang_String_2+144)
2021-01-07 11:20:22.649 9861-9861/com.m3s.skylark A/art: art/runtime/runtime.cc:419]   at java.lang.Runtime.nativeLoad(Native method)
2021-01-07 11:20:22.649 9861-9861/com.m3s.skylark A/art: art/runtime/runtime.cc:419]   at java.lang.Runtime.doLoad(Runtime.java:1060)
2021-01-07 11:20:22.649 9861-9861/com.m3s.skylark A/art: art/runtime/runtime.cc:419]   - locked <0x066c9d40> (a java.lang.Runtime)
2021-01-07 11:20:22.649 9861-9861/com.m3s.skylark A/art: art/runtime/runtime.cc:419]   at java.lang.Runtime.loadLibrary0(Runtime.java:975)
2021-01-07 11:20:22.649 9861-9861/com.m3s.skylark A/art: art/runtime/runtime.cc:419]   - locked <0x066c9d40> (a java.lang.Runtime)
2021-01-07 11:20:22.650 9861-9861/com.m3s.skylark A/art: art/runtime/runtime.cc:419]   at java.lang.System.loadLibrary(System.java:1567)
2021-01-07 11:20:22.650 9861-9861/com.m3s.skylark A/art: art/runtime/runtime.cc:419]   at net.sqlcipher.database.SQLiteDatabase$1.loadLibraries(SQLiteDatabase.java:227)
2021-01-07 11:20:22.650 9861-9861/com.m3s.skylark A/art: art/runtime/runtime.cc:419]   at net.sqlcipher.database.SQLiteDatabase.loadLibs(SQLiteDatabase.java:244)
2021-01-07 11:20:22.650 9861-9861/com.m3s.skylark A/art: art/runtime/runtime.cc:419]   - locked <0x03a8a479> (a java.lang.Class<net.sqlcipher.database.SQLiteDatabase>)
2021-01-07 11:20:22.650 9861-9861/com.m3s.skylark A/art: art/runtime/runtime.cc:419]   at net.sqlcipher.database.SQLiteDatabase.loadLibs(SQLiteDatabase.java:223)
2021-01-07 11:20:22.650 9861-9861/com.m3s.skylark A/art: art/runtime/runtime.cc:419]   - locked <0x03a8a479> (a java.lang.Class<net.sqlcipher.database.SQLiteDatabase>)
2021-01-07 11:20:22.650 9861-9861/com.m3s.skylark A/art: art/runtime/runtime.cc:419]   at net.sqlcipher.database.SQLiteDatabase.loadLibs(SQLiteDatabase.java:216)
2021-01-07 11:20:22.650 9861-9861/com.m3s.skylark A/art: art/runtime/runtime.cc:419]   - locked <0x03a8a479> (a java.lang.Class<net.sqlcipher.database.SQLiteDatabase>)
2021-01-07 11:20:22.650 9861-9861/com.m3s.skylark A/art: art/runtime/runtime.cc:419]   at net.sqlcipher.database.SupportHelper.<init>(SupportHelper.java:31)
2021-01-07 11:20:22.650 9861-9861/com.m3s.skylark A/art: art/runtime/runtime.cc:419]   at net.sqlcipher.database.SupportFactory.create(SupportFactory.java:43)
2021-01-07 11:20:22.650 9861-9861/com.m3s.skylark A/art: art/runtime/runtime.cc:419]   at com.m3s.skylark.MyAppDatabase_Impl.createOpenHelper(MyAppDatabase_Impl.java:749)
2021-01-07 11:20:22.650 9861-9861/com.m3s.skylark A/art: art/runtime/runtime.cc:419]   at androidx.room.RoomDatabase.init(RoomDatabase.java:161)
2021-01-07 11:20:22.650 9861-9861/com.m3s.skylark A/art: art/runtime/runtime.cc:419]   at androidx.room.RoomDatabase$Builder.build(RoomDatabase.java:953)
2021-01-07 11:20:22.650 9861-9861/com.m3s.skylark A/art: art/runtime/runtime.cc:419]   at com.m3s.skylark.MyAppDatabase.getInstance(MyAppDatabase.java:64)
2021-01-07 11:20:22.650 9861-9861/com.m3s.skylark A/art: art/runtime/runtime.cc:419]   at com.m3s.skylark.LoginActivity.onCreate(LoginActivity.java:113)
2021-01-07 11:20:22.650 9861-9861/com.m3s.skylark A/art: art/runtime/runtime.cc:419]   at android.app.Activity.performCreate(Activity.java:6948)
2021-01-07 11:20:22.650 9861-9861/com.m3s.skylark A/art: art/runtime/runtime.cc:419]   at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1126)
2021-01-07 11:20:22.650 9861-9861/com.m3s.skylark A/art: art/runtime/runtime.cc:419]   at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2924)
2021-01-07 11:20:22.650 9861-9861/com.m3s.skylark A/art: art/runtime/runtime.cc:419]   at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3042)
2021-01-07 11:20:22.650 9861-9861/com.m3s.skylark A/art: art/runtime/runtime.cc:419]   at android.app.ActivityThread.-wrap14(ActivityThread.java:-1)
2021-01-07 11:20:22.650 9861-9861/com.m3s.skylark A/art: art/runtime/runtime.cc:419]   at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1639)
2021-01-07 11:20:22.650 9861-9861/com.m3s.skylark A/art: art/runtime/runtime.cc:419]   at android.os.Handler.dispatchMessage(Handler.java:102)
2021-01-07 11:20:22.650 9861-9861/com.m3s.skylark A/art: art/runtime/runtime.cc:419]   at android.os.Looper.loop(Looper.java:154)
2021-01-07 11:20:22.650 9861-9861/com.m3s.skylark A/art: art/runtime/runtime.cc:419]   at android.app.ActivityThread.main(ActivityThread.java:6780)
2021-01-07 11:20:22.650 9861-9861/com.m3s.skylark A/art: art/runtime/runtime.cc:419]   at java.lang.reflect.Method.invoke!(Native method)
2021-01-07 11:20:22.650 9861-9861/com.m3s.skylark A/art: art/runtime/runtime.cc:419]   at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1496)
2021-01-07 11:20:22.650 9861-9861/com.m3s.skylark A/art: art/runtime/runtime.cc:419]   at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1386)
2021-01-07 11:20:22.650 9861-9861/com.m3s.skylark A/art: art/runtime/runtime.cc:419] 
2021-01-07 11:20:22.650 9861-9861/com.m3s.skylark A/art: art/runtime/runtime.cc:419] "Jit thread pool worker thread 0" prio=5 tid=2 Native (still starting up)
2021-01-07 11:20:22.650 9861-9861/com.m3s.skylark A/art: art/runtime/runtime.cc:419]   | group="" sCount=1 dsCount=0 obj=0x0 self=0x9b630a00
2021-01-07 11:20:22.650 9861-9861/com.m3s.skylark A/art: art/runtime/runtime.cc:419]   | sysTid=9866 nice=9 cgrp=default sched=0/0 handle=0xa5ba7920
2021-01-07 11:20:22.650 9861-9861/com.m3s.skylark A/art: art/runtime/runtime.cc:419]   | state=S schedstat=( 0 0 0 ) utm=6 stm=2 core=6 HZ=100
2021-01-07 11:20:22.650 9861-9861/com.m3s.skylark A/art: art/runtime/runtime.cc:419]   | stack=0xa5aa9000-0xa5aab000 stackSize=1022KB
2021-01-07 11:20:22.650 9861-9861/com.m3s.skylark A/art: art/runtime/runtime.cc:419]   | held mutexes=
2021-01-07 11:20:22.650 9861-9861/com.m3s.skylark A/art: art/runtime/runtime.cc:419]   native: #00 pc 00017520  /system/lib/libc.so (syscall+28)
2021-01-07 11:20:22.650 9861-9861/com.m3s.skylark A/art: art/runtime/runtime.cc:419]   native: #01 pc 000b69a1  /system/lib/libart.so (_ZN3art17ConditionVariable16WaitHoldingLocksEPNS_6ThreadE+92)
2021-01-07 11:20:22.650 9861-9861/com.m3s.skylark A/art: art/runtime/runtime.cc:419]   native: #02 pc 003457cd  /system/lib/libart.so (_ZN3art10ThreadPool7GetTaskEPNS_6ThreadE+160)
2021-01-07 11:20:22.650 9861-9861/com.m3s.skylark A/art: art/runtime/runtime.cc:419]   native: #03 pc 00344ffb  /system/lib/libart.so (_ZN3art16ThreadPoolWorker3RunEv+62)
2021-01-07 11:20:22.650 9861-9861/com.m3s.skylark A/art: art/runtime/runtime.cc:419]   native: #04 pc 00344b21  /system/lib/libart.so (_ZN3art16ThreadPoolWorker8CallbackEPv+64)
2021-01-07 11:20:22.650 9861-9861/com.m3s.skylark A/art: art/runtime/runtime.cc:419]   native: #05 pc 00047f83  /system/lib/libc.so (_ZL15__pthread_startPv+22)
2021-01-07 11:20:22.650 9861-9861/com.m3s.skylark A/art: art/runtime/runtime.cc:419]   native: #06 pc 0001a151  /system/lib/libc.so (__start_thread+6)
2021-01-07 11:20:22.650 9861-9861/com.m3s.skylark A/art: art/runtime/runtime.cc:419]   (no managed stack frames)
2021-01-07 11:20:22.650 9861-9861/com.m3s.skylark A/art: art/runtime/runtime.cc:419] 
2021-01-07 11:20:22.650 9861-9861/com.m3s.skylark A/art: art/runtime/runtime.cc:419] "Signal Catcher" prio=5 tid=3 WaitingInMainSignalCatcherLoop
2021-01-07 11:20:22.650 9861-9861/com.m3s.skylark A/art: art/runtime/runtime.cc:419]   | group="" sCount=1 dsCount=0 obj=0x12ce5940 self=0x99740300
2021-01-07 11:20:22.650 9861-9861/com.m3s.skylark A/art: art/runtime/runtime.cc:419]   | sysTid=9867 nice=0 cgrp=default sched=0/0 handle=0xa5aa6920
2021-01-07 11:20:22.650 9861-9861/com.m3s.skylark A/art: art/runtime/runtime.cc:419]   | state=S schedstat=( 0 0 0 ) utm=0 stm=0 core=6 HZ=100
2021-01-07 11:20:22.650 9861-9861/com.m3s.skylark A/art: art/runtime/runtime.cc:419]   | stack=0xa59aa000-0xa59ac000 stackSize=1014KB
2021-01-07 11:20:22.650 9861-9861/com.m3s.skylark A/art: art/runtime/runtime.cc:419]   | held mutexes=
2021-01-07 11:20:22.650 9861-9861/com.m3s.skylark A/art: art/runtime/runtime.cc:419]   native: #00 pc 00049770  /system/lib/libc.so (__rt_sigtimedwait+12)
2021-01-07 11:20:22.650 9861-9861/com.m3s.skylark A/art: art/runtime/runtime.cc:419]   native: #01 pc 0001e923  /system/lib/libc.so (sigwait+34)
2021-01-07 11:20:22.650 9861-9861/com.m3s.skylark A/art: art/runtime/runtime.cc:419]   native: #02 pc 003281ff  /system/lib/libart.so (_ZN3art9SignalSet4WaitEv+22)
2021-01-07 11:20:22.650 9861-9861/com.m3s.skylark A/art: art/runtime/runtime.cc:419]   native: #03 pc 00327df9  /system/lib/libart.so (_ZN3art13SignalCatcher13WaitForSignalEPNS_6ThreadERNS_9SignalSetE+168)
2021-01-07 11:20:22.650 9861-9861/com.m3s.skylark A/art: art/runtime/runtime.cc:419]   native: #04 pc 00326a3b  /system/lib/libart.so (_ZN3art13SignalCatcher3RunEPv+302)
2021-01-07 11:20:22.650 9861-9861/com.m3s.skylark A/art: art/runtime/runtime.cc:419]   native: #05 pc 00047f83  /system/lib/libc.so (_ZL15__pthread_startPv+22)
2021-01-07 11:20:22.650 9861-9861/com.m3s.skylark A/art: art/runtime/runtime.cc:419]   native: #06 pc 0001a151  /system/lib/libc.so (__start_thread+6)
2021-01-07 11:20:22.650 9861-9861/com.m3s.skylark A/art: art/runtime/runtime.cc:419]   (no managed stack frames)
2021-01-07 11:20:22.650 9861-9861/com.m3s.skylark A/art: art/runtime/runtime.cc:419] 
2021-01-07 11:20:22.650 9861-9861/com.m3s.skylark A/art: art/runtime/runtime.cc:419] "JDWP" prio=5 tid=4 WaitingInMainDebuggerLoop
2021-01-07 11:20:22.650 9861-9861/com.m3s.skylark A/art: art/runtime/runtime.cc:419]   | group="" sCount=1 dsCount=0 obj=0x12ce58b0 self=0x9b631e00
2021-01-07 11:20:22.650 9861-9861/com.m3s.skylark A/art: art/runtime/runtime.cc:419]   | sysTid=9868 nice=0 cgrp=default sched=0/0 handle=0xa59a7920
2021-01-07 11:20:22.650 9861-9861/com.m3s.skylark A/art: art/runtime/runtime.cc:419]   | state=S schedstat=( 0 0 0 ) utm=0 stm=0 core=5 HZ=100
2021-01-07 11:20:22.650 9861-9861/com.m3s.skylark A/art: art/runtime/runtime.cc:419]   | stack=0xa58ab000-0xa58ad000 stackSize=1014KB
2021-01-07 11:20:22.650 9861-9861/com.m3s.skylark A/art: art/runtime/runtime.cc:419]   | held mutexes=
2021-01-07 11:20:22.650 9861-9861/com.m3s.skylark A/art: art/runtime/runtime.cc:419]   native: #00 pc 00049648  /system/lib/libc.so (__pselect6+20)
2021-01-07 11:20:22.650 9861-9861/com.m3s.skylark A/art: art/runtime/runtime.cc:419]   native: #01 pc 0001d529  /system/lib/libc.so (select+88)
2021-01-07 11:20:22.650 9861-9861/com.m3s.skylark A/art: art/runtime/runtime.cc:419]   native: #02 pc 003fdfb3  /system/lib/libart.so (_ZN3art4JDWP12JdwpAdbState15ProcessIncomingEv+302)
2021-01-07 11:20:22.650 9861-9861/com.m3s.skylark A/art: art/runtime/runtime.cc:419]   native: #03 pc 00249717  /system/lib/libart.so (_ZN3art4JDWP9JdwpState3RunEv+654)
2021-01-07 11:20:22.650 9861-9861/com.m3s.skylark A/art: art/runtime/runtime.cc:419]   native: #04 pc 00248eb7  /system/lib/libart.so (_ZN3art4JDWPL15StartJdwpThreadEPv+22)
2021-01-07 11:20:22.650 9861-9861/com.m3s.skylark A/art: art/runtime/runtime.cc:419]   native: #05 pc 00047f83  /system/lib/libc.so (_ZL15__pthread_startPv+22)
2021-01-07 11:20:22.650 9861-9861/com.m3s.skylark A/art: art/runtime/runtime.cc:419]   native: #06 pc 0001a151  /system/lib/libc.so (__start_thread+6)
2021-01-07 11:20:22.650 9861-9861/com.m3s.skylark A/art: art/runtime/runtime.cc:419]   (no managed stack frames)
2021-01-07 11:20:22.650 9861-9861/com.m3s.skylark A/art: art/runtime/runtime.cc:419] 
2021-01-07 11:20:22.650 9861-9861/com.m3s.skylark A/art: art/runtime/runtime.cc:419] "ReferenceQueueDaemon" prio=5 tid=6 Waiting
2021-01-07 11:20:22.650 9861-9861/com.m3s.skylark A/art: art/runtime/runtime.cc:419]   | group="" sCount=1 dsCount=0 obj=0x12ce5790 self=0x99742b00
2021-01-07 11:20:22.650 9861-9861/com.m3s.skylark A/art: art/runtime/runtime.cc:419]   | sysTid=9870 nice=0 cgrp=default sched=0/0 handle=0xa57a3920
2021-01-07 11:20:22.650 9861-9861/com.m3s.skylark A/art: art/runtime/runtime.cc:419]   | state=S schedstat=( 0 0 0 ) utm=0 stm=0 core=7 HZ=100
2021-01-07 11:20:22.650 9861-9861/com.m3s.skylark A/art: art/runtime/runtime.cc:419]   | stack=0xa56a1000-0xa56a3000 stackSize=1038KB
2021-01-07 11:20:22.650 9861-9861/com.m3s.skylark A/art: art/runtime/runtime.cc:419]   | held mutexes=
2021-01-07 11:20:22.650 9861-9861/com.m3s.skylark A/art: art/runtime/runtime.cc:419]   native: #00 pc 00017520  /system/lib/libc.so (syscall+28)
2021-01-07 11:20:22.650 9861-9861/com.m3s.skylark A/art: art/runtime/runtime.cc:419]   native: #01 pc 000b69a1  /system/lib/libart.so (_ZN3art17ConditionVariable16WaitHoldingLocksEPNS_6ThreadE+92)
2021-01-07 11:20:22.650 9861-9861/com.m3s.skylark A/art: art/runtime/runtime.cc:419]   native: #02 pc 002a01e5  /system/lib/libart.so (_ZN3art7Monitor4WaitEPNS_6ThreadExibNS_11ThreadStateE+512)
2021-01-07 11:20:22.650 9861-9861/com.m3s.skylark A/art: art/runtime/runtime.cc:419]   native: #03 pc 002a196b  /system/lib/libart.so (_ZN3art7Monitor4WaitEPNS_6ThreadEPNS_6mirror6ObjectExibNS_11ThreadStateE+258)
2021-01-07 11:20:22.650 9861-9861/com.m3s.skylark A/art: art/runtime/runtime.cc:419]   native: #04 pc 002b00bf  /system/lib/libart.so (_ZN3artL11Object_waitEP7_JNIEnvP8_jobject+32)
2021-01-07 11:20:22.650 9861-9861/com.m3s.skylark A/art: art/runtime/runtime.cc:419]   native: #05 pc 00000557  /system/framework/arm/boot.oat (Java_java_lang_Object_wait__+74)
2021-01-07 11:20:22.650 9861-9861/com.m3s.skylark A/art: art/runtime/runtime.cc:419]   at java.lang.Object.wait!(Native method)
2021-01-07 11:20:22.650 9861-9861/com.m3s.skylark A/art: art/runtime/runtime.cc:419]   - waiting on <0x0f8115be> (a java.lang.Class<java.lang.ref.ReferenceQueue>)
2021-01-07 11:20:22.650 9861-9861/com.m3s.skylark A/art: art/runtime/runtime.cc:419]   at java.lang.Daemons$ReferenceQueueDaemon.run(Daemons.java:150)
2021-01-07 11:20:22.650 9861-9861/com.m3s.skylark A/art: art/runtime/runtime.cc:419]   - locked <0x0f8115be> (a java.lang.Class<java.lang.ref.ReferenceQueue>)
2021-01-07 11:20:22.650 9861-9861/com.m3s.skylark A/art: art/runtime/runtime.cc:419]   at java.lang.Thread.run(Thread.java:762)
2021-01-07 11:20:22.650 9861-9861/com.m3s.skylark A/art: art/runtime/runtime.cc:419] 
2021-01-07 11:20:22.650 9861-9861/com.m3s.skylark A/art: art/runtime/runtime.cc:419] "FinalizerDaemon" prio=5 tid=7 Waiting
2021-01-07 11:20:22.650 9861-9861/com.m3s.skylark A/art: art/runtime/runtime.cc:419]   | group="" sCount=1 dsCount=0 obj=0x12ce5700 self=0x9f19b400
2021-01-07 11:20:22.650 9861-9861/com.m3s.skylark A/art: art/runtime/runtime.cc:419]   | sysTid=9871 nice=0 cgrp=default sched=0/0 handle=0xa569e920
2021-01-07 11:20:22.650 9861-9861/com.m3s.skylark A/art: art/runtime/runtime.cc:419]   | state=S schedstat=( 0 0 0 ) utm=0 stm=0 core=4 HZ=100
2021-01-07 11:20:22.650 9861-9861/com.m3s.skylark A/art: art/runtime/runtime.cc:419]   | stack=0xa559c000-0xa559e000 stackSize=1038KB
2021-01-07 11:20:22.650 9861-9861/com.m3s.skylark A/art: art/runtime/runtime.cc:419]   | held mutexes=
2021-01-07 11:20:22.650 9861-9861/com.m3s.skylark A/art: art/runtime/runtime.cc:419]   native: #00 pc 00017520  /system/lib/libc.so (syscall+28)
2021-01-07 11:20:22.650 9861-9861/com.m3s.skylark A/art: art/runtime/runtime.cc:419]   native: #01 pc 000b69a1  /system/lib/libart.so (_ZN3art17ConditionVariable16WaitHoldingLocksEPNS_6ThreadE+92)
2021-01-07 11:20:22.650 9861-9861/com.m3s.skylark A/art: art/runtime/runtime.cc:419]   native: #02 pc 002a01e5  /system/lib/libart.so (_ZN3art7Monitor4WaitEPNS_6ThreadExibNS_11ThreadStateE+512)
2021-01-07 11:20:22.650 9861-9861/com.m3s.skylark A/art: art/runtime/runtime.cc:419]   native: #03 pc 002a196b  /system/lib/libart.so (_ZN3art7Monitor4WaitEPNS_6ThreadEPNS_6mirror6ObjectExibNS_11ThreadStateE+258)
2021-01-07 11:20:22.650 9861-9861/com.m3s.skylark A/art: art/runtime/runtime.cc:419]   native: #04 pc 002b00eb  /system/lib/libart.so (_ZN3artL13Object_waitJIEP7_JNIEnvP8_jobjectxi+36)
2021-01-07 11:20:22.650 9861-9861/com.m3s.skylark A/art: art/runtime/runtime.cc:419]   native: #05 pc 00000655  /system/framework/arm/boot.oat (Java_java_lang_Object_wait__JI+96)
2021-01-07 11:20:22.650 9861-9861/com.m3s.skylark A/art: art/runtime/runtime.cc:419]   at java.lang.Object.wait!(Native method)
2021-01-07 11:20:22.650 9861-9861/com.m3s.skylark A/art: art/runtime/runtime.cc:419]   - waiting on <0x0d8a561f> (a java.lang.Object)
2021-01-07 11:20:22.650 9861-9861/com.m3s.skylark A/art: art/runtime/runtime.cc:419]   at java.lang.Object.wait(Object.java:407)
2021-01-07 11:20:22.650 9861-9861/com.m3s.skylark A/art: art/runtime/runtime.cc:419]   at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:188)
2021-01-07 11:20:22.650 9861-9861/com.m3s.skylark A/art: art/runtime/runtime.cc:419]   - locked <0x0d8a561f> (a java.lang.Object)
2021-01-07 11:20:22.650 9861-9861/com.m3s.skylark A/art: art/runtime/runtime.cc:419]   at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:209)
2021-01-07 11:20:22.650 9861-9861/com.m3s.skylark A/art: art/runtime/runtime.cc:419]   at java.lang.Daemons$FinalizerDaemon.run(Daemons.java:204)
2021-01-07 11:20:22.650 9861-9861/com.m3s.skylark A/art: art/runtime/runtime.cc:419]   at java.lang.Thread.run(Thread.java:762)
2021-01-07 11:20:22.650 9861-9861/com.m3s.skylark A/art: art/runtime/runtime.cc:419] 
2021-01-07 11:20:22.650 9861-9861/com.m3s.skylark A/art: art/runtime/runtime.cc:419] "FinalizerWatchdogDaemon" prio=5 tid=8 Sleeping
2021-01-07 11:20:22.650 9861-9861/com.m3s.skylark A/art: art/runtime/runtime.cc:419]   | group="" sCount=1 dsCount=0 obj=0x12ce5670 self=0x9f19b900
2021-01-07 11:20:22.650 9861-9861/com.m3s.skylark A/art: art/runtime/runtime.cc:419]   | sysTid=9872 nice=0 cgrp=default sched=0/0 handle=0xa5599920
2021-01-07 11:20:22.650 9861-9861/com.m3s.skylark A/art: art/runtime/runtime.cc:419]   | state=S schedstat=( 0 0 0 ) utm=0 stm=0 core=7 HZ=100
2021-01-07 11:20:22.650 9861-9861/com.m3s.skylark A/art: art/runtime/runtime.cc:419]   | stack=0xa5497000-0xa5499000 stackSize=1038KB
2021-01-07 11:20:22.650 9861-9861/com.m3s.skylark A/art: art/runtime/runtime.cc:419]   | held mutexes=
2021-01-07 11:20:22.650 9861-9861/com.m3s.skylark A/art: art/runtime/runtime.cc:419]   native: #00 pc 00017524  /system/lib/libc.so (syscall+32)
2021-01-07 11:20:22.651 9861-9861/com.m3s.skylark A/art: art/runtime/runtime.cc:419]   native: #01 pc 000b6dcd  /system/lib/libart.so (_ZN3art17ConditionVariable9TimedWaitEPNS_6ThreadExi+108)
2021-01-07 11:20:22.651 9861-9861/com.m3s.skylark A/art: art/runtime/runtime.cc:419]   native: #02 pc 002a01f5  /system/lib/libart.so (_ZN3art7Monitor4WaitEPNS_6ThreadExibNS_11ThreadStateE+528)
2021-01-07 11:20:22.651 9861-9861/com.m3s.skylark A/art: art/runtime/runtime.cc:419]   native: #03 pc 002a196b  /system/lib/libart.so (_ZN3art7Monitor4WaitEPNS_6ThreadEPNS_6mirror6ObjectExibNS_11ThreadStateE+258)
2021-01-07 11:20:22.651 9861-9861/com.m3s.skylark A/art: art/runtime/runtime.cc:419]   native: #04 pc 002b4d1d  /system/lib/libart.so (_ZN3artL12Thread_sleepEP7_JNIEnvP7_jclassP8_jobjectxi+56)
2021-01-07 11:20:22.651 9861-9861/com.m3s.skylark A/art: art/runtime/runtime.cc:419]   native: #05 pc 000888a3  /system/framework/arm/boot.oat (Java_java_lang_Thread_sleep__Ljava_lang_Object_2JI+126)
2021-01-07 11:20:22.651 9861-9861/com.m3s.skylark A/art: art/runtime/runtime.cc:419]   at java.lang.Thread.sleep!(Native method)
2021-01-07 11:20:22.651 9861-9861/com.m3s.skylark A/art: art/runtime/runtime.cc:419]   - sleeping on <0x051e4d6c> (a java.lang.Object)
2021-01-07 11:20:22.651 9861-9861/com.m3s.skylark A/art: art/runtime/runtime.cc:419]   at java.lang.Thread.sleep(Thread.java:371)
2021-01-07 11:20:22.651 9861-9861/com.m3s.skylark A/art: art/runtime/runtime.cc:419]   - locked <0x051e4d6c> (a java.lang.Object)
2021-01-07 11:20:22.651 9861-9861/com.m3s.skylark A/art: art/runtime/runtime.cc:419]   at java.lang.Thread.sleep(Thread.java:313)
2021-01-07 11:20:22.651 9861-9861/com.m3s.skylark A/art: art/runtime/runtime.cc:419]   at java.lang.Daemons$FinalizerWatchdogDaemon.sleepFor(Daemons.java:314)
2021-01-07 11:20:22.651 9861-9861/com.m3s.skylark A/art: art/runtime/runtime.cc:419]   at java.lang.Daemons$FinalizerWatchdogDaemon.waitForFinalization(Daemons.java:336)
2021-01-07 11:20:22.651 9861-9861/com.m3s.skylark A/art: art/runtime/runtime.cc:419]   at java.lang.Daemons$FinalizerWatchdogDaemon.run(Daemons.java:253)
2021-01-07 11:20:22.651 9861-9861/com.m3s.skylark A/art: art/runtime/runtime.cc:419]   at java.lang.Thread.run(Thread.java:762)
2021-01-07 11:20:22.651 9861-9861/com.m3s.skylark A/art: art/runtime/runtime.cc:419] 
2021-01-07 11:20:22.651 9861-9861/com.m3s.skylark A/art: art/runtime/runtime.cc:419] "HeapTaskDaemon" prio=5 tid=9 Blocked
2021-01-07 11:20:22.651 9861-9861/com.m3s.skylark A/art: art/runtime/runtime.cc:419]   | group="" sCount=1 dsCount=0 obj=0x12ce55e0 self=0x9f19be00
2021-01-07 11:20:22.651 9861-9861/com.m3s.skylark A/art: art/runtime/runtime.cc:419]   | sysTid=9873 nice=0 cgrp=default sched=0/0 handle=0xa5494920
2021-01-07 11:20:22.651 9861-9861/com.m3s.skylark A/art: art/runtime/runtime.cc:419]   | state=S schedstat=( 0 0 0 ) utm=1 stm=0 core=4 HZ=100
2021-01-07 11:20:22.651 9861-9861/com.m3s.skylark A/art: art/runtime/runtime.cc:419]   | stack=0xa5392000-0xa5394000 stackSize=1038KB
2021-01-07 11:20:22.651 9861-9861/com.m3s.skylark A/art: art/runtime/runtime.cc:419]   | held mutexes=
2021-01-07 11:20:22.651 9861-9861/com.m3s.skylark A/art: art/runtime/runtime.cc:419]   native: #00 pc 00017520  /system/lib/libc.so (syscall+28)
2021-01-07 11:20:22.651 9861-9861/com.m3s.skylark A/art: art/runtime/runtime.cc:419]   native: #01 pc 000b69a1  /system/lib/libart.so (_ZN3art17ConditionVariable16WaitHoldingLocksEPNS_6ThreadE+92)
2021-01-07 11:20:22.651 9861-9861/com.m3s.skylark A/art: art/runtime/runtime.cc:419]   native: #02 pc 001b5ab9  /system/lib/libart.so (_ZN3art2gc13TaskProcessor7GetTaskEPNS_6ThreadE+288)
2021-01-07 11:20:22.651 9861-9861/com.m3s.skylark A/art: art/runtime/runtime.cc:419]   native: #03 pc 001b612d  /system/lib/libart.so (_ZN3art2gc13TaskProcessor11RunAllTasksEPNS_6ThreadE+44)
2021-01-07 11:20:22.651 9861-9861/com.m3s.skylark A/art: art/runtime/runtime.cc:419]   native: #04 pc 001603bf  /system/framework/arm/boot-core-libart.oat (Java_dalvik_system_VMRuntime_runHeapTasks__+74)
2021-01-07 11:20:22.651 9861-9861/com.m3s.skylark A/art: art/runtime/runtime.cc:419]   at dalvik.system.VMRuntime.runHeapTasks(Native method)
2021-01-07 11:20:22.651 9861-9861/com.m3s.skylark A/art: art/runtime/runtime.cc:419]   - waiting to lock an unknown object
2021-01-07 11:20:22.651 9861-9861/com.m3s.skylark A/art: art/runtime/runtime.cc:419]   at java.lang.Daemons$HeapTaskDaemon.run(Daemons.java:433)
2021-01-07 11:20:22.651 9861-9861/com.m3s.skylark A/art: art/runtime/runtime.cc:419]   at java.lang.Thread.run(Thread.java:762)
2021-01-07 11:20:22.651 9861-9861/com.m3s.skylark A/art: art/runtime/runtime.cc:419] 
2021-01-07 11:20:22.651 9861-9861/com.m3s.skylark A/art: art/runtime/runtime.cc:419] "Binder:9861_1" prio=5 tid=5 Native
2021-01-07 11:20:22.651 9861-9861/com.m3s.skylark A/art: art/runtime/runtime.cc:419]   | group="" sCount=1 dsCount=0 obj=0x12ce51f0 self=0x99741700
2021-01-07 11:20:22.651 9861-9861/com.m3s.skylark A/art: art/runtime/runtime.cc:419]   | sysTid=9874 nice=0 cgrp=default sched=0/0 handle=0xa538f920
2021-01-07 11:20:22.651 9861-9861/com.m3s.skylark A/art: art/runtime/runtime.cc:419]   | state=S schedstat=( 0 0 0 ) utm=0 stm=0 core=7 HZ=100
2021-01-07 11:20:22.651 9861-9861/com.m3s.skylark A/art: art/runtime/runtime.cc:419]   | stack=0xa5293000-0xa5295000 stackSize=1014KB
2021-01-07 11:20:22.651 9861-9861/com.m3s.skylark A/art: art/runtime/runtime.cc:419]   | held mutexes=
2021-01-07 11:20:22.651 9861-9861/com.m3s.skylark A/art: art/runtime/runtime.cc:419]   native: #00 pc 00049544  /system/lib/libc.so (__ioctl+8)
2021-01-07 11:20:22.651 9861-9861/com.m3s.skylark A/art: art/runtime/runtime.cc:419]   native: #01 pc 0001b32f  /system/lib/libc.so (ioctl+38)
2021-01-07 11:20:22.651 9861-9861/com.m3s.skylark A/art: art/runtime/runtime.cc:419]   native: #02 pc 0003ce89  /system/lib/libbinder.so (_ZN7android14IPCThreadState14talkWithDriverEb+168)
2021-01-07 11:20:22.651 9861-9861/com.m3s.skylark A/art: art/runtime/runtime.cc:419]   native: #03 pc 0003cf85  /system/lib/libbinder.so (_ZN7android14IPCThreadState20getAndExecuteCommandEv+8)
2021-01-07 11:20:22.651 9861-9861/com.m3s.skylark A/art: art/runtime/runtime.cc:419]   native: #04 pc 0003d50b  /system/lib/libbinder.so (_ZN7android14IPCThreadState14joinThreadPoolEb+46)
2021-01-07 11:20:22.651 9861-9861/com.m3s.skylark A/art: art/runtime/runtime.cc:419]   native: #05 pc 0004f935  /system/lib/libbinder.so (???)
2021-01-07 11:20:22.651 9861-9861/com.m3s.skylark A/art: art/runtime/runtime.cc:419]   native: #06 pc 0000e369  /system/lib/libutils.so (_ZN7android6Thread11_threadLoopEPv+144)
2021-01-07 11:20:22.651 9861-9861/com.m3s.skylark A/art: art/runtime/runtime.cc:419]   native: #07 pc 0006a4b5  /system/lib/libandroid_runtime.so (_ZN7android14AndroidRuntime15javaThreadShellEPv+80)
2021-01-07 11:20:22.651 9861-9861/com.m3s.skylark A/art: art/runtime/runtime.cc:419]   native: #08 pc 00047f83  /system/lib/libc.so (_ZL15__pthread_startPv+22)
2021-01-07 11:20:22.651 9861-9861/com.m3s.skylark A/art: art/runtime/runtime.cc:419]   native: #09 pc 0001a151  /system/lib/libc.so (__start_thread+6)
2021-01-07 11:20:22.651 9861-9861/com.m3s.skylark A/art: art/runtime/runtime.cc:419]   (no managed stack frames)
2021-01-07 11:20:22.651 9861-9861/com.m3s.skylark A/art: art/runtime/runtime.cc:419] 
2021-01-07 11:20:22.651 9861-9861/com.m3s.skylark A/art: art/runtime/runtime.cc:419] "Binder:9861_2" prio=5 tid=10 Native
2021-01-07 11:20:22.651 9861-9861/com.m3s.skylark A/art: art/runtime/runtime.cc:419]   | group="" sCount=1 dsCount=0 obj=0x12ce5280 self=0x9b633200
2021-01-07 11:20:22.651 9861-9861/com.m3s.skylark A/art: art/runtime/runtime.cc:419]   | sysTid=9875 nice=0 cgrp=default sched=0/0 handle=0xa5290920
2021-01-07 11:20:22.651 9861-9861/com.m3s.skylark A/art: art/runtime/runtime.cc:419]   | state=S schedstat=( 0 0 0 ) utm=0 stm=0 core=3 HZ=100
2021-01-07 11:20:22.651 9861-9861/com.m3s.skylark A/art: art/runtime/runtime.cc:419]   | stack=0xa5194000-0xa5196000 stackSize=1014KB
2021-01-07 11:20:22.651 9861-9861/com.m3s.skylark A/art: art/runtime/runtime.cc:419]   | held mutexes=
2021-01-07 11:20:22.651 9861-9861/com.m3s.skylark A/art: art/runtime/runtime.cc:419]   native: #00 pc 00049544  /system/lib/libc.so (__ioctl+8)
2021-01-07 11:20:22.651 9861-9861/com.m3s.skylark A/art: art/runtime/runtime.cc:419]   native: #01 pc 0001b32f  /system/lib/libc.so (ioctl+38)
2021-01-07 11:20:22.651 9861-9861/com.m3s.skylark A/art: art/runtime/runtime.cc:419]   native: #02 pc 0003ce89  /system/lib/libbinder.so (_ZN7android14IPCThreadState14talkWithDriverEb+168)
2021-01-07 11:20:22.651 9861-9861/com.m3s.skylark A/art: art/runtime/runtime.cc:419]   native: #03 pc 0003cf85  /system/lib/libbinder.so (_ZN7android14IPCThreadState20getAndExecuteCommandEv+8)
2021-01-07 11:20:22.651 9861-9861/com.m3s.skylark A/art: art/runtime/runtime.cc:419]   native: #04 pc 0003d50b  /system/lib/libbinder.so (_ZN7android14IPCThreadState14joinThreadPoolEb+46)
2021-01-07 11:20:22.651 9861-9861/com.m3s.skylark A/art: art/runtime/runtime.cc:419]   native: #05 pc 0004f935  /system/lib/libbinder.so (???)
2021-01-07 11:20:22.651 9861-9861/com.m3s.skylark A/art: art/runtime/runtime.cc:419]   native: #06 pc 0000e369  /system/lib/libutils.so (_ZN7android6Thread11_threadLoopEPv+144)
2021-01-07 11:20:22.651 9861-9861/com.m3s.skylark A/art: art/runtime/runtime.cc:419]   native: #07 pc 0006a4b5  /system/lib/libandroid_runtime.so (_ZN7android14AndroidRuntime15javaThreadShellEPv+80)
2021-01-07 11:20:22.651 9861-9861/com.m3s.skylark A/art: art/runtime/runtime.cc:419]   native: #08 pc 00047f83  /system/lib/libc.so (_ZL15__pthread_startPv+22)
2021-01-07 11:20:22.651 9861-9861/com.m3s.skylark A/art: art/runtime/runtime.cc:419]   native: #09 pc 0001a151  /system/lib/libc.so (__start_thread+6)
2021-01-07 11:20:22.651 9861-9861/com.m3s.skylark A/art: art/runtime/runtime.cc:419]   (no managed stack frames)
2021-01-07 11:20:22.651 9861-9861/com.m3s.skylark A/art: art/runtime/runtime.cc:419] 
2021-01-07 11:20:22.651 9861-9861/com.m3s.skylark A/art: art/runtime/runtime.cc:419] "Profile Saver" prio=5 tid=11 Native
2021-01-07 11:20:22.651 9861-9861/com.m3s.skylark A/art: art/runtime/runtime.cc:419]   | group="" sCount=1 dsCount=0 obj=0x12c225e0 self=0x99916500
2021-01-07 11:20:22.651 9861-9861/com.m3s.skylark A/art: art/runtime/runtime.cc:419]   | sysTid=9878 nice=0 cgrp=default sched=0/0 handle=0xa5191920
2021-01-07 11:20:22.651 9861-9861/com.m3s.skylark A/art: art/runtime/runtime.cc:419]   | state=S schedstat=( 0 0 0 ) utm=0 stm=0 core=4 HZ=100
2021-01-07 11:20:22.651 9861-9861/com.m3s.skylark A/art: art/runtime/runtime.cc:419]   | stack=0xa5095000-0xa5097000 stackSize=1014KB
2021-01-07 11:20:22.651 9861-9861/com.m3s.skylark A/art: art/runtime/runtime.cc:419]   | held mutexes=
2021-01-07 11:20:22.651 9861-9861/com.m3s.skylark A/art: art/runtime/runtime.cc:419]   native: #00 pc 00017520  /system/lib/libc.so (syscall+28)
2021-01-07 11:20:22.651 9861-9861/com.m3s.skylark A/art: art/runtime/runtime.cc:419]   native: #01 pc 000b69a1  /system/lib/libart.so (_ZN3art17ConditionVariable16WaitHoldingLocksEPNS_6ThreadE+92)
2021-01-07 11:20:22.651 9861-9861/com.m3s.skylark A/art: art/runtime/runtime.cc:419]   native: #02 pc 0025ab09  /system/lib/libart.so (_ZN3art12ProfileSaver3RunEv+296)
2021-01-07 11:20:22.651 9861-9861/com.m3s.skylark A/art: art/runtime/runtime.cc:419]   native: #03 pc 0025be4d  /system/lib/libart.so (_ZN3art12ProfileSaver21RunProfileSaverThreadEPv+52)
2021-01-07 11:20:22.651 9861-9861/com.m3s.skylark A/art: art/runtime/runtime.cc:419]   native: #04 pc 00047f83  /system/lib/libc.so (_ZL15__pthread_startPv+22)
2021-01-07 11:20:22.651 9861-9861/com.m3s.skylark A/art: art/runtime/runtime.cc:419]   native: #05 pc 0001a151  /system/lib/libc.so (__start_thread+6)
2021-01-07 11:20:22.651 9861-9861/com.m3s.skylark A/art: art/runtime/runtime.cc:419]   (no managed stack frames)
2021-01-07 11:20:22.651 9861-9861/com.m3s.skylark A/art: art/runtime/runtime.cc:419] 
2021-01-07 11:20:22.651 9861-9861/com.m3s.skylark A/art: art/runtime/runtime.cc:419] "pool-1-thread-1" prio=5 tid=12 Waiting
2021-01-07 11:20:22.651 9861-9861/com.m3s.skylark A/art: art/runtime/runtime.cc:419]   | group="" sCount=1 dsCount=0 obj=0x12c7d700 self=0x99742600
2021-01-07 11:20:22.651 9861-9861/com.m3s.skylark A/art: art/runtime/runtime.cc:419]   | sysTid=9881 nice=0 cgrp=default sched=0/0 handle=0x9b87f920
2021-01-07 11:20:22.651 9861-9861/com.m3s.skylark A/art: art/runtime/runtime.cc:419]   | state=S schedstat=( 0 0 0 ) utm=0 stm=0 core=6 HZ=100
2021-01-07 11:20:22.651 9861-9861/com.m3s.skylark A/art: art/runtime/runtime.cc:419]   | stack=0x9b77d000-0x9b77f000 stackSize=1038KB
2021-01-07 11:20:22.651 9861-9861/com.m3s.skylark A/art: art/runtime/runtime.cc:419]   | held mutexes=
2021-01-07 11:20:22.651 9861-9861/com.m3s.skylark A/art: art/runtime/runtime.cc:419]   native: #00 pc 00017520  /system/lib/libc.so (syscall+28)
2021-01-07 11:20:22.651 9861-9861/com.m3s.skylark A/art: art/runtime/runtime.cc:419]   native: #01 pc 000b69a1  /system/lib/libart.so (_ZN3art17ConditionVariable16WaitHoldingLocksEPNS_6ThreadE+92)
2021-01-07 11:20:22.651 9861-9861/com.m3s.skylark A/art: art/runtime/runtime.cc:419]   native: #02 pc 002a01e5  /system/lib/libart.so (_ZN3art7Monitor4WaitEPNS_6ThreadExibNS_11ThreadStateE+512)
2021-01-07 11:20:22.651 9861-9861/com.m3s.skylark A/art: art/runtime/runtime.cc:419]   native: #03 pc 002a196b  /system/lib/libart.so (_ZN3art7Monitor4WaitEPNS_6ThreadEPNS_6mirror6ObjectExibNS_11ThreadStateE+258)
2021-01-07 11:20:22.651 9861-9861/com.m3s.skylark A/art: art/runtime/runtime.cc:419]   native: #04 pc 002b00eb  /system/lib/libart.so (_ZN3artL13Object_waitJIEP7_JNIEnvP8_jobjectxi+36)
2021-01-07 11:20:22.651 9861-9861/com.m3s.skylark A/art: art/runtime/runtime.cc:419]   native: #05 pc 00000655  /system/framework/arm/boot.oat (Java_java_lang_Object_wait__JI+96)
2021-01-07 11:20:22.651 9861-9861/com.m3s.skylark A/art: art/runtime/runtime.cc:419]   at java.lang.Object.wait!(Native method)
2021-01-07 11:20:22.651 9861-9861/com.m3s.skylark A/art: art/runtime/runtime.cc:419]   - waiting on <0x07060f35> (a java.lang.Object)
2021-01-07 11:20:22.651 9861-9861/com.m3s.skylark A/art: art/runtime/runtime.cc:419]   at java.lang.Thread.parkFor$(Thread.java:2128)
2021-01-07 11:20:22.651 9861-9861/com.m3s.skylark A/art: art/runtime/runtime.cc:419]   - locked <0x07060f35> (a java.lang.Object)
2021-01-07 11:20:22.651 9861-9861/com.m3s.skylark A/art: art/runtime/runtime.cc:419]   at sun.misc.Unsafe.park(Unsafe.java:325)
2021-01-07 11:20:22.651 9861-9861/com.m3s.skylark A/art: art/runtime/runtime.cc:419]   at java.util.concurrent.locks.LockSupport.park(LockSupport.java:161)
2021-01-07 11:20:22.651 9861-9861/com.m3s.skylark A/art: art/runtime/runtime.cc:419]   at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:2035)
2021-01-07 11:20:22.651 9861-9861/com.m3s.skylark A/art: art/runtime/runtime.cc:419]   at java.util.concurrent.LinkedBlockingQueue.take(LinkedBlockingQueue.java:413)
2021-01-07 11:20:22.651 9861-9861/com.m3s.skylark A/art: art/runtime/runtime.cc:419]   at java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1058)
2021-01-07 11:20:22.651 9861-9861/com.m3s.skylark A/art: art/runtime/runtime.cc:419]   at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1118)
2021-01-07 11:20:22.651 9861-9861/com.m3s.skylark A/art: art/runtime/runtime.cc:419]   at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:607)
2021-01-07 11:20:22.651 9861-9861/com.m3s.skylark A/art: art/runtime/runtime.cc:419]   at java.lang.Thread.run(Thread.java:762)
2021-01-07 11:20:22.651 9861-9861/com.m3s.skylark A/art: art/runtime/runtime.cc:419] 
2021-01-07 11:20:22.651 9861-9861/com.m3s.skylark A/art: art/runtime/runtime.cc:419] "Binder:9861_3" prio=5 tid=13 Native
2021-01-07 11:20:22.651 9861-9861/com.m3s.skylark A/art: art/runtime/runtime.cc:419]   | group="" sCount=1 dsCount=0 obj=0x12d3f1f0 self=0x9b8e8800
2021-01-07 11:20:22.651 9861-9861/com.m3s.skylark A/art: art/runtime/runtime.cc:419]   | sysTid=9885 nice=0 cgrp=default sched=0/0 handle=0xa4ecc920
2021-01-07 11:20:22.651 9861-9861/com.m3s.skylark A/art: art/runtime/runtime.cc:419]   | state=S schedstat=( 0 0 0 ) utm=0 stm=0 core=4 HZ=100
2021-01-07 11:20:22.651 9861-9861/com.m3s.skylark A/art: art/runtime/runtime.cc:419]   | stack=0xa4dd0000-0xa4dd2000 stackSize=1014KB
2021-01-07 11:20:22.651 9861-9861/com.m3s.skylark A/art: art/runtime/runtime.cc:419]   | held mutexes=
2021-01-07 11:20:22.651 9861-9861/com.m3s.skylark A/art: art/runtime/runtime.cc:419]   native: #00 pc 00049544  /system/lib/libc.so (__ioctl+8)
2021-01-07 11:20:22.651 9861-9861/com.m3s.skylark A/art: art/runtime/runtime.cc:419]   native: #01 pc 0001b32f  /system/lib/libc.so (ioctl+38)
2021-01-07 11:20:22.651 9861-9861/com.m3s.skylark A/art: art/runtime/runtime.cc:419]   native: #02 pc 0003ce89  /system/lib/libbinder.so (_ZN7android14IPCThreadState14talkWithDriverEb+168)
2021-01-07 11:20:22.651 9861-9861/com.m3s.skylark A/art: art/runtime/runtime.cc:419]   native: #03 pc 0003cf85  /system/lib/libbinder.so (_ZN7android14IPCThreadState20getAndExecuteCommandEv+8)
2021-01-07 11:20:22.651 9861-9861/com.m3s.skylark A/art: art/runtime/runtime.cc:419]   native: #04 pc 0003d50b  /system/lib/libbinder.so (_ZN7android14IPCThreadState14joinThreadPoolEb+46)
2021-01-07 11:20:22.651 9861-9861/com.m3s.skylark A/art: art/runtime/runtime.cc:419]   native: #05 pc 0004f935  /system/lib/libbinder.so (???)
2021-01-07 11:20:22.652 9861-9861/com.m3s.skylark A/art: art/runtime/runtime.cc:419]   native: #06 pc 0000e369  /system/lib/libutils.so (_ZN7android6Thread11_threadLoopEPv+144)
2021-01-07 11:20:22.652 9861-9861/com.m3s.skylark A/art: art/runtime/runtime.cc:419]   native: #07 pc 0006a4b5  /system/lib/libandroid_runtime.so (_ZN7android14AndroidRuntime15javaThreadShellEPv+80)
2021-01-07 11:20:22.652 9861-9861/com.m3s.skylark A/art: art/runtime/runtime.cc:419]   native: #08 pc 00047f83  /system/lib/libc.so (_ZL15__pthread_startPv+22)
2021-01-07 11:20:22.652 9861-9861/com.m3s.skylark A/art: art/runtime/runtime.cc:419]   native: #09 pc 0001a151  /system/lib/libc.so (__start_thread+6)
2021-01-07 11:20:22.652 9861-9861/com.m3s.skylark A/art: art/runtime/runtime.cc:419]   (no managed stack frames)
2021-01-07 11:20:22.652 9861-9861/com.m3s.skylark A/art: art/runtime/runtime.cc:419] 
2021-01-07 11:20:22.652 9861-9861/com.m3s.skylark A/art: art/runtime/runtime.cc:419] "Binder:9861_4" prio=5 tid=14 Native
2021-01-07 11:20:22.652 9861-9861/com.m3s.skylark A/art: art/runtime/runtime.cc:419]   | group="" sCount=1 dsCount=0 obj=0x12d3f280 self=0x9b634600
2021-01-07 11:20:22.652 9861-9861/com.m3s.skylark A/art: art/runtime/runtime.cc:419]   | sysTid=9886 nice=0 cgrp=default sched=0/0 handle=0x9b5ff920
2021-01-07 11:20:22.652 9861-9861/com.m3s.skylark A/art: art/runtime/runtime.cc:419]   | state=S schedstat=( 0 0 0 ) utm=0 stm=0 core=6 HZ=100
2021-01-07 11:20:22.652 9861-9861/com.m3s.skylark A/art: art/runtime/runtime.cc:419]   | stack=0x9b503000-0x9b505000 stackSize=1014KB
2021-01-07 11:20:22.652 9861-9861/com.m3s.skylark A/art: art/runtime/runtime.cc:419]   | held mutexes=
2021-01-07 11:20:22.652 9861-9861/com.m3s.skylark A/art: art/runtime/runtime.cc:419]   native: #00 pc 00049544  /system/lib/libc.so (__ioctl+8)
2021-01-07 11:20:22.652 9861-9861/com.m3s.skylark A/art: art/runtime/runtime.cc:419]   native: #01 pc 0001b32f  /system/lib/libc.so (ioctl+38)
2021-01-07 11:20:22.652 9861-9861/com.m3s.skylark A/art: art/runtime/runtime.cc:419]   native: #02 pc 0003ce89  /system/lib/libbinder.so (_ZN7android14IPCThreadState14talkWithDriverEb+168)
2021-01-07 11:20:22.652 9861-9861/com.m3s.skylark A/art: art/runtime/runtime.cc:419]   native: #03 pc 0003cf85  /system/lib/libbinder.so (_ZN7android14IPCThreadState20getAndExecuteCommandEv+8)
2021-01-07 11:20:22.652 9861-9861/com.m3s.skylark A/art: art/runtime/runtime.cc:419]   native: #04 pc 0003d50b  /system/lib/libbinder.so (_ZN7android14IPCThreadState14joinThreadPoolEb+46)
2021-01-07 11:20:22.652 9861-9861/com.m3s.skylark A/art: art/runtime/runtime.cc:419]   native: #05 pc 0004f935  /system/lib/libbinder.so (???)
2021-01-07 11:20:22.652 9861-9861/com.m3s.skylark A/art: art/runtime/runtime.cc:419]   native: #06 pc 0000e369  /system/lib/libutils.so (_ZN7android6Thread11_threadLoopEPv+144)
2021-01-07 11:20:22.652 9861-9861/com.m3s.skylark A/art: art/runtime/runtime.cc:419]   native: #07 pc 0006a4b5  /system/lib/libandroid_runtime.so (_ZN7android14AndroidRuntime15javaThreadShellEPv+80)
2021-01-07 11:20:22.652 9861-9861/com.m3s.skylark A/art: art/runtime/runtime.cc:419]   native: #08 pc 00047f83  /system/lib/libc.so (_ZL15__pthread_startPv+22)
2021-01-07 11:20:22.652 9861-9861/com.m3s.skylark A/art: art/runtime/runtime.cc:419]   native: #09 pc 0001a151  /system/lib/libc.so (__start_thread+6)
2021-01-07 11:20:22.652 9861-9861/com.m3s.skylark A/art: art/runtime/runtime.cc:419]   (no managed stack frames)
2021-01-07 11:20:22.652 9861-9861/com.m3s.skylark A/art: art/runtime/runtime.cc:419] 
2021-01-07 11:20:22.652 9861-9861/com.m3s.skylark A/art: art/runtime/runtime.cc:419] 
2021-01-07 11:20:22.653 9861-9861/com.m3s.skylark A/libc: Fatal signal 6 (SIGABRT), code -6 in tid 9861 (com.m3s.skylark)

 

 

[Android Studio ] / [안드로이드 스튜디오] 

 Package, Project, Module 이름 바꾸기

 

목표 : 프로젝트 Rename 하는 방법을 알아보자.

안드로이드 스튜디오로 처음 독학하기 시작할 때 샘플 프로젝트를 만들어 진행했다. 

File - New Project 하면 기본적으로 아래와 같이 나타난다.

Name, Package name 이 나오고 workspace 경로가 나온다.

샘플 프로젝트로 시작을 했으나 온갖 기능을 덕지덕지 바르고 하니까 이때 정했던 이름을 지금까지도 사용하고 있다. (...)

정식 배포를 앞두고 있는 지금 패키지 네임과 모듈 네임까지 전부 Rename 하려고 한다.

 

 

<1. Package Rename>

너무나 간단.. 패키지 네임에서 마우스 오른쪽 버튼 - Refactor 혹은 단축키 (Shift + F6)을 하면 다음과 같은 경고창이 뜬다.

노빠꾸로 그냥 Rename 하고 Do Refactor 한다.

 

이게 원래는 아래 AndroidManifest.xml부터 차근차근 수정해줘야 하지만.. 위와 같은 방법을 이용한다면 그냥 싹 바뀐다.

 

<2. Project Name>

My Application 으로 설정되어있을 Project name을 바꿔보자..

Android Studio를 닫고 Workspace 경로를 찾아 들어간다. Project로 보면 보통 스튜디오에 표시되어 있다.

단순히 해당경로의 폴더명을 바꾼 다음에 재실행하면 된다.

 

<3. Module Name>

모듈 네임 바꾸는게 은근히 까다롭더라.. 여러 가지 방법이 있다. 참고자료에 올린 주소로 들어가 보면 볼 수 있다.

귀찮은 방법 싹 치우고 정말 깔끔한 방법을 찾았다.

Shift 2번 눌러서 settings.gradle 파일을 찾는다.

rootProject.name을 고치고 Sync Now 버튼을 클릭한다.

그러면 싹 다 바뀐다.

 

<참고자료>

stackoverflow.com/questions/38886417/rename-root-module-in-android-studio

 

Rename root module in android studio

How to rename root module in android studio? I have tried (right click the module then click refactor then click rename) but I got warning "can't rename root module"

stackoverflow.com

stackoverflow.com/questions/18276872/change-project-name-on-android-studio/27101316

 

Change project name on Android Studio

I want to change the name of my project and module. But if I try to rename them Android Studio notify me some errors... e.g. I want to change the name from "MyApplication" to "AndroidApp" as shown ...

stackoverflow.com

 

[Android / Java]

TextWatcher를 통한 EditText의 입력 변화 이벤트

 

* 목표 : TextWatcher를 통해 EditText의 입력 변화 이벤트를 발생시키자.

 

Android에서 입력 변화 이벤트를 사용하는 경우는 매우 많다. Max Length를 정해 그 이상 입력을 못하게 할 수도 있고 금액을 표시할 때 컴마를 붙이게 할 수도 있다. 

이벤트를 언제 적용할 것인가에 따라 다양하게 나타낼 수 있을 텐데 이번에는 입력과 동시에 이벤트가 발생하는 TextWatcher interface를 이용해 보도록 한다.

package android.text;

/**
 * When an object of this type is attached to an Editable, its methods will
 * be called when the text is changed.
 */
public interface TextWatcher extends NoCopySpan {
    /**
     * This method is called to notify you that, within <code>s</code>,
     * the <code>count</code> characters beginning at <code>start</code>
     * are about to be replaced by new text with length <code>after</code>.
     * It is an error to attempt to make changes to <code>s</code> from
     * this callback.
     */
    public void beforeTextChanged(CharSequence s, int start,
                                  int count, int after);
    /**
     * This method is called to notify you that, within <code>s</code>,
     * the <code>count</code> characters beginning at <code>start</code>
     * have just replaced old text that had length <code>before</code>.
     * It is an error to attempt to make changes to <code>s</code> from
     * this callback.
     */
    public void onTextChanged(CharSequence s, int start, int before, int count);

    /**
     * This method is called to notify you that, somewhere within
     * <code>s</code>, the text has been changed.
     * It is legitimate to make further changes to <code>s</code> from
     * this callback, but be careful not to get yourself into an infinite
     * loop, because any changes you make will cause this method to be
     * called again recursively.
     * (You are not told where the change took place because other
     * afterTextChanged() methods may already have made other changes
     * and invalidated the offsets.  But if you need to know here,
     * you can use {@link Spannable#setSpan} in {@link #onTextChanged}
     * to mark your place and then look up from here where the span
     * ended up.
     */
    public void afterTextChanged(Editable s);
}

TextWatcher는 세 가지 메서드를 Implementation 한다. 텍스트 체인지가 발생하기 전 (beforeTextChanged), 발생 할 때(onTextChanged), 그리고 발생한 후(afterTextChanged). 개발자는 원하는 곳에 이벤트를 발생시킬 수 있다.

전에 만든 컴마 넣기를 이용한 예시는 다음과 같다.. (minggu92.tistory.com/14)

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_main);
        EditText TotalAmountEt = findViewById(R.id.etTotalAmount);
      	TotalAmountEt.addTextChangedListener(new TextWatcher() {
            @Override
            public void beforeTextChanged(CharSequence s, int start, int count, int after) {

            }

            @Override
            public void onTextChanged(CharSequence s, int start, int before, int count) {

            }

            @Override
            public void afterTextChanged(Editable s) {
				 TotalAmountEt.setText(makeStringComma(s.toString())); //컴마붙이기
            }
        });
  }

  protected String makeStringComma(String inputStr) {    // 천단위 콤마 처리
      if (TextUtils.isEmpty(inputStr))
      return inputStr;

      String str = inputStr.replace(",",""); //기존 컴마 제거
      BigDecimal bigDecimal = new BigDecimal(str);
      DecimalFormat format = new DecimalFormat("###,###"); //포맷팅

      String returnStr = format.format(bigDecimal);
      return returnStr; //리턴
  }

다음 시간에는 이 것들을 이용해 큰 금액의 자동 합산 로직을 만들어보겠다.

 

[Java] / [자바]

숫자 천 단위에 컴마(,) 표시하기

 

* 목표 : DecimalFormat을 이용해 숫자에 컴마(,) 표시를 해보자.

 

금액과 같이 큰 숫자를 표시할 때 숫자에 컴마가 들어가게 하는 방법은 여러 가지가 있다.

그 대표적인 방법이 바로 Format을 이용하는 방법인데 다음과 같은 함수를 만들어 사용하면 간편하다.

    private String makeStringComma(String inputStr) {    // 천단위 콤마 처리
        if (TextUtils.isEmpty(inputStr))
            return inputStr;

        String str = inputStr.replace(",",""); //기존 컴마 제거
        BigDecimal bigDecimal = new BigDecimal(str);
        DecimalFormat format = new DecimalFormat("###,###"); //포맷팅

        String returnStr = format.format(bigDecimal);
        return returnStr; //리턴
    }

먼저 inputString의 value가 null, length==0 등 일 때를 확인하기 위해 TextUtils.isEmpty(String) 메서드를 사용한다. 해당 함수로 null과 length 체크를 한 뒤에 boolean 값을 리턴한다.

그 뒤 기존 컴마를 제거하기 위해 String의 replace 함수를 이용해 타깃인 컴마를 공백으로 바꿔준다. 

BigDecimal은 Double과 같이 큰 숫자를 십진법으로 나타낼 때 많이 쓰인다.

BigDecimal?

  • BigDecimal Java 언어에서 숫자를 정밀하게 저장하고 표현할 수 있는 유일한 방법이다.
  • 소수점을 저장할 수 있는 가장 크기가 큰 타입인 double은 소수점의 정밀도에 있어 한계가 있어 값이 유실될 수 있다.
  • Java 언어에서 돈과 소수점을 다룬다면 BigDecimal은 선택이 아니라 필수이다.
  • BigDecimal의 유일한 단점은 느린 속도와 기본 타입보다 조금 불편한 사용법 뿐이다. 
                 

(출처 : jsonobject.tistory.com/466)

다음 DecimalFormat을 이용해 숫자를 내가 지정한 포맷인 "###,###" 로 적용한다.

그리고 해당 포맷을 적용한 String 값을 리턴한다.

 

 

 

[Android / Java]

앱에 필요한 정보를 저장하는 SharedPreferences 

 

* 목표 : SharedPreferences의 개념, 사용방법, 주의사항에 대해 알아보자.

 

우리가 앱이나 웹에서 체크박스를 이용해 ID, Password를 저장하는 것을 많이 봤을 것이다.

바로 이런식으로 말이다. 흰 네모칸의 체크박스를 클릭하면 내가 입력한 계정 정보가 저장되는 식이다. 근데 어떠한 원리로 저장이 되는 걸까?

먼저 로그인 단 화면을 열 때 서버와 통신해서 세팅하는 방법이 있다. 그 편이 사실 안전하긴 하지만 일단 네트워크 연결 상태여야 하고 수많은 유저의 정보를 저장해두기엔 용량 문제도 있다. 그래서 우리는 이 로그인 정보를 저장하기 위해 SharedPreferences를 이용해 보기로 한다.

기본적으로 애플리케이션은 하나의 프로그램이다. 이 프로그램이 종료되면 저장하지 않은 정보들은 사라진다. 이 프로그램 안에 파일을 만들어 저장하는 방식이 바로 SharedPreferences이다.

기본적으로 SharedPreferences를 사용하면 다음 경로의 앱 내부저장소에 파일 형태가 생성된다.

data/data/[package_name]/shared_prefs/[SharedPreferences의 파일 이름]

자 바로 실습을 진행해보자.

    /**
     * 현재 로그인 정보를 저장하기 
     */
    public void setLoginInfo(){
        SharedPreferences sfLogin = getSharedPreferences("SF_LOGIN", MODE_PRIVATE);
        SharedPreferences.Editor editor = sfLogin.edit();
        editor.putBoolean("CHK_LOGIN", true);
        editor.putString("ID", id);
        editor.apply();
    }

"SF_LOGIN"을 Key로 하는 SharedPreferences 클래스를 MODE_PRIVATE으로 호출한 후에 Editor를 열어 수정 모드로 들어간 뒤, "CHK_LOGIN"이라는 Key값의 boolean 타입 데이터를 true로 저장해줬다. "ID"를 키값으로 하는 String 타입의 데이터도 저장했고 마지막에 apply()를 통해 적용시켜준다. (commit()은 deprecated 된 듯)

 

    /**
     * 저장되어있는 로그인 정보 가져오기
     */
    private void getLoginInfo(){
    	IdEt = findViewById(R.id.login_id); //Id EditText
        chkLogin = findViewById(R.id.chk_login_save); //로그인 CheckBox
        
        SharedPreferences sfLogin = getSharedPreferences("SF_LOGIN", MODE_PRIVATE);
        boolean isLoginChecked = sfLogin.getBoolean("CHK_LOGIN", false); //로그인 체크박스의 상태, default : false
        chkLogin.setChecked(isLoginChecked); //로그인 체크박스 세팅
        IdEt.setText(sfLogin.getString("ID", "")); //Id EditText에 ID값 불러오기
    }

SharedPreferences 클래스를 선언하고 getSharedPreferences("파일 이름", 모드) 메서드를 이용해 기존에 등록되어 있는 정보를 가져오도록 했다. String, boolean, long, float, int 등 지정한 타입의 데이터를 키값으로 가져온다. "CHK_LOGIN"이라는 Key값을 가지고 지정한 boolean 값을 가져오는 것이다. default를 기본적으로 세팅해야 한다. Null 처리를 하기 위해서로 보인다.

기본적으로 SharedPreferences 파일은 map형태의 xml형식으로 저장되어있다.

<?xml version='1.0' encoding='utf-8' standalone='yes' ?>
<map>
    <string name="ID">userName</string>
    <boolean name="FIRST" value="true" />
    <boolean name="CHK_LOGIN" value="true" />
</map>

체크박스의 상태를 저장하여 갖고 오고 체크되어있다면 ID 값을 String 타입으로 저장한다. 또 앱의 최초 실행인지 판단하기 위해 FIRST라는 boolean 값도 만들어 뒀다. 

이런 방법으로 체크한 로그인 정보를 저장하고 로드할 수 있다. 그러나 내부저장소에 저장되는 파일인 만큼 보안에 취약한 단점이 있으므로 절대 Password도 같이 저장하면 안 된다. base64 방식을 이용한다 하더라도 복호화할 수 있는 상태로 저장되면 누구나 해킹할 수 있다. 따라서 패스워드는 저장하지 않는 방법을 권고하고 혹여나 하더라도 jasypt 같은 암호화 라이브러리를 이용해 암호화되어있는 상태로 저장할 수 있도록 한다.

 

+ Recent posts