通常为公司指定的我的邮箱。html
Linux 的.gitconfig 在 Home 目录下。java
email:你的公司邮箱linux
name:cm给你分配的用户名android
editor:提交massage时用的编辑器git
ui:高亮显示程序员
alias:一些短引用,好比git branch,能够直接写git brgithub
url(2处):要替换为本身用户名,下例为ssh://hp@192.168.8.74:29418/,替换hp为上面name节点的名称,sql
好比范建华的可为:ssh://fjh@192.168.8.74:29418/express
insteadOf:勿修改apache
huangpeng@ubuntu:~$ cat .gitconfig
[user]
email = hp@hpplay.cn
name = hp
[core]
editor = vim
[color]
ui = auto
[alias]
st = status
br = branch
co = checkout
ci = commit
[url "ssh://hp@192.168.8.74:29418/"]
insteadOf = "gerrit:"
[url "ssh://hp@192.168.8.74:29418/opensource/git-repo"]
InsteadOf=https://gerrit.googlesource.com/git-repo
复制代码
ssh-keygen -t rsa -C fjh@hpplay.cn
cat ~/.ssh/id_rsa.pub
复制代码
过程当中会要求输入密码,为了方便的话,能够不设置密码,直接回车便可
git config --global user.email "fjh@hpplay.cn"
git config --global user.name "Fan Jianhua"
git config --global core.editor vi
复制代码
重复上面linux步骤便可,和linux的使用同样
复制代码
git clone ssh://xx@192.168.8.74:29418/test
git commit -s
git push origin HEAD:refs/for/master
第一次提交可能会缺乏Chang-Id,执行下面语句
gitdir=$(git rev-parse --git-dir); scp -p -P 29418 fjh@192.168.8.247:hooks/commit-msg ${gitdir}/hooks/commit-msg" git commit --amend git push origin HEAD:refs/for/master 复制代码
若是不想使用命令提交,也能够在Sourcetree中添加push配置
打开config文件,如上图:在[remote "origin"]里面添加 push = refs/heads/:refs/for/
这样就可使用 “推送” 按钮将文件修改push到Gerrit上了
7.1 该配置是在Ubuntu下验证,下载repo,好比放在~/bin/repo
7.2 配置环境变量,
huangpeng@ubuntu:~$ vi .bashrc
复制代码
export PATH=~/bin:$PATH
复制代码
ModuleName: do something
details
Ticket: LEBO5X-xxx
复制代码
说明:
ModuleName是指工程里面具备比较明确划分的模块名称,若是工程比较单一,一个ModuleName就能够
好比:接收端应用,能够定义为APP便可
ModuleName后面的冒号后紧接着一个小写空格,而后是提交的内容描述,不可泛泛,控制在80列以内。
ModuleName下面空一行,再换行写具体更加详细的描述,可选。
Ticket是指jira的bug id,每次提交必须有一个bug对应,在bug里面有对本次提交的具体缘由等信息
第一步:开发者本身review后+1
第二步:owner +2
第三步:开发者submit
如下是如今工做中可能会用到的一些简单的Git命令
git clone
获取git仓库,示例:
git clone ssh://tcc@192.168.8.74:29418/AndroidReceiver-SDK
//查看分支
//切换分支
//新建本地分支
//删除本地分支
git fetch 示例:
//首先从远程的origin
的master
主分支下载最新的版本到origin/master
分支上 git fetch origin master //而后比较本地的master
分支和origin/master
分支的差异 git log -p master..origin/master //最后进行合并 git merge origin/master
git fetch 示例2:
git fetch origin master:tmp git diff tmp git merge tmp
git status 显示有变动的文件
git add [file] 提交指定文件到暂存区
git add [dir] 提交指定目录到暂存区
git add . 添加当前目录的全部文件到暂存区
git commit 提交暂存区到仓库区
git commit --amend 用来改写上一次commit的提交信息
git cherry-pick [commit] 选择一个commit,合并进当前分支
模块(英文大写): 提交信息(首行英文)
MODULE: commit message
示例:
SDK: modify VideoPlayer for leishi project
将播放器播放功能与播控UI实现分离
若是是解决在JIRA中提出的bug,须要把JIRA中bug号加上 格式以下
Ticket: bug编号
示例:
SDK: Ariplay or DLNA play failed
Airplay video status error Airplay or DLNA play failed
Ticket: Base130-1, Base130-2
若是修改内容涉及到SDK和APP,可使用 ALL来代替模块,例如
ALL: modify SDK for leishi project and supply demo module
git push
git push [remote] [branch-name] 上传本地指定分支到远程仓库 示例: git push origin r1.3.2_bugfix //Gerrit git push origin HEAD:refs/for/r1.3.2_bugfix
git checkout [file] 恢复暂存区的指定文件到工做区
git chekcout . 恢复暂存区的全部文件到工做区
git chekcout [commit] [file] 恢复某个commit的指定文件到暂存区和工做区
git reset [file] 重置暂存区的指定文件,与上一次commit保持一致,但工做区不变
git reset --hard 重置暂存区与工做区,与上一次commit保持一致
git reset [commit] 重置当前分支的指针为指定commit,同时重置暂存区,但工做区不变
git reset --hard [commit] 重置当前分支的HEAD为指定commit,同时重置暂存区和工做区,与指定commit一致
git log 显示当前分支的版本历史
git log --oneline 参数将每次提交记录汇总成一行,默认状况下,会展现commit的id和commit信息的第一行
git log --follow [file]显示某个文件的版本历史,包括文件更名
git log --stat 显示commit历史,以及每次commit发生变动的文件
git log -S [keyword] 搜索提交历史,根据关键词
git blame [file] 显示指定文件是什么人在什么时间修改过
git show [commit] 显示某次提交的元数据和内容变化
git show --name-only [commit] 显示某次提交发生变化的文件
git show [commit]:[filename] 显示某次提交时,某个文件的内容
git diff HEAD 显示工做区与当前分支最新commit之间的差别
git diff 显示暂存区和工做区的差别
//切换代码到指定TAG
//建立TAG
//删除TAG
首先提交修改信息,与直接推送到git服务器不一样的是,这里是把修改信息推送到Gerrit,待经过Gerrit审核以后,才能把代码合并到git服务器
具体到提交命令就是
//git git push origin r1.3.2_bugfix
//Gerrit git push origin HEAD:refs/for/r1.3.2_bugfix
若是使用Sourcetree来提交代码须要在config文件中添加 push = refs/heads/:refs/for/
经过第二步把修改信息推送到Gerrit上以后,登陆Gerrit查看提交信息
点击修改信息,查看修改详情
添加审核人,等待审核结果
代码审核经过,submit
代码审核不经过,继续修改,commit --amend
编码规范对于程序员而言尤其重要,有如下几个缘由:
一个软件的生命周期中,80%的花费在于维护
几乎没有任何一个软件,在其整个生命周期中,均由最初的开发人员来维护
编码规范能够改善软件的可读性,可让程序员尽快而完全地理解新的代码
复制代码
命名规则:一个惟一包名的前缀老是所有小写的ASCII 字母而且是一个顶级域名,一般是com,edu,gov,mil,net,org。包名的后续部分根据不一样机构各自内部的命名规范而不尽相同。这类命名规范可能以特定目录名的组成来区分部门 (department) ,项目(project),机器(machine),或注册名(login names)。
例如:
com.lebo.项目缩写.模块名 à com.lebo.player.live
com.lebo.项目缩写.层级名 à com.lebo.player.activities
命名规则:类名是个一名词,采用大小写混合的方式,每一个单词的首字母大写。尽可能使你的类名简洁而富于描述。使用完整单词,避免缩写词(除非该缩写词被更普遍使用,像URL,HTML),类名必须使用驼峰命名法,即首字母必须大写,若是为词组,则每一个单词的首字母也必需要大写,类名必须使用名词,或名词词组。接口通常要使用able、ible、er等后缀,
例如:
class BookMarkAdd à 正确
class AddBookReadPlanActivity à 错误! 应为 class BookReadPlanAddActivity
命名规则:方法名是一个动词,采用大小写混合的方式,第一个单词的首字母小写,其后单词的首字母大写。类中经常使用方法的命名:
类的获取方法(通常具备返回值)通常要求在被访问的字段名前加上get,如
getFirstName(),getLastName()。通常来讲,get前缀方法返回的是单个值,find前缀的方法返回的是列表值。
类的设置方法(通常返回类型为void):被访问字段名的前面加上前缀 set,如
setFirstName(),setLastName().
类的布尔型的判断方法通常要求方法名使用单词 is作前缀,如isPersistent(),isString()。或者使用具备逻辑意义的单词,例如equal 或equals。
类的普通方法通常采用完整的英文描述说明成员方法功能,第一个单词尽量采用动词,首字母小写,如openFile(),addCount()。
构造方法应该用递增的方式写。(参数多的写在后面)。
复制代码
变量名应简短且富于描述
第一个单词的首字母小写,其后单词的首字母大写
临时整型变量一般被取名为 i,j,k,m 和 n;字符型通常为c,d,e
非public的、非static的字段名称以m开头。
static字段名称以s开头,final static 全大写,能够不以S开头
其它字段以小写字母开头。
常量所有字母大写并用下划线分隔。
复制代码
例如:
public class MyClass {
public static final int SOME_CONSTANT = 42;
public int publicField;
private static MyClass sSingleton;
int mPackagePrivate;
private int mPrivate;
protected int mProtected;
}
复制代码
自定义异常的命名必须以Exception为结尾。已明确标示为一个异常。
layout xml 的命名必须以 所有单词小写,单词间如下划线分割,而且使用名词或名词词组,即便用 模块名_功能名称 来命名。例如:
knowledge_gained_main.xml à 正确
list_book.xml à 错误!
layout 中所使用的id必须以所有单词小写,单词间如下划线分割,而且使用名词或名词词组,末尾加上view的缩写,而且要求可以经过id直接理解当前组件要实现的功能。例如:
TextView @+id/textbookname à错误!应为 @+id/book_name_show_tv
EditText @+id/textbookname à错误!应为 @+id/book_name_edit_et
layout中所使用的全部资源(如drawable,style等)命名必须以所有单词小写,单词间如下划线分割,而且尽量的使用名词或名词组,即便用 模块名_用途 来命名。若是为公共资源,如分割线等,则直接用用途来命名,例如:
menu_icon_navigate.png à 正确
某分割线:line.png 或 separator.png à正确
用于日志记录的TAG放在最前面
static final放在1)后面,按照语义,每块定义中间加空格和注释
用于Handler的WHAT值,要分语义赋值,语义相关的值依次累加
相关语义的变量要有相同的前缀,相似于包名命名方式
自定义View要把所在的layout写到注释里面
View的定义顺序要与layout里面的顺序一致
系统类变量定义
自定义类变量定义
普通变量定义
复制代码
如:
private static final String TAG = "LiveView";
// WHAT values using by handler
private static final int WHAT_ADD_CHANNEL_HISTORY = 0;
private static final int WHAT_PLAY_CHANNEL = 10;
private static final int WHAT_PLAY_PIP = 11;
// keys of data when play channel used
private static final String KEY_CHANNEL_INDEX = "channel_index";
private static final String KEY_CHANNEL_URL = "channel_url";
// in activity_main.xml
private TitleView mTitleView;
// in tv_content.xml
private VideoPlayerController mMainPlayerController;
private VideoPlayerController mPipPlayerController;
private ChannelMenu mChannelMenuView;
// dynamic add/remove
private VerifyView mVerifyView;
private AudioManager mAudioManager;
private SharedPreferences mPrefs;
private ChannelManager mChannelManager;
private LayerType mCurrentLayer = LayerType.LAYER_MAIN;
private boolean mHasShowLiveGuide;
复制代码
Java 程序有两类注释:实现注释(implementation comments)和文档注释(document comments)。实现注释是使用/.../和//界定的注释。文档注释(被称为"doc comments")由/**...*/界定。文档注释能够经过javadoc 工具转换成HTML 文件。
每一个文件的开头都应该有一句版权说明。而后下面应该是package包语句和import语句,每一个语句块之间用空行分隔。而后是类或接口的定义。若是不过认证,就不用加。
/*
* Copyright (C) 2013 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.android.internal.foo;
import android.os.Blah;
import android.view.Yada;
import java.sql.ResultSet;
import java.sql.SQLException;
乐播文件头注释
/**
* <p>Description: </p>
* <p>Copyright: Copyright (c) 2018</p>
* <p>Company: www.hpplay.com.cn</p>
* @author LEBO
* @date ${date}
*/
复制代码
每一个类和自建的public方法必须包含Javadoc注释,注释至少要包含描述该类或方法用途的语句。而且该语句应该用第三人称的动词形式来开头。注释尽可能写中文。
/**
* Does X and Y and provides an abstraction for Z.
*/
public class Foo {
...
}
复制代码
每个方法的注释都要包含当前方法的用途,当前方法参数的含义,当前方法返回值的内容和抛出异常的列表。
/** Returns the correctly rounded positive square root of a double value. */
static double sqrt(double a) {
...
}
或
/**
* Constructs a new String by converting the specified array of
* bytes using the platform's default character encoding. */ public String(byte[] bytes) { ... } 复制代码
公共成员变量和常量须要使用java doc形式的注释,以说明当前变量或常量的含义
若是当前layout 或资源须要被多处调用,或为公共使用的layout(若list_item),或者须要特殊说明的,则须要在xml写明注释。要求注释清晰易懂。
对那些临时性的、短时间的、够棒但不完美的代码,请使用TODO注释。
TODO注释应该包含所有大写的TODO,后跟一个冒号,例如:
// TODO: Remove this code after the UrlTable2 has been checked in.
// TODO: Change this to use a flag instead of a constant.
复制代码
若是TODO注释是“未来要作某事”的格式,则请确保包含一个很明确的日期(“在2005年11月会修正”),或是一个很明确的事件以后删除本段代码。
必须如下面注释开头和结尾,后面能够自行增长日期、做者、缘由:
// Lebo START
// Lebo END
方法内部的注释 若是须要多行 使用/*…… */形式,若是为单行是用//……形式的注释。不要再方法内部使用 java doc 形式的注释“/……/”,简单的区分方法是,java doc形式的注释在 eclipse中为蓝色,普通注释为绿色。
不容许使用Tab进行缩进,使用4空格进行缩进。每换一次行缩进增长4个空格缩进,好比:
Instrument i =
someLongExpression(that, wouldNotFit, on, one, line); à正确
Instrument i =
someLongExpression(that, wouldNotFit, on, one, line); à错误
复制代码
空行将逻辑相关的代码段分隔开,以提升可读性。
下列状况应该老是使用空行:
一个源文件的两个片断(section)之间
类声明和接口声明之间
两个方法之间
方法内的局部变量和方法的第一条语句之间
一个方法内的两个逻辑段之间,用以提升可读性
不一样逻辑变量区域之间
复制代码
使用eclipse等自动化工具作这个工做
Import最小颗粒类,好比:
复制代码
import foo.Bar;à正确
import foo.*;à错误
对Import语句排序
复制代码
大括号不单独占用一行;它们紧接着上一行书写。就像这样:
class MyClass {
int func() {
if (something) {
// ...
} else if (somethingElse) {
// ...
} else {
// ...
}
}
}
对于单行语句,也要增长大括号括起来,像这样
if (condition) {
body();
} à正确
if (condition) body();à错误
if (condition)
body();à错误
复制代码
每行代码的长度不超过100个字符。
注释的长度也不能超过100个字符。
禁止忽略异常,好比下面代码:
复制代码
void setServerPort(String value) {
try {
int serverPort = Integer.parseInt(value);
} catch (NumberFormatException e) {
}
}
可接受的替代方案包括:
抛出默认异常
抛出自定义异常
处理错误并在catch {}语句块中替换为合适的值
捕获异常并抛出RuntimeException。这种作法比较危险:只有确信发生该错误时最合适的作法就是崩溃,才须要这么作。
忽略异常,但必须把缘由注释出来
忽略异常,但必须把缘由打印出来
复制代码
不建议捕获顶级的Exception,好比下面的代码:
复制代码
ry {
someComplicatedIOFunction(); // may throw IOException
someComplicatedParsingFunction(); // may throw ParsingException
someComplicatedSecurityFunction(); // may throw SecurityException
// phew, made it all the way
} catch (Exception e) { // I'll just catch all exceptions handleError(); // with one generic handler! } 比捕获顶级Exception更好的方案: 分开捕获每一种异常,在一条try语句后面跟随多个catch 语句块。这样可能会有点别扭,但总比捕获全部Exception要好些。请当心别在catch语句块中重复执行大量的代码。 从新组织一下代码,使用多个try块,使错误处理的粒度更细一些。把IO从解析内容的代码中分离出来,根据各自的状况进行单独的错误处理。 再次抛出异常。不少时候在你这个级别根本就不必捕获这个异常,只要让方法抛出该异常便可。 复制代码
局部变量应该限制为最小的做用范围。使用局部变量,能够增长代码的可读性和可维护性,而且下降发生错误的可能性,每一个变量都应该在最小范围的代码块中进行声明,该代码块的大小只要可以包含全部对该变量的使用便可,因此循环变量都应该在for语句内进行声明,好比:
for (int i = 0; i < n; i++) {
doSomethinginformation;
}
和
for (Iterator i = c.iterator(); i.hasNext(); ) {
doSomethingElse(i.next());
}
复制代码
注意@SuppressWarnings和@Deprecated要写在方法的头部
禁止使用View.post和View.postDelayed,须要的地方替换为Handler的Message方式,以使代码可控。
禁止在循环内打印VERBOSE级别以上的log
禁止直接使用系统默认log,必须使用项目内自定义的log类
打印log的开关必须有统一的控制
复制代码
编码规范的重要目的就是为了保持一致。若是你正在编写代码,请花几分钟浏览一下先后的其它代码,以肯定它们的风格。若是它们在if语句先后使用了空格,那你也应该遵循。若是它们的注释是用星号组成的框框围起来的,那也请你照办。
为了跨平台以及跨编辑器,请统一使用UTF-8格式
Android Studio统一使用Eclipse的格式化配置,可经过如下几个步骤在Android Studio中配置使用Eclipse的代码格式化方式:
编辑
1.一、搜索Eclipse Code Formatter插件
1.二、安装Eclipse Code Formatter
安装完毕重启Android Studio
2.一、导出配置文件
工具栏点击Windows选择Preferences
导出代码格式化配置文件
在导出以前须要修改不少默认配置,这里就再也不一一赘述,建议直接使用前面配置好的xml文件,以便于保证代码格式化风格统一。
编辑
3.一、以下图,找到Eclipse Code Formatter插件,找到Eclipse Java Formatter config file,选择第二步从Eclipse中导出的配置文件
3.二、在工具栏中将代码格式化插件更换为 Eclipse Code Formatter
更换前
更换后
通过以上三步,在Android Studio中就可使用Eclipse的代码格式化方式了
使用格式化工具CoolFormat,这里不作具体展开说明。
github.com/akof1314/Su… akof1314.github.io/CoolFormat/… CoolFormat配置:
[SynTidy] C++=""-A10-xn-xc-xk-xV-s4-S-w-Y-p-xg-H-U-k3-xb-j-xf-xh-c-xy""
一、文件命名:小写+下划线
二、函数命名:小写+下划线
三、结构体,枚举等类型命名:大驼峰
四、常量,宏:大写+下划线
五、参数,变量:前缀+小驼峰
六、命名前缀:
n:整数
b:boolean类型
p:指针
o:结构体
str:字符串
g_:全局变量
k_: const 全局常量
xxxMutex, xxxCond, arrXxx, pArrXxx
jobjXxx, jMethodIdXxx
复制代码
7,避免使用魔数,建议使用宏或者常量
外部接口返回值:int,0 成功,其它失败