Troubleshooting
Resolução de problemas comuns ao usar o GoAB SDK.
Problemas de Inicialização
SDK não inicializa
Sintomas:
isInitialized()retorna false- Valores padrão são sempre retornados
- Logs mostram erro de inicialização
Possíveis Causas:
- Configuração inválida
- Problemas de rede
- Token de API inválido
- Contexto Android inválido
Soluções:
// 1. Verificar configuração
fun validateSDKParams(accountId: Int, apiToken: String): Boolean {
return accountId > 0 && apiToken.isNotEmpty()
}
// 2. Inicializar com tratamento de erro
lifecycleScope.launch {
try {
if (validateSDKParams(2, "app_bf8f8ffe8c9e8b5877a0028f67750633e18d293ed760454af88a66543a3f90f8")) {
sdk.initialize()
} else {
Log.e("GoAB", "Configuração inválida")
}
} catch (e: Exception) {
Log.e("GoAB", "Erro ao inicializar", e)
// Usar valores padrão
}
}
Timeout na inicialização
Sintomas:
- SDK demora para inicializar
- Logs mostram timeout
- Aplicação fica lenta
Soluções:
// 1. Aumentar timeout
val sdk = GoABSDKFactory.create(
context = this,
accountId = 2,
apiToken = "app_bf8f8ffe8c9e8b5877a0028f67750633e18d293ed760454af88a66543a3f90f8",
timeoutSeconds = 60 // Aumentar timeout
)
// 2. Inicializar em background
lifecycleScope.launch(Dispatchers.IO) {
sdk.initialize()
}
Problemas de Rede
Falha ao buscar experimentos
Sintomas:
- Valores padrão são sempre retornados
- Logs mostram erro de rede
- Experimentos não são atualizados
Possíveis Causas:
- Sem conexão com internet
- URL da API incorreta
- Token de API inválido
- Firewall bloqueando requisições
Soluções:
// 1. Verificar conectividade
fun isNetworkAvailable(context: Context): Boolean {
val connectivityManager = context.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager
val network = connectivityManager.activeNetwork
val capabilities = connectivityManager.getNetworkCapabilities(network)
return capabilities?.hasCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET) == true
}
// 2. Configurar SDK corretamente
val sdk = GoABSDKFactory.create(
context = this,
accountId = 2,
apiToken = "app_bf8f8ffe8c9e8b5877a0028f67750633e18d293ed760454af88a66543a3f90f8", // Verificar token
timeoutSeconds = 30
)
// 3. Tratar falhas de rede
lifecycleScope.launch {
try {
sdk.initialize()
} catch (e: Exception) {
if (e is UnknownHostException || e is ConnectException) {
Log.w("GoAB", "Problema de rede, usando cache local")
// Usar valores do cache local
} else {
Log.e("GoAB", "Erro inesperado", e)
}
}
}
Experimentos não são atualizados
Sintomas:
- Valores antigos são retornados
- Mudanças no servidor não refletem na app
refreshExperiments()não funciona
Soluções:
// 1. Forçar atualização
sdk.refreshExperiments()
// 2. Limpar experimentos ativos e recarregar
lifecycleScope.launch {
sdk.clearActiveUsers()
sdk.refreshExperiments()
}
// 3. Verificar se está inicializado
if (sdk.isInitialized()) {
sdk.refreshExperiments()
} else {
Log.w("GoAB", "SDK não inicializado")
}
Problemas de Valores
Valores incorretos retornados
Sintomas:
- Tipos incorretos (String em vez de Boolean)
- Valores inesperados
- Conversão de tipos falha
Soluções:
// 1. Verificar tipo do valor
fun getValueSafely(key: String, defaultValue: Any): Any {
val value = sdk.getValue(key, defaultValue)
// Log para debug
Log.d("GoAB", "Valor para $key: $value (tipo: ${value.javaClass.simpleName})")
return value
}
// 2. Converter tipos explicitamente
fun getBooleanValue(key: String, defaultValue: Boolean): Boolean {
val value = sdk.getValue(key, defaultValue)
return when (value) {
is Boolean -> value
is String -> value.toBooleanStrictOrNull() ?: defaultValue
else -> defaultValue
}
}
// 3. Usar valores padrão seguros
val buttonText = sdk.getValue("button_text", "Clique Aqui") as String
Valores padrão sempre retornados
Sintomas:
- Experimentos não funcionam
- Valores padrão são sempre usados
- Mudanças no servidor não refletem
Possíveis Causas:
- SDK não inicializado
- Chave do experimento incorreta
- Usuário não está no experimento
- Problemas de rede
Soluções:
// 1. Verificar inicialização
if (!sdk.isInitialized()) {
Log.w("GoAB", "SDK não inicializado")
return
}
// 2. Verificar chave do experimento
val value = sdk.getValue("button_color", "#FF0000")
Log.d("GoAB", "Valor obtido: $value")
// 3. Aguardar inicialização
lifecycleScope.launch {
sdk.initialize()
// Aguardar um pouco para garantir que os experimentos foram carregados
delay(1000)
val value = sdk.getValue("button_color", "#FF0000")
Log.d("GoAB", "Valor após inicialização: $value")
}
Problemas de Performance
SDK lento
Sintomas:
- Aplicação fica lenta
- UI trava durante inicialização
- Timeout em operações
Soluções:
// 1. Inicializar em background
lifecycleScope.launch(Dispatchers.IO) {
sdk.initialize()
}
// 2. Usar cache local
// O SDK já usa cache local, mas você pode forçar o uso
val value = sdk.getValue("key", "default") // Usa cache se disponível
// 3. Configurar timeout menor
val sdk = GoABSDKFactory.create(
context = this,
accountId = 2,
apiToken = "app_bf8f8ffe8c9e8b5877a0028f67750633e18d293ed760454af88a66543a3f90f8",
timeoutSeconds = 10 // Timeout menor
)
Memória alta
Sintomas:
- Aplicação consome muita memória
- OutOfMemoryError
- Performance degradada
Soluções:
// 1. Limpar experimentos ativos periodicamente
lifecycleScope.launch {
// Limpar experimentos ativos a cada 24 horas
delay(24 * 60 * 60 * 1000)
sdk.clearActiveUsers()
}
// 2. Usar valores padrão quando possível
val value = sdk.getValue("key", "default")
if (value == "default") {
// Usar valor padrão sem fazer mais requisições
}
Problemas de Usuário
Mudança de usuário não funciona
Sintomas:
setUserId()não atualiza experimentos- Valores antigos são mantidos
- Usuário não muda
Soluções:
// 1. Verificar se SDK está inicializado
if (!sdk.isInitialized()) {
Log.w("GoAB", "SDK não inicializado")
return
}
// 2. Aguardar atualização
lifecycleScope.launch {
sdk.setUserId("new_user_id")
// Aguardar um pouco para garantir que os experimentos foram recarregados
delay(1000)
// Verificar se o usuário mudou
val currentUserId = sdk.getCurrentUserId()
Log.d("GoAB", "Usuário atual: $currentUserId")
}
// 3. Limpar experimentos ativos se necessário
lifecycleScope.launch {
sdk.clearActiveUsers()
sdk.setUserId("new_user_id")
}
Usuário não é persistido
Sintomas:
- Usuário é perdido ao reiniciar app
getCurrentUserId()retorna null- Experimentos não são carregados
Soluções:
// 1. Verificar se o usuário está sendo salvo
lifecycleScope.launch {
sdk.setUserId("user123")
// Verificar se foi salvo
val savedUserId = sdk.getUserId()
Log.d("GoAB", "Usuário salvo: $savedUserId")
}
// 2. Configurar usuário na inicialização
val config = GoABConfig(
baseUrl = "https://api.goab.com",
accountId = 12345,
appContext = GoABConfig.AppContext(
userId = "user123" // Definir usuário na configuração
)
)
Logs e Debug
Habilitar logs detalhados
val config = GoABConfig(
baseUrl = "https://api.goab.com",
accountId = 12345,
enableLogging = true, // Habilitar logs
appContext = appContext
)
Verificar logs
// Filtrar logs do GoAB
adb logcat | grep "GoAB"
Debug de valores
suspend fun debugExperimentValues() {
val keys = listOf("button_color", "show_banner", "max_retries")
keys.forEach { key ->
val value = sdk.getValue(key, null)
Log.d("GoAB", "Chave: $key, Valor: $value, Tipo: ${value?.javaClass?.simpleName}")
}
}
Contato e Suporte
Se você ainda está enfrentando problemas:
- Verifique os logs do Android
- Teste com uma configuração mínima
- Verifique a conectividade de rede
- Entre em contato com o suporte técnico
Exemplo de Configuração de Debug
class DebugGoABManager {
private val sdk: GoABSDK
constructor(context: Context) {
sdk = GoABSDKFactory.create(
context = context,
accountId = 2,
apiToken = "app_bf8f8ffe8c9e8b5877a0028f67750633e18d293ed760454af88a66543a3f90f8",
timeoutSeconds = 60
)
}
suspend fun initializeWithDebug() {
try {
Log.d("DebugGoAB", "Iniciando inicialização...")
sdk.initialize()
// Aguardar inicialização
while (!sdk.isInitialized()) {
delay(100)
}
Log.d("DebugGoAB", "SDK inicializado com sucesso")
// Testar valores
testExperimentValues()
} catch (e: Exception) {
Log.e("DebugGoAB", "Erro na inicialização", e)
}
}
private suspend fun testExperimentValues() {
val testKeys = listOf("test_key_1", "test_key_2", "test_key_3")
testKeys.forEach { key ->
val value = sdk.getValue(key, "default_value")
Log.d("DebugGoAB", "Teste - Chave: $key, Valor: $value")
}
}
}