Android Studio添加framework.jar编译

转载请注明链接

因为工作性质的需要,经常需要对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')
   }
}
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值