alibaba / alibaba/AndFix

AndFix在patch的方法中调用patch的方法出错。

Open
#58 4 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

将Demo中的MainActivity改为如下:
public class MainActivity extends Activity {
private static final String TAG = "euler";
private TextView tv;

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
tv = (TextView) findViewById(R.id.textView1);
TestPatch t = new TestPatch();
tv.setText(t.getStr("patch before"));
}

@Override
protected void onDestroy() {
super.onDestroy();
android.os.Process.killProcess(android.os.Process.myPid());
}
}
TestPatch类定义为:
public class TestPatch {
public String getStr(String s) {
// s = "patch after";
return s + " string";
}
}
以上设置时,patch成功。
当Mainactivity改为:
public class MainActivity extends Activity {
private static final String TAG = "euler";
private TextView tv;

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
tv = (TextView) findViewById(R.id.textView1);
TestPatch t = new TestPatch();
tv.setText(t.getStr("patch before"));
t.getStr1(null);
}

@Override
protected void onDestroy() {
super.onDestroy();
android.os.Process.killProcess(android.os.Process.myPid());
}
}
TestPatch类改为:
public class TestPatch {
public String getStr(String s) {
// s = "patch after";
return s + " string";
}

public String getStr1(String s) {
return null;
}
}
以上配置时,patch失败,我尝试了4.0.4,4.2.2以及5.1的系统,均以失败告终,附上4.0.4patch失败时的log:
10-20 11:12:21.823: D/dalvikvm(27106): Trying to load lib /data/data/com.euler.andfix/lib/libandfix.so 0x40d32318
10-20 11:12:21.823: D/dalvikvm(27106): Added shared lib /data/data/com.euler.andfix/lib/libandfix.so 0x40d32318
10-20 11:12:21.823: D/AndFix(27106): vm is: dalvik , apilevel is: 15
10-20 11:12:21.823: D/AndFix(27106): _Z24dvmComputeMethodArgsSizePK6Method = 0x40872881
10-20 11:12:21.823: D/AndFix(27106): _Z13dvmCallMethodP6ThreadPK6MethodP6ObjectP6JValuez = 0x4088b905
10-20 11:12:21.823: D/AndFix(27106): _Z25dexProtoGetParameterCountPK8DexProto = 0x408ad631
10-20 11:12:21.823: D/AndFix(27106): dvmAllocArrayByClass = 0x40893661
10-20 11:12:21.823: D/AndFix(27106): _Z15dvmBoxPrimitive6JValueP11ClassObject = 0x40899cc5
10-20 11:12:21.823: D/AndFix(27106): _Z21dvmFindPrimitiveClassc = 0x4089641d
10-20 11:12:21.823: D/AndFix(27106): dvmReleaseTrackedAlloc = 0x4087f1e9
10-20 11:12:21.823: D/AndFix(27106): _Z17dvmCheckExceptionP6Thread = 0x40872209
10-20 11:12:21.823: D/AndFix(27106): _Z15dvmGetExceptionP6Thread = 0x40872381
10-20 11:12:21.823: D/AndFix(27106): _Z17dvmFindArrayClassPKcP6Object = 0x40893219
10-20 11:12:21.823: D/AndFix(27106): _Z28dvmCreateReflectMethodObjectPK6Method = 0x40899881
10-20 11:12:21.823: D/AndFix(27106): _Z21dvmGetBoxedReturnTypePK6Method = 0x40899b85
10-20 11:12:21.823: D/AndFix(27106): _Z17dvmUnboxPrimitiveP6ObjectP11ClassObjectP6JValue = 0x40899e31
10-20 11:12:21.823: D/AndFix(27106): _Z20dvmDecodeIndirectRefP6ThreadP8_jobject = 0x40874531
10-20 11:12:21.823: D/AndFix(27106): _Z13dvmThreadSelfv = 0x4087d691
10-20 11:12:22.053: D/euler(27106): inited.
10-20 11:12:22.053: D/euler(27106): apatch loaded.
10-20 11:12:22.103: D/dalvikvm(27106): GC_CONCURRENT freed 546K, 73% free 1058K/3843K, paused 1ms+1ms
10-20 11:12:22.113: D/SecurityChecker(27106): mDebuggable = true
10-20 11:12:22.113: D/dalvikvm(27106): DexOpt: --- BEGIN 'out.apatch' (bootstrap=0) ---
10-20 11:12:22.253: D/dalvikvm(27106): DexOpt: --- END 'out.apatch' (success) ---
10-20 11:12:22.253: D/dalvikvm(27106): DEX prep '/data/data/com.euler.andfix/files/apatch/out.apatch': unzip in 0ms, rewrite 138ms
10-20 11:12:22.323: D/AndFix(27106): modify com.euler.andfix.MainActivity.TAG flag:
10-20 11:12:22.323: D/AndFix(27106): dalvik_setFieldFlag: 25
10-20 11:12:22.323: D/AndFix(27106): modify com.euler.andfix.MainActivity.tv flag:
10-20 11:12:22.323: D/AndFix(27106): dalvik_setFieldFlag: 1
10-20 11:12:22.323: D/AndFix(27106): dalvikMethod: onCreate
10-20 11:12:22.323: D/AndFix(27106): modify com.euler.andfix.MainActivity_CF.TAG flag:
10-20 11:12:22.323: D/AndFix(27106): dalvik_setFieldFlag: 25
10-20 11:12:22.323: D/AndFix(27106): modify com.euler.andfix.MainActivity_CF.tv flag:
10-20 11:12:22.323: D/AndFix(27106): dalvik_setFieldFlag: 1
10-20 11:12:22.323: D/AndFix(27106): dalvikMethod: getStr
10-20 11:12:22.323: D/euler(27106): apatch:/mnt/sdcard/out.apatch added.
10-20 11:12:22.333: E/PhonePolicy(27106): Could not preload class for phone policy: com.android.internal.policy.impl.PhoneWindow$ContextMenuCallback
10-20 11:12:22.353: D/AndFix(27106): dalvik_dispatcher source method: onCreate VL
10-20 11:12:22.353: D/AndFix(27106): dalvik_dispatcher target method: onCreate VL
10-20 11:12:22.353: D/AndFix(27106): dalvik_dispatcher start call->
10-20 11:12:22.353: D/AndFix(27106): boxMethodArgs object: index = 0
10-20 11:12:22.353: D/zhw1(27106): ***(zteConfig.getVersionType() == zteConfig.NORMAL_VER) || (zteConfig.getVersionType() == zteConfig.CMCC_VER)
10-20 11:12:22.403: D/TextLayoutCache(27106): Using debug level: 0 - Debug Enabled: 0
10-20 11:12:22.443: I/dalvikvm-heap(27106): Grow heap (frag case) to 5.668MB for 1048592-byte allocation
10-20 11:12:22.453: D/AndFix(27106): dalvik_dispatcher source method: getStr LL
10-20 11:12:22.453: D/AndFix(27106): dalvik_dispatcher target method: getStr LL
10-20 11:12:22.453: D/AndFix(27106): dalvik_dispatcher start call->
10-20 11:12:22.453: D/AndFix(27106): boxMethodArgs object: index = 0
10-20 11:12:22.453: A/libc(27106): Fatal signal 11 (SIGSEGV) at 0x0000000a (code=1)
10-20 11:12:23.453: W/dalvikvm(27106): threadid=2: spin on suspend #1 threadid=1 (pcf=0)
10-20 11:12:24.203: W/dalvikvm(27106): threadid=2: spin on suspend #2 threadid=1 (pcf=0)
10-20 11:12:24.203: I/dalvikvm(27106): "GC" daemon prio=5 tid=2 RUNNABLE
10-20 11:12:24.203: I/dalvikvm(27106): | group="system" sCount=0 dsCount=0 obj=0x40cf5440 self=0x7d7e50
10-20 11:12:24.203: I/dalvikvm(27106): | sysTid=27109 nice=0 sched=0/0 cgrp=default handle=8234816
10-20 11:12:24.203: I/dalvikvm(27106): | schedstat=( 32571000 11702000 44 ) utm=3 stm=0 core=0
10-20 11:12:24.203: I/dalvikvm(27106): at dalvik.system.NativeStart.run(Native Method)
10-20 11:12:24.203: I/dalvikvm(27106): "main" prio=5 tid=1 RUNNABLE
10-20 11:12:24.203: I/dalvikvm(27106): | group="main" sCount=1 dsCount=0 obj=0x40a76460 self=0x719858
10-20 11:12:24.203: I/dalvikvm(27106): | sysTid=27106 nice=0 sched=0/0 cgrp=default handle=1074635912
10-20 11:12:24.203: I/dalvikvm(27106): | schedstat=( 491131000 162060000 217 ) utm=43 stm=6 core=3
10-20 11:12:24.213: I/dalvikvm(27106): at com.euler.andfix.MainActivity_CF.onCreate(MainActivity.java:~42)
10-20 11:12:24.213: I/dalvikvm(27106): at java.lang.reflect.Method.invokeNative(Native Method)
10-20 11:12:24.213: I/dalvikvm(27106): at java.lang.reflect.Method.invoke(Method.java:511)
10-20 11:12:24.213: I/dalvikvm(27106): at com.euler.andfix.MainActivity.onCreate(Native Method)
10-20 11:12:24.213: I/dalvikvm(27106): at android.app.Activity.performCreate(Activity.java:4465)
10-20 11:12:24.213: I/dalvikvm(27106): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1049)
10-20 11:12:24.213: I/dalvikvm(27106): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1920)
10-20 11:12:24.213: I/dalvikvm(27106): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1981)
10-20 11:12:24.213: I/dalvikvm(27106): at android.app.ActivityThread.access$600(ActivityThread.java:123)
10-20 11:12:24.213: I/dalvikvm(27106): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1147)
10-20 11:12:24.213: I/dalvikvm(27106): at android.os.Handler.dispatchMessage(Handler.java:99)
10-20 11:12:24.213: I/dalvikvm(27106): at android.os.Looper.loop(Looper.java:137)
10-20 11:12:24.213: I/dalvikvm(27106): at android.app.ActivityThread.main(ActivityThread.java:4424)
10-20 11:12:24.213: I/dalvikvm(27106): at java.lang.reflect.Method.invokeNative(Native Method)
10-20 11:12:24.213: I/dalvikvm(27106): at java.lang.reflect.Method.invoke(Method.java:511)
10-20 11:12:24.213: I/dalvikvm(27106): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
10-20 11:12:24.213: I/dalvikvm(27106): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
10-20 11:12:24.213: I/dalvikvm(27106): at dalvik.system.NativeStart.main(Native Method)

Contributor guide

No contributing guide indexed for this repository

Research direction

Reproduce the two MainActivity and TestPatch variants from the report on the listed Android versions, then trace the dalvik_dispatcher path for getStr through libandfix.so. Compare the working patch with the getStr1 case and use the provided SIGSEGV log as the failure point; done means the patch loads and the added method no longer crashes.

Written by the indexing model from the issue text.

Assessment

Tech stack
android, cpp, java
Domain
mobile-dev
Issue type
Bug
Difficulty
4/5
Estimated time
3-5 days
Activity status
Stale
Clarity
Mostly clear
Newbie friendliness
28/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.