eclipse和android源碼編譯應用效果有差別

通常來講,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~

提醒:各位同仁遇到相似的問題的時候,千萬當心這個...

相關文章
相關標籤/搜索