使用拷贝的方式(adb push) 绕过Android系统和adb install直接安装APK
某些情况下定制的Android系统为了限制用户安装应用,例如电视盒子,车载中控等,通过修改代码屏蔽了正常安装应用的方式
本文探讨如何在 adb shell 具有读写data分区目录的权限前提下,通过adb push 拷贝方式绕过Android系统和adb install直接安装apk到Android系统,适用于对Android系统和adb指令操作有一定基础的读者
测试环境: 夜神模拟器(Android5.1)
测试应用: QQ音乐车机版 爱奇艺音乐 爱奇艺Android版
前置条件: adb shell具有root权限,可读写data分区
通过执行 adb connect localhost:62001,可以使用命令行环境连接到模拟器内部的Android环境
步骤:
1.根据下载的apk文件,准备拷贝文件,具体:
(1) 在电脑上使用解压软件打开apk文件,并根据AndroidManifest.xml或代码目录结构(一般以com开头)获取软件包名(可以使用jadx解析apk后查看AndroidManifest的manifest标签的package属性)
(2) 创建文件夹,命名为形如"包名-1",拷贝apk文件到该文件夹并重名为base.apk
(3) 将apk中lib文件加解压出来,并参考如下[Android系统支持库类型与lib库内文件夹名对应关系]修改so文件所在文件夹的名称
(4) 若lib文件夹下只有一套so库(一个文件夹),直接拷贝软件解压后的lib文件夹到新建的形如"包名-1"文件夹
(5) 若lib文件夹下存在多套so库(多个文件夹),则参考如下[Android系统支持库类型及优先级顺序],保留并优先级最高的so文件所在文件夹(64位>32位)
(6) 执行 adb push "包名-1" /data/app/"包名-1" 将文件拷贝至Andorid系统/data/app目录下并重启系统
(7) 重启系统后,此时桌面应该已显示安装的应用,若打开时出现停止运行错误,一般由于找不到对应的so库导致,请继续执行如下第2步
2.修改Android系统packages.xml系统存储的应用信息
(1) 执行 adb pull /data/system/packages.xml . (注意第二个参数是'.',表示电脑当前目录) 将Android系统的packages.xml文件拷贝至电脑,该文件存储了Android系统应用的信息
(2) 根据apk包名查找 "package" 标签,定位到前面通过拷贝安装至Android系统的应用的信息内容
(3) 确认并在当前package标签下是否补充 primaryCpuAbi 属性, 内容为第1步第5小节所保留的so文件夹原名(即应用提供给Android的系统支持库的类型名称),例如:
<package name="com.musicqiyi.mvideo" codePath="/data/app/com.musicqiyi.mvideo-1" nativeLibraryPath="/data/app/com.musicqiyi.mvideo-1/lib"
primaryCpuAbi="armeabi" flags="48708" ft="1699e32eb38" it="1699e32ebd1" ut="1699e32ebd1" version="2" userId="10031">
...
</package>
(4) 执行 adb push packages.xml /data/system 将修改后的packages.xml文件覆盖拷贝至Android系统并重启,确认应用是否可以正常运行
(5) 若应用打开时仍出现错误,可能是并非首次安装该应用到Android系统中,请尝试如下第3步
3.创建数据文件夹内容和删除dex缓存(非必须)
(1) 执行 adb shell 并定位到 /data/data 目录,在当前目录创建一个文件夹,名称为apk的包名 mkdir -p '包名'
(2) 在包名文件夹内创建软链接文件,将apk安装目录下的so库文件夹链接到当前目录下 ln -s lib /data/app/'包名-1'/lib/'so库文件夹'
(3) 定位到 /data/dalvik 目录, 执行 rm -rf * 清空系统对应用的dex缓存
(4) 重启系统
Android系统支持库类型及优先级顺序
adb shell下执行cat system/build.prop | grep 'ro.product.cpu.'
# ro.product.cpu.abi and ro.product.cpu.abi2 are obsolete,
# use ro.product.cpu.abilist instead.
ro.product.cpu.abi=x86
ro.product.cpu.abilist=x86,armeabi-v7a,armeabi
ro.product.cpu.abilist32=x86,armeabi-v7a,armeabi
ro.product.cpu.abilist64=
Android系统支持库类型与lib库内文件夹名对应关系
/* /libcore/libart/src/main/java/dalvik/system/VMRuntime.java */
private static final Map<String, String> ABI_TO_INSTRUCTION_SET_MAP
= new HashMap<String, String>();
static {
ABI_TO_INSTRUCTION_SET_MAP.put("armeabi", "arm");
ABI_TO_INSTRUCTION_SET_MAP.put("armeabi-v7a", "arm");
ABI_TO_INSTRUCTION_SET_MAP.put("mips", "mips");
ABI_TO_INSTRUCTION_SET_MAP.put("mips64", "mips64");
ABI_TO_INSTRUCTION_SET_MAP.put("x86", "x86");
ABI_TO_INSTRUCTION_SET_MAP.put("x86_64", "x86_64");
ABI_TO_INSTRUCTION_SET_MAP.put("arm64-v8a", "arm64");
}
常见的Android系统支持库与cpu对应关系

使用拷贝的方式(adb push) 绕过Android系统和adb install直接安装APK的更多相关文章
- android系统和ios系统是如何实现推送的,ios为什么没有后台推送
ios系统为什么没有后台推送? iOS 为了真正地为用户体验负责,不允许应用在后台活动.有了这个限制,但是对于终端设备,应用又是有必要“通知”到达用户的,随时与用户主动沟通起来的(典型的如聊天应用). ...
- 使用adb命令操控Android手机(adb命令)
1) 手机连接电脑之前 首先,查看安卓手机是否已经连接上电脑 adb devices 让adb一直查找安卓设备,找到后才停止 adb wait-for-device 2) 手机连接电脑后的操作 2.0 ...
- Android 7.0系统代码调用安装apk时报错FileUriExposedException完美解决
项目更新遇到问题 Android项目开发中经常遇到下载更新的需求,以前调用系统安装器执行安装操作代码如下: Intent intent = new Intent(); intent.setActi ...
- Android系统移植与调试之------->安装apk时出现错误Failure [INSTALL_FAILED_DEXOPT]问题解决的方法
在android4.0源码里面编译出来apk后,用adb install (或adb install -r 重装)安装时,报错[INSTALL_FAILED_DEXOPT]. xu@xu-PC:~$ ...
- Android插件化开发---执行未安装apk中的Service
欢迎各位增加我的Android开发群[257053751] 假设你还不知道什么叫插件化开发.那么你应该先读一读之前写的这篇博客:Android插件化开发,初入殿堂 上一篇博客主要从总体角度分析了一下 ...
- Android实现应用下载并自动安装apk包
安装: ? 1 2 3 4 5 String str = "/CanavaCancel.apk"; String fileName = Environment.getExterna ...
- jsp页面在Android系统和ISO系统的兼容性问题
问题:一个jsp页面在Android手机上显示正常,但到了ISO系统上jsp页面的样式不显示了. 原因:css文件中设置样式时单位不兼容. 解决方案:将rem 转换成px;
- Android /data/data/app_file/目录下面安装apk无权限问题
当识别SDCard的时候 String filePath = null; String state = Environment.getExternalStorageState(); if (state ...
- 【Android】获取手机中已安装apk文件信息(PackageInfo、ResolveInfo)(应用图片、应用名、包名等)
众所周知,通过PackageManager可以获取手机端已安装的apk文件的信息,具体代码如下 PackageManager packageManager = this.getPackageManag ...
随机推荐
- wordpress上下篇
分页一: <!--上下篇开始--> <div class="shangxia"> <?php $current_category=get_the_ca ...
- oracle中数据类型对应java类型
地址: http://otndnld.Oracle.co.jp/document/products/oracle10g/102/doc_cd/Java.102/B19275-03/datacc.htm ...
- mysql(mariadb)如何更改root密码
mysql(或者mariadb,她是mysql的一个分支,完全开源,新版本的linux系统默认安装的是mariadb)如何更改root密码呢?我们主要介绍命令mysqladmin来实现. mysql( ...
- java判断一个字符串是否是数字的三种方法
参考https://blog.csdn.net/ld_flex/article/details/7699161 1 用JAVA自带的函数 public static boolean isNumeric ...
- BZOJ_2962_序列操作_线段树
Description 有一个长度为n的序列,有三个操作1.I a b c表示将[a,b]这一段区间的元素集体增加c,2.R a b表示将[a,b]区间内所有元素变成相反数,3.Q a b c表示询问 ...
- BZOJ_3012_[Usaco2012 Dec]First!_trie树+拓扑排序
BZOJ_3012_[Usaco2012 Dec]First!_trie树+拓扑排序 题意: 给定n个总长不超过m的互不相同的字符串,现在你可以任意指定字符之间的大小关系.问有多少个串可能成为字典序最 ...
- XMR挖矿教程
XMR挖矿教程 XMR介绍 门罗币(Monero,代号XMR)是一个创建于2014年4月开源加密货币,它着重于隐私.分权和可扩展性.与自比特币衍生的许多加密货币不同,Monero基于CryptoNot ...
- 【爆料】-《南昆士兰大学毕业证书》USQ一模一样原件
☞南昆士兰大学毕业证书[微/Q:2544033233◆WeChat:CC6669834]UC毕业证书/联系人Alice[查看点击百度快照查看][留信网学历认证&博士&硕士&海归 ...
- STM32标准库GPIO操作
STM32标准库GPIO操作 STM32任何外围设备的使用都分为两部分:初始化和使用.体现在代码上就是:(1)有一个初始化函数(2)main函数中的使用 1.初始化GPIO 初始化GPIO函数代码: ...
- ansible命令应用基础
ansible命令应用基础: Usage: ansible <host-pattern> [-f forks] [-m module_name][-a args] -f ...