Administrator
发布于 2024-05-27 / 139 阅读
0

Skia编译

背景

Skia是一个跨平台的绘制库,也是Android、Chromium、老版Flutter的绘制核心。最近在分析混合式开发技术栈,将Windows平台编译Skia的相关流程记录一下。

环境配置

https://skia.org/docs/user/download/

https://skia.org/docs/user/build/

环境要求上,要求 Bazelisk

Bazelisk 官网文档有要求用 Chocolatey 来安装

Chocolatey 安装有要设置 PowerShell等东西。

绕了一大圈。

git clone https://skia.googlesource.com/skia.git 
# or 
# fetch skia 
cd skia 
python3 tools/git-sync-deps 
python3 bin\fetch-ninja 
bin\gn gen out/Debug --ide=vs2022

里面有一个 HelloWorld 工程,是基础的演示。使用到了 tools/sk_app 是一个简单的跨平台基础窗口框架,可以用于演示

viewer 演示了很多场景的渲染,可以切换渲染后端

Android编译

bin/gn gen out/arm --args='ndk="/tmp/ndk" target_cpu="arm"' bin/gn gen out/arm64 --args='ndk="/tmp/ndk" target_cpu="arm64"' bin/gn gen out/x64 --args='ndk="/tmp/ndk" target_cpu="x64"' bin/gn gen out/x86 --args='ndk="/tmp/ndk" target_cpu="x86"'

参考

 bin\gn gen out\Static --args="is_official_build=false is_debug=false win_vc=\"D:/Software/Program/VS2017/VC\" win_sdk=\"C:/Program Files (x86)/Windows Kits/10\" target_cpu=\"x86\""

我的

bin\gn gen out\arm64 --args="ndk=\"C:/Users/gluef/AppData/Local/Android/Sdk/ndk/23.1.7779620\" target_cpu=\"arm64\"" bin\gn gen out\arm64 --args="ndk=\"C:/Users/gluef/AppData/Local/Android/Sdk/ndk/27.0.11718014\" target_cpu=\"arm64\"" --ide=vs2022 

--- 这个后续有报错: 'ALooper_pollAll' has been explicitly marked unavailable here

bin\gn gen out\arm64 --args="ndk=\"C:/Users/gluef/AppData/Local/Android/Sdk/ndk/26.0.10792818\" target_cpu=\"arm64\"" --ide=vs2022 ninja -C out\arm64

# ninja直接编译

adb push out/arm64/dm /data/local/tmp 
adb push resources /data/local/tmp 
adb shell "cd /data/local/tmp; ./dm --src gm --config gl" 

最后一句证明不行

可以直接 adb shell

# 进去机器后

cd /data/local/tmp ./dm --src gm --config gles 

# 从gl改为gles

这个dm是干什么用的,其实不太清楚

参考

https://www.jianshu.com/p/1f222b143745

最后报 Python was not found ,很奇怪

我就从现有的一个path能找到的python.exe 复制为 python3.exe

Android版Viewer编译

设置

ANDROID_HOME

ANDROID_NDK_HOME

python3 platform_tools\android\bin\android_build_app -C out\arm64 viewer

最终命令,在 platform_tools\android 目录中

D:\Code\Google\skia\skia\platform_tools\android

apps\gradlew :viewer:assemblearm64debug -papps/viewer -Parm64.out.dir=D:\\Code\\Google\\skia\\skia\\out\\arm64 --daemon

命令行编译可以,用Android Studio直接打开 platform_tools\android\apps目录也是可以的

手机上运行viewer失败

因为工程中没有包含 libviewer.so

从 out/arm64从拷贝到工程中

运行即可

使用Android Studio运行工程也是可以的

注意

有两种放置.so文件的方式

  1. 按默认目录规范:放到 src/main/jniLibs/arm64-v8a/libviewer.so,同时配置文件中去掉 sourceSets.main.jniLibs.srcDir 的配置

  2. 遵循viewer源码设置:放到 src/main/libs/arm64-v8a/libviewer.so,同时配置保持 sourceSets.main.jniLibs.srcDir "src/main/libs"

这里要注意arm64-v8a这个,一定要根据实际架构来填写,如果直接放到 src/main/libs/libviewer.so 是没有效果的,so文件不会放到apk中,使用时就直接闪退

总结

Skia东西是好东西,但似乎Google有自己的编译体系和模板代码,所以对于普通开发者进行各个平台的适配,还是有很多工作要做的。