From 94d5f8d4cecf4a69aacbcc997a024895ed10c0a0 Mon Sep 17 00:00:00 2001 From: aeclean Date: Thu, 27 Sep 2012 13:08:02 -0300 Subject: [PATCH 1/4] compiling project with libraries dependencies --- src/android/build.py | 40 +++++++++++++++++++++++++++++++++++----- src/android/tools.py | 34 ++++++++++++++++++++++++++++++++-- 2 files changed, 67 insertions(+), 7 deletions(-) diff --git a/src/android/build.py b/src/android/build.py index e699677..08b3331 100644 --- a/src/android/build.py +++ b/src/android/build.py @@ -124,6 +124,7 @@ def __init__(self, version, sdk_dir, ndk_dir, platform_dir, custom_paths={}): self.zipalign = ZipAlign(paths['zipalign']) self.apkbuilder = ApkBuilder(paths['apkbuilder']) self.javac = JavaC(paths['javac']) + if ndk_dir is not None: self.ndk_build = NdkBuild(paths['ndk_build']) self.ndk_clean = NdkClean(paths['ndk_build']) @@ -150,6 +151,7 @@ def generate_r(self, manifest, resource_dir, output_dir): $ aapt package -m -J gen/ -M AndroidManifest.xml -S res/ -I android.jar """ + mkdir(output_dir) log.info(self.aapt( command='package', @@ -204,7 +206,7 @@ def _collect_jars(self, paths): return jar_files def compile_java(self, source_dirs, output_dir, extra_jars=[], - debug=False, target='1.5'): + debug=False, target='1.6'): """Compile all *.java files in ``source_dirs`` (a list of directories) and store the class files in ``output_dir``. @@ -268,6 +270,7 @@ def compile(self, manifest, project_dir, source_dirs, resource_dir, For directories that you do not specifiy a tenmporary directory will be used and deleted after the build. """ + to_delete = [] if not source_gen_dir: source_gen_dir = tempfile.mkdtemp() @@ -308,6 +311,7 @@ def pack_resources(self, manifest, resource_dir, asset_dir=None, if not output: _, output = tempfile.mkstemp(suffix='.ap_') output = path.abspath(output) + print("\n -- %s -- \n" %resource_dir) kwargs = dict( command='package', manifest=manifest, @@ -372,7 +376,7 @@ def align(self, apk, output=None): return Apk(self, outfile) -def get_platform(sdk_path, ndk_dir, target=None): +def get_platform(sdk_path, target=None, ndk_dir=None): """Return path and filename information for the given SDK target. If no target is given, the most recent target is chosen. @@ -504,13 +508,39 @@ def __init__(self, manifest, name=None, platform=None, sdk_dir=None, if target is None: target = self.manifest_parsed.find('uses-sdk')\ .attrib['{http://schemas.android.com/apk/res/android}targetSdkVersion'] - platform = get_platform(sdk_dir, ndk_dir, target) + platform = get_platform(sdk_dir, ndk_dir=ndk_dir, target=target) self.platform = platform # Optional values self.extra_source_dirs = [] self.extra_jars = [] + self.extra_resource_dirs = [] + + #project directory needed for library project dependecies + if project_dir != None: + #get project path + f = open(os.path.join(project_dir,"project.properties")) + lines = f.readlines() + + #workspace dir + fs = project_dir.split("/") + fs.pop() + + workspace_path = "/" + + for fn in fs: + workspace_path = os.path.join(workspace_path,fn) + + #search for library projects in project.properties + for line in lines: + if line.startswith("android.library"): + lname = line.split("/")[-1].rstrip() + library_project = os.path.join(workspace_path, lname) + + self.extra_source_dirs.append( os.path.join(library_project,"src") ) + self.extra_jars.append( os.path.join(library_project,"libs") ) + self.extra_resource_dirs.append( os.path.join(library_project,"res") ) # if no name is given, inspect the manifest self.name = name or self.manifest_parsed.attrib['package'] @@ -530,7 +560,7 @@ def compile(self): manifest=self.manifest, project_dir = self.project_dir, source_dirs=[self.source_dir] + self.extra_source_dirs, - resource_dir=self.resource_dir, + resource_dir=[self.resource_dir] + self.extra_resource_dirs, source_gen_dir=self.gen_dir, class_gen_dir=path.join(self.out_dir, 'classes'), extra_jars=only_existing([self.lib_dir])+self.extra_jars @@ -558,7 +588,7 @@ def build(self, output=None, config=None, package_name=None, self.out_dir, '%s.%s.ap_' % (self.name, config)) kwargs = dict( manifest=self.manifest, - resource_dir=self.resource_dir, + resource_dir=[self.resource_dir] + self.extra_resource_dirs, configurations=config, output=resource_filename, package_name=package_name, diff --git a/src/android/tools.py b/src/android/tools.py index 0d9e29f..816df36 100644 --- a/src/android/tools.py +++ b/src/android/tools.py @@ -15,6 +15,7 @@ """ import subprocess +import collections __all__ = ('ProgramFailedError', 'Aapt', 'Aidl', 'LlvmRs', 'ApkBuilder', @@ -71,6 +72,7 @@ def __call__(self, arguments): along to their caller. """ cmdline = " ".join([self.executable] + arguments) + process = subprocess.Popen([self.executable] + arguments, stderr=subprocess.PIPE, stdout=subprocess.PIPE) @@ -123,7 +125,10 @@ def __call__(self, command, manifest=None, resource_dir=None, args = [command] self.extend_args(args, ['-m'], make_dirs) self.extend_args(args, ['-M', manifest]) - self.extend_args(args, ['-S', resource_dir]) + + for item in resource_dir: + self.extend_args(args, ['-S', item]) + self.extend_args(args, ['-A', asset_dir]) self.extend_args(args, ['-c', configurations]) if overwrite_version_code: @@ -137,6 +142,9 @@ def __call__(self, command, manifest=None, resource_dir=None, self.extend_args(args, ['-F', apk_output]) self.extend_args(args, ['-J', r_output]) self.extend_args(args, ['-f'], overwrite) + self.extend_args(args, ["--auto-add-overlay"]) + self.extend_args(args, ["--no-crunch"]) + return Program.__call__(self, args) @@ -191,6 +199,7 @@ def __call__(self, project_path): """ args = [] self.extend_args(args, ["-C", project_path]) + return Program.__call__(self, args) class NdkClean(Program): @@ -252,12 +261,33 @@ def __call__(self, files, output=None): """ files A set of class files, .zip/.jar/.apk archives or - directories. + directories.q output Target output file (--output). """ args = ['--dex'] + + jar_list = [] + for item in files: + if item.endswith(".jar"): + fname = item.split('/') + fname = fname[-1] + + jar_list.append(fname) + + counter_list = collections.Counter(jar_list) + repeated_elements = [i for i in counter_list if counter_list[i] > 1] + + for jar in files: + fname = jar.split("/") + fname = fname[-1] + + for item in repeated_elements: + if item == fname: + files.remove(jar) + repeated_elements.remove(item) + self.extend_args(args, ["--output=%s" % output]) args.extend(files) return Program.__call__(self, args) From a6ffbb0ce0ecb7d905c1086b3b70457a950de0dd Mon Sep 17 00:00:00 2001 From: aeclean Date: Fri, 28 Sep 2012 11:26:10 -0300 Subject: [PATCH 2/4] project with libraries dependencies --- src/android/build.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/android/build.py b/src/android/build.py index 08b3331..f8b0d96 100644 --- a/src/android/build.py +++ b/src/android/build.py @@ -151,7 +151,6 @@ def generate_r(self, manifest, resource_dir, output_dir): $ aapt package -m -J gen/ -M AndroidManifest.xml -S res/ -I android.jar """ - mkdir(output_dir) log.info(self.aapt( command='package', @@ -311,7 +310,7 @@ def pack_resources(self, manifest, resource_dir, asset_dir=None, if not output: _, output = tempfile.mkstemp(suffix='.ap_') output = path.abspath(output) - print("\n -- %s -- \n" %resource_dir) + kwargs = dict( command='package', manifest=manifest, From 4309f030593b8d0d6e7a36a5064aa5a152bc48a5 Mon Sep 17 00:00:00 2001 From: aeclean Date: Thu, 16 May 2013 17:07:15 -0300 Subject: [PATCH 3/4] checkout commit --- src/android/build.py | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/src/android/build.py b/src/android/build.py index f8b0d96..a8d1ee3 100644 --- a/src/android/build.py +++ b/src/android/build.py @@ -124,7 +124,6 @@ def __init__(self, version, sdk_dir, ndk_dir, platform_dir, custom_paths={}): self.zipalign = ZipAlign(paths['zipalign']) self.apkbuilder = ApkBuilder(paths['apkbuilder']) self.javac = JavaC(paths['javac']) - if ndk_dir is not None: self.ndk_build = NdkBuild(paths['ndk_build']) self.ndk_clean = NdkClean(paths['ndk_build']) @@ -516,13 +515,13 @@ def __init__(self, manifest, name=None, platform=None, sdk_dir=None, self.extra_jars = [] self.extra_resource_dirs = [] - #project directory needed for library project dependecies + # project directory needed for library project dependecies if project_dir != None: - #get project path + # get project path f = open(os.path.join(project_dir,"project.properties")) lines = f.readlines() - #workspace dir + # workspace dir fs = project_dir.split("/") fs.pop() @@ -531,15 +530,15 @@ def __init__(self, manifest, name=None, platform=None, sdk_dir=None, for fn in fs: workspace_path = os.path.join(workspace_path,fn) - #search for library projects in project.properties + # search for library projects in project.properties for line in lines: if line.startswith("android.library"): lname = line.split("/")[-1].rstrip() library_project = os.path.join(workspace_path, lname) - self.extra_source_dirs.append( os.path.join(library_project,"src") ) - self.extra_jars.append( os.path.join(library_project,"libs") ) - self.extra_resource_dirs.append( os.path.join(library_project,"res") ) + self.extra_source_dirs.append(os.path.join(library_project,"src")) + self.extra_jars.append(os.path.join(library_project,"libs")) + self.extra_resource_dirs.append(os.path.join(library_project,"res")) # if no name is given, inspect the manifest self.name = name or self.manifest_parsed.attrib['package'] From 2e70faf771191c3f243f9a2311bf015860fa28ff Mon Sep 17 00:00:00 2001 From: aeclean Date: Mon, 3 Jun 2013 14:23:18 -0300 Subject: [PATCH 4/4] Changed android sdk paths to work on adt 22 --- src/android/build.py | 14 +++++++------- src/android/tools.py | 17 +++++++++-------- 2 files changed, 16 insertions(+), 15 deletions(-) diff --git a/src/android/build.py b/src/android/build.py index a8d1ee3..8c8976e 100644 --- a/src/android/build.py +++ b/src/android/build.py @@ -96,13 +96,13 @@ def __init__(self, version, sdk_dir, ndk_dir, platform_dir, custom_paths={}): # in ``com.android.sdklib.PlatformTarget`` and # ``com.android.sdklib.SdkConstants``. paths = dict( - aapt =path.join(sdk_dir, 'platform-tools', + aapt =path.join(sdk_dir, 'build-tools/17.0.0', 'aapt.exe' if sys.platform=='win32' else 'aapt'), - aidl = path.join(sdk_dir, 'platform-tools', + aidl = path.join(sdk_dir, 'build-tools/17.0.0', 'aidl.exe' if sys.platform=='win32' else 'aidl'), - llvmrs = path.join(sdk_dir, 'platform-tools', + llvmrs = path.join(sdk_dir, 'build-tools/17.0.0', 'llvm-rs-cc.exe' if sys.platform=='win32' else 'llvm-rs-cc'), - dx = path.join(sdk_dir, 'platform-tools', + dx = path.join(sdk_dir, 'build-tools/17.0.0', 'dx.bat' if sys.platform=='win32' else 'dx'), apkbuilder = path.join(sdk_dir, 'tools', 'apkbuilder.bat' if sys.platform=='win32' else 'apkbuilder'), @@ -268,7 +268,7 @@ def compile(self, manifest, project_dir, source_dirs, resource_dir, For directories that you do not specifiy a tenmporary directory will be used and deleted after the build. """ - + to_delete = [] if not source_gen_dir: source_gen_dir = tempfile.mkdtemp() @@ -309,7 +309,7 @@ def pack_resources(self, manifest, resource_dir, asset_dir=None, if not output: _, output = tempfile.mkstemp(suffix='.ap_') output = path.abspath(output) - + kwargs = dict( command='package', manifest=manifest, @@ -526,7 +526,7 @@ def __init__(self, manifest, name=None, platform=None, sdk_dir=None, fs.pop() workspace_path = "/" - + for fn in fs: workspace_path = os.path.join(workspace_path,fn) diff --git a/src/android/tools.py b/src/android/tools.py index 816df36..e926f07 100644 --- a/src/android/tools.py +++ b/src/android/tools.py @@ -72,7 +72,7 @@ def __call__(self, arguments): along to their caller. """ cmdline = " ".join([self.executable] + arguments) - + process = subprocess.Popen([self.executable] + arguments, stderr=subprocess.PIPE, stdout=subprocess.PIPE) @@ -125,7 +125,7 @@ def __call__(self, command, manifest=None, resource_dir=None, args = [command] self.extend_args(args, ['-m'], make_dirs) self.extend_args(args, ['-M', manifest]) - + for item in resource_dir: self.extend_args(args, ['-S', item]) @@ -144,7 +144,7 @@ def __call__(self, command, manifest=None, resource_dir=None, self.extend_args(args, ['-f'], overwrite) self.extend_args(args, ["--auto-add-overlay"]) self.extend_args(args, ["--no-crunch"]) - + return Program.__call__(self, args) @@ -173,11 +173,11 @@ def __call__(self, aidl_file, preprocessed=None, search_path=None, self.extend_args(args, ['-o%s' % output_folder], output_folder) self.extend_args(args, [aidl_file]) return Program.__call__(self, args) - + class LlvmRs(Program): """Interface to the command line llvm renderscript compiler, ``llvm-rs-cc`` """ - + def __call__(self, resource_dir, resource_gen_dir, source_files, include_dirs): args = [] for include in include_dirs: @@ -191,7 +191,7 @@ def __call__(self, resource_dir, resource_gen_dir, source_files, include_dirs): class NdkBuild(Program): """Interface to the command line c/c++ compiler, ``ndk-build`` """ - + def __call__(self, project_path): """ project_path @@ -199,7 +199,7 @@ def __call__(self, project_path): """ args = [] self.extend_args(args, ["-C", project_path]) - + return Program.__call__(self, args) class NdkClean(Program): @@ -267,7 +267,7 @@ def __call__(self, files, output=None): Target output file (--output). """ args = ['--dex'] - + jar_list = [] for item in files: if item.endswith(".jar"): @@ -325,6 +325,7 @@ def __call__(self, outputfile, dex=None, zips=[], source_dirs=[], args = [outputfile] args.extend(['-u']) # unsigned self.extend_args(args, ['-f', dex]) + for zip in zips: args.extend(['-z', zip]) for source_dir in source_dirs: