Habilitar o Proguard em aplicação Android – android ofuscação proguard

Pergunta:


Fiz um projeto de exemplo, utilizando SQLCipher, e estou tentando ofuscar o código com o Proguard, porém, após exportar e assinar a aplicação, e converter o classes.dex com o dex2jar, consigo ver praticamente todo o código com o Java Decompiler, pois o código não foi ofuscado. Eu gostaria de saber o que estou fazendo de errado na configuração do Proguard. Segue a configuração do proguard-project.txt:

 -injars      bin/classes
 -injars      libs
 -outjars     bin/classes-processed.jar
 -libraryjars C:/adt-bundle-windows-x86_64-20140702/sdk/platforms/android-        13/android.jar

-optimizations  !code/simplification/arithmetic,!code/simplification/cast,!field/*,!class/merging/*
-optimizationpasses 5
-allowaccessmodification
-dontpreverify
-renamesourcefileattribute SourceFile
-keepattributes *Annotation* 
-keepattributes SourceFile,LineNumberTable,Signature
 # Obfuscation
-repackageclasses ''
-flattenpackagehierarchy ''


-keep public class * extends android.app.Activity
-keep public class * extends android.app.Application
-keep public class * extends android.app.Service
-keep public class * extends android.content.BroadcastReceiver
-keep public class * extends android.content.ContentProvider

-keep public class * extends android.view.View {
 public <init>(android.content.Context);
 public <init>(android.content.Context, android.util.AttributeSet);
 public <init>(android.content.Context, android.util.AttributeSet, int);
 public void set*(...);
}

-keepclasseswithmembers class * {
 public <init>(android.content.Context, android.util.AttributeSet);
 }

-keepclasseswithmembers class * {
 public <init>(android.content.Context, android.util.AttributeSet, int);
 }

-keepclassmembers class * implements android.os.Parcelable {
 static android.os.Parcelable$Creator CREATOR;
 }

 -keepclassmembers class **.R$* {
  public static <fields>;
  }

 -keep public class net.sqlcipher.** {
  *;
  }

-keep public class net.sqlcipher.database.** {
   *;
 }

Autor da pergunta Fabio Calefi

Fabio, é possível que seu arquivo proguard-project.txt não esteja sendo aplicado ao projeto.
Se você estiver usando o Android Studio e Gradle dê uma olhada no build.gradle, procure pela entrada proguardFiles e tenha certeza que seu arquivo está listado lá.
Para instruções mais detalhadas dê uma consultada aqui: http://developer.android.com/tools/help/proguard.html

Código original :

package com.example.sqlcipher_exemplo;

import java.io.File;

import net.sqlcipher.Cursor;
import net.sqlcipher.database.SQLiteDatabase;
import net.sqlcipher.database.SQLiteDatabaseHook;
import android.app.Activity;
import android.content.ContentValues;
import android.os.Build;
import android.os.Bundle;
import android.util.Log;

public class MainActivity extends Activity 
{

    EventDataSQLHelper eventsData;
    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        if ("google_sdk".equals( Build.PRODUCT ) || Build.FINGERPRINT.startsWith("generic")) 
        {

               Log.i("EMULADOR", "rodando no emulador");

        } 
        else 
        {
               Log.i("DISPOSITIVO", "rodando no dispositivo");
        }

        SQLiteDatabase.loadLibs(this);
        String password = "123";
        eventsData = new EventDataSQLHelper(this);
        SQLiteDatabase db = eventsData.getWritableDatabase(password);   
        for(int i=1; i<100; i++)
        {
            addEvent("Hello Android Event "+i, db); 
        }
        db.close();
        db = eventsData.getReadableDatabase(password);
        Cursor cursor = getEvents(db);
        showEvents(cursor);
        db.close();
    }

    private void addEvent (String title, SQLiteDatabase db)
    {
        ContentValues values = new ContentValues();
        values.put(EventDataSQLHelper.TIME, System.currentTimeMillis());
        values.put(EventDataSQLHelper.TITLE, title);
        db.insert(EventDataSQLHelper.TABLE, null, values);
    }

    private Cursor getEvents(SQLiteDatabase db)
    {
        Cursor cursor = db.query(EventDataSQLHelper.TABLE, null, null, null, null, null, null);

        startManagingCursor(cursor);
        return cursor;
    }

    private void showEvents(Cursor cursor)
    {
        StringBuilder ret = new StringBuilder("Saved Events:nn");
        while (cursor.moveToNext())
        {
            long id = cursor.getLong(0);
            long time = cursor.getLong(1);
            String title = cursor.getString(2);
            ret.append(id+": "+time+":"+title+"n");
        }
        Log.i("sqldemo", ret.toString());
    }

    /*
    private void decryptDatabase() 
    {
          File unencryptedFile = getDatabasePath("events.db");
          unencryptedFile.delete();
          File databaseFile = getDatabasePath("events.db");
          SQLiteDatabaseHook hook = new SQLiteDatabaseHook() {
           public void preKey(SQLiteDatabase sqLiteDatabase) {
            sqLiteDatabase
              .rawExecSQL("PRAGMA cipher_default_use_hmac = off;");
           }

           public void postKey(SQLiteDatabase sqLiteDatabase) 
           {

           }
          };
          SQLiteDatabase database = SQLiteDatabase.openOrCreateDatabase(
            databaseFile, "123", null, hook); // Exception 
          if (database.isOpen()) 
          {
           database.rawExecSQL(String.format(
             "ATTACH DATABASE '%s' as plaintext KEY '';",
             unencryptedFile.getAbsolutePath()));
           database.rawExecSQL("SELECT sqlcipher_export('plaintext');");
           database.rawExecSQL("DETACH DATABASE plaintext;");
           android.database.sqlite.SQLiteDatabase sqlDB = android.database.sqlite.SQLiteDatabase
             .openOrCreateDatabase(unencryptedFile, null);
           sqlDB.close();
           database.close();
          }

          databaseFile.delete();
    }*/
}

Código depois do Proguard:

package com.example.sqlcipher_exemplo;

import android.app.Activity;
import android.content.ContentValues;
import android.os.Build;
import android.os.Bundle;
import android.util.Log;
import net.sqlcipher.Cursor;
import net.sqlcipher.database.SQLiteDatabase;

public class MainActivity
  extends Activity
{
  a a;

  private Cursor a(SQLiteDatabase paramSQLiteDatabase)
  {
    paramSQLiteDatabase = paramSQLiteDatabase.query("events", null, null, null, null, null, null);
    startManagingCursor(paramSQLiteDatabase);
    return paramSQLiteDatabase;
  }

  private void a(String paramString, SQLiteDatabase paramSQLiteDatabase)
  {
    ContentValues localContentValues = new ContentValues();
    localContentValues.put("time", Long.valueOf(System.currentTimeMillis()));
    localContentValues.put("title", paramString);
    paramSQLiteDatabase.insert("events", null, localContentValues);
  }

  private void a(Cursor paramCursor)
  {
    StringBuilder localStringBuilder = new StringBuilder("Saved Events:nn");
    for (;;)
    {
      if (!paramCursor.moveToNext())
      {
        Log.i("sqldemo", localStringBuilder.toString());
        return;
      }
      long l1 = paramCursor.getLong(0);
      long l2 = paramCursor.getLong(1);
      String str = paramCursor.getString(2);
      localStringBuilder.append(l1 + ": " + l2 + ":" + str + "n");
    }
  }

  protected void onCreate(Bundle paramBundle)
  {
    super.onCreate(paramBundle);
    setContentView(2130903040);
    int i;
    if (("google_sdk".equals(Build.PRODUCT)) || (Build.FINGERPRINT.startsWith("generic")))
    {
      Log.i("EMULADOR", "rodando no emulador");
      SQLiteDatabase.loadLibs(this);
      this.a = new a(this);
      paramBundle = this.a.getWritableDatabase("123");
      i = 1;
    }
    for (;;)
    {
      if (i >= 100)
      {
        paramBundle.close();
        paramBundle = this.a.getReadableDatabase("123");
        a(a(paramBundle));
        paramBundle.close();
        return;
        Log.i("DISPOSITIVO", "rodando no dispositivo");
        break;
      }
      a("Hello Android Event " + i, paramBundle);
      i += 1;
    }
  }
}

Fonte

Related Posts:

Qual a diferença entre AppCompatActivity e Activity? – android android-activity
Pergunta: Qual a diferença da AppCompatActivity para Activity ? A partir de qual versão a AppCompatActivity foi adicionada ao Android? Autor da pergunta Luhhh A diferença reside ...
Como abreviar palavras em PHP? – php string
Pergunta: Possuo informações comuns como nome de pessoas e endereços, e preciso que elas contenham no máximo 30 caracteres sem cortar palavras. Exemplo: 'Avenida Natalino João Brescansin' ...
Qual é a finalidade de um parêntese vazio numa declaração Lambda? – c# expressões-lambda característica-linguagem
Pergunta: Criei um exemplo de uma declaração Lambda sem argumentos, entretanto, estou com duvidas referente a omissão do parêntese vazio () na declaração. Veja o exemplo: class ...
Boas práticas para URI em API RESTful – api rest restful
Pergunta: Estou com dúvida em relação às URIs de alguns recursos da api que estou desenvolvendo. Tenho os recursos projetos e atividades com relação 1-N, ...
Dúvidas sobre a integração do MySQL com Java – java mysql netbeans
Pergunta: Estou criando um sistema no NetBeans, utilizando a linguagem Java e o banco de dados MySQL. Escrevi o seguinte código para realizar a conexão ...
Qual é a finalidade da pasta Model do framework Inphinit? – php inphinit
Pergunta: No Inphinit micro-framework existe a pasta Model que fica dentro da pasta application, e nela é onde ficam as classes, mas eu estou muito ...
Uso do ‘@’ em variáveis – javascript typescript coffeescript
Pergunta: Vejo em algumas linguagens que compilam para javascript, como TypeScript e CoffeeScript, o uso do @ em variáveis, como também, casos em que o ...
Qual tamanho máximo um arquivo JSON pode ter? – json arquivo
Pergunta: Vou dar um exemplo para conseguir explicar minha duvida: Preciso recuperar informação de imagens vindas de uma API, esse banco de imagens me retorna JSON's ...
O que é Teste de Regressão? – terminologia engenharia-de-software testes
Pergunta: Na matéria de Teste de Software o professor abordou um termo chamado Teste de Regressão, isto dentro da disciplina de teste de software. Sendo ...
O que é um construtor da linguagem? – php característica-linguagem
Pergunta: Em PHP, já li e ouvi várias vezes a respeito dos Construtores da Linguagem. Os casos que sempre ouvi falar deles foi em casos ...
Função intrínseca para converter numérico para string – cobol
Pergunta: Estou a tentar saber se existe alguma função intrínseca do COBOL para converter um data numérico para string sem precisar usar a cláusula REDEFINES: ( ...
Porque usar implements? – java android
Pergunta: Qual a diferença entre usar btn.setOnClickListener(new OnClickListener() { e public class MainActivity extends Activity implements OnClickListener{ Estive fazendo um curso de Android e meu professor falou que ...
O que é XHTML e quando deve ser usado? – html xml xhtml
Pergunta: O que eu sei é que o XHTML precisa ser XML válido. Isso implica, por exemplo, que todas as tags precisam ser fechadas. Por ...
Uma placa aceleradora de vídeo pode melhorar o desempenho não-gráfico? [fechada] – desempenho
Pergunta: Para desenvolver em Ruby on Rails, eu utilizo aqui uma máquina virtual do VirtualBox com Ubuntu Server 14.04 sem interface gráfica instalada. Recentemente descobri uma ...
Concat() VS Union() – c# .net
Pergunta: Qual a diferença entre Concat() e Union() ? Quando usar Concat() e quando usar Union() ? Somente pode ser usado em list ? ...

Deixe uma resposta

O seu endereço de email não será publicado. Campos obrigatórios marcados com *