某些情况下定制的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的更多相关文章

  1. android系统和ios系统是如何实现推送的,ios为什么没有后台推送

    ios系统为什么没有后台推送? iOS 为了真正地为用户体验负责,不允许应用在后台活动.有了这个限制,但是对于终端设备,应用又是有必要“通知”到达用户的,随时与用户主动沟通起来的(典型的如聊天应用). ...

  2. 使用adb命令操控Android手机(adb命令)

    1) 手机连接电脑之前 首先,查看安卓手机是否已经连接上电脑 adb devices 让adb一直查找安卓设备,找到后才停止 adb wait-for-device 2) 手机连接电脑后的操作 2.0 ...

  3. Android 7.0系统代码调用安装apk时报错FileUriExposedException完美解决

    项目更新遇到问题   Android项目开发中经常遇到下载更新的需求,以前调用系统安装器执行安装操作代码如下: Intent intent = new Intent(); intent.setActi ...

  4. Android系统移植与调试之------->安装apk时出现错误Failure [INSTALL_FAILED_DEXOPT]问题解决的方法

    在android4.0源码里面编译出来apk后,用adb install (或adb install -r 重装)安装时,报错[INSTALL_FAILED_DEXOPT]. xu@xu-PC:~$ ...

  5. Android插件化开发---执行未安装apk中的Service

    欢迎各位增加我的Android开发群[257053751​] 假设你还不知道什么叫插件化开发.那么你应该先读一读之前写的这篇博客:Android插件化开发,初入殿堂 上一篇博客主要从总体角度分析了一下 ...

  6. Android实现应用下载并自动安装apk包

    安装: ? 1 2 3 4 5 String str = "/CanavaCancel.apk"; String fileName = Environment.getExterna ...

  7. jsp页面在Android系统和ISO系统的兼容性问题

    问题:一个jsp页面在Android手机上显示正常,但到了ISO系统上jsp页面的样式不显示了. 原因:css文件中设置样式时单位不兼容. 解决方案:将rem 转换成px;

  8. Android /data/data/app_file/目录下面安装apk无权限问题

    当识别SDCard的时候 String filePath = null; String state = Environment.getExternalStorageState(); if (state ...

  9. 【Android】获取手机中已安装apk文件信息(PackageInfo、ResolveInfo)(应用图片、应用名、包名等)

    众所周知,通过PackageManager可以获取手机端已安装的apk文件的信息,具体代码如下 PackageManager packageManager = this.getPackageManag ...

随机推荐

  1. JS方法:数字转换为千分位字符

    /** * 数字转为千分位字符 * @param {Number} num * @param {Number} point 保留几位小数,默认2位 */ function parseToThousan ...

  2. CentOS6.7 mysql5.6.33修改数据文件位置

    问题:mysql存放的数据文件,分区容量较小,目前已经满,导致mysql连接不上, 解决方案: 1.删除分区里一个不需要用的数据,如:日志文件等(解决不了根本问题) 2.对某个磁盘扩容 3.修改数据存 ...

  3. xml序列化和反序列化(二)

    上篇讲到关于xml入参实体序列化,下面给出出参实体反序列化,代码如下: /// <summary> /// 反序列化 /// </summary> /// <param ...

  4. repr调试python程序

    一般调试程序的时候都比较倾向print,利用直接打印的方法作出判断,但是print只能打印出结果,对类型无法作出判断.例如: a = 5 b = ' print(a) print(b) 结果为: 5 ...

  5. js中的拷贝问题

    浅拷贝的实现 // 浅拷贝函数 var dad = {name:'chen',age:18}; var son = {sex:'男'}; function clone(dad,son){ var so ...

  6. 关于js中对象和函数的一道问题

    今天在写代码的时候遇到一个问题,没有解决,又在sf上提问了..冏..,最后讨论良久终于解决,和往常一样,做一个备忘,最近打算把印象笔记里的东西迁来.具体可访问http://segmentfault.c ...

  7. Android 自定义控件 轻松实现360软件详情页

    转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/43649913,本文出自:[张鸿洋的博客] 1.概述 最近有不少朋友私聊问应用宝. ...

  8. 【爬虫】Xpath高级用法

    xpath速度比较快,是爬虫在网页定位中的较优选择,但是很多网页前端代码混乱难以定位,而学习定位也较为不易(主要是全面的教程较少),这里列出一点编程过程中可能有用的东西,欢迎共同学习批评指正.试验环境 ...

  9. linux常用命令:创建文件和文件夹

    1.首先说一下touch 创建文件的命令,touch可以用于创建二进制文件,用法非常简单.用法:touch+文件名,touch与文件名之间一定要有空格.图中先用之前分享过的命令来查看一下/目录下面有多 ...

  10. 连续查询(Continuous Queries)

    当数据超过保存策略里指定的时间之后,就会被删除.如果我们不想完全删除掉,比如做一个数据统计采样:把原先每秒的数据,存为每小时的数据,让数据占用的空间大大减少(以降低精度为代价). 这就需要Influx ...