使用adb安装遇到的一些坑
1、下载安装android SDK,可通过浏览器或者相关手机软件下载软件下载需要安装的apk安装文件,把apk文件放到android-sdk-windows\platform-tools下
2、可通过adb相关的命令来启动或者在Eclipse下启动虚拟机,或者通过USB与真机连接
3、使用cmd进入android-sdk-windows\platform-tools目录
4、输入 adb install xxx.apk 如果有开启多个虚拟机或者连接了真机,可使用adb devices显示当前android的机器和abd -s emulator 555XX install xxx.apk进行安装
5、在CMD提示SUCEESS后,可在android虚拟机可找到安装成功的应用
我在安装的时候就遇过以中文名称的apk,安装时报错了Segmentation fault, pm install /data,把apk的文件名改为英文名称,就成正常安装了
把apk安装文件放到进入android-sdk-windows\platform-tools目录,能防止在CMD上安装显示成功,但在虚拟器上未能看到已经安装
附:
下面为网上收集的相关资料:
apk安装常见出错解决方法:
1. 无法识别设备
adb kill-server
然后再adb start-server
2. Segmentation fault, pm install /data…
直接使用adb向模拟器中安装app时报这个错误。
原因很简单,使用豌豆荚下载下来的app很多是用中文命名的,改成英文名重新adb install. 至于为什么,我想设计adb的工程师们根本没有考虑中文支持吧。
3.Failure [INSTALL_PARSE_FAILED_NO_CERTIFICATES]
这个问题出现的背景要说明一下:下载了某app,往里面加了点东西,然后重新打包使用adb install安装。
这是由于Android应用程序的自签名机制导致的。
Android 系统不会安装运行任何一款未经数字签名的apk程序,无论是在模拟器上还是在实际的物理设备上。Android的开发工具(ADT插件和Ant)都可以协 助开发者给apk程序签名,它们都有两种模式:调试模式(debug mode)和发布模式(release mode)。
如果要正式发布 一个Android App,必须使用一个合适的私钥生成的数字证书来给程序签名 ,而不能使用adt插件 或者ant工具 生成的调试证书来发布。
签名的作用
1. 发送者的身份认证。由于开发商可能通过使用相同的 Package Name 来混淆替换已经安装的程序,以此保证签名不同的包不被替换
2. 保证信息传输的完整性。签名对于包中的每个文件进行处理,以此确保包中内容不被替换。
要解决这个错误,需要点专用工具,看雪上比较多,我就不再此贴出来了。
4.Failure [INSTALL_FAILED_UPDATE_INCOMPATIBLE]
在“卸载”app时,没有通过应用程序管理器卸载,而是直接通过adb删除了/data/app中的相应包。这中方式“卸载”是不彻底的,因为程序安装后还会在其他地方,比如/data/data中建立相关的目录和文件。
在设置-应用程序-管理应用程序里,找到要卸载的app,进行卸载。卸载后再次安装,就不会再出现这个错误了。
5. Failure [INSTALL_FAILED_DEXOPT]
在android4.0源码里面编译出来apk后,用adb install 安装时,报错[INSTALL_FAILED_DEXOPT]。
z:\ics-android\ics-src\out\target\product\generic\system\app>adb install NativeTimer.apk
28 KB/s (10166 bytes in 0.344s)
pkg: /data/local/tmp/NativeTimer.apk
Failure [INSTALL_FAILED_DEXOPT]
原来在system\app下面的apk是经过优化的,而dex文件不会打包到apk中,dex文件会被优化后,生成odex文件。
z:\ics-android\ics-src\out\target\product\generic\system\app\NativeTimer.apk
z:\ics-android\ics-src\out\target\product\generic\system\app\NativeTimer.odex
这样安装apk时,就会缺少dex文件,导致报错[INSTALL_FAILED_DEXOPT]。
解决办法:
找到未优化过的apk,即
z:\ics-android\ics-src\out\target\product\generic\obj\APPS\NativeTimer_intermediates>adb install package.apk.unaligned
70 KB/s (138806 bytes in 1.912s)
pkg: /data/local/tmp/package.apk.unaligned
SuccessFailure
6.adb push out of memory
最近做个东西,要修/system/etc/下的hosts文件,目的是通过域名访问内网的服务器,进行手机与内网的测试,这里要说的是如果是连接外网,并不需要如此做法,正因为我们要做测试,不可能用外网,是测成功了再连外网
做法是先在电脑上写好hosts文件内容,如下:
127.0.0.1 localhost
192.168.0.100 www.myhome.com
保存好文件后,通过如下命令进行上传(要有Root权限,即你曾刷过ROM):
adb remount
adb push d:\hosts /system/etc
之后进入shell模式下 查看是否上传成功
adb shell
ping www.myhome.com
如果出现的IP地址是 192.168.0.100表示上传hosts文件成功了。
说到这里,大家可能很想骂我,与题目不符,现在就是出现问题的时候了,
这个文件是上传了,当我每次修改代码再装到手机上运行时,就连不上 www.myhome.com了,搞了半天,原来上传的hosts文件其实并没有持久化到手机系统上的,只是内容载到内存中,装新应用或者重启机子后,就没了。好!那我再次上传hosts文件,就报出:
out of memory 这样的错了,必须要重启手机,才能再次push,这真是太麻烦了,改一次代码就要重启,这算什么嘛
在网上找了几天了,解决办法都是针对模拟器的,真机上出的还是没找到,今天看了论坛上有人要删除系统下的文件,我就看看了,有收获,
解决办法是:
在recovery状态下连接手机,并进入advance -mount/system,在PC端CMD中输入以下命令:
adb remount
adb push d:\hosts /system/etc
之后重新启动,
启动之后进入shell
adb shell
cd /system/etc
cat hosts
OK,成功打出了修改过的内容,而不会再丢失了,是真得改到手机的Linux系统上了。
看了论坛的内容也贴出来 ,是讲删除系统文件
在recovery状态下连接手机,并进入advance -mount/system,在PC端CMD中输入以下命令:
adb shell
cd /system/app
ls
查找到你要删除的文件(如Talk.apk)将其删除之:
rm Talk.apk(如果还有同名的只是后缀不同,也可以用Talk.*)
重启手机就OK了
7. 系统文件删除无权限
mount -o remount,rw -t yaffs2 /dev/block/mtdblock0 /system
chmod 777/system/app
今天下午,我在打开whatsapp的时候,破玩意儿又提示我有新版本要不要更新,于是我选择了Yes。经过缓慢的安装之后,忽然提示我installed unsuccessful。我一下脑袋就大了,我是安装的没有修改的官方包,更新又是自动下载的,为什么还会出现这种情况?
于是我怀疑可能是官方更改了证书,所以需要卸载之后重新安装。于是我打开Drawer准备重新启动whatsapp。没想到虽然whatsapp的图标出现在drawer里面,但是启动的时候却提示我没有安装这个app!
我靠,这还了得,于是我将whatsapp卸载了,然后试图重新安装新版。还是提示我不能安装!
于是我使用adb再次尝试安装,提示我[INSTALL_FAILED_DEXOPT],Google之后发现dexopt根本就不是一个单词,应该是dex和optimize的合成缩写。那么有可能是apk文件包里面的dex文件损坏,于是我把它反编译了出来,尝试重新编译。但是不知道这个东西是用什么编译的,smali根本就不能重新编译回去……只能作罢。
所以假设问题还是出现在手机端。Google了一下,发现这个问题应该是出现在生成dex文件时候发生的错误,但是能搜索到的结果有许多是说由于G1机身空间太小导致的,显然同样的问题不可能出现在刚刚做完app2sd的milestone上面。但是我搜索到了一个如果强制完全卸载app的文章,里面介绍了安装app之后,相关文件分布的路径。
所以我的思路就很清晰了,首先完全卸载,再行安装。
经过试验,发现果然可行!那么提炼一下,可以得出这类问题的通用解决思路。
假设该app名为ketech,安装包名为ketech.apk。
查看/data/app里面是否有名称包含ketech的apk或zip包,有可能为类似com.android.ketech.apk或com.android.ketech.zip的形式,有则删掉。
查看/data/app-priviate里面是否有名称包含ketech的apk,名称形式同上,有则删掉。(做了app2sd的朋友可能还需要查看一下app2sd文件夹里面是否含有此apk包)
查看/data/data下面是否有名称包含ketech的文件夹,名称形式类似于com.android.ketech,有则删掉。
查看/data/system下面的package.xml文件,将包含ketech的项目删掉。
Wipe Dalvik缓存。(方式多样,有些openrecovery自带,就不进行详细解释了)
重新安装即可。
替代方案
单改单个模块下的Android.mk
加入
LOCAL_DEX_PREOPT := false
mm后
在out目录下找到相应apk
直接push到/system/app
当然之前要删除要替换的的*.apk *.odex
版权声明:本文为博主原创文章,未经博主允许不得转载。
使用adb安装遇到的一些坑的更多相关文章
- Appium环境的安装以及一路上的坑
Appium环境的安装以及一路上的坑 第一步环境的安装 l javaJDK的安装以及环境变量的配置这个我就不说了网上的教程全都是,搜一个安装一下吧 l AndroidSDK的安装也是如此我是直接安 ...
- 在flask服务里面执行adb 安装命令
今天讲的是我在flask服务里执行adb install 命令,被坑了一天 需求是我们的安卓打包机器和我们的自动化机器不是同一台,管理人也不一样,想让每次打包后能通知到我们的服务器,然后执行后续的操作 ...
- android 入门-使用adb安装及卸载apk
我想用adb 安装apk 到设备上现在出现了2个. 提示我没有找到设备 安装不用进去adb shell 这是你存放apk文件夹路径 下面安装apk到手机上(usb一定要连接成功否则读取不到手机 ...
- 【APP问题定位(三)】adb安装
先来剧透一下我们需要使用的工具 bin包 一个安装目录,可以免安装直接调用adb命令 Android SDK platform tools 下面依次为大家介绍,第1个和第2 ...
- adb安装apk
1. 安装配置 1.1安装包 下载adb.zip,解压至本机 1.2环境配置 将adb安装路径加入path中 2. 安装apk 使用数据线将Android手机与电脑连接,打开手机usb调试 ...
- adb导出安卓 把手机内存文件导入到电脑里 adb安装软件
记得先找对路劲adb shellls 最上面的ls: ./ 打头的没有权限.而下面的这些acct sdcard等 都有权限. 然后cd sdcardls 看下目录,发现gxm文件夹在sdcard下面. ...
- flutter 安装过程遇到的坑
Flutter是一个移动应用程序的软件开发工具包(SDK),用一个代码库构建高性能.高保真的iOS和Android应用程序.目标是使开发人员能够为Android和iOS提供自然的高质量的应用,在滚动行 ...
- 安装redis时候的坑
安装redis时候的坑 随手记录一下,以此为借鉴. 1.按照需求下载redis服务 redis可视化文件 2.安装及环境搭建 修改服务里redis.windows-service.conf文件,或者r ...
- adb安装启动Touch校正软件
/********************************************************************************* * adb安装启动Touch校正软 ...
随机推荐
- get android or ios appname
get app name from GP or itunes var superagent = require('superagent'); var cheerio = require('cheeri ...
- oracle数据库丢失数据文件、控制文件、重做日志文件、初始化文件恢复方法
rman target/ list backup; 查看是否已备份,如果没有,那就不知道了 模拟故障,删除/u01/app/oracle/oradata/ORCL文件夹下的所有文件 sqlplus ...
- linux 变量定义
本地变量:用户自定义的变量. 环境变量:用于所有用户变量,用于用户进程前,必须用export命令导出. 位置变量:$0(脚本名),$1-$9:脚本参数. 特定变量:脚本运行时的一些相关信息. $# 传 ...
- sofa graphql 2 rest api 试用
大部分代码还是来自sofa 的官方文档,同时添加了docker && docker-compose集成 备注: 代码使用typescript 同时运行的时候为了方便直接运行使用ts ...
- Gravitational Teleport docker-compose组件独立部署运行
Gravitational Teleport 可以作为堡垒机进行使用,上次写过一个all in one 的,这次参考官方 的配置运行一个proxy node auth 分离的应用 备注: 基于dock ...
- mysql为int类型的字段php取出来之后为何变为string类型?
https://segmentfault.com/q/1010000002957162 php从mysql取出int数据,变成了string https://blog.csdn.net/as17501 ...
- JAVA中通过Hibernate-Validation进行参数验证
在开发JAVA服务器端代码时,我们会遇到对外部传来的参数合法性进行验证,而hibernate-validator提供了一些常用的参数校验注解,我们可以拿来使用.1.maven中引入hibernate- ...
- 深入理解 content 计数器
计数器可以说是content的重点, 因为此功能非常强大, 实用, 并且不具有可替代性, 甚至可以实现连JavaScript都不好实现的效果. 所谓css计数器效果, 就是使用CSS代码实现随元素的数 ...
- 禁用 linux的 密码登陆
如果我们只允许 证书登陆 不允许密码登陆. 首先配置证书的例子,我的上一篇文章有些. 然后,禁用 密码登陆. vi /etc/ssh/sshd_config 修改 PasswordAuthentica ...
- 5、微信卡券code模式
非自定义Code码: "use_custom_code":false,可以群发卡券,客服消息派发卡券 自定义code: "use_custom_code":tr ...