首页 > 解决方案 > Android Studio 重构和基本搜索/替换有什么区别?

问题描述

我正在尝试将 Android Studio 下的包名称从 generic_app 更改为 app_name。

我可以使用 Android Studio 中的“重构”工具,但我正在尝试使用 python 脚本来执行此操作。但是,当我进行搜索和替换时,我在 android studio 中打开我的项目,我的包名没有改变。对 app_name 的调用在我的活动和片段中使用,但包名称保持不变。

即使在构建清理/重建项目之后,一些“生成”的东西仍然保留着旧的包名称。

与 Android Studio 中的 Refactor 工具以及外部搜索和替换有什么区别?

我怎样才能做到这一点?

这是我的python代码(我今天开始,如果代码很糟糕,很抱歉,请随时给我一些建议):

import os
import sys
import fileinput

sys.argv = [sys.argv[0], 'appName', 'package_name', '123', 'api_address']

def main():
    cls()
    print("Starting compiler...")
    if (len(sys.argv) > 4):
        print("")
        print("App name                  : {}".format(sys.argv[1]))
        print("Package name              : {}".format(sys.argv[2]))
        print("Establishment ID          : {}".format(sys.argv[3]))
        print("Establishment api address : {}".format(sys.argv[4]))
        input("\nPress any key to confirm")
        setup(sys.argv[1])
        refactor_package(sys.argv[1])
        change_app_name(sys.argv[2])
        set_establishment_id(sys.argv[3])
        set_establishment_api_address(sys.argv[4])
    else:
        print("Incorrect use.")
        print(".\\autocompiler.py app_name package_name establishment_id establishment_api_address")
    os.chdir('..')
    message = "\nPress any key to close"
    choice = input(message).upper()

def setup(app_name):
    command = ""
    if (os.name == 'nt'):
        command = "robocopy /E generic_app {}".format(app_name)
    else:
        command = "cp -rf ./generic_app {}".format(app_name)
    os.system(command) # Will copy generic_app in a new project folder
    os.chdir(app_name)  # Will go in the created directory
    command = "gradlew clean"
    os.system(command)  # Clear .build directory
    command = "gradlew cleanBuildCache"
    os.system(command)  # Clear .build cache directory

    # Refactor ; change establishment ID && API address ; build

def refactor_package(package_name):
    rootdir = os.getcwd()
    for root, subFolders, files in os.walk(rootdir):
        #print("ROOT == {}".format(root))
        for file in files:
            #print("\t\tFILE == {}".format(file))
            if (os.name == 'nt'):
                check_file(root + '\\' + file, package_name)
            else:
                check_file(root + '/' + file, package_name)
        for subFolder in subFolders:
            print("\t\tSUBFOLDER == {}".format(subFolders))

def check_file(filePath, packageName):
    if ("app\src\main\java\com\discodery\android" in filePath
        and ".git" not in filePath):
        print("OPENING FILE {}".format(filePath))
        with open(filePath, "r") as file:
            data = file.read()
            #print("---------- ORIGINAL ----------")
            #print(data)
            file = open(filePath, "w")
            file.write(data.replace("generic_app", packageName))
            #print("===== RESULT =====")
            file.close()
            file = open(filePath, "r")
            data = file.read()
            #print(data)
            file.close()
            # input("Press any key to continue")
    elif ("app\src\main\AndroidManifest.xml" in filePath):
        print("SHOULD EDIT MANIFEST")
        input("OK")
        with open(filePath, "r") as file:
            data = file.read()
            file = open(filePath, "w")
            file.write(data.replace('package="com.genericapp"', 'package="com.{}"'.format(packageName)))
            file.close()
    elif ("app\build.gradle" in filePath):
        print("SHOULD EDIT APP BUILD.GRADLE")
        input("OK")
        with open(filePath, "r") as file:
            data = file.read()
            file = open(filePath, "w")
            file.write(data.replace('applicationId "com.discodery.android.genericapp"', 'applicationId "com.discodery.android.{}"'.format(packageName)))
            file.close()

def change_app_name(app_name):
    pass

def set_establishment_id(establishment_id):
    pass

def set_establishment_api_address(api_address):
    pass

def cls():
    os.system('cls' if os.name == 'nt' else 'clear')

main()

标签: androidpythonandroid-studiokotlinrefactoring

解决方案


IntelliJ 的 Refactor 选项确实是“查找和替换”。从某种意义上说,它还不止于此,它更强大并且可以提防很多事情。(不要大声说出来,但它也会带来副作用。)

我会说第一步是查找和替换,但这是一个智能的步骤。当您重构参数的名称时,它只会更新它,而不是下面包含相同单词的方法 200 行。

它还查找所有用法,这比全局查找和替换更强大。

如果出现冲突,IDE 提供了一个界面来选择退出某些更改。等等。在https://www.jetbrains.com/help/idea/tutorial-introduction-to-refactoring.html阅读更多内容


推荐阅读