Why should I know this?

AOSP build 후 Linux에서 dex 실행 해보기 본문

Knowledge/Android

AOSP build 후 Linux에서 dex 실행 해보기

die4taoam 2022. 12. 28. 04:53

모종의 이유로 Linux에서 AOSP를 빌드한 후 DEX를 실행하고 싶다면 이 글이 도움이 될 겁니다.

 

먼저 Linux에서 AOSP를 빌드할 때 사용하시는 컴퓨터에 맞는 아키텍처로 빌드하세요.

아직까지 AOSP는 x86에서만 빌드할 수 있으므로 x86_64를 선택하시면 될겁니다.

 

dalvikvm을 실행하기 위한 스크립트 :

#!/bin/sh
# base directory, at top of source tree; replace with absolute path
base=`pwd`
# configure root dir of interesting stuff
root=$base/out/target/product/generic_x86_64/system
export ANDROID_ROOT=$root
# configure bootclasspath
bootpath=$root/framework
export BOOTCLASSPATH=/system/framework/core-oj.jar:/system/framework/core-libart.jar:/system/framework/conscrypt.jar:/system/framework/okhttp.jar:/system/framework/bouncycastle.jar:/system/framework/apache-xml.jar:/system/framework/ext.jar:/system/framework/framework.jar:/system/framework/telephony-common.jar:/system/framework/voip-common.jar:/system/framework/ims-common.jar:/system/framework/android.hidl.base-V1.0-java.jar:/system/framework/android.hidl.manager-V1.0-java.jar:/system/framework/framework-oahl-backward-compatibility.jar:/system/framework/android.test.base.jar
# this is where we create the dalvik-cache directory; make sure it exists
export ANDROID_DATA=/tmp/dalvik_$USER
mkdir -p $ANDROID_DATA/dalvik-cache
exec $root/bin/dalvikvm $@

aosp 를 빌드하고 나면

out/target/product/generic_x86_64/system 같은 경로가 생성됐을 겁니다.

중요한 것은 이 경로에는 framework 가 반드시 존재해야 합니다.

 

system 경로를 통채로 root로 복사합니다.

이렇게 하는 이유는 위에 보다시피 BOOTCLASSPATH를 지정해줘야 하는데, 이 값을 복붙할 원본이 /system 경로를 기반으로 되어 있어서 입니다.

 

cp -R out/target/product/generic_x86_64/system /system

 

그럼 이제 BOOTCLASSPATH 를 긁어와야 합니다. 위 env.sh 에서 export BOOTCLASSPATH= 다음에 오는 부분입니다.이 내용은 out/target/product/generic_x86_64/root/init.environ.rc 파일에 존재합니다.

 

grep "BOOTCLASS" -nR out/target/product/generic_x86_64/ --include=*.rc

 

위 명령으로 검색할 수 있습니다.

out/target/product/generic_x86_64/root/init.environ.rc:10:    export BOOTCLASSPATH /system/framework/core-oj.jar:/system/framework/core-libart.jar:/system/framework/conscrypt.jar:/system/framework/okhttp.jar:/system/framework/bouncycastle.jar:/system/framework/apache-xml.jar:/system/framework/ext.jar:/system/framework/framework.jar:/system/framework/telephony-common.jar:/system/framework/voip-common.jar:/system/framework/ims-common.jar:/system/framework/android.hidl.base-V1.0-java.jar:/system/framework/android.hidl.manager-V1.0-java.jar:/system/framework/framework-oahl-backward-compatibility.jar:/system/framework/android.test.base.jar

 

이 파일이 기기가 부팅될 때 안드로이드를 부팅시키는 init script 중에 하나입니다.

위 export BOOTCLASSPATH를 env.sh 처럼 복붙해주면 됩니다.

 

그외 ANDROID_DATA는 캐쉬이므로 신경쓰지 않아도 됩니다.

 

이제 apk 를 만들어 봅시다.

dalvikvm 은 dex 파일은 실행하지 못합니다. 그러므로 귀찮더라도 apk를 만들어줘야 합니다.

 

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

먼저 헬로 월드를 만듭니다! HelloWorld.java 로 만드셔야 합니다.

다음 명령으로 apk를 만들 수 있습니다.

 

javac HelloWorld.java
dx --dex --output=classes.dex HelloWorld.class
zip HelloWorld.zip classes.dex

zip = apk 입니다.

dx 는 ./prebuilts/sdk/tools/dx 경로에 존재합니다.

이제 실행하면 됩니다.

 

m@n2:~/aosp$ ./env.sh -cp HelloWorld.zip HelloWorld
Hello World!

 

이상입니다.

 

Comments