2014-04-20 2 views
0

В настоящее время я работаю над проектом Android, в котором я делаю вычисления на C, используя Android NDK.Метод во внутреннем классе, отнятый proguard

Мое приложение работает нормально, пока я не запускаю proguard, но когда я это делаю, метод «reportProgress», удаляется прогард. Этот метод является частью частного внутреннего класса, который расширяет AsyncTask

private class CalculateTask extends AsyncTask 

Я называю мой родной код со ссылкой на экземпляр CalculateTask. Нативный код затем вызвать элемент в этом классе, используя следующий код в JNI

jclass taskClass = (*env)->GetObjectClass(env, task); 
jmethodID reportProgressMid = (*env)->GetMethodID(env, taskClass, "reportProgress", "(Ljava/lang/String;I)Z"); 

где задача является ссылка на экземпляр CalculateTask. Я с трудом рассказываю програде, чтобы не отрывать

public boolean reportProgress(String, int) 

метод, который вызывается только через JNI.

До сих пор я принял следующие подходы, ни один из которых сделали трюк:

Keeping всего класса:

-keep class MYPACKAGENAME.CalculateScreen$CalculateTask 

только хранение упомянутого метода, выполнив:

-keep class MYPACKAGENAME.CalculateScreen$CalculateTask { 
    public boolean reportProgress(java.lang.String,int); 
} 

Или это:

-keepclassmembers class MYPACKAGENAME.CalculateScreen$CalculateTask { 
    public boolean reportProgress(java.lang.String,int); 
} 

Использование аннотаций (повторное использование аннотацию Google AdMob):

-keep class MYPACKAGENAME.CalculateScreen$CalculateTask { 
    @com.google.android.gms.common.annotation.KeepName <methods>; 
} 

Или это:

-keepclassmembers class MYPACKAGENAME.CalculateScreen$CalculateTask { 
    @com.google.android.gms.common.annotation.KeepName <methods>; 
} 

Моя конфигурация ProGuard основана на "оптимизации" распределенным с Android SDK, под названием Proguard-андроида-оптимизируют .текст.

Обратите внимание, что proguard запускается через Gradle, и я убедился, что задача proguard очищена и повторно запущена.

+0

Несколько соответствует этому вопросу: http://stackoverflow.com/questions/9298992/proguard-setting-to-not-remove-unused-method/9302402#9302402 Но я не вижу, как мой подход # 3 отличаются от предлагаемого решения. – darkdark

ответ

1

Ваша вторая и третья конфигурация должна работать для этого случая:

-keepclassmembers class MYPACKAGENAME.CalculateScreen$CalculateTask { 
    public boolean reportProgress(java.lang.String,int); 
} 

Вы должны проверить имя класса и имя метода опечаток. Вы также должны проверить, действительно ли метод является общедоступным.

Вы можете проверить, сохранен ли метод в bin/proguard/seeds.txt.

Вы также можете проверить скомпилированный класс ввода и обработанный класс вывода с помощью javap.

+0

Предлагаемый подход действительно был правильным. Спасибо за ваш быстрый ответ, Эрик. – darkdark

Смежные вопросы