()
| 69 | |
| 70 | |
| 71 | def main(): |
| 72 | args = parse_args() |
| 73 | classes_jar = args.classes_jar.resolve() |
| 74 | bridge_jar = args.bridge_jar.resolve() |
| 75 | jni_libs = args.jni_libs.resolve() |
| 76 | output = args.output.resolve() |
| 77 | |
| 78 | if not classes_jar.is_file(): |
| 79 | raise RuntimeError('classes jar not found: %s' % classes_jar) |
| 80 | if not bridge_jar.is_file(): |
| 81 | raise RuntimeError('SimpleBLE bridge jar not found: %s' % bridge_jar) |
| 82 | if not jni_libs.is_dir(): |
| 83 | raise RuntimeError('jniLibs directory not found: %s' % jni_libs) |
| 84 | |
| 85 | missing_abis = [] |
| 86 | packaged_abis = [] |
| 87 | for abi in ANDROID_ABIS: |
| 88 | abi_dir = jni_libs / abi |
| 89 | if not abi_dir.is_dir(): |
| 90 | missing_abis.append(abi) |
| 91 | continue |
| 92 | missing_libs = [lib for lib in REQUIRED_NATIVE_LIBS if not (abi_dir / lib).is_file()] |
| 93 | if missing_libs: |
| 94 | if args.allow_missing_abis: |
| 95 | missing_abis.append(abi) |
| 96 | continue |
| 97 | raise RuntimeError('ABI %s is missing required libraries: %s' % |
| 98 | (abi, ', '.join(missing_libs))) |
| 99 | packaged_abis.append(abi) |
| 100 | |
| 101 | if not packaged_abis: |
| 102 | raise RuntimeError('no Android ABI directories found in %s' % jni_libs) |
| 103 | if missing_abis and not args.allow_missing_abis: |
| 104 | raise RuntimeError('missing Android ABI directories: %s' % |
| 105 | ', '.join(missing_abis)) |
| 106 | |
| 107 | output.parent.mkdir(parents=True, exist_ok=True) |
| 108 | with tempfile.TemporaryDirectory() as tmp_dir_name: |
| 109 | tmp_dir = Path(tmp_dir_name) |
| 110 | write_manifest(tmp_dir / 'AndroidManifest.xml', args.package_name, args.min_sdk) |
| 111 | copy_android_classes_jar(classes_jar, tmp_dir / 'classes.jar') |
| 112 | copy_file(bridge_jar, tmp_dir / 'libs' / 'simpleble-bridge.jar') |
| 113 | (tmp_dir / 'R.txt').write_text('', encoding='utf-8') |
| 114 | |
| 115 | for abi in packaged_abis: |
| 116 | for native_lib in sorted((jni_libs / abi).glob('*.so')): |
| 117 | copy_file(native_lib, tmp_dir / 'jni' / abi / native_lib.name) |
| 118 | |
| 119 | with zipfile.ZipFile(output, 'w', zipfile.ZIP_DEFLATED) as zip_file: |
| 120 | add_directory_to_zip(zip_file, tmp_dir) |
| 121 | |
| 122 | print('Packaged %s with ABIs: %s' % (output, ', '.join(packaged_abis)), flush=True) |
| 123 | |
| 124 | |
| 125 | if __name__ == '__main__': |
no test coverage detected