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~

提醒:各位同仁遇到相似的问题的时候,千万当心这个...

相关文章
相关标签/搜索