在某些时候需要将三方apk集成为android ROM内置应用,如果三方应用内部有大量的shared library文件,则需求大量时间为其编写Android.bp或者Android.mk。
为了提高工作效率,我特意用python实现了一个简易版本其功能如下:
1.将APK文件解压,比如APK文件名为Test.APK
2.在Test/lib目录下创建Android.bp文件
3.读取Test/lib目录的子目录列表
4.针对armeabi-v7a和arm64-v8a目录,分别读取其shared library列表并逐个生成对应的prebuild脚本,然后写入Android.bp(当前版本只处理了armeabi-v7a)
#file is the apk name with suffix, it should like my.apk
def unzipfileAndGenerateMakefile(file):
uzfile = zipfile.ZipFile(path + file)
apk_name = file.split('.')[0]
print(apk_name)
print "unzip apk file to " + apk_name
unzipedFilePath = path + apk_name + "/"
#apkFolder = Path(unzipedFilePath)
if os.path.exists(unzipedFilePath):
print unzipedFilePath + " folder is exist"
else:
print "do unzip"
uzfile.extractall(unzipedFilePath)
generateSharedLibraryPrebuildMakefile(unzipedFilePath + "lib/")
def generateSharedLibraryPrebuildMakefile(file):
#create xxx/lib/Android.bp
#makefilePath = Path(file + 'Android.bp')
if os.path.exists(file + 'Android.bp'):
print file + 'Android.bp' + " is exist, remove it first"
os.remove(file + 'Android.bp')
out = open(file + 'Android.bp', 'a')
lib_dirs = os.listdir(file)
#lib_dirs = glob.glob(file)
#Only handle arm64-v8a and armeabi-v7a
for dirname in lib_dirs:
print "lib sub dir : " + dirname
if cmp("armeabi-v7a", dirname) == 0:
print "Handle armeabi-v7a libs"
print "list " + file + dirname + "/*.so"
#libs = os.listdir(file + dirname + "/*.so")
libs = fnmatch.filter(os.listdir(file + dirname), "*.so")
for shareLibName in libs:
print shareLibName
content = generatearmeabiv7aMakefile(shareLibName)
out.write(content)
out.write("\n")
if cmp("arm64-v8a", dirname) == 0 and needHanldeArm64:
print "Handle arm64-v8a libs"
#libs = glob.glob(file + dirname + "/*.so")
libs = fnmatch.filter(os.listdir(file + dirname), "*.so")
for shareLibName in libs:
print shareLibName
ins = open(file + 'Android.bp', 'r')
file_content = ins.read()
print "old content:" + file_content
findResult = re.findall(shareLibName, content)
count = len(findResult)
print findResult
print "found count:%d" %count
if count == 1:
#should merge conent
print "find it and do merge"
print "old content:" + file_content
else:
content = generatearm64v8aMakefile(shareLibName)
out.write(content)
out.write("\n")
#out.write()
out.close()
def generatearmeabiv7aMakefile(shareLibName):
#lib_name = shareLibName.split('.')[0]
#lib_name = os.path.basename(shareLibName)
#suffixIndex = shareLibName.find(".so")
#print suffixIndex
lib_name = shareLibName[0 : -3]
print lib_name
AndroidBpContent = """
cc_prebuilt_library_shared {{
name: \"{}\",
target: {{
android_arm: {{
srcs: [\"armeabi-v7a/{}.so\"],
}},
}},
strip: {{
none: true,
}},
}}"""
result = AndroidBpContent.format(lib_name, lib_name)
#print("AndroidBpContent:\n" + result)
return result
def generatearm64v8aMakefile(shareLibName):
#lib_name = shareLibName.split('.')[0]
#lib_name = os.path.basename(shareLibName)
#suffixIndex = shareLibName.find(".so")
#print suffixIndex
lib_name = shareLibName[0 : -3]
print lib_name
#first check if already generated makefile for armeabi-v7a for current lib
AndroidBpContent = """
cc_prebuilt_library_shared {{
name: \"{}\",
target: {{
android_arm64: {{
srcs: [\"arm64-v8a/{}.so\"],
}},
}},
strip: {{
none: true,
}},
}}"""
result = AndroidBpContent.format(lib_name, lib_name)
#print("AndroidBpContent:\n" + result)
return result
if __name__ == '__main__':
#print ("argv len: %d" %len(sys.argv))
if len(sys.argv) == 2:
unzipfileAndGenerateMakefile(sys.argv[1])
else:
print "Bad input parameters"
print 'Usage: python %s xxx.apk' %sys.argv[0]