apk即Android安裝包,通過將APK文件直接傳到Android模擬器或Android手機中執行即可安裝。安卓Android的軟體安裝包以.apk為文件擴展名,其文件格式是標準的.zip文件,可以通過WinZIP、winrar等壓縮文件工具直接打開,或是在.apk文件名上添加.zip後綴,即可查看封裝在其中的具體文件內容,包括程序、圖片、配置文件等。
一、Apk反編譯得到java源代碼
下載上述反編譯工具包,打開apk2java目錄下的dex2jar-0.0.9.9文件夾,內含apk反編譯成java源碼工具,以及源碼查看工具。
apk反編譯工具dex2jar,是將apk中的classes.dex轉化成jar文件
源碼查看工具jdgui,是一個反編譯工具,可以直接查看反編譯後的jar包源代碼。
具體步驟:
首先將apk文件後綴改為zip並解壓,得到其中的classes.dex,它就是java文件編譯再通過dx工具打包而成的,將classes.dex復制到dex2jar.bat所在目錄dex2jar-0.0.9.9文件夾。
在命令行下定位到dex2jar.bat所在目錄,運行
dex2jar.bat classes.dex
生成
classes_dex2jar.jar
然後,進入jdgui文件夾雙擊jd-gui.exe,打開上面生成的jar包classes_dex2jar.jar,即可看到源代碼了
2. 反編譯Android APK的具體步驟是怎樣的
1、配置好JAVA環境變數,下載:apktool 解壓的文件放在C盤根目錄的apktool文件夾里(apktool文件夾自己創立)
2打開命令提示符,(開始-運行-輸入cmd)
3輸入:cd \apktool 系統指令到了apktool文件夾(這里就是為什麼要把解壓的apktool解壓的文件放到apktool文件夾的原因,當然你也可以自命名文件夾的名稱,那麼比如arc,那麼指令就變成了:cd \arc 前提是你必須把apktool解壓的文件放到這個文件夾裡面)
4使用RE管理器把系統裡面的framework-res.apk 與 SystemUI.apk 提取出來放在apktool文件夾裡面
5 如果只是想反編譯framework-res.apk
輸入apktool if framework-res.apk(框架的建立)
6開始最重要的反編譯,輸入指令,apktool d framework-res.apk
(反編輯的APK一定要用沒換過圖片的,否則回編輯失敗)
7最後反編譯完成
修改代碼完成後,輸入代碼:apktool d framework-res 即可完成回編譯
8回編譯後的新的 apk在framework/dis 文件夾裡面
9如果反編譯的是系統文件,比如,SystemUI.apk 那麼必須進行掛載框架,反編譯時,必須敲入一下命令:(然後再重復7-9步驟)
apktool if framework-res.apk
apktool if SystemUI.apk
10對於三星手機(比如9100、9108/9100G),如果反編譯SystemUI.apk要敲入一下命令進行框架掛載apktool if framework-res.apk
apktool if twframework-res.apk
apktool if SystemUI.apk
11回編譯的命令是 apktool b XXX (沒有後面的apk後綴)反編譯的命令是 apktool d xxx (有後面的apk)
3. 如何反編譯 android 中 /data/dalvik-cache/arm 下的文件
所有的 apk 內包含一個 classes.dex 文件。在 Dalvik上,apk包里的 dex文件在安裝的時候會通過 dexopt 轉化成另一個格式,叫odex(Opitimized dex),然後存在 /data/dalvik-cache裡面,如:
/data/dalvik-cache/data@app@com.wochacha-1.apk@classes.dex
雖然文件後綴還是 .dex,但是這個dex和apk內的那個已經不一樣了。這個文件是針對當前機器的硬體對 dex 文件進行了定製化,也就是說把這個放到別的設備上,不一定能運行。
PS: 在要編譯 rom 的時候,如果參數加上 "WITH_DEXPREOPT=true",會在 /system/app/ 下同時生成 .apk 和 .odex 文件(注意,這里後綴又用的 .odex,但實際上和系統在 /data/dalvik-cache/ 下的 .dex文件是一樣的)
ART
在 ART上,apk 包里的 dex文件在安裝的時候通過 dex2oat,也會生成一個後綴為 .dex 的文件,放在 /data/dalvik-cache中,如:
/data/dalvik-cache/arm/system@app@Bluetooth@Bluetooth.apk@classes.dex
/data/dalvik-cache/arm64/system@vendor@app@ims@ims.apk@classes.dex
這個文件後綴叫 .dex ,但是這個文件又不一樣了,這個既不是 dex 也不是 odex,用 dex2jar 的無法進行反編譯的。文件格式也完全不同,因為這其實就是一個實打實的 elf文件,這個文件已經可以直接在機器上運行了。
為何 pm.jar 是空的?
首先來了解一下 ROM 的編譯選項,看一下編譯的時候能做什麼事情, 大致了解就行了 。
編譯選項
WITH_DEXPREOPT
使能編譯時生成 OAT,避免第一次開機時編譯耗時,但會增大 system分區的空間消耗
DONT_DEXPREOPT_PREBUILTS
使能後,將不會對 Android.mk中包含了 include $(BUILD_PREBUILT)的 Apk進行 oat,例如 Gmail,它很可能會在後期通過商店自行升級,而升級後系統中的 oat文件則沒有意義了,但又無法刪除,會造成空間的浪費(oat比dex文件要大)
WITH_DEXPREOPT_BOOT_IMG_ONLY
僅僅針對 boot.img進行oat優化(boot.img中包含 boot.art和 boot.oat)
LOCAL_DEX_PREOPT ture|false|nostripping
可用於各個 Android.mk,對每個 package進行單獨配置,當設置為 true時,dex文件將會從 apk中剔除,如果不想剔除可使用 nostripping WPRODUCT _DEX PREOPT_*
WPRODUCT__DEX_PREOPT_*
PRODUCT_DEX_PREOPT_BOOT_FLAGS
這里的參數將會傳至 dex2oat,控制 boot.img的編譯優化行為。
PRODUCT_DEX_PREOPT_DEFAULT_FLAGS
控制除 boot.img 外,其他(如 jar, apk)的 OAT編譯行為 例如:
PRODUCT_DEX_PREOPT_DEFAULT_FLAGS := --compiler- filter=interpret-only
$(call add-proct-dex-preopt-mole- config,services,--compiler-filter=space)
WITH_DEXPREOPT_PIC ture|false
使能 position-independent code,這樣在dex2oat編譯生成的 odex文件在運行時將不必再從 /system 下拷貝到 /data/dalvik-cache/ 目錄下, 可以節省 /data 空間
WITH_ART_SMALL_MODE true|false
設置為 true 時,將只編譯處於 boot classpath 里的類,其他的均不編譯,這樣既能加快第一次開機時間,因為大部分必要的類已經編譯過了; 同時也能節省不少空間,因為 APP 都未進行編譯。缺點是可能損失一性能,這可能要平時覺察不出,但在跑分軟體上會有所體現
編譯選項的經典配置
為了提高第一次開機速度,WITH_DEXPREOPT是必須使能的,這樣則在編譯階段會完成 dex2oat的操作,避免在開機時間去做這個轉碼,節省了開機時間(6min以上縮短2min內)。
但會引起一個缺點,那就是 apk中還是包含了 class.dex(dexopt生成的),同時在對應的apk文件夾中又生成了已經轉碼成oat的 class.odex(dex2oat生成的),相當於這部分重復,造成了大量的空間浪費。
為了把 apk包里的 class.dex去除,節省空間,可以打開 DEX PREOPT DEFAULT := ture。
然而,這樣開機速度是快了,而且節省了不少system空間,但開機後,我們會發現即使在 system中已經存在 class.odex的 apk,第一次開機後還是會在 /data下面生成 class.odex,如data/dalvik-cache/arm64/system@app@Music@Music.apk@classes.dex,這是何解?原來 Google為了提高安全性,在每一台機器開機時都會在之前的機器碼加一個隨機的偏移量,這個偏移量是隨機的,每台機器都不相同,而 data分區下的這些文件就是從 system下的 class.odex加上偏移而來。
4. 怎樣反編譯 Android APK
1、將apk後綴改為zip,不用解壓,將dex文件拷貝出來即可。
2、使用dex2jar工具將dex反編譯為.jar文件
3、用jd-gui工具打開.jar文件,可看到源代碼。
4、其他資源文件將apk解壓即可得到。
5、AXMLPrinter2.jar工具可將Manifest.xml文件反編譯為.txt
5. 如何進行android 反編譯
一.看android的源代碼
1)將Apkd.apk 用zip解壓後,出現了一個classes.dex文件
2014/02/19 19:42
.
2014/02/19 19:42
..
2014/02/19 15:35 1,656 AndroidManifest.xml
2014/02/19 15:35 687,024 classes.dex
2014/02/19 15:49
META-INF
2014/02/19 15:49
res
2014/02/19 15:35 2,200 resources.arsc
2)進入到dex2jar目錄中,運行情況如下:
D:\developer\tools\test_apk\dex2jar-0.0.9.15>dex2jar.bat "..\Apkd(d2j)\classes.d
ex"
this cmd is deprecated, use the d2j-dex2jar if possible
dex2jar version: translator-0.0.9.15
dex2jar ..\Apkd(d2j)\classes.dex -> ..\Apkd(d2j)\classes_dex2jar.jar
Done.
在apk所在的目錄會出現 classes_dex2jar.jar 文件。
3) 用JD-GUI對jar包進行查看,可以查看源文件
二.反編譯apk
1.在下載APKTOOL中的三個文件(aapt.exe、apktool.bat、apktool.jar)解壓縮到你的Windows安裝目錄下,以方便使用Dos命令.
2012/12/06 11:44 854,016 aapt.exe
2014/02/19 17:15 277,372 Apkd.apk//示例用apk文件
2012/12/23 23:39 92 apktool.bat
2013/02/03 02:37 2,655,843 apktool.jar
2.進入到apktool.bat所在的目錄,運行:
apktool d Apkd.apk decode_dir
反編譯後,decode_dir目錄下的內容如下:
2014/02/19 17:16 716 AndroidManifest.xml
2014/02/19 17:16 237 apktool.yml
2014/02/19 17:18
build
2014/02/19 17:16
res
2014/02/19 17:16
smali
此時我可以查看原文件AndroidManifest.xml了,也是查看smali源文件(是用smali語言寫的,可以對照java看)。
三.APKTOOL的使用
1).decode
該命令用於進行反編譯apk文件,一般用法為
apktool d
代表了要反編譯的apk文件的路徑,最好寫絕對路徑,比如C:\MusicPlayer.apk
代表了反編譯後的文件的存儲位置,比如C:\MusicPlayer
如果你給定的已經存在,那麼輸入完該命令後會提示你,並且無法執行,需要你重新修改命令加入-f指令
apktool d –f
這樣就會強行覆蓋已經存在的文件
2).build
該命令用於編譯修改好的文件,一般用法為
apktool b
這里的
就是剛才你反編譯時輸入的
(如C:\MusicPlayer),輸入這行命令後,如果一切正常,你會發現C:\MusicPlayer內多了2個文件夾build和dist,其中分別存儲著編譯過程中逐個編譯的文件以及最終打包的apk文件。
3).install-framework
該命令用於為APKTool安裝特定的framework-res.apk文件,以方便進行反編譯一些與ROM相互依賴的APK文件。具體情況請看常見問題
四.smali與java源碼對照,並做出相應的修改
java源代碼:
import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
import android.widget.*;
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
TextView a = (TextView)this.findViewById(R.id.test) ;
a.setText("raoliang");
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
}
對應的smali源代碼:
.class public Lali/text/apkd/MainActivity;
.super Landroid/app/Activity;
.source "MainActivity.java"
# direct methods
.method public constructor ()V
.locals 0
.prologue
.line 8
invoke-direct {p0}, Landroid/app/Activity;->()V
return-void
.end method
# virtual methods
.method protected onCreate(Landroid/os/Bundle;)V
.locals 2
.parameter "savedInstanceState"
.prologue
.line 12
invoke-super {p0, p1}, Landroid/app/Activity;->onCreate(Landroid/os/Bundle;)V
.line 13
const/high16 v1, 0x7f03
invoke-virtual {p0, v1}, Lali/text/apkd/MainActivity;->setContentView(I)V
.line 14
const/high16 v1, 0x7f08
invoke-virtual {p0, v1}, Lali/text/apkd/MainActivity;->findViewById(I)Landroid/view/View;
move-result-object v0
check-cast v0, Landroid/widget/TextView;
.line 15
.local v0, a:Landroid/widget/TextView;
const-string v1, "raoliang"
invoke-virtual {v0, v1}, Landroid/widget/TextView;->setText(Ljava/lang/CharSequence;)V
.line 16
return-void
.end method
.method public onCreateOptionsMenu(Landroid/view/Menu;)Z
.locals 2
.parameter "menu"
.prologue
.line 21
invoke-virtual {p0}, Lali/text/apkd/MainActivity;->getMenuInflater()Landroid/view/MenuInflater;
move-result-object v0
const/high16 v1, 0x7f07
invoke-virtual {v0, v1, p1}, Landroid/view/MenuInflater;->inflate(ILandroid/view/Menu;)V
.line 22
const/4 v0, 0x1
return v0
.end method
6. Android app證書反編譯代碼
反編譯代碼dex2jar。
在學習android程序的開發過程中,有時候需要借鑒別人的代碼,提升自己的開發水平。
前面說了反編譯,我們當然不希望我們的應用被別人反編譯,所以就得在打包的時候進行代碼混淆,這樣的包也可反編譯出代碼,但是代碼的可讀性很低,從而達到保護代碼的目的。
7. 怎麼反編譯 android框架
使用工具:
apktool
dex2jar
jd-gui
工具介紹:
apktool
作用:資源文件獲取,可以提取出圖片文件和布局文件進行使用查看
dex2jar
作用:將apk反編譯成Java源碼(classes.dex轉化成jar文件)
jd-gui
作用:查看APK中classes.dex轉化成出的jar文件,即源碼文件
反編譯流程:
一、apk反編譯得到程序的源代碼、圖片、XML配置、語言資源等文件
下載上述工具中的apktool,解壓得到3個文件:aapt.exe,apktool.bat,apktool.jar ,將需要反編譯的APK文件放到該目錄下,
打開命令行界面(運行-CMD) ,定位到apktool文件夾,輸入以下命令:apktool.bat d -f test.apk test
(命令中test.apk指的是要反編譯的APK文件全名,test為反編譯後資源文件存放的目錄名稱,即為:apktool.bat d -f [apk文件 ] [輸出文件夾])
說明獲取成功,之後發現在文件夾下多了個test文件,點擊便可以查看該應用的所有資源文件了。
如果你想將反編譯完的文件重新打包成apk,那你可以:輸入apktool.bat b test(你編譯出來文件夾)便可
之後在之前的test文件下便可以發現多了2個文件夾:
build
dist(裡面存放著打包出來的APK文件)
二、Apk反編譯得到Java源代碼
下載上述工具中的dex2jar和jd-gui ,解壓
將要反編譯的APK後綴名改為.rar或則 .zip,並解壓,得到其中的額classes.dex文件(它就是java文件編譯再通過dx工具打包而成的),將獲取到的classes.dex放到之前解壓出來的工具dex2jar-0.0.9.15 文件夾內,
在命令行下定位到dex2jar.bat所在目錄,輸入dex2jar.bat classes.dex
在改目錄下會生成一個classes_dex2jar.jar的文件,然後打開工具jd-gui文件夾里的jd-gui.exe,之後用該工具打開之前生成的classes_dex2jar.jar文件,便可以看到源碼了
8. android 怎麼進行反編譯
下載附件解壓在桌面,打開桌面Android lollipop special文件夾里點擊Android lollipop special.bat文件輸入apktool回車測試apktool可用性 提取ROM里的框架和ui 放在桌面Android lollipop special文件夾里點擊Android lollipop special.bat文件輸入apktool if framework-res.apk回車載入框架完成 反編譯ui打開桌面Android lollipop special文件夾里點擊Android lollipop special.bat文件輸入apktool d SystemUI.apk回車反編譯完成 回編譯ui打開桌面Android lollipop special文件夾里點擊Android lollipop special.bat文件輸入apktool b SystemUI回車回編譯完成
9. android網路編程學什麼,如何學習android網路編程
第一個問題解答:android網路編程學習內容詳解:
1.0 Android基礎入門教程
1.1 背景相關與系統架構分析
1.2 開發環境搭建
1.2.1 使用Eclipse + ADT + SDK開發Android APP
1.2.2 使用Android Studio開發Android APP
1.3 SDK更新不了問題解決
1.4 Genymotion模擬器安裝
1.5.1 Git使用教程之本地倉庫的基本操作
1.5.2 Git之使用GitHub搭建遠程倉庫
1.6 .9(九妹)圖片怎麼玩
1.7 界面原型設計
1.8 工程相關解析(各種文件,資源訪問)
1.9 Android程序簽名打包
1.11 反編譯APK獲取代碼&資源
2.1 View與ViewGroup的概念
2.2.1 LinearLayout(線性布局)
2.2.2 RelativeLayout(相對布局)
2.2.3 TableLayout(表格布局)
2.2.4 FrameLayout(幀布局)
2.2.5 GridLayout(網格布局)
2.2.6 AbsoluteLayout(絕對布局)
2.3.1 TextView(文本框)詳解
2.3.2 EditText(輸入框)詳解
2.3.3 Button(按鈕)與ImageButton(圖像按鈕)
2.3.4 ImageView(圖像視圖)
2.3.5.RadioButton(單選按鈕)&Checkbox(復選框)
2.3.6 開關按鈕ToggleButton和開關Switch
2.3.7 ProgressBar(進度條)
2.3.8 SeekBar(拖動條)
2.3.9 RatingBar(星級評分條)
2.4.1 ScrollView(滾動條)
2.4.2 Date & Time組件(上)
2.4.3 Date & Time組件(下)
2.4.4 Adapter基礎講解
2.4.5 ListView簡單實用
2.4.6 BaseAdapter優化
2.4.7ListView的焦點問題
2.4.8 ListView之checkbox錯位問題解決
2.4.9 ListView的數據更新問題
2.5.0 構建一個可復用的自定義BaseAdapter
2.5.1 ListView Item多布局的實現
2.5.2 GridView(網格視圖)的基本使用
2.5.3 Spinner(列表選項框)的基本使用
2.5.4 AutoCompleteTextView(自動完成文本框)的基本使用
2.5.5 ExpandableListView(可折疊列表)的基本使用
2.5.6 ViewFlipper(翻轉視圖)的基本使用
2.5.7 Toast(吐司)的基本使用
2.5.8 Notification(狀態欄通知)詳解
2.5.9 AlertDialog(對話框)詳解
2.6.0 幾種常用對話框基本使用
2.6.1 PopupWindow(懸浮框)的基本使用
2.6.2 菜單(Menu)
2.6.3 ViewPager的簡單使用
2.6.4 DrawerLayout(官方側滑菜單)的簡單使用
3.1.1 基於監聽的事件處理機制
3.2 基於回調的事件處理機制
3.3 Handler消息傳遞機制淺析
3.4 TouchListener PK OnTouchEvent + 多點觸碰
3.5 監聽EditText的內容變化
3.6 響應系統設置的事件(Configuration類)
3.7 AnsyncTask非同步任務
3.8 Gestures(手勢)
4.1.1 Activity初學乍練
4.1.2 Activity初窺門徑
4.1.3 Activity登堂入室
4.2.1 Service初涉
4.2.2 Service進階
4.2.3 Service精通
4.3.1 BroadcastReceiver牛刀小試
4.3.2 BroadcastReceiver庖丁解牛
4.4.1 ContentProvider初探
4.4.2 ContentProvider再探——Document Provider
4.5.1 Intent的基本使用
4.5.2 Intent之復雜數據的傳遞
5.1 Fragment基本概述
5.2.1 Fragment實例精講——底部導航欄的實現(方法1)
5.2.2 Fragment實例精講——底部導航欄的實現(方法2)
5.2.3 Fragment實例精講——底部導航欄的實現(方法3)
5.2.4 Fragment實例精講——底部導航欄+ViewPager滑動切換頁面
5.2.5 Fragment實例精講——新聞(購物)類App列表Fragment的簡單實現
6.1 數據存儲與訪問之——文件存儲讀寫
6.2 數據存儲與訪問之——SharedPreferences保存用戶偏好參數
6.3.1 數據存儲與訪問之——初見SQLite資料庫
6.3.2 數據存儲與訪問之——又見SQLite資料庫
7.1.1 Android網路編程要學的東西與Http協議學習
7.1.2 Android Http請求頭與響應頭的學習
7.1.3 Android HTTP請求方式:HttpURLConnection
7.1.4 Android HTTP請求方式:HttpClient
7.2.1 Android XML數據解析
7.2.2 Android JSON數據解析
7.3.1 Android 文件上傳
7.3.2 Android 文件下載(1)
7.3.3 Android 文件下載(2)
7.4 Android 調用 WebService
7.5.1 WebView(網頁視圖)基本用法
7.5.2 WebView和JavaScrip交互基礎
7.5.3 Android 4.4後WebView的一些注意事項
7.5.4 WebView文件下載
7.5.5 WebView緩存問題
7.5.6 WebView處理網頁返回的錯誤碼信息
7.6.1 Socket學習網路基礎准備
7.6.2 基於TCP協議的Socket通信(1)
7.6.3 基於TCP協議的Socket通信(2)
7.6.4 基於UDP協議的Socket通信
8.1.1 Android中的13種Drawable小結 Part 1
8.1.2 Android中的13種Drawable小結 Part 2
8.1.3 Android中的13種Drawable小結 Part 3
8.2.1 Bitmap(點陣圖)全解析 Part 1
8.2.2 Bitmap引起的OOM問題
8.3.1 三個繪圖工具類詳解
8.3.2 繪圖類實戰示例
8.3.3 Paint API之—— MaskFilter(面具)
8.3.4 Paint API之—— Xfermode與PorterDuff詳解(一)
8.3.5 Paint API之—— Xfermode與PorterDuff詳解(二)
8.3.6 Paint API之—— Xfermode與PorterDuff詳解(三)
8.3.7 Paint API之—— Xfermode與PorterDuff詳解(四)
8.3.8 Paint API之—— Xfermode與PorterDuff詳解(五)
8.3.9 Paint API之—— ColorFilter(顏色過濾器)(1/3)
8.3.10 Paint API之—— ColorFilter(顏色過濾器)(2-3)
8.3.11 Paint API之—— ColorFilter(顏色過濾器)(3-3)
8.3.12 Paint API之—— PathEffect(路徑效果)
8.3.13 Paint API之—— Shader(圖像渲染)
8.3.14 Paint幾個枚舉/常量值以及ShadowLayer陰影效果
8.3.15 Paint API之——Typeface(字型)
8.3.16 Canvas API詳解(Part 1)
8.3.17 Canvas API詳解(Part 2)剪切方法合集
8.3.18 Canvas API詳解(Part 3)Matrix和drawBitmapMash
8.4.1 Android動畫合集之幀動畫
8.4.2 Android動畫合集之補間動畫
8.4.3 Android動畫合集之屬性動畫-初見
8.4.4 Android動畫合集之屬性動畫-又見
9.1 使用SoundPool播放音效(Duang~)
9.2 MediaPlayer播放音頻與視頻
9.3 使用Camera拍照
9.4 使用MediaRecord錄音
10.1 TelephonyManager(電話管理器)
10.2 SmsManager(簡訊管理器)
10.3 AudioManager(音頻管理器)
10.4 Vibrator(振動器)
10.5 AlarmManager(鬧鍾服務)
10.6 PowerManager(電源服務)
10.7 WindowManager(窗口管理服務)
10.8 LayoutInflater(布局服務)
10.9 WallpaperManager(壁紙管理器)
10.10 感測器專題(1)——相關介紹
10.11 感測器專題(2)——方向感測器
10.12 感測器專題(3)——加速度/陀螺儀感測器
10.12 感測器專題(4)——感測器了解
10.14 Android GPS初涉
第二個問題解答:如何學習android網路編程:
1. Android學習之路,博客是Android新手必備資料。
2. 書不在多,適合就好,這里推薦一本Android和兩本Java書籍吧。
《第一行代碼》:郭霖大神的著作。
《Thinking In Java》:Java經典書籍,不必說。
《Effective Java》:Java進階必備書籍。
3. 有些人一開始看書也有困難,沒關系,那就去網上看視頻,結合視頻和書一起看,邊看邊敲。
4. 多去混GitHub,目前最流行的開源社區,多參與開源項目,慢慢試著讀牛人們的代碼,時機到的時候自己也可以為開源社區貢獻力量,可以這樣說在GitHub上認真混一年。
5. 關注一些Android界不錯的博客。
6. 善於利用搜索引擎,從用Google做起,學會英文關鍵字搜索,有問題第一時間想到去搜索而不是去請教別人。