안드로이드에서 자바 메인 함수 실행하기

2024. 2. 14. 20:46모바일프로그래밍

728x90

디바이스 스크린을 캡쳐 하는 것은 어떤 권한(privilege)이 요구 되는 데, shell에 권하는 주는 것입니다.
안드로이드 shell로 adb shell에서 app_process 호출을 통해 자바코드의 실행이 가능합니다.

 

Introducing scrcpy · ~rom1v/blog

Introducing scrcpy 08 Mar 2018 I developed an application to display and control Android devices connected on USB. It does not require any root access. It works on GNU/Linux, Windows and Mac OS. It focuses on: lightness (native, displays only the device sc

blog.rom1v.com

Hello, world!

다음 간단한 자바 애플리케이션입니다.

public class HelloWorld {
    public static void main(String... args) {
        System.out.println("Hello, world!");
    }
}


컴파일하고 dex 파일을 만듭니다:

javac -source 1.7 -target 1.7 HelloWorld.java
"$ANDROID_HOME"/build-tools/27.0.2/dx \
    --dex --output classes.dex HelloWorld.class



그런다음, 우리는 안드로이드 장비에 classes.dex 파일을 푸쉬합니다.

adb push classes.dex /data/local/tmp/



그리고 실행해 봅시다:

$ adb shell CLASSPATH=/data/local/tmp/classes.dex app_process / HelloWorld
$ Hello, world!

 

안드로이드 프레임워크 접근하기

애플리케이션이 런타임상에서 안드로이드 프레임워크를 접근 할 수 있습니다.
예를 들어, android.os.SystemClock을 사용해 봅시다:

import android.os.SystemClock;

public class HelloWorld {
    public static void main(String... args) {
        Systehttp://m.out.print("Hello,");
        SystemClock.sleep(1000);
        System.out.println(" world!");
    }
}

android.jar로 우리의 클래스를 링크합니다:

javac -source 1.7 -target 1.7 -cp "$ANDROID_HOME"/platforms/android-27/android.jar
    HelloWorld.java


앞선 예제처럼 프로그램을 실행합니다.

또 scrcpy가 프레임워크에 숨겨진 메서드들(hidden methods)에 대한 접근이 필요합니다.
이런 경우에는 android.jar에 대한 링킹만으로 불충분하므로, 리플렉션을 사용합니다.

APK와 함께

실행은 classes.dex가 zip/jar 내에 포함되어 있어도 동작 할 수 있습니다:

jar cvf hello.jar classes.dex
adb push hello.jar /data/local/tmp/
adb shell CLASSPATH=/data/local/tmp/hello.jar app_process / HelloWorld


classes.dex 파일을 포함하는 zip 예제를 뭐라고 하는지 아시나요? APK 라고 하죠~!
그러므로, 메인 메서드가 있는 클래스를 포함하는 어떤 종류의 설치 APK도 가능합니다:

$ adb install myapp.apk
…
$ adb shell pm path my.app.package
package:/data/app/my.app.package-1/base.apk
$ adb shell CLASSPATH=/data/app/my.app.package-1/base.apk \
    app_process / HelloWorld
728x90