Linux 挂载点设置

0x81 /etc/fstab

Linux 内核的操作系统支持多种多样的文件系统,而它的文件系统同样具有类似Windows分区的功能——挂载点。
/etc/fstab文件就是储存有文件系统信息和对应存储设备信息的配置文件。

0x82 配置规则

<file system> <mount point> <type> <options> <dump> <pass>

Read More

FileProvider On Nougat

0x80 干什么的

Android 7.0+ 又事事了!秉承着互联网安全这一大雉,Google爸爸无时无刻不在为增强Android系统的安全性而努力。
API 24开始加强了文件系统的安全,应用间文件共享不再像之前那样干脆直接。
File URI开始被限于应用内使用,而若想在应用之间共享(比如调用系统相机拍照)则必须转换成Content URI。
FileProvider就是为了简化这个过程而出现的,他继承自ContentProvider,也就是加了权限并生成一个虚拟目录用于操作。

0x81 基本配置

1
2
3
4
5
6
7
8
9
<provider
android:name="android.support.v4.content.FileProvider"
android:authorities="${applicationId}.FileProvider"
android:exported="false"
android:grantUriPermissions="true">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/file_paths"/>
</provider>

AndroidManifest.xml中配置如上,其中authorities通常是appid+FileProvider,选择授予Uri权限。

元数据部分规则固定,键为android.support.FILE_PROVIDER_PATHS,值为配置路径的xml文件。

0x82 路径配置

承接上例,配置文件是file_paths.xml

1
2
3
<paths>
<external-path path="Pictures/" name="camera_photos" />
</paths>

external-path 配置了一个以”/storage/emulated/0/“为根目录的可配置路径,path为路径,而name是暴露uri时的虚拟路径名。

另外随着Support API更新,还有另外几种路径:

  • root-path 对应文件系统根目录
  • files-path 对应 Context.getFilesDir()
  • cache-path 对应 Context.getCacheDir()
  • external-files-path 对应 Context.getExternalFilesDir(String) Context.getExternalFilesDir(null)
  • external-cache-path 对应 Context.getExternalCacheDir()

0x83 生成Content URI

使用getUriForFile方法生成虚拟文件路径URI。
Uri contentUri = FileProvider.getUriForFile(getContext(), "${applicationId}.FileProvider", sharedFile);

0x84 通过URI打开文件

openFile方法会返回URI对应的ParcelFileDescriptor,进行相应操作即可。

Sudoers Configuration

0x81 概述

通常我们在使用Linux某发行版系统时,为了避免误操作或其他的需求,我们会创建一个个人账户用于日常使用。
但是当需要对系统进行操作时,往往需要相应的权限,我们可以使用su命令切换到相关用户(比如root)来获得操纵某个文件或执行某个命令的目的。
sudo命令是为了方便用户提升权限执行相应操作的软件,他可以使用户验证通过自己身份时提权。
既然是为了方便使用,我们往往需要对其进行配置。

0x82 配置文件

sudo命令的配置文件路径是/etc/sudoers,该文件虽然可以直接编辑,但是为避免出现配置错乱问题,最好使用visudo这一标准命令进行编辑。

0x83 基本语法

  • 主机别名

    Host_Alias SERVER = host1, host2

    可以定义一组主机,用于约束Sudoers可获取权限的主机。

  • 用户别名

    User_Alias USER = user1, user2

    可以定义一组用户,用于约束哪些用户可以获取权限。

  • 命令别名

    Cmnd_Alias COMMAND = /usr/bin/bin1, /usr/bin/bin2

    可以定义一组命令,用于约束哪些命令可以提权执行。

  • 默认配置

    Defaults env_reset, timestamp_timeout = 10

    指定sudo通过验证的会话有效期。

  • 约束规则

    user MACHINE=COMMANDS %group localhost=(ALL) NOPASSWD: COMMANDS

    某用户/组可在某HOST上通过sudo执行某些命令。(ALL/root)指所有/root用户

Gradle Plugin DexCount

0x81 DexCount作用

DexCount用于统计项目中所有的方法数,
DexCount:https://github.com/KeepSafe/dexcount-gradle-plugin

0x82 为什么要统计method count

众所周知,Android在设计初期有一个设计缺陷:Google改进了JVM虚拟机,制造了一个更适合于移动设备使用的虚拟机Dalvik VM,Dalvik VM的可执行文件格式为.dex,该文件是将编译后的字节码通过dx工具转换生成的。
因此经过dx工具的处理,原本的method就被映射到了dex文件中并在其中维护了一张映射表,而这个映射表的长度被限制到了16位长,也就是总方法数不能超过65535
如果很不幸,或者说大项目必然的结果,你的方法数超过了65535,就要对你的APK进行分包处理,以保证APK能在设备上正确的安装。
至于会触发的dexopt exceptionlinearalloc限制,我们之后再谈。

Read More

Nexus5 MACAddr Change Boom

0x81 故事背景

说真的MAC地址过滤着实是一件很讨厌的事情,自己手机的WLANMAC被禁用了之后,连Wifi都不能连接,我一琢磨,这不行啊,我得改改Nexus5的WLANMAC逃出黑名单。

0x82 原理

可以用busyboxifconfig命令修改MAC地址,但是这种方式在5.0之后貌似失效了。因此经过查阅发现Nexus5的/persist存有蓝牙和Wifi的配置,不过persist区做为Google为手机设置的DRM,系统启动时会从这里读取一些硬件信息,修改它很有可能带来非常大的风险,毕竟这里是刷新都不会去修改的地方。不过,为达目的仍要进行尝试,方法其实很简单,只要修改/persist/wifi/.macaddr文件就行。

Read More

Hexo Google Ajax

0x81 ajax.googleapis.com无法访问

ajax.googleapis.com和fonts.googleapis.com会无法访问,这带来了网页加载起来非常的慢,将themes文件夹下layout/_partial/head.ejslayout/_partial/after-footer.ejs 两个文件中的googleapis替换成ustclug。

0x82 hexo deploy 每次输入密码

修改目录下的.deploy_git/.git/config 文件

了解AsyncTask

0x81 核心:ThreadPoolExecutor

1
2
3
4
5
6
7
ThreadPoolExecutor(int corePoolSize, // 核心线程数
int maximumPoolSize, // 最大线程数
long keepAliveTime, // 线程存活时间
TimeUnit unit, // 时间单位
BlockingQueue<Runnable> workQueue, // 任务工作对列
ThreadFactory threadFactory, // 线程工厂
RejectedExecutionHandler handler); // 阻塞处理器

0x82 Api中CoreSize的异同

  • Api <= 19 coreSize = 5; // 意味着维护着5个活跃线程,即使任务结束
  • Api >= 20 coreSize = CPU_COUNT + 1 // 按CPU核心数量

Read More

修正Android21 PopupWindow遮盖导航栏

0x80 问题

在Api 21 以后,若PopupWindow选择显示在屏幕底部,可能由于5.0支持透明导航栏的问题,弹出窗口会遮盖住导航栏的背景,而导航栏显示在PopupWindow上。

0x81 解决方法

修改Api 21 的样式,文件v21/styles.xml或styles-v21.xml,修改 android:windowDrawsSystemBarBackgrounds = “false”

1
2
3
4
<item name="windowActionBar">false</item>
<item name="windowNoTitle">true</item>
<item name="android:windowDrawsSystemBarBackgrounds">false</item>
<item name="android:statusBarColor">@android:color/transparent</item>

0x82 其他方法

上述方法一般能够解决问题,也可以通过计算导航栏的高度(或者状态栏)手动实现偏移,但是可能在不同的机型上会出现不该偏移但是便宜的状况。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
public class NavigationBarUtil {

private static String P = "android";

public static int getNavigationBarHeight(Context context) {
int rId = context.getResources().getIdentifier("navigation_bar_height", "dimen", P);
if (rId > 0) {
return context.getResources().getDimensionPixelSize(rId);
}
return 0;
}

public static int getStatusBarHeight(Context context) {
int rId = context.getResources().getIdentifier("status_bar_height", "dimen", P);
if (rId > 0) {
return context.getResources().getDimensionPixelSize(rId);
}
return 0;
}
}

博客迁移

简历处理

放弃手动markdown解析并通过css生成html的方法,替换整个github page为hexo框架生成的静态页面。

博客处理

渐渐的将博客转移到github上,用markdown书写,并使用hexo渲染生成最终的页面。

有关Kernel Compile的简易笔记

[迁移]

0x80 编译准备

所需组件:make gcc libncurses-dev(用于menuconfig终端图形化支持)
deb:apt-get install make gcc libncurses-dev -y
PS:make menuconfig 进行终端图形化配置

0x81 内核配置及模块选择

64-bit kernel 64位内核支持
General setup 通用设置
Enable loadable module supprt 可加载模块支持 -Compress modules 模块压缩
Enable the block layer 块层支持 -IO Schedulers IO 算法 -CFQ(绝对平等队列算法)
Processor type and features 处理器类型 -Kernel Live Patching 内核热补丁(4.0new)
Pover management 电源管理 -Suspend to RAM 挂起到内存 -ACPI 高级电源接口
Bus options(PCI) 总线控制 -PCI support PCI支持
Network support 网络支持 -Bluetooth subsystem support 蓝牙子系统支持 -NFS subsystem support NFS子系统支持
Device Drivers 设备驱动 -Network device support 网络设备支持 -Hardware I/O ports 硬件IO端口 -Watchdog
Timer Support watchdog 支持 -Graphics support 图形支持 -Laptop Hybird Graphics 笔记本混合图形支持 -USB support USB支持 -Android 安卓支持
Firmware Drivers 固件驱动
File systems 文件系统 -The Extended 4 filesystem ext4 文件系统支持
Kernel hacking 内核调整
Security options 安全选项
Save 为.config配置文件8

0x82 其他配置方法

make config 初始化配置,包含默认选项,可使用ARCH=””参数指定默认选项,此方式为问询式CLI

make oldconfig 检测先前内核配置或使用.config作为默认配置,原.config被另存为.config.old

make xconfig X11下的内核配置图形端,默认QT端支持,GTK+通常使用gconfig

make localmodconfig 本地模块筛选(lsmod),将已加载并正在使用的模块导入.config,会减少大量的模块编译从而减少编译时间(4.1.2 i3默认编译时间由两小时缩短至22分钟,取决于lsmod所显示加载模块),但坏处也很明显,会导致必要模块漏编译,从而影响正常使用。因此采用这种方法,推荐使用时间长久一些并进可能的覆盖自己的操作以确保需求模块加载从而能够加入编译列表。

0x83 编译

make 编译 (此处的zImage 和bzImage 决定使用gzip还是bzip2进行压缩)
make modules_install install 安装模块到内核到/boot

最后grub2快捷生成引导 grub2-mkconfig -o /boot/grub2/grub.cfg