编译 krita 绘画源码到安卓包 apk (一路踩坑)
来源:https://www.52pojie.cn/thread-2107011-1-1.html Screenshot_20260510-122012.jpg (446.73 KB, 下载次数: 0) 下载附件 2026-5-10 16:54 上传 以前发了一篇编译 krita 源码生成 windows 版 ,一路顺畅,然后编译安卓版 那叫做一个痛苦好几天,那坑踩个不停,终于整理出来了。 我的环…
来源:https://www.52pojie.cn/thread-2107011-1-1.html
以前发了一篇编译 krita 源码生成 windows 版 ,一路顺畅,然后编译安卓版 那叫做一个痛苦好几天,那坑踩个不停,终于整理出来了。
我的环境 win10 + wsl + ubuntu22.02
参考文档
https://docs.krita.org/sl/untranslatable_pages/building/build_krita_with_docker_on_linux.html#id8
https://docs.krita.org/sl/untranslatable_pages/building/build_krita_for_android.html#using-prebuilt-docker-image
ubuntu 22.04 安装 docker
# 1. 卸载旧版本
apt remove -y docker.io containerd runc
apt autoremove -y
# 2. 安装依赖
apt update
apt install -y ca-certificates curl
# 3. 添加官方 GPG
install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
chmod a+r /etc/apt/keyrings/docker.asc
# 4. 添加 24.04 仓库
echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu noble stable" | tee /etc/apt/sources.list.d/docker.list > /dev/null
# 5. 安装 Docker
apt update
apt install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin
备用的命令,不用执行
systemctl stop docker.socket
systemctl stop docker
systemctl start docker
systemctl status docker
停止 Docker 服务
systemctl stop docker.socket
systemctl stop docker
sudo systemctl stop docker
/etc/docker/daemon.json并添加以下 json 配置选项:
{
"data-root" : "/path/where/you/want/to/store/docker/images/"
}
重启 Docker 服务
systemctl start docker
安装
# Java 17
sudo apt install openjdk-17-jdk -y
# Python 3.10+(Ubuntu22 默认就是 3.10)
sudo apt install python3 python3-pip python3-venv -y
# 编译必备工具(未测试)
sudo apt install git build-essential ninja-build -y
可能需要
apt install -y build-essential make git gcc g++
apt update && apt install -y libatomic1 libatomic-dev gcc-multilib
宿主机上 wsl ubuntu22.04 并使用 root
在目录 /home 下载
git clone https://invent.kde.org/dkazakov/krita-docker-env krita-auto-1
新建目录 \home\krita-auto-1\persistent 下载源码
git clone https://invent.kde.org/graphics/krita.git #得到 \home\krita-auto-1\persistent\krita
git clone https://invent.kde.org/packaging/krita-deps-management.git #得到 \home\krita-auto-1\persistent\krita\krita-deps-management
git clone https://invent.kde.org/packaging/krita-ci-utilities.git krita-deps-management/ci-utilities #得到/home/krita-auto-1/persistent/krita/krita-deps-management/ci-utilities
新建目录 /home/krita-auto-1/persistent/downloads 下载 cmake 3.31.* 并安装
wget https://github.com/Kitware/CMake/releases/download/v3.31.9/cmake-3.31.9-linux-x86_64.tar.gz
tar -zxvf cmake-3.31.9-linux-x86_64.tar.gz
sudo cp -rf cmake-3.31.9-linux-x86_64/bin/* /usr/local/bin/
sudo cp -rf cmake-3.31.9-linux-x86_64/share/* /usr/local/share/
#安装完验证 cmake --version
https://github.com/android/ndk/wiki/Unsupported-Downloads
下载 android-ndk-r22b-linux-x86_64.zip
https://developer.android.com/studio?hl=zh-cn
下载 sdk commandlinetools-linux-14742923_latest.zip
下载的三个 jar 包放在 /home/krita-auto-1/persistent/downloads/jar
https://repo1.maven.org/maven2/org/jetbrains/kotlin/kotlin-stdlib-common/1.7.10/kotlin-stdlib-common-1.7.10.jar
https://repo1.maven.org/maven2/org/jetbrains/kotlin/kotlin-stdlib/1.7.10/kotlin-stdlib-1.7.10.jar
https://repo1.maven.org/maven2/org/jetbrains/annotations/13.0/annotations-13.0.jar
#在 /home/krita-auto-1/persistent/downloads 解压得到 android-ndk-r27d
unzip android-ndk-r27d-linux.zip
#解压得到 cmdline-tools,但新版本要求必须是:cmdline-tools/latest/bin/ ,所以需要添加一层目录 latest
unzip commandlinetools-linux-14742923_latest.zip
cd cmdline-tools
mkdir -p latest
find . -mindepth 1 -maxdepth 1 ! -name 'latest' -exec mv {} latest/ \;
cd ..
export ANDROID_ROOT=/home/krita-auto-1/persistent/downloads
export KDECI_ANDROID_SDK_ROOT=$ANDROID_ROOT/sdk
export PATH="$ANDROID_ROOT/sdk/platform-tools:$ANDROID_ROOT/cmdline-tools/latest/bin:$PATH"
#上面的环境变量使得 /home/krita-auto-1/persistent/downloads/cmdline-tools/latest/bin/sdkmanager 可以直接使用 sdkmanager 下载
yes | sdkmanager --sdk_root=$KDECI_ANDROID_SDK_ROOT --licenses
sdkmanager --sdk_root=$KDECI_ANDROID_SDK_ROOT platform-tools
sdkmanager --sdk_root=$KDECI_ANDROID_SDK_ROOT "platforms;android-35"
sdkmanager --sdk_root=$KDECI_ANDROID_SDK_ROOT "build-tools;30.0.3"
sdkmanager --sdk_root=$KDECI_ANDROID_SDK_ROOT "build-tools;34.0.0"
sdkmanager --sdk_root=$KDECI_ANDROID_SDK_ROOT "build-tools;35.0.0"
sdkmanager --sdk_root=$KDECI_ANDROID_SDK_ROOT emulator
sdkmanager --sdk_root=$KDECI_ANDROID_SDK_ROOT tools
root@Administrator:/home/krita-auto-1#
./bin/bootstrap-deps.sh --android=arm64-v8a
./bin/build_image --android #失败就手动拉取里面镜像( home\krita-auto-1\bin\base-image.conf) ,拉取不了就让 ai 改成 ubuntu 国内镜像
./bin/run_container #先删除避免已存在 docker rm -f krita-auto-1
#报错因为无界面 ubuntu 需要删除文件 /home/krita-auto-1/bin/run_container 内容 `--device /dev/dri` 强行挂载 。downloads 和 persistent 是默认挂载的目录:
./bin/enter
#进入容器失败的话让 ai 修改内容,实在不行就手动进入容器 docker exec -it --user root krita-auto-1 /bin/bash , 切换用户 su - appimage ,ls -ld . 查看当前路径权限 , chown -R appimage:appimage /home/appimage/appimage-workspace/ 可以给用户权限
进入容器后:
测试网络是否能连通外面
curl -I https://www.google.com
测试 HTTPS / TLS 能不能握手(这个会失败,因为容器 ssl 原因,后面会手动下载失败的地方)
openssl s_client -connect repo.maven.apache.org:443
#设置环境变量
export KDECI_ANDROID_ABI=arm64-v8a
KDECI_WORKDIR_PATH=/home/appimage/appimage-workspace
export KDECI_SHARED_INSTALL_PATH=/home/appimage/appimage-workspace/deps/usr
#下面两个路径是 sdk 和 ndk 目录
export KDECI_ANDROID_NDK_ROOT=~/persistent/downloads/android-ndk-r27d
export KDECI_ANDROID_SDK_ROOT=~/persistent/downloads/sdk
export ANDROID_ABI=arm64-v8a
容器内默认是用户 appimage ,编译
mkdir -p /home/appimage/appimage-workspace/krita/_build
cd /home/appimage/appimage-workspace/krita/_build
cmake -DCMAKE_BUILD_TYPE=RelWithDebInfo \
-DHIDE_SAFE_ASSERTS=OFF \
-DBUILD_TESTING=OFF \
-DCMAKE_INSTALL_PREFIX=~/appimage-workspace/deps/usr/ \
-DCMAKE_TOOLCHAIN_FILE=~/persistent/krita/krita-deps-management/tools/android-toolchain-krita.cmake \
-DANDROID_ENABLE_STDIO_FORWARDING=ON \
~/persistent/krita/
make -j8 install
打包
python ~/persistent/krita/build-tools/ci-scripts/build-android-package.py
#报错 git 报错不安全提示运行:
git config --global --add safe.directory /home/appimage/persistent/krita #运行后提示运行: cmake --build . --target create-apk 但是需要传递环境变量
ANDROID_ABI=arm64-v8a KRITA_INSTALL_PREFIX=/home/appimage/appimage-workspace/deps/usr cmake --build . --target create-apk
#即使如此还是可能会报错下载 jar 包失败,原因是容器 ssl 之类导致无法下载,需要手动下载
mkdir -p ~/.gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/kotlin-stdlib/1.7.10/
mkdir -p ~/.gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/kotlin-stdlib-common/1.7.10/
mkdir -p ~/.gradle/caches/modules-2/files-2.1/org.jetbrains/annotations/13.0/
#因为一开始就把把手动下载的三个 jar 包放在宿主机 /home/krita-auto-1/persistent/downloads/jar
cp ~/persistent/downloads/jar/annotations-13.0.jar /home/appimage/.gradle/caches/modules-2/files-2.1/org.jetbrains/annotations/13.0/
cp ~/persistent/downloads/jar/kotlin-stdlib-1.7.10.jar /home/appimage/.gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/kotlin-stdlib/1.7.10/
cp ~/persistent/downloads/jar/kotlin-stdlib-common-1.7.10.jar /home/appimage/.gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/kotlin-stdlib-common/1.7.10/
#期间会下载 gradle-8.13-bin.zip ,失败就手动下载放到 /home/krita-auto-1/persistent/downloads 然后执行
#cp ~/persistent/downloads/gradle-8.13-bin.zip /home/appimage/.gradle/wrapper/dists/gradle-8.13-bin/5xuhj0ry160q40clulazy9h7d !!!随机数字/
成功会提示
Android package built successfully in 65.341 ms.
-- File: /home/appimage/appimage-workspace/krita/_build/krita_build_apk//build/outputs/apk/debug/krita_build_apk-debug.apk
[100%] Built target create-apk-krita
[100%] Built target create-apk
成功后从容器拷贝 apk 到宿主机,我在 三星 tab s4 平板上面可以正常运行,老机器都很流畅,其他未测试过
docker cp krita-auto-1:/home/appimage/appimage-workspace/krita/_build/krita_build_apk/build/outputs/apk/debug/ .
kis_tool_line 长度、粗细、同比例 正确.rar
(9.13 KB, 下载次数: 3)
/home/krita-auto-1/persistent/krita/plugins/tools/basictools
重新编译改动的模块,比如改了源码,重新编译
make -j8 clean all install
make install
-j8:8 线程加速
kritadefaulttools:只编译你改的这个插件
-B:强制重新编译,不管是否修改