1、Android Studio 如何提交代碼到 github:
http://blog.csdn.net/u011068702/article/details/49273231#userconsent#
2烫扼、Eclipse 導(dǎo)入 android 項(xiàng)目包xml報(bào)錯(cuò)未生成 R 文件:
http://jingyan.baidu.com/article/c910274be7536acd361d2dca.html
3、解決 WebView 和 JavaScript 調(diào)用混淆導(dǎo)致功能失效:
在 eclipse 的 proguard.cfg 中加入“保持該類下的所有方法不被混淆”
-keep public class com.example.web_01.WebHost
{
public <methods>;
}
4与帆、eclipse 查看 .class 文件方法:
【1】在項(xiàng)目 libs 目錄下新建File: android-suppory-v4.jar.properties
【2】在android-support-v4.jar.properties 里加入 src = E:\Android SDK\sdk\extras\android\support\v4\src ( SDK中對(duì)應(yīng)版本的src位置 )
【3】重啟 eclipse
5、genymotion 使用問(wèn)題
【1】重啟ADB方法:在 cmd 的 D:\android\adt-bundle-windows-x86_64-20140702\sdk\platform-tools目錄下輸入 adb kill-server 和 adb start-server
【2】eclipse 無(wú)法識(shí)別 genymotion 原因: genymotion 的 API 版本低于項(xiàng)目的 API 版本
6墨榄、解決 ADB Server didn't ACK:
打開(kāi)任務(wù)管理器玄糟,點(diǎn)擊進(jìn)程,把里面的手機(jī)助手進(jìn)程都結(jié)束了袄秩。原因是手機(jī)助手占用了ADB的5037端口阵翎,可在 platform-tools 下用 netstat -ano | findstr "5037" 查看。
7之剧、解決 Unable to resolve target 'android-17' 報(bào)錯(cuò)
修改project.properties:把Project target.target=android-17改成Project target.target=android-21 再 clean
8郭卫、v4包找不到:
當(dāng)引用的library中的jar包和本項(xiàng)目的jar包不一致,會(huì)導(dǎo)致v4包找不到背稼》【可選擇刪除其中一個(gè),使兩個(gè)項(xiàng)目中的jar一樣
9蟹肘、自定義Application問(wèn)題:
自定義Application一定要注冊(cè)词疼,且通過(guò)getApplication()方法獲得。
10帘腹、SQLite使用問(wèn)題:
java.lang.IllegalStateException: Couldn't read row 0, col -1 from CursorWindow. Make sure the Cursor is initialized correctly before accessing data from it.
字段不一致贰盗。進(jìn)行修改了數(shù)據(jù)庫(kù)的操作,一定要先卸載原應(yīng)用竹椒,再重新安裝童太。為了字段排序,應(yīng)采用 TreeMap 代替 HashMap 胸完。
11书释、Layout動(dòng)態(tài)設(shè)置高度:
//必須用android.view.ViewGroup.LayoutParams重新設(shè)置高度
android.view.ViewGroup.LayoutParams pp = view.getLayoutParams();
pp.height = 200;
view.setLayoutParams(pp);
12、為onClickListener 添加判斷標(biāo)志:
可使用view.setTag()
13赊窥、Android Sudio 導(dǎo)入 Eclipse 項(xiàng)目:
http://www.open-open.com/lib/view/open1421580998718.html
14爆惧、解決 Android 應(yīng)用方法數(shù)不能超過(guò) 65K 的問(wèn)題 ( 摘自安卓巴士Android開(kāi)發(fā)者門(mén)戶 ):
作為一名Android開(kāi)發(fā)者,相信你對(duì)Android方法數(shù)不能超過(guò)65K的限制應(yīng)該有所耳聞锨能,隨著應(yīng)用程序功能不斷的豐富扯再,總有一天你會(huì)遇到一個(gè)異常:
Conversion to Dalvik format failed:Unable toexecute dex: method ID not in [0, 0xffff]: 65536可能有些同學(xué)會(huì)說(shuō),解決這個(gè)問(wèn)題很簡(jiǎn)單址遇,我們只需要在Project.proterty中配置一句話就Ok啦熄阻,dex.force.jumbo=true ,是的倔约,加入了這句話秃殉,確實(shí)可以讓你的應(yīng)用通過(guò)編譯,但是在一些2.3系統(tǒng)的機(jī)器上很容易出現(xiàn)INSTALL_FAILED_DEXOPT異常 !
對(duì)于以上兩個(gè)異常钾军,我們先來(lái)分析一下原因:
1鳄袍、Android系統(tǒng)中,一個(gè)Dex文件中存儲(chǔ)方法id用的是short類型數(shù)據(jù)吏恭,所以導(dǎo)致你的dex中方法不能超過(guò)65k
2拗小、在2.3系統(tǒng)之前,虛擬機(jī)內(nèi)存只分配了5M
知道了原因樱哼,我們就來(lái)一個(gè)個(gè)的解決上面的問(wèn)題哀九,首先對(duì)于65k的問(wèn)題,我們?cè)趹?yīng)用層是無(wú)法改變android系統(tǒng)的結(jié)構(gòu)的搅幅,所以我們無(wú)法將數(shù)據(jù)類型從short改變?yōu)閕nt或者其他類型勾栗,也就是說(shuō)一個(gè)dex中的方法數(shù)不能超過(guò)65k是我們無(wú)法逾越的鴻溝,我們只能減少一個(gè)dex中的方法數(shù)盏筐,首先最容易想到的方案就是去掉一些無(wú)用的Jar包,以及將一些屬性設(shè)置為public砸讳,從而可以去掉get/set方法琢融,這種方法只能臨時(shí)解決問(wèn)題,隨著時(shí)間的推移簿寂,總有一天還是會(huì)出現(xiàn)方法數(shù)超過(guò)65k的漾抬,畢竟一個(gè)應(yīng)用一般是在加功能,不會(huì)減功能常遂。
下面我來(lái)向大家介紹兩種主流的解決方案纳令,一種是以微信為代表的,將一些功能做成插件克胳,動(dòng)態(tài)加載平绩,另一種方案是以facebook為代表的分包方案,將一個(gè)apk中的dex文件分割成多個(gè)dex文件漠另,然后動(dòng)態(tài)的去加載dex文件捏雌。其實(shí)這兩種方案的核心思想是一樣的,插件是把未來(lái)要開(kāi)發(fā)的新功能做成apk和dex動(dòng)態(tài)加載笆搓,而分包方案是將已經(jīng)完成的功能分成多個(gè)dex文件動(dòng)態(tài)加載性湿,其實(shí)我個(gè)人覺(jué)得插件方案比分包方案更好的解決了65k的問(wèn)題,因?yàn)椴寮桨覆粌H能夠解決65k問(wèn)題满败,還能讓我們的應(yīng)用體積減小肤频,而分包只能解決65k的問(wèn)題。
關(guān)于插件開(kāi)發(fā)算墨,做成動(dòng)態(tài)加載宵荒,我在很早之前一篇文章中就寫(xiě)過(guò)其基本思想,有興趣的同學(xué)可以看看《實(shí)現(xiàn)Android 動(dòng)態(tài)加載APK(Fragment or Activity實(shí)現(xiàn))》
下面我們重點(diǎn)介紹分包機(jī)制
我們知道一個(gè)apk文件里面有一個(gè)dex文件,這個(gè)dex文件里面都是經(jīng)過(guò)優(yōu)化了的class文件骇扇,所謂分包摔竿,就是講一個(gè)dex文件分成多個(gè)dex文件,這里我們約定一下少孝,第一個(gè)dex叫做main.dex,第二個(gè)叫做second.dex继低,通常在分包的時(shí)候,我們需要將應(yīng)用啟動(dòng)就需要使用的類放入到main.dex中稍走,把不是立馬就需要使用的類放入到second.dex中袁翁,對(duì)于Android系統(tǒng),他只會(huì)默認(rèn)加載main.dex的婿脸,second.dex對(duì)于他來(lái)說(shuō)可能只是一個(gè)資源文件粱胜,它是不會(huì)主動(dòng)去加載second.dex,所以我在應(yīng)用啟動(dòng)的過(guò)程中,我們需要為second.dex創(chuàng)建好一個(gè)類加載器狐树,便于我在使用second.dex中的類時(shí)焙压,能夠里面加載該類。
關(guān)于如何加載second.dex也有好多做法抑钟,用的比較多的主要有一下幾種:
1涯曲、最簡(jiǎn)單的做法就是使用DexClassLoader進(jìn)行加載,并將該DexClassLoader的父加載器設(shè)置為PathClassLoader
2在塔、使用DexClassLoader加載幻件,并將DexClassLoader的父加載器設(shè)置成PathClassLoader的父加載器,將PahtClassLoader的父加載器設(shè)置成DexClassLoader,仔細(xì)品味一下1和2的區(qū)別
3蛔溃、將second.dex的路徑放入到PathClassLoader的加載路徑中
對(duì)于第2中方案绰沥,在有一種情況下是不能使用的,比如當(dāng)second.dex通過(guò)DexClassLoader加載贺待,但是second.dex中使用了一個(gè)類徽曲,這個(gè)類在main.dex中,這個(gè)時(shí)候就會(huì)拋出類找不到的異常狠持,所以這種方案只能擁有second.dex不會(huì)用到main.dex類的時(shí)候
以上說(shuō)的都是理論疟位,下面我們來(lái)實(shí)戰(zhàn)一下
我這里會(huì)介紹兩種方案,一種是基于gradle構(gòu)建Android項(xiàng)目喘垂,一種是基于Ant構(gòu)建Android項(xiàng)目
方案一:基于gradle構(gòu)建Android項(xiàng)目甜刻,并實(shí)現(xiàn)分包
環(huán)境要求:AndroidStudio0.9以上,gradle插件0.14.2以上
1正勒、如果你的工程在eclipse中得院,那么你需要將該工程導(dǎo)入到Android中,此時(shí)需要你升級(jí)adt22以上
2章贞、打開(kāi)你工程的build.gradle文件祥绞,檢查gradle插件是否是0.14.2版本之后,因?yàn)?.14.2之后gradle插件才支持分包、
3蜕径、打開(kāi)工程下某一個(gè)Moudle的build.gradle文件两踏,添加對(duì)android-support-multidex.jar的依賴
4、去掉第三方j(luò)ar包中重復(fù)的類
5兜喻、設(shè)置虛擬機(jī)堆內(nèi)存空間大小梦染,避免在編譯期間OOM
6、gradle構(gòu)建項(xiàng)目時(shí)朴皆,貌似默認(rèn)是不會(huì)將so庫(kù)加入工程的帕识,所以為了避免此種情況發(fā)生,我們需要制定so庫(kù)目錄遂铡,對(duì)于從eclipse轉(zhuǎn)換過(guò)來(lái)的工程肮疗,還需要制定src和資源文件路徑
7、如果你的項(xiàng)目依賴了其他庫(kù)扒接, 分別在各個(gè)庫(kù)工程中加入 multiDexEnabled = true 和 jniLibs.srcDirs =['libs']兩個(gè)配置即可
8伪货、如果你的項(xiàng)目沒(méi)有自定義Application,那么你在AndroidManifest.xml中使用MultiDexApplication即可钾怔,如果你的項(xiàng)目有自定義Application,并且是繼承是Application超歌,那么只需要改為繼承MultiDexApplication即可,如果你的項(xiàng)目時(shí)繼承的其他Application蒂教,那么你需要重寫(xiě)attachBaseContext
經(jīng)過(guò)上述配置,你的項(xiàng)目應(yīng)該是已經(jīng)成功分包了脆荷。如果分包成功凝垛,那么你解壓你的apk文件,會(huì)發(fā)現(xiàn)有兩個(gè)dex文件蜓谋,通過(guò)上述的配置過(guò)程梦皮,我們發(fā)現(xiàn)此方案我們無(wú)法控制哪些類在main.dex中,哪些類在second.dex中桃焕,通過(guò)此種方案配置分包剑肯,可以兼容API4-API20.其加載second.dex采用的是上述方案中的3
下面我們來(lái)看看基于Ant構(gòu)建Android項(xiàng)目,并實(shí)現(xiàn)分包過(guò)程
在上述方案中观堂,由于我們無(wú)法看到gradle構(gòu)建項(xiàng)目的腳本让网,所以我們無(wú)法控制哪些類在第一個(gè)dex,哪些類在第二個(gè)dex师痕,此方案中溃睹,我們采用Ant構(gòu)建,Ant是允許用戶自己定義構(gòu)建方案的胰坟,比如我們可以通過(guò)自定義構(gòu)建方案因篇,將項(xiàng)目中某些第三方j(luò)ar包放入到second.dex中,關(guān)于這個(gè)如何實(shí)現(xiàn),請(qǐng)參考開(kāi)源項(xiàng)目吧
https://github.com/mmin18/Dex65536.git
由于該項(xiàng)目加載second.dex所采用的方案是上述方案2竞滓,比如second.dex中的某些第三方j(luò)ar包依賴main.dex中的某些類咐吼,這種方案就會(huì)實(shí)現(xiàn),所以在此我將此方案去掉商佑,換成了方案3锯茄,也就是將second.dex的路徑設(shè)置到PathClassLoader的加載路徑中,我只給出Android 4.4中的解決方案莉御,其他系統(tǒng)大同小異
加載second.dex方法撇吞!
分包成功后,解壓apk文件礁叔,進(jìn)入assert文件夾牍颈,我們看到如下結(jié)構(gòu),libs.apk就是第三方j(luò)ar編譯后形成的dex文件對(duì)于上面提到的第二個(gè)問(wèn)題INSTALL_FAILED_DEXOPT琅关,根本原因就是2.3版本之前dalvik虛擬機(jī)的內(nèi)存只有5M,所以無(wú)論是插件方案還是分包方案在某些手機(jī)上還是會(huì)遇到該問(wèn)題煮岁,畢竟我們僅僅是減少了每個(gè)dex中包的數(shù)量,但是方法總數(shù)是沒(méi)有減少的涣易,所以解決此問(wèn)題的根本方法就是修改虛擬機(jī)內(nèi)存至8M,這個(gè)需求在Java層是無(wú)法實(shí)現(xiàn)画机,但是可以在c層實(shí)現(xiàn),具體實(shí)現(xiàn)流程可以參考開(kāi)源項(xiàng)目:https://github.com/viilaismonster/LinearAllocFix.git新症。至于該方法中用到的一些方法步氏,可以到 android-support-multidex.jar中找到,這里就不都貼出來(lái)了徒爹,如果那里沒(méi)有寫(xiě)清楚荚醒,歡迎留言討論...!
15隆嗅、訪問(wèn)開(kāi)發(fā)API官網(wǎng)的問(wèn)題:
采用火狐瀏覽器界阁,設(shè)置為脫機(jī)工作
16、綁定Service相關(guān)問(wèn)題:
要在注冊(cè)的Service中胖喳,加入android:exported="true"泡躯,否則會(huì)
產(chǎn)生 java.lang.SecurityException: Not allowed to bind to service Intent
{ act=www.qslx.com.aidl.IRemoteService,這個(gè)錯(cuò)誤丽焊,就是綁定不了這個(gè)服務(wù)
17较剃、eclipse開(kāi)發(fā)中調(diào)換xml布局控件順序?qū)е耭indViewById報(bào)錯(cuò):
clean一下project就好了
18、PopupWindow點(diǎn)擊外部會(huì)消失的解決方法:
setOutsideTouchable(true);// 只是外面可以點(diǎn)擊技健,并不是點(diǎn)擊可以消失
setBackgroundDrawable(new BitmapDrawable());// 加上以下句子才可以做到點(diǎn)擊外部消失
setTouchInterceptor(new OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
if (event.getAction() == MotionEvent.ACTION_OUTSIDE) {
dismiss();
return true;
}
return false;
}
});
19重付、getView()復(fù)用問(wèn)題:
【1】先重置狀態(tài)再選中狀態(tài)
【2】用List或Bean把狀態(tài)存起來(lái)
20、ListView點(diǎn)擊Item沒(méi)反應(yīng):
android:descendantFocusability="blocksDescendants"
http://www.cnblogs.com/eyu8874521/archive/2012/10/17/2727882.html
21凫乖、使用網(wǎng)絡(luò)相關(guān)問(wèn)題:
要導(dǎo)入
<uses-permission
android:name="android.permission.INTERNET"/>
而不是
<uses-permission android:name="ANDROID.PERMISSION.INTERNET"/>
注意測(cè)試手機(jī)也要聯(lián)網(wǎng)
22确垫、ListView控件復(fù)用導(dǎo)致圖片加載位置錯(cuò)誤:
【1】為imageView綁定setTag()弓颈,在handler中g(shù)etTag()相同才設(shè)置圖片
【2】使用成員變量緩存?zhèn)鬟^(guò)來(lái)的變量,避免使用Thread導(dǎo)致時(shí)序上的錯(cuò)誤
23删掀、ListView圖片多次加載問(wèn)題:
使用LruCache<String,Bitmap>
24翔冀、ListView滑動(dòng)卡頓問(wèn)題:
【1】ListView滑動(dòng)停止后才加載可見(jiàn)項(xiàng)
【2】ListView滑動(dòng)時(shí),取消所有加載項(xiàng)
【3】實(shí)現(xiàn)AbsListView.OnScrollListener
25披泪、ListView最后一個(gè)item被底部布局擋住:
讓ListView置于底部布局之上
android:layout_above="@+id/bottom"
26纤子、ListView.setAdapter產(chǎn)生Null Pointer Exception:
// 此處產(chǎn)生Null Pointer Exception閃退,因?yàn)閙Datas為null
mListView.setAdapter(new ListDirArrayAdapter(context, mDatas));
27款票、Java無(wú)符號(hào)數(shù)的使用:
public static long getUnsignedIntt(long data) { // 0~4294967295 32為無(wú)符號(hào)數(shù)
// (0xFFFFFFFF即DWORD)控硼。
return data & 0x00000000FFFFFFFFL; //L一定不能漏!!!
}
28艾少、字符串equals返回false:
注意大小寫(xiě)卡乾,可輸出比較
29、eclipse添加工程依賴錯(cuò)誤 ( 解決方法同8 ):
jar包不一致缚够,刪除其一
30幔妨、Android Studio導(dǎo)入module產(chǎn)生gradle報(bào)錯(cuò):
【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的項(xiàng)目文件夾杖们,然后Commit
33沾谜、友盟或 QQ 開(kāi)放平臺(tái)常見(jiàn)問(wèn)題:
【1】友盟不支持Android Studio工程直接配置,需手工配置
【2】不管是友盟胀莹,還是QQ開(kāi)放平臺(tái),android:label="@string/app_name"這個(gè)app_name要和注冊(cè)時(shí)應(yīng)用名稱保持一致婚温,如QSLXDEMO