feat: 构建flutter 基座

This commit is contained in:
Booker
2026-05-18 13:36:54 +07:00
parent ce8ce5ec13
commit 37e4d73861
75 changed files with 3887 additions and 132 deletions

View File

@@ -0,0 +1,942 @@
import java.util.UUID
import java.security.SecureRandom
import java.util.Base64
plugins {
id("com.android.application") version "8.9.1"
id("org.jetbrains.kotlin.android") version "2.1.0"
// The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins.
id("dev.flutter.flutter-gradle-plugin")
// id("com.google.gms.google-services") // Temporarily disabled
}
// 助记词风格词表BIP39 风格,仅小写字母,符合 Android 包名规范)
// 用于生成类似冷钱包助记词的包名,如 com.abandon.ability.able.above
val MNEMONIC_WORDS = listOf(
"abandon", "ability", "able", "about", "above", "absent", "absorb", "abstract", "absurd", "abuse",
"access", "accident", "account", "accuse", "achieve", "acid", "acoustic", "acquire", "across", "act",
"action", "actor", "actress", "actual", "adapt", "add", "addict", "address", "adjust", "admit",
"adult", "advance", "advice", "aerobic", "affair", "afford", "afraid", "again", "age", "agent",
"agree", "ahead", "aim", "air", "airport", "aisle", "alarm", "album", "alcohol", "alert",
"alien", "all", "alley", "allow", "almost", "alone", "alpha", "already", "also", "alter",
"always", "amateur", "amazing", "among", "amount", "amused", "analyst", "anchor", "ancient", "anger",
"angle", "angry", "animal", "ankle", "announce", "annual", "another", "answer", "antenna", "antique",
"anxiety", "any", "apart", "apology", "appear", "apple", "approve", "april", "arch", "arctic",
"area", "arena", "argue", "arm", "armed", "armor", "army", "around", "arrange", "arrest",
"arrive", "arrow", "art", "artefact", "artist", "artwork", "ask", "aspect", "assault", "asset",
"assist", "assume", "asthma", "athlete", "atom", "attack", "attend", "attitude", "attract", "auction",
"audit", "august", "aunt", "author", "auto", "autumn", "average", "avocado", "avoid", "awake",
"aware", "away", "awesome", "awful", "axis", "baby", "bachelor", "bacon", "badge", "bag",
"balance", "balcony", "ball", "bamboo", "banana", "banner", "bar", "barely", "bargain", "barrel",
"base", "basic", "basket", "battle", "beach", "bean", "beauty", "because", "become", "beef",
"before", "begin", "behave", "behind", "believe", "below", "belt", "bench", "benefit", "best",
"betray", "better", "between", "beyond", "bicycle", "bid", "bike", "bind", "biology", "bird",
"birth", "bitter", "black", "blade", "blame", "blanket", "blast", "bleak", "bless", "blind",
"blood", "blossom", "blouse", "blue", "blur", "blush", "board", "boat", "body", "boil",
"bomb", "bone", "bonus", "book", "boost", "border", "boring", "borrow", "boss", "bottom",
"bounce", "box", "boy", "bracket", "brain", "brand", "brass", "brave", "bread", "breeze",
"brick", "bridge", "brief", "bright", "bring", "brisk", "broccoli", "broken", "bronze", "broom",
"brother", "brown", "brush", "bubble", "buddy", "budget", "buffalo", "build", "bulb", "bulk",
"bullet", "bundle", "bunker", "burden", "burger", "burst", "bus", "business", "busy", "butter",
"buyer", "buzz", "cabbage", "cabin", "cable", "cactus", "cage", "cake", "call", "calm",
"camera", "camp", "can", "canal", "cancel", "candy", "cannon", "canoe", "canvas", "canyon",
"capable", "capital", "captain", "car", "carbon", "card", "cargo", "carpet", "carry", "cart",
"case", "cash", "casino", "castle", "casual", "cat", "catalog", "catch", "category", "cattle",
"caught", "cause", "caution", "cave", "ceiling", "celery", "cement", "census", "century", "cereal",
"certain", "chair", "chalk", "champion", "change", "chaos", "chapter", "charge", "chase", "chat",
"cheap", "check", "cheese", "chef", "cherry", "chest", "chicken", "chief", "child", "chimney",
"choice", "choose", "chronic", "chuckle", "chunk", "churn", "cigar", "cinnamon", "circle", "citizen",
"city", "civil", "claim", "clap", "clarify", "claw", "clay", "clean", "clerk", "clever",
"click", "client", "cliff", "climb", "clinic", "clip", "clock", "clog", "close", "cloth",
"cloud", "clown", "club", "clump", "cluster", "clutch", "coach", "coast", "coconut", "code",
"coffee", "coil", "coin", "collect", "color", "column", "combine", "come", "comfort", "comic",
"common", "company", "concert", "conduct", "confirm", "congress", "connect", "consider", "control", "convince",
"cook", "cool", "copper", "copy", "coral", "core", "corn", "correct", "cost", "cotton",
"couch", "country", "couple", "course", "cousin", "cover", "coyote", "crack", "cradle", "craft",
"cram", "crane", "crash", "crater", "crawl", "crazy", "cream", "credit", "creek", "crew",
"cricket", "crime", "crisp", "critic", "crop", "cross", "crouch", "crowd", "crucial", "cruel",
"cruise", "crumble", "crunch", "crush", "cry", "crystal", "cube", "culture", "cup", "cupboard",
"curious", "current", "curtain", "curve", "cushion", "custom", "cute", "cycle", "dad", "damage",
"damp", "dance", "danger", "daring", "dash", "daughter", "dawn", "day", "deal", "debate",
"debris", "decade", "december", "decide", "decline", "decorate", "decrease", "deer", "defense", "define",
"defy", "degree", "delay", "deliver", "demand", "demise", "denial", "dentist", "deny", "depart",
"depend", "deposit", "depth", "deputy", "derive", "describe", "desert", "design", "desk", "despair",
"destroy", "detail", "detect", "develop", "device", "devote", "diagram", "dial", "diamond", "diary",
"dice", "diesel", "diet", "differ", "digital", "dignity", "dilemma", "dinner", "dinosaur", "direct",
"dirt", "disagree", "discover", "disease", "dish", "dismiss", "disorder", "display", "distance", "divert",
"divide", "divorce", "dizzy", "doctor", "document", "dog", "doll", "dolphin", "domain", "donate",
"donkey", "donor", "door", "dose", "double", "dove", "draft", "dragon", "drama", "drastic",
"draw", "dream", "dress", "drift", "drill", "drink", "drip", "drive", "drop", "drum",
"dry", "duck", "dumb", "dune", "during", "dust", "dutch", "duty", "dwarf", "dynamic",
"eager", "eagle", "early", "earn", "earth", "easily", "east", "easy", "echo", "ecology",
"economy", "edge", "edit", "educate", "effort", "egg", "eight", "either", "elbow", "elder",
"electric", "elegant", "element", "elephant", "elevator", "elite", "else", "embark", "embody", "embrace",
"emerge", "emotion", "employ", "empower", "empty", "enable", "enact", "end", "endless", "endorse",
"enemy", "energy", "enforce", "engage", "engine", "enhance", "enjoy", "enlist", "enough", "enrich",
"enroll", "ensure", "enter", "entire", "entry", "envelope", "episode", "equal", "equip", "era",
"erase", "erode", "erosion", "error", "erupt", "escape", "essay", "essence", "estate", "eternal",
"ethics", "evidence", "evil", "evoke", "evolve", "exact", "example", "excess", "exchange", "excite",
"exclude", "excuse", "execute", "exercise", "exhaust", "exhibit", "exile", "exist", "exit", "exotic",
"expand", "expect", "expire", "explain", "expose", "express", "extend", "extra", "eye", "eyebrow",
"fabric", "face", "faculty", "fade", "faint", "faith", "fall", "false", "fame", "family",
"famous", "fan", "fancy", "fantasy", "farm", "fashion", "fat", "fatal", "father", "fatigue",
"fault", "favorite", "feature", "february", "federal", "fee", "feed", "feel", "female", "fence",
"festival", "fetch", "fever", "few", "fiber", "fiction", "field", "figure", "file", "film",
"filter", "final", "find", "fine", "finger", "finish", "fire", "firm", "first", "fiscal",
"fish", "fit", "fitness", "fix", "flag", "flame", "flash", "flat", "flavor", "flee",
"flight", "flip", "float", "flock", "floor", "flower", "fluid", "flush", "fly", "foam",
"focus", "fog", "foil", "fold", "follow", "food", "foot", "force", "forest", "forget",
"fork", "fortune", "forum", "forward", "fossil", "foster", "found", "fox", "fragile", "frame",
"frequent", "fresh", "friend", "fringe", "frog", "front", "frost", "frown", "frozen", "fruit",
"fuel", "fun", "funny", "furnace", "fury", "future", "gadget", "gain", "galaxy", "gallery",
"game", "gap", "garage", "garbage", "garden", "garlic", "garment", "gas", "gasp", "gate",
"gather", "gauge", "gaze", "general", "genius", "genre", "gentle", "genuine", "gesture", "ghost",
"giant", "gift", "giggle", "ginger", "giraffe", "girl", "give", "glad", "glance", "glare",
"glass", "glide", "glimpse", "globe", "gloom", "glory", "glove", "glow", "glue", "goat",
"goddess", "gold", "good", "goose", "gorilla", "gospel", "gossip", "govern", "gown", "grab",
"grace", "grain", "grant", "grape", "grass", "gravity", "great", "green", "grid", "grief",
"grit", "grocery", "group", "grow", "grunt", "guard", "guess", "guide", "guilt", "guitar",
"gun", "gym", "habit", "hair", "half", "hammer", "hamster", "hand", "happy", "harbor",
"hard", "harsh", "harvest", "hat", "have", "hawk", "hazard", "head", "health", "heart",
"heavy", "hedgehog", "height", "hello", "helmet", "help", "hen", "hero", "hidden", "high",
"hill", "hint", "hip", "hire", "history", "hobby", "hockey", "hold", "hole", "holiday",
"hollow", "home", "honey", "hood", "hope", "horn", "horror", "horse", "hospital", "host",
"hotel", "hour", "hover", "hub", "huge", "human", "humble", "humor", "hundred", "hungry",
"hunt", "hurdle", "hurry", "hurt", "husband", "hybrid", "ice", "icon", "idea", "identify",
"idle", "ignore", "ill", "illegal", "illness", "image", "imitate", "immense", "immune", "impact",
"impose", "improve", "impulse", "inch", "include", "income", "increase", "index", "indicate", "indoor",
"industry", "infant", "inflict", "inform", "inhale", "inherit", "initial", "inject", "injury", "inmate",
"inner", "innocent", "input", "inquiry", "insane", "insect", "inside", "inspire", "install", "intact",
"interest", "into", "invest", "invite", "involve", "iron", "island", "isolate", "issue", "item",
"ivy", "jacket", "jaguar", "jar", "jazz", "jealous", "jeans", "jelly", "jewel", "job",
"join", "joke", "journey", "joy", "judge", "juice", "jump", "jungle", "junior", "junk",
"just", "kangaroo", "keen", "keep", "ketchup", "key", "kick", "kid", "kidney", "kind",
"kingdom", "kiss", "kit", "kitchen", "kite", "kitten", "kiwi", "knee", "knife", "knock",
"know", "lab", "label", "labor", "ladder", "lady", "lake", "lamp", "language", "laptop",
"large", "later", "latin", "laugh", "laundry", "lava", "law", "lawn", "lawsuit", "layer",
"lazy", "leader", "leaf", "learn", "leave", "lecture", "left", "leg", "legal", "legend",
"leisure", "lemon", "lend", "length", "lens", "leopard", "lesson", "letter", "level", "liar",
"liberty", "library", "license", "life", "lift", "light", "like", "limb", "limit", "link",
"lion", "liquid", "list", "little", "live", "lizard", "load", "loan", "lobster", "local",
"lock", "logic", "lonely", "long", "loop", "lottery", "loud", "lounge", "love", "loyal",
"lucky", "luggage", "lumber", "lunar", "lunch", "luxury", "lyrics", "machine", "mad", "magic",
"magnet", "maid", "mail", "main", "major", "make", "mammal", "man", "manage", "mandate",
"mango", "mansion", "manual", "maple", "marble", "march", "margin", "marine", "market", "marriage",
"mask", "mass", "master", "match", "material", "math", "matrix", "matter", "maximum", "maze",
"meadow", "mean", "measure", "meat", "mechanic", "medal", "media", "melody", "melt", "member",
"memory", "mention", "menu", "mercy", "merge", "merit", "merry", "mesh", "message", "metal",
"method", "middle", "midnight", "milk", "million", "mimic", "mind", "minimum", "minor", "minute",
"miracle", "mirror", "misery", "miss", "mistake", "mix", "mixed", "mixture", "mobile", "model",
"modify", "mom", "moment", "monitor", "monkey", "monster", "month", "moon", "moral", "more",
"morning", "mosquito", "mother", "motion", "motor", "mountain", "mouse", "move", "movie", "much",
"muffin", "mule", "multiply", "muscle", "museum", "mushroom", "music", "must", "mutual", "myself",
"mystery", "myth", "naive", "name", "napkin", "narrow", "nasty", "nation", "nature", "near",
"neck", "need", "negative", "neglect", "neither", "nephew", "nerve", "nest", "net", "network",
"neutral", "never", "news", "next", "nice", "night", "noble", "noise", "nominee", "noodle",
"normal", "north", "nose", "notable", "note", "nothing", "notice", "novel", "now", "nuclear",
"number", "nurse", "nut", "oak", "obey", "object", "oblige", "obscure", "observe", "obtain",
"obvious", "occur", "ocean", "october", "odor", "off", "offer", "office", "often", "oil",
"okay", "old", "olive", "olympic", "omit", "once", "one", "onion", "online", "only",
"open", "opera", "opinion", "oppose", "option", "orange", "orbit", "orchard", "order", "ordinary",
"organ", "orient", "original", "orphan", "ostrich", "other", "outdoor", "outer", "output", "outside",
"oval", "oven", "over", "own", "owner", "oxygen", "oyster", "ozone", "pact", "paddle",
"page", "pair", "palace", "palm", "panda", "panel", "panic", "panther", "paper", "parade",
"parent", "park", "parrot", "party", "pass", "patch", "path", "patient", "patrol", "pattern",
"pause", "pave", "payment", "peace", "peanut", "pear", "peasant", "pelican", "pen", "penalty",
"pencil", "people", "pepper", "perfect", "permit", "person", "pet", "phone", "photo", "phrase",
"physical", "piano", "picnic", "picture", "piece", "pig", "pigeon", "pill", "pilot", "pink",
"pioneer", "pipe", "pistol", "pitch", "pizza", "place", "planet", "plastic", "plate", "play",
"please", "pledge", "pluck", "plug", "plunge", "poem", "poet", "point", "polar", "pole",
"police", "pond", "pony", "pool", "popular", "portion", "position", "possible", "post", "potato",
"pottery", "poverty", "powder", "power", "practice", "praise", "predict", "prefer", "prepare", "present",
"pretty", "prevent", "price", "pride", "primary", "print", "priority", "prison", "private", "prize",
"problem", "process", "produce", "profit", "program", "project", "promote", "proof", "property", "prosper",
"protect", "proud", "provide", "public", "pudding", "pull", "pulp", "pulse", "pumpkin", "punch",
"pupil", "puppy", "purchase", "purity", "purpose", "purse", "push", "put", "puzzle", "pyramid",
"quality", "quantum", "quarter", "question", "quick", "quit", "quiz", "quote", "rabbit", "raccoon",
"race", "rack", "radar", "radio", "rail", "rain", "raise", "rally", "ramp", "ranch",
"random", "range", "rapid", "rare", "rate", "rather", "raven", "raw", "razor", "ready",
"real", "reason", "rebel", "rebuild", "recall", "receive", "recipe", "record", "recycle", "reduce",
"reflect", "reform", "refuse", "region", "regret", "regular", "reject", "relax", "release", "relief",
"rely", "remain", "remember", "remind", "remove", "render", "renew", "rent", "reopen", "repair",
"repeat", "replace", "report", "require", "rescue", "resemble", "resist", "resource", "response", "result",
"retire", "retreat", "return", "reunion", "reveal", "review", "reward", "rhythm", "rib", "ribbon",
"rice", "rich", "ride", "ridge", "rifle", "right", "rigid", "ring", "riot", "ripple",
"risk", "ritual", "rival", "river", "road", "roast", "robot", "robust", "rocket", "romance",
"roof", "rookie", "room", "rose", "rotate", "rough", "round", "route", "royal", "rubber",
"rude", "rug", "rule", "run", "runway", "rural", "sad", "saddle", "sadness", "safe",
"sail", "salad", "salmon", "salon", "salt", "salute", "same", "sample", "sand", "satisfy",
"satoshi", "sauce", "sausage", "save", "say", "scale", "scan", "scare", "scatter", "scene",
"scheme", "school", "science", "scissors", "scorpion", "scout", "scrap", "screen", "script", "scrub",
"sea", "search", "season", "seat", "second", "secret", "section", "security", "seed", "seek",
"segment", "select", "sell", "seminar", "senior", "sense", "sentence", "series", "service", "session",
"settle", "setup", "seven", "shadow", "shaft", "shallow", "share", "shed", "shell", "sheriff",
"shield", "shift", "shine", "ship", "shiver", "shock", "shoe", "shoot", "shop", "short",
"shoulder", "shove", "shrimp", "shrug", "shuffle", "shy", "sibling", "sick", "side", "siege",
"sight", "sign", "silent", "silk", "silly", "silver", "similar", "simple", "since", "sing",
"siren", "sister", "situate", "six", "size", "skate", "sketch", "ski", "skill", "skin",
"skirt", "skull", "slab", "slam", "sleep", "slender", "slice", "slide", "slight", "slim",
"slogan", "slot", "slow", "slush", "small", "smart", "smile", "smoke", "smooth", "snack",
"snake", "snap", "sniff", "snow", "soap", "soccer", "social", "sock", "soda", "soft",
"solar", "soldier", "solid", "solution", "solve", "someone", "song", "soon", "sorry", "sort",
"soul", "sound", "soup", "source", "south", "space", "spare", "spatial", "spawn", "speak",
"special", "speed", "spell", "spend", "sphere", "spice", "spider", "spike", "spin", "spirit",
"split", "spoil", "sponsor", "spoon", "sport", "spot", "spray", "spread", "spring", "spy",
"square", "squeeze", "squirrel", "stable", "stadium", "staff", "stage", "stairs", "stamp", "stand",
"start", "state", "stay", "steak", "steel", "stem", "step", "stereo", "stick", "still",
"sting", "stock", "stomach", "stone", "stool", "story", "stove", "strategy", "street", "strike",
"strong", "struggle", "student", "stuff", "stumble", "style", "subject", "submit", "subway", "success",
"such", "sudden", "suffer", "sugar", "suggest", "suit", "summer", "sun", "sunny", "sunset",
"super", "supply", "supreme", "sure", "surface", "surge", "surprise", "surround", "survey", "suspect",
"sustain", "swallow", "swamp", "swap", "swarm", "swear", "sweet", "swift", "swim", "swing",
"switch", "sword", "symbol", "symptom", "syrup", "system", "table", "tackle", "tag", "tail",
"talent", "talk", "tank", "tape", "target", "task", "taste", "tattoo", "taxi", "teach",
"team", "tell", "ten", "tenant", "tennis", "tent", "term", "test", "text", "thank",
"that", "theme", "then", "theory", "there", "they", "thing", "this", "thought", "three",
"thrive", "throw", "thumb", "thunder", "ticket", "tide", "tiger", "tilt", "timber", "time",
"tiny", "tip", "tired", "tissue", "title", "toast", "tobacco", "today", "toddler", "toe",
"together", "toilet", "token", "tomato", "tomorrow", "tone", "tongue", "tonight", "tool", "tooth",
"top", "topic", "topple", "torch", "tornado", "tortoise", "toss", "total", "tourist", "toward",
"tower", "town", "toy", "track", "trade", "traffic", "tragic", "train", "transfer", "trap",
"trash", "travel", "tray", "treat", "tree", "trend", "trial", "tribe", "trick", "trigger",
"trim", "trip", "trophy", "trouble", "truck", "true", "truly", "trumpet", "trust", "truth",
"try", "tube", "tuition", "tumble", "tuna", "tunnel", "turkey", "turn", "turtle", "twelve",
"twenty", "twice", "twin", "twist", "two", "type", "typical", "ugly", "umbrella", "unable",
"uncle", "uncover", "under", "undo", "unfair", "unfold", "unhappy", "uniform", "unique", "unit",
"universe", "unknown", "unlock", "until", "unusual", "unveil", "update", "upgrade", "uphold", "upon",
"upper", "upset", "urban", "urge", "usage", "use", "used", "useful", "useless", "usual",
"utility", "vacant", "vacuum", "vague", "valid", "valley", "valve", "van", "vanish", "vapor",
"various", "vast", "vault", "vehicle", "velvet", "vendor", "venture", "venue", "verb", "verify",
"version", "very", "vessel", "veteran", "viable", "vibrant", "vicious", "victory", "video", "view",
"village", "vintage", "violin", "virtual", "virus", "visa", "visit", "visual", "vital", "vivid",
"vocal", "voice", "void", "volcano", "volume", "vote", "voyage", "wage", "wagon", "wait",
"walk", "wall", "walnut", "want", "warfare", "warm", "warrior", "wash", "wasp", "waste",
"water", "wave", "way", "wealth", "weapon", "wear", "weasel", "weather", "web", "wedding",
"weekend", "weird", "welcome", "west", "wet", "whale", "what", "wheat", "wheel", "when",
"where", "whip", "whisper", "wide", "width", "wife", "wild", "will", "win", "window",
"wine", "wing", "wink", "winner", "winter", "wire", "wisdom", "wise", "wish", "witness",
"wolf", "woman", "wonder", "wood", "wool", "word", "work", "world", "worry", "worth",
"wrap", "wreck", "wrestle", "wrist", "write", "wrong", "yard", "year", "yellow", "you",
"young", "youth", "zebra", "zero", "zone", "zoo"
)
// 扩展助记词表(约 4 倍于基础词表,合计约 5 倍词库)
val MNEMONIC_WORDS_EXTRA = listOf(
"abacus", "abbey", "abbreviation", "abdomen", "abide", "aboard", "abolish", "abound", "abrasive", "abreast",
"abridge", "abroad", "abrupt", "absentee", "absorbent", "abstain", "abstract", "absurdity", "abundance", "abundant",
"abuse", "abyss", "academia", "academic", "academy", "accelerate", "accent", "accept", "acceptable", "accessory",
"acclaim", "acclimate", "accolade", "accommodate", "accompany", "accomplice", "accomplish", "accord", "accordion", "accountant",
"accreditation", "accumulate", "accuracy", "accusation", "accustom", "acetone", "achieve", "aching", "acidic", "acknowledge",
"acoustic", "acquaint", "acquire", "acquisition", "acrobat", "acronym", "acropolis", "acrylic", "acting", "activation",
"activist", "activity", "actuality", "acumen", "acupuncture", "adaptation", "adapter", "addiction", "additive", "address",
"adept", "adequacy", "adhesive", "adjacent", "adjective", "adjourn", "adjustment", "admin", "admiral", "admission",
"adobe", "adolescent", "adoption", "adrenaline", "adult", "advancement", "advent", "adventure", "adverb", "adversary",
"adverse", "advertise", "advertisement", "advocate", "aerial", "aerobic", "aerospace", "aesthetic", "affection", "affidavit",
"affiliate", "affinity", "affirmation", "afford", "affordable", "aftermath", "afternoon", "afterward", "agenda", "aggregate",
"aggression", "aggressive", "agile", "agility", "agony", "agreeable", "agreement", "agriculture", "ahead", "ailment",
"airline", "airplane", "airspace", "airway", "aisle", "alarm", "albatross", "alchemy", "alcohol", "algebra",
"algorithm", "alignment", "alimony", "allegation", "allegiance", "allegory", "allergy", "alleyway", "alliance", "alligator",
"allocation", "allotment", "allowance", "alloy", "allure", "almond", "alphabet", "altar", "alteration", "alternate",
"alternative", "altitude", "alto", "aluminum", "alumni", "amalgam", "amateur", "amazing", "ambassador", "amber",
"ambiguity", "ambiguous", "ambition", "ambitious", "ambulance", "ambush", "amendment", "amenity", "ammonia", "ammunition",
"amnesia", "amnesty", "amplifier", "amplify", "amputate", "amusement", "analog", "analogy", "analyst", "analytical",
"anarchist", "anarchy", "anatomy", "ancestor", "ancestry", "anchovy", "anecdote", "anemia", "anesthesia", "angel",
"angler", "anguish", "angular", "animation", "animosity", "anklet", "annex", "anniversary", "announcement", "announcer",
"annual", "annuity", "anomaly", "anonymous", "antagonist", "antarctic", "anteater", "antelope", "antenna", "anthem",
"anthology", "anthropology", "antibiotic", "antibody", "anticipate", "anticipation", "antidote", "antique", "antiquity", "antler",
"antonym", "anxiety", "apartment", "apex", "apology", "apostle", "apparatus", "apparel", "appetite", "appetizer",
"appliance", "applicant", "application", "appointment", "appraisal", "appreciate", "appreciation", "apprentice", "approach", "approval",
"approximate", "apricot", "aquarium", "aquatic", "arbiter", "arbitrary", "arbitration", "arbor", "arcade", "archaeology",
"archbishop", "architect", "architecture", "archive", "ardent", "arena", "argon", "argument", "aristocrat", "arithmetic",
"armadillo", "armament", "armchair", "armful", "armistice", "armory", "aroma", "aromatic", "arousal", "arrangement",
"array", "arrears", "arrogant", "arrowhead", "arson", "artery", "artichoke", "articulate", "artifact", "artisan",
"artistry", "ascend", "ascent", "ascertain", "ascribe", "asphalt", "aspiration", "aspirin", "assassin", "assault",
"assemblage", "assembly", "assertion", "assessment", "assignment", "assimilation", "assistance", "assistant", "associate", "association",
"assumption", "assurance", "asteroid", "asthma", "astrology", "astronaut", "astronomy", "asymmetric", "atheist", "athletic",
"atmosphere", "atom", "atomic", "atrocity", "attachment", "attacker", "attainment", "attendance", "attendant", "attention",
"attest", "attic", "attitude", "attorney", "attraction", "attractive", "attribute", "auctioneer", "audience", "auditor",
"auditory", "augment", "august", "aurora", "auspicious", "authentic", "authority", "authorization", "autobiography", "automation",
"automobile", "autonomy", "autumn", "availability", "avalanche", "avatar", "avenger", "aviation", "aviator", "avocado",
"avoidance", "awakening", "award", "awareness", "awful", "awkward", "backbone", "backdrop", "backfire", "background",
"backpack", "backup", "backward", "bacon", "bacteria", "bacterial", "badge", "badger", "badminton", "bagel",
"baggage", "bagpipe", "bailiff", "bakery", "balance", "balcony", "ballet", "balloon", "ballot", "ballroom",
"bamboo", "banister", "banjo", "banker", "banking", "bankruptcy", "banquet", "barbecue", "barbarian", "barbecue",
"barber", "barcode", "barefoot", "bargain", "barge", "baritone", "barley", "barnacle", "barometer", "baron",
"barracks", "barrel", "barricade", "barrier", "barrister", "barrow", "bartender", "baseball", "baseboard", "baseline",
"basement", "basin", "basketball", "bassoon", "bastion", "batch", "bathrobe", "bathroom", "battalion", "battery",
"battleship", "bazaar", "beacon", "beaker", "beanstalk", "bearer", "bearish", "beast", "beatitude", "beautician",
"beauty", "bedroom", "bedside", "bedspread", "bedtime", "beehive", "beekeeper", "beetle", "beforehand", "beggar",
"beginner", "begonia", "behavior", "belonging", "benchmark", "benediction", "benefactor", "beneficiary", "benevolent", "benign",
"bestseller", "beverage", "bewilder", "beyond", "bibliography", "bicycle", "biennial", "bifocal", "bilateral", "bilingual",
"billboard", "billion", "billow", "binary", "binocular", "biography", "biological", "biologist", "biology", "biopsy",
"bipartisan", "birthday", "birthplace", "birthright", "biscuit", "bishop", "blackberry", "blackbird", "blackboard", "blackout",
"blacksmith", "bladder", "blade", "blank", "blanket", "blasphemy", "blast", "blazer", "bleach", "bleacher",
"bleeding", "blender", "blessing", "blight", "blimp", "blinder", "blizzard", "blockade", "blockage", "blockbuster",
"blocker", "bloodshed", "bloodstream", "bloody", "bloom", "blossom", "blotter", "blouse", "blueberry", "bluebird",
"blueprint", "blunder", "blur", "blush", "boardroom", "boardwalk", "boast", "boaster", "boatman", "bodyguard",
"bodywork", "boiler", "boldness", "bolster", "bolt", "bombard", "bomber", "bondage", "bonfire", "bonnet",
"bonus", "bookcase", "bookend", "bookkeeper", "booklet", "bookmark", "bookstore", "boomerang", "booth", "borderline",
"bore", "borough", "borrower", "botany", "bottleneck", "bottomless", "boulevard", "bounce", "boundary", "boundless",
"bounty", "bouquet", "bourbon", "boutique", "bowler", "bowling", "bowstring", "boxer", "boxing", "boycott",
"boyfriend", "boyhood", "bracelet", "bracket", "brainstorm", "brainwash", "brainy", "branch", "brand", "brandy",
"brass", "bratwurst", "bravery", "bravery", "breadcrumb", "breadth", "breadwinner", "breakdown", "breakfast", "breakthrough",
"breakup", "breakwater", "breast", "breaststroke", "breath", "breathe", "breather", "breezeway", "brewery", "bribery",
"briefcase", "briefing", "brigade", "brigadier", "brightness", "brilliance", "brimstone", "brine", "broadband", "broadcast",
"broadway", "brochure", "broiler", "broker", "brokerage", "bronze", "brooch", "brotherhood", "browbeat", "browser",
"brunch", "brunette", "brutal", "brutality", "bubble", "bubbly", "bucket", "buckle", "buckskin", "buddha",
"buddhist", "budget", "buffalo", "buffer", "buffet", "buffoon", "builder", "building", "bulldog", "bulldozer",
"bullet", "bulletin", "bullfight", "bullfrog", "bullion", "bullish", "bullpen", "bullring", "bumblebee", "bumper",
"bunch", "bungalow", "bunkhouse", "bunkhouse", "buoyancy", "burden", "bureaucrat", "burglar", "burglary", "burial",
"burlap", "burner", "burnout", "burrito", "burst", "busboy", "bushel", "businessman", "businesswoman", "busker",
"bustle", "butane", "butcher", "buttercup", "butterfly", "buttermilk", "butterscotch", "buttress", "buzzard", "buzzer",
"bygone", "bypass", "byproduct", "byte", "cabaret", "cabbage", "cabinet", "cable", "cache", "cactus",
"cadence", "cadet", "cadre", "cafe", "caffeine", "cage", "cajole", "calamity", "calcium", "calculator",
"calendar", "caliber", "calibration", "calorie", "calypso", "camcorder", "cameo", "camouflage", "campaign", "campfire",
"campus", "canary", "cancellation", "cancer", "candidate", "candle", "candlestick", "candor", "candy", "cane",
"canine", "cannabis", "cannon", "canoe", "canopy", "cantaloupe", "canteen", "canvas", "canyon", "capability",
"capacitor", "capacity", "caper", "capitalism", "capitalist", "capitol", "capricorn", "capsule", "captain", "caption",
"captive", "captivity", "capture", "caramel", "caravan", "carbohydrate", "carbon", "cardboard", "cardigan", "cardinal",
"career", "carefree", "caregiver", "caretaker", "caricature", "carnival", "carnivore", "carousel", "carpenter", "carpet",
"carriage", "carrier", "carrot", "cartel", "cartilage", "cartographer", "cartoon", "cartridge", "carve", "carving",
"cascade", "cashew", "cashier", "cashmere", "casino", "casket", "cassette", "castaway", "castle", "casualty",
"catacomb", "catalog", "catalyst", "catapult", "catastrophe", "catchment", "catchphrase", "catchy", "category", "caterer",
"caterpillar", "catfish", "cathedral", "cation", "catnip", "cauliflower", "causeway", "caution", "cavalry", "caveman",
"cavern", "caviar", "cavity", "cedar", "celebration", "celebrity", "celery", "celestial", "cellar", "cellist",
"cellphone", "cellular", "cement", "cemetery", "censorship", "census", "centennial", "center", "centerpiece", "centigrade",
"centimeter", "central", "centralize", "century", "ceramic", "cereal", "cerebral", "ceremony", "certainty", "certificate",
"certification", "chafe", "chagrin", "chain", "chairman", "chairperson", "chalet", "challenge", "chamber", "champion",
"championship", "chancellor", "chandelier", "chandler", "change", "channel", "chant", "chaos", "chaplain", "chapter",
"character", "characteristic", "charcoal", "charity", "charlatan", "charm", "charter", "chasm", "chassis", "chastity",
"chateau", "chatter", "chauffeur", "checkbook", "checker", "checklist", "checkmate", "checkout", "checkpoint", "cheekbone",
"cheerleader", "cheese", "cheetah", "chemical", "chemist", "chemistry", "cherish", "chess", "chestnut", "chew",
"chickadee", "chicken", "chiffon", "childbirth", "childhood", "childish", "chill", "chime", "chimney", "chinaware",
"chipmunk", "chiropractor", "chisel", "chivalry", "chlorine", "chlorophyll", "chocolate", "choice", "choir", "cholera",
"cholesterol", "chord", "chorus", "christen", "chromium", "chromosome", "chronicle", "chronological", "chrysanthemum", "chuckle",
"chunk", "church", "cigarette", "cinema", "circuit", "circular", "circulation", "circumference", "circumstance", "circus",
"citation", "citizen", "citizenship", "citrus", "civilian", "civilization", "clarity", "classic", "classical", "classification",
"classmate", "classroom", "clause", "clavier", "cleaner", "cleaning", "clearance", "clearing", "cleavage", "cleaver",
"clemency", "clergy", "clergyman", "cleric", "clerk", "clever", "client", "clientele", "cliff", "climate",
"climax", "climb", "clinic", "clinical", "clipper", "clipping", "cloak", "cloakroom", "clockwork", "clog",
"clone", "closure", "clothes", "clothing", "cloudburst", "cloudy", "clover", "clown", "cluster", "clutch",
"coach", "coagulate", "coalition", "coastline", "coating", "cockpit", "cockroach", "cocktail", "cocoa", "coconut",
"codfish", "codify", "coeditor", "coeducation", "coefficient", "coexistence", "coffee", "coffin", "cognition", "cognitive",
"coherence", "cohesion", "cohort", "coincidence", "colander", "collaboration", "collage", "collapse", "collar", "collateral",
"colleague", "collection", "collective", "collector", "college", "collision", "colloquium", "colonel", "colonial", "colonist",
"colonization", "colony", "colossal", "columnist", "combat", "combatant", "combination", "combine", "combustion", "comedian",
"comedy", "comet", "comfort", "comic", "comma", "command", "commander", "commando", "commemoration", "commence",
"commencement", "commendation", "commentary", "commentator", "commerce", "commercial", "commission", "commissioner", "commitment", "committee",
"commodity", "commonwealth", "commotion", "communal", "communication", "communion", "communist", "community", "commuter", "compact",
"companion", "company", "comparison", "compartment", "compassion", "compatibility", "compensation", "competence", "competition", "competitor",
"compilation", "complaint", "complement", "completion", "complexity", "compliance", "compliment", "component", "composer", "composite",
"composition", "compost", "composure", "compound", "comprehension", "compression", "compromise", "computation", "computer", "comrade",
"concealment", "concept", "conception", "concern", "concert", "concession", "concerto", "conclusion", "concrete", "concur",
"condemnation", "condiment", "condition", "conditioner", "condolence", "condominium", "condor", "conductor", "cone", "confection",
"confederation", "conference", "confession", "confetti", "confidence", "configuration", "confinement", "confirmation", "conflict", "conformity",
"confrontation", "confusion", "congestion", "conglomerate", "congratulation", "congregation", "congress", "conjunction", "connection", "connoisseur",
"conquest", "conscience", "consciousness", "consecration", "consensus", "consent", "consequence", "conservation", "conservative", "conservatory",
"consideration", "consignment", "consistency", "consolation", "consonant", "conspiracy", "constable", "constancy", "constellation", "constituency",
"constitution", "constraint", "construction", "consultant", "consultation", "consumer", "consumption", "contact", "contagion", "container",
"contamination", "contemplation", "contemporary", "contender", "contentment", "contest", "context", "continent", "contingency", "continuation",
"continuity", "contour", "contraption", "contribution", "contributor", "contrivance", "controller", "controversy", "convenience", "convention",
"conversation", "conversion", "converter", "conviction", "convoy", "convulsion", "cookbook", "cooker", "cookie", "cooking",
"cooperation", "coordinator", "copilot", "copper", "copyright", "cord", "cordial", "cordon", "corduroy", "cornerstone",
"cornfield", "cornflake", "cornstalk", "coronation", "corporal", "corporation", "corpse", "corpuscle", "corral", "correction",
"correlation", "correspondence", "corridor", "corrosion", "corruption", "corsage", "corset", "cosmetic", "cosmic", "cosmology",
"cosmonaut", "cosmos", "costume", "cottage", "cotton", "couch", "cougar", "council", "counsel", "counselor",
"countdown", "counter", "counterpart", "countess", "countryside", "county", "coupon", "courage", "courier", "courtroom",
"courtship", "courtyard", "cousin", "coverage", "coward", "cowboy", "cowgirl", "crab", "cracker", "cradle",
"craftsman", "cramp", "cranberry", "crane", "cranium", "crate", "crater", "crayon", "creation", "creativity",
"creator", "creature", "credential", "credibility", "creditor", "creed", "creek", "creep", "cremation", "creole",
"crescent", "crest", "crevice", "crew", "crewman", "crib", "cricket", "crime", "criminal", "crimson",
"cripple", "crisis", "criterion", "critic", "criticism", "crocodile", "croissant", "crook", "crossbow", "crossing",
"crossroad", "crosswalk", "crossword", "crow", "crowd", "crown", "crucifix", "cruise", "crumb", "crumble",
"crusade", "crusader", "crush", "crystal", "cub", "cube", "cubicle", "cucumber", "cue", "cuisine",
"culprit", "cultivation", "culture", "cumin", "cupboard", "cupcake", "curator", "curfew", "curiosity", "curler",
"curriculum", "curry", "cursor", "curtain", "curve", "cushion", "custard", "custodian", "custody", "custom",
"customer", "cutlery", "cutlet", "cutting", "cyclone", "cylinder", "cymbal", "cynic", "cynical", "cypress",
"cyst", "daffodil", "dagger", "dairy", "daisy", "dam", "damage", "dame", "damn", "dampness",
"dancer", "dandelion", "dandruff", "danger", "daredevil", "darkness", "darling", "dart", "dashboard", "database",
"date", "daughter", "dawn", "daybreak", "daydream", "daylight", "daytime", "deadline", "deadlock", "dealer",
"dealership", "dean", "death", "debate", "debtor", "debut", "decade", "decadence", "decaf", "decanter",
"deception", "decibel", "decimal", "decision", "deck", "declaration", "decline", "decoder", "decoration", "decorator",
"decrease", "decree", "dedication", "deduction", "deed", "default", "defeat", "defect", "defendant", "defender",
"defense", "deferral", "deficiency", "deficit", "definition", "deflation", "deflection", "deformity", "defrost", "degenerate",
"degradation", "degree", "dehydration", "deity", "delay", "delegate", "delegation", "deletion", "delicacy", "delight",
"delinquent", "delivery", "delta", "delusion", "demand", "democracy", "democrat", "demolition", "demon", "demonstration",
"demotion", "denim", "denomination", "denominator", "density", "dent", "dentist", "department", "departure", "dependence",
"dependency", "depiction", "deposit", "depot", "depreciation", "depression", "deprivation", "depth", "deputy", "derby",
"derivation", "derivative", "derrick", "descendant", "descent", "description", "desert", "designer", "desire", "desk",
"desktop", "dessert", "destination", "destiny", "destruction", "detachment", "detective", "detector", "detention", "detergent",
"deterrent", "detour", "detox", "developer", "development", "deviation", "device", "devotee", "devotion", "dew",
"diagnosis", "diagram", "dialect", "dialogue", "diameter", "diamond", "diaper", "diaphragm", "diary", "dictionary",
"diesel", "dietitian", "difference", "differential", "differentiation", "difficulty", "diffusion", "digest", "digestion", "digger",
"digit", "dignity", "dilemma", "diligence", "dilution", "dimension", "diminutive", "dinosaur", "diploma", "diplomat",
"directory", "disability", "disadvantage", "disagreement", "disaster", "disc", "discard", "disciple", "discipline", "disclaimer",
"disclosure", "disco", "discomfort", "disconnect", "discount", "discourse", "discovery", "discrepancy", "discretion", "discrimination",
"discussion", "disdain", "disease", "disgrace", "disguise", "disgust", "dishwasher", "disk", "dismissal", "disorder",
"dispatch", "dispenser", "displacement", "display", "disposal", "disposition", "dispute", "disruption", "dissection", "dissident",
"dissolution", "distance", "distinction", "distortion", "distribution", "district", "disturbance", "diver", "diversity", "dividend",
"divinity", "division", "divorce", "dizziness", "dock", "doctor", "doctrine", "document", "documentary", "documentation",
"doghouse", "dogma", "doll", "dollar", "dolphin", "domain", "dome", "domestic", "dominance", "dominion",
"donation", "donor", "doorbell", "doorway", "dormitory", "dosage", "dossier", "dot", "double", "dough",
"doughnut", "dove", "downfall", "downpayment", "downpour", "downside", "downtown", "downturn", "dozen", "draft",
"dragon", "drainage", "drama", "dramatic", "drawer", "drawing", "dream", "dresser", "dressing", "drill",
"drinking", "drive", "driver", "driveway", "drizzle", "dromedary", "droplet", "drought", "drummer", "dryer",
"duchess", "duckling", "dugout", "duke", "dumpling", "duplicate", "durability", "duration", "dusk", "dust",
"duty", "dwarf", "dwelling", "dynamics", "dynamo", "dynasty", "eagle", "earache", "eardrum", "earl",
"earnest", "earring", "earthquake", "earthworm", "easel", "east", "easter", "echo", "eclipse", "ecology",
"economist", "economy", "ecosystem", "eddy", "edge", "edition", "editor", "editorial", "education", "educator",
"eel", "effect", "efficiency", "effort", "eggplant", "ego", "ejection", "elaboration", "elastic", "elbow",
"election", "electorate", "electrician", "electricity", "electron", "electronics", "element", "elephant", "elevation", "elevator",
"eligibility", "elimination", "elite", "ellipse", "elm", "elongation", "embassy", "embroidery", "embryo", "emergency",
"emigrant", "emigration", "eminence", "emission", "emotion", "emperor", "emphasis", "empire", "employer", "employment",
"empowerment", "enactment", "enclosure", "encounter", "encouragement", "encyclopedia", "endorsement", "endurance", "enemy", "energy",
"enforcement", "engagement", "engine", "engineer", "engineering", "enigma", "enjoyment", "enlightenment", "enrollment", "ensemble",
"enterprise", "entertainment", "enthusiasm", "entity", "entrance", "entry", "envelope", "environment", "enzyme", "epic",
"epidemic", "episode", "epoch", "equality", "equation", "equator", "equipment", "equity", "equivalent", "era",
"erosion", "errand", "error", "escalator", "escape", "escort", "essay", "essence", "establishment", "estate",
"estimate", "estimation", "estuary", "eternity", "ethics", "ethnicity", "etiquette", "eucalyptus", "eulogy", "euro",
"evacuation", "evaluation", "evaporation", "evening", "event", "evidence", "evolution", "examination", "examiner", "example",
"excavation", "exception", "excerpt", "excess", "exchange", "excitement", "exclamation", "exclusion", "excursion", "execution",
"executive", "exemption", "exercise", "exhaust", "exhibition", "exile", "existence", "expansion", "expectation", "expedition",
"expense", "experience", "experiment", "expert", "expertise", "expiration", "explanation", "exploration", "explorer", "explosion",
"export", "exporter", "exposure", "expression", "extension", "extent", "exterior", "extinction", "extract", "extraction",
"extradition", "extreme", "fabrication", "facade", "facet", "facility", "facsimile", "factor", "factory", "faculty",
"fahrenheit", "failure", "fairness", "fairy", "faith", "falcon", "fallout", "fame", "familiarity", "family",
"famine", "fanatic", "fantasy", "fare", "farmhouse", "fascination", "fashion", "fastener", "fatality", "fate",
"father", "fatigue", "faucet", "favor", "favorite", "feather", "feature", "federation", "feedback", "feeling",
"fellowship", "feminist", "fencing", "ferry", "fertility", "festival", "fiber", "fiction", "fidelity", "field",
"fighter", "figure", "filament", "filing", "filter", "finale", "finance", "financier", "finding", "fingerprint",
"finish", "firearm", "fireplace", "firework", "firm", "fisherman", "fishery", "fitness", "fixture", "flame",
"flank", "flashlight", "flatware", "flavor", "flaw", "flea", "fleet", "flesh", "flexibility", "flicker",
"flood", "floor", "flour", "flower", "flu", "fluency", "fluid", "fluorescence", "flush", "flute",
"flux", "flyer", "foe", "fog", "foliage", "folklore", "follower", "folly", "fondness", "font",
"food", "footage", "football", "footprint", "footstep", "footwear", "force", "forecast", "forehead", "foreman",
"forensic", "forest", "forester", "forever", "forgiveness", "formality", "formation", "formula", "fort", "fortress",
"fortune", "forum", "foundation", "founder", "fountain", "fraction", "fracture", "fragment", "fragrance", "frame",
"framework", "franchise", "frank", "fraud", "freedom", "freelance", "freeway", "freezer", "freight", "frequency",
"fresco", "freshman", "friction", "friendship", "fright", "fringe", "frontier", "frost", "frown", "fruit",
"frustration", "fuel", "fulfillment", "function", "functionality", "fund", "funding", "fundraiser", "funeral", "furnace",
"furniture", "fusion", "futon", "future", "gadget", "galaxy", "gallery", "gamble", "game", "gang",
"garage", "garbage", "garden", "gardener", "garlic", "garment", "gas", "gasoline", "gasp", "gate",
"gateway", "gathering", "gauge", "gazebo", "gazette", "gear", "gem", "gender", "gene", "generation",
"generator", "generosity", "genesis", "genetics", "genius", "genre", "gentleman", "geography", "geology", "geometry",
"geranium", "germ", "gesture", "ghost", "giant", "gift", "gigabyte", "gimmick", "ginger", "giraffe",
"girlfriend", "girlhood", "glacier", "gladiator", "glance", "gland", "glare", "glass", "glaze", "gleam",
"glider", "glimpse", "globe", "gloom", "glory", "glossary", "glove", "glow", "glucose", "glue",
"glycerin", "goalkeeper", "goal", "goat", "goblin", "goddess", "gold", "golf", "gondola", "goodness",
"goodwill", "gorilla", "gospel", "gossip", "governor", "gown", "grace", "grade", "grader", "gradient",
"graduation", "grain", "grammar", "grandchild", "granddaughter", "grandfather", "grandmother", "grandparent", "grandson", "grandstand",
"granite", "grant", "grapefruit", "graph", "graphic", "grasp", "grass", "gratitude", "gravel", "gravitation",
"gravity", "gravy", "grease", "greatness", "greed", "greenhouse", "greeting", "grid", "grief", "grill",
"grimace", "grin", "grip", "grocery", "groom", "gross", "ground", "group", "grove", "growth",
"guarantee", "guardian", "guerrilla", "guest", "guidance", "guide", "guideline", "guild", "guilt", "guitar",
"gulf", "gum", "gunpowder", "gymnasium", "habit", "habitat", "hack", "hacker", "hail", "haircut",
"hairdo", "hairpin", "halibut", "hallway", "hamburger", "hammer", "hamster", "handbag", "handful", "handicap",
"handkerchief", "handle", "handler", "handwriting", "hanger", "happiness", "harassment", "harbor", "hardware", "harmony",
"harness", "harp", "harvest", "haste", "hatch", "hatred", "haul", "haven", "havoc", "hazard",
"headache", "headlight", "headline", "headphone", "headquarters", "headrest", "healing", "health", "heap", "hearing",
"heartbeat", "heartbreak", "heater", "heating", "heaven", "heaviness", "hedge", "heel", "height", "heir",
"helicopter", "helium", "helmet", "hemisphere", "hemorrhage", "hen", "herald", "herb", "herd", "heredity",
"heritage", "hero", "heroin", "heroine", "hesitation", "hexagon", "hierarchy", "highland", "highway", "hike",
"hiker", "hiking", "hill", "hint", "hip", "hire", "historian", "history", "hobby", "hockey",
"holder", "hole", "holiday", "hollow", "homeland", "homemade", "hometown", "homework", "homicide", "homogeny",
"honesty", "honey", "honeymoon", "honor", "hood", "hook", "hop", "hope", "horizon", "hormone",
"horn", "horror", "horse", "hose", "hospital", "hospitality", "host", "hostage", "hostel", "hostess",
"hotel", "hour", "household", "housekeeper", "housewife", "housework", "housing", "hub", "hug", "humanity",
"humidity", "humor", "hunch", "hundred", "hunger", "hunter", "hunting", "hurdle", "hurricane", "hurry",
"husband", "hush", "hybrid", "hydrant", "hydrogen", "hygiene", "hymn", "hyphen", "hypnosis", "hypothesis",
"iceberg", "icebox", "icicle", "icon", "idea", "ideal", "identity", "ideology", "idiom", "idiot",
"idol", "igloo", "ignorance", "illusion", "illustration", "image", "imagination", "imbalance", "imitation", "immigrant",
"immigration", "impact", "impairment", "impatience", "imperative", "imperial", "implication", "import", "importance", "impostor",
"impression", "imprisonment", "improvement", "impulse", "inability", "inaccuracy", "incentive", "incident", "inclination", "income",
"incompetence", "inconvenience", "increase", "independence", "index", "indication", "indicator", "indifference", "indigenous", "indigo",
"indignation", "individual", "industry", "inequality", "inertia", "infancy", "infant", "infection", "inference", "inferiority",
"inflation", "influence", "influenza", "information", "infrastructure", "ingredient", "inhabitant", "inheritance", "inhibition", "injury",
"injustice", "inlet", "inn", "innovation", "input", "inquiry", "insanity", "insect", "insertion", "insight",
"insistence", "inspection", "inspiration", "installment", "instance", "instinct", "institution", "instruction", "instructor", "instrument",
"insulation", "insurance", "insurgency", "integer", "integration", "integrity", "intellect", "intelligence", "intensity", "intention",
"interaction", "intercept", "interchange", "interest", "interface", "interference", "interior", "intermediate", "intern", "internal",
"international", "internet", "interpretation", "interruption", "intersection", "interval", "intervention", "interview", "intestine", "intimacy",
"introduction", "intuition", "invasion", "invention", "inventory", "investigator", "investment", "investor", "invitation", "invoice",
"involvement", "irony", "irrigation", "isolation", "issue", "item", "itinerary", "ivory", "jackpot", "jail",
"jam", "janitor", "jar", "jasmine", "jaw", "jazz", "jealousy", "jellyfish", "jersey", "jet",
"jewelry", "jigsaw", "jockey", "jogger", "jogging", "joint", "joker", "journal", "journalist", "journey",
"joy", "judge", "judgment", "jug", "juggler", "juice", "jumper", "junction", "jungle", "junior",
"junk", "jurisdiction", "juror", "jury", "justice", "justification", "juvenile", "kale", "kangaroo", "karate",
"kayak", "kebab", "keeper", "kennel", "kernel", "kettle", "keyboard", "keyhole", "keystone", "kick",
"kidney", "kilometer", "kindness", "king", "kingdom", "kiss", "kitchen", "kite", "kitten", "kiwi",
"knapsack", "knee", "knife", "knight", "knob", "knot", "knowledge", "lab", "label", "laboratory",
"labour", "labyrinth", "lace", "lack", "ladder", "ladle", "ladybug", "lagoon", "lair", "lakeside",
"lamb", "lament", "lamp", "landlord", "landmark", "landscape", "lane", "language", "lantern", "laptop",
"lark", "laser", "lash", "latch", "latitude", "lattice", "laughter", "launch", "laundry", "lavender",
"lavatory", "lawmaker", "lawn", "lawsuit", "lawyer", "layer", "layout", "leader", "leadership", "leaflet",
"league", "leak", "leather", "lecture", "leek", "legacy", "legend", "legislation", "legislator", "legitimacy",
"leisure", "lemonade", "lender", "length", "lens", "leopard", "leprosy", "lesson", "letter", "lettuce",
"level", "lever", "liability", "liaison", "liar", "liberation", "liberty", "librarian", "library", "licence",
"license", "lichen", "lieutenant", "lifestyle", "lifetime", "ligament", "lightning", "likelihood", "limb", "limestone",
"limit", "limousine", "lineage", "linen", "liner", "lingerie", "linguist", "link", "linoleum", "lint",
"lion", "lipstick", "liquid", "liquor", "listener", "literacy", "literature", "litigation", "litter", "livelihood",
"livestock", "lizard", "load", "loader", "loaf", "loan", "lobby", "lobster", "locality", "location",
"locker", "locket", "locomotive", "lodge", "lodging", "logic", "logo", "loneliness", "longevity", "longitude",
"lookout", "loom", "loop", "loophole", "lord", "lotion", "lottery", "lounge", "loyalty", "lubricant",
"lucidity", "luggage", "lullaby", "lumber", "luncheon", "lunchroom", "lung", "lurch", "luxury", "lyric",
"lyricist", "macaroni", "machete", "machinery", "mackerel", "madness", "magazine", "magician", "magistrate", "magnesium",
"magnet", "magnitude", "maid", "mailbox", "mailman", "mainframe", "mainland", "mainstream", "maintenance", "majesty",
"majority", "makeup", "malady", "malice", "mall", "malnutrition", "mammal", "manager", "mandate", "manger",
"mango", "mangrove", "manhole", "manhood", "manifesto", "manor", "mansion", "mantel", "mantle", "manufacturer",
"manuscript", "map", "maple", "marathon", "marble", "march", "margin", "marina", "marinade", "mariner",
"marionette", "marker", "market", "marketing", "marksman", "marriage", "marsh", "marshmallow", "martial", "martyr",
"marvel", "mascot", "masculinity", "mason", "massage", "mast", "masterpiece", "mat", "match", "mate",
"material", "maternity", "mathematician", "mathematics", "matrix", "matter", "mattress", "maturity", "maxim", "maximum",
"mayhem", "mayor", "meadow", "mealtime", "mechanic", "mechanism", "medal", "media", "mediation", "mediator",
"medication", "medicine", "meditation", "medium", "meeting", "melody", "member", "membership", "membrane", "memento",
"memoir", "memorial", "memory", "menace", "mending", "mentality", "mentor", "menu", "merchant", "mercury",
"mercy", "meridian", "merit", "mesmerize", "message", "messenger", "metabolism", "metal", "metaphor", "meteor",
"meteorology", "meter", "method", "methodology", "metropolis", "microphone", "microscope", "microwave", "midday", "midnight",
"midpoint", "midst", "migration", "mileage", "milestone", "military", "militia", "milk", "mill", "millennium",
"miller", "million", "millionaire", "mimic", "mineral", "miner", "miniature", "minimum", "minister", "ministry",
"minority", "mint", "minute", "miracle", "mirror", "mischief", "miser", "misery", "misfortune", "misgiving",
"mishap", "misunderstanding", "mitigation", "mixer", "mixture", "moat", "mobility", "mobilization", "mockery", "moderation",
"moderator", "modernity", "modification", "modifier", "modesty", "moisture", "molecule", "momentum", "monarch", "monarchy",
"monastery", "monetary", "money", "monitor", "monkey", "monologue", "monopoly", "monsoon", "monster", "monument",
"mood", "moonlight", "moonshine", "moor", "morale", "morality", "morbidity", "mortality", "mortgage", "mortuary",
"mosque", "mosquito", "moss", "motel", "moth", "mother", "motion", "motivation", "motorcycle", "mound",
"mountain", "mountaineer", "mouse", "mouth", "movement", "movie", "mower", "mud", "muffin", "mug",
"mulch", "multitude", "mumble", "mummy", "municipality", "murder", "muscle", "museum", "mushroom", "music",
"musician", "musk", "mustard", "mutation", "mutter", "mutton", "muzzle", "mystery", "mythology", "nail",
"napkin", "narrative", "narrow", "nation", "nationality", "native", "nature", "nausea", "navigation", "navigator",
"necklace", "neckline", "needle", "negation", "negligence", "negotiation", "neighbor", "neighborhood", "nemesis", "neon",
"nephew", "nerve", "nest", "network", "neurology", "neutral", "newcomer", "newsletter", "newspaper", "newsroom",
"niche", "nickname", "niece", "nightmare", "nitrogen", "nobility", "noble", "nod", "noise", "nomad",
"nomination", "nominee", "noodle", "norm", "normal", "north", "nose", "nostalgia", "notation", "notebook",
"nothing", "notice", "notification", "notion", "novel", "novelist", "novice", "nuance", "nucleus", "nuisance",
"number", "numeral", "numerator", "nurse", "nursery", "nutmeg", "nutrition", "nylon", "oasis", "oath",
"oatmeal", "obedience", "obesity", "objection", "objective", "obligation", "observatory", "observer", "obsession", "obstacle",
"occasion", "occupation", "occurrence", "ocean", "octave", "octopus", "odds", "odor", "offense", "offer",
"office", "officer", "official", "offspring", "ointment", "olive", "omelet", "omission", "omnivore", "onion",
"onlooker", "onset", "opening", "opera", "operation", "operator", "opinion", "opponent", "opportunity", "opposition",
"optimism", "optimist", "option", "oracle", "orange", "orchestra", "orchid", "order", "ordinance", "organ",
"organization", "organizer", "orientation", "origin", "original", "originality", "ornament", "orphan", "orthodox", "ostrich",
"outbreak", "outcome", "outdoor", "outfit", "outlet", "outline", "outlook", "output", "outrage", "outset",
"outskirts", "outcome", "oval", "oven", "overcoat", "overhead", "overview", "owl", "owner", "ownership",
"oxygen", "oyster", "ozone", "pace", "pacifier", "package", "packet", "pact", "paddle", "pagan",
"page", "pagoda", "pail", "pain", "paint", "painter", "painting", "pair", "palace", "palate",
"palm", "pamphlet", "pancake", "panel", "panic", "panther", "pantry", "paper", "paperback", "paperwork",
"parachute", "parade", "paradise", "paradox", "paragraph", "paralysis", "parameter", "paramount", "paranoia", "parasite",
"pardon", "parent", "parenthesis", "park", "parking", "parliament", "parlor", "parody", "parole", "parsley",
"parsnip", "participant", "participation", "particle", "particular", "partnership", "partridge", "party", "passage", "passenger",
"passion", "passport", "password", "pastor", "pastry", "pasture", "patch", "patent", "path", "pathway",
"patience", "patient", "patriot", "patrol", "patron", "pattern", "pause", "pavement", "pavilion", "paw",
"payment", "peace", "peach", "peak", "peanut", "pear", "pearl", "peasant", "pecan", "pedal",
"pedestrian", "pediatrician", "pedigree", "peer", "penalty", "pendant", "pendulum", "penetration", "penguin", "penicillin",
"peninsula", "pension", "pentagon", "people", "pepper", "peptide", "percent", "percentage", "perception", "percussion",
"perfection", "performance", "perfume", "perimeter", "period", "periodical", "peripheral", "permission", "permit", "persistence",
"person", "personality", "personnel", "perspective", "persuasion", "pesticide", "petition", "petroleum", "pharmacy", "phase",
"phenomenon", "philanthropy", "philosopher", "philosophy", "phobia", "phosphate", "photograph", "photographer", "photography", "phrase",
"physics", "physician", "physicist", "physiology", "pianist", "piano", "pickle", "pickup", "picnic", "picture",
"piece", "pier", "pigment", "pile", "pill", "pillar", "pillow", "pilot", "pin", "pinch",
"pine", "pineapple", "pink", "pint", "pioneer", "pipe", "pipeline", "piracy", "pistol", "piston",
"pitcher", "pizza", "place", "placement", "plague", "plain", "plaintiff", "plan", "plane", "planet",
"planner", "plant", "plantation", "plasma", "plaster", "plastic", "plate", "plateau", "platform", "platinum",
"platter", "playground", "playhouse", "playwright", "plea", "pleasure", "pledge", "plenty", "plight", "plot",
"plow", "plumber", "plumbing", "plunge", "plural", "pocket", "podcast", "poem", "poet", "poetry",
"point", "pointer", "poison", "polar", "polarity", "pole", "police", "policy", "polish", "politician",
"politics", "poll", "pollution", "polyester", "polymer", "pond", "pony", "pool", "popcorn", "pope",
"poplar", "poppy", "popularity", "population", "porch", "pork", "porridge", "port", "portfolio", "portion",
"portrait", "position", "positive", "possession", "possibility", "post", "postage", "poster", "posture", "pot",
"potato", "potential", "pottery", "poultry", "poverty", "powder", "power", "practice", "praise", "prayer",
"precedent", "precipitation", "precision", "predecessor", "predicate", "prediction", "preference", "prefix", "pregnancy", "prejudice",
"premium", "preparation", "presence", "present", "presentation", "preservation", "president", "press", "pressure", "prestige",
"presumption", "pretense", "prevention", "preview", "price", "pride", "priest", "primary", "prime", "prince",
"princess", "principal", "principle", "print", "printer", "priority", "prison", "prisoner", "privacy", "private",
"privilege", "prize", "probability", "problem", "procedure", "process", "processor", "produce", "producer", "product",
"production", "productivity", "profession", "professional", "professor", "profile", "profit", "program", "programmer", "progress",
"progression", "prohibition", "project", "projection", "projector", "prologue", "promise", "promotion", "prompt", "proof",
"propaganda", "propeller", "property", "prophecy", "proponent", "proportion", "proposal", "proposition", "prosecution", "prospect",
"prosperity", "protection", "protein", "protest", "protocol", "provider", "province", "provision", "psychology", "psychiatrist",
"public", "publication", "publicity", "publisher", "pudding", "pulse", "pump", "pumpkin", "punch", "punishment",
"pupil", "puppet", "purchase", "purple", "purpose", "purse", "pursuit", "push", "puzzle", "pyramid",
"qualification", "quality", "quantity", "quantum", "quarrel", "quarter", "quartet", "quartz", "queen", "query",
"question", "questionnaire", "queue", "quilt", "quota", "quotation", "quote", "rabbit", "raccoon", "race",
"racer", "racquet", "radar", "radiation", "radiator", "radical", "radio", "radius", "raffle", "raft",
"rag", "rage", "raid", "rail", "railroad", "railway", "rainbow", "raincoat", "rainfall", "rally",
"ram", "ramp", "ranch", "random", "range", "ranger", "rank", "rap", "rape", "rapid",
"rapport", "rat", "rate", "rating", "ratio", "rationale", "raven", "ravine", "ray", "razor",
"reaction", "reader", "reading", "reality", "realm", "reaper", "reason", "rebel", "rebellion", "rebound",
"rebuild", "recall", "receipt", "receiver", "reception", "recession", "recipe", "recipient", "recognition", "recommendation",
"reconciliation", "reconstruction", "record", "recorder", "recovery", "recreation", "recruit", "rectangle", "recurrence", "recyclable",
"recycling", "redemption", "reduction", "redundancy", "reference", "referendum", "reflection", "reflex", "reform", "refuge",
"refugee", "refund", "refusal", "refuse", "regard", "regime", "region", "register", "registration", "regret",
"regulation", "regulator", "rehabilitation", "rehearsal", "reign", "reimbursement", "reinforcement", "rejection", "relation", "relationship",
"relative", "relaxation", "release", "relevance", "reliability", "relief", "religion", "relocation", "remainder", "reminder",
"remnant", "remote", "removal", "renaissance", "renewal", "renovation", "rent", "replacement", "replica", "replication",
"reply", "report", "reporter", "representation", "representative", "reproduction", "republic", "reputation", "request", "requirement",
"rescue", "research", "researcher", "resemblance", "reservation", "reserve", "reservoir", "residence", "resident", "residue",
"resignation", "resilience", "resistance", "resolution", "resort", "resource", "respect", "response", "responsibility", "restaurant",
"restoration", "restraint", "restriction", "result", "resume", "retail", "retailer", "retention", "retirement", "retreat",
"retrieval", "return", "reunion", "revenue", "reversal", "review", "revision", "revival", "revolution", "reward",
"rhetoric", "rhinoceros", "rhyme", "rhythm", "ribbon", "rice", "riddle", "rider", "ridge", "ridicule",
"rifle", "right", "rigor", "rim", "ring", "riot", "rite", "ritual", "rival", "river",
"road", "roadside", "roast", "robot", "rock", "rocket", "rod", "role", "roll", "roller",
"romance", "roof", "room", "rooster", "root", "rope", "rose", "roster", "rotation", "round",
"route", "routine", "row", "royalty", "rubber", "rubble", "rugby", "rule", "ruler", "rumor",
"runway", "rural", "rush", "rust", "sabotage", "sack", "sacrifice", "saddle", "safari", "safety",
"sail", "sailor", "salad", "salary", "sale", "salesman", "salmon", "salon", "saloon", "salt",
"salute", "salvage", "sample", "sanction", "sanctuary", "sand", "sandwich", "sanitation", "sanity", "sardine",
"satellite", "satin", "satire", "satisfaction", "sauce", "saucer", "sausage", "savage", "savings", "saxophone",
"scale", "scandal", "scanner", "scenario", "scene", "scenery", "scent", "schedule", "scheme", "scholar",
"scholarship", "school", "science", "scientist", "scoop", "scope", "score", "scorer", "scorn", "scout",
"scrap", "screen", "script", "scrutiny", "sculpture", "seal", "search", "season", "seat", "second",
"secret", "secretary", "section", "sector", "security", "segment", "selection", "selector", "semester", "seminar",
"senate", "senator", "sender", "senior", "sensation", "sense", "sensitivity", "sensor", "sentence", "sentiment",
"separation", "sequence", "serial", "series", "servant", "server", "service", "session", "settlement", "settler",
"setup", "severity", "sewage", "sewer", "shack", "shadow", "shaft", "shame", "shampoo", "shape",
"share", "shareholder", "shark", "shed", "sheep", "sheet", "shelf", "shell", "shelter", "shepherd",
"shield", "shift", "shine", "ship", "shipment", "shirt", "shock", "shoe", "shoot", "shop",
"shore", "shortage", "shortcut", "shot", "shoulder", "shovel", "show", "shower", "shred", "shrimp",
"shrine", "shrink", "shrug", "shuffle", "shutdown", "sibling", "sidewalk", "sight", "sign", "signal",
"signature", "significance", "silence", "silicon", "silk", "sill", "silver", "similarity", "simple", "simplicity",
"simulation", "sin", "singer", "single", "sink", "sister", "site", "situation", "size", "skate",
"skeleton", "sketch", "ski", "skill", "skin", "skirt", "skull", "sky", "skyscraper", "slab",
"slang", "slave", "slavery", "sleep", "sleeve", "slice", "slide", "slope", "slot", "slum",
"smell", "smile", "smoke", "snack", "snake", "snap", "snow", "soap", "soccer", "social",
"society", "sock", "sodium", "sofa", "software", "soil", "solar", "soldier", "solid", "solution",
"solvent", "sonata", "song", "sonnet", "soprano", "sorrow", "sort", "soul", "sound", "soup",
"source", "south", "space", "spade", "span", "spark", "speaker", "specialist", "species", "specimen",
"spectacle", "spectrum", "speech", "speed", "spell", "sphere", "spice", "spider", "spike", "spin",
"spine", "spirit", "spiritual", "splash", "split", "sponsor", "spoon", "sport", "spot", "spray",
"spread", "spring", "sprint", "spy", "square", "squeeze", "squirrel", "stability", "stable", "stadium",
"staff", "stage", "stain", "stair", "stake", "stall", "stamp", "stand", "standard", "standing",
"staple", "star", "starch", "stardom", "start", "state", "statement", "station", "statistic", "statue",
"status", "statute", "stay", "steak", "steam", "steel", "stem", "step", "stereo", "stew",
"stick", "stigma", "stimulus", "sting", "stock", "stomach", "stone", "stool", "stop", "storage",
"store", "storm", "story", "stove", "strategy", "straw", "stream", "street", "strength", "stress",
"stretch", "strike", "string", "strip", "stroke", "structure", "struggle", "student", "studio", "study",
"stuff", "stumble", "style", "subject", "submission", "substance", "substitute", "suburb", "subway", "success",
"succession", "sucker", "suffix", "sugar", "suggestion", "suit", "suite", "summary", "summer", "summit",
"sun", "sunset", "supermarket", "supervisor", "supplement", "supplier", "supply", "support", "surface", "surgery",
"surprise", "surround", "survey", "survival", "survivor", "suspect", "suspension", "sustain", "swallow", "swamp",
"swap", "swarm", "sweat", "sweater", "sweep", "sweet", "swim", "swing", "switch", "sword",
"symbol", "sympathy", "symptom", "syndrome", "synonym", "synthesis", "syrup", "system", "table", "tablet",
"tackle", "tactic", "tag", "tail", "tailor", "tale", "talent", "talk", "tank", "tap",
"tape", "target", "task", "taste", "tattoo", "tax", "taxi", "tea", "teacher", "team",
"tear", "technique", "technology", "telephone", "telescope", "television", "temper", "temperature", "temple", "tenant",
"tendency", "tennis", "tension", "tent", "term", "terminal", "terrace", "terrain", "territory", "terror",
"test", "testament", "testimony", "text", "textbook", "texture", "thanks", "theme", "theory", "therapy",
"thesis", "thigh", "thing", "thinking", "thirst", "thought", "thread", "threat", "threshold", "thrill",
"throat", "throne", "thumb", "thunder", "ticket", "tide", "tiger", "tile", "till", "timber",
"time", "timeline", "timer", "tin", "tip", "tire", "tissue", "title", "toast", "tobacco",
"today", "toe", "toilet", "token", "tomato", "tomorrow", "tone", "tongue", "tonight", "tool",
"tooth", "topic", "torch", "tornado", "tortoise", "total", "touch", "tour", "tourist", "tournament",
"tower", "town", "toy", "trace", "track", "trade", "tradition", "traffic", "tragedy", "train",
"trainer", "training", "trait", "transfer", "transit", "transition", "translation", "transmission", "transparency", "transport",
"trap", "trash", "travel", "treasure", "treatment", "tree", "tremor", "trend", "trial", "tribe",
"trick", "trigger", "trim", "trip", "trophy", "trouble", "truck", "trust", "truth", "tube",
"tune", "tunnel", "turkey", "turn", "tutor", "tutorial", "twilight", "twin", "twist", "type",
"typical", "tyrant", "umbrella", "uncle", "under", "understanding", "union", "unique", "unit", "universe",
"university", "update", "upgrade", "upload", "upper", "urban", "urgency", "usage", "user", "usual",
"utility", "vacation", "vaccine", "vacuum", "valley", "value", "valve", "van", "variant", "variation",
"variety", "various", "vault", "vehicle", "velocity", "vendor", "venture", "venue", "verb", "version",
"vessel", "veteran", "victim", "victory", "video", "view", "viewer", "village", "vine", "vinegar",
"violation", "violence", "violin", "virtual", "virus", "visa", "vision", "visit", "visitor", "visual",
"vital", "vitamin", "vocal", "voice", "volume", "vote", "voter", "voyage", "wage", "wagon",
"wait", "waiter", "wake", "walk", "wall", "wallet", "walnut", "want", "war", "ward",
"wardrobe", "warehouse", "warmth", "warning", "warrant", "warrior", "wash", "washer", "waste", "watch",
"water", "wave", "way", "weakness", "wealth", "weapon", "wear", "weather", "web", "wedding",
"week", "weekend", "weight", "welcome", "welfare", "west", "wheel", "where", "while", "whip",
"whiskey", "whisper", "white", "whole", "width", "wife", "wild", "will", "wind", "window",
"wine", "wing", "winner", "winter", "wire", "wisdom", "wish", "witness", "wolf", "woman",
"wonder", "wood", "woodland", "wool", "word", "work", "worker", "workplace", "world", "worry",
"worth", "wrap", "wreck", "wrist", "write", "writer", "writing", "wrong", "yard", "year",
"yesterday", "yield", "yoga", "yogurt", "youth", "zebra", "zero", "zone", "zoo"
)
// 合并词表(基础 + 扩展,约 5 倍词库)
val ALL_MNEMONIC_WORDS = MNEMONIC_WORDS + MNEMONIC_WORDS_EXTRA
// 助记词风格包名:从合并词表中随机选词,格式 com.{word1}.{word2}.{word3}.{word4}
// 类似冷钱包助记词,易读且符合 Android 包名规范(小写字母)
fun generateRandomPackageName(): String {
val words = ALL_MNEMONIC_WORDS.shuffled().take(4)
return "com.${words.joinToString(".")}"
}
// 包名生成逻辑
// 优先使用手动指定的包名,否则生成完全随机的包名
fun computeApplicationId(): String {
val manualAppId = project.findProperty("applicationId") as String?
?: System.getenv("APPLICATION_ID")
if (manualAppId != null && manualAppId.isNotBlank()) {
return manualAppId
}
val packageSuffix = project.findProperty("packageSuffix") as String?
?: System.getenv("PACKAGE_SUFFIX")
?: System.getenv("CI_COMMIT_BRANCH")?.replace("/", "_")
?: System.getenv("GITHUB_REF_NAME")?.replace("/", "_")
return if (packageSuffix != null && packageSuffix.isNotBlank()) {
"io.openim.flutter.demo.$packageSuffix"
} else {
generateRandomPackageName()
}
}
android {
namespace = "io.openim.flutter.openim"
compileSdk = flutter.compileSdkVersion
ndkVersion = "27.0.12077973" // 使用已存在的NDK版本避免下载问题
compileOptions {
sourceCompatibility = JavaVersion.VERSION_17
targetCompatibility = JavaVersion.VERSION_17
isCoreLibraryDesugaringEnabled = true
}
kotlinOptions {
jvmTarget = JavaVersion.VERSION_17.toString()
}
lint {
checkReleaseBuilds = false
abortOnError = false
}
// 签名配置
signingConfigs {
// Debug 签名(默认)
getByName("debug") {
// 使用默认的 debug keystore
}
// Release 签名配置
// 优先级:
// 1. 手动指定的签名(环境变量或 Gradle 属性)
// 2. 自动生成的随机签名(每次打包都不同)
// 3. Debug 签名(降级方案)
create("release") {
// 方式1: 手动指定的签名(最高优先级)
val manualKeystoreFile = project.findProperty("keystoreFile") as String?
?: System.getenv("KEYSTORE_FILE")
val manualKeystorePassword = project.findProperty("keystorePassword") as String?
?: System.getenv("KEYSTORE_PASSWORD")
val manualKeyAlias = project.findProperty("keyAlias") as String?
?: System.getenv("KEY_ALIAS")
val manualKeyPassword = project.findProperty("keyPassword") as String?
?: System.getenv("KEY_PASSWORD")
if (manualKeystoreFile != null && manualKeystorePassword != null &&
manualKeyAlias != null && manualKeyPassword != null) {
val keystore = file(manualKeystoreFile)
if (keystore.exists()) {
storeFile = keystore
storePassword = manualKeystorePassword
this.keyAlias = manualKeyAlias
this.keyPassword = manualKeyPassword
println("✓ 使用手动指定的 release 签名: $manualKeystoreFile")
return@create
} else {
println("警告: Keystore 文件不存在: $manualKeystoreFile")
}
}
// 方式2: 自动生成随机签名(每次打包都不同)
val generateRandom = System.getenv("GENERATE_RANDOM_KEYSTORE")
?: project.findProperty("generateRandomSigning") as String?
?: "true" // 默认启用随机签名
if (generateRandom == "true") {
// 将签名文件保存在 build 目录,构建清理时会自动删除
val buildDir = layout.buildDirectory.get().asFile
val keystoreDir = File(buildDir, "keystore")
keystoreDir.mkdirs()
// 生成唯一的文件名(基于时间戳和随机字符串)
val timestamp = System.currentTimeMillis()
val random = SecureRandom()
val randomBytes = ByteArray(8)
random.nextBytes(randomBytes)
val randomSuffix = Base64.getEncoder().encodeToString(randomBytes)
.replace("=", "")
.replace("/", "_")
.replace("+", "-")
.substring(0, 8)
val keystoreFile = File(keystoreDir, "release_${timestamp}_${randomSuffix}.jks")
val keyAlias = "release_key_${randomSuffix}"
// 生成随机密码16位
val randomPasswordBytes = ByteArray(16)
random.nextBytes(randomPasswordBytes)
val keystorePassword = Base64.getEncoder().encodeToString(randomPasswordBytes)
.replace("=", "")
.substring(0, 16)
// 每次打包都生成新的签名(删除旧的同名文件,如果有)
if (keystoreFile.exists()) {
keystoreFile.delete()
}
println("🔐 正在生成随机 release 签名...")
println(" Keystore: ${keystoreFile.absolutePath}")
println(" Alias: $keyAlias")
// 使用当前 JVM 的 keytool避免 CI/容器中 PATH 无 keytool 或 spawn 失败
val keytoolName = if (System.getProperty("os.name").lowercase().contains("win")) "keytool.exe" else "keytool"
val keytoolPath = File(System.getProperty("java.home"), "bin/$keytoolName").absolutePath
val keytoolFile = File(keytoolPath)
if (!keytoolFile.exists()) {
println("✗ 未找到 keytool: $keytoolPath")
println(" 将使用 debug 签名作为降级方案")
return@create
}
val processBuilder = ProcessBuilder(
keytoolPath,
"-genkey",
"-v",
"-keystore", keystoreFile.absolutePath,
"-alias", keyAlias,
"-keyalg", "RSA",
"-keysize", "2048",
"-validity", "10000", // 有效期约 27 年
"-storepass", keystorePassword,
"-keypass", keystorePassword,
"-dname", "CN=App, OU=Development, O=Company, L=City, ST=State, C=US"
)
val process = try {
processBuilder.start()
} catch (e: Exception) {
println("✗ 执行 keytool 失败 (如 CI/root 环境 spawn 受限): ${e.message}")
println(" 将使用 debug 签名作为降级方案")
return@create
}
val exitCode = process.waitFor()
if (exitCode == 0) {
if (keystoreFile.exists()) {
println("✓ 随机签名生成成功: ${keystoreFile.absolutePath}")
println(" 文件大小: ${keystoreFile.length()} 字节")
} else {
println("✗ 签名文件生成失败: 文件不存在")
println(" 将使用 debug 签名作为降级方案")
return@create
}
} else {
val errorOutput = process.errorStream.bufferedReader().readText()
println("✗ 签名生成失败: $errorOutput")
println(" 将使用 debug 签名作为降级方案")
return@create
}
storeFile = keystoreFile
storePassword = keystorePassword
this.keyAlias = keyAlias
this.keyPassword = keystorePassword
println("✓ 使用随机生成的 release 签名")
return@create
}
// 方式3: 降级到 debug 签名
println("⚠️ 未配置 release 签名,将使用 debug 签名")
}
}
defaultConfig {
// 动态 Application ID可通过环境变量或 Gradle 属性修改)
val computedAppId = computeApplicationId()
applicationId = computedAppId
println("构建包名: $computedAppId")
// You can update the following values to match your application needs.
// For more information, see: https://flutter.dev/to/review-gradle-config.
minSdk = flutter.minSdkVersion
targetSdk = 33
versionCode = flutter.versionCode
versionName = flutter.versionName
multiDexEnabled = true
// .so 文件加固配置
// 注意:当使用 flutter build apk --split-per-abi 或 --target-platform 时,
// Flutter 会自动设置 ABI 过滤器,这里不需要手动配置,否则会冲突
// 如果需要手动控制架构,可以通过以下方式:
// 1. 不使用 --split-per-abi使用完整的 APK
// 2. 或者移除这里的 abiFilters 配置,让 Flutter 命令行参数控制
//
// 如果需要手动设置,取消下面的注释(但不要与 --split-per-abi 同时使用)
// ndk {
// // 只打包主流架构,减少暴露风险
// // 建议只打包 arm64-v8a主流设备和 armeabi-v7a兼容旧设备
// abiFilters += listOf("arm64-v8a", "armeabi-v7a")
// }
}
buildTypes {
release {
// 如果配置了 release 签名,优先使用;否则使用 debug 签名
val releaseSigningConfig = signingConfigs.findByName("release")
if (releaseSigningConfig != null && releaseSigningConfig.storeFile != null) {
signingConfig = releaseSigningConfig
println("使用自定义 release 签名")
} else {
signingConfig = signingConfigs.getByName("debug")
println("使用 debug 签名release 构建)")
}
// 按照OpenIM官方文档建议默认禁用混淆解决白屏问题
// 如果需要启用混淆加固,可以通过环境变量 ENABLE_PROGUARD=true 来启用
val enableProguard = project.findProperty("enableProguard") as String?
?: System.getenv("ENABLE_PROGUARD")
?: "false"
if (enableProguard == "true") {
println("⚠️ 已启用代码混淆(可能导致白屏问题,请充分测试)")
// 启用代码混淆和资源压缩(简单加固)
isMinifyEnabled = true
isShrinkResources = true
proguardFiles(getDefaultProguardFile("proguard-android-optimize.txt"), "proguard-rules.pro")
} else {
println("✅ 已禁用代码混淆按照OpenIM官方建议避免白屏问题")
// 按照OpenIM官方文档建议禁用混淆解决白屏问题
isMinifyEnabled = false
isShrinkResources = false
proguardFiles(getDefaultProguardFile("proguard-android-optimize.txt"), "proguard-rules.pro")
}
// 启用代码优化(不影响混淆)
isDebuggable = false
isJniDebuggable = false
isRenderscriptDebuggable = false
}
}
// .so 文件加固:打包后处理任务(可选)
// 注意:这需要在构建后手动处理,或者使用第三方加固工具
// 这里只是提供配置示例
packaging {
jniLibs {
// 仅排除调试符号(减少 APK 体积)。不要排除 libc++_shared.so否则 release 安装后闪退Flutter 引擎/插件依赖该库)
excludes += listOf("**/*.so.dbg", "**/*.so.debug")
}
// 移除未使用的资源
resources {
excludes += listOf("META-INF/*.kotlin_module", "META-INF/*.version")
}
}
}
flutter {
source = "../.."
}
dependencies {
implementation("androidx.core:core:1.13.1")
implementation("androidx.multidex:multidex:2.0.1")
coreLibraryDesugaring("com.android.tools:desugar_jdk_libs:2.0.4")
// 华为/荣耀等设备 SSL 握手失败修复(不依赖 Google Play Services使用 Conscrypt 替代 GMS ProviderInstaller
implementation("org.conscrypt:conscrypt-android:2.5.2")
}

126
android/app/proguard-rules.pro vendored Normal file
View File

@@ -0,0 +1,126 @@
# ============================================
# 代码混淆和加固配置
# ============================================
# 优化配置
-optimizationpasses 5
-dontusemixedcaseclassnames
-dontskipnonpubliclibraryclasses
-verbose
# 移除日志减少APK大小提高安全性
-assumenosideeffects class android.util.Log {
public static *** d(...);
public static *** v(...);
public static *** i(...);
public static *** w(...);
public static *** e(...);
public static *** println(...);
}
# ============================================
# OpenIM SDK混淆规则
# ============================================
-keep class io.openim.** { *; }
-keep class open_im_sdk.** { *; }
-keep class open_im_sdk_callback.** { *; }
# ============================================
# Flutter相关(必须保留)
# ============================================
-keep class io.flutter.** { *; }
-keep class io.flutter.plugins.** { *; }
-keep class io.flutter.embedding.** { *; }
# Flutter Engine
-keep class io.flutter.embedding.engine.** { *; }
-keep class io.flutter.plugin.common.** { *; }
# ============================================
# 保持所有native方法
# ============================================
-keepclasseswithmembernames class * {
native <methods>;
}
# ============================================
# 保持所有枚举
# ============================================
-keepclassmembers enum * {
public static **[] values();
public static ** valueOf(java.lang.String);
}
# ============================================
# 保持所有Serializable类
# ============================================
-keepclassmembers class * implements java.io.Serializable {
static final long serialVersionUID;
private static final java.io.ObjectStreamField[] serialPersistentFields;
private void writeObject(java.io.ObjectOutputStream);
private void readObject(java.io.ObjectInputStream);
java.lang.Object writeReplace();
java.lang.Object readResolve();
}
# ============================================
# 保持反射使用的类
# ============================================
-keepattributes Signature
-keepattributes *Annotation*
-keepattributes EnclosingMethod
-keepattributes InnerClasses
-keepattributes Exceptions
# ============================================
# 保持Parcelable
# ============================================
-keepclassmembers class * implements android.os.Parcelable {
public static final android.os.Parcelable$Creator CREATOR;
}
# ============================================
# 保持R类资源类
# ============================================
-keepclassmembers class **.R$* {
public static <fields>;
}
# ============================================
# 混淆配置(提高安全性)
# ============================================
# 混淆类名
-keepnames class * extends android.app.Activity
-keepnames class * extends android.app.Application
-keepnames class * extends android.app.Service
-keepnames class * extends android.content.BroadcastReceiver
-keepnames class * extends android.content.ContentProvider
# 保持MainActivity应用入口
-keep class io.openim.flutter.openim.MainActivity { *; }
# ============================================
# 防止反编译(增强加固)
# ============================================
# 移除行号信息(提高安全性,崩溃日志可通过符号文件还原)
-keepattributes SourceFile
-renamesourcefileattribute SourceFile
# 移除调试信息
-assumenosideeffects class * {
public static *** print*(...);
public static *** println*(...);
}
# 混淆类名和包名(增强安全性)
-repackageclasses ''
-flattenpackagehierarchy ''
# 优化配置(增强混淆效果)
-optimizationpasses 5
-allowaccessmodification
-dontpreverify
# 移除未使用的代码
-dontwarn **

View File

@@ -0,0 +1,7 @@
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
<!-- The INTERNET permission is required for development. Specifically,
the Flutter tool needs it to communicate with the running application
to allow setting breakpoints, to provide hot reload, etc.
-->
<uses-permission android:name="android.permission.INTERNET"/>
</manifest>

View File

@@ -0,0 +1,111 @@
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
<!-- 网络权限 -->
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<!-- 存储权限 -->
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE" />
<!-- Image Cropper 权限 -->
<uses-permission android:name="android.permission.READ_MEDIA_IMAGES" />
<uses-permission android:name="android.permission.READ_MEDIA_VIDEO" />
<!-- 相机和麦克风权限 -->
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />
<!-- 通知权限 -->
<uses-permission android:name="android.permission.POST_NOTIFICATIONS" />
<uses-permission android:name="android.permission.VIBRATE" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
<!-- 系统窗口权限 -->
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
<!-- 设备信息权限 -->
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<!-- 位置权限(如果需要) -->
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<!-- 蓝牙权限(音视频通话可能需要) -->
<uses-permission android:name="android.permission.BLUETOOTH" />
<uses-permission android:name="android.permission.BLUETOOTH_CONNECT" />
<!-- 音频焦点权限 -->
<uses-permission android:name="android.permission.AUDIO_FOCUS" />
<!-- 前台服务权限 -->
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
<uses-permission android:name="android.permission.FOREGROUND_SERVICE_MEDIA_PLAYBACK" />
<uses-permission android:name="android.permission.FOREGROUND_SERVICE_PHONE_CALL" />
<!-- 安装应用权限(升级功能) -->
<uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES" />
<!-- 查询其他应用权限 -->
<uses-permission android:name="android.permission.QUERY_ALL_PACKAGES" />
<application
android:label="集中营"
android:name="${applicationName}"
android:icon="@mipmap/ic_launcher"
android:networkSecurityConfig="@xml/network_security_config"
android:usesCleartextTraffic="true">
<activity
android:name=".MainActivity"
android:exported="true"
android:launchMode="singleTop"
android:taskAffinity=""
android:theme="@style/LaunchTheme"
android:configChanges="orientation|keyboardHidden|keyboard|screenSize|smallestScreenSize|locale|layoutDirection|fontScale|screenLayout|density|uiMode"
android:hardwareAccelerated="true"
android:windowSoftInputMode="adjustResize">
<!-- Specifies an Android theme to apply to this Activity as soon as
the Android process has started. This theme is visible to the user
while the Flutter UI initializes. After that, this theme continues
to determine the Window background behind the Flutter UI. -->
<meta-data
android:name="io.flutter.embedding.android.NormalTheme"
android:resource="@style/NormalTheme"
/>
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
</activity>
<!-- File Provider for APK install/update flows inherited from the old app. -->
<provider
android:name="androidx.core.content.FileProvider"
android:authorities="${applicationId}.fileprovider"
android:exported="false"
android:grantUriPermissions="true">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/file_paths" />
</provider>
<!-- Don't delete the meta-data below.
This is used by the Flutter tool to generate GeneratedPluginRegistrant.java -->
<meta-data
android:name="flutterEmbedding"
android:value="2" />
</application>
<!-- Required to query activities that can process text, see:
https://developer.android.com/training/package-visibility and
https://developer.android.com/reference/android/content/Intent#ACTION_PROCESS_TEXT.
In particular, this is used by the Flutter engine in io.flutter.plugin.text.ProcessTextPlugin. -->
<queries>
<intent>
<action android:name="android.intent.action.PROCESS_TEXT"/>
<data android:mimeType="text/plain"/>
</intent>
</queries>
</manifest>

View File

@@ -0,0 +1,5 @@
package io.openim.flutter.im_webview_app
import io.flutter.embedding.android.FlutterActivity
class MainActivity : FlutterActivity()

View File

@@ -0,0 +1,146 @@
package io.openim.flutter.openim
import android.content.Intent
import android.content.pm.PackageInfo
import android.content.pm.PackageManager
import android.net.Uri
import android.os.Build
import android.util.Log
import androidx.core.content.FileProvider
import io.flutter.embedding.android.FlutterActivity
import org.conscrypt.Conscrypt
import java.security.Security
import io.flutter.embedding.engine.FlutterEngine
import io.flutter.plugin.common.MethodChannel
import java.io.File
class MainActivity : FlutterActivity() {
private val CHANNEL = "io.openim.flutter.openim/apk_info"
private val TAG = "MainActivity"
override fun onCreate(savedInstanceState: android.os.Bundle?) {
// 华为/荣耀/OPPO 等国产设备:在任意网络请求之前同步安装 Conscrypt修复 SSL 握手失败(无 GMS 时系统 SSL 实现不完整)
try {
Security.insertProviderAt(Conscrypt.newProvider(), 1)
Log.d(TAG, "Conscrypt security provider installed (SSL fix for domestic devices)")
} catch (e: Exception) {
Log.w(TAG, "Conscrypt provider install failed: ${e.message}")
}
super.onCreate(savedInstanceState)
}
override fun configureFlutterEngine(flutterEngine: FlutterEngine) {
super.configureFlutterEngine(flutterEngine)
MethodChannel(flutterEngine.dartExecutor.binaryMessenger, CHANNEL).setMethodCallHandler { call, result ->
when (call.method) {
"getApkPackageName" -> {
val apkPath = call.argument<String>("apkPath")
if (apkPath != null) {
try {
val packageName = getApkPackageName(apkPath)
result.success(packageName)
} catch (e: Exception) {
result.error("ERROR", "无法解析APK包名: ${e.message}", null)
}
} else {
result.error("ERROR", "APK路径为空", null)
}
}
"getCurrentPackageName" -> {
try {
val packageName = packageName
result.success(packageName)
} catch (e: Exception) {
result.error("ERROR", "无法获取当前包名: ${e.message}", null)
}
}
"canRequestPackageInstalls" -> {
try {
val canInstall = canRequestPackageInstalls()
result.success(canInstall)
} catch (e: Exception) {
result.error("ERROR", "无法检查安装权限: ${e.message}", null)
}
}
"installApk" -> {
val apkPath = call.argument<String>("apkPath")
if (apkPath != null) {
try {
val success = installApk(apkPath)
result.success(success)
} catch (e: Exception) {
result.error("ERROR", "安装APK失败: ${e.message}", null)
}
} else {
result.error("ERROR", "APK路径为空", null)
}
}
else -> {
result.notImplemented()
}
}
}
}
private fun getApkPackageName(apkPath: String): String? {
return try {
val packageManager = packageManager
val packageInfo: PackageInfo = packageManager.getPackageArchiveInfo(
apkPath,
PackageManager.GET_ACTIVITIES
) ?: return null
packageInfo.packageName
} catch (e: Exception) {
null
}
}
/// 检查是否可以请求安装包权限Android 8.0+
private fun canRequestPackageInstalls(): Boolean {
return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
// Android 8.0+ 需要检查安装权限
packageManager.canRequestPackageInstalls()
} else {
// Android 8.0 以下版本默认允许安装
true
}
}
/// 使用 Intent 直接打开安装界面
private fun installApk(apkPath: String): Boolean {
return try {
val file = File(apkPath)
if (!file.exists()) {
return false
}
val intent = Intent(Intent.ACTION_VIEW).apply {
flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TOP
val apkUri = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
// Android 7.0+ 使用 FileProvider
FileProvider.getUriForFile(
this@MainActivity,
"${packageName}.fileprovider",
file
)
} else {
// Android 7.0 以下直接使用 file://
Uri.fromFile(file)
}
setDataAndType(apkUri, "application/vnd.android.package-archive")
// Android 7.0+ 需要添加临时读取权限
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION)
}
}
startActivity(intent)
true
} catch (e: Exception) {
false
}
}
}

View File

@@ -0,0 +1,12 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Modify this file to customize your launch splash screen -->
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="?android:colorBackground" />
<!-- You can insert your own image assets here -->
<!-- <item>
<bitmap
android:gravity="center"
android:src="@mipmap/launch_image" />
</item> -->
</layer-list>

View File

@@ -0,0 +1,12 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Modify this file to customize your launch splash screen -->
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@android:color/white" />
<!-- You can insert your own image assets here -->
<!-- <item>
<bitmap
android:gravity="center"
android:src="@mipmap/launch_image" />
</item> -->
</layer-list>

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

View File

@@ -0,0 +1,18 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<!-- Theme applied to the Android Window while the process is starting when the OS's Dark Mode setting is on -->
<style name="LaunchTheme" parent="@android:style/Theme.Black.NoTitleBar">
<!-- Show a splash screen on the activity. Automatically removed when
the Flutter engine draws its first frame -->
<item name="android:windowBackground">@drawable/launch_background</item>
</style>
<!-- Theme applied to the Android Window as soon as the process has started.
This theme determines the color of the Android Window while your
Flutter UI initializes, as well as behind your Flutter UI while its
running.
This Theme is only used starting with V2 of Flutter's Android embedding. -->
<style name="NormalTheme" parent="@android:style/Theme.Black.NoTitleBar">
<item name="android:windowBackground">?android:colorBackground</item>
</style>
</resources>

View File

@@ -0,0 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="app_name">本地打包</string>
</resources>

View File

@@ -0,0 +1,18 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<!-- Theme applied to the Android Window while the process is starting when the OS's Dark Mode setting is off -->
<style name="LaunchTheme" parent="@android:style/Theme.Light.NoTitleBar">
<!-- Show a splash screen on the activity. Automatically removed when
the Flutter engine draws its first frame -->
<item name="android:windowBackground">@drawable/launch_background</item>
</style>
<!-- Theme applied to the Android Window as soon as the process has started.
This theme determines the color of the Android Window while your
Flutter UI initializes, as well as behind your Flutter UI while its
running.
This Theme is only used starting with V2 of Flutter's Android embedding. -->
<style name="NormalTheme" parent="@android:style/Theme.Light.NoTitleBar">
<item name="android:windowBackground">?android:colorBackground</item>
</style>
</resources>

View File

@@ -0,0 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<paths xmlns:android="http://schemas.android.com/apk/res/android">
<external-path name="external_files" path="."/>
<cache-path name="cache" path="."/>
<external-cache-path name="external_cache" path="."/>
<files-path name="files" path="."/>
</paths>

View File

@@ -0,0 +1,16 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
国内网络 / 国产手机华为、荣耀、OPPO、小米等兼容配置
- cleartextTrafficPermitted允许 HTTP与后端是否 HTTPS 无关,部分 ROM 会严格检查
- trust-anchors system + user系统证书 + 用户证书,兼容企业/校园网等需安装根证书的环境
-->
<network-security-config>
<base-config cleartextTrafficPermitted="true">
<trust-anchors>
<certificates src="system" />
<!-- 兼容国内企业/校园网等需安装根证书或代理证书的环境(华为/荣耀/OPPO 等部分场景) -->
<certificates src="user" />
</trust-anchors>
</base-config>
</network-security-config>

View File

@@ -0,0 +1,7 @@
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
<!-- The INTERNET permission is required for development. Specifically,
the Flutter tool needs it to communicate with the running application
to allow setting breakpoints, to provide hot reload, etc.
-->
<uses-permission android:name="android.permission.INTERNET"/>
</manifest>