12下一页
返回列表 发新帖

在mt管理器的终端中运行woff2

[复制链接]

43

主题

453

回帖

2654

积分

大学生

Rank: 5Rank: 5

金币
54
好评
51
信誉
102
发表于 2023-9-3 19:58:07 来自手机  | 显示全部楼层 | 阅读模式  来自 广西
一、引言
之前有发过一个关于如何在 obsidian 中更改字体的贴子,当时用的方法是找一个相关的在线网站来处理字体并生成对应的 css 文件,这做法说起来也是相当方便快捷了。不过,在线网站还是存在着网络速度和文件大小这两个限制因素,所以,在经过一些尝试之后,找到了在手机离线的条件下也能完成更改字体的方法。

因为在 obsidian 中改字体需要做的主要工作就是压缩字体文件和对字体文件进行 base64 编码,所以,根据这两个目标,在 GitHub 上找到了对应的字体压缩工具 woff2。又因为在手机上可以运行 busybox,且 busybox 中存在 base64 命令,所以一开始并没有想太多,以为只需要得到 woff2 就可以,但后来发现 busybox 提供的 base64 好像不太行,还是得其它版本的 base64 才可以。

因为我没有电脑,也不可能花钱去网吧去做这种事,所以,就需要用到 GitHub Action 来完成编译相关的事。下面就简单地说一下整体的操作过程,文中有错误的地方希望可以提出来

二、相关理论
1. 交叉编译
  1. to cross-compile is to build on one platform a binary that will run on another platform
复制代码
简单来说就是,在 Windows 上生成了在安卓上可以运行的程序的行为就属于交叉编译

2. YAML 标准
因为 GitHub Action 是读取 yaml 格式的文件来运行的,所以需要了解一下相关的标准,其中主要是去了解 Block scalar styles 和 flow scalar styles 这两方面的内容,也就是和多行文本相关的内容。

这里引用一下路过君_P的相关表达
  1. 多行字符串可以用 | 保留换行
复制代码


3. NDK


三、编译
Github Action 需要一个 yaml 格式的文件才能运行,所以这里直接给出一个仅供参考的的 workflow 文件的代码,相应的部分都尽可能地提供了对应的注释,代码如下:
workflow of woff2
  1. # https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions#name
  2. name: woff2

  3. # https://docs.github.com/en/actions/learn-github-actions/variables#defining-environment-variables-for-a-single-workflow
  4. env:
  5.   TARGET: aarch64-linux-android
  6.   MINSDKVERSION: 24
  7.   API: 24
  8.   ABI: arm64-v8a

  9. on:
  10.   watch: # https://docs.github.com/en/actions/using-workflows/events-that-trigger-workflows#watch
  11.     type: [started]

  12. jobs:
  13.   build: # https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions#jobsjob_id
  14.     name: Test Build # https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions#jobsjob_idname
  15.     runs-on: ubuntu-latest # https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions#example-specifying-an-operating-system

  16. # every step must define a uses or run key
  17. # https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions#jobsjob_idsteps
  18. # https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions#jobsjob_idstepsname
  19. # https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions#jobsjob_idstepsuses
  20.     steps:
  21. # https://github.com/marketplace/actions/checkout
  22. #      - name: Checkout Code
  23. #        uses: actions/checkout@v3.6.0

  24. # https://github.com/marketplace/actions/setup-android-ndk
  25. # https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions#jobsjob_idstepswith
  26. # https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions#jobsjob_idstepsid
  27. # https://docs.github.com/en/actions/learn-github-actions/contexts#steps-context
  28.       - name: Setup Android NDK
  29.         uses: nttld/setup-ndk@v1.3.1
  30.         id: setup-ndk
  31.         with:
  32.           ndk-version: r22b # https://github.com/android/ndk/wiki/Changelog-r22#r22b
  33.           local-cache: true
  34.           add-to-path: true

  35. # https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions#jobsjob_idstepsrun
  36.       - name: Build woff2 For Android
  37.         env:
  38.           NDK: ${{ steps.setup-ndk.outputs.ndk-path }}
  39.           TOOLCHAIN: ${{ steps.setup-ndk.outputs.ndk-path }}/toolchains/llvm/prebuilt/linux-x86_64
  40. # https://developer.android.com/ndk/guides/other_build_systems?hl=en#autoconf
  41.         run: |
  42.           export AR=$TOOLCHAIN/bin/llvm-ar
  43.           export NM=$TOOLCHAIN/bin/llvm-nm
  44.           export OBJCOPY=$TOOLCHAIN/bin/llvm-objcopy
  45.           export OBJDUMP=$TOOLCHAIN/bin/llvm-objdump
  46.           export RANLIB=$TOOLCHAIN/bin/llvm-ranlib
  47.           export STRIP=$TOOLCHAIN/bin/llvm-strip
  48.           export STRINGS=$TOOLCHAIN/bin/llvm-strings
  49.           export LD=$TOOLCHAIN/bin/ld
  50.           export CC=$TOOLCHAIN/bin/$TARGET$API-clang
  51.           export CXX=$TOOLCHAIN/bin/$TARGET$API-clang++
  52.           export AS=$CC
  53.           export PATH=$TOOLCHAIN/bin:$PATH
  54.          
  55.           sudo mkdir $GITHUB_WORKSPACE/updir
  56.          
  57.          
  58.           cd $GITHUB_WORKSPACE
  59.           sudo git clone --recursive https://github.com/google/woff2.git
  60.           cd woff2
  61.           echo '--- 开始编译 ---'
  62.           sudo make \
  63.           CC=$CC \
  64.           CXX=$CXX \
  65.           AS=$AS \
  66.           AR=$AR \
  67.           LD=$LD \
  68.           RANLIB=$RANLIB \
  69.           ARFLAGS=crs \
  70.           clean all
  71.           echo '--- 编译结束 ---'
  72.          
  73.           echo '--- 复制编译后的文件 ---'
  74.           sudo cp $(find $GITHUB_WORKSPACE -name woff2_compress) $GITHUB_WORKSPACE/updir
  75.           sudo cp $(find $GITHUB_WORKSPACE -name woff2_decompress) $GITHUB_WORKSPACE/updir
  76.           sudo cp $(find $TOOLCHAIN/sysroot/usr/lib/aarch64-linux-android -name libc++_shared.so) $GITHUB_WORKSPACE/updir
  77.           echo '--- 复制结束 ---'
  78.           echo '--- 打印文件信息 ---'
  79.           file $(find $GITHUB_WORKSPACE -name woff2_compress -executable)
  80.           file $(find $GITHUB_WORKSPACE -name woff2_decompress -executable)
  81.           echo '--- 打印结束 ---'


  82.       - name: Upload Artifact
  83.         uses: actions/upload-artifact@v3.1.2
  84.         with:
  85.           name: woff2
  86.           path: updir/
复制代码

大概等两分钟就可以编译好了,如下图(点击文件名 woff2 即可自动下载)



然后,把它解压到 mt 管理器的私有目录,即 /data/user/0/bin.mt.plus/files 下。为了方便,这里以 /data/user/0/bin.mt.plus/files/term/usr/bin 为例
解压可执文件到 bin 目录


解压动态库到 lib 目录


然后就可以使用这个程序了,示例如下图


然后,本想着复制贴子的做法,但是没想到出了问题
贴子的做法如下:
  1. base64 -w 0 <woff2文件> | awk '{printf "@font-face {\n\tfont-family: '<font-family字段>';\n\tsrc: url('\''data:font/woff2;charset=utf-8;base64,"$0"'\'') format('\''woff2'\'');\n\tfont-weight: <字重>;\n\tfont-style: normal;\n\tfont-display: swap;\n}\n"}' >> <样式表.css>
复制代码


busybox 提供的 base64 支持的选项有限,不支持参数 -w


所以,还得需要使用其它版本的 base64 才可以解析参数 w。然后在 termux 中看了一下,发现 termux 中的 base64 是可以用的
info of termux base64


从图中可以看到,GNU 类型的 base64 支持参数 wrap,所以,需要再额外编译一下这个版本的 base64。仅供参考的代码如下:
gnu coreutils workflow
  1. # https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions#name
  2. name: Test

  3. # https://docs.github.com/en/actions/learn-github-actions/variables#defining-environment-variables-for-a-single-workflow
  4. env:
  5.   TARGET: aarch64-linux-android
  6.   MINSDKVERSION: 24
  7.   API: 24
  8.   ABI: arm64-v8a
  9.   MAKETO: /data/local/tmp/gnu_coreutils
  10.   PKGNAME: coreutils
  11.   COREGNUVERSION: 9.4

  12. on:
  13.   watch: # https://docs.github.com/en/actions/using-workflows/events-that-trigger-workflows#watch
  14.     type: [started]

  15. jobs:
  16.   build: # https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions#jobsjob_id
  17.     name: Test Build # https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions#jobsjob_idname
  18.     runs-on: ubuntu-latest # https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions#example-specifying-an-operating-system

  19. # every step must define a uses or run key
  20. # https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions#jobsjob_idsteps
  21. # https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions#jobsjob_idstepsname
  22. # https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions#jobsjob_idstepsuses
  23.     steps:
  24. # https://github.com/marketplace/actions/checkout
  25. #      - name: Checkout Code
  26. #        uses: actions/checkout@v3.6.0

  27. # https://github.com/marketplace/actions/setup-android-ndk
  28. # https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions#jobsjob_idstepswith
  29. # https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions#jobsjob_idstepsid
  30. # https://docs.github.com/en/actions/learn-github-actions/contexts#steps-context
  31.       - name: Setup Android NDK
  32.         uses: nttld/setup-ndk@v1.3.1
  33.         id: setup-ndk
  34.         with:
  35.           ndk-version: r22b # https://github.com/android/ndk/wiki/Changelog-r22#r22b
  36.           local-cache: true
  37.           add-to-path: true

  38. # https://docs.github.com/en/actions/learn-github-actions/variables#defining-environment-variables-for-a-single-workflow
  39. # https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions#env
  40. # https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions#jobsjob_idstepsrun
  41. # https://developer.android.com/ndk/guides/other_build_systems?hl=en#autoconf
  42. # https://docs.github.com/en/actions/using-workflows/workflow-commands-for-github-actions#setting-an-environment-variable
  43.       - name: Setup Cross Compile Variable
  44.         env:
  45.           NDK: ${{ steps.setup-ndk.outputs.ndk-path }}
  46.           TOOLCHAIN: ${{ steps.setup-ndk.outputs.ndk-path }}/toolchains/llvm/prebuilt/linux-x86_64
  47.         run: |
  48.           echo "AR=$TOOLCHAIN/bin/llvm-ar" >> "$GITHUB_ENV"
  49.           echo "NM=$TOOLCHAIN/bin/llvm-nm" >> "$GITHUB_ENV"
  50.           echo "OBJCOPY=$TOOLCHAIN/bin/llvm-objcopy" >> "$GITHUB_ENV"
  51.           echo "OBJDUMP=$TOOLCHAIN/bin/llvm-objdump" >> "$GITHUB_ENV"
  52.           echo "RANLIB=$TOOLCHAIN/bin/llvm-ranlib" >> "$GITHUB_ENV"
  53.           echo "STRIP=$TOOLCHAIN/bin/llvm-strip" >> "$GITHUB_ENV"
  54.           echo "STRINGS=$TOOLCHAIN/bin/llvm-strings" >> "$GITHUB_ENV"
  55.           echo "LD=$TOOLCHAIN/bin/ld" >> "$GITHUB_ENV"
  56.           echo "CC=$TOOLCHAIN/bin/$TARGET$API-clang" >> "$GITHUB_ENV"
  57.           echo "CXX=$TOOLCHAIN/bin/$TARGET$API-clang++" >> "$GITHUB_ENV"
  58.           echo "SYSROOT=$TOOLCHAIN/sysroot" >> "$GITHUB_ENV"
  59.           echo "TOOLCHAIN=$TOOLCHAIN" >> "$GITHUB_ENV"
  60.           echo "NDK=$NDK" >> "$GITHUB_ENV"


  61.       - name: Build coreutils For Android
  62.         run: |
  63.           sudo wget https://ftp.gnu.org/gnu/coreutils/coreutils-$COREGNUVERSION.tar.gz
  64.           sudo tar zxf coreutils-$COREGNUVERSION.tar.gz
  65.           cd coreutils-$COREGNUVERSION
  66.           sudo mkdir -p $MAKETO
  67.          
  68.           sudo ./configure \
  69.           --host=$TARGET \
  70.           --build=x86_64-linux-gnu \
  71.           --prefix=$MAKETO \
  72.           CC=$CC \
  73.           CXX=$CXX \
  74.           AS=$AS \
  75.           AR=$AR \
  76.           LD=$LD \
  77.           RANLIB=$RANLIB
  78.          
  79.           echo "---------- compile begin ----------"
  80.           sudo bash -c "make && make install"
  81.           echo "---------- compile end ----------"
  82.           echo "---------- 输出文件信息 ----------"
  83.           sudo file $(find /data -name base64 -executable)
  84.           echo "---------- 结束 ----------"
  85.           mkdir -p $GITHUB_WORKSPACE/output
  86.           cd $GITHUB_WORKSPACE/output
  87.           echo "---------- tar result ----------"
  88.           sudo bash -c "find $MAKETO \
  89.           -printf '%P\n' \
  90.           -type f -o \
  91.           -type l -o \
  92.           -type d | \
  93.           tar -czvf $PKGNAME.tar.gz \
  94.           --no-recursion \
  95.           -C $MAKETO \
  96.           -T -"
  97.           echo "---------- tar end ----------"

  98. # https://github.com/marketplace/actions/upload-a-build-artifact
  99.       - name: Upload Artifact
  100.         uses: actions/upload-artifact@v3.1.2
  101.         with:
  102.           name: coreutils
  103.           path: ${{ github.workspace}}/output/${{ env.PKGNAME }}.tar.gz
复制代码


类似地,也需要把对应的文件复制到 mt 管理器的私有目录下,这里以 /data/user/0/bin.mt.plus/files/term/usr 为例,先新建一个 gnu_coreutils 目录,然后复制编译后的文件进去
复制 coreutils(因为我提前复制过了,所以两边是一样的)



给予文件权限


然后,运行刚刚的命令,发现可以正常运行了


导入到 obsidian 中也是有效果了



四、参考
这篇笔记参考的文章如下:
1. 移动端自定义字体简要说明
2. How do I break a string in YAML over multiple lines?
3. YAML多行表示
回复

使用道具 举报

28

主题

6648

回帖

1万

积分

博士生

百川

Rank: 7Rank: 7Rank: 7

金币
8818
好评
1
信誉
150

MT论坛新人考神MT论坛帅哥

发表于 2023-9-3 20:02:01 来自手机  | 显示全部楼层  来自 四川
感谢分享,辛苦了
回复

使用道具 举报

18

主题

9045

回帖

1万

积分

博士生

Rank: 7Rank: 7Rank: 7

金币
4987
好评
3
信誉
202

考神

发表于 2023-9-3 20:18:36 来自手机  | 显示全部楼层  来自 广东
感谢
回复

使用道具 举报

2

主题

3099

回帖

7267

积分

硕士生

Rank: 6Rank: 6

金币
1623
好评
3
信誉
104
发表于 2023-9-3 20:25:27 | 显示全部楼层  来自 广西
感谢分享,这么长的文章很花精力的
回复

使用道具 举报

0

主题

1787

回帖

3650

积分

大学生

Rank: 5Rank: 5

金币
16
好评
0
信誉
100
发表于 2023-9-3 20:38:04 | 显示全部楼层  来自 广西
感谢分享
回复

使用道具 举报

8

主题

1万

回帖

2万

积分

博士后

Rank: 8Rank: 8

金币
5143
好评
1
信誉
100
发表于 2023-9-3 21:10:29 来自手机  | 显示全部楼层  来自 山东
感谢分享
回复

使用道具 举报

0

主题

3328

回帖

8016

积分

硕士生

Rank: 6Rank: 6

金币
1353
好评
0
信誉
100

考神

发表于 2023-9-3 22:46:17 来自手机  | 显示全部楼层  来自 广东
感谢分享
回复

使用道具 举报

1

主题

3085

回帖

1万

积分

博士生

666

Rank: 7Rank: 7Rank: 7

金币
3382
好评
1
信誉
100

MT论坛新人MT论坛最佳新人

发表于 2023-9-3 23:11:16 来自手机  | 显示全部楼层  来自 广东
感谢分享
回复

使用道具 举报

37

主题

1919

回帖

7448

积分

硕士生

化自在

Rank: 6Rank: 6

金币
6088
好评
8
信誉
101

考神MT论坛帅哥

发表于 2023-9-4 00:23:00 来自手机  | 显示全部楼层  来自 广东
路过看看
回复

使用道具 举报

2

主题

835

回帖

2326

积分

大学生

Rank: 5Rank: 5

金币
688
好评
0
信誉
98

MT论坛新人MT论坛帅哥考神

发表于 2023-9-4 06:55:29 来自手机  | 显示全部楼层  来自 山东
感谢分享
回复

使用道具 举报

22

主题

6592

回帖

2万

积分

博士后

超级至尊VIP

Rank: 8Rank: 8

金币
6092
好评
6
信誉
99

考神MT论坛新人MT论坛帅哥MT论坛最佳新人MT论坛活跃会员挂机大佬

发表于 2023-9-4 07:01:08 来自手机  | 显示全部楼层  来自 甘肃
感谢分享
回复

使用道具 举报

0

主题

224

回帖

735

积分

初中生

Rank: 3Rank: 3

金币
889
好评
0
信誉
98
发表于 2023-9-4 23:23:01 来自手机  | 显示全部楼层  来自 广东
66666
回复

使用道具 举报

22

主题

1万

回帖

2万

积分

博士后

坤锁

Rank: 8Rank: 8

金币
11151
好评
1
信誉
100
发表于 2023-9-5 10:50:44 来自手机  | 显示全部楼层  来自 辽宁
感谢分享
回复

使用道具 举报

0

主题

986

回帖

3015

积分

大学生

Rank: 5Rank: 5

金币
2136
好评
0
信誉
100
发表于 2023-10-8 15:38:06 | 显示全部楼层  来自 北京
有创意的分享,赞
回复

使用道具 举报

21

主题

4069

回帖

7762

积分

硕士生

Rank: 6Rank: 6

金币
662
好评
2
信誉
84
发表于 2023-10-8 17:07:06 来自手机  | 显示全部楼层  来自 云南
感谢大佬分享这个方法,满篇的代码。
回复

使用道具 举报

发表回复

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表