Android 龙旗内置应用python脚本

项目总是碰到要内置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麻烦了~,^___^

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值