Почему Proguard не запутывает определенный код в приложении для Android - PullRequest
0 голосов
/ 23 января 2012

Я создаю версию выпуска своего приложения, используя ant и proguard. Выпускная версия моего приложения построена успешно, однако единственными частями кода, которые запутываются, являются локальные переменные. Методы и переменные класса сохраняют свои точные имена. Еще больше запутывает тот факт, что файл mapping.txt генерируется каждый раз, когда я строю, и я вижу, что методы и переменные класса сопоставляются с чем-то другим. Однако когда я использую Dex2Jar для деконструкции моего файла .apk, я не вижу ни одного из отображений.

Я недавно обновил ADB до r16. До этого обновления я использовал версию ADB, которая была pre-r14. Используя версию ADB до r14, я успешно запутывал свое приложение в течение года. Я смог убедиться, что эти pre-r14 .apks были полностью запутаны, также разобрав их.

Может кто-нибудь сказать мне, почему имена методов и переменные класса не запутываются? Я включил мои файлы сборки ниже. Хотя после обновления до r16 структура некоторых файлов сборки немного отличается, я, по сути, следую тем же шагам, которые я использовал при использовании ADB до r14, поэтому я не понимаю, почему у меня другие поведение.

proguard.cfg:

-optimizationpasses 5
-dontusemixedcaseclassnames
-dontskipnonpubliclibraryclasses
-dontpreverify
-verbose
-optimizations !code/simplification/arithmetic,!field/*,!class/merging/*
-renamesourcefileattribute SourceFile
-keepattributes SourceFile,LineNumberTable

-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.app.backup.BackupAgentHelper
-keep public class * extends android.preference.Preference
-keep public interface com.android.vending.licensing.ILicensingService

-keepclasseswithmembernames class * {
    native <methods>;
}

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

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

-keepclassmembers enum * {
    public static **[] values();
    public static ** valueOf(java.lang.String);
}

-keep class * implements android.os.Parcelable {
  public static final android.os.Parcelable$Creator *;
}

build.xml:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE project [ <!ENTITY add-proguard-release SYSTEM "add-proguard-release.xml">]>
<project name="MyApp" default="help">

&add-proguard-release;

<property file="local.properties" />

<property file="ant.properties" />

<loadproperties srcFile="project.properties" />

<fail
    message="sdk.dir is missing. Make sure to generate local.properties using 'android update project' or to inject it through an env var"
    unless="sdk.dir"/>

<!-- Custom Android task to deal with the project target, and import the
         proper rules.
     This requires ant 1.6.0 or above. -->
<path id="android.antlibs">
    <pathelement path="${sdk.dir}/tools/lib/anttasks.jar" />
    <pathelement path="${sdk.dir}/tools/lib/sdklib.jar" />
    <pathelement path="${sdk.dir}/tools/lib/androidprefs.jar" />
</path>

<taskdef name="setup"
    classname="com.android.ant.SetupTask"
    classpathref="android.antlibs" />

<import file="${sdk.dir}/tools/ant/build.xml" />

1 Ответ

0 голосов
/ 23 января 2012

Изначально меня смутили ссылки вашего build.xml на "add-proguard-release".Теперь я вижу, что эти ссылки были когда-то необходимыми для добавления поддержки Proguard в процесс сборки.Однако поддержка proguard теперь встроена в сам мастер SDK_DIR / tools / ant.xml.(Я думаю, что он появился до r16)

Короче говоря - вам не нужны эти ссылки, только файл proguard.cfg для присутствия.Я бы просто создал пример проекта из командной строки, как описано в руководстве разработчика, и использовал сгенерированный build.xml в качестве основы для build.xml вашего проекта.Это, вероятно, будет работать прямо «из коробки».Это, конечно, для меня.Мои сборки выпуска, построенные с использованием Ant (вам понадобится Ant версии 1.8) из командной строки, имеют свои методы, запутанные OK.

PS Вам также нужна строка: proguard.config = proguard.cfg в файле project.properties.

...