183 lines
6.0 KiB
Python
183 lines
6.0 KiB
Python
# tools for making sure nothing is wrongly set
|
|
|
|
from xml.dom.minidom import parse, parseString
|
|
|
|
AName = "android:name"
|
|
|
|
def hasPermissions(Perms):
|
|
def _hasPermissions(root):
|
|
perms = Perms[:]
|
|
elems = root.getElementsByTagName("uses-permission")
|
|
failed = []
|
|
for e in elems:
|
|
if e.hasAttribute(AName):
|
|
attr = e.getAttribute(AName)
|
|
try: perms.remove(attr)
|
|
except: failed.append(attr)
|
|
success = len(perms) == 0
|
|
if not success:
|
|
print "Permissions failed:\n\t%s"%",\n\t".join(perms)
|
|
return success
|
|
return _hasPermissions
|
|
|
|
def testXperiaOptimized(root):
|
|
elem = root.getElementsByTagName("application")[0]
|
|
metas = elem.getElementsByTagName("meta-data")
|
|
for x in metas:
|
|
if x.hasAttribute(AName):
|
|
if x.getAttribute(AName) == "xperiaplayoptimized_content":
|
|
return True
|
|
return False
|
|
|
|
def testManifestHeader(root):
|
|
package = root.getAttribute("package")
|
|
verCode = root.getAttribute("android:versionCode")
|
|
verName = root.getAttribute("android:versionName")
|
|
|
|
print "\n - Package : %s"%package
|
|
print " - Version Code: %s"%verCode
|
|
print " - Version Name: %s"%verName
|
|
|
|
try:
|
|
if root.getAttribute("android:installLocation") != "preferExternal":
|
|
raise Error
|
|
except: print "Warning: android:installLocation is not 'preferExternal"
|
|
|
|
return True
|
|
|
|
def testXperiaOnly(root):
|
|
elem = root.getElementsByTagName("application")[0]
|
|
libs = elem.getElementsByTagName("uses-library")
|
|
for x in libs:
|
|
if x.getAttribute(AName) == "xperiaplaycertified" and \
|
|
x.getAttribute("android:required") == "true":
|
|
return True
|
|
return False
|
|
|
|
def testPlaystationOnly(root):
|
|
elem = root.getElementsByTagName("application")[0]
|
|
libs = elem.getElementsByTagName("uses-library")
|
|
for x in libs:
|
|
if x.getAttribute(AName) == "playstationcertified" and \
|
|
x.getAttribute("android:required") == "true":
|
|
return True
|
|
return False
|
|
|
|
def testNameAndIcon(root):
|
|
elem = root.getElementsByTagName("application")[0]
|
|
metas = elem.getElementsByTagName("meta-data")
|
|
hasName = hasIcon = False
|
|
for x in metas:
|
|
if x.hasAttribute(AName):
|
|
if x.getAttribute(AName) == "game_display_name": hasName = True
|
|
if x.getAttribute(AName) == "game_icon": hasIcon = True
|
|
return hasName and hasIcon
|
|
|
|
def testDebuggable(root):
|
|
elem = root.getElementsByTagName("application")[0]
|
|
if not elem.hasAttribute("android:debuggable"): return True
|
|
return elem.getAttribute("android:debuggable") == "false"
|
|
|
|
def testMinSdkVersion(Version):
|
|
def _minSdkVersion(root):
|
|
elem = root.getElementsByTagName("uses-sdk")[0]
|
|
if not elem.hasAttribute("android:minSdkVersion"): return False
|
|
return int(elem.getAttribute("android:minSdkVersion")) == Version
|
|
return _minSdkVersion
|
|
|
|
def testMetaData(root):
|
|
success = True
|
|
success &= testXperiaOptimized(root)
|
|
success &= testNameAndIcon(root)
|
|
return success
|
|
|
|
def testRealLicenseCheck(root):
|
|
import os
|
|
p, mfn = os.path.split(fn)
|
|
srcfn = os.path.join(p, "src/com/mojang/minecraftpe/MainActivity.java")
|
|
s = file(srcfn, 'r').read()
|
|
x = s.find("new VerizonLicenseThread")
|
|
if x < 0: return False
|
|
|
|
b = s.find("(", x)
|
|
e = s.find(")", b)
|
|
if -1 in (b,e): return False
|
|
args = [arg.strip() for arg in s[b+1:e].split(",")]
|
|
if len(args) != 3:
|
|
print "Couldn't parse new VerizonLicenseThread() arguments"
|
|
return False
|
|
return args[2] == "false"
|
|
|
|
def verify(doc, rules):
|
|
success = True
|
|
root = doc.documentElement
|
|
for rule in rules:
|
|
print ".",
|
|
try:
|
|
ruleResult = rule(root)
|
|
except:
|
|
ruleResult = False
|
|
import traceback
|
|
print traceback.format_exc()
|
|
if not ruleResult:
|
|
print " Rule %s failed."%rule
|
|
success = False
|
|
return success
|
|
|
|
if __name__ == "__main__":
|
|
import sys
|
|
|
|
generalPerms = hasPermissions([ "android.permission.INTERNET",
|
|
"android.permission.WRITE_EXTERNAL_STORAGE"])
|
|
verizonPerms = hasPermissions([ "android.permission.READ_PHONE_STATE",
|
|
"android.permission.START_BACKGROUND_SERVICE",
|
|
"com.verizon.vcast.apps.VCAST_APPS_LICENSE_SERVICE"])
|
|
marketPerms = hasPermissions([ "com.android.vending.CHECK_LICENSE"])
|
|
|
|
Google = "google"
|
|
Exclusive = "exclusive"
|
|
Verizon = "verizon"
|
|
General = "general"
|
|
allStores = {
|
|
General:[ generalPerms,
|
|
testXperiaOptimized,
|
|
testDebuggable,
|
|
testMinSdkVersion(9),
|
|
testNameAndIcon,
|
|
testManifestHeader],
|
|
Google: [ marketPerms],
|
|
Verizon:[ verizonPerms,
|
|
testRealLicenseCheck],
|
|
Exclusive: [testXperiaOnly,
|
|
testPlaystationOnly]
|
|
}
|
|
|
|
try: fn = sys.argv[1]
|
|
except: fn = r'C:\dev\subversion\mojang\minecraftcpp\trunk\handheld\project\android\AndroidManifest.xml'
|
|
|
|
try: stores = sys.argv[2].lower().split(",")
|
|
except: stores = allStores.keys()
|
|
if not General in stores: stores.append(General)
|
|
|
|
print "Manifest file: %s\n"%fn
|
|
|
|
dom = parse(fn)
|
|
root = dom.documentElement
|
|
#print root
|
|
|
|
for s in stores:
|
|
if s not in allStores:
|
|
print "Code '%s' not found"%s
|
|
continue
|
|
print "Running through '%s'"%s
|
|
rules = allStores[s]
|
|
if verify(dom, rules):
|
|
print "Success"
|
|
print "\n"
|
|
|
|
print """
|
|
* Raise version number (versionName and versionCode)
|
|
* Sign the application with same key as always
|
|
* Run zip-align on the signed apk
|
|
"""
|