通常爲公司指定的我的郵箱。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 成功,其它失敗