Android 手机克隆/一键换机原理初探
前言
最近换了一个表,错了换了一个手机。大家都知道换手机是一个很开心的事情,但是在换手机过程中原来手机App信息,多媒体信息等切换时一件很麻烦和耗时的事情。偶然发现手机自带了手机克隆功能,这个非常方便的解决了我们上述的痛点今天我们初步研究一下怎么实现上述的功能。
一. 具体实现
我们知道手机需要迁移的数据一般是多媒体和App数据,那么我们就分别从这两个方面入手。至于两个手机怎么建立WIFI连接和蓝牙连接这个不在本篇的考虑范围之内。
1.1 原理
手机克隆和一键换机的原理大概如下:
上面这两种方案都大同小异,主要都是将数据从旧的终端迁移到新的终端上面去。只是传输中介有点不一样。
1.2 迁移音视频数据
下面我们以第二种方案来说民给,这个比较简单,我们可以在旧手机端遍历多媒体数据库,然后建立网络连接将数据拷贝到新手机端,这样就完成了多媒体数据的迁移。
1.3 App及App数据的迁移
多媒体的迁移是比较简单的,有难度的是App以及App数据的迁移。下面我们以一个简单的例子来说明。就是我们久手机里面有一个应用叫做ServiceHost.ServiceHost的应用,需要将其迁移到另外一台手机。
前期准备:两台Android终端
1.3.1 旧的Android终端
需要将数据拷贝出来,可以执行如下脚本,当然这些脚本的功能,手机厂家一般会预置一个App和相关服务来执行实施。这段脚本的作用主要是将App和App的数据拷贝出来,大家只要理解了这个原理,就可以在App里面通过代码执行类似操作
adb root
adb remount
adb shell setenforce 0
:: 拷贝App
adb shell "tar cf /data/app/ServiceHost.ServiceHost-ZDfEk43pd0Efyd-118aF4A==.zip /data/app/ServiceHost.ServiceHost-ZDfEk43pd0Efyd-118aF4A=="
adb pull /data/app/ServiceHost.ServiceHost-ZDfEk43pd0Efyd-118aF4A==.zip
:: 拷贝App数据
adb shell "tar cf /data/data/ServiceHost.ServiceHost.zip /data/data/ServiceHost.ServiceHost"
adb pull /data/data/ServiceHost.ServiceHost.zip
pause
运行脚本:
C:\Users\XXX\>adb root
adbd is already running as root
C:\Users\XXX\>adb remount
remount succeeded
C:\Users\XXX\>adb shell setenforce 0
C:\Users\XXX\>adb shell "tar cf /data/app/ServiceHost.ServiceHost-ZDfEk43pd0Efyd-118aF4A==.zip /data/app/ServiceHost.ServiceHost-ZDfEk43pd0Efyd-118aF4A=="
removing leading '/' from member names
C:\Users\XXX\>adb pull /data/app/ServiceHost.ServiceHost-ZDfEk43pd0Efyd-118aF4A==.zip
8362 KB/s (99507712 bytes in 11.620s)
C:\Users\XXX\>adb shell "tar cf /data/data/ServiceHost.ServiceHost.zip /data/data/ServiceHost.ServiceHost"
removing leading '/' from member names
C:\Users\XXX\>adb pull /data/data/ServiceHost.ServiceHost.zip
8421 KB/s (110715904 bytes in 12.838s)
C:\Users\XXX\>>pause
请按任意键继续. . .
执行结果:
1.3.2 旧的Android终端新的Android终端
这里需要是执行应用安装和数据的拷贝,这个只是一个演示脚本,可以通过App内执行类似代码片段进而执行。
adb remount
adb shell setenforce 0
adb push ServiceHost.ServiceHost-CZtGOt1HDc-lSyYEWeVbbg==.zip /data/app/
adb shell " cd /data/app/ && tar xf ServiceHost.ServiceHost-CZtGOt1HDc-lSyYEWeVbbg==.zip ServiceHost.ServiceHost-CZtGOt1HDc-lSyYEWeVbbg== "
adb shell " chmod 777 -R /data/app/ServiceHost.ServiceHost-CZtGOt1HDc-lSyYEWeVbbg== "
adb shell " pm install -r /data/app/ServiceHost.ServiceHost-CZtGOt1HDc-lSyYEWeVbbg==/base.apk "
adb push ServiceHost.ServiceHost.zip /data/data/
adb shell " cd /data/data && tar xf ServiceHost.ServiceHost.zip ServiceHost.ServiceHost "
adb shell " chmod 777 -R /data/data/ServiceHost.ServiceHost "
adb shell sync
adb shell stop zygote
adb shell start zygote
ping -n 50 127.0.0.1>nul
adb shell am start -n ServiceHost.ServiceHost/md5bd7813ef94204169d60c7bafe7bcc17a.ServiceHostView
pause
运行脚本:
C:\Users\XXX\>adb remount
remount succeeded
C:\Users\XXX\>>adb shell setenforce 0
C:\Users\XXX\>>adb push ServiceHost.ServiceHost-CZtGOt1HDc-lSyYEWeVbbg==.zip /data/app/
7063 KB/s (99532800 bytes in 13.760s)
C:\Users\XXX\>>adb shell " cd /data/app/ && tar xf ServiceHost.ServiceHost-CZtGOt1HDc-lSyYEWeVbbg==.zip ServiceHost.ServiceHost-CZtGOt1HDc-lSyYEWeVbbg== "
C:\Users\XXX\>>adb shell " chmod 777 -R /data/app/ServiceHost.ServiceHost-CZtGOt1HDc-lSyYEWeVbbg== "
C:\Users\XXX\>>adb shell " pm install -r /data/app/ServiceHost.ServiceHost-CZtGOt1HDc-lSyYEWeVbbg==/base.apk "
Error: Could not access the Package Manager. Is the system running?
C:\Users\XXX\>>adb push ServiceHost.ServiceHost.zip /data/data/
7298 KB/s (103127040 bytes in 13.798s)
C:\Users\XXX\>>adb shell " cd /data/data && tar xf ServiceHost.ServiceHost.zip ServiceHost.ServiceHost "
C:\Users\XXX\>>adb shell " chmod 777 -R /data/data/ServiceHost.ServiceHost "
C:\Users\XXX\>>adb shell sync
C:\Users\XXX\>>adb shell stop zygote
C:\Users\XXX\>>adb shell start zygote
C:\Users\XXX\>>ping -n 50 127.0.0.1 1>nul
执行结果:
1.3.3 原理分析
好了,下面我么分析一下原理,主要是将旧终端的App应用数据拷贝出来,然后安装到新的终端下面从而完成App已经App数据的迁移。大家get到了吗。
总结
关于手机克隆,现在来总结一下:
- 对于多媒体的拷贝比较简单,主要是通过遍历多媒体数据库然后将遍历的资源从久的Android终端拷贝到新的Android终端即可。
- 对于App的克隆过程要复杂一点,需要将/data/app下面的App应用拷贝,并且需要将/data/data下面的App数据也进行相关的拷贝。
写在最后
本篇只是一个大概的原理讲解,如果真的要实现可能会有其它的问题。但是原理有了,我相信实现起来至少有了思路了,最终的实现只是时间问题了。