Android 渐变同步失败-无法确定当前字符
我目前无法构建项目Android 渐变同步失败-无法确定当前字符,android,react-native,gradle,Android,React Native,Gradle,我目前无法构建项目 Current error: Script '/Users/pimzonneveld/the-red-corner/veganific-mobile-app/node_modules/@react-native-community/cli-platform-android/native_modules.gradle' line: 191 Gradle sync failed: Unable to determine the current character, it is
Current error:
Script '/Users/pimzonneveld/the-red-corner/veganific-mobile-app/node_modules/@react-native-community/cli-platform-android/native_modules.gradle' line: 191
Gradle sync failed: Unable to determine the current character, it is not a string, number, array, or object
The current character read is 'i' with an int value of 105
Unable to determine the current character, it is not a string, number, array, or object
line number 1
index number 0
info Run "react-native --help" to see a list of all available commands.
^ (6 s 386 ms)
尝试删除app\build\intermediates\signing\u config\debug\out\signing config.json
,但该操作无效
尝试删除.gradle
和.idea
并与Android Studio重新同步。没用
已尝试删除并重新安装@react native community
软件包
试图移除
Android Studio是V3.5
Gradle是V5.4.1
编辑
当前失败的文件是native\u modules.gradle
发布在下面:
import groovy.json.JsonSlurper
import org.gradle.initialization.DefaultSettings
def generatedFileName = "PackageList.java"
def generatedFilePackage = "com.facebook.react"
def generatedFileContentsTemplate = """
package $generatedFilePackage;
import android.app.Application;
import android.content.Context;
import android.content.res.Resources;
import com.facebook.react.ReactPackage;
import com.facebook.react.shell.MainReactPackage;
import java.util.Arrays;
import java.util.ArrayList;
{{ packageImports }}
public class PackageList {
private Application application;
private ReactNativeHost reactNativeHost;
public PackageList(ReactNativeHost reactNativeHost) {
this.reactNativeHost = reactNativeHost;
}
public PackageList(Application application) {
this.reactNativeHost = null;
this.application = application;
}
private ReactNativeHost getReactNativeHost() {
return this.reactNativeHost;
}
private Resources getResources() {
return this.getApplication().getResources();
}
private Application getApplication() {
if (this.reactNativeHost == null) return this.application;
return this.reactNativeHost.getApplication();
}
private Context getApplicationContext() {
return this.getApplication().getApplicationContext();
}
public ArrayList<ReactPackage> getPackages() {
return new ArrayList<>(Arrays.<ReactPackage>asList(
new MainReactPackage(){{ packageClassInstances }}
));
}
}
"""
class ReactNativeModules {
private Logger logger
private Project project
private String packageName
private DefaultSettings defaultSettings
private String root
private ArrayList<HashMap<String, String>> reactNativeModules
private static String LOG_PREFIX = ":ReactNative:"
ReactNativeModules(Logger logger) {
this.logger = logger
}
void applySettingsGradle(DefaultSettings defaultSettings, String root) {
this.defaultSettings = defaultSettings
this.root = root
this.reactNativeModules = this.getReactNativeConfig()
addReactNativeModuleProjects()
}
void applyBuildGradle(Project project, String root) {
this.project = project
this.root = root
this.reactNativeModules = this.getReactNativeConfig()
addReactNativeModuleDependencies()
}
/**
* Include the react native modules android projects and specify their project directory
*/
void addReactNativeModuleProjects() {
reactNativeModules.forEach { reactNativeModule ->
String nameCleansed = reactNativeModule["nameCleansed"]
String androidSourceDir = reactNativeModule["androidSourceDir"]
defaultSettings.include(":${nameCleansed}")
defaultSettings.project(":${nameCleansed}").projectDir = new File("${androidSourceDir}")
}
}
/**
* Adds the react native modules as dependencies to the users `app` project
*/
void addReactNativeModuleDependencies() {
reactNativeModules.forEach { reactNativeModule ->
def nameCleansed = reactNativeModule["nameCleansed"]
project.dependencies {
// TODO(salakar): are other dependency scope methods such as `api` required?
implementation project(path: ":${nameCleansed}")
}
}
}
/**
* Returns the user's project root (i.e. where the node_modules dir is located).
*/
File getReactNativeProjectRoot() {
File androidRoot
if (this.project) {
androidRoot = this.project.rootProject.projectDir
} else {
androidRoot = this.defaultSettings.rootProject.projectDir
}
File rnRoot = new File(androidRoot, this.root)
this.logger.debug("${LOG_PREFIX}Using React Native project root path '${rnRoot.toString()}'")
return rnRoot
}
/**
* Code-gen a java file with all the detected ReactNativePackage instances automatically added
*
* @param outputDir
* @param generatedFileName
* @param generatedFileContentsTemplate
*/
void generatePackagesFile(File outputDir, String generatedFileName, String generatedFileContentsTemplate) {
ArrayList<HashMap<String, String>>[] packages = this.reactNativeModules
String packageName = this.packageName
String packageImports = ""
String packageClassInstances = ""
if (packages.size() > 0) {
packageImports = "import ${packageName}.BuildConfig;\nimport ${packageName}.R;\n\n"
packageImports = packageImports + packages.collect {
"// ${it.name}\n${it.packageImportPath}"
}.join('\n')
packageClassInstances = ",\n " + packages.collect { it.packageInstance }.join(",\n ")
}
String generatedFileContents = generatedFileContentsTemplate
.replace("{{ packageImports }}", packageImports)
.replace("{{ packageClassInstances }}", packageClassInstances)
outputDir.mkdirs()
final FileTreeBuilder treeBuilder = new FileTreeBuilder(outputDir)
treeBuilder.file(generatedFileName).newWriter().withWriter { w ->
w << generatedFileContents
}
}
/**
* Runs a process to call the React Native CLI Config command and parses the output
*
* @return ArrayList < HashMap < String , String > >
*/
ArrayList<HashMap<String, String>> getReactNativeConfig() {
if (this.reactNativeModules != null) return this.reactNativeModules
ArrayList<HashMap<String, String>> reactNativeModules = new ArrayList<HashMap<String, String>>()
def cmdProcess
def root = getReactNativeProjectRoot()
def command = "node ./node_modules/react-native/cli.js config"
def reactNativeConfigOutput = ""
try {
cmdProcess = Runtime.getRuntime().exec(command, null, root)
def bufferedReader = new BufferedReader(new InputStreamReader(cmdProcess.getInputStream()))
def buff = ""
def readBuffer = new StringBuffer()
while ((buff = bufferedReader.readLine()) != null){
readBuffer.append(buff)
}
reactNativeConfigOutput = readBuffer.toString()
} catch (Exception exception) {
this.logger.warn("${LOG_PREFIX}${exception.message}")
this.logger.warn("${LOG_PREFIX}Automatic import of native modules failed.")
return reactNativeModules
}
def json = new JsonSlurper().parseText(reactNativeConfigOutput)
this.packageName = json["project"]["android"]["packageName"]
def dependencies = json["dependencies"]
dependencies.each { name, value ->
def platformsConfig = value["platforms"];
def androidConfig = platformsConfig["android"]
if (androidConfig != null && androidConfig["sourceDir"] != null) {
this.logger.info("${LOG_PREFIX}Automatically adding native module '${name}'")
HashMap reactNativeModuleConfig = new HashMap<String, String>()
reactNativeModuleConfig.put("name", name)
reactNativeModuleConfig.put("nameCleansed", name.replaceAll('/', '_'))
reactNativeModuleConfig.put("androidSourceDir", androidConfig["sourceDir"])
reactNativeModuleConfig.put("packageInstance", androidConfig["packageInstance"])
reactNativeModuleConfig.put("packageImportPath", androidConfig["packageImportPath"])
this.logger.trace("${LOG_PREFIX}'${name}': ${reactNativeModuleConfig.toMapString()}")
reactNativeModules.add(reactNativeModuleConfig)
} else {
this.logger.info("${LOG_PREFIX}Skipping native module '${name}'")
}
}
return reactNativeModules
}
}
/** -----------------------
* Exported Extensions
* ------------------------ */
def autoModules = new ReactNativeModules(logger)
ext.applyNativeModulesSettingsGradle = { DefaultSettings defaultSettings, String root = ".." ->
autoModules.applySettingsGradle(defaultSettings, root)
}
ext.applyNativeModulesAppBuildGradle = { Project project, String root = ".." ->
autoModules.applyBuildGradle(project, root)
def generatedSrcDir = new File(buildDir, "generated/rncli/src/main/java")
def generatedCodeDir = new File(generatedSrcDir, generatedFilePackage.replace('.', '/'))
task generatePackageList {
doLast {
autoModules.generatePackagesFile(generatedCodeDir, generatedFileName, generatedFileContentsTemplate)
}
}
preBuild.dependsOn generatePackageList
android {
sourceSets {
main {
java {
srcDirs += generatedSrcDir
}
}
}
}
}
import groovy.json.JsonSlurper
导入org.gradle.initialization.DefaultSettings
def generatedFileName=“PackageList.java”
def generatedFilePackage=“com.facebook.react”
def generatedFileContentsTemplate=“”
包$generatedFilePackage;
导入android.app.Application;
导入android.content.Context;
导入android.content.res.Resources;
导入com.facebook.react.ReactPackage;
导入com.facebook.react.shell.MainReactPackage;
导入java.util.array;
导入java.util.ArrayList;
{{packageImports}}
公营包装商{
私人申请;
私有ReactNativeHost ReactNativeHost;
公共打包师(ReactNativeHost ReactNativeHost){
this.reactNativeHost=reactNativeHost;
}
公共包装商(应用){
this.reactNativeHost=null;
这个应用程序=应用程序;
}
私有ReactNativeHost getReactNativeHost(){
返回此.reactNativeHost;
}
私有资源getResources(){
返回此.getApplication().getResources();
}
私有应用程序getApplication(){
如果(this.reactNativeHost==null)返回this.application;
返回此.reactNativeHost.getApplication();
}
私有上下文getApplicationContext(){
返回此.getApplication().getApplicationContext();
}
公共ArrayList getPackages(){
返回新的ArrayList(Arrays.asList(
新建MainReactPackage(){{packageClassInstances}}
));
}
}
"""
类ReactNativeModules{
专用记录器
私人项目
私有字符串包名
私人默认设置默认设置
私有字符串根
私有ArrayList反应模块
私有静态字符串LOG_PREFIX=“:ReactNative:”
反应模块(记录器){
this.logger=记录器
}
无效applySettingsGradle(默认设置,字符串根){
this.defaultSettings=defaultSettings
this.root=root
this.reactNativeModules=this.getReactNativeConfig()
addReactNativeModuleProjects()
}
void applyBuildGradle(项目,字符串根){
this.project=project
this.root=root
this.reactNativeModules=this.getReactNativeConfig()
addReactNativeModuleDependencies()
}
/**
*包括react本机模块android项目并指定其项目目录
*/
void addReactNativeModuleProjects(){
reactNativeModule.forEach{reactNativeModule->
字符串nameCleansed=reactNativeModule[“nameCleansed”]
字符串androidSourceDir=reactNativeModule[“androidSourceDir”]
默认设置。包括(“:${nameCleansed}”)
defaultSettings.project(“:${nameCleansed}”).projectDir=新文件(“${androidSourceDir}”)
}
}
/**
*将react本机模块作为依赖项添加到用户'app'项目中
*/
void addReactNativeModuleDependencies(){
reactNativeModule.forEach{reactNativeModule->
def nameCleansed=reactNativeModule[“nameCleansed”]
项目依赖关系{
//TODO(salakar):是否需要“api”等其他依赖范围方法?
实施项目(路径:“:${nameCleansed}”)
}
}
}
/**
*返回用户的项目根目录(即节点\u modules dir所在的位置)。
*/
文件getReactNativeProjectRoot(){
文件androidRoot
如果(本项目){
androidRoot=this.project.rootProject.projectDir
}否则{
androidRoot=this.defaultSettings.rootProject.projectDir
}
File rnRoot=新文件(androidRoot,this.root)
this.logger.debug(“${LOG\u PREFIX}使用React本机项目根路径“${rnRoot.toString()}”)
返回根
}
/**
*Code gen自动添加所有检测到的ReactNativePackage实例的java文件
*
*@param outputDir
*@param generatedFileName
*@param generatedFileContentsTemplate
*/
void generatePackagesFile(文件outputDir、字符串generatedFileName、字符串generatedFileContentsTemplate){
ArrayList[]packages=this.reactNativeModules
字符串packageName=this.packageName
字符串packageImports=“”
String packageClassInstances=“”
如果(packages.size()>0){
packageImports=“导入${packageName}.BuildConfig;\nimport${packageName}.R;\n\n”
packageImports=packageImports+packages.collect{
“//${it.name}\n${it.packageImportPath}”
}.join(“\n”)
packageClassInstances=“,\n”+packages.collect{it.packageInstance}.join(“,\n”)
}
String generatedFileContents=generatedFileContentsTemplate
.replace(“{{packageImports}}”,packageImports)
.replace(“{{packageClassInstances}}”,packageClassInstances)
outputDir.mkdirs()
final FileTreeBuilder treeBuilder=新FileTreeBuilder(outputDir)
treeBuilder.file(generatedFileName).newWriter().withWriter{w->
w>
*/
ArrayList getReactNativeConfig(){
如果(this.reactNativeModules!=null)返回this.reactNativeModules
ArrayList reactNativeModules=新ArrayList()
def cmdProcess
def root=getReactNativeProjectRoot()
def command=“node./node\u modules/react native/cli.js config”
def reactNativeConfigOutput=“”
试一试{
cmdProcess=Runtime.getRuntime().exec(命令,null,根)
def bufferedReader=新的bufferedReader(新的InputStreamReader(cmdProcess.getInputStream()))
def buff=“”
def-re