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 { 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"); }