{"id":1489,"date":"2016-07-01T22:51:55","date_gmt":"2016-07-01T13:51:55","guid":{"rendered":"http:\/\/43.203.250.216\/?p=1489"},"modified":"2025-10-01T16:25:01","modified_gmt":"2025-10-01T07:25:01","slug":"android-studio%ec%97%90%ec%84%9c-googletest-%ec%82%ac%ec%9a%a9%ec%9d%84-%ec%9c%84%ed%95%9c-%ec%84%a4%ec%a0%95","status":"publish","type":"post","link":"https:\/\/litcoder.com\/?p=1489","title":{"rendered":"Android Studio\uc5d0\uc11c Googletest \uc0ac\uc6a9\uc744 \uc704\ud55c \uc124\uc815"},"content":{"rendered":"\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\"><p>Android Studio\ub294 \ub0b4 PC\uc5d0\uc11c \uc880 \ub290\ub9ac\uae34 \ud558\uc9c0\ub9cc, \ub2e4\ub978 IDE\ub4e4\uc5d0 \ube44\ud574\uc11c\ub294 Emacs key binding\uc774 \ube44\uad50\uc801 \uc798\ub418\uc5b4 \uc788\uc5b4\uc11c \ub9cc\uc871 \ud558\uba74\uc11c \uc870\uae08\uc529 \ubc30\uc6cc\uac00\uace0 \uc788\ub2e4. NDK\ub85c JNI\uc5d0\uc11c \ubd88\ub7ec\ub2e4 \uc4f8 native code\ub97c \uad6c\ud604\ud558\ub2e4 \ubcf4\ub2c8 Googletest\ub97c \uc0ac\uc6a9\ud558\uae30 \uc704\ud574 \ub9e4\ubc88 device\ub85c push \ud558\uace0 \uc2e4\ud589\ud558\ub294 \uacfc\uc815\uc774 \uaf64\ub098 \ubc88\uac70\ub85c\uc640\uc11c script\ub85c \ub9cc\ub4e4\uc5b4 \ubcf4\uc558\ub2e4. \uc774 \uae00\uc5d0\uc11c\ub294 Android Studio\uc5d0\uc11c Googletest\ub97c \uc0ac\uc6a9\ud558\uae30 \uc704\ud55c \uae30\ubcf8\uc801\uc778 \uc124\uc815\uacfc device\uc5d0 push\ud558\ub294 \uacfc\uc815\uc744 \ud3b8\ud558\uac8c \ud574\uc8fc\ub294 script\uc5d0 \ub300\ud574 \uc124\uba85\ud55c\ub2e4.<\/p><\/blockquote>\n\n\n\n<h1 class=\"wp-block-heading\">\ud658\uacbd<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Bash script\ub97c \uc0ac\uc6a9\ud560 \uac83\uc774\ubbc0\ub85c Linux \ud658\uacbd\uc774\ub098&nbsp;<a href=\"http:\/\/www.cygwin.com\/\">Cygwin<\/a>\uc774 \uc124\uce58\ub418\uc5b4 \uc788\uc5b4\uc57c \ud55c\ub2e4. \uc0ac\uc2e4 \uc5ec\uae30\uc758 \ub0b4\uc6a9\uc740 Windows + Cygwin\uc5d0\uc11c \uc2dc\ud5d8\ub418\uc5c8\uc73c\ub098 Bash\uac00 \ub3d9\uc791\ud558\ub294 \ud658\uacbd\uc774\ub77c\uba74 \ud2b9\ubcc4\ud788 \ubb38\uc81c\ub294 \uc5c6\uc744 \uac83\uc774\ub2e4.<\/p>\n\n\n\n<h1 class=\"wp-block-heading\">Googletest<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Google\uc758 C++ testing framework\uc778 Googletest\ub294 <a href=\"https:\/\/github.com\/google\/googletest\">Googletest GitHub<\/a>\uc5d0\uc11c\ub3c4 \ubc1b\uc544\uc11c \uc0ac\uc6a9\ud560 \uc218 \uc788\uc73c\ub098, NDK package\uc548\uc5d0\ub3c4 \ub4e4\uc5b4 \uc788\ub2e4. \uc5ec\uae30\uc11c\ub294 NDK\uc548\uc758 \ub2e4\uc74c \uacbd\ub85c\uc5d0 \uc788\ub294 Googletest\ub97c \uc0ac\uc6a9\ud558\uae30\ub85c \ud55c\ub2e4. Native test case\ub4e4\uc744 \uc791\uc131\ud560 \uacf5\uac04\uc744 app\/src\/main\/jni \uc544\ub798\uc5d0 &#8216;tests&#8217;\ub77c\ub294 \uc774\ub984\uc73c\ub85c \ub9cc\ub4e4\uace0 \uc774\uacf3\uc73c\ub85c gogoletest\ub97c \ubcf5\uc0ac\ud574 \uc628\ub2e4.<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"raw\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">$>mkdir .\/app\/src\/main\/jni\/tests\n$>cp -r $ANDROID_NDK_PATH\/sources\/third_party\/googletest .\/app\/src\/main\/jni\/tests\/<\/pre>\n\n\n\n<h1 class=\"wp-block-heading\">Android.mk<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">\uae30\uc874\uc5d0 \uc0ac\uc6a9\ud558\ub358 native\uc6a9 Android.mk file\uc5d0 Googletest\ub97c \uc0ac\uc6a9\ud558\uae30 \uc704\ud55c \ucd94\uac00 \uc218\uc815\uc744 \ud574\uc900\ub2e4.<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"ini\" data-enlighter-theme=\"eclipse\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"true\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">#\n# 1. \uc2dc\ud5d8\ud560 \uae30\ub2a5\uc744 \ud3ec\ud568\ud558\ub294 \ub77c\uc774\ube0c\ub7ec\ub9ac\n#\nLOCAL_PATH := $(call my-dir)\ninclude $(CLEAR_VARS)\n\nLOCAL_MODULE := \ub77c\uc774\ube0c\ub7ec\ub9ac_\uc774\ub984\nLOCAL_SRC_FILES := \uc18c\uc2a4\ud30c\uc77c\ub4e4\n\ninclude $(BUILD_SHARED_LIBRARY)\n\n\n#\n# 2. Googletest static library\n#\n# Google test static library\ninclude $(CLEAR_VARS)\nGTEST_PATH := tests\/googletest\n\nLOCAL_MODULE := googletest_main\nLOCAL_CFLAGS := -Ijni\/tests\/googletest\/include -Ijni\/tests\/googletest\/\n\nLOCAL_SRC_FILES := \\\n    $(GTEST_PATH)\/src\/gtest-all.cc\n\ninclude $(BUILD_STATIC_LIBRARY)\n\n\n#\n# 3. \uc791\uc131\ub41c test case \uc2e4\ud589\ud30c\uc77c\n#\ninclude $(CLEAR_VARS)\n\nLOCAL_MODULE := testcases\nLOCAL_CFLAGS := -Ijni\/tests\/googletest\/include -Ijni\n\nLOCAL_SRC_FILES := \\\n    tests\/Test_Main.cpp \\\n    tests\/\ud14c\uc2a4\ud2b8\ucf00\uc774\uc2a4_\uc18c\uc2a4\ud30c\uc77c\ub4e4\n\nLOCAL_SHARED_LIBRARIES := \ub77c\uc774\ube0c\ub7ec\ub9ac_\uc774\ub984\nLOCAL_STATIC_LIBRARIES := googletest_main\ninclude $(BUILD_EXECUTABLE)\n<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\uc704\uc5d0\uc11c \uccab \ubc88\uc9f8 \ud56d\ubaa9 <em>&#8220;\ub77c\uc774\ube0c\ub7ec\ub9ac_\uc774\ub984<\/em>&#8220;\uc740 \uc2dc\ud5d8 \ub300\uc0c1\uc774 \ub418\ub294 code\ub97c \ud3ec\ud568\ud558\ub294 shared library file\uc774\uace0 \ub450 \ubc88\uc9f8 \ud56d\ubaa9\uc740 Googletest\uc758 \uae30\ub2a5\uc744 static library\ub85c \ucef4\ud30c\uc77c \ud558\ub294 \uacfc\uc815\uc774\ub2e4. \uc0ac\uc2e4 googletest \ub514\ub809\ud1a0\ub9ac \uc548\uc5d0\ub294 \uc774\uac83 \uc678\uc5d0\ub3c4 \ub9ce\uc740 \uc18c\uc2a4\ud30c\uc77c\ub4e4\uc774 \ub4e4\uc5b4 \uc788\ub294\ub370, \uc2dc\ud5d8\ud574 \ubcf8 \ubc14\ub85c\ub294 gtest-all.cc\ub9cc\uc73c\ub85c\ub3c4 \ub3d9\uc791\uc5d0 \ubb38\uc81c\uac00 \uc5c6\ub294\uac83 \uac19\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\uc774\uc81c \ub9c8\uc9c0\ub9c9\uc73c\ub85c \ud14c\uc2a4\ud2b8 \ucf00\uc774\uc2a4\ub4e4\uacfc \uc774 \ud14c\uc2a4\ud2b8 \ucf00\uc774\uc2a4\ub4e4\uc744 \ud638\ucd9c\ud558\ub294 Test_Main.cpp\ub97c \uc791\uc131\ud558\uace0, \uc774 \ub54c \ud544\uc694\ud55c &#8220;\ub77c\uc774\ube0c\ub7ec\ub9ac_\uc774\ub984&#8221;\uacfc googletest_mian static \ub77c\uc774\ube0c\ub7ec\ub9ac\ub97c \ub9c1\ud06c\uc2dc\ucf1c\uc900\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Test_Main.cpp\ub294 \uc608\uc81c\uc5d0 \uc788\ub294\uac83\uc744 \uadf8\ub300\ub85c \uc0ac\uc6a9\ud588\ub294\ub370 \ub0b4\uc6a9\uc740 \ub2e4\uc74c\uacfc \uac19\ub2e4.<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"cpp\" data-enlighter-theme=\"eclipse\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"true\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">#include &lt;stdio.h>\n\n#include \"gtest\/gtest.h\"\n\nGTEST_API_ int main(int argc, char **argv) {\n  printf(\"Running main() from gtest_main.cc\\n\");\n  testing::InitGoogleTest(&amp;argc, argv);\n  return RUN_ALL_TESTS();\n}\n<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Gooletest\uc5d0\uc11c \uc0ac\uc6a9\ud558\ub294 \ud14c\uc2a4\ud2b8 \ucf00\uc774\uc2a4\ub97c \uc791\uc131\ud558\ub294 \ubc29\ubc95\ub4e4\uc740 \uc5ec\ub7ec \uacf3\uc5d0\uc11c \ucc3e\uc744 \uc218 \uc788\uc73c\ubbc0\ub85c \uc5ec\uae30\uc5d0\uc11c\ub294 \uc124\uba85\ud558\uc9c0 \uc54a\ub294\ub2e4.<\/p>\n\n\n\n<h1 class=\"wp-block-heading\">runtest.sh<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">\uc774\uc81c \ube4c\ub4dc\ub97c \uc218\ud589\ud558\uba74 \ub3d9\uc801 \ub77c\uc774\ube0c\ub7ec\ub9ac\uc778 <strong><em>lib\ub77c\uc774\ube0c\ub7ec\ub9ac_\uc774\ub984.so<\/em><\/strong>\uc640 <strong><em>testcases\u00a0<\/em><\/strong>\ud30c\uc77c\uc774 \ub9cc\ub4e4\uc5b4\uc9c4\ub2e4. \uc774\uac83\uc744 \uc2dc\ud5d8\ud558\ub824\uba74 \ub514\ubc14\uc774\uc2a4\uc5d0 push\ud55c \ub2e4\uc74c library \uacbd\ub85c\ub97c \uc124\uc815\ud574\uc8fc\uace0 \uc2e4\ud589\uc2dc\ucf1c\uc11c \uacb0\uacfc\ub97c \ubd10\uc57c \ud558\ub294\ub370, \ub9e4\ubc88 \uc2dc\ud5d8\ud560 \ub54c\ub9c8\ub2e4 \uc774 \uacfc\uc815\uc744 \ubc18\ubcf5\ud558\uae30\ub294 \ub9e4\uc6b0 \uadc0\ucc2e\ub2e4. \uc5ec\ub7ec\uac1c\uc758 so file\ub85c \ub098\ub220\uc11c \uc791\uc131\ud55c \uacbd\uc6b0\ub77c\uba74 \ub354\uc6b1 \uadf8\ub807\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\uadf8\ub798\uc11c \uc774 \uadc0\ucc2e\uc740 \uacfc\uc815\uc744 bash\ub85c \uc791\uc131\ud574 \ub450\uace0 Android Studio\uc758 External Tools \uae30\ub2a5\uc744 \uc774\uc6a9\ud574\uc11c \ubd80\ub97c \uc218 \uc788\ub3c4\ub85d \uc124\uc815\ud55c\ub2e4. (\ub2e8\ucd95\ud0a4 \uae4c\uc9c0 \ub2ec\uc544 \ub450\uba74 \ud6e8\uc52c \ud3b8\ud558\uaca0\uc9c0?)<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\uc6b0\uc120, \uadc0\ucc2e\uc740 \uc77c\uc744 \ud574\uc8fc\ub294 bash script\ub294 \ub2e4\uc74c\uacfc \uac19\ub2e4. \uc2e4\ud589\ud30c\uc77c \uc774\ub984\uacfc \ud568\uaed8 \uc0ac\uc6a9\ud560 \ub77c\uc774\ube0c\ub7ec\ub9ac \ud30c\uc77c\uc758 \ubaa9\ub85d\uc744 \uc778\uc790\ub85c \ubc1b\uc544\uc11c \ub514\ubc14\uc774\uc2a4\uc5d0 push\ud558\uace0 \ub77c\uc774\ube0c\ub7ec\ub9ac path\ub97c \uc7a1\uc544\uc11c \uc2e4\ud589\uc2dc\ud0a8\ub2e4.<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"shell\" data-enlighter-theme=\"eclipse\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"true\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">#!\/bin\/bash\n#\n# This script pushes specified gtest related files into devices'\n# \/cache\/xxx directory and runs it.\n#\n\nif [ \"$#\" -eq 0 ]; then\n    echo \"USAGE: ${0} exe_to_push [libs_to_push...]\"\n    exit 1\nfi\n\nexe=$1\nexedir=$exe\nlibs=$@\n\n# A directory at the device where binaries to be pushed.\nremote_dest_dir=\/cache\/${exedir}\n\n# A directory at local where binaries exist.\nlocal_src_dir=app\/src\/main\/libs\/armeabi-v7a\n\nadb wait-for-device\nadb shell rm -rf ${remote_dest_dir}\nadb shell mkdir ${remote_dest_dir}\n\n# Push libraries.\nfor lib in ${libs}\ndo\n    adb push ${local_src_dir}\/${lib} ${remote_dest_dir}\ndone\n\n# Push the executable then run.\nadb push ${local_src_dir}\/${exe} ${remote_dest_dir}\nadb shell chmod 755 ${remote_dest_dir}\/${exe}\nadb shell \"LD_LIBRARY_PATH=${remote_dest_dir} ${remote_dest_dir}\/${exe}\"<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\uc774\uc81c Android Studio\uc758 <em>File -&gt; Settings -&gt; Tools -&gt; External Tools<\/em> \uba54\ub274\uc5d0 runtest.sh\ub97c \ub4f1\ub85d\ud558\uc790.<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img loading=\"lazy\" decoding=\"async\" width=\"849\" height=\"495\" src=\"https:\/\/litcoder.com\/wp-content\/uploads\/2016\/07\/androidstudio_edittool.png\" alt=\"androidstudio_edittool\" class=\"wp-image-1497\" srcset=\"https:\/\/litcoder.com\/wp-content\/uploads\/2016\/07\/androidstudio_edittool.png 849w, https:\/\/litcoder.com\/wp-content\/uploads\/2016\/07\/androidstudio_edittool-300x175.png 300w, https:\/\/litcoder.com\/wp-content\/uploads\/2016\/07\/androidstudio_edittool-768x448.png 768w\" sizes=\"auto, (max-width: 849px) 100vw, 849px\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Program\uc740 script\ub97c \uc218\ud589 \uc2dc\ucf1c\uc904 bash.exe\uc758 \uc704\uce58\ub97c \uc9c0\uc815\ud574\uc8fc\uace0, Parameters\ub85c \uc2e4\ud589\ud560 script\uc778 runtest.sh\uc640 \u00a0\uc2e4\ud589\ud30c\uc77c\uc778 testcases \uadf8\ub9ac\uace0 \uad00\ub828\ub41c \ub77c\uc774\ube0c\ub7ec\ub9ac \ubaa9\ub85d\uc744 \uc801\uc5b4\uc900\ub2e4. \uc5ec\uae30\uc11c\ub294 lib\ub77c\uc774\ube0c\ub7ec_\uc774\ub984.so\uc5d0\ub9cc \uc758\uc874\ud55c\ub2e4\uace0 \uac00\uc815\ud588\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\uadf8\ub9ac\uace0 \ub9c8\uc9c0\ub9c9\uc73c\ub85c Working directory\ub294 project\uc758 \ucd5c\uc0c1\uc704 \ub514\ub809\ud1a0\ub9ac\ub97c \uc758\ubbf8\ud558\ub294 $ProjectFileDir$\uc744 \uc801\uc5b4 \uc900\ub2e4.<\/p>\n\n\n\n<h1 class=\"wp-block-heading\">\uc218\ud589\uacb0\uacfc<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">\uc9c0\uc815\ud55c \ub2e8\ucd95\ud0a4 \ud639\uc740 \uc704\uc758 \uc124\uc815\ub300\ub85c \ub77c\uba74 <em>Tools -&gt; Android -&gt; Run native test<\/em>\ub97c \uc2e4\ud589\uc2dc\ud0a4\uba74 \ub2e4\uc74c\uacfc \uac19\uc774 test case\ub4e4\uc774 \uc2e4\ud589\ub418\uace0 \uacb0\uacfc\uac00 \ucd9c\ub825\ub41c\ub2e4.<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img loading=\"lazy\" decoding=\"async\" width=\"770\" height=\"404\" src=\"https:\/\/litcoder.com\/wp-content\/uploads\/2016\/06\/androidstudio_runtest_result.png\" alt=\"androidstudio_runtest_result\" class=\"wp-image-1491\" srcset=\"https:\/\/litcoder.com\/wp-content\/uploads\/2016\/06\/androidstudio_runtest_result.png 770w, https:\/\/litcoder.com\/wp-content\/uploads\/2016\/06\/androidstudio_runtest_result-300x157.png 300w, https:\/\/litcoder.com\/wp-content\/uploads\/2016\/06\/androidstudio_runtest_result-768x403.png 768w\" sizes=\"auto, (max-width: 770px) 100vw, 770px\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Android Studio\ub294 \ub0b4 PC\uc5d0\uc11c \uc880 \ub290\ub9ac\uae34 \ud558\uc9c0\ub9cc, \ub2e4\ub978 IDE\ub4e4\uc5d0 \ube44\ud574\uc11c\ub294 Emacs key binding\uc774 \ube44\uad50\uc801 \uc798\ub418\uc5b4 \uc788\uc5b4\uc11c \ub9cc\uc871 \ud558\uba74\uc11c \uc870\uae08\uc529 \ubc30\uc6cc\uac00\uace0 \uc788\ub2e4. NDK\ub85c JNI\uc5d0\uc11c \ubd88\ub7ec\ub2e4 \uc4f8 native code\ub97c \uad6c\ud604\ud558\ub2e4 \ubcf4\ub2c8 Googletest\ub97c \uc0ac\uc6a9\ud558\uae30 \uc704\ud574 \ub9e4\ubc88 device\ub85c push \ud558\uace0 \uc2e4\ud589\ud558\ub294 \uacfc\uc815\uc774 \uaf64\ub098 \ubc88\uac70\ub85c\uc640\uc11c script\ub85c \ub9cc\ub4e4\uc5b4 \ubcf4\uc558\ub2e4. \uc774 \uae00\uc5d0\uc11c\ub294 Android Studio\uc5d0\uc11c Googletest\ub97c \uc0ac\uc6a9\ud558\uae30 \uc704\ud55c \uae30\ubcf8\uc801\uc778 \uc124\uc815\uacfc device\uc5d0 push\ud558\ub294 \uacfc\uc815\uc744 [&hellip;]<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_feature_clip_id":0,"_jetpack_memberships_contains_paid_content":false,"footnotes":"","jetpack_post_was_ever_published":false},"categories":[2],"tags":[12,59,61,88],"class_list":["post-1489","post","type-post","status-publish","format-standard","hentry","category-android","tag-androidstudio","tag-googletest","tag-gtest","tag-ndk"],"jetpack_sharing_enabled":true,"jetpack-related-posts":[{"id":1021,"url":"https:\/\/litcoder.com\/?p=1021","url_meta":{"origin":1489,"position":0},"title":"Emacs\uc5d0\uc11c Android \uac1c\ubc1c \ud658\uacbd \uc0ac\uc6a9","author":"litcoder","date":"2014\ub144 8\uc6d4 10\uc77c","format":false,"excerpt":"AOSP\uc5d0\ub294 Emacs\uc5d0\uc11c Android \uac1c\ubc1c\ud658\uacbd\uc744 \uc0ac\uc6a9\ud560 \uc218 \uc788\ub3c4\ub85d \uba87\uba87 el file\ub4e4\uc744 \uc81c\uacf5\ud558\ub294\ub370, platform \u00a0module build\ub97c \uc8fc\ub85c \ud558\uac8c \ub418\ub294 \ub098\ub85c\uc368\ub294 \uc0ac\uc6a9\uc5d0 \ubd80\uc871\ud568\uc774 \uc5c6\ub294 \uac83 \uac19\ub2e4. Module build\uc640 \uae30\ubcf8\uc801\uc778 ADB \uc870\uc791\uc744 \uc9c0\uc6d0\ud558\ub294 \uc774 script\ub4e4\uc758 \uae30\ub2a5\uc774 \ubd80\uc871\ud558\ub2e4\uace0 \ub290\ub080\ub2e4\uba74 Android \uac1c\ubc1c\ud658\uacbd\uc744 \ubcf4\ub2e4 \uc801\uadf9\uc801\uc73c\ub85c \uc9c0\uc6d0\ud558\ub294\u00a0android-mode\uc640 \uac19\uc740 project\ub97c \uace0\ub824\ud574 \ubcf4\ub294\uac83\ub3c4 \uc88b\uc744 \uac83\uc774\ub2e4. buildspec.mk \uc124\uc815 \uc0ac\uc2e4 \uc774 \uae30\ub2a5\uc740\u2026","rel":"","context":"&quot;Android&quot;\uc5d0\uc11c","block_context":{"text":"Android","link":"https:\/\/litcoder.com\/?cat=2"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":1034,"url":"https:\/\/litcoder.com\/?p=1034","url_meta":{"origin":1489,"position":1},"title":"Android emacs (android-host.el) \uae30\ub2a5 \ucd94\uac00","author":"litcoder","date":"2014\ub144 8\uc6d4 27\uc77c","format":false,"excerpt":"AOSP\uc5d0\uc11c \uc81c\uacf5\ub418\ub294 Emacs\uc6a9 Andorid \uac1c\ubc1c\ud658\uacbd\uc744 \uc124\uc815\ud55c \uc774\ud6c4(\uc774 post \ucc38\uc870) \uc798 \ubaa8\ub974\ub294 LISP\uc744 \ub354\ub4ec\uc5b4 \uac00\uba70 \ucd94\uac00\ud55c \uba87 \uac00\uc9c0 \uae30\ub2a5\uc744 \uc18c\uac1c\ud569\ub2c8\ub2e4. adb reboot (M-x android-adb-reboot) Module\ub4f1\uc744 \ubcc0\uacbd\ud55c \ud6c4\uc5d0 device\ub97c reset\ud558\ub294 \uba85\ub839\uc5b4\uac00 \uc5c6\uc5b4\uc11c \ucd94\uac00\ud588\ub2e4. \uc774 \uae30\ub2a5\uc758 \uc7a5\uc810\uc744 \uad73\uc774 \uaf3d\uc790\uba74 shell\uc744 \ub530\ub85c \ub6f0\uc6b0\uc9c0 \uc54a\uace0 \ub9ac\ubd93\uc744 \ud560\uc218 \uc788\ub2e4\ub294\uac70... (defun android-adb-reboot () \"Execute 'adb reboot'.\" (interactive)\u2026","rel":"","context":"&quot;Android&quot;\uc5d0\uc11c","block_context":{"text":"Android","link":"https:\/\/litcoder.com\/?cat=2"},"img":{"alt_text":"icon_text_file","src":"https:\/\/i0.wp.com\/litcoder.com\/wp-content\/uploads\/2014\/08\/1408382052_12.File_.png?resize=350%2C200","width":350,"height":200},"classes":[]},{"id":3322,"url":"https:\/\/litcoder.com\/?p=3322","url_meta":{"origin":1489,"position":2},"title":"GitHub release\uc5d0 \ubc14\uc774\ub108\ub9ac \ucca8\ubd80 \uc790\ub3d9\ud654","author":"litcoder","date":"2024\ub144 1\uc6d4 1\uc77c","format":false,"excerpt":"GitHub\uc5d0\uc11c release\ub97c \uc0dd\uc131\ud558\uba74 source code\uc758 snapshot\uc774 zip\uacfc tar.gz\ub85c \uc800\uc7a5\ub41c\ub2e4. \uc5ec\uae30\uc5d0 \ucd94\uac00\ud574\uc11c \ucef4\ud30c\uc77c\ub41c \uacb0\uacfc\uac00 \uc790\ub3d9\uc73c\ub85c \ucd94\uac00\ud558\ub3c4\ub85d \ud55c\ub2e4\uba74, \uac04\ub2e8\ud788 source code\uc640 \uc5f0\uacc4\ub41c \ubc14\uc774\ub108\ub9ac\ub3c4 \ud568\uaed8 \ubc30\ud3ec\ud560 \uc218 \uc788\uc744 \uac83\uc774\ub2e4. \uc774 \uae00\uc5d0\uc11c\ub294 \uc548\ub4dc\ub85c\uc774\ub4dc \ud504\ub85c\uc81d\ud2b8\ub97c \uac00\uc815\ud574\uc11c release\ub97c \uc0dd\uc131\ud560 \ub54c \uc548\ub4dc\ub85c\uc774\ub4dc APK\ub97c \ube4c\ub4dc\ud558\uace0 source code\uc640 \ud568\uaed8 \ubc30\ud3ec\ud558\ub294 \uac04\ub2e8\ud55c workflow\ub97c \uc124\uba85\ud55c\ub2e4. \uc804\uccb4 \ucf54\ub4dc Event trigger on: release:\u2026","rel":"","context":"&quot;Android&quot;\uc5d0\uc11c","block_context":{"text":"Android","link":"https:\/\/litcoder.com\/?cat=2"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/litcoder.com\/wp-content\/uploads\/2024\/01\/github_workflow_release_attached-e1704114929383.png?resize=350%2C200&ssl=1","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/litcoder.com\/wp-content\/uploads\/2024\/01\/github_workflow_release_attached-e1704114929383.png?resize=350%2C200&ssl=1 1x, https:\/\/i0.wp.com\/litcoder.com\/wp-content\/uploads\/2024\/01\/github_workflow_release_attached-e1704114929383.png?resize=525%2C300&ssl=1 1.5x, https:\/\/i0.wp.com\/litcoder.com\/wp-content\/uploads\/2024\/01\/github_workflow_release_attached-e1704114929383.png?resize=700%2C400&ssl=1 2x"},"classes":[]},{"id":1337,"url":"https:\/\/litcoder.com\/?p=1337","url_meta":{"origin":1489,"position":3},"title":"MinnowboardMAX\uc5d0 Android \uc62c\ub824 \ubcf8 \ub0b4\uc6a9 \uc815\ub9ac","author":"litcoder","date":"2015\ub144 9\uc6d4 19\uc77c","format":false,"excerpt":"Android \/ Chromium OS \/ Windows\ub97c \uc62c\ub824 \ubcfc \uc218 \uc788\ub294 Intel Baytrail \uae30\ubc18\uc758 \uac1c\ubc1c\ubcf4\ub4dc\uc778 MinnowboardMAX\uc5d0 Android 5.1\uc744 install\ud558\ub294 \uacfc\uc815\uc744 \uc124\uba85\ud55c\ub2e4. \ud544\uc694\ud55c \uac83 \ub4e4 Minnowboard MAX - \ud310\ub9e4\ud558\ub294 \uacf3, 2015\ub144 9\uc6d4 \ud604\uc7ac \uad6d\ub0b4\uc5d0\uc11c \ud310\ub9e4\ud558\ub294 \uacf3\uc740 \uc5c6\ub294\uac83 \uac19\ub2e4. FTDI cable - Serial \ucd9c\ub825\uc744 PC\uc5d0\uc11c \ubc1b\uae30 \uc704\ud574 guide \ubb38\uc11c\uc5d0\ub294 TTL-232R\uc744 \uc0ac\uc6a9\ud558\ub77c\uace0 \u00a0\ub098\uc640 \uc788\ub294\ub370\u2026","rel":"","context":"&quot;Android&quot;\uc5d0\uc11c","block_context":{"text":"Android","link":"https:\/\/litcoder.com\/?cat=2"},"img":{"alt_text":"minnowboardMAX_connection","src":"https:\/\/i0.wp.com\/litcoder.com\/wp-content\/uploads\/2015\/09\/minnowboardMAX_connection.png?resize=350%2C200","width":350,"height":200},"classes":[]},{"id":3847,"url":"https:\/\/litcoder.com\/?p=3847","url_meta":{"origin":1489,"position":4},"title":"Raspberry Pi 5\uc5d0 \uac04\ub2e8\ud55c Linux \uc2dc\uc2a4\ud15c \uc62c\ub9ac\uae30","author":"litcoder","date":"2025\ub144 12\uc6d4 3\uc77c","format":false,"excerpt":"\uc774 \ud3ec\uc2a4\ud305\uc5d0\uc11c\ub294 Raspberry pi 5(RPi5)\uc5d0 \uc544\uc8fc \ub2e8\uc21c\ud55c \ub9ac\ub205\uc2a4 \uc2dc\uc2a4\ud15c\uc744 \uad6c\uc131\ud574\uc11c \ubd80\ud305\ud574 \ubcf4\ub294 \uacfc\uc815\uc744 \ub2e4\ub8ec\ub2e4. Ubuntu 24.04 \uac1c\ubc1c\ud658\uacbd\uc5d0\uc11c RPi5\ub97c \uc704\ud55c u-boot, Linux, Busybox\ub97c \uc124\uc815\ud558\uace0 \ubd80\ud305\ud574 \ubcfc \uac83\uc774\ub2e4. SD card \uc900\ube44 SD card\ub97c \uac1c\ubc1c \ud638\uc2a4\ud2b8 \uba38\uc2e0\uc5d0 \uc0bd\uc785\ud558\uace0 lsblk \uba85\ub839\uc5b4\ub85c \uc5f0\uacb0\ub41c \ub514\ubc14\uc774\uc2a4\ub4e4\uc744 \ud655\uc778\ud55c\ub2e4. \uc704\uc758 \uc608\uc81c\uc5d0\uc11c SD card\ub294 mmclbk0\uc774\ub2e4. \uc800\uc7a5\uacf5\uac04\uc758 \ud06c\uae30\ub97c \ud1b5\ud574 \uad6c\ubd84\ud558\uac70\ub098 SD\u2026","rel":"","context":"&quot;Linux&quot;\uc5d0\uc11c","block_context":{"text":"Linux","link":"https:\/\/litcoder.com\/?cat=4"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/litcoder.com\/wp-content\/uploads\/2025\/11\/u-boot-lsblk.png?resize=350%2C200&ssl=1","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/litcoder.com\/wp-content\/uploads\/2025\/11\/u-boot-lsblk.png?resize=350%2C200&ssl=1 1x, https:\/\/i0.wp.com\/litcoder.com\/wp-content\/uploads\/2025\/11\/u-boot-lsblk.png?resize=525%2C300&ssl=1 1.5x"},"classes":[]},{"id":1475,"url":"https:\/\/litcoder.com\/?p=1475","url_meta":{"origin":1489,"position":5},"title":"Android recovery image \ube4c\ub4dc \uc124\uc815","author":"litcoder","date":"2022\ub144 3\uc6d4 5\uc77c","format":false,"excerpt":"1. BoardConfig.mk \uc218\uc815 TARGET_NO_KERNEL\uacfc TARGET_NO_RECOVERY\uac00 true\ub85c \uc124\uc815\ub418\uc5b4 \uc788\ub2e4\uba74 \uc124\uc815\ud55c\ub2e4. 2. device.mk \uc218\uc815 TARGET_PREBUILT_KERNEL\uad00\ub828 \uc124\uc815\uc744 \uc0ad\uc81c\ud55c\ub2e4. 3. AndroidBoard.mk \ucd94\uac00 Kernel build \ub420 \ub54c \ucc38\uace0\ub418\ub294 \ud30c\uc77c\uc774\ubbc0\ub85c \ucd94\uac00\ud574 \uc8fc\uace0 KERNEL_DEFCONFIG\ub4f1\uc758 \uc124\uc815\uc744 \uc790\uc2e0\uc5d0 \ub9de\uac8c \ubcc0\uacbd\ud574 \uc900\ub2e4. 4. AndroidKernel.mk \ucd94\uac00 AndroidKernel.mk\ub294 kernel build\ub97c \uc704\ud55c makefile script\uc774\ub2e4. 5. defconfig file \uacbd\ub85c\ubcc0\uacbd defconfig file\uc774 \ucc38\uc870\ub420 \uc218 \uc788\ub3c4\ub85d\u2026","rel":"","context":"&quot;Android&quot;\uc5d0\uc11c","block_context":{"text":"Android","link":"https:\/\/litcoder.com\/?cat=2"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]}],"jetpack_featured_media_url":"","_links":{"self":[{"href":"https:\/\/litcoder.com\/index.php?rest_route=\/wp\/v2\/posts\/1489","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/litcoder.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/litcoder.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/litcoder.com\/index.php?rest_route=\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/litcoder.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=1489"}],"version-history":[{"count":7,"href":"https:\/\/litcoder.com\/index.php?rest_route=\/wp\/v2\/posts\/1489\/revisions"}],"predecessor-version":[{"id":3625,"href":"https:\/\/litcoder.com\/index.php?rest_route=\/wp\/v2\/posts\/1489\/revisions\/3625"}],"wp:attachment":[{"href":"https:\/\/litcoder.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=1489"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/litcoder.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=1489"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/litcoder.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=1489"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}