Commit 7c58b262 authored by Jacksgong's avatar Jacksgong

feat(post-update): correct format posts

parent 846ce116
......@@ -51,14 +51,14 @@ tags:
8. 应用自带主要需求的特殊问题
## IV. 应用优化方面
##### 1) 内存方面:
### 1) 内存方面:
内存过多: 多进程化(按需创建): 剥离需要常驻与不需要常驻的操作到不同的进程。这样也可以提高稳定性(主要的进程不会受影响)
##### 2) 代码方面:
### 2) 代码方面:
- 代码过多: 插件化(插件话独立维护/升级),分模块独立升级、独立维护。
- 小改动不得不通过升级:云化,多用配置文件(如Lua啊之类的)
##### 3) 升级方面:
### 3) 升级方面:
- 一定要稳定。
- 针对性升级(地域、机型、网络类型、历史版本号)
- 增量升级
......@@ -66,18 +66,19 @@ tags:
- 运营商cache,导致升级错包: 1. 检测包key, 2. 走自己的代理服务器/https
##### 4) 发布方面
### 4) 发布方面
- 渠道首页
- 内测群
- 灰度升级
- 论坛反馈收集(让产品去跟)
##### 4) 诊断方面:
### 4) 诊断方面:
制作诊断插件(插件需要根据目标问题自动选择诊断不同模块),运行以后自动上传日志。
## V. 工具
##### 1) Build工具:
### 1) Build工具:
1. release版
2. debug版
3. 每个包的代码扫描工具
......@@ -88,13 +89,13 @@ tags:
![](/img/360-2.png)
##### 2) 代码扫描
### 2) 代码扫描
1. Checkstyle
2. Lint(error, safe)
3. 红线扫描(基于PMD)
##### 3) 自动化测试
### 3) 自动化测试
1. uiautomator
2. 基于Robotium改造(改造用Lua写测试案例)
......@@ -102,16 +103,16 @@ tags:
![](/img/360-4.png)
#### 4) BVT case check
### 4) BVT case check
- 每个包都可以跑
- 发布包必须跑
#### 5) 安全审核(发布最后一关(公司/部门),自动化,黑盒)
### 5) 安全审核(发布最后一关(公司/部门),自动化,黑盒)
- 信息泄露
- DOS
#### 6) TIPS:
### 6) TIPS:
1. 外来代码检测更加严格(可追溯,代码审计,整合测试,黑盒逆向分析)
......
......@@ -17,28 +17,28 @@ tags:
## I. 无线网络的影响
##### 1) 无线网络物理影响:
### 1) 无线网络物理影响:
- 丢包多
- 带宽受限
<!--more-->
##### 2) 无线网络第三方影响:
### 2) 无线网络第三方影响:
- 第三方运营商中间做手脚
## II. 解决不稳定手段--TCP
##### TCP在移动网络中的缺陷
### TCP在移动网络中的缺陷
不是基于移动网络优化的
##### 最优网络的关键点
### 最优网络的关键点
- 超时
- 重试
- 间隔设计
##### TCP自带可靠性保障
### TCP自带可靠性保障
- 序号 确认
......@@ -53,7 +53,7 @@ tags:
> ps: 网络有可能出现雪崩(网络资源供不应求(所以TCP是`指数退避`的机制BLG))
##### 针对关键点策略
### 针对关键点策略
- Connect超时
(ios TCP: 6s前 重试: 每次间隔1s)
......@@ -84,16 +84,16 @@ tags:
## III. 处理带宽受限问题
##### 解决问题关键字
### 解决问题关键字
- 速度(发图)
- 最低失败成本(断点续传)
##### 两点场景
### 两点场景
1. 接收方处理能力不足
2. 线路内部堵塞
##### TCP自带的解决方案
### TCP自带的解决方案
- 滑动窗口协议
发送窗口长度 计算: Min[rwnd(接收端窗口)(TCP中的一个字段从服务器带回来), cwnd(拥塞端口(通过探测获得))]
......@@ -102,7 +102,7 @@ tags:
- 快重传
##### 最高速因数
### 最高速因数
- 减少send调用次数
......@@ -115,7 +115,7 @@ tags:
## IV. 长链接需要注意
##### DNS特点:
### DNS特点:
- 不可靠
......@@ -124,9 +124,9 @@ tags:
> ps: 微信是自建DNS服务器
#### 长链接
### 长链接
##### 为什么需要心跳:
#### 为什么需要心跳:
- 保证连接有效(防止中间与微信后台 资源回收)
- TCP在链路层上需要发送数据的时候,才会得到信令
......@@ -134,10 +134,10 @@ tags:
> ps: 微信心跳时间: 5min
##### 信令风暴
#### 信令风暴
心跳等导致频繁的请求信令。(目前在国内是移动渠道比较多)
#### 资源回收情况:
### 资源回收情况:
- 3/4G网络
国内情况:移动之前是5min,目前10min。
国外情况: google是10min/28min
......@@ -150,14 +150,14 @@ tags:
## V. 应用层协议设计
##### 网络协议:
### 网络协议:
1. HTTP、TCP、FTP....
内容组织 => 网络通道 => 服务器 => 回包
##### 网络协议关键字
### 网络协议关键字
###### 1. 语法(如何组织表达的内容)
#### 1. 语法(如何组织表达的内容)
1) 文本:
`diy``k-v``xml`(编解码慢)、`json`
......@@ -169,7 +169,7 @@ tags:
3) 其他
###### 2. 语义(表达内容(格式的设计))
#### 2. 语义(表达内容(格式的设计))
**需要考虑的**: 可扩展、兼容、并发、高效实时、省流量
......@@ -180,6 +180,6 @@ tags:
2) 信令数据:
分包(octet-stuffing、octet-counting、connect-blasting)、并发处理(序列号、命令号)、兼容性&拓展性(版本号,压缩算法、加密算法)、精简(严格按照packed所需大小)
###### 3. 时序(先后顺序)
#### 3. 时序(先后顺序)
---
......@@ -211,7 +211,7 @@ recyclerView.scrollToPosition(0);
## IV. 动画
#### Android L:
### Android L:
1. Activity Transitions
2. Shared elements
......@@ -221,11 +221,11 @@ recyclerView.scrollToPosition(0);
ps: support包有一个简单的判断是Android L的静态方法:`versionUtils.isAtLeastL`
#### LayoutTransitions ( API 1开始就有):
### LayoutTransitions ( API 1开始就有):
非常强大,布局变化或者Visible/Gone这类的切换动画。考虑用这个,简单强大。
#### AnimationUtils
### AnimationUtils
一般的动画,可以参考下github上其他人的一些好的封装,做一些简单的fade啊、slide啊、缩放啊非常方便。
......@@ -281,28 +281,28 @@ Android Studio上的一个功能。
> Falcon 可是 Joaquim自己设计的!
#### 1. 草图
### 1. 草图
可以使用软件sketch
#### 2. 颜色选择方面
### 2. 颜色选择方面
可以使用[coolors.co](http://coolors.co/),可以很快的定位好整个app的颜色。Joaquim大概就用了10分钟
这边我也推荐一个[Paletton.com](http://paletton.com/#uid=72P0+0kllllaFw0g0qFqFg0w0aF),也很不错。
#### 3. Icon
### 3. Icon
说实话作为开发,确实不愿意花太多时间去设计icon,但是Google对外开放了200多个icon素材。
**更好的方法**: 一款intellij(或者Android Studio(同一平台idea))的插件: [https://github.com/konifar/android-material-design-icon-generator-plugin](https://github.com/konifar/android-material-design-icon-generator-plugin) 自动生成Material icon确实好屌。
#### 4. 字体方面
### 4. 字体方面
Joaquim只用了Android SDK的: `android:font_family`,完全够用:
![](/img/SQLite___Core_Data.png)
#### 5. 视觉宗旨定义
### 5. 视觉宗旨定义
Joaquim定位Falcon是内容至上。
......
......@@ -10,22 +10,22 @@ tags:
---
# Git特点:
## Git特点:
1. 在2002由Linus花了两周写的,用在Linux版本维护,后来由Linux社区高手维护
2. git是维护修改
3. git是分布式版本控制
<!--more-->
# Git使用
## Git使用
### I. 创建:
##### 本地:
#### 本地:
`git init`
- 效果:
创建版本库(.git)
##### 远程:
#### 远程:
`git remote add [<远程库分支名>] [<远程库地址>]`
- 效果: 关联本地库与远程库
......@@ -39,7 +39,7 @@ tags:
- 效果: 克隆远程分支到本地(本地分支名和远程分支名相同).
##### 分支:
#### 分支:
`git branch [<分支名>]`
......@@ -68,7 +68,7 @@ tags:
- 效果: 把分支内容推到远程库相对应的分支上
##### 合并:
#### 合并:
> 推荐merge工具: [p4Merge](https://gist.github.com/tony4d/3454372)
......@@ -94,12 +94,12 @@ git fetch origin master
git merge origin/master
```
##### 删除:
#### 删除:
`git branch -d [<分支名>]`
- 效果: 删除目标分支(`-D`大写D是强行删除(未进行merge就直接删除时使用))
##### 撤销:
#### 撤销:
`git reset [<版本参数>] [<文件名>]`
- 效果: 从暂存区撤销某文件的提交
......@@ -108,7 +108,7 @@ git merge origin/master
- 效果: 撤销未提交的文件
### III. 状态:
## III. 状态:
`git status`
- 效果: 显示状态
......@@ -125,7 +125,7 @@ git merge origin/master
- 效果: 存储当前工作现场(通常用在:用于工作一半,想要切换分支的时候)
##### 存储现场:
### 存储现场:
`git stash list`
- 效果: 所有储存的工作现场列表
......@@ -142,15 +142,15 @@ git merge origin/master
- 效果: 应用最早的现场,并删除它
### IV. 对比:
## IV. 对比:
`git diff [<文件名>]`
###### 拓展:
### 拓展
`git diff HEAD -- [<file>]`
- 效果: 工作区和版本库分支里的最新版本对比
### V. 日志:
## V. 日志:
`git log`
- 效果: 查看git日志
......@@ -163,21 +163,21 @@ git merge origin/master
- 效果: 修改上次提交的commit message
###### 查看历史git命令(可以用来找`commit id`)
### 查看历史git命令(可以用来找`commit id`)
`git reflog`
###### 简化:
### 简化:
`git log --pretty=online`
###### 查看分支合并图:
### 查看分支合并图:
`git log --graph`
### VI. 回退代码:
## VI. 回退代码:
`git reset --hard [commit id/版本参数]`
###### 版本参数定义:
### 版本参数定义:
`HEAD`表示当前版本,上一个版本:`HEAD^`,上n个版本就是加n个`^`或者`HEAD~[n]`
###### 拓展:
### 拓展:
`git checkout -- [<文件名>]`
- 效果:
......@@ -194,7 +194,7 @@ git merge origin/master
- 效果: 撤销`stage`暂存区中[file]文件的修改
### VII. 冲突
## VII. 冲突
修改好冲突文件后,直接重新提交即可.
冲突文件一般的表示:
......@@ -209,14 +209,14 @@ Head 的内容
> 强烈推荐mergetool: [p4merge](https://gist.github.com/tony4d/3454372)
### VIII. 同步远程
## VIII. 同步远程
`git pull`
- 效果: 同步远程库(如果提示`no tracking information`,说明本地分支与远程分支的链接关系没有创建,用命令`git branch --set-upstream [<本地分支名>] [<远程分支名>]/[<本地分支名>]`进行创建链接)
### IX. 标签
## IX. 标签
##### 创建:
### 创建
`git tag [<标签名>] [<commit id>]`
......@@ -229,7 +229,7 @@ Head 的内容
- 效果: 给对应commit id打上标签,并给标签加上了描述,并且加上PGP签名,如果不提供comit id,默认给最新一次提交打上标签
##### 显示:
### 显示
`git tag`
......@@ -239,13 +239,13 @@ Head 的内容
- 效果: 显示标签那次提交的信息
##### 删除:
### 删除
`git tag -d [<标签名>]`
- 效果: 删除标签
##### 远程:
### 远程
> [Push a tag to a remote repository using Git?](http://stackoverflow.com/questions/5195859/push-a-tag-to-a-remote-repository-using-git)
......@@ -267,7 +267,7 @@ Head 的内容
> [使用Git Submodule管理子模块](https://segmentfault.com/a/1190000003076028)
#### 1. 添加子模块:
### 1. 添加子模块
```
// 添加外部项目为当前项目的子模块, 添加完后,会配置到`.gitmodules`内
......@@ -280,7 +280,7 @@ git commit -m "[<描述>]"
git submodule init
```
#### 2. 修改子模块
### 2. 修改子模块
```
cd [<子模块目录>]/
......@@ -291,23 +291,23 @@ cd ..
// 提交子模块中的修改->推到远端
```
#### 3. 更新子模块
### 3. 更新子模块
##### 方式一:
#### 方式一
在父项目目录下运行: `git submodule foreach git pull`
##### 方式二:
#### 方式二
进入对应的子项目目录: `git pull`
#### 4. 拉取存在子模块的项目
### 4. 拉取存在子模块的项目
##### 方式一:
#### 方式一
在父项目目录下运行: `git clone [<远程库地址>] --recursive`
##### 方式二:
#### 方式二
```
// 先clone父项目
......@@ -318,7 +318,7 @@ git submodule init
git submodule update
```
#### 5. 删除项目中的子模块
### 5. 删除项目中的子模块
```
git rm --cached [<子模块目录>]
......@@ -329,15 +329,15 @@ rm -rf [<子模块目录]
## XI. 其他需要注意的
#### 1. 由于Mac下文件名大小不敏感,造成git下如果改了名字,git不识别有变化,因此改名字需要使用下面命令:
### 1. 由于Mac下文件名大小不敏感,造成git下如果改了名字,git不识别有变化,因此改名字需要使用下面命令
`git mv --force myfile MyFile`
#### 2. 如果需要修改提交过的历史用户资料
### 2. 如果需要修改提交过的历史用户资料
[Changing author info](https://help.github.com/articles/changing-author-info/)
#### 3. 修改Commit Message
### 3. 修改Commit Message
> 当然若修改的那个Commit已经在远端,需要`git push --force`覆盖远端。
......@@ -345,27 +345,27 @@ rm -rf [<子模块目录]
- 如果需要修改更早之前的一些Commit Message: `git rebase -i [<Commit Id>]`
# Git 配置
## XII. Git 配置
##### 配置文件:
### 配置文件
局部: 项目工作区`.git/config`
全局: `~/.gitconfig`
##### 命令配置:
### 命令配置
`git config --global color.ui true`
- 效果: Git会适应当地显示不同颜色
##### 忽略特殊文件:
### 忽略特殊文件
在项目工作区根目录下直接创建`.gitignore`文件然后望里面添加文件名即可
可以参考: [https://github.com/github/gitignore](https://github.com/github/gitignore)
##### 别名配置:
### 别名配置
`git config --global alias.[<别名>] [对应命令]`
......@@ -381,7 +381,7 @@ git config --global alias.last 'log -1'
git config --global alias.lg "log --color --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit"
```
## XII. GitHub
## XIII. GitHub
### fork同步问题
......@@ -411,7 +411,7 @@ git pull upstream master
git push origin master
```
## XIII. 其他疑难问题
## XIV. 其他疑难问题
调用`git fetch`的时候,出现:
......
......@@ -16,7 +16,7 @@ tags:
> 会议主持人: Michael Yeung
## I. 新制度
#### New Review Process
### New Review Process
1. 发布前先人工审核(加速上架时间)
2. 新分级制度(IARC)(5月前没做,就会列入未分级,甚至会被下架或找不到)
符合不同年龄层的app
......@@ -27,7 +27,7 @@ tags:
<!--more-->
## II. 应用质量
#### 该做
### 该做
- **返回键:**
应该回到上个界面 ,上部分返回键(up)可以相同与不同。
Webview: back button: 返回上一页; up button(通常会更重一些): 返回上一个Activity
......@@ -42,7 +42,7 @@ tags:
强烈建议
#### 不该做的
### 不该做的
- 风格上不该模范平台上的用户体验(应该用Android的标准)
- 不该使用其他平台的图标(应该用: `github`上Google有发布一些通用的图标)
......
......@@ -21,7 +21,7 @@ Java SE 8在2013年6月13的版本中已经完全了全部的功能
<!--more-->
#### 举例
### 举例
`Runnable`:
```
......@@ -65,7 +65,7 @@ public class CollectionUtils {
> 可以在不调用某个方法的情况下引用一个方法
#### 举例
### 举例
```
List input = Arrays.asList(new String[] {"apple", "orange", "pear"});
......@@ -81,7 +81,7 @@ input.forEach(System.out::println);
> 可以在不创建对象的情况下引用一个构造方法
#### 举例
### 举例
```
List dateValues = Arrays.asList(new Long[] { 0L, 1000L});
......@@ -93,13 +93,13 @@ List dates = CollectionUtils.map(dateValues, Date::new);
> 通过新的`default`关键词来修饰,为接口提供默认方法
#### 解决问题
### 解决问题
1. **接口演化问题:** 通过新增默认接口方法来搞定新增的功能,而无需新增方法,在所有的实现类中改,当然,默认方法支持复写
2. **实现多继承的行为:** 一个类实现多个接口,就包含了默认方法的方法体
#### 举例
### 举例
```
//一个简单的货币转换接口,假设需要调用的是第三方服务
......
......@@ -44,7 +44,7 @@ tags:
- **使用前提**: 由于其实现原理,因此必须在`synchronized`块下调用。
- **作用效果**: 释放锁(暂时将锁借给别的线程用),并进入等待池。
#### 恢复:
### 恢复:
![](/img/javathread-1.png)
......
......@@ -149,7 +149,7 @@ In com.example.leakcanary:1.0:1 com.example.leakcanary.MainActivity has leaked:
## IX. 定制
#### 图标与标注(Icon and Label)
### 图标与标注(Icon and Label)
`DisplayLeakActivity`默认是使用默认的图标与标注,当然你可以通过在你的app中提供`R.drawable.__leak_canary_icon``R.string.__leak_canary_display_activity_label`来定制这个:
......@@ -174,7 +174,7 @@ res/
</resources>
```
#### 存储leak traces
### 存储leak traces
`DisplayLeakActivity`最多在app目录中存储7个heap dumps与leak traces 文件。你可以通过在你的app中提供`R.integer.__leak_canary_max_stored_leaks`来定制这个:
......@@ -185,7 +185,7 @@ res/
</resources>
```
#### 上传到服务器
### 上传到服务器
可以通过修改默认的行为来上传leak trace与heap dump到指定的服务器。
......
......@@ -20,7 +20,7 @@ tags:
> 一个很简单的图片加载库
#### 特点:
### 特点:
- 优点:
`简单``小``易于理解`
......@@ -32,7 +32,7 @@ tags:
> ps: 图片下载,单线程串行。
#### 代码:
### 代码:
- 创建使用
......@@ -106,7 +106,7 @@ tags:
> - 地址: [https://github.com/square/picasso](https://github.com/square/picasso)
> - 官方描述: Picasso通常使用一行代码就能够解决复杂的图片加载问题
#### 代码:
### 代码:
- 使用
......@@ -137,7 +137,7 @@ private class GalleryItemAdapter extends ArrayAdapter<GalleryItem> {
}
```
#### 特点
### 特点
- 优点:
......@@ -171,7 +171,7 @@ private class GalleryItemAdapter extends ArrayAdapter<GalleryItem> {
> - 视频介绍: [https://developers.google.com/events/io/sessions/325304728](https://developers.google.com/events/io/sessions/325304728)
> - 官方定位: 网络异步框架(一般我们只用到其中的网络与缓存部分)
#### 代码:
### 代码:
- 初始化
......@@ -225,7 +225,7 @@ private class GalleryItemAdapter extends ArrayAdapter<GalleryItem> {
```
#### 特点
### 特点
- 优点:
......@@ -256,7 +256,7 @@ private class GalleryItemAdapter extends ArrayAdapter<GalleryItem> {
> Picasso 专注图片处理,Volley 解决更通用的问题
#### 作者建议:
### 作者建议:
- 如果已经有一个稳定的,大型的项目,那么Picasso是更好的选择。
......
......@@ -44,7 +44,7 @@ private class CallWebServiceTask extends AsyncTask<String, Result, Void> {
## II. 利用`RxAndroid(RxJava)`解决这些问题
#### 1. 关于书写复杂的问题:
### 1. 关于书写复杂的问题:
> RxJava结合lambda是一个很好的解决方案
......@@ -57,7 +57,7 @@ webService.doSomething(someData)
);