apk






Generate Signed APK 수행시 또 이상한 에러가 발생





생전 처음보는 에러가 코드가 아닌 xml 파일에서 발생하였다.

 Error:(449) Error: Found byte-order-mark in the middle of a file [ByteOrderMark]




에러부분으로 이동해보니



<item>Leadership</item>


?? 이게 전부다. 이상한 점이 전혀 없다.




또 원인을 찾아 정보의 바다 구글을 헤맸다.


찾아보니 ByteOrderMark = BOM 이란 자식이 포함되어있기 때문이란다.


그래서 이 BOM 이란 놈을 제거 해줘야 한다는데


구글에 나온 BOM 제거 방법을 해봐도 되지 않는다.


툴 깔아서 BOM 제거를 해도 똑같다.



참나 대체 왜 내가 하면 안되는거지



대체 뭐가 문제냐고!!!


자포자기로 저 부분을 한번 지우고 손수 하나하나 똑같이 다시 타이핑을 했다.


그리고 다시 빌드..



?!!!?!



뭐지 에러가 사라졌다.


정상적으로 apk가 생성되었다.


뭐 이따구가 다있지...



깃허브 커밋을 살펴 보았다.




?????


뭐가 다른거지???



어이가 털린다.




그래서 다시 에러가 난 상태로 돌려놓은뒤


 위 프로젝트를 다른 컴퓨터에서 import 해서 살펴보기로 했다.


검색하다보니 다른 컴퓨터에서는 되었다는 글을 보았기 때문이다.




그래서 import 후 똑같이 Generate Apk Signed를 실행했더니


똑같은 곳에서 똑같은 에러가 발생


그런데 이상한 점이 발견되었다.






보이는가 저 이상한 점들..


Leadership 앞에 점 하나가 있다.


다른 에러부분에도 보니 뒤에 점 2개가 있다.



저게 문제였나보다.


저걸 지워주니 에러가 사라졌다.



저게 BOM이라는 그 악성 에러였던걸까




추측으로는.. 점을 지움으로써 BOM이 사라진 것 같다.


에러가 계속 났었던건 눈에 보이지 않으니


<item>Leadership·</item>


이걸 계속 복붙하고 있었다. 그러니 보이지 않는 BOM인가 뭔가 저 점이 계속 복붙되고 있었던 것이다


그리고 구글 검색했을 때도 메모장에 붙여넣기 한 후 저장해서 다시 붙여넣으라는 방법도 있었는데 

같은 이유로 에러가 사라지지 않았던 것 같다.



그래서 직접 지우고 타이핑할 때 BOM이 지워진 것 같다.



그런데 왜!!


내 컴퓨터에서는 표시되지 않고 다른 컴퓨터에서는 표시가 된 걸까??


정말 짜증나는 코딩의 세계다



BOM에 대한 에러를 찾아보면 글이 상당히 많고 이게 뭔지도 다 나와있으니 더 이상 언급하기도 싫다.


내 시간을 통째로 빼앗아 가버렸으니..



혹시 이런 문제를 겪고 계신 분이 있으시다면 에러난 부분을 지우고 다시 타이핑해보시길 추천한다.


그래도 안되면 검색에서 나오는 해결법을 시도해보시는게 좋을 것 같다.





  1. 2017.09.18 17:20

    비밀댓글입니다






뜬금 apk 빌드하는데 이런 에러가 떴다.


Error:Execution failed for task ':app:transformClassesWithDexForDebug'.
> com.android.build.api.transform.TransformException: com.android.ide.common.process.ProcessException: java.util.concurrent.ExecutionException: com.android.dex.DexException: Multiple dex files define Landroid/support/v4/accessibilityservice/AccessibilityServiceInfoCompat$AccessibilityServiceInfoVersionImpl;



검색해보니 메소드 6만5천줄 초과인가 뭔가해서 멀티덱스 를 추가해줘야되고 이런 답변들이 있었는데 해봐도 되지 않았다


그러다가 라이브러리?가 중복실행되는 케이스도 있따고 하여 그래들 파일에 라이브러리 코드랑 관련이 있어보이는걸 삭제했다.


디펜던시에


dependencies {

compile fileTree(include: ['*.jar'], dir: 'libs') //요놈을 지웠다

androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
exclude group: 'com.android.support', module: 'support-annotations'
})
compile 'com.android.support:appcompat-v7:25.3.1'
compile 'com.android.support.constraint:constraint-layout:1.0.2'
compile 'gun0912.ted:tedpermission:1.0.2'
testCompile 'junit:junit:4.12'
}



그랬더니 에러가 발생하지 않았다..




서명된 apk를 생성하고 기존 마켓버전에서 업데이트 되나 설치해보는데 자꾸 설치가 실패했다.


versionCode, versionName 모두 +1씩 해주었는데도 말이다.


알고보니 안드로이드 스튜디오는 AndroidManifest.xml 에서 버전코드와 네임을 관리하는게 아니었다..



기존 이클립스에서 AndroidManifest.xml 을 살펴보면



이렇게 되어있는데 안드로이드 스튜디오는 build.gradle 에서 변경해주어야 한다.


들어가보니 프로젝트를 처음 생성해서 versionCode 와 versionName이 모두 1로 되어있었다.




그래서 AndroidManifest.xml 에 있는 버전보다 +1 변경해주었다




그리고 다시 apk를 생성하고 업데이트 설치를 해보니 정상적으로 되었다!









사전환경셋팅이 되어있어야 한다.

java 와 Android sdk가 설치되어 있어야 하고 환경변수도 설정되어 있어야한다.



http://recorder.robotium.com/downloads/re-sign.jar



re-sign.jar



위 링크에서 re-sign.jar 파일을 받아서 실행한다.


그럼 아래와 같은 창이 뜨고 여기다 재서명할 apk를 끌어다 놓으면 된다.






이런 창이 뜬다면 zipalign 파일이 없다는 것이므로 해당파일을 ~~sdk/tools 폴더에 붙여넣어준다.




zipalign 파일은 sdk 가 설치된 폴더에 보면 build-tools 라는 폴더가 있는데 

들어가서 아무 폴더에서 쉽게 찾아볼 수 있다.



zipalign.exe



재서명이 끝나면 아마 apk 명 끝에 -debug라고 붙은 apk가 생성되었을 것이다.

(또는 직접 정해준 파일명으로)


이 apk 를 사용하면 끝이다.


이렇게 간단한 방법이 있었다니..









이 방법을 시도해보기 전에 더 간단한 방법이 있으므로 시도해보길 추천함

안드로이드 apk 쉽게 재서명 resign 하기

http://yonoo88.tistory.com/808




이미 릴리즈 된 안드로이드 apk 를 내 개인 서명키로 바꾸는 방법

여기서는 이미 있는 debug.keystore 파일을 이용하여 해보았다.


우선 재서명할 apk를 준비한다.


압축프로그램이 있다면 우클릭을 하고 압축을 푼다. (ex. astro apk)





압축을 풀고 나서 해당 폴더에 들어가면 파일이 많이 있는데 여기서 



META-INF 폴더를 삭제한다. 이 폴더에 서명관련한 파일들이 있기 때문이다.



삭제한 다음 다시 이 폴더를 압축하는데 꼭 폴더 내부로 들어가서 모든파일 선택 후 압축을 해야한다.!





그럼 압축파일이 생기는데 보기 편한 곳으로 이동시켜놓고




확장자를 ,apk로 바꿔준다.



그럼 위처럼 apk 로 변경된다 (기존 apk와 이름이 같아 resign으로 변경해주었다)


혹시 뒤에 확장자가 안보이면 폴더옵션에서

알려진 파일 형식의 파일 확장명 숨기기를 체크 해제 해준다.







그럼 cmd 창을 연다.


해당 폴더가 있는 경로로 진입한다. 여기서는 d:\astro 이다


그리고 서명할 키가 있어야 하는데 여기서는 debug.keystore를 이용하겠다.


이 키스토어는 C:\Users\Administrator\.android 폴더에 위치하고 있다.





그럼 이제 서명을 해줘야 하는데 명령어는 다음과 같다.


출처

http://developer.android.com/tools/publishing/app-signing.html


$ jarsigner -verbose -sigalg SHA1withRSA -digestalg SHA1
-keystore my-release-key.keystore my_application.apk alias_name


jarsigner -verbose -sigalg SHA1withRSA -digestalg SHA1 -keystore [키스토어경로] [서명할apk경로] [키스토어별명]


여기서 jarsigner 경로가 환경변수에 등록되어 있어야한다.


하지만 자바를 처음 설치할 때 


%JAVA_HOME%\jdk\bin


이런 식으로 환경변수를 등록해주므로 아마 이미 되었을 것이다.


기본 경로는 다음과 같다(64비트)


C:\Program Files\Java\jdk1.8.0_05\bin




이렇게 해주면 된다.


기본적으로 debug.keystore 는 다음과 같은 정보를 가지고 있다


  • 키스토어 이름 : "debug.keystore"
  • 키스토어 비밀번호 : "android"
  • 키 별명 : "androiddebugkey"
  • 키 비밀번호 : "android"
  • CN: "CN=Android Debug,0=Android,C=US"

  • 키스토어 별명은 확인은


    keytool -list -v -keystore [키스토어경로] 


    로 확인할 수 있다.






    그럼 다음과 같이 입력 후 


    jarsigner -verbose -sigalg SHA1withRSA -digestalg SHA1 -keystore c:\.android\debug.keystore com.metago.resign.apk androiddebugkey


    실행하면 암호를 치라고 나오는데 android 라고 써준다.




    그럼 뭐가 좌르륵 나오면서 끝에 jar signed 라고 뜰 것이다.



    이제 서명은 되었고 apk를 다시 재정렬?시켜줘야 한다.


    그러기 위해서는 


    zipalign -v 4 your_project_name-unaligned.apk your_project_name.apk

    zipalign -v 4 [서명한apk] [apk 새이름]


    위 명령어를 실행해 줘야 하는데 zipalign 경로가 환경변수 Path에 추가 되어 있어야 한다.



    Path 변수 값 예시C:\ProgramData\Oracle\Java\javapath;%SystemRoot%\system32;%SystemRoot%;%SystemRoot%\System32\Wbem;%SYSTEMROOT%\System32\WindowsPowerShell\v1.0\;%JAVA_HOME%\bin;D:\backup\eclipse\adt-bundle-windows-x86_64-20140702\sdk\platform-tools;%ANDROID_HOME%\tools;%ANDROID_HOME%\build-tools\android-4.4W 



    zipalign 은 sdk 폴더에 buiild-tools 에서 안드로이드 아무 버전이나 폴더에 들어가면 있다.


    ex ) C:\adt-bundle-windows-x86_64-20140702\sdk\build-tools\android-4.4W




    그래서 


    zipalign -v 4 com.metago.astro.resign.apk astro.apk



    라고 실행해주면


    아까보다 더 많은 좌르륵이 나오면서 


    Verification succesful 





    이라고 뜰 것이다.



    해당 폴더에 가보면 apk 가 생성되어 있을 것이다.





    확인을 해보고 싶다면

    jarsigner -verify my_application.apk //간단히 서명확인할 때

    jarsigner -verify -verbose -certs my_application.apk //서명 외 다른 정보도 자세히 확인할 때


    다음과 같이 실행해준다.


    원본 apk 파일인 com.metago.astro.apk 의 서명 정보 확인


    jarsigner -verify -verbose -certs com.metago.astro.apk





    debug.keystore 로 재서명한 astro.apk


    jarsigner -verify -verbose -certs astro.apk




    재서명한 astro.apk를 보면 Android Debug로 바뀐게 보인다.


    그럼 재서명 완료!!



    + Recent posts

    티스토리 툴바