经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 移动开发 » Android » 查看文章
使用拷贝的方式(adb push) 绕过Android系统和adb install直接安装APK
来源:cnblogs  作者:applex007  时间:2019/3/22 8:41:21  对本文有异议

某些情况下定制的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的系统支持库的类型名称),例如:

  1. <package name="com.musicqiyi.mvideo" codePath="/data/app/com.musicqiyi.mvideo-1" nativeLibraryPath="/data/app/com.musicqiyi.mvideo-1/lib"
  2. primaryCpuAbi="armeabi" flags="48708" ft="1699e32eb38" it="1699e32ebd1" ut="1699e32ebd1" version="2" userId="10031">
  3. ...
  4. </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.'

  1. # ro.product.cpu.abi and ro.product.cpu.abi2 are obsolete,
  2. # use ro.product.cpu.abilist instead.
  3. ro.product.cpu.abi=x86
  4. ro.product.cpu.abilist=x86,armeabi-v7a,armeabi
  5. ro.product.cpu.abilist32=x86,armeabi-v7a,armeabi
  6. ro.product.cpu.abilist64=

 

Android系统支持库类型与lib库内文件夹名对应关系

  1. /* /libcore/libart/src/main/java/dalvik/system/VMRuntime.java */
  2. private static final Map<String, String> ABI_TO_INSTRUCTION_SET_MAP
  3.   = new HashMap<String, String>();
  4. static {
  5.   ABI_TO_INSTRUCTION_SET_MAP.put("armeabi", "arm");
  6.   ABI_TO_INSTRUCTION_SET_MAP.put("armeabi-v7a", "arm");
  7.   ABI_TO_INSTRUCTION_SET_MAP.put("mips", "mips");
  8.   ABI_TO_INSTRUCTION_SET_MAP.put("mips64", "mips64");
  9.   ABI_TO_INSTRUCTION_SET_MAP.put("x86", "x86");
  10.   ABI_TO_INSTRUCTION_SET_MAP.put("x86_64", "x86_64");
  11.   ABI_TO_INSTRUCTION_SET_MAP.put("arm64-v8a", "arm64");
  12. }

 

常见的Android系统支持库与cpu对应关系

 

原文链接:http://www.cnblogs.com/applex007/p/10571853.html

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号