Android Checkin allows you to register a google account as if you were on
android.
It checks in google's servers by passing a Galaxy Nexus / JellyBean
profile, and returns a valid android_id usable on Google Play.
The parameters identifying the device are randomized (but valid).
TODO: Add other devices, like tablets.
Programmatically:
/* Returns the android_id */
new com.android.checkin.Checkin.new(email, password).checkin()
From the command line:
# Outputs the registered android_id
java -jar android-checkin.jar <email> <password>
You might be curious to know what is being sent:
AndroidCheckinRequest.newBuilder()
// imei
.setId(0)
.setDigest("1-929a0dca0eee55513280171a8585da7dcd3700f8")
.setCheckin(AndroidCheckinProto.newBuilder()
.setBuild(AndroidBuildProto.newBuilder()
.setId("google/yakju/maguro:4.1.1/JRO03C/398337:user/release-keys")
.setProduct("tuna")
.setCarrier("Google")
.setRadio("I9250XXLA2")
.setBootloader("PRIMELA03")
.setClient("android-google")
.setTimestamp(new Date().getTime()/1000)
.setGoogleServices(16)
.setDevice("maguro")
.setSdkVersion(16)
.setModel("Galaxy Nexus")
.setManufacturer("Samsung")
.setBuildProduct("yakju")
.setOtaInstalled(false))
.setLastCheckinMsec(0)
.addEvent(AndroidEventProto.newBuilder()
.setTag("event_log_start")
// value
.setTimeMsec(new Date().getTime()))
// stat
// requestedGroup
.setCellOperator("310260") // T-Mobile
.setSimOperator("310260") // T-Mobile
.setRoaming("mobile-notroaming")
.setUserNumber(0))
// desiredBuild
.setLocale("en_US")
.setLoggingId(loggingId)
.addMacAddr(macAddr)
.setMeid(meid)
.addAccountCookie("[" + this.email + "]")
.addAccountCookie(this.authGsf)
.setTimeZone("America/New_York")
// securityToken
.setVersion(3)
.addOtaCert("71Q6Rn2DDZl1zPDVaaeEHItd")
.setSerialNumber(serial)
// esn
.setDeviceConfiguration(DeviceConfigurationProto.newBuilder()
.setTouchScreen(3)
.setKeyboard(1)
.setNavigation(1)
.setScreenLayout(2)
.setHasHardKeyboard(false)
.setHasFiveWayNavigation(false)
.setScreenDensity(320)
.setGlEsVersion(131072)
.addAllSystemSharedLibrary(Arrays.asList(
"android.test.runner",
"com.android.future.usb.accessory",
"com.android.location.provider",
"com.android.nfc_extras",
"com.google.android.maps",
"com.google.android.media.effects",
"com.google.widevine.software.drm",
"javax.obex"))
.addAllSystemAvailableFeature(Arrays.asList(
"android.hardware.bluetooth",
"android.hardware.camera",
"android.hardware.camera.autofocus",
"android.hardware.camera.flash",
"android.hardware.camera.front",
"android.hardware.faketouch",
"android.hardware.location",
"android.hardware.location.gps",
"android.hardware.location.network",
"android.hardware.microphone",
"android.hardware.nfc",
"android.hardware.screen.landscape",
"android.hardware.screen.portrait",
"android.hardware.sensor.accelerometer",
"android.hardware.sensor.barometer",
"android.hardware.sensor.compass",
"android.hardware.sensor.gyroscope",
"android.hardware.sensor.light",
"android.hardware.sensor.proximity",
"android.hardware.telephony",
"android.hardware.telephony.gsm",
"android.hardware.touchscreen",
"android.hardware.touchscreen.multitouch",
"android.hardware.touchscreen.multitouch.distinct",
"android.hardware.touchscreen.multitouch.jazzhand",
"android.hardware.usb.accessory",
"android.hardware.usb.host",
"android.hardware.wifi",
"android.hardware.wifi.direct",
"android.software.live_wallpaper",
"android.software.sip",
"android.software.sip.voip",
"com.cyanogenmod.android",
"com.cyanogenmod.nfc.enhanced",
"com.google.android.feature.GOOGLE_BUILD",
"com.nxp.mifare",
"com.tmobile.software.themes"))
.addAllNativePlatform(Arrays.asList(
"armeabi-v7a",
"armeabi"))
.setScreenWidth(720)
.setScreenHeight(1184)
.addAllSystemSupportedLocale(Arrays.asList(
"af", "af_ZA", "am", "am_ET", "ar", "ar_EG", "bg", "bg_BG",
"ca", "ca_ES", "cs", "cs_CZ", "da", "da_DK", "de", "de_AT",
"de_CH", "de_DE", "de_LI", "el", "el_GR", "en", "en_AU",
"en_CA", "en_GB", "en_NZ", "en_SG", "en_US", "es", "es_ES",
"es_US", "fa", "fa_IR", "fi", "fi_FI", "fr", "fr_BE",
"fr_CA", "fr_CH", "fr_FR", "hi", "hi_IN", "hr", "hr_HR",
"hu", "hu_HU", "in", "in_ID", "it", "it_CH", "it_IT", "iw",
"iw_IL", "ja", "ja_JP", "ko", "ko_KR", "lt", "lt_LT", "lv",
"lv_LV", "ms", "ms_MY", "nb", "nb_NO", "nl", "nl_BE",
"nl_NL", "pl", "pl_PL", "pt", "pt_BR", "pt_PT", "rm",
"rm_CH", "ro", "ro_RO", "ru", "ru_RU", "sk", "sk_SK", "sl",
"sl_SI", "sr", "sr_RS", "sv", "sv_SE", "sw", "sw_TZ", "th",
"th_TH", "tl", "tl_PH", "tr", "tr_TR", "ug", "ug_CN", "uk",
"uk_UA", "vi", "vi_VN", "zh_CN", "zh_TW", "zu", "zu_ZA"))
.addAllGlExtension(Arrays.asList(
"GL_EXT_debug_marker",
"GL_EXT_discard_framebuffer",
"GL_EXT_multi_draw_arrays",
"GL_EXT_shader_texture_lod",
"GL_EXT_texture_format_BGRA8888",
"GL_IMG_multisampled_render_to_texture",
"GL_IMG_program_binary",
"GL_IMG_read_format",
"GL_IMG_shader_binary",
"GL_IMG_texture_compression_pvrtc",
"GL_IMG_texture_format_BGRA8888",
"GL_IMG_texture_npot",
"GL_IMG_vertex_array_object",
"GL_OES_EGL_image",
"GL_OES_EGL_image_external",
"GL_OES_blend_equation_separate",
"GL_OES_blend_func_separate",
"GL_OES_blend_subtract",
"GL_OES_byte_coordinates",
"GL_OES_compressed_ETC1_RGB8_texture",
"GL_OES_compressed_paletted_texture",
"GL_OES_depth24",
"GL_OES_depth_texture",
"GL_OES_draw_texture",
"GL_OES_egl_sync",
"GL_OES_element_index_uint",
"GL_OES_extended_matrix_palette",
"GL_OES_fixed_point",
"GL_OES_fragment_precision_high",
"GL_OES_framebuffer_object",
"GL_OES_get_program_binary",
"GL_OES_mapbuffer",
"GL_OES_matrix_get",
"GL_OES_matrix_palette",
"GL_OES_packed_depth_stencil",
"GL_OES_point_size_array",
"GL_OES_point_sprite",
"GL_OES_query_matrix",
"GL_OES_read_format",
"GL_OES_required_internalformat",
"GL_OES_rgb8_rgba8",
"GL_OES_single_precision",
"GL_OES_standard_derivatives",
"GL_OES_stencil8",
"GL_OES_stencil_wrap",
"GL_OES_texture_cube_map",
"GL_OES_texture_env_crossbar",
"GL_OES_texture_float",
"GL_OES_texture_half_float",
"GL_OES_texture_mirrored_repeat",
"GL_OES_vertex_array_object",
"GL_OES_vertex_half_float")))
// deviceClass
// maxApkDownloadSizeMb
.addMacAddrType("wifi")
.setFragment(0)
// userName
Android Checkin is released under the MIT license.