86 lines
2.6 KiB
Rust
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");
|
|
}
|