新的某一天,新的报错

TN的又报错。
终于准备写自己的项目,把idea上的java代码粘贴到Android上来,就是一个爬虫程序,准备把爬到的数据展现到Activity上。
1. 哐哐一顿粘,然后就报了cant resolve symbal的错误,就是找不到

import javax.script.Invocable;
import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;

这些类,如果百度搜cant resolve symbol的话是搜不出结果的。因为这是android studio和rt.jar这个jar包之间的恩怨。
我猜测,android会把java的rt.jar的方法用自己的sdk里的某个jar包的同名方法来替代:
在这里插入图片描述
有些方法是没有收录进去的,收录进去了的也有能使用的最低sdk版本的限制。所以同在一个jar包下的Path就可以找到,Invocable就找不到。然后在百度上经历了一阵混乱迷离的搜索之后我发现只要这样:
在这里插入图片描述
Android studio就会综合考虑这两个jar包。然后编译就没有什么问题了。


接着昨天说的地方
在这里插入图片描述
这里如果使用provided的话,编译的时候可以不报错,运行就不行了。
看了一篇博客懂了:implementation、api、compileOnly区别详解

provided是只在编译期引入,打包时不一起打包。


然后直接点击运行键,这里省略崩出来的一大堆错误,上网一查发现好家伙,gradle version 、gradle plunge version、android build tools这3个东西的版本还有依赖关系too。然后上网查一下依赖的关系,调整一下就可以了,直接在build.gradle里面修改在sync就可以直接下载了,感觉还挺快的,不知道是从哪里下的。


2.现在可以开始点击激动人心的运行键了,但是我怎么突然发现设备不见了,有错误不停在滚动:
在这里插入图片描述
诶,我设备呢?。。。
这里又是一个极坑的错误,如果你去百度上搜**Adb connection Error:远程主机强迫关闭了一个现有的连接。**,大部分都是叫你去看5037端口,看到几个pid之后再分别去看pid对应的进程名字,看是不是友军,如果不是就杀掉,然后总会发现不是,然后杀掉就完了。
但是我看5037端口的话,除了studio64.exe一直坚持运行之外,其他的pid总是不等我去查他们的进程名字就消失了,然后重查又蹦出新的进程。有人说查叫adb.exe的文件,我查了没发现什么问题:
在这里插入图片描述

然后有的进程会把studio64挤掉,然后他又顽强的连上来,再看着这些进程打架若干分钟后,终于稳定在只有两个固定进程的局面,一个是studio64.exe,一个是nox_adb.exe:
在这里插入图片描述
这时候解决找不到设备问题的契机就出现了,这个地方会从loading device字样变成一个红色有感叹号的手机图标:(我已经用后面的方法弄好了)
在这里插入图片描述
然后点击这里会看到一行min sdk version(26) > device version(25),差不多是这样的语句,然后好像有点懂了,到build.gradle改一下minSdkVersion25然后这个图标马上就变绿了。

3.然后连锁反应就出现了,我的get方法找不到了:
在这里插入图片描述
minSdkVersion就需要是26,不然在一些没到这个版本的手机上就无法使用这个方法。所以为了兼顾问题2就只能提升device sdk的版本了,随便上网一查:啦啦啦,然后就解决啦啦啦~( ̄︶ ̄)↗ 晚安,打工人

上面几行当我在放屁,那是提升adb的版本,device sdk的版本只和模拟器的Android版本有关。


上接问题1:
如果那两个jar包是provided形式给出的话,那么点击运行会build成功并报classnotfound的运行时错误,因为provided是不随着项目运行时一起编译的。
然后我们就改成一般的api或者implementation,
然后点击gradle sync没有报错
然后点击运行在build的时候就会有下面的错误:
在这里插入图片描述
这时候我们会发现
1.sync和build是有区别的
2.为什么minVersion为25的时候,Paths的get方法会报错而ScriptObjectMirror 类型的so对象的get方法却不会报错呢:
在这里插入图片描述
我猜是识别到了在Android studio的compileSdkVersion对应版本sdk的android.jar里有Paths的同名类所以会报错,而没有ScriptObjectMirror类所以会直接使用我自己的。
可是当我把compileSdkVersion从30调到了25按sync还是会报错误,按理说在25的sdk的android.jar里面是没有Paths的同名类的啊?他是怎么知道调这个方法所需要的最小sdk版本的呢?

然后在运行的build过程中,我们可以看到他是在解决file的dependencies,然后从jar包的角度出发告诉我们nashorn.jar在28版本的sdk才得到了收录(虽然我在30版本的android.jar里面没有看到对应的包),也许收录了一部分,但是ScriptObjectMirror 类型是肯定没有收录的,不然他的get方法就会和Paths的get方法一样报错了。


弄了好久还是和别人得出一样的结论,无法将rt.jar加入到安卓程序(除非我能把device sdk的版本升级到28也就是夜神模拟器的安卓系统要到版本8还是版本9。或者我能禁用烦人的Const-method-handle和MethodHandle.invock):
在这里插入图片描述

然后关于我的爬虫,用JsEngine类来加载js文件得到加密后的encText和encSecKey,然后把他们添加到post请求体里面去请求网易云官方接口得到json的计划就失败了。
然后直接访问另一个人的项目,由他代替我们伪造请求并返回json这条路,我用OkHttp和HttpUrlConnection都是请求超时,接下来可以再尝试一下,比如用jsoup来请求呢?

安卓是真的麻烦,!!

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值