안드로이드 앱을 윈도우에서 돌려보고 싶어서 이전에는 WSA를 썼는데 최근 들어 윈도우 업데이트가 휙휙바껴서
뭔가 실행이 안된다.
따라서 WSL2에서 waydroid를 쓰면 안드로이드 앱 실행이 가능하다고 해서 설치해보려고 한다.
sudo apt update
sudo apt install build-essential flex bison libssl-dev libelf-dev bc pahole dwarves -y
git clone --depth=1 https://github.com/microsoft/WSL2-Linux-Kernel.git
일단 WSL2에서 사용할 커널을 바꿔줘야 한다고 한다.
그 이유는 waydroid는 android컨테이너를 돌리려면 binder드라이버가 필요하고
MS 기본 커널은 binder가 빠져있다고 한다.
따라서 binder 포함된 커널로 교체하면 된다고 한다.
cd WSL2-Linux-Kernel
gunzip config.gz
mv config .config
sudo apt install cpio -y
현재 커널의 config 를 복사한다.
scripts/config --enable CONFIG_ANDROID
scripts/config --enable CONFIG_ANDROID_BINDER_IPC
scripts/config --enable CONFIG_ANDROID_BINDERFS
scripts/config --enable CONFIG_ANDROID_BINDER_DEVICES="binder,hwbinder,vndbinder"
상기의 네 줄로 binder관련 옵션을 활성화 가능하다고 한다.
make -j$(nproc)
로 빌드를 시작한다. 내 CPU는 8코어 16스레드니까 16개의 잡이 병렬로 돌아가게 된다.
cp arch/x86/boot/bzImage /mnt/c/Users/admin/wsl-kernel-binder
상기의 커맨드로 커널파일을 윈도우 디렉터리로 복사하고
notepad .wslconfig
[wsl2]
memory=48GB
processors=7
swap=64GB
localhostForwarding=true
kernel=C:\Users\admin\wsl-kernel-binder
이런 식으로 하면 된다.
wsl --shutdown
cd ~/WSL2-Linux-Kernel
sudo make modules_install
sudo mkdir -p /dev/binderfs
sudo mount -t binder binder /dev/binderfs
ls /dev/binderfs

상기와 같이 디바이스들이 보여야 한다고 한다.
sudo waydroid init -s GAPPS

sudo waydroid container start
sudo modprobe bridge
sudo modprobe ip_tables
sudo modprobe iptable_filter
sudo modprobe iptable_nat
sudo modprobe iptable_mangle
sudo modprobe xt_MASQUERADE
sudo modprobe xt_CHECKSUM
waydroid session start
waydroid status

이제 GUI를 보기 위해 wayland 서버를 설치한다.
sudo apt install weston -y
export XDG_RUNTIME_DIR=/run/user/$(id -u)
mkdir -p $XDG_RUNTIME_DIR
weston --backend=x11-backend.so &
waydroid show-full-ui

다음과 같이 화면이 보인다.
하지만 다음 방법은 WSL 세션을 끄고 재시작 할 때 환경변수가 날라가서 좋지 않다.
sudo tee /etc/profile.d/waydroid-init.sh << 'EOF'
#!/bin/bash
# 모듈 로드
sudo modprobe bridge 2>/dev/null
sudo modprobe ip_tables 2>/dev/null
sudo modprobe iptable_filter 2>/dev/null
sudo modprobe iptable_nat 2>/dev/null
sudo modprobe iptable_mangle 2>/dev/null
sudo modprobe xt_MASQUERADE 2>/dev/null
sudo modprobe xt_CHECKSUM 2>/dev/null
# binderfs 마운트
mountpoint -q /dev/binderfs || sudo mount -t binder binder /dev/binderfs 2>/dev/null
# 네트워크 시작
sudo /usr/lib/waydroid/data/scripts/waydroid-net.sh start 2>/dev/null
EOF
sudo chmod +x /etc/profile.d/waydroid-init.sh
sudo tee /etc/wsl.conf << 'EOF'
[boot]
command=/root/waydroid-boot.sh
EOF
sudo tee /root/waydroid-boot.sh << 'EOF'
#!/bin/bash
modprobe bridge
modprobe ip_tables
modprobe iptable_filter
modprobe iptable_nat
modprobe iptable_mangle
modprobe xt_MASQUERADE
modprobe xt_CHECKSUM
mount -t binder binder /dev/binderfs
/usr/lib/waydroid/data/scripts/waydroid-net.sh start
EOF
sudo chmod +x /root/waydroid-boot.sh
sudo service dbus start && sudo waydroid container start &
sleep 2
waydroid session start &
sleep 3
waydroid show-full-ui

다음과 같이 playstore 에서 문제가 있는 것을 발견했다.
sudo waydroid shell
ANDROID_RUNTIME_ROOT=/apex/com.android.runtime ANDROID_DATA=/data ANDROID_TZDATA_ROOT=/apex/com.android.tzdata ANDROID_I18N_ROOT=/apex/com.android.i18n sqlite3 /data/data/com.google.android.gsf/databases/gservices.db "select * from main where name = \"android_id\";"

로 나온 숫자를 복사해서
https://www.google.com/android/uncertified
상기의 링크에서 등록하면 된다고 한다.

waydroid session stop
sudo waydroid container stop
sudo waydroid container start &
waydroid session start &
sleep 3
waydroid show-full-ui

잘된다.

잘된다.
이제 매번 킬 때 마다 커맨드 치는 것은 귀찮으니까
# 부트 스크립트에 dbus 추가
sudo tee /root/waydroid-boot.sh << 'EOF'
#!/bin/bash
service dbus start
modprobe bridge
modprobe ip_tables
modprobe iptable_filter
modprobe iptable_nat
modprobe iptable_mangle
modprobe xt_MASQUERADE
modprobe xt_CHECKSUM
mount -t binder binder /dev/binderfs
/usr/lib/waydroid/data/scripts/waydroid-net.sh start
waydroid container start &
EOF
sudo chmod +x /root/waydroid-boot.sh
echo 'alias android="waydroid session start & sleep 3 && waydroid show-full-ui"' >> ~/.bashrc
source ~/.bashrc
이제 android라는 커맨드 딱 하나만 치면 된다.
sudo apt update
sudo apt install kmod
sudo ln -sf /bin/kmod /usr/sbin/modprobe
modprobe --version
sudo ln -sf /bin/kmod /sbin/modprobe
sudo ln -sf /bin/kmod /bin/modprobe
sudo waydroid init -s GAPPS -f
위의 설치과정은 살짝 불완전 했던거 같다.
waydroid session stop
sudo waydroid prop set persist.waydroid.gpu_mode swiftshader
echo "alias android='waydroid session start & waydroid show-full-ui'" >> ~/.bashrc
source ~/.bashrc
다음과 같이 렌더링 방식을 변경하면 된다고 한다.
이제 android 명령어로 실행해보면 된다.
잘된다.

이제 ARM 기반 번역기가 필요한다고 한다.
sudo apt update
sudo apt install git lzip python3-venv -y
cd ~
git clone https://github.com/casualsnek/waydroid_script
cd waydroid_script
python3 -m venv venv
source ./venv/bin/activate
pip install -r requirements.txt
python main.py


libhoudini를 선택한다. 스페이스바가 선택이다 선택하고 엔터친다.
이제 다시 android 커맨드를 쳐서 실행되는지 확인한다.
이제
waydroid session stop
sudo waydroid prop set persist.waydroid.gpu_mode virgl
로 렌더링 방식을 변경해본다.
아 근데 소리가 안나온다.
sudo apt install pulseaudio -y
nano /etc/pulse/default.pa

native-protocol-tcp를 찾는다. 그리고 하단과 같이 주석 해제 한다.
그리고 다음의 내용으로 바꿔준다.
load-module module-native-protocol-tcp auth-ip-acl=127.0.0.1;192.168.0.0/16 auth-anonymous=1

sed -i '/unset XDG_RUNTIME_DIR/d' ~/.bashrc
mkdir -p /run/user/0
chmod 700 /run/user/0
export XDG_RUNTIME_DIR=/run/user/0
echo "export XDG_RUNTIME_DIR=/run/user/0" >> ~/.bashrc
pulseaudio -k
killall pulseaudio
waydroid session stop
ln -sf /mnt/wslg/runtime-dir/wayland-0 /run/user/0/wayland-0
export WAYLAND_DISPLAY=wayland-0
sudo pkill -f waydroid
pulseaudio -k
mkdir -p /run/user/0
chmod 700 /run/user/0
mkdir -p /run/user/0/pulse
touch /run/user/0/pulse/native
sudo waydroid container start &
sleep 3
android
pulseaudio --start
echo "export PULSE_SERVER=unix:/mnt/wslg/PulseServer" >> ~/.bashrc
mkdir -p /run/user/0
ln -sf /mnt/wslg/runtime-dir/wayland-0 /run/user/0/wayland-0
ln -sf /mnt/wslg/runtime-dir/wayland-0.lock /run/user/0/wayland-0.lock
waydroid session stop
sudo waydroid container stop
sudo rm -rf /run/waydroid-lxc
# PulseAudio 소켓도 만들어주기
mkdir -p /run/user/0/pulse
ln -sf /mnt/wslg/PulseServer /run/user/0/pulse/native
sudo waydroid container start &
sleep 5
waydroid session start &
sleep 3
waydroid show-full-ui

오 이제 좀 들린다.
이제 영상이 버벅이는 문제를 해결하자 …

default면 소프트웨어 렌더링이라고 한다.
waydroid prop set persist.waydroid.fake_wifi true
waydroid prop set persist.waydroid.multi_windows false
sudo waydroid upgrade
sudo nano /var/lib/waydroid/waydroid.cfg

다음과 같이 고친다.
# config 수정
sudo nano /var/lib/waydroid/waydroid.cfg
```
`[properties]` 섹션에 추가:
```
ro.hardware.gralloc=default
ro.hardware.egl=mesa
잘 된다.
#삽질 #뻘짓