@code{--force} to force a build of a Disabled application, where normally it
would be completely ignored. Similarly a version that was found to contain
ELFs or known non-free libraries can be forced to build. See also —
-scanignore= in the Build Version section.
+scanignore= and scandelete= in the Build Version section.
If the build was unsuccessful, you can find out why by looking at the output
in the logs/ directory. If that isn't illuminating, try building the app the
android SDK and NDK directories, and maven 3 executable respectively e.g.
for when you need to run @code{android update project} explicitly.
-@item initfun=yes
-Enables a selection of mad hacks to make com.funambol.android build.
-Probably not useful for any other application.
-
@item scanignore=path1;path2;...
Enables one or more files/paths to be exlcuded from the scan process.
This should only be used where there is a very good reason, and
probably accompanied by a comment explaining why it is necessary.
-When scanning, files whose relative paths start with any of the paths
-given here are ignored.
+When scanning the source tree for problems, matching files whose relative
+paths start with any of the paths given here are ignored.
+
+@item scandelete=path1;path2;...
+Similar to scanignore=, but instead of ignoring files under the given paths,
+it tells f-droid to delete the matching files directly.
@item build=xxxx
As for 'prebuild', but runs during the actual build phase (but before the
'oldsdkloc', 'target', 'compilesdk', 'update',
'encoding', 'forceversion', 'forcevercode', 'rm',
'fixtrans', 'fixapos', 'extlibs', 'srclibs',
- 'patch', 'prebuild', 'initfun', 'scanignore', 'build',
+ 'patch', 'prebuild', 'scanignore', 'scandelete', 'build',
'buildjni', 'gradle', 'maven', 'preassemble',
'bindir', 'antcommand', 'novcheck']
raise BuildException('Missing subdir ' + root_dir)
# Initialise submodules if requred...
- if build.get('submodules', 'no') == 'yes':
+ if build.get('submodules', 'no') == 'yes':
if verbose: print "Initialising submodules..."
vcs.initsubmodules()
'youtubeandroidplayerapi',
'bugsense']
- if 'scanignore' in thisbuild:
- ignore = [p.strip() for p in thisbuild['scanignore'].split(';')]
- else:
- ignore = []
-
+ def getpaths(field):
+ paths = []
+ if field not in thisbuild:
+ return paths
+ for p in thisbuild[field].split(';'):
+ p = p.strip()
+ if p == '.':
+ p = '/'
+ elif p.startswith('./'):
+ p = p[1:]
+ elif not p.startswith('/'):
+ p = '/' + p;
+ if p not in paths:
+ paths.append(p)
+ return paths
+
+ scanignore = getpaths('scanignore')
+ scandelete = getpaths('scandelete')
+
ms = magic.open(magic.MIME_TYPE)
ms.load()
+ def toignore(fd):
+ for i in scanignore:
+ if fd.startswith(i):
+ return True
+ return False
+
+ def todelete(fd):
+ for i in scandelete:
+ if fd.startswith(i):
+ return True
+ return False
+
+ def removeproblem(what, fd, fp):
+ print 'Removing %s at %s' % (what, fd)
+ os.remove(fp)
+
+ def handleproblem(what, fd, fp):
+ if todelete(fd):
+ removeproblem(what, fd, fp)
+ else:
+ problems.append('Found %s at %s' % (what, fd))
+
# Iterate through all files in the source code...
for r,d,f in os.walk(build_dir):
for curfile in f:
# Path (relative) to the file...
fp = os.path.join(r, curfile)
- fd = fp[len(build_dir)+1:]
+ fd = fp[len(build_dir):]
# Check if this file has been explicitly excluded from scanning...
- ignorethis = False
- for i in ignore:
- if fd.startswith(i):
- ignorethis = True
- break
- if ignorethis:
+ if toignore(fd):
continue
for suspect in usual_suspects:
if suspect in curfile.lower():
- problems.append('Found usual supect in filename ' + fp)
+ handleproblem('usual supect', fd, fp)
mime = ms.file(fp)
if mime == 'application/x-sharedlib':
- problems.append('Found shared library at %s' % fd)
+ handleproblem('shared library', fd, fp)
elif mime == 'application/x-archive':
- problems.append('Found static library at %s' % fd)
+ handleproblem('static library', fd, fp)
elif mime == 'application/x-executable':
- problems.append('Found binary executable at %s' % fd)
+ handleproblem('binary executable', fd, fp)
elif mime == 'application/jar' and fp.endswith('.apk'):
- print 'Removing apk file at %s' % fd
- os.remove(fp)
+ removeproblem('APK file', fd, fp)
elif curfile.endswith('.java'):
for line in file(fp):
if 'DexClassLoader' in line:
- problems.append('Found DexClassLoader in ' + fp)
+ handleproblem('DexClassLoader', fd, fp)
break
ms.close()