Advertisement
TimLu

Android package downloader

Mar 31st, 2022
1,224
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 8.80 KB | None | 0 0
  1.  
  2. # Naive package downloader for the Jetpack/AndroidX suite
  3. # Originally adapted from 'tiny-android-template.sh'
  4. # Check out https://developer.android.com/jetpack/androidx/versions for a list of packages and versions
  5. import requests
  6. import os
  7. import sys
  8. from simpparams import *
  9. from bs4 import BeautifulSoup
  10.  
  11. commandlist = []
  12. commandmap = {}
  13. argc = len(sys.argv)
  14. package_source_url =  "https://developer.android.com/jetpack/androidx/versions"
  15. PACKAGE_NAME = "appcompat"
  16. VERSION=""
  17.  
  18. packages = {"activity": ["February 23, 2022", "1.4.0"],
  19.  "ads": ["January 22, 2020", "-"],
  20.  "annotation (*)": ["February 9, 2022", "1.3.0"],
  21.  "appcompat": ["February 23, 2022", "1.4.1"],
  22.  "appsearch": ["November 3, 2021", "-"],
  23.  "arch.core": ["September 5, 2019", "2.1.0"],
  24.  "asynclayoutinflater": ["September 21, 2018", "1.0.0"],
  25.  "autofill": ["July 21, 2021", "1.1.0"],
  26.  "benchmark": ["February 23, 2022", "1.0.0"],
  27.  "biometric": ["November 17, 2021", "1.1.0"],
  28.  "browser": ["November 3, 2021", "1.4.0"],
  29.  "car-app": ["January 26, 2022", "1.1.0"],
  30.  "camera (*)": ["February 23, 2022", "1.0.2"],
  31.  "cardview": ["September 21, 2018", "1.0.0"],
  32.  "collection": ["December 1, 2021", "1.2.0"],
  33.  "compose": ["February 23, 2022", "1.1.1"],
  34.  "compose.animation": ["February 23, 2022", "1.1.1"],
  35.  "compose.compiler": ["February 23, 2022", "1.1.1"],
  36.  "compose.foundation": ["February 23, 2022", "1.1.1"],
  37.  "compose.material": ["February 23, 2022", "1.1.1"],
  38.  "compose.material3": ["February 23, 2022", "-"],
  39.  "compose.runtime": ["February 23, 2022", "1.1.1"],
  40.  "compose.ui": ["February 23, 2022", "1.1.1"],
  41.  "concurrent": ["August 19, 2020", "1.1.0"],
  42.  "constraintlayout (*)": ["Jan 13, 2022", "2.1.3"],
  43.  "contentpager": ["September 21, 2018", "1.0.0"],
  44.  "coordinatorlayout": ["January 12, 2022", "1.2.0"],
  45.  "core (*)": ["February 23, 2022", "1.7.0"],
  46.  "cursoradapter": ["September 21, 2018", "1.0.0"],
  47.  "customview": ["February 23, 2022", "1.1.0"],
  48.  "databinding": ["September 5, 2019", "3.5.0"],
  49.  "datastore": ["August 4, 2021", "1.0.0"],
  50.  "documentfile": ["August 18, 2021", "1.0.1"],
  51.  "draganddrop": ["February 23, 2022", "-"],
  52.  "drawerlayout": ["September 2, 2020", "1.1.1"],
  53.  "dynamicanimation": ["December 4, 2019", "-"],
  54.  "emoji": ["January 27, 2021", "1.1.0"],
  55.  "emoji2": ["February 23, 2022", "1.1.0"],
  56.  "enterprise": ["January 13, 2021", "1.1.0"],
  57.  "exifinterface": ["August 4, 2021", "1.3.3"],
  58.  "fragment": ["February 23, 2022", "1.4.1"],
  59.  "games (*)": ["February 23, 2022", "1.1.0"],
  60.  "glance": ["February 23, 2022", "-"],
  61.  "gridlayout": ["September 21, 2018", "1.0.0"],
  62.  "health": ["November 3, 2021", "-"],
  63.  "heifwriter": ["January 22, 2020", "-"],
  64.  "hilt (*)": ["January 26, 2022", "1.0.0"],
  65.  "interpolator": ["September 21, 2018", "1.0.0"],
  66.  "jetifier": ["September 2, 2020", "-"],
  67.  "leanback": ["November 17, 2021", "-"],
  68.  "legacy": ["September 21, 2018", "1.0.0"],
  69.  "lifecycle (*)": ["February 23, 2022", "2.4.1"],
  70.  "loader": ["October 9, 2019", "1.1.0"],
  71.  "localbroadcastmanager": ["January 12, 2022", "1.1.0"],
  72.  "media": ["February 23, 2022", "1.5.0"],
  73.  "media2": ["February 9, 2022", "1.2.1"],
  74.  "media3": ["October 27, 2021", "-"],
  75.  "mediarouter": ["January 26, 2022", "1.2.6"],
  76.  "multidex": ["December 17, 2018", "2.0.1"],
  77.  "metrics": ["February 9, 2022", "-"],
  78.  "navigation": ["February 23, 2022", "2.4.1"],
  79.  "paging (*)": ["November 17, 2021", "3.1.0"],
  80.  "palette": ["September 21, 2018", "1.0.0"],
  81.  "percentlayout": ["September 21, 2018", "1.0.0"],
  82.  "preference": ["January 26, 2022", "1.2.0"],
  83.  "print": ["October 28, 2020", "-"],
  84.  "profileinstaller": ["February 9, 2022", "1.1.0"],
  85.  "recommendation": ["September 21, 2018", "1.0.0"],
  86.  "recyclerview (*)": ["September 15, 2021", "1.2.1"],
  87.  "remotecallback": ["May 7, 2019", "1.0.0"],
  88.  "resourceinspection": ["January 26, 2022", "1.0.1"],
  89.  "room": ["February 23, 2022", "2.4.2"],
  90.  "savedstate": ["January 26, 2022", "1.1.0"],
  91.  "security (*)": ["September 1, 2021", "1.0.0"],
  92.  "sharetarget": ["November 3, 2021", "1.1.0"],
  93.  "slice": ["January 13, 2021", "-"],
  94.  "slidingpanelayout": ["January 26, 2022", "1.2.0"],
  95.  "startup": ["February 9, 2022", "1.1.1"],
  96.  "sqlite": ["February 23, 2022", "2.2.0"],
  97.  "swiperefreshlayout": ["July 22, 2020", "1.1.0"],
  98.  "test (*)": ["February 11, 2022", "1.0.0"],
  99.  "textclassifier": ["January 22, 2020", "-"],
  100.  "tracing": ["December 1, 2021", "1.0.0"],
  101.  "transition": ["April 21, 2021", "1.4.1"],
  102.  "tvprovider": ["August 19, 2020", "-"],
  103.  "vectordrawable": ["August 19, 2020", "1.1.0"],
  104.  "versionedparcelable": ["April 15, 2020", "1.1.1"],
  105.  "viewpager": ["September 15, 2021", "1.0.0"],
  106.  "viewpager2": ["August 4, 2021", "1.0.0"],
  107.  "wear (*)": ["February 23, 2022", "1.2.0"],
  108.  "wear.compose": ["February 23, 2022", "-"],
  109.  "wear.tiles": ["February 23, 2022", "1.0.1"],
  110.  "wear.watchface": ["February 9, 2022", "1.0.1"],
  111.  "webkit": ["December 16, 2020", "1.4.0"],
  112.  "window": ["January 26, 2022", "1.0.0"],
  113.  "work": ["January 12, 2022", "2.7.1"]}
  114.  
  115.  
  116. print("Android package grabber script")
  117. print("Usage: ")
  118. print("   get_android_packages.py <package name> -v <version> -p|-b|-h")
  119.  
  120.  
  121.  
  122.  
  123. SDK_DIR="../Sdk"
  124. TOOLS_DIR=SDK_DIR+"/android-11"
  125. PLATFORM_DIR=SDK_DIR+"/android-11"
  126.  
  127. REPO="https://dl.google.com/dl/android/maven2/"
  128. PKG_OUTPUT="lib"
  129. CMD_SED="sed"
  130. CMD_ADB=os.path.join("/platform-tools/adb")
  131. CMD_D8="javac -Xmx1024M -Xss1m -cp "+TOOLS_DIR+"/lib/d8.jar com.android.tools.r8.D8"
  132.  
  133. def ensure_dir(file_path):
  134.     directory = os.path.dirname(file_path)
  135.     if not os.path.exists(directory):
  136.         os.makedirs(directory)
  137.  
  138. def get(package_name, version):
  139.     package_name = package_name.replace(" (*)", "")
  140.     print("Grabbing " + package_name + " v" + version)
  141.     fname = package_name + "-" + version+".aar"
  142.     url= REPO + "androidx/"+package_name+ "/"+package_name+"/"+version +"/"+ fname
  143.  
  144.     if verbose:
  145.         print(url)
  146.  
  147.     r = requests.get(url)
  148.     #print(r.headers)
  149.     if r.status_code == 200:
  150.  
  151.         ensure_dir("libs\\")
  152.         fullname = os.path.abspath(os.path.join("libs", fname))
  153.         with open(fullname,"wb") as f:
  154.             print("saving " + str(len(r.content)) + " bytes as '" + fullname + "'")
  155.             f.write(r.content)
  156.         r.close()    
  157.         return True
  158.     else:
  159.         print("There was a problem retrieving that library")
  160.         print("Status code: " + str(r.status_code))
  161.         print("Reason: " + str(r.reason))
  162.         return False
  163.  
  164. def scrape_package_list():
  165.     try:   
  166.         html_text = requests.get(package_source_url).text    
  167.         soup = BeautifulSoup(html_text, 'html.parser')
  168.         #print(soup)
  169.         tables = soup.find_all("table")
  170.         packages = {}
  171.         for table in tables:
  172.             tr = table.find_all("tr")      
  173.             for r in tr:
  174.                 text = ""
  175.                 package = []
  176.                 cc = r.find_all("td")
  177.                 for c in cc:
  178.                     package.append(c.get_text(strip=True))
  179.                 if len(package):
  180.                     packages[package[0]] = package[1:3]
  181.         return packages
  182.     except Exception as e:
  183.         print(str(e))
  184.         return None
  185.  
  186. verbose = False
  187.  
  188. if argc > 1:
  189.     print("commands found")
  190.     print(sys.argv)
  191.     commandlist, commandmap, nonswitchcommands = get_parameter_commands(sys.argv)
  192.     print(commandlist)
  193.     print(commandmap)
  194.     if argc > 2:
  195.         PACKAGE_NAME = sys.argv[1]
  196.         print("Set package name to " + PACKAGE_NAME)
  197.     if argc > 3:
  198.         if isDigit(sys.argv[2]):
  199.             VERSION = sys.argv[2]
  200.             print("Set Version to " + VERSION)
  201.     if '-v' in commandmap:
  202.         if isDigit(commandmap['v']):
  203.             VERSION = commandmap['v']
  204.             print("Set Version to " + VERSION)
  205.     if '-b' in commandmap:
  206.         verbose = True             
  207.    
  208.     if '-p' in commandmap: 
  209.         print("Package list:")     
  210.         for pidx in packages:
  211.             p = packages[pidx]
  212.             if len(p)>=2:
  213.                 print("package: " + pidx + ", release date: " + p[0] + ", version: " + p[1])
  214.  
  215.     if '-h' in commandmap:
  216.         print("   get_android_packages.py <package name> -v|-h|-p")
  217.         print(" <package name> is any package current supported in the maven repository")
  218.         print(" -v : specify exact version (e.g. 1.0.0). If omitted, the latest version will be used")
  219.         print(" -h : prints this message")
  220.         print(" -p : lists currently available packages, their release date and version number")
  221.         print(" -b : verbose output" )
  222.         print(" -a : download all java libraries" )
  223.  
  224.     if '-a' in commandmap:
  225.         oklist = {}
  226.        
  227.         for pidx in packages:          
  228.             oklist[pidx] =  get(pidx, packages[pidx][1])
  229.  
  230.         for pidx in packages:
  231.             if oklist[pidx]:
  232.                 print(pidx + " downloaded correctly")
  233.             else:
  234.                 print(pidx + " did *not* download correctly")
  235.         PACKAGE_NAME = None
  236.        
  237.        
  238. if VERSION == "":
  239.     if packages == None:
  240.         packages = scrape_package_list()
  241.     if PACKAGE_NAME in packages:
  242.         VERSION = packages[PACKAGE_NAME][1]
  243.  
  244. if PACKAGE_NAME != None and PACKAGE_NAME not in packages:
  245.     print("Warning: Package '" + PACKAGE_NAME + "' not found in package list")
  246. #import simpparams
  247.  
  248. latest_packages = scrape_package_list()
  249. if latest_packages != None and len(latest_packages) > 0:
  250.     packages = latest_packages
  251.  
  252. if PACKAGE_NAME != None:
  253.     get(PACKAGE_NAME, VERSION)
  254.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement