准备工作

在开始前,需要准备好下面这些东西:

开始编译

生成 standalone toolchains

这个freetype也是比较坑的,如果直接使用下载下来的ndk中prebuild目录里面提供的gcc,会报各种奇怪的错误。能力有限,不能一个一个的去研究是怎么回事,那就弄个standalone的toolchains出来

进入到下载解压好的ndk目录中,找到build/tools/make-standalone-toolchain.sh 。这个脚本就是帮助构建standalone的toolchain用的。可以看一下它的帮助信息:

root@ubuntu:/home/mkxx/android-ndk-r17c/build/tools# ./make-standalone-toolchain.sh --help                                                                                                                  
HOST_OS=linux                                                                                                                                                                                               
HOST_EXE=                                                                                                                                                                                                   
HOST_ARCH=x86_64                                                                                                                                                                                            
HOST_TAG=linux-x86_64                                                                                                                                                                                       
HOST_NUM_CPUS=4                                                                                                                                                                                             
BUILD_NUM_CPUS=8                                                                                                                                                                                            
Usage: make-standalone-toolchain.sh [options]                                                                                                                                                               
                                                                                                                                                                                                            
Generate a customized Android toolchain installation that includes                                                                                                                                          
a working sysroot. The result is something that can more easily be                                                                                                                                          
used as a standalone cross-compiler, e.g. to run configure and                                                                                                                                              
make scripts.                                                                                                                                                                                               
                                                                                                                                                                                                            
Valid options (defaults are in brackets):                                                                                                                                                                   
                                                                                                                                                                                                            
  --help                   Print this help.                                                                                                                                                                 
  --verbose                Enable verbose mode.                                                                                                                                                             
  --dryrun                 Unsupported.                                                                                                                                                                     
  --toolchain=<name>       Specify toolchain name                                                                                                                                                           
  --use-llvm               No-op. Clang is always available.                                                                                                                                                
  --stl=<name>             Specify C++ STL [gnustl]                                                                                                                                                         
  --arch=<name>            Specify target architecture                                                                                                                                                      
  --abis=<list>            No-op. Derived from --arch or --toolchain.                                                                                                                                       
  --ndk-dir=<path>         Unsupported.                                                                                                                                                                     
  --package-dir=<path>     Place package file in <path> [/tmp/ndk-]                                                                                                                                         
  --install-dir=<path>     Don't create package, install files to <path> instead.                                                                                                                           
  --dryrun                 Unsupported.                                                                                                                                                                     
  --platform=<name>        Specify target Android platform/API level. [android-14]                                                                                                                          
  --force                  Remove existing install directory.

编译toolchain的时候,建议打开verbose开关,可以方便的看到具体出错信息。 以arm64平台为例:

root@ubuntu:/home/mkxx/android-ndk-r17c/build/tools# ./make-standalone-toolchain.sh --platform=android-21 --install-dir=/home/mkxx/ndk-r17c-standalone --arch=arm64 --verbose                               
HOST_OS=linux                                                                                                                                                                                               
HOST_EXE=                                                                                                                                                                                                   
HOST_ARCH=x86_64                                                                                                                                                                                            
HOST_TAG=linux-x86_64                                                                                                                                                                                       
HOST_NUM_CPUS=4                                                                                                                                                                                             
BUILD_NUM_CPUS=8                                                                                                                                                                                            
## COMMAND: python ./make_standalone_toolchain.py --arch arm64 --api 21 --stl gnustl --install-dir=/home/mkxx/ndk-r17c-standalone                                                                           
WARNING:__main__:gnustl is deprecated and will be removed in the next release. Please switch to libc++. See https://developer.android.com/ndk/guides/cpp-support.html for more information.                 
Toolchain installed to /home/mkxx/ndk-r17c-standalone.

注意事项

  • –arch接受的参数在r17c中只有arm,arm64,x86,x86_64 这四个 ,而且不能同时指定多个
  • 如果–arch指定的是arm64,则–platform至少要为android-21,否则会报错: xx is less than minimum platform for arm64 (21)
  • 若想要多个架构,最好指定不同的路径,分多次进行处理;使用–force参数后,原有路径会被删除
  • 如果提示找不到python, 可以通过apt install python命令解决(注意不是python3 )

编译Freetype

在开始前,需要安装几个依赖:(可能还不止这几个)

apt install libtool autoconf automake

把源码包下载下来后解压,然后执行目录中的autogen.sh

root@ubuntu:/home/mkxx/freetype-2.9# ./autogen.sh 
generating `configure.ac'
running `aclocal -I . --force'
running `libtoolize --force --copy --install'
libtoolize: putting auxiliary files in '.'.
libtoolize: copying file './config.guess'
libtoolize: copying file './config.sub'
libtoolize: copying file './install-sh'
libtoolize: copying file './ltmain.sh'
libtoolize: Consider adding 'AC_CONFIG_MACRO_DIRS([m4])' to configure.ac,
libtoolize: and rerunning libtoolize and aclocal.
libtoolize: Consider adding '-I m4' to ACLOCAL_AMFLAGS in Makefile.am.
running `autoconf --force'

接下来编写编译脚本,此处使用arm64:

#!/bin/sh

NDK=/home/mkxx/ndk-r17c-standalone
PLATFORM=aarch64-linux-android

export CC="$NDK/bin/aarch64-linux-android-gcc"
export CXX="$NDK/bin/aarch64-linux-android-g++"
export AR="$NDK/bin/aarch64-linux-android-ar"
export LD="$NDK/bin/aarch64-linux-android-ld"
export STRIP="$NDK/bin/aarch64-linux-android-strip"
export CFLAGS="-fPIE -fpie"

./configure \
--prefix="/home/mkxx/libfreetype2" \
--without-zlib \
--with-sysroot=$NDK/sysroot \
--host="$PLATFORM"

如果没有看到明显的输出错误,就可以继续make & make install了

root@ubuntu:/home/mkxx/libfreetype2# ls -la
total 0
drwxr-xr-x 1 root root  36 Oct 16 07:30 .
drwxr-xr-x 1 root root 156 Oct 16 07:30 ..
drwxr-xr-x 1 root root  30 Oct 16 07:30 bin
drwxr-xr-x 1 root root  18 Oct 16 07:30 include
drwxr-xr-x 1 root root 100 Oct 16 07:30 lib
drwxr-xr-x 1 root root  20 Oct 16 07:30 share

至此,freetype for android编译成功

本文转载自: https://www.moerats.com/archives/612/

说明:Ubuntu 18.04改变挺大的,内核也直接升到了正式版4.15,而BBR内核要求为4.9,也就是说满足了,所以我们不需要换内核就可以很快的开启BBR,这里简单说下方法。

* 提示:Ubuntu 18.10依然可以用该方法开启BBR,而对于19.04、貌似官方直接给你开启了BBR,不需要重复开启了。


1、修改系统变量

echo "net.core.default_qdisc=fq" >> /etc/sysctl.conf
echo "net.ipv4.tcp_congestion_control=bbr" >> /etc/sysctl.conf

2、保存生效

sysctl -p

3、查看内核是否已开启BBR

sysctl net.ipv4.tcp_available_congestion_control

显示以下即已开启:

# sysctl net.ipv4.tcp_available_congestion_control
net.ipv4.tcp_available_congestion_control = bbr cubic reno

4、查看BBR是否启动

lsmod | grep bbr

显示以下即启动成功:

# lsmod | grep bbr
tcp_bbr                20480  14

群晖上的Docker是个很好用的功能,本人也使用Docker安装了不少程序,总体来说使用还是很方便的。

但是最近冒出了一个问题:Docker里面的程序如果有新版本了要如何更新呢?

搜罗了一圈百度,结果没找到什么有价值的东西,果然百度一下,什么都不知道。最后还是用Google找到了办法,总结了两个办法:

第一个,笨办法:把下载的镜像删掉,容器也删掉,重新下载,保证是最新的;

第二个,保留容器的设置:首先在群晖的web页面上把docker里需要更新的程序停止,然后用命令docker pull <repo>更新要更新的程序,完事后回到页面上选中该程序后,点击操作->清除,清理里面的数据(事实证明,这一步必须要做,否则会无效),最后启动该容器,里面的程序就会是最新版本的了