Files
APK/main.rs
T
2026-07-12 19:37:19 +00:00

86 lines
2.6 KiB
Rust

mod axml;
mod bigint;
mod cert;
mod deflate;
mod keydata;
mod sha256;
mod sign_v2;
mod zip;
use axml::{val, AxmlBuilder};
fn build_manifest() -> Vec<u8> {
let mut b = AxmlBuilder::new();
let a_name = b.intern("name");
let a_hascode = b.intern("hasCode");
let a_exported = b.intern("exported");
let a_minsdk = b.intern("minSdkVersion");
let s_manifest = b.intern("manifest");
let s_uses_sdk = b.intern("uses-sdk");
let s_application = b.intern("application");
let s_activity = b.intern("activity");
let a_package = b.intern("package");
let v_package = b.intern("android.app");
let v_activity = b.intern(".Activity");
let resmap = vec![
(a_name, AxmlBuilder::res_id_for("name").unwrap()),
(a_minsdk, AxmlBuilder::res_id_for("minSdkVersion").unwrap()),
(a_hascode, AxmlBuilder::res_id_for("hasCode").unwrap()),
(a_exported, AxmlBuilder::res_id_for("exported").unwrap()),
];
b.start();
b.open_ns(
s_manifest,
&[(a_package, val::TYPE_STRING, v_package, v_package as i32, false)],
);
b.open(s_uses_sdk, &[(a_minsdk, val::TYPE_INT_DEC, 34, -1)]);
b.close(s_uses_sdk);
b.open(s_application, &[(a_hascode, val::TYPE_INT_BOOL, 0, -1)]);
b.open(
s_activity,
&[
(a_name, val::TYPE_STRING, v_activity, v_activity as i32),
(a_exported, val::TYPE_INT_BOOL, 0xFFFF_FFFF, -1),
],
);
let s_intent_filter = b.intern("intent-filter");
let s_action = b.intern("action");
let s_category = b.intern("category");
let v_action_main = b.intern("android.intent.action.MAIN");
let v_cat_launcher = b.intern("android.intent.category.LAUNCHER");
b.open(s_intent_filter, &[]);
b.open(s_action, &[(a_name, val::TYPE_STRING, v_action_main, v_action_main as i32)]);
b.close(s_action);
b.open(s_category, &[(a_name, val::TYPE_STRING, v_cat_launcher, v_cat_launcher as i32)]);
b.close(s_category);
b.close(s_intent_filter);
b.close(s_activity);
b.close(s_application);
b.close(s_manifest);
b.end();
b.finish(&resmap)
}
fn main() {
let manifest = build_manifest();
let mut z = zip::Zip::new();
z.add_deflated("AndroidManifest.xml", manifest);
let apk_unsigned = z.finish();
let apk = sign_v2::add_v2_signature(&apk_unsigned);
std::fs::create_dir_all("out").expect("create out dir");
let path = "out/app.apk";
std::fs::write(path, &apk).expect("write apk");
println!("{} ({} bytes)", path, apk.len());
println!("adb install -r {}", path);
println!("adb shell am start -n android.app/.Activity");
}