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改一下minSdkVersion
为25
然后这个图标马上就变绿了。
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来请求呢?
安卓是真的麻烦,!!