通常来讲,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~
提醒:各位同仁遇到相似的问题的时候,千万当心这个...