1*61046927SAndroid Build Coastguard WorkerAndroid 2*61046927SAndroid Build Coastguard Worker======= 3*61046927SAndroid Build Coastguard Worker 4*61046927SAndroid Build Coastguard WorkerMesa hardware drivers can be built for Android one of two ways: built 5*61046927SAndroid Build Coastguard Workerinto the Android OS using the ndk-build build system on older versions 6*61046927SAndroid Build Coastguard Workerof Android, or out-of-tree using the Meson build system and the 7*61046927SAndroid Build Coastguard WorkerAndroid NDK. 8*61046927SAndroid Build Coastguard Worker 9*61046927SAndroid Build Coastguard WorkerThe ndk-build build system has proven to be hard to maintain, as one 10*61046927SAndroid Build Coastguard Workerneeds a built Android tree to build against, and it has never been 11*61046927SAndroid Build Coastguard Workertested in CI. The Meson build system flow is frequently used by 12*61046927SAndroid Build Coastguard WorkerChrome OS developers for building and testing Android drivers. 13*61046927SAndroid Build Coastguard Worker 14*61046927SAndroid Build Coastguard WorkerWhen building llvmpipe or lavapipe for Android the ndk-build workflow 15*61046927SAndroid Build Coastguard Workeris also used, but there are additional steps required to add the driver 16*61046927SAndroid Build Coastguard Workerto the Android OS image. 17*61046927SAndroid Build Coastguard Worker 18*61046927SAndroid Build Coastguard WorkerBuilding using the Android NDK 19*61046927SAndroid Build Coastguard Worker------------------------------ 20*61046927SAndroid Build Coastguard Worker 21*61046927SAndroid Build Coastguard WorkerDownload and install the NDK using whatever method you normally would. 22*61046927SAndroid Build Coastguard WorkerThen, create your Meson cross file to use it, something like this 23*61046927SAndroid Build Coastguard Worker``~/.local/share/meson/cross/android-aarch64`` file: 24*61046927SAndroid Build Coastguard Worker 25*61046927SAndroid Build Coastguard Worker.. code-block:: ini 26*61046927SAndroid Build Coastguard Worker 27*61046927SAndroid Build Coastguard Worker [binaries] 28*61046927SAndroid Build Coastguard Worker ar = 'NDKDIR/toolchains/llvm/prebuilt/linux-x86_64/bin/aarch64-linux-android-ar' 29*61046927SAndroid Build Coastguard Worker c = ['ccache', 'NDKDIR/toolchains/llvm/prebuilt/linux-x86_64/bin/aarch64-linux-android29-clang'] 30*61046927SAndroid Build Coastguard Worker cpp = ['ccache', 'NDKDIR/toolchains/llvm/prebuilt/linux-x86_64/bin/aarch64-linux-android29-clang++', '-fno-exceptions', '-fno-unwind-tables', '-fno-asynchronous-unwind-tables', '-static-libstdc++'] 31*61046927SAndroid Build Coastguard Worker c_ld = 'lld' 32*61046927SAndroid Build Coastguard Worker cpp_ld = 'lld' 33*61046927SAndroid Build Coastguard Worker strip = 'NDKDIR/toolchains/llvm/prebuilt/linux-x86_64/bin/aarch64-linux-android-strip' 34*61046927SAndroid Build Coastguard Worker # Android doesn't come with a pkg-config, but we need one for Meson to be happy not 35*61046927SAndroid Build Coastguard Worker # finding all the optional deps it looks for. Use system pkg-config pointing at a 36*61046927SAndroid Build Coastguard Worker # directory we get to populate with any .pc files we want to add for Android 37*61046927SAndroid Build Coastguard Worker pkg-config = ['env', 'PKG_CONFIG_LIBDIR=NDKDIR/pkgconfig', '/usr/bin/pkg-config'] 38*61046927SAndroid Build Coastguard Worker 39*61046927SAndroid Build Coastguard Worker [host_machine] 40*61046927SAndroid Build Coastguard Worker system = 'android' 41*61046927SAndroid Build Coastguard Worker cpu_family = 'aarch64' 42*61046927SAndroid Build Coastguard Worker cpu = 'armv8' 43*61046927SAndroid Build Coastguard Worker endian = 'little' 44*61046927SAndroid Build Coastguard Worker 45*61046927SAndroid Build Coastguard WorkerNow, use that cross file for your Android build directory (as in this 46*61046927SAndroid Build Coastguard Workerone cross-compiling the turnip driver for a stock Pixel phone) 47*61046927SAndroid Build Coastguard Worker 48*61046927SAndroid Build Coastguard Worker.. code-block:: sh 49*61046927SAndroid Build Coastguard Worker 50*61046927SAndroid Build Coastguard Worker meson setup build-android-aarch64 \ 51*61046927SAndroid Build Coastguard Worker --cross-file android-aarch64 \ 52*61046927SAndroid Build Coastguard Worker -Dplatforms=android \ 53*61046927SAndroid Build Coastguard Worker -Dplatform-sdk-version=26 \ 54*61046927SAndroid Build Coastguard Worker -Dandroid-stub=true \ 55*61046927SAndroid Build Coastguard Worker -Dgallium-drivers= \ 56*61046927SAndroid Build Coastguard Worker -Dvulkan-drivers=freedreno \ 57*61046927SAndroid Build Coastguard Worker -Dfreedreno-kmds=kgsl 58*61046927SAndroid Build Coastguard Worker meson compile -C build-android-aarch64 59*61046927SAndroid Build Coastguard Worker 60*61046927SAndroid Build Coastguard WorkerReplacing Android drivers on stock Android 61*61046927SAndroid Build Coastguard Worker------------------------------------------ 62*61046927SAndroid Build Coastguard Worker 63*61046927SAndroid Build Coastguard WorkerThe vendor partition with the drivers is normally mounted from a 64*61046927SAndroid Build Coastguard Workerread-only disk image on ``/vendor``. To be able to replace them for 65*61046927SAndroid Build Coastguard Workerdriver development, we need to unlock the device and remount 66*61046927SAndroid Build Coastguard Worker``/vendor`` read/write. 67*61046927SAndroid Build Coastguard Worker 68*61046927SAndroid Build Coastguard Worker.. code-block:: sh 69*61046927SAndroid Build Coastguard Worker 70*61046927SAndroid Build Coastguard Worker adb disable-verity 71*61046927SAndroid Build Coastguard Worker adb reboot 72*61046927SAndroid Build Coastguard Worker adb remount -R 73*61046927SAndroid Build Coastguard Worker adb remount 74*61046927SAndroid Build Coastguard Worker 75*61046927SAndroid Build Coastguard WorkerNow you can replace drivers as in: 76*61046927SAndroid Build Coastguard Worker 77*61046927SAndroid Build Coastguard Worker.. code-block:: sh 78*61046927SAndroid Build Coastguard Worker 79*61046927SAndroid Build Coastguard Worker adb push build-android-aarch64/src/freedreno/vulkan/libvulkan_freedreno.so /vendor/lib64/hw/vulkan.sdm710.so 80*61046927SAndroid Build Coastguard Worker 81*61046927SAndroid Build Coastguard WorkerNote this command doesn't quite work because libvulkan wants the 82*61046927SAndroid Build Coastguard WorkerSONAME to match. You can use ``patchelf`` to fix this: 83*61046927SAndroid Build Coastguard Worker 84*61046927SAndroid Build Coastguard Worker.. code-block:: sh 85*61046927SAndroid Build Coastguard Worker 86*61046927SAndroid Build Coastguard Worker cp build-android-aarch64/src/freedreno/vulkan/libvulkan_freedreno.so /tmp/vulkan.sdm710.so 87*61046927SAndroid Build Coastguard Worker patchelf --set-soname vulkan.sdm710.so /tmp/vulkan.sdm710.so 88*61046927SAndroid Build Coastguard Worker adb push /tmp/vulkan.sdm710.so /vendor/lib64/hw/ 89*61046927SAndroid Build Coastguard Worker 90*61046927SAndroid Build Coastguard WorkerReplacing Android drivers on Chrome OS 91*61046927SAndroid Build Coastguard Worker-------------------------------------- 92*61046927SAndroid Build Coastguard Worker 93*61046927SAndroid Build Coastguard WorkerChrome OS's ARC++ is an Android container with hardware drivers inside 94*61046927SAndroid Build Coastguard Workerof it. The vendor partition with the drivers is normally mounted from 95*61046927SAndroid Build Coastguard Workera read-only squashfs image on disk. For doing rapid driver 96*61046927SAndroid Build Coastguard Workerdevelopment, you don't want to regenerate that image. So, we'll take 97*61046927SAndroid Build Coastguard Workerthe existing squashfs image, copy it out on the host, and then use a 98*61046927SAndroid Build Coastguard Workerbind mount instead of a loopback mount so we can update our drivers 99*61046927SAndroid Build Coastguard Workerusing scp from outside the container. 100*61046927SAndroid Build Coastguard Worker 101*61046927SAndroid Build Coastguard WorkerOn your device, you'll want to make ``/`` read-write. ssh in as root 102*61046927SAndroid Build Coastguard Workerand run: 103*61046927SAndroid Build Coastguard Worker 104*61046927SAndroid Build Coastguard Worker.. code-block:: sh 105*61046927SAndroid Build Coastguard Worker 106*61046927SAndroid Build Coastguard Worker crossystem dev_boot_signed_only=0 107*61046927SAndroid Build Coastguard Worker /usr/share/vboot/bin/make_dev_ssd.sh --remove_rootfs_verification --partitions 4 108*61046927SAndroid Build Coastguard Worker reboot 109*61046927SAndroid Build Coastguard Worker 110*61046927SAndroid Build Coastguard WorkerThen, we'll switch Android from using an image for ``/vendor`` to using a 111*61046927SAndroid Build Coastguard Workerbind-mount from a directory we control. 112*61046927SAndroid Build Coastguard Worker 113*61046927SAndroid Build Coastguard Worker.. code-block:: sh 114*61046927SAndroid Build Coastguard Worker 115*61046927SAndroid Build Coastguard Worker cd /opt/google/containers/android/ 116*61046927SAndroid Build Coastguard Worker mkdir vendor-ro 117*61046927SAndroid Build Coastguard Worker mount -o loop vendor.raw.img vendor-ro 118*61046927SAndroid Build Coastguard Worker cp -a vendor-ro vendor-rw 119*61046927SAndroid Build Coastguard Worker emacs config.json 120*61046927SAndroid Build Coastguard Worker 121*61046927SAndroid Build Coastguard WorkerIn the ``config.json``, you want to find the block for ``/vendor`` and 122*61046927SAndroid Build Coastguard Workerchange it to:: 123*61046927SAndroid Build Coastguard Worker 124*61046927SAndroid Build Coastguard Worker { 125*61046927SAndroid Build Coastguard Worker "destination": "/vendor", 126*61046927SAndroid Build Coastguard Worker "type": "bind", 127*61046927SAndroid Build Coastguard Worker "source": "/opt/google/containers/android/vendor-rw", 128*61046927SAndroid Build Coastguard Worker "options": [ 129*61046927SAndroid Build Coastguard Worker "bind", 130*61046927SAndroid Build Coastguard Worker "rw" 131*61046927SAndroid Build Coastguard Worker ] 132*61046927SAndroid Build Coastguard Worker }, 133*61046927SAndroid Build Coastguard Worker 134*61046927SAndroid Build Coastguard WorkerNow, restart the UI to do a full reload: 135*61046927SAndroid Build Coastguard Worker 136*61046927SAndroid Build Coastguard Worker.. code-block:: sh 137*61046927SAndroid Build Coastguard Worker 138*61046927SAndroid Build Coastguard Worker restart ui 139*61046927SAndroid Build Coastguard Worker 140*61046927SAndroid Build Coastguard WorkerAt this point, your android container is restarted with your new 141*61046927SAndroid Build Coastguard Workerbind-mount ``/vendor``, and if you use ``android-sh`` to shell into it 142*61046927SAndroid Build Coastguard Workerthen the ``mount`` command should show:: 143*61046927SAndroid Build Coastguard Worker 144*61046927SAndroid Build Coastguard Worker /dev/root on /vendor type ext2 (rw,seclabel,relatime) 145*61046927SAndroid Build Coastguard Worker 146*61046927SAndroid Build Coastguard WorkerNow, replacing your DRI driver with a new one built for Android should 147*61046927SAndroid Build Coastguard Workerbe a matter of: 148*61046927SAndroid Build Coastguard Worker 149*61046927SAndroid Build Coastguard Worker.. code-block:: sh 150*61046927SAndroid Build Coastguard Worker 151*61046927SAndroid Build Coastguard Worker scp msm_dri.so $HOST:/opt/google/containers/android/vendor-rw/lib64/dri/ 152*61046927SAndroid Build Coastguard Worker 153*61046927SAndroid Build Coastguard WorkerYou can do your build of your DRI driver using ``emerge-$BOARD 154*61046927SAndroid Build Coastguard Workerarc-mesa-freedreno`` (for example) if you have a source tree with 155*61046927SAndroid Build Coastguard WorkerARC++, but it should also be possible to build using the NDK as 156*61046927SAndroid Build Coastguard Workerdescribed above. There are currently rough edges with this, for 157*61046927SAndroid Build Coastguard Workerexample the build will require that you have your arc-libdrm build 158*61046927SAndroid Build Coastguard Workeravailable to the NDK, assuming you're building anything but the 159*61046927SAndroid Build Coastguard WorkerFreedreno Vulkan driver for KGSL. You can mostly put things in place 160*61046927SAndroid Build Coastguard Workerwith: 161*61046927SAndroid Build Coastguard Worker 162*61046927SAndroid Build Coastguard Worker.. code-block:: sh 163*61046927SAndroid Build Coastguard Worker 164*61046927SAndroid Build Coastguard Worker scp $HOST:/opt/google/containers/android/vendor-rw/lib64/libdrm.so \ 165*61046927SAndroid Build Coastguard Worker NDKDIR/sysroot/usr/lib/aarch64-linux-android/lib/ 166*61046927SAndroid Build Coastguard Worker 167*61046927SAndroid Build Coastguard Worker ln -s \ 168*61046927SAndroid Build Coastguard Worker /usr/include/xf86drm.h \ 169*61046927SAndroid Build Coastguard Worker /usr/include/libsync.h \ 170*61046927SAndroid Build Coastguard Worker /usr/include/libdrm \ 171*61046927SAndroid Build Coastguard Worker NDKDIR/sysroot/usr/include/ 172*61046927SAndroid Build Coastguard Worker 173*61046927SAndroid Build Coastguard WorkerIt seems that new invocations of an application will often reload the 174*61046927SAndroid Build Coastguard WorkerDRI driver, but depending on the component you're working on you may 175*61046927SAndroid Build Coastguard Workerfind you need to reload the whole Android container. To do so without 176*61046927SAndroid Build Coastguard Workerhaving to log in to Chrome again every time, you can just kill the 177*61046927SAndroid Build Coastguard Workercontainer and let it restart: 178*61046927SAndroid Build Coastguard Worker 179*61046927SAndroid Build Coastguard Worker.. code-block:: sh 180*61046927SAndroid Build Coastguard Worker 181*61046927SAndroid Build Coastguard Worker kill $(cat /run/containers/android-run_oci/container.pid ) 182*61046927SAndroid Build Coastguard Worker 183*61046927SAndroid Build Coastguard WorkerAdding drivers to Android OS image 184*61046927SAndroid Build Coastguard Worker---------------------------------- 185*61046927SAndroid Build Coastguard Worker 186*61046927SAndroid Build Coastguard WorkerWhen building your own Android OS images it's possible to add 187*61046927SAndroid Build Coastguard Workerdrivers built out of tree directly into the OS image. For 188*61046927SAndroid Build Coastguard Workerrunning llvmpipe and lavapipe on Android this step is required 189*61046927SAndroid Build Coastguard Workerto ensure Android is able to load the drivers correctly. 190*61046927SAndroid Build Coastguard Worker 191*61046927SAndroid Build Coastguard WorkerThe following steps provide and example for building 192*61046927SAndroid Build Coastguard Workerthe android cuttlefish image following the official Android 193*61046927SAndroid Build Coastguard Workerdocumentation from https://source.android.com/docs/setup 194*61046927SAndroid Build Coastguard Worker 195*61046927SAndroid Build Coastguard WorkerWhen building llvmpipe or lavapipe for Android, it is required 196*61046927SAndroid Build Coastguard Workerto do this so that the permissions for accessing the library 197*61046927SAndroid Build Coastguard Workerare set correctly. 198*61046927SAndroid Build Coastguard Worker 199*61046927SAndroid Build Coastguard WorkerFollowing the Android documentation, we can run the following 200*61046927SAndroid Build Coastguard Workercommands 201*61046927SAndroid Build Coastguard Worker 202*61046927SAndroid Build Coastguard Worker.. code-block:: sh 203*61046927SAndroid Build Coastguard Worker 204*61046927SAndroid Build Coastguard Worker repo init -b main -u https://android.googlesource.com/platform/manifest 205*61046927SAndroid Build Coastguard Worker repo sync -c -j8 206*61046927SAndroid Build Coastguard Worker 207*61046927SAndroid Build Coastguard Worker source build/envsetup.sh 208*61046927SAndroid Build Coastguard Worker lunch aosp_cf_x86_64_phone-trunk_staging-userdebug 209*61046927SAndroid Build Coastguard Worker 210*61046927SAndroid Build Coastguard WorkerBe aware that the sync command can take a long time to run as 211*61046927SAndroid Build Coastguard Workerit will download all of the source code. This will set up 212*61046927SAndroid Build Coastguard Workerthe ``aosp_cf_x86_64_phone-trunk_staging-userdebug`` build target 213*61046927SAndroid Build Coastguard Workerfor Android. Please note that the x86_64 cuttlefish target will require 214*61046927SAndroid Build Coastguard Workeryou to build mesa for 32bit and 64bit. Next we need to copy the build 215*61046927SAndroid Build Coastguard Workerdriver libraries into the source tree of Android and patch the binary names. 216*61046927SAndroid Build Coastguard WorkerNote that as of ``9b7bb6cc9fa``, libgallium will include the build tag in the 217*61046927SAndroid Build Coastguard Workername, so the name of that library will need to match the tag used in the build. 218*61046927SAndroid Build Coastguard Worker 219*61046927SAndroid Build Coastguard Worker.. code-block:: sh 220*61046927SAndroid Build Coastguard Worker 221*61046927SAndroid Build Coastguard Worker mkdir prebuilts/mesa 222*61046927SAndroid Build Coastguard Worker mkdir prebuilts/mesa/x86_64 223*61046927SAndroid Build Coastguard Worker mkdir prebuilts/mesa/x86 224*61046927SAndroid Build Coastguard Worker cp ${INSTALL_PREFIX_64}/lib/libEGL.so prebuilts/mesa/x86_64/ 225*61046927SAndroid Build Coastguard Worker cp ${INSTALL_PREFIX_64}/lib/libglapi.so prebuilts/mesa/x86_64/ 226*61046927SAndroid Build Coastguard Worker cp ${INSTALL_PREFIX_64}/lib/libgallium-24.3.0-devel.so prebuilts/mesa/x86_64/ 227*61046927SAndroid Build Coastguard Worker cp ${INSTALL_PREFIX_64}/lib/libGLESv1_CM.so prebuilts/mesa/x86_64/ 228*61046927SAndroid Build Coastguard Worker cp ${INSTALL_PREFIX_64}/lib/libGLESv2.so prebuilts/mesa/x86_64/ 229*61046927SAndroid Build Coastguard Worker cp ${INSTALL_PREFIX_64}/lib/libvulkan_lvp.so prebuilts/mesa/x86_64/ 230*61046927SAndroid Build Coastguard Worker cp ${INSTALL_PREFIX_32}/lib/libEGL.so prebuilts/mesa/x86 231*61046927SAndroid Build Coastguard Worker cp ${INSTALL_PREFIX_32}/lib/libglapi.so prebuilts/mesa/x86 232*61046927SAndroid Build Coastguard Worker cp ${INSTALL_PREFIX_32}/lib/libgallium-24.3.0-devel.so prebuilts/mesa/x86/ 233*61046927SAndroid Build Coastguard Worker cp ${INSTALL_PREFIX_32}/lib/libGLESv1_CM.so prebuilts/mesa/x86 234*61046927SAndroid Build Coastguard Worker cp ${INSTALL_PREFIX_32}/lib/libGLESv2.so prebuilts/mesa/x86 235*61046927SAndroid Build Coastguard Worker cp ${INSTALL_PREFIX_32}/lib/libvulkan_lvp.so prebuilts/mesa/x86 236*61046927SAndroid Build Coastguard Worker 237*61046927SAndroid Build Coastguard Worker patchelf --set-soname libEGL_lp.so prebuilts/mesa/x86_64/libEGL.so 238*61046927SAndroid Build Coastguard Worker patchelf --set-soname libGLESv1_CM_lp.so prebuilts/mesa/x86_64/libGLESv1_CM.so 239*61046927SAndroid Build Coastguard Worker patchelf --set-soname libGLESv2_lp.so prebuilts/mesa/x86_64/libGLESv2.so 240*61046927SAndroid Build Coastguard Worker patchelf --set-soname vulkan.lvp.so prebuilts/mesa/x86_64/libvulkan_lvp.so 241*61046927SAndroid Build Coastguard Worker patchelf --set-soname libEGL_lp.so prebuilts/mesa/x86/libEGL.so 242*61046927SAndroid Build Coastguard Worker patchelf --set-soname libGLESv1_CM_lp.so prebuilts/mesa/x86/libGLESv1_CM.so 243*61046927SAndroid Build Coastguard Worker patchelf --set-soname libGLESv2_lp.so prebuilts/mesa/x86/libGLESv2.so 244*61046927SAndroid Build Coastguard Worker patchelf --set-soname vulkan.lvp.so prebuilts/mesa/x86/libvulkan_lvp.so 245*61046927SAndroid Build Coastguard Worker 246*61046927SAndroid Build Coastguard WorkerWe then need to create an ``prebuilts/mesa/Android.bp`` build file to include 247*61046927SAndroid Build Coastguard Workerthe libraries in the build. 248*61046927SAndroid Build Coastguard Worker 249*61046927SAndroid Build Coastguard Worker.. code-block:: 250*61046927SAndroid Build Coastguard Worker 251*61046927SAndroid Build Coastguard Worker cc_prebuilt_library_shared { 252*61046927SAndroid Build Coastguard Worker name: "libglapi", 253*61046927SAndroid Build Coastguard Worker arch: { 254*61046927SAndroid Build Coastguard Worker x86_64: { 255*61046927SAndroid Build Coastguard Worker srcs: ["x86_64/libglapi.so"], 256*61046927SAndroid Build Coastguard Worker }, 257*61046927SAndroid Build Coastguard Worker x86: { 258*61046927SAndroid Build Coastguard Worker srcs: ["x86/libglapi.so"], 259*61046927SAndroid Build Coastguard Worker }, 260*61046927SAndroid Build Coastguard Worker }, 261*61046927SAndroid Build Coastguard Worker strip: { 262*61046927SAndroid Build Coastguard Worker none: true, 263*61046927SAndroid Build Coastguard Worker }, 264*61046927SAndroid Build Coastguard Worker relative_install_path: "egl", 265*61046927SAndroid Build Coastguard Worker shared_libs: ["libc", "libdl", "liblog", "libm"], 266*61046927SAndroid Build Coastguard Worker vendor: true 267*61046927SAndroid Build Coastguard Worker } 268*61046927SAndroid Build Coastguard Worker 269*61046927SAndroid Build Coastguard Worker cc_prebuilt_library_shared { 270*61046927SAndroid Build Coastguard Worker name: "libgallium-24.3.0-devel", 271*61046927SAndroid Build Coastguard Worker arch: { 272*61046927SAndroid Build Coastguard Worker x86_64: { 273*61046927SAndroid Build Coastguard Worker srcs: ["x86_64/libgallium-24.3.0-devel.so"], 274*61046927SAndroid Build Coastguard Worker }, 275*61046927SAndroid Build Coastguard Worker x86: { 276*61046927SAndroid Build Coastguard Worker srcs: ["x86/libgallium-24.3.0-devel.so"], 277*61046927SAndroid Build Coastguard Worker }, 278*61046927SAndroid Build Coastguard Worker }, 279*61046927SAndroid Build Coastguard Worker strip: { 280*61046927SAndroid Build Coastguard Worker none: true, 281*61046927SAndroid Build Coastguard Worker }, 282*61046927SAndroid Build Coastguard Worker relative_install_path: "egl", 283*61046927SAndroid Build Coastguard Worker shared_libs: ["libc", "libdl", "liblog", "libm"], 284*61046927SAndroid Build Coastguard Worker check_elf_files: false, 285*61046927SAndroid Build Coastguard Worker vendor: true 286*61046927SAndroid Build Coastguard Worker } 287*61046927SAndroid Build Coastguard Worker 288*61046927SAndroid Build Coastguard Worker cc_prebuilt_library_shared { 289*61046927SAndroid Build Coastguard Worker name: "libEGL_lp", 290*61046927SAndroid Build Coastguard Worker arch: { 291*61046927SAndroid Build Coastguard Worker x86_64: { 292*61046927SAndroid Build Coastguard Worker srcs: ["x86_64/libEGL.so"], 293*61046927SAndroid Build Coastguard Worker }, 294*61046927SAndroid Build Coastguard Worker x86: { 295*61046927SAndroid Build Coastguard Worker srcs: ["x86/libEGL.so"], 296*61046927SAndroid Build Coastguard Worker }, 297*61046927SAndroid Build Coastguard Worker }, 298*61046927SAndroid Build Coastguard Worker strip: { 299*61046927SAndroid Build Coastguard Worker none: true, 300*61046927SAndroid Build Coastguard Worker }, 301*61046927SAndroid Build Coastguard Worker relative_install_path: "egl", 302*61046927SAndroid Build Coastguard Worker shared_libs: ["libc", "libdl", "liblog", "libm", "libcutils", "libdrm", "libhardware", "liblog", "libnativewindow", "libsync"], 303*61046927SAndroid Build Coastguard Worker check_elf_files: false, 304*61046927SAndroid Build Coastguard Worker vendor: true 305*61046927SAndroid Build Coastguard Worker } 306*61046927SAndroid Build Coastguard Worker 307*61046927SAndroid Build Coastguard Worker cc_prebuilt_library_shared { 308*61046927SAndroid Build Coastguard Worker name: "libGLESv1_CM_lp", 309*61046927SAndroid Build Coastguard Worker arch: { 310*61046927SAndroid Build Coastguard Worker x86_64: { 311*61046927SAndroid Build Coastguard Worker srcs: ["x86_64/libGLESv1_CM.so"], 312*61046927SAndroid Build Coastguard Worker }, 313*61046927SAndroid Build Coastguard Worker x86: { 314*61046927SAndroid Build Coastguard Worker srcs: ["x86/libGLESv1_CM.so"], 315*61046927SAndroid Build Coastguard Worker }, 316*61046927SAndroid Build Coastguard Worker }, 317*61046927SAndroid Build Coastguard Worker strip: { 318*61046927SAndroid Build Coastguard Worker none: true, 319*61046927SAndroid Build Coastguard Worker }, 320*61046927SAndroid Build Coastguard Worker relative_install_path: "egl", 321*61046927SAndroid Build Coastguard Worker shared_libs: ["libc", "libdl", "liblog", "libm"], 322*61046927SAndroid Build Coastguard Worker check_elf_files: false, 323*61046927SAndroid Build Coastguard Worker vendor: true 324*61046927SAndroid Build Coastguard Worker } 325*61046927SAndroid Build Coastguard Worker 326*61046927SAndroid Build Coastguard Worker cc_prebuilt_library_shared { 327*61046927SAndroid Build Coastguard Worker name: "libGLESv2_lp", 328*61046927SAndroid Build Coastguard Worker arch: { 329*61046927SAndroid Build Coastguard Worker x86_64: { 330*61046927SAndroid Build Coastguard Worker srcs: ["x86_64/libGLESv2.so"], 331*61046927SAndroid Build Coastguard Worker }, 332*61046927SAndroid Build Coastguard Worker x86: { 333*61046927SAndroid Build Coastguard Worker srcs: ["x86_64/libGLESv2.so"], 334*61046927SAndroid Build Coastguard Worker }, 335*61046927SAndroid Build Coastguard Worker }, 336*61046927SAndroid Build Coastguard Worker strip: { 337*61046927SAndroid Build Coastguard Worker none: true, 338*61046927SAndroid Build Coastguard Worker }, 339*61046927SAndroid Build Coastguard Worker relative_install_path: "egl", 340*61046927SAndroid Build Coastguard Worker shared_libs: ["libc", "libdl", "liblog", "libm"], 341*61046927SAndroid Build Coastguard Worker check_elf_files: false, 342*61046927SAndroid Build Coastguard Worker vendor: true 343*61046927SAndroid Build Coastguard Worker } 344*61046927SAndroid Build Coastguard Worker 345*61046927SAndroid Build Coastguard Worker cc_prebuilt_library_shared { 346*61046927SAndroid Build Coastguard Worker name: "vulkan.lvp", 347*61046927SAndroid Build Coastguard Worker arch: { 348*61046927SAndroid Build Coastguard Worker x86_64: { 349*61046927SAndroid Build Coastguard Worker srcs: ["x86_64/libvulkan_lvp.so"], 350*61046927SAndroid Build Coastguard Worker }, 351*61046927SAndroid Build Coastguard Worker x86: { 352*61046927SAndroid Build Coastguard Worker srcs: ["x86/libvulkan_lvp.so"], 353*61046927SAndroid Build Coastguard Worker }, 354*61046927SAndroid Build Coastguard Worker }, 355*61046927SAndroid Build Coastguard Worker strip: { 356*61046927SAndroid Build Coastguard Worker none: true, 357*61046927SAndroid Build Coastguard Worker }, 358*61046927SAndroid Build Coastguard Worker relative_install_path: "hw", 359*61046927SAndroid Build Coastguard Worker shared_libs: ["libc", "libdl", "liblog", "libm", "libcutils", "libdrm", "liblog", "libnativewindow", "libsync", "libz"], 360*61046927SAndroid Build Coastguard Worker vendor: true 361*61046927SAndroid Build Coastguard Worker } 362*61046927SAndroid Build Coastguard Worker 363*61046927SAndroid Build Coastguard Worker 364*61046927SAndroid Build Coastguard WorkerNext we need to update the device configuration to include the libraries 365*61046927SAndroid Build Coastguard Workerin the build, as well as set the appropriate system properties. We can 366*61046927SAndroid Build Coastguard Workercreate the file 367*61046927SAndroid Build Coastguard Worker``device/google/cuttlefish/shared/mesa/device_vendor.mk`` 368*61046927SAndroid Build Coastguard Worker 369*61046927SAndroid Build Coastguard Worker 370*61046927SAndroid Build Coastguard Worker.. code-block:: makefile 371*61046927SAndroid Build Coastguard Worker 372*61046927SAndroid Build Coastguard Worker PRODUCT_SOONG_NAMESPACES += prebuilts/mesa 373*61046927SAndroid Build Coastguard Worker PRODUCT_PACKAGES += libglapi \ 374*61046927SAndroid Build Coastguard Worker libGLESv1_CM_lp \ 375*61046927SAndroid Build Coastguard Worker libGLESv2_lp \ 376*61046927SAndroid Build Coastguard Worker libEGL_lp \ 377*61046927SAndroid Build Coastguard Worker libgallium-24.3.0-devel.so \ 378*61046927SAndroid Build Coastguard Worker vulkan.lvp 379*61046927SAndroid Build Coastguard Worker PRODUCT_VENDOR_PROPERTIES += \ 380*61046927SAndroid Build Coastguard Worker ro.hardware.egl=lp \ 381*61046927SAndroid Build Coastguard Worker ro.hardware.vulkan=lvp \ 382*61046927SAndroid Build Coastguard Worker mesa.libgl.always.software=true \ 383*61046927SAndroid Build Coastguard Worker mesa.android.no.kms.swrast=true \ 384*61046927SAndroid Build Coastguard Worker debug.hwui.renderer=opengl \ 385*61046927SAndroid Build Coastguard Worker ro.gfx.angle.supported=false \ 386*61046927SAndroid Build Coastguard Worker debug.sf.disable_hwc_vds=1 \ 387*61046927SAndroid Build Coastguard Worker ro.vendor.hwcomposer.mode=client 388*61046927SAndroid Build Coastguard Worker 389*61046927SAndroid Build Coastguard WorkerAlso the file ``device/google/cuttlefish/shared/mesa/BoardConfig.mk`` 390*61046927SAndroid Build Coastguard Worker 391*61046927SAndroid Build Coastguard Worker.. code-block:: makefile 392*61046927SAndroid Build Coastguard Worker 393*61046927SAndroid Build Coastguard Worker BOARD_VENDOR_SEPOLICY_DIRS += \ 394*61046927SAndroid Build Coastguard Worker device/google/cuttlefish/shared/mesa/sepolicy 395*61046927SAndroid Build Coastguard Worker 396*61046927SAndroid Build Coastguard WorkerNext the file ``device/google/cuttlefish/shared/mesa/sepolicy/file_contexts`` 397*61046927SAndroid Build Coastguard Worker 398*61046927SAndroid Build Coastguard Worker.. code-block:: sh 399*61046927SAndroid Build Coastguard Worker 400*61046927SAndroid Build Coastguard Worker /vendor/lib(64)?/egl/libEGL_lp\.so u:object_r:same_process_hal_file:s0 401*61046927SAndroid Build Coastguard Worker /vendor/lib(64)?/egl/libGLESv1_CM_lp\.so u:object_r:same_process_hal_file:s0 402*61046927SAndroid Build Coastguard Worker /vendor/lib(64)?/egl/libGLESv2_lp\.so u:object_r:same_process_hal_file:s0 403*61046927SAndroid Build Coastguard Worker /vendor/lib(64)?/egl/libglapi\.so u:object_r:same_process_hal_file:s0 404*61046927SAndroid Build Coastguard Worker /vendor/lib(64)?/egl/libgallium\-24.3.0\-devel\.so u:object_r:same_process_hal_file:s0 405*61046927SAndroid Build Coastguard Worker /vendor/lib(64)?/hw/vulkan\.lvp\.so u:object_r:same_process_hal_file:s0 406*61046927SAndroid Build Coastguard Worker 407*61046927SAndroid Build Coastguard WorkerAfter creating these files we need to modify the existing config files 408*61046927SAndroid Build Coastguard Workerto include these build files. First we modify 409*61046927SAndroid Build Coastguard Worker``device/google/cuttlefish/shared/phone/device_vendor.mk`` 410*61046927SAndroid Build Coastguard Workerto add the below code in the spot where other device_vendor 411*61046927SAndroid Build Coastguard Workerfiles are included. 412*61046927SAndroid Build Coastguard Worker 413*61046927SAndroid Build Coastguard Worker.. code-block:: sh 414*61046927SAndroid Build Coastguard Worker 415*61046927SAndroid Build Coastguard Worker $(call inherit-product, device/google/cuttlefish/shared/mesa/device_vendor.mk) 416*61046927SAndroid Build Coastguard Worker 417*61046927SAndroid Build Coastguard WorkerLastly we modify 418*61046927SAndroid Build Coastguard Worker``device/google/cuttlefish/vsoc_x86_64/BoardConfig.mk`` to include 419*61046927SAndroid Build Coastguard Workerthe following line where the other BoardConfig files are included 420*61046927SAndroid Build Coastguard Worker 421*61046927SAndroid Build Coastguard Worker.. code-block:: sh 422*61046927SAndroid Build Coastguard Worker 423*61046927SAndroid Build Coastguard Worker -include device/google/cuttlefish/shared/mesa/BoardConfig.mk 424*61046927SAndroid Build Coastguard Worker 425*61046927SAndroid Build Coastguard WorkerThen we are set to continue following the official instructions to 426*61046927SAndroid Build Coastguard Workerbuild the cuttlefish target and run it in the cuttlefish emulator. 427