您的位置:首页 > 移动开发 > Android开发

Android Studio添加framework.jar编译

2017-10-12 23:22 357 查看
创建Module

配置Dependency

配置依赖Order

配置编译Option

转载请注明链接

因为工作性质的需要,经常需要对framework添加api或是静态变量,然后基于修改后的framework代码进行App的开发工作,这样就不得不时刻更新SDK,以便App开发能够顺利进行,但是鉴于编译SDK然后加载使用比较复杂,时间成本较高,所以使用编译的framework.jar进行快速替代开发则不失为一种很好的策略。

在Eclipse的开发环境下,使用framework.jar替代SDK非常简单,仅仅需要引入外部jar,并将依赖顺序调整为framework.jar最优先,这样就可以快速生成APK,安装到编译的最新系统里进行测试。但是项目移植到Android Studio后发现优先使用framework.jar的方案失效,经过查找测试,确定了以下方案,保证jar的顺利导入及多Module共享配置。

开发环境为:Android Studio 2.3 + Ubuntu14.4

具体的导入jar包步骤如下:

1. 创建Module:

在project下新建Module,选择Import .jar/.aar package,生成一个包含framework.jar的Module,这样可以保证project下的所有Modules都可以使用此依赖。

当然也可以不创建新的Module,在需要依赖framework.jar的Module下新建libs文件夹,将framework.jar拷贝至libs文件夹下,然后依赖此jar包也可。这样就只有此Module可以依赖jar。

2. 配置Dependency:

进入Project Structure,在需要依赖framework.jar的Module上,添加Dependencies,选择Module Dependency,选择第1步建立的Module,注意Scope选择Provided,这样这个10M的framework.jar就不会编译到App中。将这个Dependency上移至顶部。

3. 配置依赖Order:

经过1、2步配置仍有SDK中找不到变量的错误,这是需要修改Module的.iml,更改依赖顺序:

<orderEntry type="module" module-name="framework" exported="" />


将其移动至

<orderEntry type="jdk" jdkName="Android API 26 Platform" jdkType="Android SDK" />


代码行前面,保存。

这时候执行sync,那些找不到的变量就不再报错,但是BuildAPK仍然会出错。

注意:这个iml的顺序每次在sync之后都会变回默认的,sync完记得再把对framework的Dependency移到SDK前面。这个iml文件依赖顺序仅仅是影响静态编译检查,不影响Build APK,也就是说下面的编译option配置正确,纵使有错误提示也不影响APK的生成。

4. 配置编译Option:

尽快前三步已经可以消除编译错误,但是在真正BuildAPK时仍会报错,这样就需要添加编译参数,在生成APK时优先使用framework.jar,这个配置可以分为Project级别的配置及Module级别的配置:

Project级别的配置:

在Project的build.gradle中添加:

allprojects {
repositories {
jcenter()
}
gradle.projectsEvaluated {
tasks.withType(JavaCompile) {
options.compilerArgs.add('-Xbootclasspath/p://home//XXX//tools//lib//
framework_intermediates//framework.jar')
}
}


这样所有的Module都会将采用framework.jar编译生成APK。上面添加的路径:

//home//XXX//tools//lib//framework_intermediates//framework.jar

为添加framework.jar全路径。注意路径采用//分隔符,对于Ubuntu系统为//,Windows系统应该使用\

Module级别的配置:

与Project级别雷同,在Module的build.gradle中添加编译参数即可。

另外如果编译时还需要依赖其他的jar,如service.jar(该jar包时framework/base路径下的services目录编译产生,系统级服务的API或是变量会放在service.jar中),只需要 “;” 隔开,加上依赖的jar路径即可,如下所示:

gradle.projectsEvaluated {
tasks.withType(JavaCompile) {
options.compilerArgs.add('-  Xbootclasspath/p://home//XXX//tools//lib//
framework_intermediates//framework.jar; //home//XXX//tools//lib//
service_intermediates//service.jar')
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息