关于rust:使用rust开发android底层

5次阅读

共计 3075 个字符,预计需要花费 8 分钟才能阅读完成。

本文档应用 rust 开发 android 程序,只波及到底层开发,不波及任何 ui 相干,开发前举荐装置好 magisk 框架,不便前面获取手机 root 权限,或者有别的计划能够使 adb 获取到 root 权限也行

android 看成是一个裁剪了很多模块的 linux 操作系统,前面的操作与概念就好了解很多了

linux权限阐明

  • root权限,超级权限,能够得心应手,随心所欲
  • 一般权限

Android权限阐明

  • 平安体系结构设计的外围是:默认状况下,任何应用程序都无权执行任何会对其余应用程序、操作系统或用户产生负面影响的操作
  • 为了爱护 Android 用户的隐衷,防止上述负面影响,Android对权限进行治理:Android 利用在须要应用某些性能时必须进行权限的申请,而依据权限的爱护级别,零碎可能会主动授予权限,或者提醒用户批准申请
  • Android包装了一套本人的权限体系

    • root
    • platform
    • media
    • shared
  • root权限是超级权限,该权限能够对系统进行任意操作,这一点与 linux 雷同
  • 提供了拜访 system 目录的权限,即 system 权限,对应 Android 的权限体系为platform

试验设施信息

Xiaomi Redmi note 7 Pro

rust我的项目创立

$ cargo new android-agent

批改 Cargo.toml 的依赖信息如下

[dependencies]
tokio = {version = "1", features = ["full"]}
tracing = "0.1"
tracing-subscriber = "0.3"

批改main.rs

#[tokio::main]
async fn main() {tracing_subscriber::fmt::init();
    loop {tracing::info!("Hello world!");
        tokio::time::sleep(std::time::Duration::from_secs(1)).await;
    }
}

因为自己是在 Ubuntu22 环境下开发,底层 C 库与 android 的库可能有较大差别,所以编译须要依赖一个 rust 的穿插编译我的项目cross,工具装置与操作自行查看该我的项目文档

https://github.com/cross-rs/cross

查看 rust 反对编译的 android 类型

$ rustc --print target-list |grep android
aarch64-linux-android
arm-linux-androideabi
armv7-linux-androideabi
i686-linux-android
thumbv7neon-linux-androideabi
x86_64-linux-android

因为目前测试机是实在的 Android 手机,Android手机根本都是 arm 架构的,所以编译 target 抉择 aarch64-linux-android,如果是电脑下面的虚构手机,这些年的非苹果电脑根本都是x86_64 架构的,能够抉择x86_64-linux-android

应用的包可能比拟新,cross工具发行 release 和以后工夫可能存在较大时间差到时某些 GLibc 版本可能差别较大导致编译报错,所以还须要新建一个文件 Cross.toml,配置应用最新的cross 编译镜像

[target.aarch64-linux-android]
image = "ghcr.io/cross-rs/aarch64-linux-android:edge"

开始执行编译

$ cross build --target aarch64-linux-android -r

应用 adb 把编译生成的文件推送到 android 手机上,留神,须要推送到 /sdcard 上面,/sdcard的属主 / 归属组是root/root

$ adb push target/aarch64-linux-android/release/android-agent /sdcard/
target/aarch64-linux-android/release/android-agent: 1 file pushed. 30.8 MB/s (2677824 bytes in 0.083s)

进入 android 手机 shell 环境

$ adb shell

adb获取 root 权限,该操作是装置了 Magisk 之后才能够这样获取

violet:/ $ su 
violet:/ # 

执行 chmod 赋予执行权限,之后筛选查看权限发现并没有胜利赋予权限

violet:/ # chmod a+x /sdcard/android-agent 
violet:/ # ls -l /sdcard/ |grep android                                                                                           

-rw-rw---- 1 root sdcard_rw 2677824 2023-04-14 16:55 android-agent

这个时候须要把文件复制到 /data 上面,再赋予执行权限,如果一开始就应用 adb push 执行文件到 /data 上面会报错 Permission denied/data 的属主 / 归属组是system/system,该文件夹可能不能间接推送文件进入

violet:/ # mv /sdcard/android-agent /data/
violet:/ # chmod a+x /data/android-agent
violet:/ # ls -l /data/ |grep android                                                                                             

-rwxrwx--x   1 root     sdcard_rw  2677824 2023-04-14 16:55 android-agent

之后验证执行

violet:/ # ./data/android-agent                                                                                                       
2023-04-14T09:15:53.752045Z  INFO android_agent: Hello world!
2023-04-14T09:15:54.753759Z  INFO android_agent: Hello world!
2023-04-14T09:15:55.756782Z  INFO android_agent: Hello world!
2023-04-14T09:15:56.759287Z  INFO android_agent: Hello world!
2023-04-14T09:15:57.762281Z  INFO android_agent: Hello world!

Android shell扩大理解

android还是蕴含了很多工具的,比方ping

violet:/ # ping baidu.com
PING baidu.com (110.242.68.66) 56(84) bytes of data.
64 bytes from 110.242.68.66: icmp_seq=1 ttl=64 time=0.430 ms

比方curl

violet:/ # curl https://baidu.com                                                                                                     
<html>
<head><title>302 Found</title></head>
<body bgcolor="white">
<center><h1>302 Found</h1></center>
<hr><center>bfe/1.0.8.18</center>
</body>
</html>

查看内核信息

violet:/ # cat /proc/version                                                                                                          
Linux version 4.14.117-perf-g288905b (builder@c4-miui-ota-bd188.bj) (clang version 8.0.11 for Android NDK) #1 SMP PREEMPT Mon Nov 8 19:38:11 CST 2021

参考浏览

Android 权限治理

正文完
 0