#android #base #graphics

android_base

使用piston和glutin-window简化Android应用开发的Rust基础库

1个不稳定版本

0.1.0 2018年12月26日

渲染类别中排名第279

MIT许可协议

19KB
186 代码行

android_base

- 简化创建Android应用的基库
android_base提供了一套API,用于在Rust中开发Android应用,无需担心Android特定的细节,如OpenGL实现或事件循环,同时其暴露的函数在操作层面上非常抽象

示例

这基本上与Piston入门页面中展示的示例相同,只是颜色相反。

注意,此示例需要一些基本的Rust和Android操作知识

入门:确保您已经按照此readme中的getting set up部分设置好环境/依赖项

设置项目

要设置Cargo项目,请遵循您在其他二进制Rust应用程序中通常会采取的标准程序

  1. 在您想要创建项目的目录中运行cargo new android_example --bin
  2. 在新建的android_example文件夹中,编辑Cargo.toml文件,并将android_base = "0.1.0"添加为依赖项

请注意,这是您需要添加的唯一依赖项;android_base会自动导入所有必需的crates的正确版本,作为引言的形式

编写代码

  1. 现在我们将开始编写应用程序。为了简化起见,您可以直接复制以下示例,但也可以自由地进行实验和尝试。
#![feature(uniform_paths)]
//automatically imports right versions of crates
use android_base::*;
use graphics::*;
use android_glue::*;

pub struct App { 
    rotation: f64
}

impl App {
    pub fn new() -> Self {
        Self {rotation: 0.}
    }
}

impl AppImpl for App {
    fn draw(&mut self, c: Context, gl: &mut GlGraphics, args: &RenderArgs){
        clear([1., 0., 0., 1.], gl);
        let transform = c.transform
                            .trans(args.width as f64 / 2., args.height as f64 / 2.)
                            .rot_rad(self.rotation)
                            .trans(-75., -75.);
        rectangle([0., 1., 0., 1.], [0., 0., 150., 150.], transform, gl);
    }
    fn update(&mut self, args: &UpdateArgs) {
        self.rotation += args.dt;
    }
    fn cancel_poll(&self) -> bool {
        false
    }
}

fn main() {
    enable_backtrace();
    let mut container = AppContainer::init(App::new(), AppConfig::new());
    container.run();
}
  1. 现在让我们逐个分析这些内容
    1. 由于预言导入外部crates成员是不稳定的,因此我们添加了一个标志来启用此功能,因此起始位置有#![feature(uniform_paths)]
    2. 然后我们导入 android_base 以及在用 piston 开发安卓应用时所需的两个重要依赖项;graphicsandroid_glue。目前我假设你们已经知道 graphics 的作用,但 android_glue 则作为你应用与安卓事件之间的粘合剂。
    3. 为了基本复制 piston 示例的行为,我们创建了一个包含旋转的应用的类似结构;但请注意,我们不需要保留任何类型的 opengl 内容,甚至不需要导入它,关于这一点,我会在后面讨论 draw 方法时再详细介绍。
    4. 我们为了简单起见添加了一个 new 函数,但实际上我们也可以使用构造函数,两种方法都可以。
    5. 然后我们实现了一个相当直观的特质 AppImpl,它包含可以为你应用实现的所有重要函数。
      1. draw:这包含了你应用的所有绘图功能,它接收来自 GlGraphics 绘图方法的参数,这样 android_base 就负责准备绘图,而你只需绘图即可。
      2. update:这包含了应用需要绘图时所需的信息;这基本上只是当 piston::event_loop::Events::next() 发出更新标志时,传递到这里的。
      3. cancel_poll:这会检查你的应用是否应该停止运行,当它返回 true 时,它将停止执行,即使它只是意味着要渲染一定数量的帧(请参阅下面的配置部分)。
      4. 你可以在 src/app_implementor.rs 中覆盖许多其他函数。
    6. 在我们的主函数中,我们执行以下操作:
      1. 将环境变量 RUST_BACKTRACE 设置为 1,以允许调试回溯;这只是为了使调试更容易。
      2. 我们使用默认配置初始化了一个 AppContainer,包含我们的应用。
      3. 这引出了 run 函数,它将运行我们的应用,直到 cancel_poll 返回 true(由于设置为 false,所以它不会返回 true)。

使用 cargo-apk 构建

  1. 然后我们需要准备构建,所以请将以下内容添加到你的 Cargo.toml 中。
[package.metadata.android]

build_targets = [ "arm-linux-androideabi" ]

请注意,此示例将遵循将编译到运行 arm linux android 的实际设备的步骤,并且 不会 详细说明如何启动模拟器或安装模拟器。

  1. 然后我们将安装 rustc 所需的目标。
$ rustup target add arm-linux-androideabi
  1. 然后我们准备使用 adb
    1. 将你的设备物理连接到电脑,并运行 adb tcpip 5555
    2. 断开你的设备,并找出 IP 地址(通常可以通过前往你的互联网设置并点击当前连接的网络找到)。
    3. 运行 adb connect <your ip address> 以通过 Wi-Fi 连接,以便使重复运行更简单。
  2. 现在运行 cargo-apk run,如果不起作用
    1. 在单独的终端中运行 adb logcat 并重新打开你的应用。
    2. main 中调用 enable_backtrace,当发生 panic! 时将打印出堆栈跟踪。
    3. 发布一个描述您问题的issue,我会或其他人会帮您调试。

设置环境

  1. 按照 rustup.rs 上的说明安装 rust。
  2. 通过调用以下命令直接从 GitHub 安装 cargo:
cargo install --git https://github.com/tomaka/android-rs-glue.git --rev 1d095846a687f873b6aed7d62ee32bc5a062e534 --force cargo-apk
  1. 按照 Setting up your environment 下的说明进行手动设置,但不要重新安装 cargo-apk,因为发布的版本已过时。
  2. 如果在按照上述说明编译和运行示例时遇到某种类型的缺失依赖错误,请在网上查找如何为您的系统安装它,如果没有,请打开一个 issue 获取帮助解决问题。

注意:此 readme/setup/example 适用于 ubuntu 或 WSL(我本人使用)的用户,我发现 Windows 直接使用不工作。

另一个注意事项:由于最新版本的 cargo-apk 中存在一个小型实现细节问题,所以它已损坏,您不能调用 cargo apk,而必须调用 cargo-apk

另一个注意事项:此 crate 包含 opengles_graphics 的 git 克隆,它是 opengl_graphics 的分支,旨在与 opengles 一起使用,但已超过两年未更新。因此,我已更新其依赖项以适应其他 crate 的新版本。我 声称已经开发了它的全部内容,只进行了少量更改,并将功劳归功于 DrakulixPiston 团队

依赖项

~17MB
~168K SLoC