Android手机上每个已安装的程序都有对应的安装包即apk文件存在,放在/data/app/下,这也是那些软件备份软件的原理。但是必须要root后才能访问到。
我现在要备份应用,就是要复制这些apk文件到其他地方,比如sdcard。用adb shell登录到手机
adb shell
su
cd /data/app/
ls */base.apk
得到
cmb.pb-1/base.apk
cn.wq.myandroidtoolspro-1/base.apk
com.Fraom.KiwiUI-1/base.apk
com.baidu.BaiduMap-1/base.apk
省略若干。
这些apk文件名都一样,都是base.apk,且层级相同,就只有所在父文件夹不同。
其实在linux shell里复制是可以保留目录结构的,加上--parent选项就可以连带父文件夹一起复制走。很不幸在Android shell下不认识这个选项。
于是就得写一个shell脚本来拷贝。但是拷贝到desc后文件名不能重复啊,要改名才行,随便改成啥,不如改成跟父文件夹最后一个字符串一样的名字好了。
比如 com.sina.weibo-1/base.apk 要改成 com.sina.weibo-1 -> weibo-1.apk。
这里用到 # ## % %% 通配符。如 file = com.sina.weibo-1/base.apk, 第一步用
tmp=${file%/*}
得到 com.sina.weibo-1
这里 %/* 的意思是,从右边起,到第一个 / 之间字符都去掉。
tmp=${tmp##*.}
得到 weibo-1
这里 ##*. 的意思是去掉从左边开始到最后一个 . 之间的字符串。然后就能用循环处理剩下的。
此外,
#:表示去掉从左边开始到第一个任意字符之间的字符串
%%:表示去掉从右边开始到最后一个任意字符之间的字符串
附上脚本源码
filelist=`ls */base.apk`
for file in $filelist
do
tmp=${file%/*}
#echo ${file}
tmp=${tmp##*.}
#echo ${file}
cp -a ${file} /sdcard/backup/apps/${tmp}.apk
echo ${tmp}
done