From ba28b44ae7c50757434b45658e19a2383e0f293c Mon Sep 17 00:00:00 2001 From: Marcus Hoffmann Date: Wed, 19 Aug 2020 18:06:27 +0200 Subject: [PATCH] common: use androguard to figure out minSDK version Closes: #816 --- fdroidserver/common.py | 21 +++++++-------- tests/common.TestCase | 61 ++++++++++++++++++------------------------ 2 files changed, 36 insertions(+), 46 deletions(-) diff --git a/fdroidserver/common.py b/fdroidserver/common.py index 86097a27..4a5ad875 100644 --- a/fdroidserver/common.py +++ b/fdroidserver/common.py @@ -2502,20 +2502,19 @@ def get_native_code(apkfile): return sorted(list(archset)) -def get_minSdkVersion_aapt(apkfile): - """Extract the minimum supported Android SDK from an APK using aapt +def get_minSdkVersion(apkfile): + """Extract the minimum supported Android SDK from an APK using androguard :param apkfile: path to an APK file. :returns: the integer representing the SDK version """ - r = re.compile(r"^sdkVersion:'([0-9]+)'") - p = SdkToolsPopen(['aapt', 'dump', 'badging', apkfile], output=False) - for line in p.output.splitlines(): - m = r.match(line) - if m: - return int(m.group(1)) - raise FDroidException(_('Reading minSdkVersion failed: "{apkfilename}"') - .format(apkfilename=apkfile)) + + try: + apk = _get_androguard_APK(apkfile) + except FileNotFoundError: + raise FDroidException(_('Reading minSdkVersion failed: "{apkfilename}"') + .format(apkfilename=apkfile)) + return int(apk.get_min_sdk_version()) class PopenResult: @@ -3040,7 +3039,7 @@ def sign_apk(unsigned_path, signed_path, keyalias): """ - if get_minSdkVersion_aapt(unsigned_path) < 18: + if get_minSdkVersion(unsigned_path) < 18: signature_algorithm = ['-sigalg', 'SHA1withRSA', '-digestalg', 'SHA1'] else: signature_algorithm = ['-sigalg', 'SHA256withRSA', '-digestalg', 'SHA-256'] diff --git a/tests/common.TestCase b/tests/common.TestCase index 49e46af7..78ab8da3 100755 --- a/tests/common.TestCase +++ b/tests/common.TestCase @@ -674,7 +674,7 @@ class CommonTest(unittest.TestCase): self.assertTrue(fdroidserver.common.verify_apk_signature(signed)) try: fdroidserver.common.find_sdk_tools_cmd('aapt') - self.assertEqual(18, fdroidserver.common.get_minSdkVersion_aapt(signed)) + self.assertEqual(18, fdroidserver.common.get_minSdkVersion(signed)) except fdroidserver.exception.FDroidException: print('\n\nSKIPPING test_sign_apk min SDK check, aapt is not installed!\n') return @@ -775,63 +775,54 @@ class CommonTest(unittest.TestCase): nc = fdroidserver.common.get_native_code(apkfilename) self.assertEqual(native_code, nc) - def test_get_minSdkVersion_aapt(self): - config = dict() - fdroidserver.common.fill_config_defaults(config) - fdroidserver.common.config = config - self._set_build_tools() - try: # get_minSdkVersion_aapt requires aapt - config['aapt'] = fdroidserver.common.find_sdk_tools_cmd('aapt') - except fdroidserver.exception.FDroidException: - print('\n\nSKIPPING test_sign_apk, aapt is not installed!\n') - return - - minSdkVersion = fdroidserver.common.get_minSdkVersion_aapt('bad-unicode-πÇÇ现代通用字-български-عربي1.apk') + def test_get_minSdkVersion_androguard(self): + minSdkVersion = fdroidserver.common.get_minSdkVersion('bad-unicode-πÇÇ现代通用字-български-عربي1.apk') self.assertEqual(4, minSdkVersion) - minSdkVersion = fdroidserver.common.get_minSdkVersion_aapt('org.bitbucket.tickytacky.mirrormirror_1.apk') + minSdkVersion = fdroidserver.common.get_minSdkVersion('org.bitbucket.tickytacky.mirrormirror_1.apk') self.assertEqual(14, minSdkVersion) - minSdkVersion = fdroidserver.common.get_minSdkVersion_aapt('org.bitbucket.tickytacky.mirrormirror_2.apk') + minSdkVersion = fdroidserver.common.get_minSdkVersion('org.bitbucket.tickytacky.mirrormirror_2.apk') self.assertEqual(14, minSdkVersion) - minSdkVersion = fdroidserver.common.get_minSdkVersion_aapt('org.bitbucket.tickytacky.mirrormirror_3.apk') + minSdkVersion = fdroidserver.common.get_minSdkVersion('org.bitbucket.tickytacky.mirrormirror_3.apk') self.assertEqual(14, minSdkVersion) - minSdkVersion = fdroidserver.common.get_minSdkVersion_aapt('org.bitbucket.tickytacky.mirrormirror_4.apk') + minSdkVersion = fdroidserver.common.get_minSdkVersion('org.bitbucket.tickytacky.mirrormirror_4.apk') self.assertEqual(14, minSdkVersion) - minSdkVersion = fdroidserver.common.get_minSdkVersion_aapt('org.dyndns.fules.ck_20.apk') + minSdkVersion = fdroidserver.common.get_minSdkVersion('org.dyndns.fules.ck_20.apk') self.assertEqual(7, minSdkVersion) - minSdkVersion = fdroidserver.common.get_minSdkVersion_aapt('urzip.apk') + minSdkVersion = fdroidserver.common.get_minSdkVersion('urzip.apk') self.assertEqual(4, minSdkVersion) - minSdkVersion = fdroidserver.common.get_minSdkVersion_aapt('urzip-badcert.apk') + minSdkVersion = fdroidserver.common.get_minSdkVersion('urzip-badcert.apk') self.assertEqual(4, minSdkVersion) - minSdkVersion = fdroidserver.common.get_minSdkVersion_aapt('urzip-badsig.apk') + minSdkVersion = fdroidserver.common.get_minSdkVersion('urzip-badsig.apk') self.assertEqual(4, minSdkVersion) - minSdkVersion = fdroidserver.common.get_minSdkVersion_aapt('urzip-release.apk') + minSdkVersion = fdroidserver.common.get_minSdkVersion('urzip-release.apk') self.assertEqual(4, minSdkVersion) - minSdkVersion = fdroidserver.common.get_minSdkVersion_aapt('urzip-release-unsigned.apk') + minSdkVersion = fdroidserver.common.get_minSdkVersion('urzip-release-unsigned.apk') self.assertEqual(4, minSdkVersion) - minSdkVersion = fdroidserver.common.get_minSdkVersion_aapt('repo/com.politedroid_3.apk') + minSdkVersion = fdroidserver.common.get_minSdkVersion('repo/com.politedroid_3.apk') self.assertEqual(3, minSdkVersion) - minSdkVersion = fdroidserver.common.get_minSdkVersion_aapt('repo/com.politedroid_4.apk') + minSdkVersion = fdroidserver.common.get_minSdkVersion('repo/com.politedroid_4.apk') self.assertEqual(3, minSdkVersion) - minSdkVersion = fdroidserver.common.get_minSdkVersion_aapt('repo/com.politedroid_5.apk') + minSdkVersion = fdroidserver.common.get_minSdkVersion('repo/com.politedroid_5.apk') self.assertEqual(3, minSdkVersion) - minSdkVersion = fdroidserver.common.get_minSdkVersion_aapt('repo/com.politedroid_6.apk') + minSdkVersion = fdroidserver.common.get_minSdkVersion('repo/com.politedroid_6.apk') self.assertEqual(14, minSdkVersion) - minSdkVersion = fdroidserver.common.get_minSdkVersion_aapt('repo/obb.main.oldversion_1444412523.apk') + minSdkVersion = fdroidserver.common.get_minSdkVersion('repo/obb.main.oldversion_1444412523.apk') self.assertEqual(4, minSdkVersion) - minSdkVersion = fdroidserver.common.get_minSdkVersion_aapt('repo/obb.mainpatch.current_1619_another-release-key.apk') + minSdkVersion = fdroidserver.common.get_minSdkVersion('repo/obb.mainpatch.current_1619_another-release-key.apk') self.assertEqual(4, minSdkVersion) - minSdkVersion = fdroidserver.common.get_minSdkVersion_aapt('repo/obb.mainpatch.current_1619.apk') + minSdkVersion = fdroidserver.common.get_minSdkVersion('repo/obb.mainpatch.current_1619.apk') self.assertEqual(4, minSdkVersion) - minSdkVersion = fdroidserver.common.get_minSdkVersion_aapt('repo/obb.main.twoversions_1101613.apk') + minSdkVersion = fdroidserver.common.get_minSdkVersion('repo/obb.main.twoversions_1101613.apk') self.assertEqual(4, minSdkVersion) - minSdkVersion = fdroidserver.common.get_minSdkVersion_aapt('repo/obb.main.twoversions_1101615.apk') + minSdkVersion = fdroidserver.common.get_minSdkVersion('repo/obb.main.twoversions_1101615.apk') self.assertEqual(4, minSdkVersion) - minSdkVersion = fdroidserver.common.get_minSdkVersion_aapt('repo/obb.main.twoversions_1101617.apk') + minSdkVersion = fdroidserver.common.get_minSdkVersion('repo/obb.main.twoversions_1101617.apk') + self.assertEqual(4, minSdkVersion) + minSdkVersion = fdroidserver.common.get_minSdkVersion('repo/urzip-; Рахма́, [rɐxˈmanʲɪnəf] سيرجي_رخمانينوف 谢·.apk') self.assertEqual(4, minSdkVersion) - minSdkVersion = fdroidserver.common.get_minSdkVersion_aapt('repo/urzip-; Рахма́, [rɐxˈmanʲɪnəf] سيرجي_رخمانينوف 谢·.apk') with self.assertRaises(FDroidException): - fdroidserver.common.get_minSdkVersion_aapt('nope') + fdroidserver.common.get_minSdkVersion('nope') def test_apk_release_name(self): appid, vercode, sigfp = fdroidserver.common.apk_parse_release_filename('com.serwylo.lexica_905.apk')