#!/usr/bin/env python3
"""안드로이드 설정 한 번에 맞추기.
사용: flutter create --platforms=android --org com.friendlymap --project-name friendly_map .
python3 tool/android_patch.py
권한(인터넷, 카메라, 같은 네트워크 발견), 평문 통신(같은 네트워크 직접 연결), minSdk 23 이상을 맞춘다.
여러 번 실행해도 같은 결과가 나온다.
"""
import pathlib, re, sys
root = pathlib.Path(__file__).resolve().parent.parent / "android" / "app"
manifest = root / "src" / "main" / "AndroidManifest.xml"
MIN_SDK = 23
PERMS = [
"android.permission.INTERNET",
"android.permission.ACCESS_NETWORK_STATE",
"android.permission.ACCESS_WIFI_STATE",
"android.permission.CHANGE_WIFI_MULTICAST_STATE",
"android.permission.CAMERA",
"android.permission.ACCESS_FINE_LOCATION",
"android.permission.ACCESS_COARSE_LOCATION",
"android.permission.READ_CALL_LOG",
"android.permission.POST_NOTIFICATIONS",
"android.permission.RECEIVE_BOOT_COMPLETED",
"android.permission.VIBRATE",
]
RECEIVERS = """
"""
def patch_manifest(text: str) -> str:
add = "".join(f' \n' for p in PERMS if p not in text)
if add:
text = re.sub(r"(]*>\s*\n)", lambda m: m.group(1) + add, text, count=1)
if "usesCleartextTraffic" not in text:
text = text.replace("", RECEIVERS + " ", 1)
return text
def patch_gradle(text: str) -> str:
# minSdk 는 23 이상이면 된다. flutter.minSdkVersion(현재 Flutter 는 24)은 그대로 둔다.
# Flutter 는 빌드할 때 자기 최소값보다 낮은 숫자를 flutter.minSdkVersion 으로 되돌리므로 낮추지 않는다.
text = re.sub(r"(minSdk\s*=\s*|minSdkVersion\s+)(\d+)",
lambda m: m.group(1) + str(max(int(m.group(2)), MIN_SDK)), text)
# 예약 알림 플러그인이 요구하는 자바 새 기능 지원(desugaring)
if "isCoreLibraryDesugaringEnabled" not in text and "coreLibraryDesugaringEnabled" not in text:
if "compileOptions {" in text:
flag = "isCoreLibraryDesugaringEnabled = true" if "kotlin" in text or "=" in text.split("compileOptions {")[1][:80] else "coreLibraryDesugaringEnabled true"
text = text.replace("compileOptions {", "compileOptions {\n " + flag, 1)
if "coreLibraryDesugaring(" not in text and "coreLibraryDesugaring '" not in text:
kts = "isCoreLibraryDesugaringEnabled" in text
dep = 'coreLibraryDesugaring("com.android.tools:desugar_jdk_libs:2.1.4")' if kts else "coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:2.1.4'"
text += "\ndependencies {\n " + dep + "\n}\n"
return text
def main() -> int:
if not manifest.exists():
print("android/ 가 비어 있어요. 먼저 flutter create --platforms=android ... . 를 실행해 주세요.")
return 1
manifest.write_text(patch_manifest(manifest.read_text(encoding="utf-8")), encoding="utf-8")
for name in ("build.gradle.kts", "build.gradle"):
g = root / name
if g.exists():
g.write_text(patch_gradle(g.read_text(encoding="utf-8")), encoding="utf-8")
print("안드로이드 설정을 맞췄어요.")
return 0
if __name__ == "__main__":
sys.exit(main())