Android DB파일 저장 adb pull 'permission denied' 


Android에 저장된 내부 DB파일을 가져오는게 너무 번거로워 ADB명령어를 이용해

이동하는 방법을 공유해봅니다. 


1. 전제조건 : 해당 단말의 루팅이 필수 ( 내부 DB접근이라 당연하겠죠 ? )


2. ADB  명령어 순서


1. adb shell su

2. cd /data/data/{packageName}/databases/

3. cp /data/data/{packageName}/databases/{DB fileName}.db /data/local/tmp

4. chown shell.shell /data/local/tmp/{DB fileName}.db

5. exit

6. exit

7. adb pull /data/local/tmp/{DB fileName}.db {DB fileName}.db



* adb pull 명령어는 ADB shell내에서 사용이 불가능하고 Root권한 취득을 할 수가 없어 

임시디렉토리에 파일을 복사해서 옮기고, 퍼미션을 바꾸는 부분이 추가로 넣는게 키포인트! 

* adb shell 내에서 pull명령어 입력 시 error: device not found 가 발생.

그럼 도움이 됐길 바라요.


Android 이슈 - SMS 및 CALL_LOG 권한 사용에 적용되는 Google Play 정책 변경사항





알림 - 이 앱은 정책 변경의 영향을 받습니다.

이 앱은 SMS 및 CALL_LOG 권한 사용에 적용되는 Google Play 정책 변경사항의 영향을 받습니다. 정책을 준수하지 않는 앱은 2019년 1월 9일에 Google Play에서 삭제될 수 있습니다.



1. 원인

- 정책 변경으로 인해 permission의 사용이 제한됨. 


* 제한되는 permssion 




위의 Permission을 사용하는 앱을 경우 위와같은 에러 문구가 나타나게 됩니다.

추측컨대, 대다수의 분들이 CALL_PHONE, SEND_SMS Permission 으로 인해 

많이들 걸릴거라 생각이 됩니다 ㅎㅎ 


이번 패치의 핵심의 핵심을 정리하면, 

용도에 맞는 Permission 제한이 되겠네요. 


그래서 일반적인 앱의 경우 위의 퍼미션 사용을 할 수 가없고

앱기능 자체가 전화, 메시지 관련 앱인 경우에만 사용을 할 수있습니다. 


2. 해결방법

1) 구글에 문의하여 예외요청 

- 구글링해본결과 해외의 유명한 앱들도 거부당했다는 글들을 보아,

거의 불가능하다고 보여 집니다;;


2) 퍼미션 제거 및 대체  

- CALL_PHONE 대체 : 전화를 직접거는게 아닌 Dial 화면에 표시하도록 변경 , 이 경우 별도로 퍼미션이 필요하지 않음. 

Uri callUri = Uri.parse("tel:" + "전화번호(ex, 010-1111-1111)");
Intent intent = new Intent(Intent.ACTION_DIAL, callUri);
startActivity(intent);


- SEND_SMS 대체 : 위와 동일, 문자입력 화면에 Text만 전 후 발송은 사용자의 액션에 의해 발송되도록 변경

Uri smsUri = Uri.parse("smsto:" + "전화번호(ex, 010-1111-1111)");


Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setData(smsUri);

startActivity(intent);


상세내용은 : https://support.google.com/googleplay/android-developer/answer/9047303

> 일반용도의 대안 페이지 참조.


3. 요약

- 정책이 변경된 퍼미션 사용을 하고 있다면 전화, 메시지전용앱인 경우에만 사용이 가능하도록 바뀜

- 기존앱의 경우 해당 퍼미션 제거 후 재배포를 해야함 

https://support.google.com/googleplay/android-developer/answer/9047303  권한 요청 양식을 통해 

예외요청 및 기간 유예가 가능함(3월까지) 


해당 정책변경은 저도 처음 당해보는 일이라 일부 잘못된 정보가 있을 수 있습니다.

잘못된 부분이 있다면 댓글로 남겨주세요!


저처럼 헤매는 분들에게 도움이 되길바라요. (도움이 됐다면 아래 하트한번 눌러주세요 ㅎㅎ ) 

안드로이드 구글 앱서명 간략요약


참조 : https://developer.android.com/studio/publish/app-signing?hl=ko


설명이 길어서 복잡했는데, 

적용해보니 간단하네요.


1. 요약 

기존엔 인증서파일을 잃어버리게 되면 앱을 업데이트를 할 수 없는 크리티컬 이슈가 발생하여 

생긴 기능으로 보입니다. or 아이폰의 인증서 관리방법을 따라했거나 ㅎㅎ

핵심은 앱서명인증서와 업로드인증서의 분리가 되겠네요.


앱서명인증서 > 마켓에 실제로 등록할때 사용


업로드인증서 >  앱을 업로드할때 사용

*구글에 문의하여 재발급 가능 


앱서명인증서라는게 추가로 생겼고 

해당 인증서는 자동으로 생성되어, 

구글 클라우드에 저장되고 관리가 됩니다. ( 분실 및 관리의 부담이 줄어듬 )

이로인해, 서두에 설명한 인증서 분실로 인한 앱 업데이트 문제가 해결 됐습니다. 



2. 적용방법



실제로 적용할땐 기존방식과 달라지는 부분은 없습니다.

인증서 생성 > signing > 업로드


제가 헷갈렸던 부분이 업로드용 키를 어디서 만들어야 하나 싶었는데, 

그냥 기존 처럼 인증서를 만들어서 등록하면 해당 인증서가 업로드 키로 등록이 됩니다.

* 기존처럼 인증서는 계속 보관해서 써야하는건 같습니다.  (분실시에는 구글에 문의해서 재발급해야하니...)



3. 주의점

앱에서 인증서의 SHA1키값을 사용하는 경우 필히 배포용 인증서의 SHA1으로 바꿔주어야합니다. 

제가 사용 하는 프로젝트의 경우 구글맵 API의 사용이 제한됐네요. 


찾아보니 해당 각정 Open API 키 생성할때 SHA1값을 많이사용하여 해당 문제가 많이 발생하는것 같네요.

기존에 Open API 쓰시는 분이나 구글 API를 사용하시는 분들은 필히 확인하세요!


앱등록 페이지 좌측메뉴 > 앱서명 부분에 보면 서명인증서라는 항목 참조.



끝으로, 신규로 배포하는 앱이라면 무조건 구글앱 서명으로 앱을 올리세요.!!!

그럼 도움이 됐길 바라요.


안드로이드 스튜디오 3.2 업데이트 후 문제 발생(Duplicate key)



로그내용 : Duplicate key com.android.build.gradle.internal.api.artifact.BuildableArtifactImpl@7c139f68


원인 : productFlavors 이름이 Main 으로 설정 되어있어서 발생.(build.grale 파일)


해결 : Main으로 설정 된 이름 변경




해당 에러 내용.


  



main > orginal 로 변경 후 정상동작!! 


그럼 도움이 되길 바라요.