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安装遇到的一些坑的更多相关文章

  1. Appium环境的安装以及一路上的坑

    Appium环境的安装以及一路上的坑 第一步环境的安装 l  javaJDK的安装以及环境变量的配置这个我就不说了网上的教程全都是,搜一个安装一下吧 l  AndroidSDK的安装也是如此我是直接安 ...

  2. 在flask服务里面执行adb 安装命令

    今天讲的是我在flask服务里执行adb install 命令,被坑了一天 需求是我们的安卓打包机器和我们的自动化机器不是同一台,管理人也不一样,想让每次打包后能通知到我们的服务器,然后执行后续的操作 ...

  3. android 入门-使用adb安装及卸载apk

     我想用adb 安装apk 到设备上现在出现了2个. 提示我没有找到设备    安装不用进去adb shell 这是你存放apk文件夹路径 下面安装apk到手机上(usb一定要连接成功否则读取不到手机 ...

  4. 【APP问题定位(三)】adb安装

    先来剧透一下我们需要使用的工具 bin包               一个安装目录,可以免安装直接调用adb命令 Android SDK platform tools 下面依次为大家介绍,第1个和第2 ...

  5. adb安装apk

    1.    安装配置 1.1安装包 下载adb.zip,解压至本机 1.2环境配置 将adb安装路径加入path中 2.    安装apk 使用数据线将Android手机与电脑连接,打开手机usb调试 ...

  6. adb导出安卓 把手机内存文件导入到电脑里 adb安装软件

    记得先找对路劲adb shellls 最上面的ls: ./ 打头的没有权限.而下面的这些acct sdcard等 都有权限. 然后cd sdcardls 看下目录,发现gxm文件夹在sdcard下面. ...

  7. flutter 安装过程遇到的坑

    Flutter是一个移动应用程序的软件开发工具包(SDK),用一个代码库构建高性能.高保真的iOS和Android应用程序.目标是使开发人员能够为Android和iOS提供自然的高质量的应用,在滚动行 ...

  8. 安装redis时候的坑

    安装redis时候的坑 随手记录一下,以此为借鉴. 1.按照需求下载redis服务 redis可视化文件 2.安装及环境搭建 修改服务里redis.windows-service.conf文件,或者r ...

  9. adb安装启动Touch校正软件

    /********************************************************************************* * adb安装启动Touch校正软 ...

随机推荐

  1. get android or ios appname

    get app name from GP or itunes var superagent = require('superagent'); var cheerio = require('cheeri ...

  2. oracle数据库丢失数据文件、控制文件、重做日志文件、初始化文件恢复方法

    rman  target/ list backup; 查看是否已备份,如果没有,那就不知道了 模拟故障,删除/u01/app/oracle/oradata/ORCL文件夹下的所有文件 sqlplus ...

  3. linux 变量定义

    本地变量:用户自定义的变量. 环境变量:用于所有用户变量,用于用户进程前,必须用export命令导出. 位置变量:$0(脚本名),$1-$9:脚本参数. 特定变量:脚本运行时的一些相关信息. $# 传 ...

  4. sofa graphql 2 rest api 试用

      大部分代码还是来自sofa 的官方文档,同时添加了docker && docker-compose集成 备注: 代码使用typescript 同时运行的时候为了方便直接运行使用ts ...

  5. Gravitational Teleport docker-compose组件独立部署运行

    Gravitational Teleport 可以作为堡垒机进行使用,上次写过一个all in one 的,这次参考官方 的配置运行一个proxy node auth 分离的应用 备注: 基于dock ...

  6. mysql为int类型的字段php取出来之后为何变为string类型?

    https://segmentfault.com/q/1010000002957162 php从mysql取出int数据,变成了string https://blog.csdn.net/as17501 ...

  7. JAVA中通过Hibernate-Validation进行参数验证

    在开发JAVA服务器端代码时,我们会遇到对外部传来的参数合法性进行验证,而hibernate-validator提供了一些常用的参数校验注解,我们可以拿来使用.1.maven中引入hibernate- ...

  8. 深入理解 content 计数器

    计数器可以说是content的重点, 因为此功能非常强大, 实用, 并且不具有可替代性, 甚至可以实现连JavaScript都不好实现的效果. 所谓css计数器效果, 就是使用CSS代码实现随元素的数 ...

  9. 禁用 linux的 密码登陆

    如果我们只允许 证书登陆 不允许密码登陆. 首先配置证书的例子,我的上一篇文章有些. 然后,禁用 密码登陆. vi /etc/ssh/sshd_config 修改 PasswordAuthentica ...

  10. 5、微信卡券code模式

    非自定义Code码: "use_custom_code":false,可以群发卡券,客服消息派发卡券 自定义code: "use_custom_code":tr ...