利用python为你集成三方apk里的lib时自动生成Android.bp

github: GitHub - fredhurui/GenerateAndroidMakefile: Generate Android.bp for the shared library in the apk, which is used to integrated apk to Android ROM

在某些时候需要将三方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]

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
由于Android.mk和Android.bp之间的语法差异比较大,因此将Android.mk转换为Android.bp需要进行大量的手动操作。不过,我们可以编写一个脚本来自动完成一些重复性的工作,例如将源文件列表转换为`srcs`属性、将`LOCAL_SHARED_LIBRARIES`转换为`shared_libs`属性等。 以下是一个简单的Python脚本,可以将Android.mk文件转换为Android.bp文件: ```python import os import re def convert_mk_to_bp(mk_file_path, bp_file_path): with open(mk_file_path, 'r') as mk_file: content = mk_file.read() # 将源文件列表转换为srcs属性 content = re.sub(r'LOCAL_SRC_FILES\s*\+?=\s*([^\n]+)', r'srcs = [\1],', content) # 将LOCAL_CFLAGS转换为cflags属性 content = re.sub(r'LOCAL_CFLAGS\s*\+?=\s*([^\n]+)', r'cflags = [\1],', content) # 将LOCAL_SHARED_LIBRARIES转换为shared_libs属性 content = re.sub(r'LOCAL_SHARED_LIBRARIES\s*\+?=\s*([^\n]+)', r'shared_libs = [\1],', content) # 将LOCAL_STATIC_LIBRARIES转换为static_libs属性 content = re.sub(r'LOCAL_STATIC_LIBRARIES\s*\+?=\s*([^\n]+)', r'static_libs = [\1],', content) # 将LOCAL_INCLUDES转换为include_dirs属性 content = re.sub(r'LOCAL_INCLUDES\s*\+?=\s*([^\n]+)', r'include_dirs = [\1],', content) # 写入bp文件 with open(bp_file_path, 'w') as bp_file: bp_file.write('cc_library {\n') bp_file.write(f'name: "{os.path.basename(mk_file_path)}",\n') bp_file.write(content) bp_file.write('}\n') # 例子 convert_mk_to_bp('Android.mk', 'Android.bp') ``` 脚本中使用正则表达式将Android.mk文件中的每个属性转换为相应的Android.bp属性,并将其写入到Android.bp文件中。使用该脚本可以大大简化Android.mk转换为Android.bp的过程,但由于语法差异,部分属性可能需要手动调整。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值