背景
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文件的方式
按默认目录规范:放到 src/main/jniLibs/arm64-v8a/libviewer.so,同时配置文件中去掉 sourceSets.main.jniLibs.srcDir 的配置
遵循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有自己的编译体系和模板代码,所以对于普通开发者进行各个平台的适配,还是有很多工作要做的。