eclipse和android源码编译应用效果有差异

若如初见. 提交于 2019-12-04 01:01:11

一般来说,eclipse只是IDE开发工具,它虽然能编译apk,但是大多数开发情况下,都会要求必须在源码里编译通过,达到工程化,而不是单单的demo。

问题:

这次悲催而又诡异的遇到了这么个问题:

作者也是在eclipse中建的工程,并调试。因为要放到源码里去编译,所以加了个在根目录里加Android.mk放到源码编译,也编过了。

运行时,eclipse的效果如图:


android 源码编译的效果为:


神奇的事情竟然出现了,焦点框的阴影居然跑到文字上去了!!!我勒个去。

这里图片(更多)、文字(游戏),焦点框,都是用canvas画出来的。


分析

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

  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~

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


易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!