출처 -  http://sailerya.tistory.com/entry/APK-signature-%ED%95%B4%EC%A0%9C%EB%93%B1%EB%A1%9D 

Apk를 가지고 테스트를 할 때 가장 문제가 되는 것이 install인 안되는 경우이다.

그중 제일 빈번하게 나타나는 현상이 signature 문제이다

 

해당 apk의 signature가 맞지 않는다며, 인스톨이 되더라도 실행이 안된다.

제 3자 테스트를 할경우 소스를 받기는 어렵고(주지도 않는다) 그걸 가지고 개발환경을 일일이 셋팅하여 빌드하기도 싫다.!!

 

그럼 이 문제를 어떻게 극복할 것인가~!!??

 

문제: signature를 풀어서 내 key를 넣고 싶어요~!!

 주의 : 분순한 목적으로 키를 해제하는것은 건강에 좋지 않을수 있습니다 ~!!! ^^;

  1. 자바의 bin 폴더를 path에 넣어준다.
  2. APK도 하나의 압축 형식이므로 jar xf your_apk_name.apk 를 명령어를 이용하여 풀어준다

     

  3. META-INF\CERT.* 파일을 지운다 (여기에 key 정보가 들어간다)

     

  4. 다시 apk로 패키징 한다

    jar cf your_apk_name2.apk .

    b.apk가 생겼다.

     

  5. 이제 unsigned apk를 얻었으니 여기에 key를 입히면 된다.

    Key는 자기가 생성한 키를 사용해도 되고 일반적으로 debugkey를 사용해도 된다.

    Debugkey는 %USERPROFILE%\.android\ 폴더에 있을것이다. 찾아보시고~~

     

     

     

    이제 키를 입혀보자

    명령어는 다음과 같다

     

    jarsigner -keystore c:\debug.keystore -storepass android -keypass android tempapk androiddebugkey

     

    jarsigner 명령어 연구는 한번 쳐보면 나오니 확인 하시고..

     

    최종적으로 Zipalign을 해주면 끝난다.

    Zipalign은 android tool이니 안드로이드 tool 폴더를 path에 넣어주어야 한다.

     

    그럼 마지막으로 zipalign 4 yourapk1 yourapk2 하면 끝

     

     

     

     

    이과정을 일일이 치기 귀찮으니 bat로 만들었으니 참고하면 되겠다.

     

     

@echo off

:start

if %1 =="" goto err

if %2 =="" goto err

 

:resign

 

jar xf %1

del META-INF\CERT.*

del/q %1

jar cf tempapk -t .

jarsigner -keystore c:\debug.keystore -storepass android -keypass android tempapk androiddebugkey

zipalign 4 tempapk %2

del/q tempapk

goto end

 

:err

echo need arguments [signed apk name] [resigned apk name]

 

:end

Posted by 라판

안드로이드 소스를 다시 빌드할 때를 위한 캐쉬툴이란다. 

아직 테스트는 안 해봤지만, 공식 홈에 있는 거니 작동하겠지 ???

출처 :  http://source.android.com/source/initializing.html#ccache 

Setting up ccache

You can optionally tell the build to use the ccache compilation tool. Ccache acts as a compiler cache that can be used to speed-up rebuilds. This works very well if you do "make clean" often, or if you frequently switch between different build products.

Put the following in your .bashrc or equivalent.

export USE_CCACHE=1

By default the cache will be stored in ~/.ccache. If your home directory is on NFS or some other non-local filesystem, you will want to specify the directory in your .bashrc as well.

export CCACHE_DIR=<path-to-your-cache-directory>

The suggested cache size is 50-100GB. You will need to run the following command once you have downloaded the source code.

prebuilt/linux-x86/ccache/ccache -M 50G

This setting is stored in the CCACHE_DIR and is persistent.

Posted by 라판
TAG ccache

이클립스를 새로 설치 후, 최신 ADT v14를 설치 후, 빌드 시도 시,
지속적으로 ERROR가 뜬다. 이는 아래 설명대로, ADT 버전과 SDK 버전이
맞지 않아 호환성에 문제가 생기는 것이다. 

아래를 참고하여 SDK를 업데이트하면 문제가 해결된다. 

 출처 : 
http://mtmurdockapps.wordpress.com/tag/unknown-command-crunch/  

Trouble with Android ADT v14

I’m sure that some of you who have updated to the latest version of the Android development tools have found a rather annoying problem. I, like them, found that when I created a new project, I could not launch it on an emulator or a real device. If this is you, you’ve probably seen an extensive error message in the output window starting with the message: ERROR: Unknown command ‘crunch’.

While Googling the problem I found many answers ranging from problems with svn, build settings, and resource folders. However, none of these prevailed me much, but I finally found a solution.

Apparently when I downloaded the 4.0 SDK, I did not update some of the other packages. So to fix this problem, open your Android Package Manager and check for updates. You will need to update “Android SDK Platform-tools” (under Tools) and “Android Compatibility package” (under Extras).

You may need other packages, so download anything that says “update available” next to it.

I hope that this will do you as much as it did for me!


Posted by 라판
TAG crunch, error
코믹뷰어가 user 빌드에서 동작이 정상적이지 않길래 찾아봤더니, 결국 프로가드 때문이었다.
프로가드가 완벽히 파싱하지 않아 일부 메소드가 날라가게 되는 것.
이를 위해 특정 메소드는 난독화하지 않도록 지정해주어야 한다.

아래 링크 참고

http://shadowxx.egloos.com/10763147 
Posted by 라판

"안드로이드의 모든 것 분석과 포팅"이라는 책을 읽다가 도무지 이해되지 않는 코드.

 system/core/init/init.c에서 보면 
int main(int argc, char **argv) 
{
   ... ..
    if (!strcmp(basename(argv[0]), "ueventd"))

         return ueventd_main(argc, argv);
}

 여기서 argv[0]과 ueventd를 비교하는 데, 위 파일은 init의 소스 파일이며 argv[0]은 당연히
"/init"이 된다. basename은 경로명은 다 지우고 실제 파일 이름을 가져오는 함수로서 strcmp는 결국 "init"과 "ueventd"를 비교하여 0이 아닌 값을 돌려주게 되고 if문은 조건을 만족하지 못하여 ueventd_main은 실행하지 못하게 되는 것이다.

그런데 책에서는 위의 부분에서 ueventd_main이 실행된다고 하는 데, 어떻게 된 일일까?

해답은 argv[0]이 당연히 "/init"일 것이라는 것이 틀렸다는 사실. argv[0]은 대개 실행된 파일의 이름을 담고 있는 데, 리눅스에서는 실제 실행된 파일과 실행이름이 다를 수 있으니 이는 심볼릭 링크이다. 심볼릭 링크로 파일이 실행될 경우, argv[0]에는 심볼릭 링크의 이름이 들어가게 되는 것. 심볼릭 링크에 대한 자세한 설명은 아래 주소를 참고. 

심볼릭 링크 설명 : http://sunnmoon.egloos.com/1858692
 
즉 ueventd라는 이름의 심볼릭 링크가 있으며 해당 링크는 init과 연결되어 있는 것이다.

ueventd라는 이름의 심볼릭 링크는 그럼 어떻게 실행되는 것일까?
간단히 말하면 init이 실행되면서 init.rc를 분석하여 실행하는데, init.rc 초반에 "start uventd"라는 문구가 있어 ueventd를 실행하게 되는 것이었다!  
코드만 보면 도저히 못 찾을 뻔 했는데, 다행히 나와 비슷한 의문을 가진 사람들이 있어 
해답을 찾아서 다행이다. 

자세한 설명은 아래 링크를 참고 

ueventd 호출 매커니즘 : http://www.aesop.or.kr/?document_srl=451193&mid=Book_QnA

 

 

'안드로이드 > 안드로이드 커널' 카테고리의 다른 글

init이 ueventd를 호출하는 매커니즘  (0) 2011.09.01
Posted by 라판