programing

전화기의 터미널에서 실행할 수 있는 네이티브 안드로이드 바이너리를 컴파일하고 싶습니다.

muds 2023. 9. 3. 16:37
반응형

전화기의 터미널에서 실행할 수 있는 네이티브 안드로이드 바이너리를 컴파일하고 싶습니다.

저는 며칠 동안 터미널 애플리케이션을 사용하여 제 전화기에서 실행될 네이티브 ARM Android 바이너리를 컴파일하려고 했습니다.저는 ls, mkdir 등과 같이 전화기에 설치된 표준 Posix 바이너리와 동일한 유형의 바이너리를 생성하고 싶습니다.저는 Mac OS X에서 Android NDK를 다운로드하여 간단한 ELF 바이너리를 오류 없이 컴파일할 수 있었습니다.하지만 제가 전화기로 전송할 때는 항상 고장이 납니다.즉, GCC에서 -static으로 컴파일할 때 segfault가 발생합니다.제가 -static을 사용하지 않으면, 그들은 연결되지 않는다고 불평합니다.간단히 말해서, 그들은 작동하지 않습니다.

제 가설은 그들이 안드로이드 표준 C 라이브러리에 제대로 연결되어 있지 않다는 것입니다.제 바이너리를 NDK에서 제공하는 libc와 연결하고 있지만 여전히 작동하지 않습니다.안드로이드가 바이오닉 C 라이브러리를 사용한다는 것을 읽고 소스를 다운로드하려고 했지만, 어떻게 라이브러리를 구축해야 하는지 잘 모르겠습니다(모두 ARM 어셈블리인 것 같습니다).

전화기에 있는 안드로이드 C 라이브러리가 안드로이드 NDK와 다른 것이 사실입니까?NDK에 포함된 것은 터미널을 통해 실행할 수 있는 네이티브 바이너리를 컴파일하는 것을 허용하지 않습니까?여기서 안내해 주시면 대단히 감사하겠습니다!

업데이트:

저는 마침내 이것을 Mac OS X에서 GCC 4.7.0을 사용하여 작동하게 되었습니다. 저는 바이오닉 헤더를 다운로드한 다음 안드로이드 NDK와 함께 제공되는 C 라이브러리를 사용하여 동적으로 연결된 바이너리를 컴파일했습니다.저는 전화기의 클립(바이너리는 33K)을 사용하여 전화기에서 작동하는 테스트 앱을 얻을 수 있었습니다.저는 또한 NDK의 C 라이브러리와 정적으로 연결하려고 노력했고, 그것도 효과가 있었습니다.

이 모든 것을 작동시키기 위해 -nostdlib를 GCC에 전달한 다음 수동으로 crtbegin_dynamic.o 및 crtend_android.o를 GCC 명령줄에 추가해야 했습니다.다음과 같은 방식으로 작동합니다.

$CC \
$NDK_PATH/usr/lib/crtbegin_dynamic.o \
hello.c -o hello \
$CFLAGS \
$NDK_PATH/usr/lib/crtend_android.o

정적 이진 파일의 경우 "crtbegin_static.o"를 사용합니다.이는 crtbegin_dynamic에서 설명합니다.S/crtbegin_static.S 출처.

이 실험을 위해 저는 플레인 'ol GCC 4.7.0과 Binutils 2.22만 사용했습니다.저는 또한 GCC를 newlib로 컴파일했지만, 실제로 제 ARM 바이너리를 newlib와 전혀 연결하지 않고 있습니다.나는 GCC/ld가 Android NDK와 함께 제공되는 libc에 직접 연결하거나 동적 바이너리의 경우 전화기의 libc에 연결하도록 강요하고 있습니다.

Android-ndk를 사용하면 됩니다.이렇게 Android.mk 을 구축합니다.include $(BUILD_EXECUTABLE) 입니다.NI .lib 대신 실행 파일을 구축하도록 지시하는 것입니다.

Android.mk

ifneq ($(TARGET_SIMULATOR),true)

LOCAL_PATH:= $(call my-dir)

include $(CLEAR_VARS)

LOCAL_CFLAGS += -Wall


LOCAL_LDLIBS := -L$(LOCAL_PATH)/lib -llog -g

LOCAL_C_INCLUDES := bionic
LOCAL_C_INCLUDES += $(LOCAL_PATH)/include

LOCAL_SRC_FILES:= main.cpp

LOCAL_MODULE := mycmd

include $(BUILD_EXECUTABLE)

endif  # TARGET_SIMULATOR != true

먼저 NDK가 있는지 확인합니다.

http://developer.android.com/tools/sdk/ndk/index.html

전화기의 C 이진 파일을 컴파일하는 가장 쉬운 방법은 다음과 같습니다.

http://developer.android.com/tools/sdk/ndk/index.html

http://www.kandroid.org/ndk/docs/STANDALONE-TOOLCHAIN.html

일반적으로 $NDK(다른 값일 수 있음) =

Linux:

/home/<user>/tft-ndk

Mac OS X:

/사용자/<user>/tft-ndk

터미널 내:

# create tool-chain - one line
# New method in ndk 12.
$NDK/build/tools/make_standalone_toolchain.py --arch arm --install-dir=/tmp/my-android-toolchain
# Old method.
#$NDK/build/tools/make-standalone-toolchain.sh --platform=android-3 --install-dir=/tmp/my-android-toolchain

# add to terminal PATH variable
export PATH=/tmp/my-android-toolchain/bin:$PATH

# make alias CC be the new gcc binary
export CC=arm-linux-androideabi-gcc

# compile your C code(I tried hello world)
$CC -o foo.o -c foo.c

# push binary to phone
adb push foo.o /data/local/tmp

# execute binary
adb /data/local/tmp/foo.o

Android NDK와 함께 CMake를 사용하는 것은 Android 콘솔 응용 프로그램을 컴파일하는 좋은 방법입니다.

CmakeAndroid-cmake를 다운로드합니다(이렇게 설정).프로그램 이름이 main.c이면 파일에 다음을 기록합니다.CMakeLists.txt:

project(test)
cmake_minimum_required(VERSION 2.8)
add_executable(test ./main.c)

그리고 실행cmake -DCMAKE_TOOLCHAIN_FILE=$ANDTOOLCHAIN .

프로그램에 되고, Makefile, Makefile을 할 수 .make당신의 것을 가지다test실행 가능한

Cmake에서는 툴체인 파일을 사용하여 크로스 빌드할 수 있습니다.

Google 개발자:

cmake \
    -DCMAKE_TOOLCHAIN_FILE=$NDK/build/cmake/android.toolchain.cmake \
    -DANDROID_ABI=$ABI \
    -DANDROID_PLATFORM=android-$MINSDKVERSION \
    $OTHER_ARGS

Cmake에는 자체 NDK 지원 기능이 내장되어 있습니다.CMake 3.21 이전 버전에서는 Android에서 이 워크플로우를 지원하지 않으며 새 NDK 릴리스에서는 종종 중단됩니다.CMake 3.21부터는 구현이 병합됩니다.

cmake 3.21부터 다음을 수행할 수 있습니다.

mkdir build
cd build
cmake ..
  -DCMAKE_SYSTEM_NAME=Android
  -DCMAKE_SYSTEM_VERSION=23 # API level. optional, recommanded
  -DCMAKE_ANDROID_NDK=path/to/ndk
  -DCMAKE_ANDROID_ARCH=arm # optional, recommanded
  -DCMAKE_ANDROID_ARCH_ABI=armeabi # optional, recommanded

부분은 과 같습니다.<line feed>는 이스케이프되지 . 이 하지 마십시오. 이 명령어를 할 수 없습니다.

변수, 가능한 값 및 결정 알고리즘에 대한 자세한 내용은 NDK를 사용한 Android용 교차 컴파일을 참조하십시오.

안드로이드 트릭 블로그에서 언급한 것처럼 agcc 래퍼가 도움이 될 수 있는지 시도해 보세요.블로그 게시물에 따르면 바이오닉 라이브러리를 사용하고 싶지만 별도로 컴파일된 버전이 아닌 이미 전화기에 설치된 라이브러리를 사용하고 있습니다.

언급URL : https://stackoverflow.com/questions/10798357/want-to-compile-native-android-binary-i-can-run-in-terminal-on-the-phone

반응형