[转]:xmake高级特性之自定义脚本使用

news/2024/7/8 9:40:17 标签: 移动开发, lua, java

xmake提供了自定义打包、安装、运行脚本,可以更加灵活的针对个人实际需求来操作xmake

这里用一个例子详细说明下,比如有个需求,我需要自动编译、安装、运行android app工程,并且能够支持jni
可以进行如下操作

首先创建个基于ant的android app工程,目录结构如下:

app
└── android
    ├── AndroidManifest.xml
    ├── ant.properties
    ├── bin
    │   └── Demo-debug.apk
    ├── build.xml
    ├── jni
    │   └── demo.c
    ├── libs
    │   └── armeabi
    │       └── libdemo.so
    ├── local.properties
    ├── proguard-project.txt
    ├── project.properties
    ├── res
    │   ├── drawable-hdpi
    │   │   └── ic_launcher.png
    │   ├── drawable-ldpi
    │   │   └── ic_launcher.png
    │   ├── drawable-mdpi
    │   │   └── ic_launcher.png
    │   ├── drawable-xhdpi
    │   │   └── ic_launcher.png
    │   ├── layout
    │   │   └── main.xml
    │   └── values
    │       └── strings.xml
    ├── src
    │   └── com
    │       └── demo
    │           └── DemoTest.java
    └── xmake.lua

-- 添加一个android app的测试demo

lua">add_target("demo")

    -- 生成动态库:libdemo.so
    set_kind("shared")

    -- 设置对象的输出目录,可选
    set_objectdir("$(buildir)/.objs")

    -- 每次编译完的libdemo.so的生成目录,设置为app/libs/armeabi
    set_targetdir("libs/armeabi")

    -- 添加jni的代码文件
    add_files("jni/*.c")

    -- 设置自定义打包脚本,在使用xmake编译完libdemo.so后,执行xmake p进行打包
    -- 会自动使用ant将app编译成apk文件
    --
    -- target参数提供了一些编译目标的信息,例如:目标文件路径,目标类型等等
    -- 具体有哪些信息,可以调用 utils.dump(target) 打印出来
    -- 当然首先得import("utils")导入这个utils模块
    set_packagescript(  function (target) 
            
                            -- 导入一些内置模块
                            local os = import("os")
                            local path = import("path")
                            local project = import("project")
                            assert(target and os and path and project) 

                            -- 获取编译错误输出的日志文件,用于重定向输出,可选
                            -- 一般用于隐藏ant工具的内部输出信息,但是编译出错后,xmake会去自动显示出来
                            local logfile = path.absolute(project.logfile())

                            -- 首先清除app的bin的目录
                            os.rmdir("bin")

                            -- 打印一些信息
                            print("buiding app")

                            -- 使用ant编译app成apk文件,输出信息重定向到日志文件
                            if 0 ~= os.execute(string.format("ant debug > %s 2>&1", logfile)) then
                                -- 出错后,显示日志文件中的信息
                                os.cat(logfile)
                                return -1 
                            end

                            -- 如果成功打包,返回1,就不再执行内置默认的打包流程了
                            -- 如果返回0,会继续执行内部默认的打包程序
                            -- 如果返回-1,说明打包失败,终止运行
                            return 1
                        end)


    -- 设置自定义安装脚本,自动安装apk文件
    set_installscript(  function (target) 

                            -- 导入一些内置模块
                            local os = import("os")
                            local path = import("path")
                            local project = import("project")
                            assert(target and os and path and project) 

                            -- trace
                            print("installing app")

                            -- the logfile
                            local logfile = path.absolute(project.logfile())

                            -- 使用adb安装打包生成的apk文件
                            if 0 ~= os.execute(string.format("adb install -r ./bin/Demo-debug.apk > %s 2>&1", logfile)) then
                                -- failed
                                os.cat(logfile)
                                return -1 
                            end

                            -- ok
                            return 1
                        end)


    -- 设置自定义运行脚本,自动运行安装好的app程序,并且自动获取设备输出信息
    set_runscript(  function (target) 

                            -- 导入一些内置模块
                        local os = import("os")
                        assert(target and os) 

                        -- 设置过滤器,来过滤设备输出信息,当然默认也可以不设置
                        -- 使用如下:xmake r demo filter
                        local filter = nil
                        if target.arguments ~= nil then
                            filter = target.arguments[1]
                        end

                        local cmd = "adb shell am start -n com.demo/com.demo.DemoTest ; adb logcat"
                        if filter ~= nil then
                            cmd = cmd .. " | grep " .. filter
                        end

                        -- 使用adb运行app程序
                        if 0 ~= os.execute(cmd) then
                            return -1 
                        end

                        -- ok
                        return 1
                    end)

修改完xmake.lua后,就可以很方便的使用了:

# 重新编译工程,生成libdemo.so到app/libs/armeabi
xmake -r

# 打包app为apk
xmake p

# 安装apk到设备上
xmake i

# 运行app,并获取日志信息
xmake r demo

如果觉得上面的步骤有点繁琐,可以简化成:

-- 安装的时候,会先去自动打包,所以可以省略xmake p
xmake -r; xmake i; xmake r demo

如果是增量编译,不需要重建,可以继续简化:

xmake i; xmake r demo

当然,由于是根据自己的实际需求自定义的脚本,可能跨平台性有点弱,像这里只能支持android的编译平台,

你也可以使用 if plats("android") then ... end 来做一些跨平台处理


  • XMake项目详情

  • XMake项目源码

  • XMake项目文档

  • 原文出处:http://tboox.org/cn/2016/06/09/custom-action/


http://www.niftyadmin.cn/n/1593362.html

相关文章

APP性能优化系列-自定义启动器(三),Redis如何实现高可扩展

/** 该task如果是异步任务,是否需要先等待自己完成后, 主线程在继续,也就是是否需要在主线程调用await的时候等待 */ boolean needWait(); /** 是否在主线程执行 */ boolean runOnMainThread(); /** 只能在主进程执行 */ boolean…

高级语言虚拟机(HLL VM)的设计与实现

为什么80%的码农都做不了架构师?>>> 关注各种高级语言虚拟机(high-level language virtual machine,HLL VM)的设计与实现,泛化至各种高级语言的运行时的设计与实现,也会涉及动态编译、GC、动态…

Ajax实现搜索文本框自动联想功能,javassm框架面试重点

后台servlet代码: package servlet; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServlet…

Alibaba技术专家必知必会的Java技术知识点,掌握这些理论+实践

凡事预则立,在开始行动之前,我们有必要先来了解下这个岗位的核心要求,以及必知必会的技术能力,只有目标清晰、方向明确,才能事半功倍。 大纲: 架构师岗位职责 架构师必知必会技术 架构师学习资料包【福利…

Corosync+Pacemaker实现web集群高可用

一、简介高可用集群结构a.Messaging Layer:信息层,心跳信息传输层。 b.RA(Resource Allocation):资源分配层。该层的核心组件叫CRM。1).CRM(Cluster Resources Manager):集群资源管理器,依赖于各自底层的Messaging Layer。高可用集群中任何资源都不应该自…

Apache SkyWalking 告警配置指南,java的网络编程教程视频

service_resp_time_rule: metrics-name: service_resp_time op: “>” threshold: 1000 period: 10 count: 2 silence-period: 10 message: 服务【{name}】的平均响应时间在最近10分钟内有2分钟超过1秒 service_instance_resp_time_rule: metrics-name: service_in…

Spring对事务的支持

目录 事务的传播行为 一、什么是事务的传播行为 二、7种事务传播行为 1. REQUIRED 2. REQUIRES_NEW 3. NESTED 4. 总结 三、事务的传播行为(理解记忆) 转载:一个99%的人都说不清楚知识点——Spring 事务传播行为 - 哔哩哔哩 事务属性…

第十一章以太网交换机工作原理

在局域网中,交换机是非常重要的网络设备,负责在主机之间快速转发数据帧。交换机与集线器的不同之处在于,交换机工作在数据链路层,能够根据数据帧中的MAC地址进行转发。本章介绍了共享式以太网和交换式以太网的区别,最后…