准备工作

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

开始编译

生成 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://forum.xda-developers.com/pixel-c/help/device-resource-busy-t3449240

正常将只读的/system分区变成可读写是用下面这个命令:

mount -o remount,rw /system

一般情况下,/system就变成可读写了。但是在某些设备上,会提示Device or resource busy错误。这个时候只需要将-o的两个参数顺序调换一下即可,也就是这样:

mount -o rw,remount /system

本文的创作参考了很多前辈们的博文。没有这些前辈们,估计现在我还在ffmpeg的坑里面打转。。

首先要感谢这位前辈的博文:https://www.cnblogs.com/tplusy/p/11012149.html。本文的思路就是源自于Ta。虽然Ta是在Windows上进行处理的,但是却给我了启发。好了,下面开始正题。

事前工作

准备一台运行Ubuntu的电脑/虚拟机。我这边使用的是vmware虚拟机,系统为ubuntu 18.04 Server。同时安装好必要的依赖。

下载NDK

这里下载NDK。我这边选择了NDK r19c的版本。下载完成后解压到目录中备用。

下载FFmpeg源码

FFmpeg的官网地址: https://ffmpeg.org/download.html 。找到右下角的source code,通过git clone下来,然后可以直接进行使用,或者也可以直接下载打包好的tar.bz2,但是建议还是通过git去clone源码。我这边clone后选择的是切换到release/4.2的分支上进行编译操作。

题外废话

最开始我用了r13b的NDK,打算用gcc去进行编译。后来发现搞不灵光,总是有莫名其妙的错误。后来参考前辈的博文,就去下了r19c的NDK,用llvm的clang进行编译。说实话clang确实方便,可以完全不用改动FFmpeg的源码,而且FFmpeg也已经在configure文件中加入了android平台的支持。经研究,当前的分支release/4.2中,如果编译平台为android,则默认使用clang进行编译。

编写编译脚本

我用的脚本如下(llvm的clang编译),仅供参考:

#!/bin/bash

#Android System API Level,你要运行在什么系统上,就填写系统API Level
#但是这个API Level必须要能够在NDK中找得到,详见下面的ANDROID_CROSS_PREFIX
API_LEVEL=23

#设置ndk目录
NDK=<改成你的ndk路径>/android-ndk-r19c

#llvm toolchain路径。linux下是linux-x86_64,windows下则是windows开头的。
TOOLCHAIN=$NDK/toolchains/llvm/prebuilt/linux-x86_64

#sysroot 这个一定要设置成 ndk的llvm 路径下的 sysroot 
#这里有个坑要注意,sysroot文件夹在r19c后才存在,r18b中是没有的!
SYSROOT=$TOOLCHAIN/sysroot

#ar nm 的prefix。这里一定要保证和编译的系统位数保持一致
PLATFORM=aarch64-linux-android

#ASM 路径, 同上必须是llvm 目录下的 asm
#说实话,我不知道为啥要ASM。。
ASM=$SYSROOT/usr/include/$PLATFORM

#完整的 cross prefix
CROSS_PREFIX=$TOOLCHAIN/bin/$PLATFORM-

#专门给ndk clang/clang++ 的 cross prefix
ANDROID_CROSS_PREFIX=$TOOLCHAIN/bin/aarch64-linux-android$API_LEVEL-

#临时文件目录
TMPDIR="./temp"

#CPU架构
#64位arm:aarch64
#32位arm:armv7-a
#64位intel/amd:x86_64
#32位intel/amd:x86
ARCH=aarch64

#操作系统
OS=android

#安装位置
PREFIX=~/ffmpeg_out/android/$ARCH

#额外C参数
ADDI_CFLAGS=""

#这里面不能写注释,否则会报错
./configure \
--prefix=$PREFIX \
--enable-cross-compile \
--cross-prefix=$CROSS_PREFIX \
--target-os=$OS \
--arch=$ARCH \
--pkg-config=$(which pkg-config) \
--cc=${ANDROID_CROSS_PREFIX}clang \
--cxx=${ANDROID_CROSS_PREFIX}clang++ \
--disable-asm \
--disable-x86asm \
--disable-stripping \
--sysroot=$SYSROOT \
--fatal-warnings \
--enable-gpl \
--enable-version3 \
--enable-nonfree \
--disable-ffplay \
--disable-ffprobe \
--enable-pic \
--enable-jni \
--enable-shared \
--enable-mediacodec \
--enable-decoder=h264_mediacodec \
--enable-decoder=hevc_mediacodec \
--enable-decoder=mpeg4_mediacodec \
--enable-decoder=vp8_mediacodec \
--enable-decoder=vp9_mediacodec \
--extra-cflags="-Os -fpic -I$ASM -isysroot $SYSROOT" \
--extra-ldflags="$ADDI_LDFLAGS"
make clean
make -j 4
make install

因为我这边的测试平台是A64的开发板,cpu是64位的,系统是android6,所以我这边选择编译的是aarch64平台(性能更好),同时手动指定了cc和cxx。为什么要手动指定?请看下面:

set_default target_os
if test "$target_os" = android; then
    cc_default="clang"
fi

ar_default="${cross_prefix}${ar_default}"
cc_default="${cross_prefix}${cc_default}"
cxx_default="${cross_prefix}${cxx_default}"
nm_default="${cross_prefix}${nm_default}"
pkg_config_default="${cross_prefix}${pkg_config_default}"

cc和cxx默认和ar,nm等使用同一个cross_prefix。而在NDK中,他俩的prefix和其他的可是不一样的,cc和cxx的文件名后面有个api level的数字。这就会导致找不到cc和cxx。为了解决这个问题,这位前辈在configure文件中添加了一个单独的clang的prefix:点我去看 。他这么做确实可以,但是需要改动源码,比较麻烦。所以我选择手动指定,偷懒成功。

编译

脚本弄好后,编译就很简单了,直接执行脚本,然后看着屏幕不停的滚动,然后惬意的等一小会儿就好了。完成之后就可以到输出文件夹里面找到ffmpeg和一堆so文件,把so拷贝到/system/lib64中,ffmpeg拷贝到/system/bin下面,修正权限,然后就可以直接执行ffmpeg啦!

后记

在android 4.4之后,添加了新的保护机制,可执行文件必须是采用PIE编译的,即必须为地址无关代码,否则会提示:error: only position independent executables (PIE) are supported.。但是我上述的编译脚本中并未加上-fPIE -pie,却也能在A64开发板上运行。这个问题有待后续在别的平台上进行考证。 已经确认编译器会自动加上-fPIE fpie选项

遇到的坑

坑一号:makefile找不到

表现为类似下面的情况:

./android_config.sh: line 36: --enable-shared: command not found
Makefile:2: ffbuild/config.mak: No such file or directory
Makefile:40: /tools/Makefile: No such file or directory
Makefile:41: /ffbuild/common.mak: No such file or directory
Makefile:91: /libavutil/Makefile: No such file or directory
Makefile:91: /ffbuild/library.mak: No such file or directory
Makefile:93: /fftools/Makefile: No such file or directory
Makefile:94: /doc/Makefile: No such file or directory
Makefile:95: /doc/examples/Makefile: No such file or directory
Makefile:160: /tests/Makefile: No such file or directory
make: *** No rule to make target `/tests/Makefile'. Stop.
Makefile:2: ffbuild/config.mak: No such file or directory
Makefile:40: /tools/Makefile: No such file or directory
Makefile:41: /ffbuild/common.mak: No such file or directory
Makefile:91: /libavutil/Makefile: No such file or directory
Makefile:91: /ffbuild/library.mak: No such file or directory
Makefile:93: /fftools/Makefile: No such file or directory
Makefile:94: /doc/Makefile: No such file or directory
Makefile:95: /doc/examples/Makefile: No such file or directory
Makefile:160: /tests/Makefile: No such file or directory

这位前辈对于这个问题的解决方法不对,我在这个问题上研究了好久才发现根本不是那么一回事,希望不要再有人被他坑了(他总结的第2条): https://www.laoyuyu.me/2019/05/23/android/clang_compile_ffmpeg/

这个问题产生的原因是编译脚本路径或者脚本执行的路径不正确。即使你在脚本里面cd到了ffmpeg的文件夹中也没用,非得把编译脚本放进ffmpeg的文件夹中才行。也许还有其他的办法,但是最省事的还是放一块儿吧。。。

坑二号:xxxxxx is unable to create an executable file

  1. 检查是否设置了临时目录。
  2. 检查ndk版本,android官方从r18b开始,已经移除了gcc这个编译工具,推荐clang。详情见ndk r18b修订内容

坑三号:/android_config.sh: line xx: xxxxx No such file or directory

configure命令之后如果使用了反斜杠进行换行的话,是不可以在其中添加注释的。把注释删除即可。

坑四号:xxxxx : not executable: 64-bit ELF file

这位前辈的博文:https://blog.csdn.net/u010651541/article/details/50177867,里面提到了关于64-bit ELF的问题,其实并不仅仅是Ta所描述的- c 的问题。如果编译的平台是x86_64的程序,放到aarch64的Android上去运行也是会提示这个错误的。

还有更多的坑,等待被发掘……

下载与安装

首先在docker的注册表中搜索mysql,点击下载, 然后选择版本。我这里选择的是8.0.16的版本

选这个版本的进行下载

下载完成之后,点击启动。这里要注意,配置一个MYSQL_ROOT_PASSWORD的环境变量,否则启动会失败。

记得要设置MYSQL_ROOT_PASSWORD变量(新窗口看大图)

完全启动完成需要等待一段时间,一般3分钟左右,具体可以观察容器详情中的进程一栏,如果mysqld –initialize-insecure进程没有了,取而代之的是mysqld,则表示启动完成。

正在初始化
初始化完成

现在mysql虽然已经启动,但接下来还是要进行配置的。切换到容器详情的终端机一栏,点击新增按钮来创建一个bash,然后就可以像操作linux的shell一样和docker内部进行交互。

设置远程访问

mysql> use mysql;
Reading table information for completion of table and column names                                                                                                   
You can turn off this feature to get a quicker startup with -A                                                                                                       
                                                                                                                                                                     
Database changed
mysql> select host, user, plugin from user;
+-----------+------------------+-----------------------+                                                                                                             
| host      | user             | plugin                |                                                                                                             
+-----------+------------------+-----------------------+                                                                                                             
| %         | root             | caching_sha2_password |                                                                                                             
| localhost | mysql.infoschema | caching_sha2_password |                                                                                                             
| localhost | mysql.session    | caching_sha2_password |                                                                                                             
| localhost | mysql.sys        | caching_sha2_password |                                                                                                             
| localhost | root             | caching_sha2_password |                                                                                                             
+-----------+------------------+-----------------------+                                                                                                             
5 rows in set (0.00 sec)

如果上面关于root的输出只有一个localhost的话,那么这个mysql只能进行本机登录;你需要做的是下面这样处理:(不要相信网上的什么with options,那个已经过时了,在mysql8.0.16中执行会报错)

mysql> CREATE USER 'root'@'%' IDENTIFIED BY '111111';//创建root账户,同时指定密码为111111
// mysql> ALTER USER 'root' IDENTIFIED BY 'password';//这行可以不要
mysql> GRANT ALL PRIVILEGES ON *.* TO 'root'@'%';
mysql> flush privileges;

如果像我上面这样的输出,关于root的输出有一个% ,则代表已经可以进行远程登录了,不需要上述操作。

修改默认的加密方式

mysql8中引入了新的加密方式 caching_sha2_password,而且被设置成了默认的加密方式,这就有可能导致客户端连接出现问题。据我所知,phpMyAdmin即使是4.9版本也不支持这种加密方式,虽然他们在GitHub上把这口锅漂亮的甩给了php。而php版本据说低于7.4的也是不支持的;Navicat Premium 12.0.29版本已经支持这种加密方式了,其他客户端未经测试。所以如果要使用phpMyAdmin等其他客户端的话,建议修改加密方式。

首先要确认,当前的加密方式是什么:

mysql> use mysql;
Reading table information for completion of table and column names                                                                                                   
You can turn off this feature to get a quicker startup with -A                                                                                                       
                                                                                                                                                                     
Database changed
mysql> select host, user, plugin from user;
+-----------+------------------+-----------------------+                                                                                                             
| host      | user             | plugin                |                                                                                                             
+-----------+------------------+-----------------------+                                                                                                             
| %         | root             | caching_sha2_password |                                                                                                             
| localhost | mysql.infoschema | caching_sha2_password |                                                                                                             
| localhost | mysql.session    | caching_sha2_password |                                                                                                             
| localhost | mysql.sys        | caching_sha2_password |                                                                                                             
| localhost | root             | caching_sha2_password |                                                                                                             
+-----------+------------------+-----------------------+                                                                                                             
5 rows in set (0.00 sec)

关于root的两行显示的plugin是caching_sha2_password,我们要将它改成mysql_native_password

mysql> ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '111111'; 
Query OK, 0 rows affected (0.25 sec)

mysql> ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY '111111'; 
Query OK, 0 rows affected (0.22 sec)
//这里的111111是指密码,可以自定义

光这样改过之后还不能用,这个就是很坑爹的地方了。需要另外再给它弄个配置文件,就像这样:

[mysqld]
default-authentication-plugin=mysql_native_password

把它保存成一个文件,然后上传到群晖上(建议另外弄个文件夹保存),把这个文件所在目录挂载到/etc/mysql/conf.d目录上,再启动mysql就能彻底解决问题

就像这样

演示环境:Windows 10 主机 + Ubuntu 18.04 客户机 + VMware Workstation Pro 15,虚拟机磁盘设置在一块256G的SSD上

目标:虚拟机磁盘占用了Windows 10主机的SSD大量空间,现在要压缩这块vmdk来减少磁盘占用

这块vmdk的设置如下,并没有预分配磁盘空间:

虚拟磁盘的设定

看,它占了95GB的SSD空间!简直不可思议!实际上:

实际上这个盘只用了9.5GB

实际上他喵的才仅仅用了9.5GB啊!那么问题来了,该如何才能把那么大的磁盘空间压缩压缩?

接下来就是痛苦的尝试各种 解决方案:

  • 1. 很自然的就想到直接去点击设置里面的那个压缩按钮,然后1秒钟,提示压缩完成。满心欢喜原来压缩这么快,然后看了一下windows资源管理器中的文件大小就知道,根本就没给你压缩
  • 2. dd命令填充0,然后删除文件,然后关闭客户机,然后再去点击那个压缩按钮。过程我就不罗嗦了,dd的过程花了好几分钟,结果还然是1秒钟提示压缩完成。
  • 3. 首先先做个defrag。 sudo e4defrag / 执行完之后再重复2中的步骤,结果依旧是1秒钟。 fuck you~
  • 4. 在3的步骤中执行到删除文件后,再加上一个压缩命令 sudo vmware-toolbox-cmd disk shrinkonly 。结果是不支持?
emm…..?

为什么他喵的不支持???看了一下这个错误的搜索结果,大致分为两种情况:有磁盘快照或者是预分配磁盘。然而我并没有使用任何磁盘快照,也不可能去预分配磁盘。

  • 5. 既然上面这些办法都不好使,那么就用vmware宿主机中的vmware-vdiskmanager吧!执行结果是:Failed to shrink the disk ‘D:\xxx.vmdk’ : An error occurred while writing a file; the disk is full. Data has not been saved. Free some disk space and try again (0x8).

disk is full。。。嗯,什么意思?是说我宿主机的磁盘空间不够了吗?

于是我默默的查看了一下D盘的可用空间,提示为79GB。难道说我得有150GB剩余空间才能成功压缩吗?

抱着试试看的想法,把SSD盘中的乱七八糟的文件搬到其他盘中,现在剩余空间是135GB,先来试试看好不好用。

剩余135GB,试一下看看

首先是关闭客户机 ,以防万一,我把vmware也给X了,重新执行命令。。。

开始压缩了。。。

喔激动一下,它开始shrink了,看来确实是宿主机磁盘空间不够了,所以shrink不了?

压缩完成之后,这个vmdk的大小变成了:

成功压缩了

吃惊,大小居然能压缩到8.83GB这么小!


总结:通过上述实践过程,发现一个要压缩Linux格式的vmdk文件大小的前提条件,而这个前提条件却是各种高票回答都没有提及的:存放vmdk文件的磁盘一定要有足够大的可用空间才能压缩,否则就会1秒钟或者压缩失败。由于磁盘已经被我压缩掉了,而且还是那么多操作都做过来的,所以有些疑问:是否真的需要这么多步骤?是否只要dd后删除dd出来的文件,然后直接点击vmware设置中的压缩按钮就可以了?这些就留待日后有时间吃饱了撑的慢慢测试了

问题现象1:可以看到出错对话框上有类似PUR-Authentication failure提示,下一步可能会让你登录Microsoft账户,等你满心欢喜输入好账号密码后,提示你个错误界面

问题现象2:无法登录microsoft账户

解决思路:不要着急按照百度上的提示来,什么新建用户,什么重置电脑,虽然能够达到所需的效果,但是:重置电脑后那么多软件一个个再重新安装重新配置也得花上好半天功夫;新建个用户看上去省事,但是这是不是代表只能用新建的用户去下app?如果真的是这样,那就跟重置电脑没太大区别,还不如重置电脑了。。。

于是乎,在Google上有一个用户也发现了类似问题: https://social.technet.microsoft.com/Forums/en-US/7e3c7ee9-0ac5-4357-8247-6c439b53d415/purauthentication-failure-when-installing-an-app-from-microsoft-store-from-hybrid-azure-ad-joined?forum=win10itprogeneral

按照他的说法,只要启动了Microsoft Account Sign-in Assistant服务,就可以登录了

回过头看了一下系统的服务,确确实实,这个服务被禁用了。。。然后就是手动恢复这个服务,然后后面就相当顺利的登录账号,下载app

问题解决,撒花

卸载要根据系统版本的不同,使用不同的方法

一、不要想着通过Store去卸载,因为那里面只有安装的按钮,没有卸载的按钮

二、在win10系统版本为秋季创意者更新(Fall Creators Update),也就是RS3,也就是1709之前,可以使用lxrun命令进行卸载操作。没有图,没有命令,也不想去研究,因为我早就更新到1903了。

三、 秋季创意者更新之后,lxrun命令就被移除了,执行lxrun只会提示不是内部或外部命令,也不是可运行的程序或批处理文件。这个时候就需要用wslconfig命令来进行卸载了。

列出当前已经安装且随时可用的发行版:

wslconfig /list

列出所有发行版,包括正在安装、卸载和已损坏的发行版:

wslconfig /list /all

卸载已经安装的发行版:

wslconfig /unregister <这里填你要卸载的名称,只能填写使用wslconfig /list或者wslconfig /list /all中所包含的,不是随便填的>

卸载后也可以在 Store 重新安装发行版。

示例:wslconfig /unregister Ubuntu 会将 Ubuntu 从当前可用的WSL发行版中彻底删除,之后运行 wslconfig /list 时该发行版便不会被列出。该发行版所占用的磁盘空间也会被释放。

注意: 卸载发行版时,会永久删除所有与该发行版有关的数据和设置。

四、卸载完成之后最好再做这么一步:到开始菜单中,找到你安装的发行版,右键,卸载,以保证它彻底被卸载了

如果对wslconfig的其他用处感兴趣,可以参考这里: https://blog.z4hd.cf/wslconfig-usage/

一、被阉割过的Android设置界面

初次看到被阉割的这么惨的设置界面,如下图:

系统设置App界面

WTF??网络设置,开发者选项这些熟悉的东西都找不到了,剩下的是一些不痛不痒的功能。。。

既然找不到这些设置,照程序猿的思维,用adb命令总能有办法打开这些消失的界面吧!然而事实却是:由于被阉割了,所以这里面并没有usb调试功能的选项,那这样就没法用adb命令,用不了命令就打不开被阉割的功能。。这TM是死循环啊!

万幸,在软件的设置里面找到了这么个坑爹的设置:

坑爹的启用adb设置

这里只需要点击一下,会提示启用成功,然后就可以用adb shell连接了。。。然而!这功能仅限于模拟器开启状态,如果退出模拟器再打开的话,需要重新再到这里来点一次启用。。。

好了,现在可以使用命令来打开开发者设置界面了:

am start com.android.settings/com.android.settings.DevelopmentSettings

跳出来的开发者选项让人没啥惊喜可言,同样是阉割过的,找不到USB Debug相关选项,这将会导致部分检测是否启用USB Debug的app的部分功能受到影响,比如Helium这款备份恢复软件

既然找不到那就算了吧,我再来尝试一下打开wifi设置。首先先看了一下ip地址设置:

遂使用这个命令打开wifi设置,结果提示我找不到这个Activity:

sagit:/ $ am start com.android.settings/com.android.settings.WirelessSettings
Starting: Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] cmp=com.android.settings/.WirelessSettings }
Error type 3
Error: Activity class {com.android.settings/com.android.settings.WirelessSettings} does not exist.

难不成这个模拟器不用wifi的??那就打开以太网设置看看:

sagit:/ $ am start -n com.android.settings/.Settings\$EthernetSettingsActivity
Starting: Intent { cmp=com.android.settings/.Settings$EthernetSettingsActivity }
Error type 3
Error: Activity class {com.android.settings/com.android.settings.Settings$EthernetSettingsActivity} does not exist.

同样是找不到Activity。。。。OMG!

一番探索下来,这个模拟器的网络部分算是残废了,都没设置的地方让你修改的,软件设置里面也没有相应选项,网络代理设置什么的那就更不行了,除非通过一些特殊手段,比如VPN,比如SSTap+SS等。扯淡的是,模拟器还自带了Google Play Store。。。开发人员们,你们为啥就没把它给顺手阉割掉呢!?

二、坐等新的发现

槽点一:在windows上默认打开后就自动开启windows proxy

这个设置对于平常大众使用还是挺贴心的,省的再手动去点击开启,但是对于使用科学上网的系统代理功能的我来说,简直是无法忍受。每次打开软件,代理就被改变了,于是在Charles的帮助页面上找到了关闭之法:

相应的,在软件设置的这里:

选择Proxy菜单下的Proxy Settings…
取消勾选Enable Wondows proxy on launch

槽点二:字体实在是太难看了,想改一下但是改了又没效果

如下,在windows上看着实在是难受,就跟个蚯蚓似的,尤其是下面那块

但是改了后,界面上的字体还是原来的样子,根本就没效果:

改完字体后界面看上去还是那样

但是神奇的是,下部的content那边字体确实是变成了设置的字体了:

content部分字体已改变

马勒戈壁。。。为什么只能改这里的字体!!!

槽点三:。。。。还没想到,后续再补充

本文转载自: https://www.blackeep.com/1989.html

WordPress鼠标点击特效,可以实现wordpress博客的背景显示”富强”, “民主”, “文明”, “和谐”, “自由”, “平等”, “公正” ,”法治”, “爱国”, “敬业”, “诚信”等文字效果。加上了该段代码,可以让你的网站,在用户任意位置点击鼠标,显示上面文字的特效。

源代码如下,尽情复制:

<script type="text/javascript">
/*  深夜笔记博客  www.blackeep.com  */
var a_idx = 0;
jQuery(document).ready(function($) {
$("body").click(function(e) {
var a = new Array("富强", "民主", "文明", "和谐", "自由", "平等", "公正" ,"法治", "爱国", "敬业", "诚信", "友善");
var $i = $("<span/>").text(a[a_idx]);
a_idx = (a_idx + 1) % a.length;
var x = e.pageX,
y = e.pageY;
$i.css({
"z-index": 999999999999999999999999999999999999999999999999999999999999999999999,
"top": y - 20,
"left": x,
"position": "absolute",
"font-weight": "bold",
"color": "#ff6651"
});
$("body").append($i);
$i.animate({
"top": y - 180,
"opacity": 0
},
1500,
function() {
$i.remove();
});
});
});
</script>

将上面的代码添加到主题页脚(footer.php)文件的 wp_footer() 一行之前即可,然后保存代码上传到服务器,即可实现,如下图红框所示: