项目总是碰到要内置app的情况,龙旗的源码内置app比较麻烦,需要手动解压app,提取lib文件,然后将apk文件和库文件目标路径和源路径写到指定的xml文件中,很是繁琐,所以我写了一个python脚本,能够自动解压并提取lib库文件,然后将apk文件和库文件目标路径和源路径按照指定格式写入到packages.xml文件中,下面介绍如何使用这个脚本:
首先在zprojects/longcheer-binary下新建preloaded-apps文件夹,然后将所有要内置的apk全部都放到这里,执行脚本就可以了,是不是特别简单~
python脚本代码如下:
#!/usr/bin/env python
# coding: utf-8
import os,tempfile,subprocess,os,hashlib,operator
import sys
import shutil
import zipfile
import time
rootpath = os.path.abspath(os.path.join(os.getcwd(),"../../.."))
FILEPATH = rootpath+"/zprojects/longcheer-binary"
FILENAME = "packages.xml"
FILE = FILEPATH+os.sep+FILENAME
targetDirectory = FILEPATH+"/data/app"
sourceDir = os.path.abspath(os.curdir)
sourceDirFiles = os.listdir(sourceDir)
fileExist = 3
fileExistButNull = 5
fileNotExist = 7
def isFileExists(): //判断packages.xml是否存在
if os.path.exists(FILE):
if os.path.getsize(FILE):
print "file exists and is not null"
size=os.path.getsize(FILE)
os.system('ls -lh %s' %(FILE))
return fileExist //如果文件存在并且不是null,返回fileExist
else:
print ("file exists but is null")
os.system('ls -lh %s' %(FILE))
return fileExistButNull //如果文件存在但是null,返回fileExistButNull
else:
print ("file doesn't exist")
return fileNotExist //返回文件不存在
def copyApk(targetDir): //拷贝文件到data/app路径下
for name in sourceDirFiles: //先遍历当前路径下的所有apk
if '.apk' == name[-4:]: //判断是不是apk
shutil.copyfile(sourceDir+os.sep+name,targetDir+os.sep+name) //如果是apk就开始拷贝
print name+" 已经拷贝到data/app下!"
def createApkDirectory(): //创建解压apk的文件夹,解压后的文件夹名称用该apk的名称来命名
for name in sourceDirFiles:
if '.apk' == name[-4:]: //判断该文件是否为apk,name[-4:]这个取的是名称的后四位
if(os.path.exists(name[0:-4])): //如果文件夹已经存在,删掉
for f in os.listdir(sourceDir+os.sep+name[0:-4]):
filePath = os.path.join(name[0:-4],f)
if os.path.isfile(filePath):
os.remove(filePath)
print filePath+" was removed!"
elif os.path.isdir(filePath):
shutil.rmtree(filePath,True)
print "Directory: "+filePath+" was removed"
else :
os.mkdir(name[0:-4]) //如果不存在就创建新的
def unzipApkFiles(): //此方法是解压apk
for name in sourceDirFiles:
if '.apk' == name[-4:]:
fz = zipfile.ZipFile(sourceDir+os.sep+name,'r') //读取apk,取到所有文件名称
for file in fz.namelist():
if(file.startswith("lib")): //判断是否为lib库,如果是lib再进行解压
fz.extract(file,name[0:-4])
print name+" 已经解压完成!"
def readPackagesAndWrite(): //向packages.xml中进行写入,因为apk有很多的库文件,所以我默认arm64-v8a优先,其次是armeabi-v7a,最后是armeabi,中间添加的都是packages.xml写入的格式,
print "readPackagesAndWrite"
fp=open(FILE,"a+")
for name in sourceDirFiles:
if(os.path.isdir(name)):
list = []
fPath = "<package name="+"\""+os.path.basename(sourceDir+os.sep+name)+"\""+">"+"\n"
fApkPath = "\t"+"<file dst=\""+"system/app/"+os.path.basename(sourceDir+os.sep+name)+"/"+os.path.basename(sourceDir+os.sep+name)+".apk"+"\""+"\t"+"src =\"data/app/"+os.path.basename(sourceDir+os.sep+name)+".apk"+"\"/>"+"\n"
fp.write(fPath)
fp.write(fApkPath)
for f in os.listdir(sourceDir+os.sep+name):
if(os.path.isdir(sourceDir+os.sep+name+os.sep+f)):
for libFiles in os.listdir(sourceDir+os.sep+name+os.sep+f):
list.append(libFiles)
if "arm64-v8a" in list:
for libs in os.listdir(sourceDir+os.sep+name+os.sep+f+os.sep+libFiles):
libsPath = "\t"+"<file dst=\""+"system/app/"+os.path.basename(sourceDir+os.sep+name)+"/lib/arm/"+os.path.basename(libFiles+os.sep+libs)+"\""+"\t"+"src =\"preloaded-apps/"+name+"/"+f+"/"+libFiles+"/"+libs+"\"/>"+"\n"
fp.write(libsPath);
else :
if "armeabi-v7a" in list:
for libs in os.listdir(sourceDir+os.sep+name+os.sep+f+os.sep+libFiles):
libsPath = "\t"+"<file dst=\""+"system/app/"+os.path.basename(sourceDir+os.sep+name)+"/lib/arm/"+os.path.basename(libFiles+os.sep+libs)+"\""+"\t"+"src =\"preloaded-apps/"+name+"/"+f+"/"+libFiles+"/"+libs+"\"/>"+"\n"
fp.write(libsPath);
else :
if "armeabi" in list:
for libs in os.listdir(sourceDir+os.sep+name+os.sep+f+os.sep+libFiles):
libsPath = "\t"+"<file dst=\""+"system/app/"+os.path.basename(sourceDir+os.sep+name)+"/lib/arm/"+os.path.basename(libFiles+os.sep+libs)+"\""+"\t"+"src =\"preloaded-apps/"+name+"/"+f+"/"+libFiles+"/"+libs+"\"/>"+"\n"
fp.write(libsPath);
fp.write("</package>")
fp.write("\n")
fp.close()
print "内置apk已完成,请检查packages.xml!"
if __name__ =='__main__':
isExists = isFileExists()
if(isExists == fileExist):
copyApk(targetDirectory)
createApkDirectory()
unzipApkFiles()
readPackagesAndWrite()
脚本执行完成后,去查看一下packages.xml,是不是按照指定格式写入,packages.xml中写入信息如下:
<package name="PalmInput">
<file dst="system/app/PalmInput/PalmInput.apk" src="data/app/PalmInput.apk"/>
<file dst="system/app/PalmInput/lib/arm/libhithw.so" src ="data/PalmInput/libhithw.so"/>
<file dst="system/app/PalmInput/lib/arm/libFTInputEngine.so" src ="data/PalmInput/libFTInputEngine.so"/>
<file dst="system/app/PalmInput/lib/arm/libFTDictSync.so" src ="data/PalmInput/libFTDictSync.so"/>
<file dst="system/app/PalmInput/lib/arm/libqihoospeech.so" src ="data/PalmInput/libqihoospeech.so"/>
<file dst="system/app/PalmInput/lib/arm/libFTInputCloud.so" src ="data/PalmInput/libFTInputCloud.so"/>
<file dst="system/app/PalmInput/lib/arm/libmsc.so" src ="data/PalmInput/libmsc.so"/>
<file dst="system/app/PalmInput/lib/arm/libvxproto-1.0.1.so" src ="data/PalmInput/libvxproto-1.0.1.so"/>
</package>
格式非常正确,再也不用担心内置app麻烦了~,^___^