转眼好几个月没有写文章了,最近一直在忙于开发移动测试平台。由于移动测试平台涉及到手机集群,前端页面,后端接口相关功能的开发,同时又需要处理Android和iOS不同系统的差异,不同机型的各种问题。开发过程几乎是一步一个坑,好在我有锲而不舍的精神,兵来将挡,水来土掩,慢慢地有点儿规模了。后续我会陆续把遇到的问题和相关的解决方案总结一下,作为记录,也希望能帮助到有用的人。
今天的问题是,我在Mac下开发了云测平台,其中的一个功能点是通过aapt来获取安卓应用apk的信息,但是发布上到docker上后,发现功能无法使用。在docker上下载部署android的SDK,而我们只用到一个aapt命令,显然是没有必要的。于是下载了linux的aapt,运行时依然提示:Libc++.so No such file or directory?
在网上查了好多方案,都无法执行。没有办法,我们也不能放弃不是?于是去谷歌上搜索了一下,最终还是找到了解决方案。
- 下载最新的android build-tools linux的包,我下载的是Android9的包,百度上好像不容易找到相应的下载地址,还是从谷歌上去下载吧。从里面找到appt,上传到linux指定的目录下,如:/opt/runcmd/下;
- 从build-tools包下的libs文件夹中找到libc++.so文件,上传到linux下的和aapt相同的目录下。
- 执行命令的时候 ,按如下方式执行:
$LD_LIBRARY_PATH=/opt/runcmd/ /opt/runcmd/aapt
指定了命令执行的时候去查找的lib的路径,命令就不会报错了,当然你也可以根据自己的需要,添加相关的参数。
如:查看一下应用的信息
$LD_LIBRARY_PATH=/opt/runcmd/ /opt/runcmd/aapt dump badging ./zhongbao.apk
- 如果你想从java中执行相关的命令,可以按如下方式执行:
-
try{ String[] getinfocmd ={"/bin/sh","-c","LD_LIBRARY_PATH=/opt/runcmd/ /opt/runcmd/aapt dump badging "+apkpath}; process =Runtime.getRuntime().exec(getinfocmd); BufferedReader input = new BufferedReader(new InputStreamReader(process.getInputStream())); String line = ""; while ((line = input.readLine()) != null) { System.out.println(line); } input.close(); } catch (Exception e){ e.printStackTrace(); }
然后读取命令执行结果即可。
由此可见,我们在开发测试平台的时候 ,如果用到一些安卓的命令的时候 ,可以直接将命令拷到linux机器上,而无需要将所有的SDK部署到服务器上。遇到了相应的问题,直接去谷歌上查询就行了。只要你有决心,方法总比问题多。