转至元数据结尾
转至元数据起始

xserver-xsdl实现了在Android环境下运行xserver显示linux图形桌面程序的功能

1. 准备源代码

最新代码在GitHub上,xserver-xsdl代码库,该代码库只有源码,最新代码在xsdl-1.20,不包含编译时的依赖包,基本编译不出来。

存在第三方打包的源代码XServer-XSDL-1.20.51-src.tar.xz,既包含源码,也包含依赖包在内的编译工程,做少量修改即可编译出app。

解压xz包,创建目录(mkdir -p xserver-xsdl),解药(tar Jxf XServer-XSDL-1.20.51-src.tar.xz -C xserver-xsdl)

XServer-XSDL-1.20.51解压后达到3G多的存储空间,主要因为其包含了编译不同CPU架构的依赖包编译环境和依赖包编译中间文件,为减少包的大小,可删除不用的CPU架构编译环境,只保留arm64-v8a编译环境,可用下面脚本删除相关文件:

#!/bin/bash



UNUSE_CPU_LIST="armeabi-v7a x86 x86_64"

for CPU in ${UNUSE_CPU_LIST} ;do
    find project -name "${CPU}" -exec rm -rf {} \; 2>/dev/null
    find project -name "tmp-${CPU}" -exec rm -rf {} \; 2>/dev/null
done

在构建git代码库时,可以忽略以下文件

# .gitignore

project/jni/application/xserver/libapplication-*.so
project/jni/application/xserver/AndroidData/bin-map.zip
project/jni/application/xserver/AndroidData/lib/

project/.gradle/
project/.knownPackages
project/app/build.gradle
project/app/build/
project/assets/
project/build-tools/
project/build/
project/emulator/
project/jni/Settings.mk
project/jni/application/xserver/gfx-arm64-v8a.o
project/jni/application/xserver/main-arm64-v8a.o
project/jni/openssl/include/
project/jni/openssl/lib-arm64-v8a/
project/jni/openssl/lib-armeabi-v7a/
project/jni/openssl/lib-x86/
project/jni/openssl/lib-x86_64/

project/lib
project/libs/
project/licenses
project/local.properties
project/obj/local/
project/patcher/
project/platform-tools/
project/platforms/
project/proguard-local.cfg
project/res/drawable/banner.png
project/res/raw/xsdl.raw
project/res/values-es/
project/res/values-fr/
project/res/values-ru/
project/res/values-uk/
project/res/values-zh/
project/res/values/strings.xml
project/tools/

注:

  • XServer-XSDL-1.20.51中包含依赖包源码编译生成的中间文件,如.libs,.deps,.o等,删除这些文件会导致编译失败,其编译工程可能存在一些文件有待解决

  • 使用xserver-xsdl最新代码代替XServer-XSDL-1.20.51中的相关部分,其编译依赖报错(xcb)等

2. 构建编译环境镜像

根据Dockerfile构建编译环境镜像:docker build -f xserver-xsdl.docker -t xserver-xsdl.image . 若镜像存在,可省略该步。

#xserver-xsdl.docker

FROM ubuntu:22.04

RUN apt-get update
RUN apt-get install -y apt-utils
RUN apt-get install -y bison file wget
RUN apt-get install -y make zip pkg-config curl autoconf automake autopoint libtool libtool-bin help2man texinfo intltool
RUN apt-get install -y xfonts-utils xutils-dev libfontenc-dev libxkbfile-dev libxmuu-dev libxfont-dev
RUN apt-get install -y libjpeg-dev libpng-dev libpixman-1-dev libssl-dev libpciaccess-dev

RUN apt-get install -y openjdk-8-jdk zipalign apksigner

# XServer-XSDL-1.20.51支持ndk22版本, 更新ndk版本时,需要修改对应的名称
RUN mkdir -p /Android/Sdk/ndk/ && wget https://dl.google.com/android/repository/android-ndk-r22b-linux-x86_64.zip && unzip android-ndk-r22b-linux-x86_64.zip -d /Android/Sdk/ndk/
ENV NDK_PATH=/Android/Sdk/ndk/android-ndk-r22b
# 设置环境变量,系统生效,NDK_PATH环境变量用来获取ndk版本
RUN echo "NDK_PATH=$NDK_PATH\nPATH=\"$NDK_PATH:$PATH\"" >>  /etc/bash.bashrc

注:

  • 当前xserver-xsdl版本支持ndk23编译

3. 启动编译环境

几个建议:

  • 将home目录映射至容器中,容器中的用户名即可与主机用户名相同,也可以统一为xsdl,只需确保用户名和用户组的id与主机一致

  • 源代码可放在用户的home目录下,Android的SDK也可以放在用户home目录下

  • 第一次进入容器后,添加用户。首先在主机上使用id命令找到用户名和用户组的id,然后在容器中指定id添加用户:

    • 假设主机上的用户组id为1000,则使用groupadd -g 1000 xsdl添加xsdl用户组

    • 假设主机上的用户名id为1000,则使用useradd -s /bin/bash -u 1000 -g xsdl xsdl

    • 使用su xsdl切换至xsdl用户

可创建一次性容器(docker run --rm -it -v $HOME:/home/xsdl -w /home/xsdl xserver-xsdl.docker /bin/bash),每次都执行以上步骤

也可生成一个命名容器(docker run -it -v $HOME:/home/xsdl -w /home/xsdl xserver-xsdl.docker --name user-defined-name-docker /bin/bash),执行一次以上步骤,下次使用docker start -i user-defined-name-docker进入容器,只需执行切换用户名即可

或者直接使用指定的uid和gid登录(docker run --rm -it  -u `id -u`:`id -g` -v $HOME:/home/xsdl -w /home/xsdl xserver-xsdl.docker  /bin/bash)则不需要上述操作.

4. 编译源代码

  1. 下载Android SDK,建议使用Android Studio下载,SDK的API级别为30(Android 11),参见SDK 平台。宿主机必须为x86_64环境

  2. 删除文件名包含非ASCII码的文件,编译环境不支持非ASCII文件名,运行一次即可,需要root权限,命令(rm -f project/jni/application/xserver/xserver/host-build/data/usr/lib/ssl/certs/NetLock_Arany_*.pem)

  3. 设置SDK根目录ANDROID_SDK环境变量,默认在$HOME/Android/Sdk

  4. 按照如下脚本执行,(需要跑多次,一次很难成功,原因未知)

#!/bin/bash

# 默认情况下,使用android-studio下载的sdk在此目录下
ANDROID_SDK=$HOME/Android/Sdk

if [ ! -L project/licenses ]; then
    rm -f project/licenses
    OLD_PWD=`pwd`
    cd "${ANDROID_SDK}"/tools/bin/
    ./sdkmanager --update
    ./sdkmanager --licenses
    cd "${OLD_PWD}"
    ln -s "${ANDROID_SDK}"/licenses project/
fi

# 环境变量NDK_PATH,容器镜像中下载了ndk,并定义了NDK_PATH环境变量
NDK_VERSION=`grep -w Pkg.Revision "$NDK_PATH/source.properties" | awk -F= '{print $2}' | awk '$1=$1'`
# 替换ndk版本号
sed -i 's/ndkVersion.*$/ndkVersion "'$NDK_VERSION'"/' project/app/build-template.gradle | grep ndk

# 指定ndk.dir,否则报错
if [ `grep -c ndk.dir  changeAppSettings.sh` -eq 0 ]; then
    sed -i '/proguard.config=proguard.cfg/a\echo "ndk.dir='$NDK_PATH'" >> project/local.properties' changeAppSettings.sh
fi

#只编译arm64-v8a
AndroidAppSetting=project/jni/application/xserver/AndroidAppSettings.cfg
sed -i "s/MultiABI.*$/MultiABI='arm64-v8a'/" $AndroidAppSetting

./build.sh xserver

注:XServer-XSDL-1.20.51支持ndk22版本,其它版本编译会出现问题

0 评论

你还没有登录。你所做的任何更改会将作者标记为匿名用户。 如果你已经拥有帐户,请登录