2007幎ã«ãGoogle Corporationã¯æ°äžä»£ã®ãªãã¬ãŒãã£ã³ã°ã·ã¹ãã AndroidããªãªãŒã¹ããŸããã
ãã®åºçŸã¯ãã¢ãã€ã«ããã€ã¹ã®åžå Žã«çã®é©åœããããããMicrosoft Widows MobileãApple iOSãããã³Symbian OSã®èŠæš©ãæãããã®åŸãäžçã§æã人æ°ã®ãã倧èŠæš¡ãªã¢ãã€ã«ã·ã¹ãã ã®ãªãã¬ãŒãã£ã³ã°ã·ã¹ãã ã«ãªããŸããã ãããŸã§ãã·ã¹ãã ã®äººæ°ã¯ç¶ããŠããŸãã éå»6幎éã§ãAndroidã¯éåžžã«æé·ããŠéçºããããµããŒããããããã€ã¹ã®ç¯å²ã¯æ¡å€§ãç¶ããŠããŸãã çŸåšããã®ãªãã¬ãŒãã£ã³ã°ã·ã¹ãã ã¯æºåž¯é»è©±ã ãã§ãªããã¿ãã¬ããããã¬ãããã¬ãŒã€ãŒãã«ã¡ã©ãã©ãããããããããããããããã³è»äºæ©åšãå«ããã®ä»ã®ãšããŸããã¯ãªãã®ã§ã䜿çšãããŠããŸãã ãããã®ããã€ã¹ã®å 容ã¯ãäºãã«èããç°ãªãå¯èœæ§ããããŸãïŒéå»æ°å¹Žã§ããµããŒããããŠããã¢ãŒããã¯ãã£ã®ãªã¹ããARMããMIPSããã³x86ã«æ¡å€§ããããŸããŸãªåšèŸºæ©åšã®ãµããŒããç»å ŽããŸããããã¡ãããéçºäžã®Android APIã¯ãã¡ããã§ãã
æ©èœãã¢ãŒããã¯ãã£ã®éãã«ããããããããã®ãããªèšå€§ãªæ°ã®ç°ãªãããã€ã¹ã¯ããã©ãããã©ãŒã äŸåã©ã€ãã©ãªãšç¹å®ã®ããã€ã¹ã®æé©åãé€ããŠãåãã·ã¹ãã ã§ç®¡çãããŸãã Androidããã€ã¹ã®æé·åžå Žã§ã®æ¿ãã競äºã«çŽé¢ããŠããã©ãŒãã³ã¹èŠä»¶ãå¢å ããã ãã§ãããããAndroidãã«ããšã¢ããªã±ãŒã·ã§ã³ã©ã€ãã©ãªããã°ãã°ç°ãªãããšã¯éåžžã«èªç¶ã§ããå€ãã®å Žåããã³ããŒã«ãã£ãŠãç°ãªããŸãã
ããã«ãããããããçµ±åãšã¯ãã¹ãã©ãããã©ãŒã ãä¿èšŒããã¢ããªã±ãŒã·ã§ã³æäœã®é床ã¯ãçŸåšã®é«æ§èœã¢ããªã±ãŒã·ã§ã³ãšã·ã¹ãã ã¢ã»ã³ããªã®åžå Žã®åªå åéã®1ã€ã§ãã ããã¯ããŸã第äžã«ãããŸããŸãªããŒããŠã§ã¢äžã§å¹ççã«åäœããã³å®è¡ã§ãããªãã¬ãŒãã£ã³ã°ã·ã¹ãã èªäœã®èŠä»¶ã®å¢å ãããã³Androidã¢ããªã±ãŒã·ã§ã³ã®é«ãèŠä»¶ãæå³ããŸãã
ã¢ããªã±ãŒã·ã§ã³ãã·ã¹ãã ãããã³ãã®ã³ã³ããŒãã³ããæé©åããã³é«éåããããã®æãå¹æçãªãœãªã¥ãŒã·ã§ã³ã®1ã€ã¯ããã€ãã£ãããã€ãã£ãã¬ãã«ã§ã®æé©åã§ãã èšãæããã°ãæé©åããããå€ãã®å ŽåããŒããŠã§ã¢äŸåã®ã©ã€ãã©ãªãšã³ãŒããããã³ã°ããŒãã«ãªæå³ã§ãåã¿ãŒã²ãããã©ãããã©ãŒã ã«æäŸãããå€ãã®ã©ã€ãã©ãªã®ã¢ããªã±ãŒã·ã§ã³ãšã·ã¹ãã ã®äœ¿çšã ãã®ãããªããŸããŸãªããŒããŠã§ã¢ãã©ãããã©ãŒã ããªãã¬ãŒãã£ã³ã°ã·ã¹ãã ã®ããŸããŸãªããŒãžã§ã³ãAPIãã©ãããã©ãŒã ãããã³ã¢ããªã±ãŒã·ã§ã³ã®å®å®ããé«éåäœãä¿èšŒããããã®èŠä»¶ã«ã¯ãç¹å®ã®æ§æã®ã¢ããªã±ãŒã·ã§ã³ãšã©ã€ãã©ãªããã¹ãããããã®å€å€§ãªåªåãå¿ èŠã§ãã
ããã§ããAndroidéçºè ã«ãšã£ãŠæã䟿å©ãªããŒã«ã®1ã€ã¯ãAndroid NDK- Android Native Development Kitã§ã ãããã«ã¯ãã¢ããªã±ãŒã·ã§ã³ãã©ã€ãã©ãªãããã³ã·ã¹ãã èªäœã®éçºãšãããã°ã«å¿ èŠãªã»ãŒãã¹ãŠãå«ãŸããŠããŸãã
ãã®èšäºã§ã¯ãAndroidãã€ãã£ãã³ãŒãã®ãã¹ããšãããã°ãããã³DejaGnuãªã©ã®ãµã³ãã«ãã¬ãŒã ã¯ãŒã¯ã䜿çšãããã¹ãèªååãžã®äœ¿çšã«ã€ããŠèª¬æããŸãã
Androidã¯éåžžã«åçã«éçºãããŠãããDejaGnuã«ã¯ãAndroid NDKã®æç¡ã«ãããããããã¹ãããã°ããéå§ããããã«å¿ èŠãªã»ãŒãã¹ãŠã®ãã®ãä»å±ããŠããŸãã ãã®èšäºã®äž»ãªç®çã¯ãAndroidã®ãã¹ãã®ãã¥ã¢ã³ã¹ãšæ©èœãããã³ãšã³ãžãã¢ãééããå¯èœæ§ã®ããããã€ãã®èœãšãç©Žã«é¢ããã¹ããŒãªãŒã§ãã
ã¯ããã«ãå°ããªã³ã¡ã³ãïŒãåç¥ã®ããã«ãAndroidã¯Unixã«äŒŒããªãã¬ãŒãã£ã³ã°ã·ã¹ãã ã§ãããéåžžã®LinuxãŸãã¯BSDã«éåžžã«äŒŒãŠãããã»ãšãã©ã®AndroidãœãŒã¹ã³ãŒãã¯ã©ã€ã»ã³ã¹ASL2.0ã«åŸããŸãã Androidã䜿çšãã人ã¯ãçžåœæ°ã®Androidã¢ãžã¥ãŒã«ãBSDããLinuxãããå€§å¹ ã«åãæ¿ããããããšãç¥ã£ãŠããŸãã ããã«ãé¢ãããããã€ãã£ãã³ãŒããšã¢ãŒããã¯ãã£ã«é¢ä¿ãããã®ã¯ãã¹ãŠã詳现ã«å ¥ããªãéããLinuxã䜿çšããŠãããã¹ãŠã®äººã«éåžžã«è¿ããç¥ãããŠããŸãã ãããã£ãŠãã³ãŒããéçºããã³ãããã°ããã«ã¯ãUnixã©ã€ã¯ã·ã¹ãã ãšãŸã£ããåãããŒã«ãŸãã¯é¡äŒŒã®ããŒã«ã䜿çšããããšãã§ããŸãã ã³ã³ãã€ã©ã®å Žåããããã¯gccãclangïŒllvmïŒãiccãªã©ã§ãã GCCããŒã«ãã§ãŒã³å šäœãšããã§ã«ç§»æ€ãããŠããããããã»ã©é£ãããªã移æ€ãããä»ã®ãŠãŒãã£ãªãã£ã«ã€ããŠãåãããšãèšããŸãã
ãã€ãã£ãã³ãŒããã¢ããªã±ãŒã·ã§ã³ã«å«ãããããã€ãã£ãã©ã€ãã©ãªããã€ãã£ãå®è¡å¯èœãã¡ã€ã«ã䜿çšããäž»ãªçç±ã¯ãããã©ãŒãã³ã¹ãåäžãããããLinux / Unixã©ã€ã¯ã·ã¹ãã ãã以åã«äœæããC / C ++ / ASMã³ãŒããåå©çšããããšã§ãã
ãã€ãã£ãã³ãŒãã䜿çšããå©ç¹ ïŒ
â¢é«æ§èœ
â¢CPU / HWæ©èœã®çŽæ¥äœ¿çš
â¢æ¢åã®Linuxã³ãŒããåå©çšããæ©èœ
ãã€ãã£ãã³ãŒãã䜿çšããããšã®æ¬ ç¹ ïŒ
â¢CPU / HWã®åå¥èšå®
â¢ã·ã¹ãã ã©ã€ãã©ãªã®ãµããŒãã®æ¬ åŠ
é·æãšçæã¯ãã³ãŒãå質ãå®å®æ§ãããã³ãã©ãããã©ãŒã å šäœã®ããã©ãŒãã³ã¹ã®äž¡æ¹ã®ç¹ã§ãå³å¯ãªãã¹ããå¿ èŠãšããŸãã Androidã®æ矩ã®1ã€ã¯ããŒããŠã§ã¢ããç¬ç«ããŠãããšããäºå®ã«ãããããããããŸããŸãªæ§æã§åäœããããã«ãå®éã«ã¯ããã€ãã£ãã³ãŒããæã€ã¢ããªã±ãŒã·ã§ã³ã¯ããããããã¡ãããã€ããªïŒapkãå¯èœãªãã¹ãŠã®ããŒããŠã§ã¢æ§æçšã®ãã€ãã£ãã³ãŒã/ã©ã€ãã©ãªãå«ãã¢ããªã±ãŒã·ã§ã³ãåäœããŸãïŒã çæ³çã«ã¯ãNDKã³ã³ãã€ã©ã¯ããŸããŸãªæ§æã«å¯ŸããŠæ©èœçã«åçã®ã³ãŒããäœæããå¿ èŠãããããããã¡ãããã€ããªã®ã©ã€ãã©ãªïŒãŸãã¯ã€ã¡ãŒãžã®ã·ã¹ãã ã©ã€ãã©ãªïŒã¯åçã§ããå¿ èŠããããŸã-æ®å¿µãªãããããã¯å¿ ãããçŸå®ã«å¯Ÿå¿ãããç¹ã«æ€èšŒãå¿ èŠã§ãæé©åïŒNeonãSSEãªã©ïŒãšãµãŒãããŒãã£ã©ã€ãã©ãªã®äœ¿çšã«é¢ããŠã
ããã«ãAndroid OSãšãã®å¶åŸ¡äžã«ããããã€ã¹ã®éçºã«ãããOSã®ããŸããŸãªããŒãžã§ã³ããã®OSã®é ä¿¡ãããã³ããã€ã¹ã®ä»æ§ãèªç¶ã«å€åããŠããŸãã å Žåã«ãã£ãŠã¯ãéçºè ãäœããã®æé©åãŸãã¯å¥ã®ã³ã³ãã€ã©ã䜿çšããŠãã€ãã£ãã³ãŒããæ§ç¯ããããšãæ£åœåãããŸãã ããŸããŸãªæ§æã§ã®ãã®ã³ãŒãã®ããã©ãŒãã³ã¹ãæ£ç¢ºæ§ãå®å®æ§ã®è©äŸ¡ã¯ãAndroidãã€ãã£ããã¹ãã«æºãã£ãŠãããã¹ã¿ãŒã®ä»äºã§ãã
Androidã®ãã€ãã£ãã¢ããªã±ãŒã·ã§ã³ã®ã¢ã»ã³ãã«ããããã°ããã¹ãã®ããã»ã¹ã¯ãLinuxã®åãããã»ã¹ãšããã»ã©éãã¯ãããŸãããå¯äžã®éãã¯ãAndroidã§ã¯ãªããã¹ãïŒLinuxãMacOSãWindowsïŒã§ãã€ããªãã¡ã€ã«ïŒå®è¡å¯èœãã¡ã€ã«ããã³ã©ã€ãã©ãªïŒãåéããŠå®è¡ããããšã§ãAndroidããã€ã¹ïŒç©çãŸãã¯ãšãã¥ã¬ãŒã¿ïŒäžã ãããã£ãŠããã¹ããšAndroidããã€ã¹éã®æ®éçãªéä¿¡æ段ã¯adb-Android Debug Bridgeã§ããããã¯Android SDKã®äžéšã§ãã ã¢ããªã±ãŒã·ã§ã³ãæ§ç¯ããã³ãããã°ããã«ã¯ãå¿ èŠãªããŒã«ãã§ãŒã³ãšAPIã䜿çšããããšããå§ãããŸãããŸããå¿ èŠã«å¿ããŠïŒc ++ã®å ŽåïŒèå³ã®ããstdc ++ã©ã€ãã©ãªã®ããŒãžã§ã³ã䜿çšããããšããå§ãããŸãã
Androidãã€ãã£ãã¢ã»ã³ããªã¯ã以äžã«ãã£ãŠç°ãªãå ŽåããããŸãã
- 䜿çšãããAPIããŒãžã§ã³ïŒ
- 䜿çšãããlibstdc ++ã®ããŒãžã§ã³ïŒ
- ããã€ã¹ã¢ãŒããã¯ãã£ïŒã¿ãŒã²ããïŒïŒ
- ããã深床ïŒ32ã64ãŸãã¯x32ïŒã¿ãŒã²ããïŒ
- ãã«ããã¹ããšãã®å®¹éïŒ
ãã ããéçºè ãšãã¹ã¿ãŒã®èŠ³ç¹ããã¯ããã«ããã¹ãã«å¿ããŠçµæã®ã³ãŒãã«éãã¯ãªããæ€èšŒãšãã¹ãã«ç°ãªããã«ããã¹ãæ§æã䜿çšããå¿ èŠã¯ãããŸããã
ãã¹ãã®ãªãã·ã§ã³ã®æ°ã¯å±éºãªã»ã©å¢ããŠãããCPUåœä»€ã®æé©åãèæ ®ããŠããŸããïŒneonãcore-avx2ãcore-i7ãatomãslm; ãµã€ãº\é床ãªã©ã«ãã£ãŠã åä¿¡ããã³ãŒãïŒãœãŒã¹ããã³ãã€ããªïŒã®ããªã¢ã³ãã®ãã®ãã«ã«ãç©ã¯ãã¹ãŠããã¹ãã®éå§ç¹ã§ãã ãã¹ãã®ç®çãããã€ã¹èªäœãŸãã¯Androidã®ã«ã¹ã¿ã ã¢ã»ã³ããªã®å Žåãäž»ãªéèŠãªéãã¯ãã€ãªããã¯ã©ã€ãã©ãªïŒAndroidã®libcã©ã€ãã©ãªã®é¡äŒŒç©ïŒã§ããå¯èœæ§ãæãé«ãã§ãããã
å ¥éçè«ãçµããããå®è·µã«ç§»ããŸãããã
æåçµã¿ç«ãŠããã³ãã¹ãçšã®ããŒã«
å¿ èŠãªããŒã«ã¯ãã¹ãŠAndroid NDKã«ä»å±ããŠãããLinuxãMacOSãWindowsã®32ããããš64ãããã§äœ¿çšã§ããŸãã
ã¢ããªã±ãŒã·ã§ã³ãäœæããŠå®è¡ãã
gcc
bash-4.2$ # hello_world.c bash-4.2$ cat ./hello_world.c #include <stdio.h> int main(void) { printf(âHello, World!\nâ); return 0; } bash-4.2$ # Android, gcc 4.7 x86, 18 bash-4.2$ /users/NDK_current/toolchains/x86-4.7/prebuilt/linux-x86/bin/i686-linux-android-gcc âsysroot=/users/NDK_current/platforms/android-18/arch-x86 ./hello_world.c -o ./hello_world.exe bash-4.2$ echo $? 0 bash-4.2$ #, bash-4.2$ # bash-4.2$ ./hello_world.exe bash-4.2$ #, bash-4.2$ # bash-4.2$ adb devices List of devices attached 0146AFFC18020012 device bash-4.2$ #, - bash-4.2$ adb -s 0146AFFC18020012 shell echo 'Hello, Android!' Hello, Android! bash-4.2$ #, bash-4.2$ export ANDROID_SERIAL=0146AFFC18020012 bash-4.2$ # bash-4.2$ adb shell echo 'Hello, Android!' Hello, Android! bash-4.2$ #- , bash-4.2$ adb push ./hello_world.exe /data/local/ bash-4.2$ #- , bash-4.2$ adb shell /data/local/hello_world.exe Hello, World! bash-4.2$ #adb , , , bash-4.2$ adb shell â/data/local/hello_world.exe && echo $?â Hello, World! 0 bash-4.2$ #, bash-4.2$ # , bash-4.2$ # , (linux, mac, windows) bash-4.2$ # , - bash-4.2$ # , -static /users//NDK_current/toolchains/x86-4.7/prebuilt/linux-x86/bin/i686-linux-android-gcc âsysroot=/users/ /NDK_current/platforms/android-18/arch-x86 -static ./hello_world.c -o ./hello_world.exe bash-4.2$ echo $? 0 bash-4.2$ #, - bash-4.2$ ./hello_world.exe Hello, World! bash-4.2$ echo $? 0 bash-4.2$ #, bash-4.2$
g ++
bash-4.2$ # g++ bash-4.2$ cat ./hello_world.C #include <iostream> int main(void) { std::cout << âHello, World!\nâ; return 0; } bash-4.2$ # STL, bash-4.2$ # bash-4.2$ # , bash-4.2$ # , -l%STL_LIB% ! bash-4.2$ # _shared, _static bash-4.2$ # g++ -L, -I â gnustl/stlport/gabi bash-4.2$ /users/ /NDK_current/toolchains/x86-4.7/prebuilt/linux-x86/bin/i686-linux-android-g++ âsysroot=/users/NDK_current/platforms/android-18/arch-x86 -I/users/NDK_current/sources/cxx-stl/gnu-libstdc++/4.7/include -I/users/NDK_current/sources/cxx-stl/gnu-libstdc++/4.7/libs/x86/include -L/users//NDK_current/sources/cxx-stl/gnu-libstdc++/4.7/libs/x86 ./hello_world.C -o ./hello_world.exe -lgnustl_shared bash-4.2$ echo $? 0 bash-4.2$ #, - / / bash-4.2$ adb push ./hello_world.exe /data/local/ bash-4.2$ #- , bash-4.2$ adb shell â/data/local/hello_world.exe && echo $?â soinfo_link_image(linker.cpp:1635): could not load library âlibgnustl_shared.soâ needed by â/data/local/hello_world.exeâ; caused by load_library(linker.cpp:745): library âlibgnustl_shared.soâ not foundCANNOT LINK EXECUTABLE bash-4.2$ # , bash-4.2$ #libgnustl_shared.so Android, bash-4.2$ adb push /users//NDK_current/sources/cxx-stl/gnu-libstdc++/4.7/libs/x86/libgnustl_shared.so /data/local/libgnustl_shared.so bash-4.2$ #, , LD_LIBRARY_PATH bash-4.2$ adb shell âexport LD_LIBRARY_PATH=/data/local/:$LD_LIBRARY_PATH && /data/local/hello_world.exe && echo $\?â Hello, World! 0 bash-4.2$ # â /system/lib bash-4.2$ # bash-4.2$ adb shell â/data/local/hello_world.exe && echo $\?â Hello, World! 0 bash-4.2$
ãã¹ããšã¿ãŒã²ããã®ã¢ãŒããã¯ãã£ãäžèŽãïŒéåžžx86ïŒãrootæš©éã䜿çšå¯èœãªå Žåããã¹ãã§Android x86ãã€ããªãèµ·åãããšãã«å·§åŠãªããªãã¯ã䜿çšããããšã¯éåžžã«å¯èœã§ãã ãããè¡ãã«ã¯ãã·ã¹ãã ã§Androidã®åçãªã³ã«ãŒïŒ/ system / bin /ãªã³ã«ïŒãæ瀺çã«äœ¿çšãããšãšãã«ããã¹ã«éã¹ããªããããŒãžã§ã³ã®bionicã䜿çšããå¿ èŠããããŸãïŒLD_LIBRARY_PATHïŒã Makefileã®äŸãåç §ããŠãã ããïŒïŒ https://android.googlesource.com/platform/bionic/+/master/tests/Android.mkïŒbionic-unit-tests-run-on-host ïŒã
# ----------------------------------------------------------------------------- # Run the unit tests built against x86 bionic on an x86 host. # ----------------------------------------------------------------------------- ifeq ($(HOST_OS)-$(HOST_ARCH),linux-x86) ifeq ($(TARGET_ARCH),$(filter $(TARGET_ARCH),x86 x86_64)) ifeq ($(TARGET_ARCH),x86) LINKER = linker else LINKER = linker64 endif # gtest needs ANDROID_DATA/local/tmp for death test output. # Make sure to create ANDROID_DATA/local/tmp if doesn't exist. # bionic itself should always work relative to ANDROID_DATA or ANDROID_ROOT. bionic-unit-tests-run-on-host: bionic-unit-tests $(TARGET_OUT_EXECUTABLES)/$(LINKER) $(TARGET_OUT_EXECUTABLES)/sh if [ ! -d /system -o ! -d /system/bin ]; then \ echo "Attempting to create /system/bin"; \ sudo mkdir -p -m 0777 /system/bin; \ fi mkdir -p $(TARGET_OUT_DATA)/local/tmp cp $(TARGET_OUT_EXECUTABLES)/$(LINKER) /system/bin cp $(TARGET_OUT_EXECUTABLES)/sh /system/bin ANDROID_DATA=$(TARGET_OUT_DATA) \ ANDROID_ROOT=$(TARGET_OUT) \ LD_LIBRARY_PATH=$(TARGET_OUT_SHARED_LIBRARIES) \ $(TARGET_OUT_DATA_NATIVE_TESTS)/bionic-unit-tests/bionic-unit-tests endif endif
ãã®ãããªããªãã¯ã¯ãããšãã°ããšãã¥ã¬ãŒã¿ãªãã§ãã€ããªãã¡ã€ã«ãå®è¡ããå Žåã«é¢é£ããŸãïŒ64ãããã€ã¡ãŒãžããªãå ŽåããŸãã¯-mx32ã䜿çšããå ŽåïŒã
GCOVãšãããã¡ã€ã«
bash-4.2$ # , , - , bash-4.2$ #, , coverage bash-4.2$ # , , bash-4.2$ # , -fprofile-dir=%android_exec_dir% bash-4.2$ # , , GCOV_PREFIX GCOV_PREFIX_STRIP bash-4.2$ # , env adb ( shell adb shell %command% bash-4.2$ /users//NDK_current/toolchains/x86-4.7/prebuilt/linux-x86/bin/i686-linux-android-gcc âsysroot=/users//NDK_current/platforms/android-18/arch-x86 ./gcov-1.c -fprofile-arcs -fprofile-dir=. -ftest-coverage -lm -o ./gcov-1.exe bash-4.2$ adb push ./gcov-1.exe /data/local/gcov-1.exe bash-4.2$ #adb shell âexport GCOV_PREFIX=/data/local && export GCOV_PREFIX_STRIP=13 && /data/local/gcov-1.exe && echo $\?â bash-4.2$ unset GCOV_PREFIX && unset GCOV_PREFIX_STRIP && cd /data/local && ./gcov-1.exe && echo $\?â 0 bash-4.2$ adb shell ls /data/local/gcov-1.gcda /data/local/gcov-1.gcda bash-4.2$ # bash-4.2$ adb pull /data/local/gcov-1.gcda . bash-4.2$ ls ./gcov-1.gcda ./gcov-1.gcda bash-4.2$ # NDK gcov, , bash-4.2$ /users/NDK_current/toolchains/x86-4.7/prebuilt/linux-x86/bin/i686-linux-android-gcov gcov-1.gcda File 'gcov-1.c' Lines executed:100.00% of 6 Creating 'gcov-1.c.gcov' bash-4.2$
ãããã°\ãããã°ïŒGDB / logcat
bash-4.2$ # NDK , , gdb bash-4.2$ # -g, bash-4.2$ /users /NDK_current/toolchains/x86-4.7/prebuilt/linux-x86/bin/i686-linux-android-gcc âsysroot=/users/NDK_current/platforms/android-18/arch-x86 ./hello_world.c -o ./hello_world.exe bash-4.2$ adb push ./hello_world.exe /data/local/hello_world.exe bash-4.2$ adb shell gdbserver :5039 /data/local/hello_world.exe & Process /data/local/hello_world.exe created; pid = 29744 Listening on port 5039 bash-4.2$ adb forward tcp:5039 tcp:5039 bash-4.2$ /users/NDK_current/toolchains/x86-4.7/prebuilt/linux-x86/bin/i686-linux-android-gdb hello_world.exe Remote debugging from host 127.0.0.1 libthread_db:td_ta_new: Probing system for platform bug. libthread_db:td_ta_new: Running as root, nothing to do. Hello, World! Child exited with status 0 GDBserver exiting bash-4.2$ cat test.gdb set sysroot /users/igveresx set solib-absolute-prefix /users/igveresx/symbols/ set solib-search-path /users/igveresx/symbols/lib set auto-solib-add on target remote :5039 stepi stepi c Quit bash-4.2$ # logcat bash-4.2$ adb logcat *:E >logcat.log & bash-4.2$ tail -5 logcat.log E/Intel PowerHAL( 2093): Error in reading vsync hint E/Intel PowerHAL( 2093): Error reading from /sys/devices/system/cpu/cpufreq/interactive/vsync_count: No such file or directory E/Intel PowerHAL( 2093): Error in reading vsync count E/Intel PowerHAL( 2093): Error reading from /sys/devices/system/cpu/cpufreq/interactive/touch_event: No such file or directory E/Intel PowerHAL( 2093): Error in reading vsync hint bash-4.2$ # kernel bash-4.2$ adb shell dmesg | tail -5 <6>[245665.256198] intel_mdf_battery msic_battery: vbus_volt:4974 <6>[245665.265332] intel_mdf_battery msic_battery: vbatt:4116250 temp:300 <4>[245669.213759] kct_daemon: loop. <4>[245673.213561] kct_daemon: loop. <4>[245677.213379] kct_daemon: loop. bash-4.2$ adb shell 'cat /proc/kmsg' >kmsg.log bash-4.2$ tail -5 kmsg.log <4>[245673.213561] kct_daemon: loop. <4>[245677.213379] kct_daemon: loop. <4>[245681.213248] kct_daemon: loop. <4>[245685.213083] kct_daemon: loop. <4>[245689.212932] kct_daemon: loop. bash-4.2$
ãã¹ãèªåå
ãã¹ããèªååããã«ã¯ãdejagnuã®ãããªãã¬ãŒã ã¯ãŒã¯ã䜿çšã§ããŸãã 2013幎2æãããDejaGnuã«ã¯androideabiããŒããå«ãŸããŠãããadbãä»ããŠAndroidã§ãã€ãã£ãã³ãŒãããã¹ãã§ããŸãã
äžè¬ã«ãããã€ãã®ãã¥ã¢ã³ã¹ãé€ããŠããã¹ãŠã¯äžèšã§èª¬æãããã®ã«äŒŒãŠããŸãã
å€ãã®dejagnuãã¹ãã§ã¯ããã¹ã/ã¿ãŒã²ããã®ããªãã«ãã§ãã¯ãéèŠã§ãã ããšãã°ãå°ãªããšãããã€ã¹ã§ãã€ããªãã¡ã€ã«ãå®è¡ã§ãããã©ãããç解ããããã«ãå€ãã®å Žåãhost = target = buildïŒnativeïŒããã§ãã¯ããŸãã ãã ãããã®ã±ãŒã¹ã§ã¯ãäžè¬çã«ã build_tripletã¯target_tripletãšçãããããŸããããåæã«Androidã§çµæãå®è¡ããã³åä¿¡ããããšãã§ããŸãã ããã«ãããã©ã«ãã§NDKã-fpicãã©ã°ã䜿çšãããšããäºå®ãèæ ®ããå¿ èŠããããŸããããã¯ããã¹ããšãã®çµæã®å®è¡ã«ã圱é¿ããŸãïŒæå¹ã¿ãŒã²ããpic / nonpicãã§ãã¯ïŒã éçãªã³ã¯ã®å Žåãããããããã¹ãŠãæåŸ ãæºããããã§ã¯ãªãããšã念é ã«çœ®ãå¿ èŠããããŸãïŒéçã©ã€ãã©ãªãšåçã©ã€ãã©ãªã¯ããããèªäœã§ç°ãªããç°ãªãã³ãŒããçæããå ŽåããããŸãïŒ -fpic / -fpie ïŒãã¹ã¿ãŒãã¢ãããã£ã¬ã¯ããªãŸãã¯çµæã®ãã£ã¬ã¯ããªã®æå®ãããã³ãã€ããªãã¡ã€ã«ãéå§ããåã«ããã£ã¬ã¯ããªãç®çã®ãã£ã¬ã¯ããªã«å€æŽããå¿ èŠããããŸããããã«ãããã€ã¹ãžã®ãã€ããªãã¡ã€ã«ã®è»¢éäžã«ãèµ·åæš©ããªã»ããã§ããŸãïŒãã©ã«ãæš©éãŸãã¯ãã¡ã€ã«ã·ã¹ãã æš©éã«ããïŒ ïŒãããã§èª¬åŸãã䟡å€ããã SYAå®è¡å¯èœãã¡ã€ã«ãå®è¡ããããèšå®ãããŠããããšããŸããçµç¹ããã¹ãããããã®æåã®è§£æ±ºçã¯ãæåã®æ¥éãªæ¶èãé¿ããããã«é©åãªæš©éãæã€éSDã«ãŒããšRAMãã£ã¹ã¯ã䜿çšããããšã§ãã
Androidã§ãã¹ããéå§ããã«ã¯ããã¹ãã«dejagnuãã€ã³ã¹ããŒã«ããŠå®è¡ããã ãã§ååã§ãã
runtest âtarget_board = androideabi
ããã€ã¹ã®ã·ãªã¢ã«çªå·ã«å¯Ÿå¿ããADB_SERIALå€æ°ãæ瀺çã«æå®ããããã«ããŠãã ããã
ãã ããããŒã«ã«æ§æãã¡ã€ã«-site.expã䜿çšããŠãã¹ããå®è¡ããæ¹ãã¯ããã«äŸ¿å©ã§å¿«é©ã§ãã
ããšãã°ã gcc testsuiteãå®è¡ããããã®æ§æãã¡ã€ã«ïŒ
set rootme â.â set tmpdir â.â set srcdir â/path/to/gcc_%version%_release/gcc/testsuiteâ set CFLAGS ââ set CXXFLAGS ââ set GDB â/path/to/GDB_UNDER_TESTâ set GCOV_UNDER_TEST â/path/to/GCOV_UNDER_TESTâ set GCC_UNDER_TEST â/path/to/GCC_UNDER_TESTâ set GXX_UNDER_TEST â/path/to/GXX_UNDER_TESTâ set GFORTRAN_UNDER_TEST ânoâ set OBJC_UNDER_TEST ânoâ set libiconv ââ set HOSTCC âgccâ set HOSTCFLAGS ââ set TESTING_IN_BUILD_TREE 1 set GMPINC ââ set ENABLE_LTO 1 set HAVE_LIBSTDCXX_V3 1 set host_triplet i686-pc-linux-gnu set build_triplet i686-pc-linux-gnu set target_triplet i686-pc-linux-android-gnu set target_alias i686-pc-linux-android set android_tmp_dir â/temporary/folder/on/device/with/executable/permissionsâ set bridge_tmp_dir â/temporary/folder/on/device/with/executable/permissionsâ append boards_dir â/path/to/share/dejagnu/baseboardsâ
åãgccãå®è¡ããã«ã¯ïŒ
export ADB_SERIAL=$ANDROID_SERIAL make -j $parallel check DEJAGNU=/path/to/site.exp RUNTESTFLAGS=ââtarget_board=androideabiâ
泚ïŒgccãã§ãã¯ã®éå§æã«gcc_exec_Prefixå€æ°ã誰ãã«ãã£ãŠåé€ãããŠããªãããšãããã³èšå®ãããŠããªãããšã確èªããå¿ èŠãããããšã«æ³šæããŠãã ããã
ã³ã³ãã€ã©ãžã®ãã¹ãæå®ããã ãã§ãªããäžèšã§æåã§è¡ã£ããã¹ãŠã®ããšãã€ãŸã次ã®ããšãå¿ããªãã§ãã ããã
- sysroot
- ã©ã€ãã©ãªãšããããŒãã¡ã€ã«ãžã®ãã¹
- ãã©ã°ãšãã©ã°ã€ã³ïŒå°ãªããšãlibstdc ++ã«ãŒã©ãŒã®å ŽåïŒ
ããã«åºã¥ããŠãæè¯ã®è§£æ±ºçã¯ãããŒã«ãã§ãŒã³ããã®å®è¡å¯èœãã¡ã€ã«ã®ã©ãããŒïŒwrapper-binarynameïŒã䜿çšããããšã§ãã
wrapper-gcc
#!/bin/bash /path/to/NDK_folder/toolchains/$arch-%compiler_version%/prebuilt/linux-x86/bin/%arch_prefix%-linux-android-gcc âsysroot=/path/to/NDK_folder/platforms/android-${device_platform}/arch-$arch â$@â
wrapper-g ++
#!/bin/bash echo $@ | grep â \-nostdlibâ 1>/dev/null 2>/dev/null if [ $? != 0 ]; then echo $@ | grep â \-staticâ 1>/dev/null 2>/dev/null if [ $? != 0 ]; then /path/to/NDK_folder/toolchains/$arch-%compiler_version%/prebuilt/linux-x86/bin/%arch_prefix%-linux-android-g++ âsysroot=/path/to/NDK_folder/platforms/android-${device_platform}/arch-$arch -I/path/to/NDK_folder/sources/cxx-stl/%stl lib folder%/%compiler version%/include -I/path/to/NDK_folder/sources/cxx-stl/%stl lib folder%/%compiler version%/libs/$arch/include -L/path/to/NDK_folder/sources/cxx-stl/%stl lib folder%/%compiler version%/libs/$arch â$@â -lgnustl_shared else /path/to/NDK_folder/toolchains/$arch-%compiler_version%/prebuilt/linux-x86/bin/%arch_prefix%-linux-android-g++ âsysroot=/path/to/NDK_folder/platforms/android-${device_platform}/arch-$arch -I/path/to/NDK_folder/sources/cxx-stl/%stl lib folder%/%compiler version%/include -I/path/to/NDK_folder/sources/cxx-stl/%stl lib folder%/%compiler version%/libs/$arch/include -L/path/to/NDK_folder/sources/cxx-stl/%stl lib folder%/%compiler version%/libs/$arch â$@â -lgnustl_static fi else /path/to/NDK_folder/toolchains/$arch-%compiler_version%/prebuilt/linux-x86/bin/%arch_prefix%-linux-android-g++ âsysroot=/path/to/NDK_folder/platforms/android-${device_platform}/arch-$arch -I/path/to/NDK_folder/sources/cxx-stl/%stl lib folder%/%compiler version%/include -I/path/to/NDK_folder/sources/cxx-stl/%stl lib folder%/%compiler version%/libs/$arch/include -L/path/to/NDK_folder/sources/cxx-stl/%stl lib folder%/%compiler version%/libs/$arch â$@â fi
å¿ èŠã«å¿ããŠãAndroidããããŒã¿ãååŸããå¿ èŠãããå Žåã¯ã remote_uploadé¢æ°ïŒ adb_uploadïŒ target_board %% source %% destïŒ ïŒã䜿çšã§ããŸãã ãã®æ©èœã¯ãã¹ãã¹ã€ãŒãã§æäŸããå¿ èŠããããŸãã
ãããã¡ã€ãªã³ã°ãããã©ãŒãã³ã¹ãã¹ã
ãããã¡ã€ã«ã®åéãšäœ¿çšã®åŸ®åŠãªéãã«ã€ããŠã¯ããã®èšäºã§ã¯è©³ãã説æããŸããããAndroidã®å Žåããããã¡ã€ãªã³ã°çšã®æãäžè¬çãªãŠãŒãã£ãªãã£ã¯æ¬¡ã®ãšããã§ãã
- æ§èœ
- ãããã£ãŒã«
- 9æ
ããšãã°ãéçãªperfã¢ã»ã³ããªãããå Žåãããã§ååã§ãïŒ
adb push perf /data/local/ adb shell cd /data/local chmod 777 perf perf record ./coremark.exe 0Ã0 0Ã0 0Ã66 0 7 1 2000 # or any arguments required # data saved at ./perf.data</li> export PAGER=cat # otherwise it will look for âlessâ perf report
Dalvikãä»ããŠåäœãããã³ãããŒã¯ã®å©ãã ãã§ãªãããã€ãã£ãã¬ãã«ãã€ãŸãAndroidã®ããã©ãŒãã³ã¹ããã¹ãããããšãã§ããŸãã åãAndroid NDKã«ãã£ãŠã³ã³ãã€ã«ããããã³ãããŒã¯ã䜿çšããŸãã äŸïŒ SPEC ã EEMBC ã CoreMark ã
Androidçšã®ãã¬ãŒã ã¯ãŒã¯ã®ç§»æ€ã®ãã¥ã¢ã³ã¹ã«ã€ããŠã¯è§ŠããŸãããïŒäžèšã®æ¹æ³ã«äŒŒãŠããŸãïŒãããã€ã¹ãŸãã¯ãšãã¥ã¬ãŒã¿ãŒã§äœæ¥ããããã«adbã䜿çšãããšããååãšããã¹ãŠã«åºã¥ããŠè¡ãããããã»ã¹ãžã®éèŠãªæ³šæã«æ³šç®ãã䟡å€ããããŸãããã€ã¹ã
çµæã次ã®åœ±é¿ãåããããšã確èªããå¿ èŠããããŸãã
- ããã»ããµã¢ãŒã
- ããã¯ã°ã©ãŠã³ãã§å®è¡ãããŠããã¢ããªã±ãŒã·ã§ã³
- ã¯ãªãŒã³ãªèµ·åãããã³ãšã©ãŒïŒlogcat / dmesgã䜿çšããŠè¿œè·¡ã§ããŸãïŒ
é¢é£ããçµæã¯ã確å®çãªããã€ã¹ã§ã®ã¿ååŸã§ããŸãïŒããã€ã¹ãšã¢ããªã±ãŒã·ã§ã³ã®å®éã®äœ¿çšã®ãããã¡ã€ã«ãååŸããåé¡ã§ãªãå ŽåïŒã ãããã£ãŠãéå§ããåã«ã次ã®ããšã確èªããå¿ èŠããããŸãã
- ãã¹ãŠã®ã»ã«ã³ããªãµãŒãã¹ãšã¢ããªã±ãŒã·ã§ã³ãç¡å¹ã«ããŸãã
- ããã€ã¹ã¯æä»çã«äœ¿çšãããŸã
- ããã€ã¹ã«ã¯ããŒãã»ããæäœã¢ãŒãããããŸã
ããšãã°ãCPUããã¹ãããå Žåã®äžè¬çãªæ¹æ³ã¯ããã¹ãŠã®ããã»ããµã³ã¢ãšåšæ³¢æ°ãåãå€ã«èšå®ããŠä¿®æ£ããããšã§ãã å¿ èŠã«å¿ããŠããã¹ããè¡ââãããŠããã³ã¢ãé€ããã¹ãŠã®ã³ã¢ãç¡å¹ã«ããŸãã
adb shell echo userspace > /sys/devices/system/cpu/cpuX/cpufreq/scaling_governor echo 2000000 > /sys/devices/system/cpu/cpuX/cpufreq/scaling_max_freq echo 2000000 > /sys/devices/system/cpu/cpuX/cpufreq/scaling_min_freq
å€ã
/ sys / devices / system / cpu / cpuX / cpufreq / onlineãããã³ãããŒã¯\ãããã¡ã€ã«ããã³\ãŸãã¯ãã¹ãã®ããŒãºã«å¿ããŠæ£ããã€ã³ã¹ããŒã«ãããŸãã
ãã¹ãŠãæ£ããã¢ãŒãïŒcat / proc / cpuinfoïŒã§åäœããããšã確èªããŠåããŠããã¹ããšåæãéå§ã§ããŸãã
äœæ¥ãç°¡çŽ åãããã€ãã£ãã³ãŒãããããã°ããããã«ãAndroidã«ã¯ãAndroidã®ããã©ã«ãã®é ä¿¡ã«å«ãŸããªãbusyboxãŠãŒãã£ãªãã£ã®ã»ããããããŸãïŒGPL 2.0ã©ã€ã»ã³ã¹ã§é ä¿¡ãããããïŒã
[, [[, ar, arp, awk, base64, basename, bbconfig, beep, blkid, blockdev, bootchartd, bunzip2, bzcat, bzip2, cal, cat, catv, chat, chattr, chgrp, chmod, chown, chpst, chroot, chrt, chvt, cksum, clear, cmp, comm, cp, cpio, crond, crontab, cttyhack, cut, dc, dd, deallocvt, depmod, devmem, diff, dirname, dmesg, dnsd, dos2unix, dpkg, dpkg-deb, du, dumpkmap, echo, ed, egrep, env, envdir, envuidgid, expand, expr, fakeidentd, false, fbset, fbsplash, fdflush, fdformat, fdisk, fgconsole, fgrep, find, findfs, flash_lock, flash_unlock, flashcp, flock, fold, free, freeramdisk, fsync, ftpd, ftpget, ftpput, fuser, getopt, grep, gunzip, gzip, halt, hd, hdparm, head, hexdump, httpd, hwclock, ifconfig, ifdown, ifup, init, inotifyd, insmod, install, iostat, ip, ipaddr, ipcalc, iplink, iproute, iprule, iptunnel, klogd, less, linuxrc, ln, loadkmap, losetup, lpd, lpq, lpr, ls, lsattr, lsmod, lsof, lspci, lsusb, lzcat, lzma, lzop, lzopcat, makedevs, makemime, man, md5sum, mdev, mesg, mkdir, mkfifo, mknod, mkswap, mktemp, modinfo, modprobe, more, mpstat, mv, nbd-client, nc, netstat, nice, nmeter, nohup, od, openvt, patch, pidof, ping, pipe_progress, pmap, popmaildir, poweroff, powertop, printenv, printf, ps, pscan, pstree, pwd, pwdx, raidautorun, rdev, readlink, readprofile, realpath, reboot, reformime, renice, reset, resize, rev, rm, rmdir, rmmod, route, rpm, rpm2cpio, rtcwake, run-parts, runsv, runsvdir, rx, script, scriptreplay, sed, sendmail, seq, setconsole, setkeycodes, setlogcons, setserial, setsid, setuidgid, sha1sum, sha256sum, sha3sum, sha512sum, showkey, sleep, smemcap, softlimit, sort, split, start-stop-daemon, strings, stty, sum, sv, svlogd, switch_root, sync, sysctl, tac, tail, tar, tcpsvd, tee, telnet, telnetd, test, tftp, tftpd, time, timeout, top, touch, tr, traceroute, true, ttysize, tunctl, tune2fs, udpsvd, uname, uncompress, unexpand, uniq, unix2dos, unlzma, unlzop, unxz, unzip, uptime, usleep, uudecode, uuencode, vconfig, vi, volname, watch, wc, wget, which, whoami, whois, xargs, xz, xzcat, yes, zcat
ãã®èšäºã§èª¬æãããŠããã¢ãããŒãã䜿çšãããšããã¹ããLinuxããAndroidã«ãã°ããç°¡åã«ç§»æ€ãããŒãããäœæããããŸããŸãªããŒããŠã§ã¢æ§æãšãšãã¥ã¬ãŒã¿ãŒã®ãããã°ãæçæéã§è¡ãããšãã§ããŸãã