HarmonyOS 鸿蒙Next hap生成修改内容分享

HarmonyOS 鸿蒙Next hap生成修改内容分享

  1. 目标,修改配置文件

  2. 命令打包hap hvigorw assembleHap 或者 .\hvigorw assembleHap

  3. 获得生成的hap包

我的实现是:先获取系统时间,然后把versionName改成系统时间,在进行编译成为hap包,把hap包cp重命名出来,需要修改其他东西也是类似

代码:工具代码只能参考,assembleHap.bat 必须在工程根目录,里面内容位.\hvigorw assembleHap 需要自己创建

import com.jayway.jsonpath.DocumentContext;
import com.jayway.jsonpath.JsonPath;
import java.text.SimpleDateFormat;
import java.util.Calendar;

public class Main {
public static void main(String[] args) throws Exception {
        String versionName = generateVersionName();
        String appJson5Path = "AppScope/app.json5";
        //第一步:修改appJson5文件中的versionName
        //将Json文件读取为字符串
        String jsonStr = FileUtils.readFile(appJson5Path);
 //修改Json的value
        DocumentContext context = JsonPath.parse(jsonStr);
        JsonPath path = JsonPath.compile("$.app.versionName");
        context.set(path, versionName);
        String changedJson = context.jsonString();
        //将json字符串格式化 并写入制定文件
 FileUtils.writeFile(appJson5Path, FormatJsonUtlis.formatJson(changedJson));
        //第二步:编译
//        Process process = new ProcessBuilder(".\\hvigorw assembleHap").start();
        String command = "assembleHap.bat";
        Process process = Runtime.getRuntime().exec(command);
  // 等待命令执行完成
        int exitCode = process.waitFor();
        System.out.println("Exit code: " + exitCode);
        //第三步:将打包文件重命名
        String oldPath = "entry/build/default/outputs/default/entry-default-signed.hap";
        String newPath = "entry/build/default/outputs/default/" + versionName + ".hap";
        FileUtils.copyFile(oldPath, newPath);
 }
    private static String generateVersionName() {
        String name = ".V1.0.0.0-";
        Calendar calendar = Calendar.getInstance();
        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMdd.hhmmss");
        String versionName = name + dateFormat.format(calendar.getTime());
        return versionName;
    }
}
import java.io.*;

public class FileUtils {
    public static String readFile(String path){
        // 读取文件数据
        StringBuffer strbuffer = new StringBuffer();
        File myFile = new File(path);
        if (!myFile.exists()) {
            System.err.println("Can't Find " + path);
        } try {
            FileInputStream fis = new FileInputStream(path);
            InputStreamReader inputStreamReader = new InputStreamReader(fis, "UTF-8");
            BufferedReader in  = new BufferedReader(inputStreamReader);
            String str;
            while ((str = in.readLine()) != null) {
                strbuffer.append(str);  //new String(str,"UTF-8")
            } in.close();
        } catch (IOException e) {
            e.getStackTrace();
        }
        return strbuffer.toString();
    }
 public static boolean writeFile(String filePath, String content) {
        FileWriter fw;
        try {
            fw = new FileWriter(filePath);
            PrintWriter out = new PrintWriter(fw);
            out.write(content);
            out.println();
 fw.close();
            out.close();
            return true;
        } catch (IOException e) {
            e.printStackTrace();
            return false;
        }
  }
 public static void copyFile(String oldPath,String newPath) throws Exception{
        File result = new File(newPath);
        if (!result.getParentFile().exists()){
            result.getParentFile().mkdirs();
        }
FileInputStream input = new FileInputStream(oldPath);
        FileOutputStream out = new FileOutputStream(result);
        byte[] buffer = new byte[1000];
        int hasRead = 0;
 while ((hasRead = input.read(buffer)) > 0) {
            //0:表示每次从0开始
            out.write(buffer, 0, hasRead);
        }
        System.out.println(result.getAbsolutePath());
        input.close();
        out.close();
    }

}
public class FormatJsonUtlis {

    /**
     * 格式化
     */
    public static String formatJson(String jsonStr) {
if (null == jsonStr || "".equals(jsonStr))
            return "";
        StringBuilder sb = new StringBuilder();
        char last = '\0';
        char current = '\0';
        int indent = 0;
boolean isInQuotationMarks = false;
        for (int i = 0; i < jsonStr.length(); i++) {
            last = current;
            current = jsonStr.charAt(i);
            switch (current) {
 case '"':
                    if (last != '\\'){
                        isInQuotationMarks = !isInQuotationMarks;
                    }
                    sb.append(current);
                    break;
 case '{':
                case '[':
                    sb.append(current);
                    if (!isInQuotationMarks) {
                        sb.append('\n');
                        indent++;
                        addIndentBlank(sb, indent);
                    } break;
 case '}':
                case ']':
                    if (!isInQuotationMarks) {
                        sb.append('\n');
                        indent--;
                        addIndentBlank(sb, indent);
                    }
                    sb.append(current);
                    break;
case ',':
                    sb.append(current);
                    if (last != '\\' && !isInQuotationMarks) {
                        sb.append('\n');
                        addIndentBlank(sb, indent);
                    }
                    break;
 default:
                    sb.append(current);
            }
        }

        return sb.toString();
    }
 private static void addIndentBlank(StringBuilder sb, int indent) {
        for (int i = 0; i < indent; i++) {
            sb.append('\t');
        }
    }
}

更多关于HarmonyOS 鸿蒙Next hap生成修改内容分享的实战教程也可以访问 https://www.itying.com/category-93-b0.html

1 回复

更多关于HarmonyOS 鸿蒙Next hap生成修改内容分享的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


HarmonyOS鸿蒙Next的hap(HarmonyOS Ability Package)是应用的分发包,包含应用的代码、资源、配置文件等。生成和修改hap主要涉及以下几个方面:

  1. 项目配置:在config.json中进行应用的全局配置,包括应用名称、版本号、支持的设备类型等。修改此文件可以调整应用的基本属性和行为。

  2. 页面路由:在pages目录下配置页面路由信息,修改pages数组中的页面路径可以调整应用的页面跳转逻辑。

  3. 资源管理:资源文件存放在resources目录下,包括图片、字符串、样式等。修改这些资源可以调整应用的UI和文本内容。

  4. 模块化开发:鸿蒙Next支持模块化开发,可以在module.json中配置模块的依赖和功能。修改此文件可以调整模块的加载顺序和功能实现。

  5. 打包生成hap:使用DevEco Studio的打包功能生成hap文件。在build.gradle中配置构建参数,如签名信息、混淆规则等。修改此文件可以调整应用的构建方式。

  6. 调试与测试:生成hap后,可以通过DevEco Studio的模拟器或真机进行调试和测试。修改代码和资源后,重新生成hap进行验证。

  7. 发布与分发:hap生成后,可以通过华为应用市场或其他渠道进行发布和分发。修改应用的版本号和发布渠道可以调整应用的发布策略。

以上是鸿蒙Next hap生成和修改的主要内容,具体操作需结合实际开发需求进行。

回到顶部