Android Studio中解决framwork.jar和SDK api冲突的方法

本文详细指导如何在Android Studio中处理框架.jar与SDK API的冲突,涉及添加额外jar包、调整引用优先级及编译配置,确保项目编译成功并避免运行时错误。

Android Studio中解决framwork.jar和SDK api冲突的方法
Android开发中,系统工程师可能需要在系统层添加接口,这些新加的接口在Android Studio应用调用时常常会因找不到接口而导致编译不通过。现以SetupWizard_oem应用为例来说明解决方法。一、添加相应的Jar包到编译环境。
out\target\common\obj\JAVA_LIBRARIES\framework_intermediates\classes-full-debug.jar取出该jar放置到项目中,配置build.gradle中以compileOnly方式(只在编译时引用,不打包到应用中)编译。

compileOnly files('libs/framework.jar')

二、配置jar包引用的优先级。
经过第一步,可以消除一部分标红包报错信息,但可能还会报部分方法找不到。原因是:Android Studio会默认优先引用Android SDK中的类,这样该类中新增的接口将找不到,故现需调整framework.jar的优先级高于Android SDK的。修改app.iml(项目名.iml文件),将framework的调整到Android SDK之前。

   <orderEntry type="library" name="Gradle: __local_aars__:*********\framework.jar:unspecified@jar" level="project" />
    <orderEntry type="jdk" jdkName="Android API 30 Platform" jdkType="Android SDK" />

三、配置jar包编译的优先级。
经过第二步,代码中所有标红的报错可消除,当真正启动Build APK编译时可能又会报错找不到对应方法,此时应该配置jar的编译优先级,在Project的build.gradle中做如下配置,此时可顺利编译出APK。

allprojects {
    repositories {
        google()
        jcenter()
        
    }
    gradle.projectsEvaluated {
        tasks.withType(JavaCompile) {
            options.compilerArgs.add('-Xbootclasspath/p:app/libs/framework.jar')
        }
    }
}

Android Studio引入framework.jar有以下几种方法: #### 常规复制添加法 在目录下找到对应版本的framework.jar文件,不同Android版本的生成路径不同: - Android N/O(78):`out/target/common/obj/JAVA_LIBRARIES/framework_intermediates/classes.jar` - Android P/Q(910):`out/soong/.intermediates/frameworks/base/framework/android_common/combined/framework.jar` - Android R(11以上):`out/soong/.intermediates/frameworks/base/framework-minus-apex/android_common/combined/framework-minus-apex.jar` 将对应的文件改名得到framework.jar,把framework.jar复制到Android Studio项目目录的libs文件夹下;鼠标点击右键,选择Add As Library,接着选择framework.jar所在的module,即可在module的build.gradle自动引入framework.jar [^2][^4]。 #### 在Gradle中配置引用 可以在module下配置当前module或者根目录下配置整个工程的编译时的添加系统库的引用: ```groovy // module下的配置 gradle.projectsEvaluated { tasks.withType(JavaCompile) { options.compilerArgs.add("-Xbootclasspath/p:$rootProject.rootDir/syslibs/framework.jar") } } // 根目录下的配置 allprojects { gradle.projectsEvaluated { tasks.withType(JavaCompile) { options.compilerArgs.add("-Xbootclasspath/p:$rootProject.rootDir/syslibs/framework.jar") } } } ``` 这种方式适用于修改了系统framework,需要调用新增或隐藏的接口或者常量时,避免默认的sdk找不到方法编译报错的情况 [^3]。 #### 单独模块引用配置方法 添加测试代码示例如下: ```java import android.os.Bundle; import android.util.Log; import android.view.WindowManager; import android.widget.AdaptiveIconDrawable; import androidx.appcompat.app.AppCompatActivity; public class MainActivity extends AppCompatActivity { private static final String TAG = MainActivity.class.getSimpleName(); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // 自编译framework.jar测试代码 float aaa = AdaptiveIconDrawable.MASK_SIZE; int bbb = WindowManager.LayoutParams.TYPE_NAVIGATION_BAR; Log.e(TAG, "onCreate: " + aaa + " " + bbb); // onCreate: 100.0 2019 } } ``` 同时还需要配置生成*.iml文件 [^5]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值