android編碼規范
❶ Android studio注釋亂碼UTF-8和GBK設置都沒用,怎麼辦
情況一:編輯器內的中文注釋亂碼。
解決辦法:在界面的右下角找到 UTF-8 ,單擊之,在彈出的列表中選中GBK 在彈出框內選中Reload
總結:導致這樣的原因是你這個.java文件本身是GBK編碼的,你當然可以用GBK方式可以讀,可是最好把從根本上把這個文件編碼成UTF-8的!而且很多人出現這種情況是因為從eclipse復制,或導入文件到了android studio中。Eclipse的時候它可以自動識別,到了as就不可以了故出現這些錯誤。
情況二:用虛擬機運行應用時APP界面文字亂碼。
解決辦法:在Gradle Scripts -> build.gradle中的如下下圖位置添加:
android{compileOptions.encoding="GBK"}
或者
compileOptions.encoding="GBK"
情況三:Gradle Build 中出現如下亂碼,且編輯器的中文注釋有亂碼
需要工具:SublimeText 或者 Notepad++ 或者 EidtPlus 總之是那些能把你的文件改成UTF-8 without DOM 編碼的編輯器,本人用的是Sublime Text2
①雙擊如下亂碼提示的任意一行,它將會彈出一個.java文件給你,比如:我彈出的了AbInnerViewPager.java這個文件的編輯窗口,其中的中文注釋都是亂碼
/**其實下面亂碼的每一行代表一處你某個類或其他文件中的中文亂碼,一個類可能產生好幾行下面那種亂碼*/
②在左邊的目錄框右鍵那個類->點擊show in explorer(就是找到這個文件在電腦中的位置)
③以sublimeText的格式打開這個.java文件,點擊File->Save with Encoding->UTF-8
④返回android studio等一下(不用rebuild什麼的,文中的亂碼自己會變成了正常的中文)
⑤rebuild一下,重復以上步驟,知道把那些GBK格式的文件都改為UTF-8為止
總結:
1、Sublime Text2有個缺點,不能一次全選再改格式!!!雖然可以用ctrl全選然後在Save with Encoding,但最終你會發現只有一個文件改了編碼方式而已,而且你可以從sublime界面最下那個提示橫欄看到是哪一個,不知為何,可能是我打開的方式有問題吧==!,或者是一個Bug,請後來試過的同學跟我說下你們可以不。。。
2、千萬不要用微軟自帶的記事本來另存為,然後再編碼那裡改成UTF-8就以為萬事大吉,血的教訓告訴你!這個UTF-8實際上是UTF-8 with DOM,然後你rebuild後會有如下錯誤提示,然後你最後還是要改成UTF-8 without DOM
3、最好把以後的文件都以UTF-8保存,查看
File->Setting->File->Editor->File Encodings如下設置
❷ 安卓開發Layout XML 下出現這種警告怎麼解決
滑鼠點到黃色敬告上就會彈出提示了嘛,類似於這種「
Buttons in button bars should be borderless; use style="?
adt的版本越來越高了,所以也要求規范了,一些屬性官方要求是要寫上的,比如style等,早期android1.5、1.6的時候就沒這么多要求,可能隨後發展這些屬性不寫就不是黃色警告了,就變紅色錯誤了。
解決的方式是給每一個button或者其他控制項加上style樣式。
❸ android 圖片轉BASE64上傳提示java.lang.OutOfMemoryError
我最近也碰到了這個問題,但是網上沒有找到相關有效的直接解決方法。
後來看到了一篇解釋base64編碼原理的文章,研究了一番後解決了。
一般碰到這個問題的,都涉及到"大文件上傳"的問題,"大文件上傳"過程中除了base64編碼時可能OOM,其實還有其他問題,雖然提問中沒有提出,可能是因為這個問題還沒有解決,所以還沒有遇到其它問題,我就圍繞著"大文件上傳"來解決這個問題吧。
(提問時間在下看的清楚)
————————————————————
做項目的過程中碰到一個需求:
在java客戶端,使用http通信,把客戶端的本地文件通過http發送上傳到伺服器;
請求格式是xml(不管是json還是xml都是字元串,所以這個無所謂),中間包含[文件流字元串];
之前的做法是,把文件流通過base64編碼轉換為base64Byte,然後和其它字元串信息放到一起,post的時候通過HttpURLConnection的write方法寫入到伺服器中去,這個上傳的過程就完成了。
——————————
但是碰到一個問題,當文件體積較大時,從文件流轉換成base64Byte後,體積會很大,可能會導致OOM;
(以二進制流的方式保存,體積最小;以byte數組的方式保存,體積會相對變大一些;以String形式保存,體積最大;)
出錯原因是:
FileInputStream fis = new FileInputStream(file); //這一步打開了一個對准file准備進行讀取的文件指針,但是還沒有開始讀寫,file的相關數據沒有從本地載入到內存中來;所以即使file的體積有10G那麼大,這一步也是不會OOM的
//把文件流轉換為位元組數組
byte[] fileBytes;
ByteArrayOutputStream baos = new ByteArrayOutputStream();
byte[] byteBuf = new byte[1024];
int count;
while((count=fis.read(buf))!=-1)
{
baos.write(buf,0,count); //實際上,如果文件體積比較大的話,不用轉碼,在這一步就可能OOM了
}
fileBytes= baos.toByteArray();
byte[] base64Bytes = Base64.encodeBase64(fileBytes); //在這一步也可能OOM
(文件轉換為byte[]時,是有可能OOM的;而轉換為base64Bytes後,體積會增大1/3,所以有可能前一步沒有OOM,卻在這一步出現OOM;
為什麼轉碼後體積會增大1/3,後面我會解釋)
——————————
解決方法
既然file在本地沒有載入到內存來的時候不會出現內存溢出的情況,我就想到了一個解決的方法:分段上傳
(加大內存並不能從根本上解決內存溢出的問題,問題的根本原因不是內存不夠大,而是代碼有問題)
在本地的file通過HttpURLConnection的getOutputStream()進行write時,不是一次性全部寫入,而是循環配合flush進行寫入:
FileInputStream fis = new FileInputStream(file);
byte[] buf = new byte[1024];
int count;
while((count = fis.read(buf)) != -1)
{
os.write(Base64.encodeBase64(buf), 0, count);
os.flush();
}
(我從本地讀1024位元組,然後馬上上傳到伺服器,清空本地緩存,然後再從本地讀1024位元組,這樣循環讀取,即使文件有20G,理論上也不有OOM問題出現,因為我從本地文件中讀到的數據不會在內存中駐留)
——————————
解決問題的思路對了,但是出現了其他的細節問題
os.write(Base64.encodeBase64(buf), 0, count); //這一行代碼報錯了,出現了OOM
我搜集了一下資料,發現原因是:
HttpURLConnection的getOutputStream的實際對象是sun.net.<a href="http://www.http.PosterOutputStream" target="_blank">www.http.PosterOutputStream</a>,這個對象的flush方法代碼是空的,write配合flush,並沒有達到即時上傳數據的效果。PosterOutputStream其實是自己在本地維護了一個緩沖區,你通過write寫入的數據其實還是在這個本地的緩沖區里,只有當你getInputStream後,HttpURLConnection才會把這段緩沖區中的數據上傳到伺服器上。而flush達不到上傳數據,清空本地緩存的效果。
——————————
(我是不能通過getInputStream來刷新緩沖流的,因為那就不是分段上傳而是"分次"上傳了)
那這就不是我的思路的問題了。再去搜索解決方法後,得知:
在創建HttpURLConnection對象的時候,要調用一個方法
hurlc.setChunkedStreamingMode(1024); //設置分塊流模式 也就是分塊上傳 1024是getOutputStream維護的本地緩沖區的大小
調用該方法後,只要本地緩存區滿了,HttpURLConnection就會自動把緩沖區里的數據發送到伺服器,同時清空本地緩存(ps:HttpURLConnection的getOutputStream似乎是個抽象的工廠方法,在調用setChunkedStreamingMode方法後,我發現getOutputStream獲取到的實例對象從sun.net.<a href="http://www.http.PosterOutputStream" target="_blank">www.http.PosterOutputStream</a>變成了sun.net.<a href="http://www.protocol.http.HttpURLConnection$StreamingOutputStream" target="_blank">www.protocol.http.HttpURLConnection$StreamingOutputStream</a>)
——————————
果然,調用setChunkedStreamingMode方法後,os.write(Base64.encodeBase64(buf), 0, count);沒有再出現OOM異常了
但是,又出現了一個新的問題
我發現
FileInputStream fis = new FileInputStream(file);
byte[] buf = new byte[1024];
int count;
while((count = fis.read(buf)) != -1)
{
os.write(Base64.encodeBase64(buf), 0, count);
os.flush();
}
這段分段編碼寫入的代碼,其編碼所得結果,與非分段編碼所得結果是不一樣的
通過分段編碼上傳的圖片內容出現了錯誤
我通過下面代碼測試:
//分段編碼
ByteArrayOutputStream os1 = new ByteArrayOutputStream();
InputStream file1 = new FileInputStream(path);
byte[] buf1 = new byte[1024];
int count1;
while((count1 = file1.read(buf1)) != -1)
{
os1.write(Base64.encodeBase64(buf1), 0, count1);
os1.flush();
}
file1.close();
System.out.println(os1.toString());
//非分段編碼
ByteArrayOutputStream os2 = new ByteArrayOutputStream();
InputStream file2 = new FileInputStream(path);
byte[] buf2 = new byte[1024];
int count2;
while((count2 = file2.read(buf2)) != -1)
{
os2.write(buf2, 0, count2);
os2.flush();
}
file2.close();
System.out.println(new String(Base64.encodeBase64(os2.toByteArray())));
兩者的結果:
/9j/4AAQSkZJR...wDtUAVs7eF...
/9j/4AAQSkZJR...wDt89ymnxJ...
前面一段還是相同的,轉到後面,就開始南轅北轍了
——————————
原因我去網上找了一下但是沒有找到直接答案,但是看到一篇解釋base64編碼原理的文章
原文鏈接:<a href="http://www.cnblogs.com/luguo3000/p/3940197.html" target="_blank">http://www.cnblogs.com/luguo3000/p/3940197.html</a>
假設有文件A(txt文件,包含文本內容"ABCDEFG"),轉換為InputStream->byte[]後
它們的ASIIC碼分別對應65、66、67、68、69、70、71
二進製表現形式為:
1000001 1000010 1000011 1000100 1000101 1000110 1000111
對高位補零後:
01000001 01000010 01000011 01000100 01000101 01000110 01000111
在內存中的實際表現:
而base64編碼,使用的字元包括(A-Z、a-z、0-9、+、/、=)這些常規可讀字元,使用base64編碼的原因,用途,在於把一些亂碼字元、不可讀字元轉換為常規可讀字元;
(因為java底層的通信協議、或者說其它的通信協議,很多地方用到遠程通信這一塊的,對一些亂碼字元不支持傳輸,所以需要把亂碼字元轉換成常規可讀字元才能進行傳輸)
比如對於'矙'這個字元,部分傳輸協議的編碼集就不認識它,所以無法直接傳輸,必須base64轉碼
'矙'的UTF-8編碼值為30681,二進製表現形式為111011111011001->(0)111011111011001
需要兩個位元組來存儲01110111 11011001
base64編碼只有(A-Z、a-z、0-9、+、/、=)這些字元來表示。需要強調的是,在base64編碼規范中,字元'A'不等於65、'B'也不是66...。base64字元與數值(二進制值)的對應關系如下:
也就是說,常規字元'A'=65=01000001;而base64字元'A'=0=00000000;
base64字元代表的二進制值是無法直接表示'矙'這個字元的,因為base64字元的值范圍在0~63之間(二進制值在(00)000000~(00)111111之間)。
那如何通過(00)000000~(00)111111之間的數值來表示01110111 11011001呢?
這就是base64的編碼演算法了
一個base64字元的二進制值在(00)000000~(00)111111之間,也就是說它可以表示000000~111111之間的二進制數,一個base64字元的有效位為後6位。如何通過以6bit為單位的base64字元表示以8bit為單位的常規位元組?
6和8的最小公倍數為24,即 每4個base64字元可以表示3個常規位元組;
回到剛才的文件A,編碼過程:
(初始文件A)->"ABCDEFG"
(轉UTF-8碼 int)->65 66 67 68 69 70 71
("ABCDEFG"的二進製表示;7位元組)->1000001 1000010 1000011 1000100 1000101 1000110 1000111
(高位補零)->01000001 01000010 01000011 01000100 01000101 01000110 01000111
(連寫)->
(按6bit為單位對所有bit進行分割;得到10位元組)->010000 010100 001001 000011 010001 000100 010101 000110 010001 11
(按6bit*4=8bit*3的對應關系再分割;得到3組6*4位元組)->(010000 010100 001001 000011) (010001 000100 010101 000110) (010001 11)
(高位補2個零;末尾的低位也補零)->(00010000 00010100 00001001 00000011) (00010001 00000100 00010101 00000110) (00010001 00110000)
(二進制值換算成十進制)->(16 20 9 3) (17 4 21 6) (17 48)
(按base64編碼的值-字元對應表,得出上面的十進制值對應的base64字元)->(Q U J D) (R E V G) (R w)
(每組base64字元都要求是4個,空白的位置補'='字元)->(Q U J D) (R E V G) (R w = =)
(文件A的最終轉碼結果)->QUJDREVGRw==
這里以文本文件作為演示,因為文本文件機器可讀人也可讀;實際情況中,很多時候轉碼的目標文件並不是文本文件,那就不能以可讀字元串形式表示了,會直接以二進制格式表示
體積增大的原因,是因為3位元組=24bit=分割成4個6bit-,對4個6bit高位補零後,就得到4個位元組
也就是說3個常規位元組經base64編碼後會生成4個base64位元組,這就是文件經base64轉碼後體積會增加1/3的原因
——————————
base64編碼原理解釋了,再看剛才的分段編碼
ByteArrayOutputStream os1 = new ByteArrayOutputStream();
InputStream file1 = new FileInputStream(path);
byte[] buf1 = new byte[1024];
int count1;
while((count1 = file1.read(buf1)) != -1)
{
os1.write(Base64.encodeBase64(buf1), 0, count1); //可以發現一個問題:Base64.encodeBase64(buf1)編碼後,體積會增加1/3,所以這里的Base64.encodeBase64(buf1)編碼轉換後的實際長度和count1並不相等,所以實際寫入到os1中的base64字元數只有Base64.encodeBase64(buf1)編碼產生的字元數的3/4
os1.flush();
}
file1.close();
System.out.println(os1.toString());
修改後:
ByteArrayOutputStream os1 = new ByteArrayOutputStream();
InputStream file1 = new FileInputStream(path);
byte[] byteBuf = new byte[1024];
byte[] base64ByteBuf;
while(file1.read(byteBuf) != -1)
{
base64ByteBuf = Base64.encodeBase64(byteBuf);
os1.write(base64ByteBuf, 0, base64ByteBuf.length);
os1.flush();
}
file1.close();
System.out.println(os1.toString());
——————————
修改後,發現分段編碼的結果發生了變化,跟之前不一樣了
但仍然不是正確的結果
原因在於,base64字元的基礎單位是(6bit*4=4位元組),而3個常規位元組(8bit*3)才能剛好產生4個base64位元組
根本原因在於,如果進行編碼的常規位元組數不是3的倍數,最後就會餘下1或2個位元組,而這1、2個位元組編碼的結果就會產生'='字元;
使用1024作為分段編碼緩沖時,編碼的結果是3+3+3+...+1
也就是每次都會餘1位元組
而沒有使用分段編碼時,當編碼到第1024個位元組時,"餘下"的1位元組會跟後面的位元組形成連續,就不會產生'='字元
(對一段byte字元進行base64編碼時,中間是絕不會產生'='字元的,因為只有在結尾才可能餘下1或2個位元組,所以對一段byte字元進行編碼時,只有結尾才可能產生1或2個'='補全字元)
——————————
解決方法是,使用3的公倍數作為緩沖區大小
修改後:
ByteArrayOutputStream os1 = new ByteArrayOutputStream();
InputStream file1 = new FileInputStream(path);
byte[] byteBuf = new byte[3*1000];
byte[] base64ByteBuf;
while(file1.read(byteBuf) != -1)
{
base64ByteBuf = Base64.encodeBase64(byteBuf);
os1.write(base64ByteBuf, 0, base64ByteBuf.length);
os1.flush();
}
file1.close();
System.out.println(os1.toString());
測試結果再次發生了改變
中間不再有'='字元了,因為中間每次都是3位元組3位元組的編碼,沒有餘下多餘的位元組
對比之後發現,中間段的結果已經正常了
——————————
但是,發現,結尾處兩個轉碼的結果有些許不同
原因在於,假設文件A的長度為3001個位元組;
在第二次循環讀取時,只讀到1個有效位元組,而byteBuf的剩餘2999個位元組都是無效位元組,而此時編碼時,卻把多餘的2999個無效位元組也編碼了進去
(如果是非分段轉碼,就不會出現這種情況)
解決方法:
ByteArrayOutputStream os1 = new ByteArrayOutputStream();
InputStream file1 = new FileInputStream(path);
byte[] byteBuf = new byte[3*1000];
byte[] base64ByteBuf;
int count1; //每次從文件中讀取到的有效位元組數
while((count1=file1.read(byteBuf)) != -1)
{
if(count1!=byteBuf.length) //如果有效位元組數不為3*1000,則說明文件已經讀到尾了,不夠填充滿byteBuf了
{
byte[] = Arrays.Of(byteBuf, count1); //從byteBuf中截取包含有效位元組數的位元組段
base64ByteBuf = Base64.encodeBase64(); //對有效位元組段進行編碼
}
else
{
base64ByteBuf = Base64.encodeBase64(byteBuf);
}
os1.write(base64ByteBuf, 0, base64ByteBuf.length);
os1.flush();
}
file1.close();
System.out.println(os1.toString());
至此,base64分段編碼才算大功告成。大文件上傳核心代碼才算大功告成。
其實代碼改起來非常簡單,但是不知道原因不知道原理的話,是無法無中生有的
對我本人來說原本只是想隨便答一下,但沒想到答的過程中發現自己有很多坑沒有發現。答的過程中把自己不懂的地方沒有發現的坑也完善了。不說碰到一個知識點就要追根究底,但實際開發中,每一個自己能親身碰到的實際問題都是鍛煉自己的絕佳機會,這種近距離觸碰問題、解決問題的機會是難得的。雖然開發中還有很多其它問題也很重要,但你沒有親手碰到過,是無法共鳴的。所以自己在開發中碰到了問題,還是建議大概弄清原因。
弄清原理後,即使以後出現這個問題的其它"變種",也能找到原因並自己解決,但僅僅粘貼復制無法做到這一點。
❹ android中的xml文件中文亂碼怎麼解決
一、android sax庫遇到gbk或gb2312編碼時
方法1. 可以顯示的指明編碼比如
InputSource is = new InputSource(inputStream); is.setEncoding("UTF-8");
方法2. 使用InputStreamReader轉換 在SDK中可以查看有這樣實例化方法,參數二為字元集
InputStreamReader(InputStream in, Charset charset)
具體使用可以是
InputSource is=new InputSource(new InputStreamReader(inputStream,"gb2312"));
有關InputSource的細節, 如果有字元流可用,則解析器將直接讀取該流,而忽略該流中找到的任何文本編碼聲明。如果沒有字元流,但卻有位元組流,則解析器將使用該位元組流,從而使 用在 InputSource 中指定的編碼,或者另外(如果未指定編碼)通過使用某種諸如 XML 規范 中的演算法演算法自動探測字元編碼。如果既沒有字元流,又沒有位元組流可用,則解析器將嘗試打開到由系統標識符標識的資源的 URI 連接 。
二、android開發網提倡盡量在伺服器上配置使用utf-8編碼,雖然顯示英文字元較為兩非,但是兼容性是最好的,也是國際最主流的標准。
❺ Android培訓課程有什麼內容
第一階段的課程一般都是Java編程開發
這一部分應該會和Java後台有相關聯的地方,但是比Java後台簡單,這一階段一般要學習Java語法和Java面向對象思想、Java數據結構及演算法、GUI界面編程、Java進程與線程、Java網路通信與流、設計模式、資料庫和Javaweb,安卓在這一階段的學習內容看似和後台關聯性很大,但是這一部分我們只學習後台一些基礎的東西和日後會用到的東西,我們要把基礎奠定好。
第二階段要學習的內容是安卓基礎開發
主要的課程內容為Android界面編程(界面編程是Android入門的核心技術,內容縱多,涉及四大組件之一Activity、Wedget、自定義View、事件處理、動畫處理、列表、圖片處理、國際化、資源文件、菜單、通知、對話框、Tools/ActionBar/Fragment、樣式/主題、Intent。)、進程與線程、服務與廣播、數據存儲、網路通信、多媒體以及硬體相關,這一階段更注重安卓入門基礎的培訓,一定要好好的把握。
接下來學習的內容是一個進階階段,主要學習的是安卓的高級開發,一般的課程內容為HOME開發、NDK開發等、地圖開發項目發布等等,以上就算是安卓培訓的所有學習內容,但是你掌握了學習內容之後還是遠遠不夠的,一般的培訓班都會給我們安排項目實戰的,這是一種思想的鍛煉,我們做什麼就要有什麼的思維做後台的有做後台的思維,做前端的有做前端的思維,我們學安卓的進行手機端APP開發的就要有安卓的思維,這一階段也是很重要的,就好比我們在華清遠見學完整體的內容之後也參與了一些項目的實戰。
我把每一階段要學習的課程都給你整理了,你可以現在有準備的去看一些基礎的視頻或者相關的書籍了。
安卓培訓視頻資料都有
❻ android super.ondestroy;放在前面好還是修改代碼的後面好
生命周期的方法執行都是在主進程中是同步的,即先寫先執行,後寫後執行。super是重寫父類的標識,一般情況super放前後都不會有什麼問題,比如基本數據的加減不涉及到UI的操作。但不妨想一想,如果第一個生命周期oncreate的super沒有執行,即該Activity初始化都沒完成,你讓它載入布局行嗎?答案是NO,肯定會報錯,所以特殊情況下系統會要求你必須Super初始化放前面。另外,按照Android編碼規范,super初始化也是要求寫前面的。
❼ 怎樣快速理清一個android工程
確實沒有發現好的工具,我說下我個人的意見吧,其實這個得根據個人的實際情況來看。
首先,你需要理解你們的項目需求,也即是你們的項目需要幹啥,有哪些功能,這個需要看項目的需求文檔。不過,有的公司,這個環節可能沒文檔,故只能做第二步了,如果沒有功能文檔需求,原型圖,高保真總有吧,這個一定要看看,起碼心裡得有譜,這個項目到底到底會做成啥樣。
然後,你就需要了解這個項目的功能模塊劃分了。項目有幾個功能模塊,前面的開發人員是如何劃分,找前面的coder問下,這個時候還是先別看代碼,不要太急,最好自己理個列表出來,然後再看下他們在每個模塊下包含了哪些功能,這個需要多問前面的coder。
接著,要做的是,項目的是怎麼組織的,這個時候,你可以開始關注代碼了。你需要了解項目中層次是怎麼劃分的,各個層次間是怎麼交互組織在一起,一般而言,我們需要關注下面幾個層次:
1、網路層,即項目的網路層是怎麼組織的,如何發起網路訪問的。如果你需要做的功能較多,就有必要順帶看下他們的伺服器介面文檔。
2、資料庫層,也即項目的資料庫這塊,有幾張表,怎麼執行增刪改查等操作的。
3、項目中的實體模型有哪些,數據結構是如何組織的。
4、項目的視圖層是如何和網路層、資料庫層結合的,也即activity或fragement中如何調用網路和資料庫,如何進行數據的處理的。簡單說,就是數據是如何處理的,怎麼來、到那裡去。
下一步,就是開始理清他們的coder中,哪些類對應了哪些模塊的哪些功能,一般是以包為單位或者通過命名區分的,這個時候,有必要了解下他們的編碼規范和命名規則了,應該通過文件和資源的名稱,很多時候,很好理清代碼。這個時候,最好關注下他們有哪些基本的基類,你後面能直接用到的功能有哪些是他們已經寫過了,或者可以直接從基類繼承的。
經過上面的步驟後,我覺得,這個項目也差不多能理個頭緒了,接著,你就可以嘗試著寫點或修改些功能了,可以先模仿別人的,然後再嘗試著自己寫寫
❽ 如何優雅地使用Android Studio
1:快捷鍵不要戀舊用Eclipse的,還是耐心的學習IntelliJ IDEA的快捷鍵吧。(ls有快捷鍵的pdf文檔下載地址)
2:如果團隊之前使用Eclipse,現在仍有人使用Eclipse的話。建議下載Eclipse Code Formatter插件,導入之前Eclipse下自定義的代碼格式規范。
3:本人並不習慣darcula的配色,所以下載了monokai的配色。
下載地址:OtaK/jetbrains-monokai-sublime · GitHub
下載後解壓。在Android Studio中file->import setting 選擇解壓目錄下的Monokai-Sublime.jar,勾選導入color scheme。注意在導入monokai配色方案之前先將主題設為darcula。
4:力薦Genymotion,速度真的很快。當然大部分時候我依然使用真機調試。
5:學會使用梯子。
6:內存8G以上,硬碟最好使用SSD。
7:查看有什麼好用的Android Studio的插件值得推薦? - Android 開發
❾ android 和java fileinputstream 的區別
不可以簡寫,要有編碼規范。 DataInputStream是數據輸入流,讀取的是java的基本數據類型。 FileInputStream是從文件系統中,讀取的單位是位元組。
❿ 如何把android-formatting.xml和android.importorder導入eclipse中
項目要Android移終端發代理軟體Agent涉及API沒加SDK所要源代碼發用eclipse+ADT作android發工具說便HelloActivity程序我覺eclipse功能強我用eclipse發android源碼我直接android源碼工程導入eclipse般說都現錯誤說許類庫(包)找參考
今找關於使用eclipse發android源碼官文檔:該文檔實踐總結幾點:
1、使用eclipse編輯JAVA程序、檢查錯誤(主要類庫包含語面)能eclipse編譯運行android源碼shellmake(或mm或mmm)
2、android源碼文件夾提供些eclipse配置文件
.claapath:eclipse工程配置文件便我直接android源碼相應文件JAVA包導入工程
android-formatting.xmlandroid.importorder:重要主要用規范我編碼風格更容易使我代碼風格致
3、android源碼作工程導入eclipse必須注意兩點
1)、新建工程必須javaproject能androidproject否則破壞android源碼(般添加文件/文件夾)
2)、導入前檢查.classpath文件android源碼否相應文件(文件夾)否則破壞android源碼(般添加文件/文件夾)
總說:
1、用eclipse編輯代碼、檢查錯誤
2、eclipse編譯、運行android源碼程序能命令行通make(或mm或mmm)編譯android源碼
3、eclipse調試android源碼程序(原理:eclipse通ddms伺服器emulator進行調試)並單步調試、斷點調試
面官文檔總結具體用eclipse發android源碼
1、建立基本android發環境
請參考官文檔或<android模擬器ubuntu8.10安裝>
2、編譯android源碼
android源碼根目錄通make進行編譯請注意些配置具體參考<android源碼編譯>
3、eclipse工程配置文件復制android源碼根目錄
cp development/ide/eclipse/.classpath ./
chmod u+w .classpath # Make the writable
4、修改eclipse程序配置
1)、修改eclipse緩存設置
eclipse.ini(eclipse軟體安裝目錄)3值改面值:
-Xms128m
-Xmx512m
-XX:MaxPermSize=256m
2)、android-formatting.xmlandroid.importorder導入eclipse
android-formatting.xml、.classpathandroid.importorder都放development/ide/eclipse/
android-formatting.xml用配置eclipse編輯器代碼風格;android.importorder用配置eclipseimport順序結構
window->preferences->java->Codestyle->Formatter導入android-formatting.xml
window->preferences->java->Codestyle->OrganizeImports導入android.importorder
3)、安裝anyedit插件(選)
載並導入eclipse
5、android源碼作工程導入eclipse
導入前先檢查.classpath文件android源碼否相應文件(文件夾)否則破壞android源碼(般添加文件/文件夾).classpath余路徑刪除
新建JavaProject(androidproject否則破壞android源碼)選擇已存工程導入工程名任意完
導入eclipse要build工程比較慢導完般都沒錯誤
6、eclipse調試android程序
先執行:
cd android源碼目錄
. build/envsetup.sh
lunch 1 # to build the emulator
emulator & # you should see a GUI picture of a phone
ddms & # you should get a splufty debugging console
eclipse配置調試類型埠:
Run->Debug Configurations->Remotejavaapplication雙擊Host:設 localhostPort:設8700ConnectionTypeStandard(SocketAttach)
Apply
注意點擊Debug苦錯說8700埠佔用DDMS程序關掉重新打DDMSOK提供連VM錯誤請注意要先DDMS選某進程(應某應用程序)才能eclipse執行Debug
eclipse調試設斷點、單步調試估計google團隊發、調試android應用程序
7、編譯android源碼
執行:
cd android源碼目錄
. build/envsetup.sh
mm/mmm等命令mm/mmm用編譯模塊(包括C、C++、JAVA程序)我直接android源碼根目錄執行make模塊名編譯模塊
類: Android-app, Android-SourceCode