alibaba / alibaba/AndFix

代码中有jacoco单元测试覆盖率检查是,无法使用

Open
#34 0 comments 0 reactions 0 assignees View on GitHub
Dominant language
C++
Stars
7k
Forks
1.6k
PR merge metrics
No merged PRs in 30d

Description

Crash日志如下:提示Final field cannot be written

``` java
java.lang.IllegalAccessError: Final field 'com.myapp.Myapp.$jacocoData' cannot be written to by method 'boolean[] com.myapp.Myapp_CF.$jacocoInit()' (declaration of 'java.lang.reflect.ArtMethod' appears in /system/framework/core-libart.jar)
at com.myapp.Myapp_CF.$jacocoInit(Myapp.java)
at com.myapp.Myapp.(Myapp.java)
at java.lang.reflect.Constructor.newInstance(Native Method)
at java.lang.Class.newInstance(Class.java:1572)
at android.app.Instrumentation.newActivity(Instrumentation.java:1065)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2199)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2360)
at android.app.ActivityThread.access$800(ActivityThread.java:144)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1278)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:135)
at android.app.ActivityThread.main(ActivityThread.java:5221)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:899)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:694)
```

生成的patch的smali文件如下:

``` smali
# static fields
.field private static final transient synthetic $jacocoData:[Z = null
```

``` smali
# direct methods
.method private static synthetic $jacocoInit()[Z
.locals 4
.annotation runtime Lcom/alipay/euler/andfix/annotation/MethodReplace;
clazz = "com.myapp.Myapp"
method = "$jacocoInit"
.end annotation

sget-object v0, Lcom/myapp/Myapp;->$jacocoData:[Z

if-nez v0, :cond_0

const-wide v0, 0x28846709982acfa1L

const-string/jumbo v2, "com/myapp/Myapp"

const/16 v3, 0xf7

invoke-static {v0, v1, v2, v3}, Lorg/jacoco/agent/rt/internal_773e439/Offline;->getProbes(JLjava/lang/String;I)[Z

move-result-object v0

sput-object v0, Lcom/myapp/Myapp;->$jacocoData:[Z

:cond_0
return-object v0
.end method
```

是否有解决方案,是否只针对jacoco,如果自己写类似的静态final对象引用某个静态方法,是否也不能支持?

Contributor guide

No contributing guide indexed for this repository

Research direction

Start with the generated Myapp.smali and the $jacocoInit method annotated with AndFix MethodReplace; trace the final $jacocoData field access and Offline->getProbes call. Reproduce the crash from the reported stack trace, then determine whether AndFix's method replacement supports this JaCoCo-generated pattern and whether equivalent static final references behave the same. Done means a verified compatibility fix or a documented limitation with a regression check.

Written by the indexing model from the issue text.

Assessment

Tech stack
android, java
Domain
mobile-dev
Issue type
Bug
Difficulty
4/5
Estimated time
3-5 days
Activity status
Stale
Clarity
Needs clarification
Newbie friendliness
25/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.