• 利用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]

  • 相关阅读:
    如何实现应用程序的身份认证和数据加密?
    [附源码]计算机毕业设计新能源汽车租赁Springboot程序
    2022Q3母婴行业三大热门赛道总结
    SystemV 信号量(一) —— SystemV信号量的相关操作函数
    Docker+Nginx打包部署Spring boot 项目
    C++ Qt开发:如何使用信号与槽
    Day692.Tomcat如何隔离Web应用 -深入拆解 Tomcat & Jetty
    后端研发工程师面经——Spring
    阿里EMO模型:AI生成表情丰富的视频
    jQuery Ajax 设置请求头
  • 原文地址:https://blog.csdn.net/free555/article/details/126298242