需要
有时候在使用Android Studio创建demo进行开发验证过程中。创建的demo不能直接运行比较浪费时间。所以我写了一个脚本,可以把能运行的demo作为模版。
import os
import shutil
# 定义需要处理的文本文件扩展名
TEXT_FILE_EXTENSIONS = {'.kt', '.java', '.xml', '.gradle', '.pro', '.properties', '.txt', '.html', '.css', '.js', '.json', '.yml', '.yaml','.kts'}
def is_text_file(filename):
"""判断文件是否为文本文件(根据扩展名)"""
ext = os.path.splitext(filename)[1].lower()
return ext in TEXT_FILE_EXTENSIONS
def make_demo(project_name, package_name):
# 源 demo 目录路径
source_dir = r'D:\Users\Desktop\AppDemo\AppDemo\KTLearn'
# 新项目目录路径
target_dir = os.path.join(os.getcwd(), project_name)
# 复制源目录到目标目录
if os.path.exists(target_dir):
shutil.rmtree(target_dir) # 避免目标已存在
shutil.copytree(source_dir, target_dir)
# 创建包名对应的目录结构
java_dir = os.path.join(target_dir, 'app', 'src', 'main', 'java')
package_dirs = package_name.replace('.', os.sep)
package_path = os.path.join(java_dir, package_dirs)
os.makedirs(package_path, exist_ok=True)
# 移动 MainActivity.kt 到新创建的包目录下
original_main_activity_path = os.path.join(
target_dir, 'app', 'src', 'main', 'java', 'com', 'example', 'ktlearn', 'MainActivity.kt'
)
new_main_activity_path = os.path.join(package_path, 'MainActivity.kt')
if os.path.exists(original_main_activity_path):
shutil.move(original_main_activity_path, new_main_activity_path)
else:
print(f"警告: 找不到文件 {original_main_activity_path}")
# ✅ 新增:删除旧的 com.example 目录(包括 ktlearn 子目录)
old_com_example_path = os.path.join(target_dir, 'app', 'src', 'main', 'java', 'com', 'example')
if os.path.exists(old_com_example_path):
shutil.rmtree(old_com_example_path)
print(f"已删除多余目录: {old_com_example_path}")
# 遍历目标目录中的所有文件并替换占位符(仅限文本文件)
for root, dirs, files in os.walk(target_dir):
for file in files:
file_path = os.path.join(root, file)
# 只处理文本文件
if not is_text_file(file):
continue # 跳过非文本文件
try:
with open(file_path, 'r', encoding='utf-8') as f:
content = f.read()
# 替换占位符
new_content = content.replace('$PACKAGE_NAME', package_name)
new_content = new_content.replace('$PROJECT_NAME', project_name)
with open(file_path, 'w', encoding='utf-8') as f:
f.write(new_content)
except UnicodeDecodeError:
print(f"跳过文件(非UTF-8编码): {file_path}")
except Exception as e:
print(f"处理文件失败: {file_path} - {e}")
if __name__ == "__main__":
project_name = input("请输入项目名称: ")
package_name = input("请输入包名: ")
make_demo(project_name, package_name)
print(f"项目 {project_name} 创建成功!")
使用
把上面的脚本中的source_dir 替换为模版所在的路径。同时把包名用这个作为占位符。$PACKAGE_NAME
项目名用 $PROJECT_NAME 做占位符,会扫描所有文本文件并替换。
在控制台使用 python makeDemo.py来执行,依次输入项目名和包名就行了