通常來講,eclipse只是IDE開發工具,它雖然能編譯apk,可是大多數開發狀況下,都會要求必須在源碼裏編譯經過,達到工程化,而不是單單的demo。 java
此次悲催而又詭異的遇到了這麼個問題: android
做者也是在eclipse中建的工程,並調試。由於要放到源碼裏去編譯,因此加了個在根目錄里加Android.mk放到源碼編譯,也編過了。 canvas
運行時,eclipse的效果如圖: api
android 源碼編譯的效果爲: app
神奇的事情居然出現了,焦點框的陰影竟然跑到文字上去了!!!我勒個去。 eclipse
這裏圖片(更多)、文字(遊戲),焦點框,都是用canvas畫出來的。 svn
1.查看代碼,可是很明顯代碼裏畫焦點框和陰影都是同時畫的,座標也是同樣的,文字那裏沒有加陰影的代碼 工具
void onDrawFocus(Canvas canvas, int left, int top) { //陰影 paint.reset(); paint.setShadowLayer(20f, 10f, 10f, Color.BLACK); RectF focusRectF = new RectF(x - space, y - space, r + space, b + space); canvas.save(); canvas.drawRoundRect(focusRectF, 10f, 10f, paint); canvas.restore(); // 顯示全圖 canvas.save(); canvas.drawBitmap(image_temp, x - space, y - space, null); canvas.restore(); paint.reset(); paint.setStrokeWidth(6); paint.setStyle(Style.STROKE); paint.setColor(Color.rgb(255, 201, 42)); RectF focusRectF1 = new RectF(x - space, y - space, r + space, b + space); // 焦點框 canvas.save(); canvas.drawRoundRect(focusRectF1, 0, 0, paint); canvas.restore(); }因此想來代碼是不會出現這樣的的效果的。爲了獲得結論,從新加了段代碼,畫了個紅色矩形塊放到android源碼裏編譯,也正常顯示了。惟獨這個陰影跑到文字上去了。莫名中...
2.折磨良久未果,老大過來反饋下,給我建議:反編譯對比2個apk,有哪些地方不同。
dex2jar.bat反編譯源碼,不對呀,不該該是源碼問題致使的,2者編譯過程最可能是編譯部分代碼的順序不一致。
apktool反編譯資源文件。2者()最後對比,發現: 開發工具
android 源碼編譯的apk eclipse編譯的apk spa
lib下面的庫首先排除,smali也是源碼裏的東西,也可排除;但當時注意瞭如下smali/android/annotation/下面多了2個文件,打開以後:
.class public interface abstract annotation Landroid/annotation/TargetApi; .super Ljava/lang/Object; .source "TargetApi.java" # interfaces .implements Ljava/lang/annotation/Annotation; # annotations .annotation runtime Ljava/lang/annotation/Retention; value = .enum Ljava/lang/annotation/RetentionPolicy;->CLASS:Ljava/lang/annotation/RetentionPolicy; .end annotation .annotation runtime Ljava/lang/annotation/Target; value = { .enum Ljava/lang/annotation/ElementType;->TYPE:Ljava/lang/annotation/ElementType;, .enum Ljava/lang/annotation/ElementType;->METHOD:Ljava/lang/annotation/ElementType;, .enum Ljava/lang/annotation/ElementType;->CONSTRUCTOR:Ljava/lang/annotation/ElementType; } .end annotation # virtual methods .method public abstract value()I .end method沒看明白,╮(╯▽╰)╭
網上找下,原來是代碼註釋的接口。代碼中使用:
@TargetApi annotaion:高版本API的代碼在低版本SDK兼容
但好像,這個也並無方法解決此時的問題。接着往下看AndroidManifest.xml:
只有這個一個地方不同:
android:targetSdkVersion="15"
此時也點愣了,我了個去,做者代碼上傳svn時並無這個android:targetSdkVersion="15" 啊。絞盡腦思沒明白這是爲何?抓狂中...
(android:minSdkVersion="" android:targetSdkVersion="" android:minSdkVersion=""能夠網上找下了解這個區別)
查看官方api,這麼描述:
設置這個屬性是爲了使你的應用能正常兼容運行在你的設備上,當設備平臺的系統API高於你應用中設置的targetSdkVersion。
可是明顯有一句:
An integer designating the API Level that the application targets. If not set, the default value equals that given to minSdkVersion.當沒有設置時,默認值爲你給出最小的minSdkVersion。那此時這個應該就是我設置8呀,爲何會是15?痛苦中...
接着找緣由。我用的android源碼版本就是4.0.3的,正好是對應15的level。是不android源碼編譯時,默認加進去了?
半天,這猜想沒有找到解釋。悲催中...
那就按照boss的解決問題的終極思路---死辦法:試試唄。不能老糾結在這個問題,只能試過才能驗證。
3.猜測碰運氣
a>eclipse中的AndroidManifest.xml中加上android:targetSdkVersion="15",編譯運行發現,出現和android源碼編譯的apk同樣,陰影跑到上面文字上去了╮(╯▽╰)╭
這怎麼整,源碼裏編譯,有方法能夠不讓加上android:targetSdkVersion="15" 這個麼?表示沒找到。無奈繼續試...
b>eclipse中的android:targetSdkVersion="14",編譯仍是一樣的效果,不是說設備機的版本高於剛設置的「14」,就啓用兼容運行麼?爲何效果仍是和15同樣的?表示極度不解?
c>繼續調android:targetSdkVersion="13",效果正常了,陰影在焦點框周圍了。這是爲何?爲何?不懂....
沒辦法,接着試下把android:targetSdkVersion="13",放到android源碼了編譯,效果正常顯示
4.附:
問題是解決了,可是這搞得不明不白的。
這緣由如今還沒弄明白,爲何api裏說的有偏差?讓我懷疑這已經最準確的釋義?誠心求遇到一樣問題並解決問題的朋友轉告下,tksO(∩_∩)O~
提醒:各位同仁遇到相似的問題的時候,千萬當心這個...