ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

android-使用proguard混淆JAR时的怪异行为

2019-10-12 13:28:01  阅读:272  来源: 互联网

标签:android proguard obfuscation


我正在尝试使用Proguard(4.7,但4.6也有问题)来混淆Android JAR.我可以将问题分解为一个简单的示例项目.

问题:对于某些函数(由于什么原因不清楚),公开的函数的参数名称丢失,有时“加扰”(确实).我想首先关注“丢失”的部分,因为混乱的事情更加奇怪.

1)我在Eclipse中创建了一个库项目.由于某些原因,Android SDK为2.1更新1
该项目被标记为“ Library Project”,并且只有一个类MyJarEntry.java和一个导出函数foo

package com.decades.myjar;

import android.location.LocationListener;

public class MyJarEntry {

    public void foo(String provider, long minTime, float minDistance, LocationListener listener) {
    }
}

2)我的项目有一个子目录“ proguard”,其中包含最新的proguard.jar和proguard.cfg,如下所示

-printmapping out.map

-keepparameternames
-renamesourcefileattribute SourceFile
-keepattributes Exceptions,InnerClasses,Signature,Deprecated,
            SourceFile,LineNumberTable,*Annotation*,EnclosingMethod

-keep public class * {
    public protected *;
}

3)我的Build.xml具有构建JAR和优化它的目标,因此在Eclipse中构建lib之后,我在终端中执行“ ant jar”和“ andoptimize”.这是build.xml

<project name="MyJar" default="jar" basedir=".">
<description>
  Lib JAR builder
</description>

<!-- set global properties for this build -->
<property name="res" location="res" />
<property name="bin" location="bin" />

<!-- Output directories -->
<property name="out.dir" value="bin" />
<property name="out.absolute.dir" location="${out.dir}" />
<property name="out.classes.dir" value="${out.absolute.dir}/com" />
<property name="out.classes.absolute.dir" location="${out.classes.dir}" />


<!-- Pack the jar -->
<target name="jar">
    <jar destfile="MyJar.jar" basedir="bin/">
        <!-- replace 'com' by what ever you are using -->
        <!-- as first part of the package name -->
        <!-- e.g. de, org, ... -->
        <!-- the ** is important to include the directory recursively -->
        <include name="com/**" />
    </jar>
</target>

<!-- Obfuscation with ProGuard -->

<property name="version" value="0.0.1"/>            <!-- change this occasionally -->

<property name="proguard-dir" value="proguard"/>
<property name="unoptimized" value="MyJar.jar"/>
<property name="optimized" value="MyJar_${version}.jar"/>


<target name="optimize" unless="nooptimize">

    <!-- Run obfuscator -->
    <java jar="${proguard-dir}/proguard.jar" fork="true" failonerror="true">
        <jvmarg value="-Dmaximum.inlined.code.length=16"/>
        <arg value="@${proguard-dir}/proguard.cfg"/>      
        <arg value="-injars ${unoptimized}"/>
        <arg value="-outjars ${optimized}"/>
        <arg value="-libraryjars /Users/decades/android-sdk-mac_x86/platforms/android-7/android.jar"/>
    </java>     
</target>   

       

可以进行构建和混淆处理,但是将生成的MyJar_0.0.1.jar导入到测试项目中后,代码完成不会显示正确的参数名称,而是将foo表示为

foo(String arg0,long arg1,float arg2,LocationListener arg3)

尽管指定了“ keepparameternames”.

我已经花了几个小时,却无法正常工作.如果导入未混淆的JAR,一切都很好.软件包中的其他一些功能也会显示正确的参数名称.

一无所知,对吗?

问候

解决方法:

ProGuard 4.7(或更早版本)似乎会删除未使用的参数名称.现在,我已为以后的版本修复了此问题.您可以通过关闭优化(-dontoptimize)来解决此问题.

请注意,您始终可以报告有关ProGuard’s bug tracker的错误.

标签:android,proguard,obfuscation
来源: https://codeday.me/bug/20191012/1900538.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有