Androidify:AI驱动的安卓机器人定制应用
项目描述
Androidify是一个基于最新Android技术栈的开源应用,通过Gemini AI技术让用户创建个性化的安卓机器人形象。项目整合了多种Google先进技术,包括Jetpack Compose、Gemini API、CameraX和Navigation 3,为用户提供流畅的AI驱动体验。
功能特性
- 🤖 AI图像生成:通过Gemini API和Imagen模型生成个性化的安卓机器人形象
- :mobile_phone: 现代化UI:基于Jetpack Compose构建,支持自适应布局和流畅动画
- 📷 智能相机:集成CameraX库,支持后置摄像头、变焦和点击对焦功能
- ⌚ 表盘定制:支持将生成的机器人形象制作成手表表盘
- :counterclockwise_arrows_button: 多平台支持:同时支持手机和穿戴设备部署
- :artist_palette: 字体自定义:支持通过Gradle配置自定义应用字体
安装指南
环境要求
- Android SDK 36
- Java 17
- Android Build Tools 36.0.0
安装步骤
-
克隆仓库
git clone https://github.com/google/androidify.git cd androidify
-
配置Firebase项目
- 创建Firebase项目并生成
google-services.json
文件 - 将文件放置在
app/google-services.json
- 启用Vertex AI API和AppCheck
- 创建Firebase项目并生成
-
配置远程配置
- 在
core/network/src/main/res/xml/remote_config_defaults.xml
中 - 将
use_imagen
值设置为true
- 在
-
可选字体配置
在~/.gradle/gradle.properties
中添加:fontName="Roboto Flex"
使用说明
基础使用
应用启动后,用户可以通过以下步骤创建个性化安卓机器人:
- 使用CameraX拍摄照片或选择现有图片
- AI系统通过Gemini API分析图像并生成机器人形象
- 在Jetpack Compose界面中预览和调整生成的机器人
- 可选择将机器人形象设置为手表表盘
表盘生成
项目使用Pack库打包表盘资源:
// 示例:编译表脸包
val package = Package(android_manifest = manifestBytes,resources = fileResources
)
val finishedPackage = compileApk(package)
核心代码
1. JNI原生包编译
// 使用Rust编写的JNI接口,用于编译APK包
#[no_mangle]
pub unsafe extern "C" fn Java_com_android_developers_androidify_watchface_creator_PackPackage_nativeCompilePackage(mut env: JNIEnv,_this: JClass,manifest_jstring: JString,resources: JObjectArray
) -> jstring {let manifest: String = env.get_string(&manifest_jstring).unwrap().into();// 处理资源文件let mut pack_resources = vec![];let resource_len = env.get_array_length(&resources).unwrap();for index in 0..resource_len {let resource = env.get_object_array_element(&resources, index).unwrap();let name = get_string_field_from_java_class(&mut env, &resource, "name");let contents_b64 = get_string_field_from_java_class(&mut env, &resource, "contentsBase64");let contents = b64_to_bytes(&contents_b64);let pack_resource = FileResource::new(subdirectory, name, contents);pack_resources.push(pack_resource);}// 编译APK包let package = Package {android_manifest: manifest.as_bytes().to_vec(),resources: pack_resources};let finished_package = compile_apk(&package).unwrap();let pkg_b64 = bytes_to_b64(&finished_package);env.new_string(pkg_b64).unwrap().into_raw()
}
2. 多架构原生库构建
#!/bin/bash
# 构建Android多架构原生库
cargo build --release --target aarch64-linux-android && \
cargo build --release --target x86_64-linux-android && \
cargo build --release --target armv7-linux-androideabi && \
cargo build --release --target i686-linux-android# 复制生成的库文件到对应目录
mkdir -p ../src/main/jniLibs/arm64-v8a/ && \
cp ./target/aarch64-linux-android/release/libpack_java.so ../src/main/jniLibs/arm64-v8a/libpack_java.so
3. 环境配置脚本
#!/usr/bin/env bash
# Android开发环境配置脚本# 配置参数
ANDROID_SDK_VERSION="36"
ANDROID_BUILD_TOOLS_VERSION="36.0.0"
EMULATOR_IMAGE="system-images;android-35;google_atd;x86_64"# 检查必要工具
echo "INFO: Checking for prerequisites (wget, unzip, tar)..."
for cmd in wget unzip tar; doif ! command -v $cmd &> /dev/null; thenecho "ERROR: Command '$cmd' not found."exit 1fi
done# 安装Java 17
echo "INFO: Setting up Java 17..."
sudo apt-get update
4. Base64编解码工具函数
// Base64编码解码工具函数
fn b64_to_bytes(b64: &str) -> Vec<u8> {general_purpose::STANDARD.decode(b64.as_bytes()).unwrap()
}fn bytes_to_b64(bytes: &Vec<u8>) -> String {general_purpose::STANDARD.encode(bytes)
}// Java字符串字段读取
fn get_string_field_from_java_class(env: &mut JNIEnv, class: &JObject, field_name: &str) -> String {let field_object = env.get_field(class, field_name, "Ljava/lang/String;").unwrap().l().unwrap();env.get_string(&field_object.into()).unwrap().into()
}
更多精彩内容 请关注我的个人公众号 公众号(办公AI智能小助手)
对网络安全、黑客技术感兴趣的朋友可以关注我的安全公众号(网络安全技术点滴分享)
公众号二维码
公众号二维码