详细讲解TinyPiXOS应用开发规范、打包规范,快速上手TinyPiX应用开发,还有更多案例源码!

本文将通过实现一个简单应用介绍如何基于TinyPiXOS开发新应用。主要内容包括应用开发规范应用打包安装运行测试三部分。


我们已经开发了一些简单应用,如系统桌面、设置、媒体播放器、文件管理器等。可以通过开源仓库查看应用源码。

仓库地址:

  • gitee:
    https://gitee.com/organizations/tinypixos/projects
  • github:
    https://github.com/orgs/TinyPiXOS/repositories

应用开发规范

应用目录结构规范

AppWorkSpace/
├── bin/
│   ├── appRunner
│   └── lib.so
├── conf/
├── res/
├── data/
├── src/
│   ├── mainWindowService.h
│   ├── mainWindowService.cpp
│   └── main.cpp
├── CMakeList.txt
└── CMakePresets.json

目录介绍

  • bin 应用所有可执行程序及程序依赖动态库目录
  • conf 配置文件目录
  • res 资源文件目录
  • data 数据文件目录
  • src 源码文件目录

APP开发(示例)

实现一个显示交互按钮的简单应用。

项目创建(自动创建目录结构)

  1. 拉取应用模板项目tinyPiXApp Example
  2. 使用扩展插件在指定位置创建应用(未来扩展)

创建应用主窗体

模板项目会默认创建 mainWindowService作为应用主窗体;可以直接使用或创建自定义窗体继承于tpFixScreen,并在主函数使用

创建一个按钮

包含tpButton头文件

#include "tpButton.h"

声明测试按钮

tpButton *testButton_;

初始化按钮

testButton_ = new tpButton("测试按钮", this);
testButton_->setSize(300, 70);
testButton_->move(150, 150);

完整源码

源代码

#ifndef __MAIN_WINDOW_SERVICE_H
#define __MAIN_WINDOW_SERVICE_H

#include "tpFixScreen.h"
#include "examplesAppGlobal.h"
#include "tpButton.h"

class mainWindowService
    : public tpFixScreen
{
public:
    mainWindowService();
    virtual ~mainWindowService();

public:
    virtual bool appChange(int32_t id, int32_t pid, int32_t rotate, int32_t visible, int32_t active, int32_t color, uint8_t alpha, int32_t require) override;

protected:
    virtual bool onResizeEvent(tpObjectResizeEvent *event) override;

    virtual bool onRotateEvent(tpObjectRotateEvent *event) override;

    virtual bool onActiveEvent(tpObjectActiveEvent *event) override;

private:
    tpButton *testButton_;
};

#endif

头文件

#include "mainWindowService.h"

mainWindowService::mainWindowService()
    : tpFixScreen()
{
    setStyleSheet(applicationDirPath() + "/../data/style.css");

    setBackGroundColor(_RGB(128, 128, 128));

    testButton_ = new tpButton("测试按钮1", this);
    testButton_->setSize(300, 70);
    testButton_->move(150, 150);
}

mainWindowService::~mainWindowService()
{
}

bool mainWindowService::appChange(int32_t id, int32_t pid, int32_t rotate, int32_t visible, int32_t active, int32_t color, uint8_t alpha, int32_t require)
{
    std::cout << "mainWindowService::appChange" << std::endl;

    return true;
}

bool mainWindowService::onResizeEvent(tpObjectResizeEvent *event)
{
    std::cout << "mainWindowService::onResizeEvent" << std::endl;

    return true;
}

bool mainWindowService::onRotateEvent(tpObjectRotateEvent *event)
{
    std::cout << "mainWindowService::onRotateEvent" << std::endl;

    return true;
}

bool mainWindowService::onActiveEvent(tpObjectActiveEvent *event)
{
    std::cout << "mainWindowService::onActiveEvent" << std::endl;

    return true;
}

编译和运行

代码编译

cmake
make
make install

启动模拟器

PiXWM

运行应用

./examplesApp

运行结果

详细讲解TinyPiXOS应用开发规范、打包规范,快速上手TinyPiX应用开发,还有更多案例源码!_第1张图片

应用打包

我们参考主流桌面系统的应用打包规范,初步设计实现了TinyPiXOS的应用打包要求。

项目文件准备

APP打包接口负责应用的标准化封装。开发者可通过该模块直接调用接口配置应用基本信息(包括应用名称、开发者联系方式及公司/组织信息)与运行所需文件(含可执行文件、资源文件、库文件等),或通过预定义的JSON配置文件一次性设置全部参数后调用专用接口实现一键打包。

应用打包

基于json配置文件进行打包

json文件为应用的配置信息,内容如下:

{
    "appID": "f03c8f8c-dd9b-453f-b2d4-d049c073e252",
    "appName": "MyApp",
    "organization": "MyCompany",
    "version": "1.0.0",
    "appexecName": "/path/mytestapp",
    "architecture": "amd64",
    "section": "free",
    "priority": "optional",
    "essential": "no",
    "diskspace": "102400",
    "description": "this is tinyPiXOS test APP",
    "signature": "",
    "icon": "/path/icon.jpeg",
    "author": {
        "name": "Name",
        "email": "[email protected]"
    },
    "fileExtension": [
        ".jpeg",
        ".jpg",
        ".png",
    ],
    "startupParameters": [
        "--fullscreen",
        "--server"
    ],
    "libraries": [
        "/path/libmytest.so"
    ],
    "dependencies": [
        {
            "name": "libdependency1",
            "version": "1.2"
        },
        {
            "name": "libdependency2",
            "version": "3.1"
        }
    ],
    "assertFiles": [
        "/path/assert/mysrc",
        "/path/assert/picture"
    ],
    "binFiles": [
        "/path/bin_1",
        "/path/bin_2"
    ],
    "otherFiles": [
        "/path/otherfile"
    ]
}

可以根据该Json模板进行修改,配置个人应用信息,参数配置说明如下:

- appID: 应用UUID
- appName: 应用的名字,
- organization: 公司/组织,
- version: 应用版本号,
- appexecName: 应用可执行文件路径
- architecture: 支持的硬件架构,
- section: 应用所属分类,utils、graphics、games等,
- priority: 安装优先级,optional=非必需,standard=基础组件,required=系统关键组件,
- essential: 是否为系统核心组件,yes或no,
- diskspace: 应用占用空间,
- description: 应用描述,
- signature: 数字签名(暂不支持),
- icon: 应用图标路径,
- author: 作者,
- fileExtension:  应用支持的文件格式,
- startupParameters: 应用启动参数,可以不设置,
- libraries: 应用自己的库,
- dependencies: 依赖的开源库,
- assertFiles: 静态文件,
- binFiles: 其他应用可执行文件,
- otherFiles: 其他应用文件,
通过命令行工具打包

使用tpDopack工具可以直接对应用打包,该工具已经封装了对json文件的解析。命令格式为:

tpDopack <json文件位置> <安装包名称> <安装包生成位置>

使用此命令需要提前准备好json文件(json文件格式查看“使用Json配置打包”部分),并设置要生成的安装包的名称和生成位置。

使用tpAppDopack工具类打包

使用工具类tpAppDopack可以直接对应用进行打包,需要提前配置好应用信息。

tpAppDopack package;
package.getAllConfig("dopack.json");
package.setPackageName("mytestapp");
package.creatPackage("./");

自定义接口打包

除了使用Json文件形式配置应用安装包信息外,也可以使用tpAppDopack的接口直接配置相关信息。

tpAppDopack package;
printf("set package type\n");
package.setPackageType(tpAppDopack::TP_PACKAGE_TYPE_APP);
package.setAppID("f03c8f8c-dd9b-453f-b2d4-d049c073e252");
package.setAppName("apptest");
package.setVersion(1,0,0);
package.setAppPath("/home/pix/AppManage/mytestapp/mytestapp");
package.setArchitecture("amd64");
package.setAuthor("Chingan");
package.setContact("[email protected]");
package.setProvides("tinyPiX");
package.addDepend("libalsa",1,5,1);
package.addDepend("libssl",1,0,0);
package.addAssert("/home/pix/AppManage/mytestapp/assert/mysrc");
package.addAssert("/home/pix/AppManage/mytestapp/assert/picture");
package.addLib("/home/pix/AppManage/mytestapp/lib/libmysum.so");
package.setIcon("/home/pix/AppManage/mytestapp/icon.jpeg");
package.addExtension(".png");
package.addExtension(".jpg");
package.addExtension(".jpeg");
package.addExtension(".bmp");
package.addFile("/home/pix/AppManage/mytestapp/jiyc");

//设置应用的启动参数
package.addStartArg("--fullscreen");
package.addStartArg("--server");
package.setExecPath("mytestapp");

//设置安装包名字并打包
package.setPackageName("mytestappPackage");
package.creatPackage("/home/pix/AppManage/");

应用安装

应用安装接口内部会自动校验安装环境,以下是应用安装的示例

tpString package_path(pack_path);
tpAppInstall appmanage(package_path);
appmanage.install();
while(1)
{
    if(appmanage.getInstallSchedule()==100)
        break;
    usleep(50000);
}

应用卸载

tpString uuid="0756e187-6f59-4b24-82f6-d4020029c9b8";
tpAppInstall::remove(uuid);

运行

使用tpAppConfigIO工具类获取应用配置信息,然后使用tpProcess工具类启动应用。

tpAppConfigIO configIO(uuid);

tpString runnerPath = configIO.runnerPath();
tpFileInfo runnerFileInfo(runnerPath);
if (!runnerFileInfo.exists())
{
    std::cout << "应用 " << configIO.appName() << " 可执行程序不存在!" << std::endl;
    return;
}

tpProcess exeProcess;
exeProcess.start(runnerPath, argList);
int32_t processPID = exeProcess.launchProcessID();
std::cout << "processPID " << processPID << std::endl;

TinyPiXOS开发者联盟

推荐阅读

源码级支持 + 真实项目:TinyPiXOS开发者联盟招募中,国产自主轻量级嵌入式设备桌面操作系统交流社群

获取开发资料

关注我们

官网网站
技术社群
B 站视频

感谢支持和关注,如果对项目感兴趣,请点赞、收藏和转发!

你可能感兴趣的:(TinyPiXOS,开源,c++,linux,arm开发,ui)