NoClassDefFoundError,再Patch之后,会在原本的类后添加了_CF后缀,然后就找不到了。
- 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