alibaba / alibaba/AndFix

NoClassDefFoundError,再Patch之后,会在原本的类后添加了_CF后缀,然后就找不到了。

Open
#81 10 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

## 异常的打印信息如下:

``` java
java.lang.NoClassDefFoundError: Failed resolution of: Lcom/jingcai/apps/demo/andfix/Calculate_CF;
at com.jingcai.apps.demo.andfix.MainActivity_CF.process(MainActivity.java:23)
at com.jingcai.apps.demo.andfix.MainActivity.onClick(MainActivity.java:42)
at android.view.View.performClick(View.java:4787)
at android.view.View$PerformClick.run(View.java:19880)
at android.os.Handler.handleCallback(Handler.java:739)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:139)
at android.app.ActivityThread.main(ActivityThread.java:5259)
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:950)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:745)
Caused by: java.lang.ClassNotFoundException: Didn't find class "com.jingcai.apps.demo.andfix.Calculate_CF" on path: DexPathList[[zip file "/data/app/com.jingcai.apps.demo.andfix-1/base.apk"],nativeLibraryDirectories=[/data/app/com.jingcai.apps.demo.andfix-1/lib/arm, /vendor/lib, /system/lib]]
at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:56)
at java.lang.ClassLoader.loadClass(ClassLoader.java:511)
at java.lang.ClassLoader.loadClass(ClassLoader.java:469)
at com.jingcai.apps.demo.andfix.MainActivity_CF.process(MainActivity.java:23) 
at com.jingcai.apps.demo.andfix.MainActivity.onClick(MainActivity.java:42) 
at android.view.View.performClick(View.java:4787) 
at android.view.View$PerformClick.run(View.java:19880) 
at android.os.Handler.handleCallback(Handler.java:739) 
at android.os.Handler.dispatchMessage(Handler.java:95) 
at android.os.Looper.loop(Looper.java:139) 
at android.app.ActivityThread.main(ActivityThread.java:5259) 
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:950) 
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:745) 
Suppressed: java.lang.ClassNotFoundException: com.jingcai.apps.demo.andfix.Calculate_CF
at java.lang.Class.classForName(Native Method)
at java.lang.BootClassLoader.findClass(ClassLoader.java:781)
at java.lang.BootClassLoader.loadClass(ClassLoader.java:841)
at java.lang.ClassLoader.loadClass(ClassLoader.java:504)
... 13 more
Caused by: java.lang.NoClassDefFoundError: Class not found using the boot class loader; no stack available
```
## Calculate类

``` java
public class Calculate {
public static int add(int x,int y){
return x+y;
}

public static int multi(int x, int y){
return x * y;
}
}
```
## MainActivity

``` java
public class MainActivity extends AppCompatActivity implements View.OnClickListener {

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
findViewById(R.id.btn_process).setOnClickListener(this);
findViewById(R.id.btn_detect).setOnClickListener(this);
findViewById(R.id.btn_update).setOnClickListener(this);
}

public void process() {
Toast.makeText(MainActivity.this, "result:" + Calculate.multi(3, 3), Toast.LENGTH_SHORT).show();
}

public void updatePatch() {
UpdateManager.getInstance().addPatch(Environment.getExternalStorageDirectory() + "/out.apatch");
}

public void detectFile() {
File file = new File(Environment.getExternalStorageDirectory() + "/out.apatch");
Toast.makeText(MainActivity.this, "file exists:" + file.exists(), Toast.LENGTH_SHORT).show();
}

@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.btn_detect:
detectFile();
break;
case R.id.btn_process:
process();
break;
case R.id.btn_update:
updatePatch();
break;

}
}
}
```
## UpdateManager

``` java
public class UpdateManager {

private static final String TAG = UpdateManager.class.getSimpleName();
private static UpdateManager mInstance;
private PatchManager mPatchManager;

private UpdateManager(){}

public static UpdateManager getInstance(){
if(mInstance == null){
synchronized (UpdateManager.class){
if(mInstance == null){
mInstance = new UpdateManager();
}
}
}
return mInstance;
}

public void init(Context context,String appVersion){
mPatchManager = new PatchManager(context);
mPatchManager.init(appVersion);
Log.d(TAG, "patch manager init,version:" + appVersion);
mPatchManager.loadPatch();
Log.d(TAG, "patch loaded");
}

public void addPatch(String path){
// add patch at runtime
try {
mPatchManager.addPatch(path);
Log.d(TAG, "apatch:" + path + " added.");
} catch (IOException e) {
Log.e(TAG, "", e);
}
}
}
```

最后一句:

> Caused by: java.lang.NoClassDefFoundError: Class not found using the boot class loader; no stack available

会是造成异常的原因吗,求解。

Contributor guide

No contributing guide indexed for this repository

Research direction

Start by tracing the shown MainActivity.process call through Calculate.multi and the UpdateManager.addPatch path into PatchManager.loadPatch and addPatch. Reproduce the NoClassDefFoundError with the provided Calculate, MainActivity, and UpdateManager examples, then inspect the generated _CF class references and class-loading logs. Done means the patched app resolves the referenced class without the Calculate_CF failure.

Written by the indexing model from the issue text.

Assessment

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

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.