1、Android Studio 如何提交代碼到 github:
http://blog.csdn.net/u011068702/article/details/49273231#userconsent#
2、Eclipse 導入 android 項目包xml報錯未生成 R 文件:
http://jingyan.baidu.com/article/c910274be7536acd361d2dca.html
3、解決 WebView 和 JavaScript 調用混淆導致功能失效:
在 eclipse 的 proguard.cfg 中加入“保持該類下的所有方法不被混淆”
-keep public class com.example.web_01.WebHost
{
public <methods>;
}
4、eclipse 查看 .class 文件方法:
【1】在項目 libs 目錄下新建File: android-suppory-v4.jar.properties
【2】在android-support-v4.jar.properties 里加入 src = E:\Android SDK\sdk\extras\android\support\v4\src ( SDK中對應版本的src位置 )
【3】重啟 eclipse
5、genymotion 使用問題
【1】重啟ADB方法:在 cmd 的 D:\android\adt-bundle-windows-x86_64-20140702\sdk\platform-tools目錄下輸入 adb kill-server 和 adb start-server
【2】eclipse 無法識別 genymotion 原因: genymotion 的 API 版本低于項目的 API 版本
6、解決 ADB Server didn't ACK:
打開任務管理器,點擊進程,把里面的手機助手進程都結束了。原因是手機助手占用了ADB的5037端口,可在 platform-tools 下用 netstat -ano | findstr "5037" 查看。
7、解決 Unable to resolve target 'android-17' 報錯
修改project.properties:把Project target.target=android-17改成Project target.target=android-21 再 clean
8、v4包找不到:
當引用的library中的jar包和本項目的jar包不一致,會導致v4包找不到。可選擇刪除其中一個,使兩個項目中的jar一樣
9、自定義Application問題:
自定義Application一定要注冊,且通過getApplication()方法獲得。
10、SQLite使用問題:
java.lang.IllegalStateException: Couldn't read row 0, col -1 from CursorWindow. Make sure the Cursor is initialized correctly before accessing data from it.
字段不一致。進行修改了數據庫的操作,一定要先卸載原應用,再重新安裝。為了字段排序,應采用 TreeMap 代替 HashMap 。
11、Layout動態設置高度:
//必須用android.view.ViewGroup.LayoutParams重新設置高度
android.view.ViewGroup.LayoutParams pp = view.getLayoutParams();
pp.height = 200;
view.setLayoutParams(pp);
12、為onClickListener 添加判斷標志:
可使用view.setTag()
13、Android Sudio 導入 Eclipse 項目:
http://www.open-open.com/lib/view/open1421580998718.html
14、解決 Android 應用方法數不能超過 65K 的問題 ( 摘自安卓巴士Android開發者門戶 ):
作為一名Android開發者,相信你對Android方法數不能超過65K的限制應該有所耳聞,隨著應用程序功能不斷的豐富,總有一天你會遇到一個異常:
Conversion to Dalvik format failed:Unable toexecute dex: method ID not in [0, 0xffff]: 65536可能有些同學會說,解決這個問題很簡單,我們只需要在Project.proterty中配置一句話就Ok啦,dex.force.jumbo=true ,是的,加入了這句話,確實可以讓你的應用通過編譯,但是在一些2.3系統的機器上很容易出現INSTALL_FAILED_DEXOPT異常 !
對于以上兩個異常,我們先來分析一下原因:
1、Android系統中,一個Dex文件中存儲方法id用的是short類型數據,所以導致你的dex中方法不能超過65k
2、在2.3系統之前,虛擬機內存只分配了5M
知道了原因,我們就來一個個的解決上面的問題,首先對于65k的問題,我們在應用層是無法改變android系統的結構的,所以我們無法將數據類型從short改變為int或者其他類型,也就是說一個dex中的方法數不能超過65k是我們無法逾越的鴻溝,我們只能減少一個dex中的方法數,首先最容易想到的方案就是去掉一些無用的Jar包,以及將一些屬性設置為public,從而可以去掉get/set方法,這種方法只能臨時解決問題,隨著時間的推移,總有一天還是會出現方法數超過65k的,畢竟一個應用一般是在加功能,不會減功能。
下面我來向大家介紹兩種主流的解決方案,一種是以微信為代表的,將一些功能做成插件,動態加載,另一種方案是以facebook為代表的分包方案,將一個apk中的dex文件分割成多個dex文件,然后動態的去加載dex文件。其實這兩種方案的核心思想是一樣的,插件是把未來要開發的新功能做成apk和dex動態加載,而分包方案是將已經完成的功能分成多個dex文件動態加載,其實我個人覺得插件方案比分包方案更好的解決了65k的問題,因為插件方案不僅能夠解決65k問題,還能讓我們的應用體積減小,而分包只能解決65k的問題。
關于插件開發,做成動態加載,我在很早之前一篇文章中就寫過其基本思想,有興趣的同學可以看看《實現Android 動態加載APK(Fragment or Activity實現)》
下面我們重點介紹分包機制
我們知道一個apk文件里面有一個dex文件,這個dex文件里面都是經過優化了的class文件,所謂分包,就是講一個dex文件分成多個dex文件,這里我們約定一下,第一個dex叫做main.dex,第二個叫做second.dex,通常在分包的時候,我們需要將應用啟動就需要使用的類放入到main.dex中,把不是立馬就需要使用的類放入到second.dex中,對于Android系統,他只會默認加載main.dex的,second.dex對于他來說可能只是一個資源文件,它是不會主動去加載second.dex,所以我在應用啟動的過程中,我們需要為second.dex創建好一個類加載器,便于我在使用second.dex中的類時,能夠里面加載該類。
關于如何加載second.dex也有好多做法,用的比較多的主要有一下幾種:
1、最簡單的做法就是使用DexClassLoader進行加載,并將該DexClassLoader的父加載器設置為PathClassLoader
2、使用DexClassLoader加載,并將DexClassLoader的父加載器設置成PathClassLoader的父加載器,將PahtClassLoader的父加載器設置成DexClassLoader,仔細品味一下1和2的區別
3、將second.dex的路徑放入到PathClassLoader的加載路徑中
對于第2中方案,在有一種情況下是不能使用的,比如當second.dex通過DexClassLoader加載,但是second.dex中使用了一個類,這個類在main.dex中,這個時候就會拋出類找不到的異常,所以這種方案只能擁有second.dex不會用到main.dex類的時候
以上說的都是理論,下面我們來實戰一下
我這里會介紹兩種方案,一種是基于gradle構建Android項目,一種是基于Ant構建Android項目
方案一:基于gradle構建Android項目,并實現分包
環境要求:AndroidStudio0.9以上,gradle插件0.14.2以上
1、如果你的工程在eclipse中,那么你需要將該工程導入到Android中,此時需要你升級adt22以上
2、打開你工程的build.gradle文件,檢查gradle插件是否是0.14.2版本之后,因為0.14.2之后gradle插件才支持分包、
3、打開工程下某一個Moudle的build.gradle文件,添加對android-support-multidex.jar的依賴
4、去掉第三方jar包中重復的類
5、設置虛擬機堆內存空間大小,避免在編譯期間OOM
6、gradle構建項目時,貌似默認是不會將so庫加入工程的,所以為了避免此種情況發生,我們需要制定so庫目錄,對于從eclipse轉換過來的工程,還需要制定src和資源文件路徑
7、如果你的項目依賴了其他庫, 分別在各個庫工程中加入 multiDexEnabled = true 和 jniLibs.srcDirs =['libs']兩個配置即可
8、如果你的項目沒有自定義Application,那么你在AndroidManifest.xml中使用MultiDexApplication即可,如果你的項目有自定義Application,并且是繼承是Application,那么只需要改為繼承MultiDexApplication即可,如果你的項目時繼承的其他Application,那么你需要重寫attachBaseContext
經過上述配置,你的項目應該是已經成功分包了。如果分包成功,那么你解壓你的apk文件,會發現有兩個dex文件,通過上述的配置過程,我們發現此方案我們無法控制哪些類在main.dex中,哪些類在second.dex中,通過此種方案配置分包,可以兼容API4-API20.其加載second.dex采用的是上述方案中的3
下面我們來看看基于Ant構建Android項目,并實現分包過程
在上述方案中,由于我們無法看到gradle構建項目的腳本,所以我們無法控制哪些類在第一個dex,哪些類在第二個dex,此方案中,我們采用Ant構建,Ant是允許用戶自己定義構建方案的,比如我們可以通過自定義構建方案,將項目中某些第三方jar包放入到second.dex中,關于這個如何實現,請參考開源項目吧
https://github.com/mmin18/Dex65536.git
由于該項目加載second.dex所采用的方案是上述方案2,比如second.dex中的某些第三方jar包依賴main.dex中的某些類,這種方案就會實現,所以在此我將此方案去掉,換成了方案3,也就是將second.dex的路徑設置到PathClassLoader的加載路徑中,我只給出Android 4.4中的解決方案,其他系統大同小異
加載second.dex方法!
分包成功后,解壓apk文件,進入assert文件夾,我們看到如下結構,libs.apk就是第三方jar編譯后形成的dex文件對于上面提到的第二個問題INSTALL_FAILED_DEXOPT,根本原因就是2.3版本之前dalvik虛擬機的內存只有5M,所以無論是插件方案還是分包方案在某些手機上還是會遇到該問題,畢竟我們僅僅是減少了每個dex中包的數量,但是方法總數是沒有減少的,所以解決此問題的根本方法就是修改虛擬機內存至8M,這個需求在Java層是無法實現,但是可以在c層實現,具體實現流程可以參考開源項目:https://github.com/viilaismonster/LinearAllocFix.git。至于該方法中用到的一些方法,可以到 android-support-multidex.jar中找到,這里就不都貼出來了,如果那里沒有寫清楚,歡迎留言討論...!
15、訪問開發API官網的問題:
采用火狐瀏覽器,設置為脫機工作
16、綁定Service相關問題:
要在注冊的Service中,加入android:exported="true",否則會
產生 java.lang.SecurityException: Not allowed to bind to service Intent
{ act=www.qslx.com.aidl.IRemoteService,這個錯誤,就是綁定不了這個服務
17、eclipse開發中調換xml布局控件順序導致findViewById報錯:
clean一下project就好了
18、PopupWindow點擊外部會消失的解決方法:
setOutsideTouchable(true);// 只是外面可以點擊,并不是點擊可以消失
setBackgroundDrawable(new BitmapDrawable());// 加上以下句子才可以做到點擊外部消失
setTouchInterceptor(new OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
if (event.getAction() == MotionEvent.ACTION_OUTSIDE) {
dismiss();
return true;
}
return false;
}
});
19、getView()復用問題:
【1】先重置狀態再選中狀態
【2】用List或Bean把狀態存起來
20、ListView點擊Item沒反應:
android:descendantFocusability="blocksDescendants"
http://www.cnblogs.com/eyu8874521/archive/2012/10/17/2727882.html
21、使用網絡相關問題:
要導入
<uses-permission
android:name="android.permission.INTERNET"/>
而不是
<uses-permission android:name="ANDROID.PERMISSION.INTERNET"/>
注意測試手機也要聯網
22、ListView控件復用導致圖片加載位置錯誤:
【1】為imageView綁定setTag(),在handler中getTag()相同才設置圖片
【2】使用成員變量緩存傳過來的變量,避免使用Thread導致時序上的錯誤
23、ListView圖片多次加載問題:
使用LruCache<String,Bitmap>
24、ListView滑動卡頓問題:
【1】ListView滑動停止后才加載可見項
【2】ListView滑動時,取消所有加載項
【3】實現AbsListView.OnScrollListener
25、ListView最后一個item被底部布局擋住:
讓ListView置于底部布局之上
android:layout_above="@+id/bottom"
26、ListView.setAdapter產生Null Pointer Exception:
// 此處產生Null Pointer Exception閃退,因為mDatas為null
mListView.setAdapter(new ListDirArrayAdapter(context, mDatas));
27、Java無符號數的使用:
public static long getUnsignedIntt(long data) { // 0~4294967295 32為無符號數
// (0xFFFFFFFF即DWORD)。
return data & 0x00000000FFFFFFFFL; //L一定不能漏!!!
}
28、字符串equals返回false:
注意大小寫,可輸出比較
29、eclipse添加工程依賴錯誤 ( 解決方法同8 ):
jar包不一致,刪除其一
30、Android Studio導入module產生gradle報錯:
【1】修改build.gradle文件,把compileSdkVersion 、buildToolsVersion、
minSdkVersion、targetSdkVersion修改成一致
【2】修改gradle文件夾的wrapper的gradle-wrapper.properties,
修改gradle-2.4-all.zip
http://doc.okbase.net/x359981514/archive/112744.html
31、failed to find target with hash string 'android-22' :
修改 build.gradle 的 compileSdkVersion 和 buildToolsVersion
32、SVN合并代碼沖突:
【1】提前備份代碼
【2】用備份代碼文件夾直接替換SVN的項目文件夾,然后Commit
33、友盟或 QQ 開放平臺常見問題:
【1】友盟不支持Android Studio工程直接配置,需手工配置
【2】不管是友盟,還是QQ開放平臺,android:label="@string/app_name"這個app_name要和注冊時應用名稱保持一致,如QSLXDEMO