AOSP build 후 Linux에서 dex 실행 해보기
모종의 이유로 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!
이상입니다.