ㅈㅅㄹ

안드로이드 소스를 수정하고 나서 SDK를 릴리즈 해 줘야 하는데, 윈도를 쓰는 사람이 많아서 윈도용도 따로 빌드해서 릴리즈 해야 하는 형편이다. 원래는 무식하게 전부 cygwin에서 빌드하는 방법을 생각하고 있었는데 따로 빌드를 하는 방법이 있더라. 


Requirements

cygwin
리눅스(혹은 MacOS)에서 빌드한 SDK (zip)
위의 SDK를 빌드하는데 사용한 안드로이드 소스의 일부


Source Files

다른 시스템에서 빌드한 SDK를 이용한다면 모든 소스트리를 카피해 올 필요는 없다. 최소 세트에 대해선 따로 연구하지 않았지만,

  • build/*
  • dalvik/*
  • development/*
  • external/
    • expat/*
    • libpng/*
    • qemu/*
    • safe-iop/*
    • sonivox/*
    • sqlite/*
    • svox/*
    • zlib/*
  • frameworks/*
  • prebuilt/
    • Android.mk
    • common/*
    • windows/*
    • windows-x86_64/*
  • sdk/*
  • system/*
  • Makefile

정도만 카피하거나 repository에서 가져 오면 된다. (`*' 표시는 해당 폴더 아래의 모든 파일/폴더를 의미함) 위의 폴더만 별도로 가져 오는 이유는, 뭐 일단 쓸데 없이 카피하는 시간을 줄이려는 것도 있지만, bionic/libc/kernel/common/linuxexternal/iptables, external/tcpdump 폴더 아래의 몇 개의 파일들이 대소문자로 구별된 같은 이름을 가지고 있어 윈도우 파일 시스템에선 정상적으로 checkout할 수 없기 때문이기도 하다. 물론 단순히 리눅스 파일시스템에서 복사해 오는 거라면 문제 없겠지만... 


Running Script

development/build/tools 아래에 보면 make_windows_sdk.sh라는 스크립트 파일이 있다. 아래와 같은 명령어를 실행하면 윈도우용 SDK를 빌드 할 수 있다.

$ export SDK_NUMBER="eng.ysjang_`date +%Y%m%d"
$ development/build/tools/make_windows_sdk.sh android-sdk_eng.ysjang_linux-x86.zip .

$SDK_NUMBER는 생성될 zip 파일의 이름에 추가되는 것이므로 특별한 의미를 부여하진 않아도 된다. 명령어를 실행하면, 몇가지 툴의 컴파일을 마치고 linux SDK를 풀어 해당 내용과, 윈도에서 컴파일 한 툴 바이너리들을 합쳐서 현재 디렉토리(마지막 인자)에 zip 파일을 생성해 줄 것이다.


Troubleshooting

development/host/windows/prebuilt/usb/AdbWinApi.a 가 존재하지 않아 컴파일 오류가 나는 경우가 있다. 해당 폴더로 가서 다음의 명령어를 입력하면 생성할 수 있다.

$ cd development/host/windows/prebuilt/usb/
$ dlltool --def AdbWInApi.def --dllname AdbWinApi.dll --output-lib AdbWinApi.a


cygwin에 mgwz.dll 파일이 존재하지 않는 버전이 있다. 내 경우가 바로 그랬는데 ldd를 해 보니 cygz.dll을 사용하고 있었다. 만약 make_windows_sdk.sh로 빌드하던 중 mgwz.dll을 카피하는 곳에서 문제가 생긴다면 일단 mgwz.dll을 정말로 참조하고 있는 지부터 살펴 보자. out/host/windows/bin 폴더로 가서 lddaapt.exe가 무슨 라이브러리들을 참고하고 있는지 살펴보자.

이 문제는 mgwz.dll이 있더라도, cygwin을 C:\cygwin에 설치하지 않고 다른 곳에 설치했을 경우에도 마찬가지로 일어난다.

$ ldd aapt.exe
        ntdll.dll => /cygdrive/c/Windows/system32/ntdll.dll (0x77230000)
        kernel32.dll => /cygdrive/c/Windows/system32/kernel32.dll (0x758e0000)
        msvcrt.dll => /cygdrive/c/Windows/system32/msvcrt.dll (0x75b20000)
        cygz.dll => /usr/bin/cygz.dll (0x692c0000)
        cygwin1.dll => /usr/bin/cygwin1.dll (0x61000000)
        ADVAPI32.DLL => /cygdrive/c/Windows/system32/ADVAPI32.DLL (0x76bf0000)
        RPCRT4.dll => /cygdrive/c/Windows/system32/RPCRT4.dll (0x76e60000)

mgwz.dll 대신 다른 라이브러리를 참고하고 있다면 make_windows_sdk.sh를 수정하자. 다음의 두 곳을 수정해 주면 된다.

    # We currently need libz from MinGW for aapt
    # cp -v /cygdrive/c/cygwin/bin/mgwz.dll "$TOOLS"/
    cp -v /cygdrive/c/cygwin/bin/cygz.dll "$TOOLS"/
    cp -v /cygdrive/c/cygwin/bin/cygwin1.dll "$TOOLS"/

    # Note: mgwz.dll must be both in SDK/tools for zipalign and in 
    # SDK/platform/XYZ/tools/ for aapt
    # cp -v "$TOOLS"/mgwz.dll "$PLATFORM_TOOLS"/
    cp -v "$TOOLS"/cygz.dll "$PLATFORM_TOOLS"/
    cp -v "$TOOLS"/cygwin1.dll "$PLATFORM_TOOLS"/