自制工具:利用python批量获取apk中的库文件。


客制化软件时,经常遇到需要将客户提供的apk预置到系统内,但是预置apk需要将apk中的库文件预先提取出来放到system/lib目录中,因此提取apk的库文件成为了一种需求。
常见的方法是手动用rar打开apk,导出库,然后保存,但是遇到大量apk需要预置的时候,会有不小的工作量,因此按照手动导出的逻辑,简单编写一个工具,代码如下:

  1. ''' 
  2. TOOLS: tools for get apks lib. 
  3. AUTOR: whonee 
  4. DATA : 20160109 
  5. '''  
  6. import os  
  7. import sys  
  8. import shutil  
  9.   
  10. ''' 
  11.     MODIFY IT FOR YOU PATH 
  12. '''  
  13. RAR_CMD = 'D://progra~1/WinRAR/winrar.exe'  
  14. PATH = 'D://py_tools/get_apk_lib/apk'  
  15. LIBPATH = 'D://py_tools/get_apk_lib/lib'  
  16.   
  17. ''' 
  18.     MAIN FUNCTION 
  19. '''  
  20. def rename(dirname = PATH):      
  21.     listFile = os.listdir(dirname)      
  22.     print(listFile)  
  23.     for file in listFile:  
  24.         filename = os.path.splitext(file)  
  25.         if(filename[1] == '.apk'):  
  26.             name = filename[0] + '.zip'  
  27.             print(name)  
  28.             os.rename(os.path.join(dirname, file),os.path.join(dirname,name))  
  29.       
  30.       
  31. def unzip(dirname = PATH,cmd = RAR_CMD):  
  32.     listFile = os.listdir(dirname)  
  33.     CMD = cmd + ' x {} {}'  
  34.     os.chdir(dirname)  
  35.     for file in listFile:  
  36.         filename = os.path.splitext(file)  
  37.         if(filename[1] == '.zip'):  
  38.             rarCmd = CMD.format(file,(filename[0]+os.sep))  
  39.             print(rarCmd)  
  40.             os.system(rarCmd)  
  41.   
  42. def restname(dirname = PATH):      
  43.     listFile = os.listdir(dirname)  
  44.     for file in listFile:  
  45.         filename = os.path.splitext(file)  
  46.         if(filename[1] == '.zip'):  
  47.             name = filename[0] + '.apk'  
  48.             print(name)  
  49.             os.rename(os.path.join(dirname, file),os.path.join(dirname,name))        
  50.       
  51. def findlib(dirname = PATH):  
  52.     listFile = os.listdir(dirname)     
  53.     libdir = dirname + os.sep + 'alllib'  
  54.     if not os.path.exists(libdir):  
  55.         os.mkdir(libdir)  
  56.     for file in listFile:    
  57.         # Bill Z 指出错误修改,可能处理到了alllib文件夹。  
  58.         if ( file == "alllib" ):                                                             
  59.            continue                
  60.         fulldirfile=os.path.join(os.path.abspath(dirname),file)  
  61.         if os.path.isdir(fulldirfile):  
  62.             #print(file + ' is path')  
  63.             os.chdir(fulldirfile)  
  64.             if os.path.exists('lib'):  
  65.                 print(file + ' have lib')  
  66.                 directdir = '../alllib/{}_lib'.format(file)  
  67.                 shutil.move('lib',directdir)  
  68.             os.chdir('..')  
  69.             try:  
  70.                 shutil.rmtree(fulldirfile)  
  71.             except:  
  72.                 pass  
  73.               
  74. def sort(dirname = PATH):  
  75.     libdir = dirname + os.sep + 'alllib'  
  76.     os.chdir(libdir)  
  77.     libfolderlist = os.listdir(libdir)  
  78.     for folder in libfolderlist:  
  79.         fulldirfile = os.path.join(libdir,folder)  
  80.         print("APK NAME: ",fulldirfile)  
  81.         os.chdir(fulldirfile)  
  82.         listlib = os.listdir(fulldirfile)  
  83.         for libfolder in listlib:  
  84.             print('HAVE LIB FOLDER: ',libfolder)  
  85.             if not (libfolder == 'x86' and libfolder == 'x64'):  
  86.                 rootlib = os.path.join(fulldirfile,libfolder)  
  87.                 os.chdir(rootlib)  
  88.                 alllib = os.listdir(rootlib)   
  89.                 for lib in alllib:  
  90.                     srclibname = os.path.join(rootlib,lib)  
  91.                     #print(srclibname)  
  92.                     tarlibname = os.path.join(LIBPATH,lib)  
  93.                     print('USERFUL LIB: ',srclibname)  
  94.                     #print(tarlibname)  
  95.                     shutil.copycopy(srclibname,tarlibname)  
  96.     print("all lib will be copycopy to lib folder ,\  
  97.     if you want to find the base lib ,please into 'apk/alllib'")  
  98.                 
  99. def main():  
  100.     if not os.path.exists(RAR_CMD):  
  101.         print("winrar.exe is not exists, please input rar path likes: 'c://Progra~1/WinRAR/winrar' \n")          
  102.         cmd = input('rar path: ')  
  103.         if not os.path.exists(cmd):  
  104.             print('input error rar path exit !')  
  105.             exit()  
  106.     path = PATH  
  107.     rename(path)  
  108.     unzip(path)  
  109.     findlib(path)  
  110.     restname(path)  
  111.     sort(path)      
  112.     anykey = input("Sucessful ! please input Enter key to exit!")  
  113.     if anykey:      
  114.         print('quit')  
  115.         exit()  
  116.           
  117.       
  118. if __name__ == '__main__':  
  119.     main()  

在对应的文件夹放上apk,执行此工具之后就可以到指定的文件夹去寻找已经导出OK的库了。

版权所有丨如未注明,均为原创,转载请注明转自:https://whonee.net/python-get-apks-libs.html

5 thoughts on “自制工具:利用python批量获取apk中的库文件。”

      1. 57 def findlib ( dirname = PATH ):
        58 listFile = os.listdir(dirname)
        59 libdir = dirname + os.sep + 'alllib'
        60
        61 if not os.path.exists(libdir):
        62 os.mkdir(libdir)
        63 else:
        64 shutil.rmtree(libdir)
        65
        66 for file in listFile:
        67 if ( file == "alllib" ):
        68 continue
        69

        1. @Bill Z:
          哦,看到了,果然是的,处理的时候,可能会处理到存放库文件的文件夹。
          这个工具写的时间有点长了,居然有点忘记了。
          你这个修改不错,谢谢咯!

发表评论

电子邮件地址不会被公开。 必填项已用*标注