SmallestWidth适配方案

https://github.com/ladingwu/dimens_sw

(1)该适配方案怎么用?

点击进入github项目,下载到本地,然后运行该Java工程,会在本地根目录下生成相应的文件,如果需要生成更多尺寸,在DimenTypes文件中填写你需要的尺寸即可

(2)是否有推荐尺寸

300,320,360,411,450,这几个尺寸是比较必要的,然后在其中插入一些其他的尺寸即可,如果不放心,可以在300-450之间,以10为步长生成几十个文件

(3)平板适配的问题?

如果团队内部没有针对平板设计UI,那么大家对于App在平板上运行的要求大抵也就是不要太难看即可。针对这种情况的适配方法是被动适配,即不要生成480以上的适配文件,这样在平板上,系统就会使用480这个尺寸的dimens文件,这样效果比主动适配更好;而如果团队主动设计了平板的UI,那么我们就需要主动生成平板的适配文件,大概在600-800之间,关键尺寸是640,768。然后按照UI设计的图来写即可

Q:用了这套方案是否就不需要使用wrap_content等来布局了?ß

A:这是绝对错误的做法!如果UI设计上明显更适合使用wrap_content,match_parent,layout_weight等,我们就要毫不犹豫的使用,而且在高这个维度上,我们要依照情况设计为可滑动的方式,或者match_parent,尽量不要写死。

总之,所有的适配方案都不是用来取代match_parent,wrap_content的,而是用来完善他们的。

实现原理

悬浮窗实现原理

6.0以下直接获取权限,6.0及以上申请悬浮窗权限,然后通过WindowManager提供的方法进行视图的操作,手势操作部分,注意区分touch和click事件

ARouter原理

参考链接

插件化原理及思考

参考链接

Proguard技巧及原理

参考链接

LeakCanary原理

参考链接

LeakCanary使用ObjectWatcher来监控Android的生命周期。当Activity和Fragment被destroy以后,这些引用被传给ObjectWatcher以WeakReference的形式引用着,如果gc完5秒钟以后这些引用还没有被清除掉,那就是内存泄漏了。

强引用:垃圾回收器绝不会回收它,当内存空间不足,Java虚拟机宁愿抛出OOM

软引用:只有在内存不足的时候JVM才会回收仅有软引用指向的对象所占的空间

弱引用:当JVM进行垃圾回收时,无论内存是否充足,都会回收仅被弱引用关联的对象。

虚引用:和没有任何引用一样,在任何时候都可能被垃圾回收。

一个对象在被gc的时候,如果发现还有软引用(或弱引用,或虚引用)指向它,就会在回收对象之前,把这个引用加入到与之关联的引用队列(ReferenceQueue)中去。如果一个软引用(或弱引用,或虚引用)对象本身在引用队列中,就说明该引用对象所指向的对象被回收了。

当软引用(或弱引用,或虚引用)对象所指向的对象被回收了,那么这个引用对象本身就没有价值了,如果程序中存在大量的这类对象(注意,我们创建的软引用、弱引用、虚引用对象本身是个强引用,不会自动被gc回收),就会浪费内存。因此我们这就可以手动回收位于引用队列中的引用对象本身。

Linux常用命令

安装deb

1
sudo dpkg -i baidunetdisk_linux_2.0.2.deb

安全检测

查看恶意IP登录

1
lastb root | awk '{print $3}' | sort | uniq -c | sort -nr| more

查看是否有异常的系统用户

1
cat /etc/passwd

检查是否有新用户尤其是UID和GID为0的用户

1
awk -F":" '{if($3 == 0){print $1}}' /etc/passwd

检查是否存在空口令账户

1
awk -F: '{if(length($2)==0) {print $1}}' /etc/passwd

检查系统异常进程

使用ps -ef命令查看进程(尤其注意UID为root的进程

1
ps -ef

查看该进程所打开的端口和文件

1
2
netstat -ntlup
lsof -p 22

检查隐藏进程

1
ps -ef | awk '{print $2}'| sort -n | uniq >1; ls /proc |sort -n|uniq >2;diff -y -W 40 1 2

安装jdk

1
2
3
tar -zxvf jdk-8u171-linux-x64.tar.gz
sudo mv jdk1.8.0-171 /usr/local/jdk1.8
sudo vim /etc/profile

在文件末尾加入

1
2
3
4
export JAVA_HOME=/usr/local/jdk1.8
export JRE_HOME=${JAVA_HOME}/jre
export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib
export PATH=.:${JAVA_HOME}/bin:$PATH

更新生效

1
source /etc/profile

检查是否生效

1
2
java -version
javac

ubuntu安装mysql5.7

安装mysql

1
sudo apt-get install mysql-server

检查状态

1
sudo netstat -tap | grep mysql

设置root密码

1
2
3
4
5
6
7
8
9
sudo su
mysql
select user,plugin from mysql.user;
update mysql.user set authentication_string=PASSWORD('password'), plugin='mysql_native_password' where user='root';
flush privileges;
exit

sudo /etc/init.d/mysql restart
mysql -uroot -p

配置mysql远程登录
修改配置文件,bind-address = 0.0.0.0

1
sudo vi /etc/mysql/mysql.conf.d/mysqld.cnf

保存退出,然后进入mysql服务,执行授权命令

1
2
3
4
5
mysql -u root -p
grant all on *.* to root@'%' identified by 'guqiao*2011_' with grant option;
flush privileges;
exit
sudo /etc/init.d/mysql restart

卸载mysql

安装nginx

1
sudo yum install -y nginx

设置开机启动

1
sudo systemctl enable nginx

关闭开机启动

1
sudo systemctl disable nginx

启动nginx

1
sudo systemctl start nginx

停止nginx

1
sudo systemctl stop nginx

查看nginx启动状态

1
sudo systemctl status nginx

重新加载nginx配置

1
sudo systemctl reload nginx

nginx默认的静态HTML文件位置

1
/usr/share/nginx/html

如果要使用NGINX作为默认的web服务器,则可以使用/var/www文件夹来存储不同的网站。但是如果将请求代理到Apache,则只需修改NGINX配置文件,就可以使用Apache网站文件的/var/www路径

安装redis

1
sudo apt-get install redis-server

查看tcp连接

1
netstat -ap | grep 6379

启动
服务:redis-server
客户端:redis-cli
修改配置文件允许局域网内的其他电脑连接redis
文件位置:/etc/redis/redis.conf
详细的使用:https://juejin.im/entry/5bac46dd5188255c960c3d27

开启SSH服务

查看ssh是否安装

1
sudo ps -e | grep ssh

安装ssh

1
2
3
4
5
sudo apt-get install openssh-server
sudo /etc/init.d/ssh start
sudo service ssh status
sudo service ssh stop
sudo service ssh restart

更改sshd_config配置

1
vim /etc/ssh/sshd_config 
1
PermitRootLogin yes
1
ssh root@192.168.1.115

配置说明

使用xshell进行文件上传和下载

1
apt-get install lrzsz

rz 上传文件

z file 下载文件

附件

linux查看公网ip

1
curl ipinfo.io/json

查看系统资源占用

查看ubuntu的资源占用

1
top

查看内存使用情况

1
free

更新系统运行时间,负载信息

1
uptime 

显示磁盘活动情况

1
vmstat 

统计CPU的使用情况及tty设备、硬盘和CD-ROM的I/O量

1
iostat

查看磁盘使用情况

1
2
df -h 
du -sh

查看mysql信息

1
ps -aux | grep mysql

安装htop工具查看

1
sudo apt-get install htop

安装seafile

https://cloud.seafile.com/published/seafile-manual-cn/deploy/using_mysql.md

安装ffmpeg

1
2
3
sudo add-apt-repository ppa:kirillshkrogalev/ffmpeg-next
sudo apt-get update
sudo apt-get install ffmpeg

查看访问数

1
cat /var/log/auth.log  | grep "sshd" | awk '/Failed/{print $(NF-3)}' | sort | uniq -c 

centos安装mysql

https://www.centos.bz/2019/02/centos7-%E5%AE%89%E8%A3%85-mysql/

卸载腾讯云自带配置

1
2
3
4
5
6
/usr/local/qcloud/stargate/admin/uninstall.sh
/usr/local/qcloud/YunJing/uninst.sh
/usr/local/qcloud/monitor/barad/admin/uninstall.sh
sudo rm -rf /usr/local/qcloud/
sudo rm -rf /usr/local/sa/
sudo rm -rf /usr/local/agenttools

安装监控(主机面板)

宝塔linux:
https://www.bt.cn/bbs/thread-19376-1-1.html
Ajenti:
Feathur:
ISPConfig:
VestaCP:
Virtualmin:
ZPanel:
WDCP:
AMH:
WDCP:
LuManager:
VPSMate:
Oneinstack:
AppNode:
cpanel:

基本命令

1
2
3
4
5
ls
ls -al
cd
mkdir aaa
mkdir -p aaa/bbb/ccc

删除文件

1
rm -r  aaa

删除文件夹

1
rm -rf  aaa

修改文件夹名

1
mv aaa bbb

创建新文件

1
2
3
touch name.txt
echo "content" > a.txt
cat a.txt

权限管理

本组删除读写权限

1
chmod g-rw  name.txt

其他组删除读写权限

1
chmod o-rw name.txt 

个人添加可执行权限

1
chmod u+x name.txt

如果要将一个文件夹的所有内容权限统一修改,则可以-R参数

1
2
chmod -R 770 aaa
chown xxx:xxx aaa/

常用操作系统命令

1
2
useradd  username
passwd username

切换身份

1
su user 

执行这条指令用root身份,执行完成后用原来的身份

1
sudo useradd zhangsan

查看主机名

1
hostname

修改主机名(重启后无效)

1
hostname  hadoop

修改主机名(重启后有效)

1
vi /etc/sysconfig/network

修改ip(重启后无效)

1
ifconfig eth0 192.168.12.22

修改ip(重启后生效)

1
vi /etc/sysconfig/network-scripts/ifcfg-eth0

查看系统命令

1
2
uname -a
uname -r

查看日期

1
date
1
2
3
mount
umount
mount -t iso9660 -o ro /dev/cdrom /mnt/cdrom

查看文件大小

1
2
du -sh
du -ah

查看分区

1
df -h

ssh命令

1
ssh root@192.168.2.11

关机

1
2
halt
shutdown -h now /init 0

重启

1
2
reboot
shutdown -r now /reboot

远程拷贝

1
scp install.log  root@192.168.1.2:/home

公钥 私钥生成

1
ssh-keygen

复制公钥到远程主机

1
ssh-copy-id 192.168.33.111

一次性将文件内容全部输出(控制台)

1
cat somefile 

可以翻页查看,下翻一页(空格),上翻一页(b),退出(q)

1
more somefile

可以翻页查看,下翻一页(空格) 上翻一页(b) 上翻一行(↑),下翻一行(↓) 可以搜索关键字(/keyword)

1
less somefile  

查看文件尾部的10行

1
tail -10 install.log

小f跟踪文件的唯一inode号,就算文件名改后,还是跟踪原来这个inode表示的文件

1
tail  -f install.log

大F按照文件名来跟踪

1
tail -F install.log

查看文件头部的10行

1
head -10 install.log

后台服务管理

查看指定服务的状态

1
service network status

停止指定服务

1
service network stop

启动指定服务

1
service network start

重启指定服务

1
service network restart

查看系统中所有的后台服务

1
service --status-all

设置后台服务的自启配置

chkconfig 查看所有服务器自启配置

chkconfig iptables off 关掉指定服务的自动启动

chkconfig iptables on 开启指定服务的自动启动

上传安装包到服务器

可以使用图形化工具,如:filezile
可以使用sftp工具, securecrt alt+p 调出后,用put命令上传
上传(如果不cd指定目录,则上传到当前用户的主目录)

1
2
sftp> cd /home/
sftp> put c:\xxx.xxx

下载

1
sftp> get xxxxx.xxxx

压缩和解压缩

1
gzip -d install.log

将1.xxx 2.xxx 343/文件夹打包到xxx.tar文件中

1
tar -cvf xxx.tar 1.xxx 2.xxx  343/
1
tar -xvf xxx.tar 

一次性压缩

1
tar -zcvf my.tar.gz  /somefile 

一次性解压缩

1
tar -zxvf my.tar.gz 

linux jdk环境变量设置

1
vi /etc/profile

大G 到最后一行

o 插入一行

1
2
3
export JAVA_HOME=/root/apps/jdkhome
export PATH=$PATH:$JAVA_HOME/bin
source /etc/profile

查询外网IP的办法

Curl纯文本格式输出

1
2
3
4
5
6
7
curl icanhazip.com
curl ifconfig.me
curl curlmyip.com
curl ip.appspot.com
curl ipinfo.io/ip
curl ipecho.net/plain
curl www.trackip.net/i

Curl JSON格式输出

1
2
3
curl ipinfo.io/json
curl ifconfig.me/all.json
curl www.trackip.net/ip?json

Curl XML格式输出

1
curl ifconfig.me/all.xml

Curl 得到所有IP细节 (挖掘机)

1
curl ifconfig.me/all

使用 DYDNS (当你使用 DYDNS 服务时有用)

1
2
curl -s 'http://checkip.dyndns.org' | sed 's/.*Current IP Address: \([0-9\.]*\).*/\1/g'
curl -s http://checkip.dyndns.org/ | grep -o "[[:digit:].]\+"

使用 Wget 代替 Curl

1
2
wget http://ipecho.net/plain -O - -q ; echo
wget http://observebox.com/ip -O - -q ; echo

使用 host 和 dig 命令

1
2
host -t a dartsclink.com | sed 's/.*has address //'
dig +short myip.opendns.com @resolver1.opendns.com

bash 脚本示例

1
2
3
#!/bin/bash
PUBLIC_IP=`wget http://ipecho.net/plain -O - -q ; echo`
echo $PUBLIC_IP

安装ftp

1
yum -y install vsftpd

CentOS上用python调用FFMepg将m3u8合成MP4后显示异常的问题

(1)判断是否有中文包

1
locale -a

(2)如果没有中文包,则使用如下命令下载

1
yum install langpacks-zh_CN.noarch

multipass虚拟机安装

官网:https://multipass.run/

/proc/kcore 128T内存爆满问题处理

1
2
3
4
5
6
7
8
# 列出磁盘使用率
df -h
# 列出删除列表
lsof | grep delete
# 删除任务
kill XXXX
kill YYYY
....

查询大文件

1
find / -type f -size +1G

#(Centos7.9)端口号管理

开放端口

1
2
3
4
5
6
# 开放5672端口
firewall-cmd --zone=public --add-port=5672/tcp --permanent
# 关闭5672端口
firewall-cmd --zone=public --remove-port=5672/tcp --permanent
# 配置立即生效
firewall-cmd --reload

查看防火墙所有开放的端口

1
firewall-cmd --zone=public --list-ports

关闭/开启防火墙

1
2
systemctl stop firewalld.service
systemctl start firewalld.service

查看防火墙状态

1
firewall-cmd --state

查看监听的端口

1
netstat -lnpt

检查端口被哪个进程占用

1
netstat -lnpt | grep 18788

Mac命令

brew

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
## 安装脚本
/bin/zsh -c "$(curl -fsSL https://gitee.com/cunkai/HomebrewCN/raw/master/Homebrew.sh)"
## 卸载脚本
/bin/zsh -c "$(curl -fsSL https://gitee.com/cunkai/HomebrewCN/raw/master/HomebrewUninstall.sh)"
## 安装软件
brew install xxx
## 卸载软件
brew uninstall xxx
## 搜索软件
brew search xxx
## 更新软件
brew upgrade xxx
## 查看列表
brew list
## 更新brew
brew update
## 清理所有包的旧版本
brew cleanup
## 清理指定包的旧版本
brew cleanup $FORMULA
## 查看可清理的旧版本包,不执行实际操作
brew cleanup -n

ImageView的scaleType

1. scaleType存在的形式

1) CENTER

2) CENTER_CROP

3) CENTER_INSIDE

4) FIT_CENTER

5) FIT_END

6) FIT_START

7) FIT_XY

8) MATRIX

2.Google的官方解释以及我的个人分析

type google****官方说明 我的解释
CENTER Center the image in the view, but perform no scaling. 先把当前的图片放置到ImageView的中间,不执行缩放,如果图片小,那么就会有空白区域,如果图片大,那么便会被裁减
CENTER_CROP Scale the image uniformly (maintain the image’s aspect ratio) so that both dimensions (width and height) of the image will be equal to or larger than the corresponding dimension of the view (minus padding). 先把当前的图片放置到ImageView的中间,执行缩放,将图片的宽度和高度按照相同比例缩放到宽度大于或者等于ImageView的宽度,同时高度大于或者等于ImageView的高度
CENTER_INSIDE Scale the image uniformly (maintain the image’s aspect ratio) so that both dimensions (width and height) of the image will be equal to or less than the corresponding dimension of the view (minus padding). 1. 先把当前的图片放置到ImageView的中间; 2. 如果图片小于ImageView的大小,不执行缩放,原样显示; 3. 否则开始缩放,将图片的宽度和高度按照相同比例缩放到宽度小于或者等于ImageView的宽度,同时高度小于或者等于ImageView的高度(此处的高度和宽度指的是内容的大小width/height-padding)
FIT_CENTER Scale the image using CENTER. CENTER: Compute a scale that will maintain the original src aspect ratio, but will also ensure that src fits entirely inside dst. At least one axis (X or Y) will fit exactly. The result is centered inside dst. 1.保持图片的宽高比 2.将图片放置到ImagetView的中心,然后进行向外按比例放大或者缩小,直到一个方向已经适应
FIT_END Scale the image using END END: Compute a scale that will maintain the original src aspect ratio, but will also ensure that src fits entirely inside dst. At least one axis (X or Y) will fit exactly. END aligns the result to the right and bottom edges of dst. 1.保持图片的宽高比 2.将图片放置到ImagetView的右下角,然后进行向外按比例放大或者缩小,直到一个方向已经适应
FIT_START Scale the image using START START: Compute a scale that will maintain the original src aspect ratio, but will also ensure that src fits entirely inside dst. At least one axis (X or Y) will fit exactly. START aligns the result to the left and top edges of dst. 1.保持图片的宽高比 2.将图片放置到ImagetView的左上角,然后进行向外按比例放大或者缩小,直到一个方向已经适应
FIT_XY Scale the image using FILL FILL: Scale in X and Y independently, so that src matches dst exactly. This may change the aspect ratio of the src. 1.不保持图片的宽高比 2.然后进行向外按比例放大或者缩小,直到一个方向已经适应
MATRIX Scale using the image matrix when drawing.

3 数据测试

为了表明测试的准确性,我准备了两组数据,一组是图片的分辨率高于ImageView自身的宽高,另外一组是图片的分辨率低于ImageView自身的宽高,这样才具有测试的完整性。

第一组: 图片的分辨率高于ImageView****自身的宽高

原图: 屏幕截图: 尺寸:1080*1920 即1080p的屏幕截图

img

将各组数据分别做显示,为了表示特点,将ImageView的背景设置为黑色,ImageView的大小设置为100dp*100dp

img

**** 1 2 3
1 center centerCrop centerInside
2 fitCenter fitEnd fitXY
3 fitStart matrix

咱们逐个开始看

  1. CENTER : 首先将图片放置到了中间,然后能够显示多少,就显示多少,图片不做处理,因而图片只是显示了中间支付宝钱包快牙图标的一部分
  2. CENTERCROP : 同样先将图片放置到了中间,然后开始等比例伸缩图片,直到两边有一边适配了边界,由于图片高度大于宽度,因而首先高度适配了,但是此时宽度还够不着边界,不符合上面表格的要求:高度和宽度要均大于等于对应ImageView的高度和宽度,因而要继续伸缩至宽度达到边界,所以宽度可以显示完整,而高度显示不完整
  3. CENTERINSIDE : 同样现将图片放置到了中间,将图片伸缩(如果图片小于ImageView的宽高,那么是不伸缩的),直到两侧同时小于或者等于图片的边界,由于宽度会先适配,高度后适配,因而两侧会显示出黑色的背景
  4. FIT_CENTER : 将图片放置到ImageView的中间,保持图片的宽高比,图片由小变大一步一步扩大,直到一个方向已经适配,由于高度大于宽度,因而高度会先适配,故两侧会出现黑色的背景
  5. FIT_END :将图片放置到ImageView的右下角,保持图片的宽高比,图片由小变大一部一部扩大,直到一个方向已经适配,高度大于宽度,高度先适配,故左侧出现黑色背景
  6. FIT_XY : 不保持图片的宽高比进行伸缩,从ImageView的中心,由小到大,一部一部扩大,直到两个方向都已经适配
  7. MATRIX : 不熟悉,不做解释

第二组测试数据: 图片分辨率小于ImageView大小的各种数据

原图: 分辨率: 165*220

img

ImageView大小: 200dp*200dp

类型以及结果:

  1. CENTER:

img

  1. CENTER_CROP: 同样: 由于会缩放,图片高度大于宽度,因而最终的效果是宽度填充满,而高度上部分显示不出来

img

  1. CENTER_INSIDE : 刚才已经提到,如果图片小于屏幕的大小,那么CENTER_INSIDE是不会做缩放的

img

此时可能有人会提出疑问,假如说图片一侧大于屏幕的大小,而另外一侧小于屏幕的大小,那么会怎么处理呢?处理的方式还是要符合原则,最终的结果是两侧都要小于等于屏幕对应的尺寸,就是在ImageView的大小内,显示完整这个图片,并且是按照等比例缩放的

,以这个图片为例:

用Nexus5(分辨率为10801920)做测试,假如说ImageView的大小为60dp60dp,Nexus5下的大小为 : 180px*180px

而图片的大小 :165px*220px,这时图片的高度已经超过了ImageView的高度,所以会将高度缩放到ImageView的大小,因而出现如下的效果

img

  1. FIT_CENTER :

img

  1. FIT_END:

img

  1. FIT_START

img

  1. MATRIX

img