旧项目生成的.jar引入新项目后崩溃,报NoSuchFieldError求助
问题排查:引入旧项目JAR后应用崩溃
我从旧项目生成了一个.jar文件,引入新项目后应用直接崩溃。新项目只有一个布局,和JAR里的布局名称不同,两个项目包名也不一样,实在找不到问题所在,麻烦帮忙排查。
崩溃日志
E/AndroidRuntime: FATAL EXCEPTION: main Process: com.example.clientapp, PID: 2837 java.lang.NoSuchFieldError: No static field abc_text_select_handle_left_mtrl of type I in class Landroidx/appcompat/R$drawable; or its superclasses (declaration of 'androidx.appcompat.R$drawable' appears in /data/app/~~m2UIxY8m41H6F1206VId5A==/com.example.clientapp-uQDl-7yLeT3HZC91kbld4Q==/base.apk) at androidx.appcompat.widget.AppCompatDrawableManager$1.<init>(AppCompatDrawableManager.java:93) at androidx.appcompat.widget.AppCompatDrawableManager.preload(AppCompatDrawableManager.java:62) at androidx.appcompat.app.AppCompatDelegateImpl.<init>(AppCompatDelegateImpl.java:342) at androidx.appcompat.app.AppCompatDelegateImpl.<init>(AppCompatDelegateImpl.java:292) at androidx.appcompat.app.AppCompatDelegate.create(AppCompatDelegate.java:230) at androidx.appcompat.app.AppCompatActivity.getDelegate(AppCompatActivity.java:586) at androidx.appcompat.app.AppCompatActivity.attachBaseContext(AppCompatActivity.java:139) at android.app.Activity.attach(Activity.java:7939) at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3622) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3832) at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:103) at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135) at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2247) at android.os.Handler.dispatchMessage(Handler.java:106) at android.os.Looper.loopOnce(Looper.java:201) at android.os.Looper.loop(Looper.java:288) at android.app.ActivityThread.main(ActivityThread.java:7886) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:568) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1045)
新项目build.gradle内容
plugins { id 'com.android.application' id 'org.jetbrains.kotlin.android' } android { namespace 'com.example.clientapp' compileSdk 33 defaultConfig { applicationId "com.example.clientapp" minSdk 24 targetSdk 33 versionCode 1 versionName "1.0" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" } buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' } } compileOptions { sourceCompatibility JavaVersion.VERSION_1_8 targetCompatibility JavaVersion.VERSION_1_8 } kotlinOptions { jvmTarget = '1.8' } } dependencies { implementation 'androidx.core:core-ktx:1.7.0' implementation 'androidx.appcompat:appcompat:1.2.0' implementation 'com.google.android.material:material:1.9.0' implementation 'androidx.constraintlayout:constraintlayout:2.1.4' implementation files('libs/BpLibrary.jar') testImplementation 'junit:junit:4.13.2' androidTestImplementation 'androidx.test.ext:junit:1.1.5' androidTestImplementation 'androidx.test.espresso:espresso-core:3.5.1' }
问题原因与解决方法
核心原因
崩溃是AppCompat版本不兼容导致的:你新项目使用的androidx.appcompat:appcompat:1.2.0版本较低,而旧项目生成的JAR可能依赖了不同版本的AppCompat,导致资源字段abc_text_select_handle_left_mtrl无法找到——该资源在AppCompat的部分版本中被移除或重命名,版本不匹配时就会触发NoSuchFieldError。
解决步骤
统一AppCompat版本
将新项目的AppCompat依赖升级到与旧项目一致的版本,或直接使用最新稳定版,比如:implementation 'androidx.appcompat:appcompat:1.6.1'若不确定旧项目版本,优先尝试最新稳定版,最大程度避免版本冲突。
改用AAR格式替代JAR
JAR无法妥善处理Android资源依赖,建议将旧项目改为Android Library模块,生成AAR文件引入新项目。AAR会自动管理资源和依赖,避免资源冲突问题。清理并重构项目
调整依赖后,执行以下操作确保缓存清理、依赖生效:- 点击Android Studio菜单栏的
Build > Clean Project - 再执行
Build > Rebuild Project
- 点击Android Studio菜单栏的
排查依赖树
若问题仍存在,用Gradle命令查看完整依赖树,确认是否有其他冲突:./gradlew app:dependencies搜索
appcompat相关条目,确保所有模块使用同一版本。
内容的提问来源于stack exchange,提问作者Karthick G
相关产品推荐
相关产品推荐

