[英]'Source code does not match byte code' Android Studio
我正在 Android Studio 4.01 版中使用 FFmpeg 库开发 Android 视频编辑应用程序。 当我尝试调试时,调试器进入反编译器并在反编译代码的多个步骤中闪烁“源代码与字节码不匹配”。 调试器似乎也半随机地绕过反编译的代码,例如:这里,其中 logSlowDispatch 为 false 但调试器无论如何都会在不检查的情况下进入 if 语句的内容并闪烁“源代码与字节码不匹配”。 我看过很多关于这个问题的帖子,并尝试了许多建议的解决方案,从无效缓存/重启到全新安装的 Android Studio 都无济于事。 我读过冗余或过时的 gradle 依赖项可能与此有关,但删除其中一些依赖项并没有帮助:
apply plugin: 'com.android.application'
android {
compileSdkVersion 29
defaultConfig {
applicationId "com.example.capstoneapplication"
minSdkVersion 21
targetSdkVersion 29
versionCode 1
versionName "1.0"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
ndkVersion "21.3.6528147"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
}
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation 'com.android.support.constraint:constraint-layout:2.0.0'
testImplementation 'junit:junit:4.12'
androidTestImplementation 'com.android.support.test:runner:1.0.2'
androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'
implementation 'com.writingminds:FFmpegAndroid:0.3.2'
implementation 'org.florescu.android.rangeseekbar:rangeseekbar-library:0.3.0'
implementation 'com.intuit.sdp:sdp-android:1.0.6'
}
我的代码似乎运行正常,并且在这些跳转到反编译器之间的所需视频上执行 ffmpeg 命令,但视频没有保存。 以下是可能导致此问题的 java 类中的一个片段:
@Override
public boolean onOptionsItemSelected(MenuItem menuItem){
if(menuItem.getItemId()==R.id.trim){
final AlertDialog.Builder alertDialog = new AlertDialog.Builder(com.example.capstoneapplication.VideoTrimmer.this);
LinearLayout linLay = new LinearLayout(com.example.capstoneapplication.VideoTrimmer.this);
linLay.setOrientation(LinearLayout.VERTICAL);
LinearLayout.LayoutParams layPar = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT);
layPar.setMargins(50, 0, 50, 100 );
final EditText input = new EditText(com.example.capstoneapplication.VideoTrimmer.this);
input.setLayoutParams(layPar);
input.setGravity(Gravity.TOP|Gravity.START);
input.setInputType(InputType.TYPE_TEXT_FLAG_CAP_SENTENCES);
linLay.addView(input,layPar);
alertDialog.setMessage("Enter Video Name");
alertDialog.setTitle("Change Video Name");
alertDialog.setView(linLay);
alertDialog.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
}
});
alertDialog.setPositiveButton("Submit", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
fileName = input.getText().toString();
try {
snipVideo(videoDurBar.getAbsoluteMinValue().intValue(), videoDurBar.getSelectedMaxValue().intValue(), fileName);
} catch ( FFmpegNotSupportedException e) {
e.printStackTrace();
}
}
});
alertDialog.show();
}
return super.onOptionsItemSelected(menuItem);
}
private void snipVideo( int min, int max, String fileName) throws FFmpegNotSupportedException {
File destFolder = new File("storage/emulated/0" + "/EditingApeSnippedVideos");
if(!destFolder.exists()){
destFolder.mkdir();
}
String fileExtension = ".mp4";
destination = new File(destFolder, fileName + fileExtension);
inputVideoPath = getPathFromUri(getApplicationContext(),uri);
command = new String[]{"-ss", "" + min/1000 , "-y", "-i", inputVideoPath, "-t", ""+ (max-min)/1000 ,"-vcodec", "mpeg4", "-b:v","2097152","-b:a", "48000", "-ac","2","-ar","22050", destination.getAbsolutePath()};
//testing command
//command = new String []{"-y", "-i", inputVideoPath, "-ss", "00:00:02" , "-to", "00:00:03", "-c", "copy", destination.getAbsolutePath()};
final FFmpeg ff = FFmpeg.getInstance(this);
ff.loadBinary(new FFmpegLoadBinaryResponseHandler() {
@Override
public void onStart() {
Log.i("VideoTrimmer","onStart");
}
@Override
public void onFinish() {
Log.i("VideoTrimmer","onFinish");
}
@Override
public void onFailure() {
Log.i("VideoTrimmer","onFailure");
}
@Override
public void onSuccess() {
Log.i("VideoTrimmer","Success");
try {
ff.execute(command, new ExecuteBinaryResponseHandler());
} catch (FFmpegCommandAlreadyRunningException e) {
Log.i("VideoTrimmer","FFmpegAlreadyRunning Exception");
}
}
});
}
有没有人找到这个调试器问题的解决方案?
我不熟悉 Android,但在 IntelliJ 中也可以看到这种行为。 调试器以某种方式指向旧的编译文件而不是新文件。
在 java 的情况下,您始终可以删除目标文件夹并重新构建。 看看你在某处(目标文件夹)是否有任何类似的编译文件,你可以删除并重新构建。
完成后,单击“文件”->“使缓存无效/重新启动”
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.