1import fs from 'fs-extra'; 2import path from 'path'; 3 4import { copyFileWithTransformsAsync } from '../../Transforms'; 5import { searchFilesAsync } from '../../Utils'; 6import { expoviewTransforms } from './transforms/expoviewTransforms'; 7 8export async function copyExpoviewAsync(sdkVersion: string, androidDir: string): Promise<void> { 9 const abiVersion = `abi${sdkVersion.replace(/\./g, '_')}`; 10 const targetDirectory = path.join(androidDir, `versioned-abis/expoview-${abiVersion}`); 11 const sourceDirectory = path.join(androidDir, 'expoview'); 12 const transforms = expoviewTransforms(abiVersion); 13 14 const files = await searchFilesAsync(sourceDirectory, [ 15 './build.gradle', 16 './CMakeLists.txt', 17 './empty.cpp', 18 './src/main/AndroidManifest.xml', 19 './src/main/cpp/**', 20 './src/main/JNI/**', 21 './src/main/Common/**', 22 './src/main/java/versioned/**', 23 './src/main/java/com/**', 24 ]); 25 26 for (const sourceFile of files) { 27 await copyFileWithTransformsAsync({ 28 sourceFile, 29 targetDirectory, 30 sourceDirectory, 31 transforms, 32 }); 33 } 34 35 const settingsGradlePath = path.join(androidDir, 'settings.gradle'); 36 let settingsGradle = await fs.readFile(settingsGradlePath, 'utf-8'); 37 if (!settingsGradle.match(abiVersion)) { 38 settingsGradle = settingsGradle.replace( 39 /ADD_NEW_SUPPORTED_ABIS_HERE/, 40 `ADD_NEW_SUPPORTED_ABIS_HERE\n "${abiVersion}",` 41 ); 42 } 43 const vendoredLinking = `useVendoredModulesForSettingsGradle('sdk${sdkVersion.split('.')[0]}')`; 44 if (!settingsGradle.match(vendoredLinking)) { 45 settingsGradle = settingsGradle.replace( 46 /(^useVendoredModulesForSettingsGradle\('unversioned'\))/gm, 47 `$1\n${vendoredLinking}` 48 ); 49 } 50 51 await fs.writeFile(settingsGradlePath, settingsGradle); 52} 53