We can register custom post type with register_post_type function. This should not be hooked before init. So, the good option is to call it with init hook.
Post types can support any number of built-in core features such as meta boxes, custom fields, post thumbnails, post statuses, comments, and more. See the $supports argument for a complete list of supported features.