exports.create = function()

in lib/create.js [198:284]


exports.create = function (project_path, config, options, events) {
    options = options || {};

    // Set default values for path, package and name
    project_path = path.relative(process.cwd(), project_path);
    // Check if project already exists
    if (fs.existsSync(project_path)) {
        return Promise.reject(new CordovaError('Project already exists! Delete and recreate'));
    }

    const package_name = config.android_packageName() || config.packageName() || 'io.cordova.helloCordova';
    const project_name = config.name() || 'Hello Cordova';

    const safe_activity_name = config.android_activityName() || options.activityName || 'MainActivity';
    const target_api = check_reqs.get_target(project_path);
    const compile_api = check_reqs.get_compile(project_path);

    // Make the package conform to Java package types
    return exports.validatePackageName(package_name)
        .then(function () {
            return exports.validateProjectName(project_name);
        }).then(function () {
            // Log the given values for the project
            events.emit('log', 'Creating Cordova project for the Android platform:');
            events.emit('log', '\tPath: ' + project_path);
            events.emit('log', '\tPackage: ' + package_name);
            events.emit('log', '\tName: ' + project_name);
            events.emit('log', '\tActivity: ' + safe_activity_name);
            events.emit('log', '\tAndroid Target SDK: ' + target_api);
            events.emit('log', '\tAndroid Compile SDK: ' + compile_api);

            events.emit('verbose', 'Copying android template project to ' + project_path);

            const project_template_dir = options.customTemplate || path.join(ROOT, 'templates', 'project');
            const app_path = path.join(project_path, 'app', 'src', 'main');

            // copy project template
            fs.mkdirSync(app_path, { recursive: true });
            fs.cpSync(path.join(project_template_dir, 'assets'), path.join(app_path, 'assets'), { recursive: true });
            fs.cpSync(path.join(project_template_dir, 'res'), path.join(app_path, 'res'), { recursive: true });
            fs.cpSync(path.join(project_template_dir, 'gitignore'), path.join(project_path, '.gitignore'));

            // Manually create directories that would be empty within the template (since git doesn't track directories).
            fs.mkdirSync(path.join(app_path, 'libs'), { recursive: true });

            // copy cordova.js, cordova.jar
            exports.copyJsAndLibrary(project_path, options.link, safe_activity_name, target_api);

            // Set up ther Android Studio paths
            const java_path = path.join(app_path, 'java');
            const assets_path = path.join(app_path, 'assets');
            const resource_path = path.join(app_path, 'res');
            fs.mkdirSync(java_path, { recursive: true });
            fs.mkdirSync(assets_path, { recursive: true });
            fs.mkdirSync(resource_path, { recursive: true });

            // store package name in cdv-gradle-config
            const cdvGradleConfig = CordovaGradleConfigParserFactory.create(project_path);
            cdvGradleConfig.setPackageName(package_name)
                .write();

            // interpolate the activity name and package
            const packagePath = package_name.replace(/\./g, path.sep);
            const activity_dir = path.join(java_path, packagePath);
            const activity_path = path.join(activity_dir, safe_activity_name + '.java');

            fs.mkdirSync(activity_dir, { recursive: true });
            fs.cpSync(path.join(project_template_dir, 'Activity.java'), activity_path);
            utils.replaceFileContents(activity_path, /__ACTIVITY__/, safe_activity_name);
            utils.replaceFileContents(path.join(app_path, 'res', 'values', 'strings.xml'), /__NAME__/, utils.escape(project_name));
            utils.replaceFileContents(activity_path, /__ID__/, package_name);

            const manifest = new AndroidManifest(path.join(project_template_dir, 'AndroidManifest.xml'));
            manifest.getActivity().setName(safe_activity_name);

            const manifest_path = path.join(app_path, 'AndroidManifest.xml');
            manifest.write(manifest_path);

            exports.copyScripts(project_path);
            exports.copyBuildRules(project_path);

            // Link it to local android install.
            exports.writeProjectProperties(project_path, target_api);
            exports.prepBuildFiles(project_path);
            events.emit('log', generateDoneMessage('create', options.link));
        }).then(() => project_path);
};