【问题标题】:Android - Proguard obfuscate not able to find android classesAndroid - Proguard 混淆无法找到 android 类
【发布时间】:2011-09-12 16:14:44
【问题描述】:

我无法在我的 android 项目上运行混淆。我不断收到 100 个错误,每个人都说类似的话 -

[javac]     /MyPath/LocationReceiver.java:34: cannot find symbol
[javac] symbol  : class Intent
[javac] location: class com.myPath.LocationReceiver
[javac]     public final void onHandleIntent(Intent intent) {

我需要看哪里?我的 build.xml 文件指定了所有正确的 android 路径。

我的构建文件 -

<property name="src.dir"     value="src/com"/>
<property name="build.dir"   value="build"/>
<property name="classes.dir" value="${build.dir}/classes"/> 
<property name="input.jar.file" value="${build.dir}/temp.jar"/>
<property name="obfuscated_sdk.jar.file" value="${build.dir}/MyName.jar"/>
<property name="proguard-home" value="/MyPath/proguard4.6" />
<property name="android-home" value="/MyPath/android-sdk" />
<property name="android-version" value="8" />
<property name="android-platform-specific" value="${android-home}/platforms/android-${android-version}" />
<property name="android-jar" value="${android-platform-specific}/android.jar" />

<target name="clean">
    <delete dir="${build.dir}"/>
</target>

<target name="build-sdk" depends="clean" description="compiles the sdk java files"> 
    <mkdir dir="${classes.dir}"/>
    <javac srcdir="${src.dir}"
             destdir="${classes.dir}"
             source="1.6"  
                 debuglevel="lines">
            <classpath>
                <path>
                    <pathelement location="${android-jar}" /> 
                </path>
            </classpath>
    </javac>
</target> 

<target name="create.input.jar" depends="build-sdk"> 
    <jar destfile="${input.jar.file}" basedir="${classes.dir}">
        <manifest>
            <attribute name="MyName" value="v1.0"/>
        </manifest>
    </jar>
</target> 

<target name="Obfuscate" depends="create.input.jar" description="shrink compiled classes">
    <taskdef resource="proguard/ant/task.properties" classpath="/MyPath/proguard4.6/lib/proguard.jar" />
    <proguard>
        -libraryjars "/System/Library/Frameworks/JavaVM.framework/Versions/1.6.0/Classes/classes.jar"
        -libraryjars "/MyPath/android-sdk/platforms/android-8/android.jar" 
        -injars      ${input.jar.file}
        -outjars     ${obfuscated_sdk.jar.file}  

</proguard>
    <delete file="${input.jar.file}"/>
    <delete dir="${classes.dir}"/>
    <delete dir="bin"/>
</target>

【问题讨论】:

  • 当然看起来像一个类路径问题。您是在 Eclipse 中执行此操作的吗?
  • 是的,我是。如果有帮助,我还会得到包 android.app 不存在和包 android.content 不存在错误
  • 每次构建都会发生这种情况,还是仅在导出签名的 .apk 文件时发生?
  • 我只是想在我的源代码上运行它。仅在一个项目中尝试过。
  • 哈哈。现在您知道使用您的混淆软件的客户的感受了

标签: android obfuscation proguard


【解决方案1】:

这听起来像是一个类路径问题。它可能与 ProGuard 没有任何关系,因为 Android 构建系统仅在导出已签名的 .apk 文件时调用它。另外,我相信 Eclipse 使用自己的构建系统,不依赖 build.xml。

要尝试的事情:

  1. 确保您将项目创建为 Android 项目。如果没有,请重新开始。
  2. 在包资源管理器中右键单击项目名称,然后选择 Android 工具 > 修复项目属性。
  3. 打开项目属性,选择 Android 并确保选择了项目构建目标。然后选择 Java Build Path,并确保 Android 库显示在“库”窗格中。

【讨论】:

  • 我的项目构建并运行良好。就在我尝试运行混淆时,我得到了错误。
  • 我使用 ant 脚本运行 build.xml。我在上面的问题中添加了文件。感谢您的帮助。
  • 我建议你放弃使用自己的脚本。相反,只需从 Eclipse 中导出一个签名的 .apk 文件。它不仅编译和签名,它运行 zipalign,然后运行 ​​ProGuard(使用项目目录中 proguard.cfg 的内容来控制混淆)。
  • 我不得不运行自己的脚本,因为我本质上是在创建一个 sdk,它只是使用 android sdk jar 的一堆 java 文件(不是 android 项目)。有没有更简单的方法来保护这些文件?
  • 错误消息看起来像是来自 javac 任务,而不是 proguard 任务。你对make build-sdk 有同样的行为吗?另外,请尝试使用 classpath=${android-jar} 作为 javac 任务的属性,而不是使用嵌套的 classpath 元素。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多