Android Proguard 文本编码问题



编辑 2:Proguard 不会中断字符串:错误的源文件字符编码管理做!

(我最初的问题如下(

简而言之:在 eclipse 上编译很好(无论 java 源码编码是什么(。但我确实使用 Jenkins 编译以发布。

我不得不将源编码从 ISO-8859-1 更改为 UTF-8(我在 Mac 上,不确定这在 Windows 上会发生(

iconv -f ISO-8859-1 -t UTF-8 "$file" > "${file%.java}.utf8.java"; 

让Javac编译器知道这一点:

export JAVA_TOOL_OPTIONS=-Dfile.encoding=UTF-8

对于我所有的 java 文件:

find /path_to_mys_workspace/workspace -name *.java -type f | 
    (while read file; do
        iconv -f ISO-8859-1 -t UTF-8 "$file" > "${file%.java}.utf8.java";
        rm "$file";
        mv "${file%.java}.utf8.java" "$file";
    done);

(我还告诉 eclipse 使用 UTF-8 工作(

Preferences
  -> General
     -> Workspace
       -> DefaultFile encoding : UTF-8

现在它起作用了!

(另外,我遇到了这个问题,因为代码中的一些硬编码法语字符串... -1 对我来说。


我最初的问题:

Proguard很好,但并不总是很容易配置...

我正在使用 Proguard 构建我的 Android 应用程序集(协作的应用程序(的发布版本。

我快到了,但我面临一些与字符串相关的问题:

1 - 字符串编码问题

调试模式下正确显示的某些外来字符(在代码中的字符串中(现在在发布中(即在 proguard 处理之后(替换为 UTF 替换字符。

例:

The french 'à' is now displayed as � 

*̶2̶ ̶-̶ ̶B̶r̶o̶k̶e̶n̶ ̶B̶r̶o̶a̶d̶c̶a̶s̶t̶ ̶a̶c̶t̶i̶n̶s̶ *

编辑:广播根本没有被破坏:我忘记/犯了一些错误。

̶i̶ ̶d̶e̶f̶i̶n̶e̶d̶ ̶s̶o̶m̶e̶ ̶p̶u̶b̶l̶i̶c̶ ̶s̶t̶t̶i̶c̶ ̶f̶i̶n̶l̶ ̶s̶t̶r̶i̶n̶g̶s̶

̶i̶n̶ ̶m̶y̶

c̶o̶m̶.̶<̶m̶y̶_̶a̶p̶p̶_̶n̶a̶m̶e̶>̶.̶i̶n̶t̶e̶n̶t̶.̶C̶o̶n̶s̶t̶a̶n̶t̶s̶

̶c̶l̶a̶s̶s̶,̶s̶o̶ ̶I̶ ̶a̶d̶d̶e̶d̶

PP_7̶i̶n̶

̶m̶y̶ ̶p̶r̶o̶g̶u̶a̶r̶d̶ ̶c̶o̶n̶f̶i̶g̶ ̶f̶i̶l̶e̶。

̶i̶n̶ ̶r̶e̶l̶e̶a̶s̶e̶,̶ ̶ ̶*̶*̶*̶m̶y̶ ̶b̶r̶o̶a̶d̶c̶a̶s̶ ̶d̶o̶ ̶n̶o̶t̶ ̶w̶o̶r̶k̶*̶, ̶ ̶s̶o̶ ̶t̶h̶e̶ ̶s̶t̶r̶i̶n̶g̶ ̶h̶a̶v̶e̶ ̶p̶r̶o̶b̶l̶y̶ ̶b̶b̶r̶o̶k̶e̶n̶ ̶b̶y̶ ̶p̶r̶o̶g̶u̶a̶r̶d̶p̶r̶o̶c̶s̶s̶i̶n̶g̶

如何解决这些问题?

重要提示:

我有一个库项目和许多使用该库项目的应用程序项目。广播常量在库项目中定义,并在应用程序项目中使用。在保护所有应用程序的同时"保护"这些字符串的更合适的方法是什么?

我应该玩 -injars in.jar-outjars out.jar-libraryjars 等吗?

附加信息:

发布构建在 Jenkins Factory 中完成。不确定它是有用的信息,但想提到它以完成我的解释。


这是我的Proguard配置文件,所有应用程序和库项目都使用。

##
## my rules
##
-dontwarn org.joda.time.**,org.apache.harmony.**,com.google.vending.licensing.**,javax.security.**,java.beans.**,java.awt.**
-keep public class com.<my_package>.intent.**
{
     *;
}
#-keep public class * extends android.app.BaseActivity
-keep public class * extends com.<my_package>.shared.fragment.BaseFragment
-keepclassmembers class * extends com.<my_package>.shared.activity.BaseActivity {
   public boolean *();
   public boolean *(android.view.View);
   public void *();
   public void *(android.view.View);
}
-keepclassmembers class * extends com.<my_package>.shared.fragment.BaseFragment {
   public boolean *();
   public boolean *(android.view.View);
   public void *();
   public void *(android.view.View);
}
##
## common rules
##
-keep public class com.bugsense.*
#-repackageclasses ''
#-allowaccessmodification
#-optimizations !code/simplification/arithmetic
-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
-keepclassmembers class * extends android.content.Context {
   public void *(android.view.View);
   public void *(android.view.MenuItem);
}
-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);
}
##
## base proguard file content
##
-dontusemixedcaseclassnames
-dontskipnonpubliclibraryclasses
-verbose
# Optimization is turned off by default. Dex does not like code run
# through the ProGuard optimize and preverify steps (and performs some
# of these optimizations on its own).
-dontoptimize
-dontpreverify
# Note that if you want to enable optimization, you cannot just
# include optimization flags in your own project configuration file;
# instead you will need to point to the
# "proguard-android-optimize.txt" file instead of this one from your
# project.properties file.
-keepattributes *Annotation*
-keep public class com.google.vending.licensing.ILicensingService
-keep public class com.android.vending.licensing.ILicensingService
# For native methods, see http://proguard.sourceforge.net/manual/examples.html#native
-keepclasseswithmembernames class * {
    native <methods>;
}
# keep setters in Views so that animations can still work.
# see http://proguard.sourceforge.net/manual/examples.html#beans
-keepclassmembers public class * extends android.view.View {
   void set*(***);
   *** get*();
}
# We want to keep methods in Activity that could be used in the XML attribute onClick
-keepclassmembers class * extends android.app.Activity {
   public void *(android.view.View);
}
# For enumeration classes, see http://proguard.sourceforge.net/manual/examples.html#enumerations
-keepclassmembers enum * {
    public static **[] values();
    public static ** valueOf(java.lang.String);
}
-keep class * implements android.os.Parcelable {
  public static final android.os.Parcelable$Creator *;
}
-keepclassmembers class **.R$* {
    public static <fields>;
}
# The support library contains references to newer platform versions.
# Don't warn about those in case this app is linking against an older
# platform version.  We know about them, and they are safe.
-dontwarn android.support.**

感谢您的帮助。

ProGuard 根本不应该修改任何字符串。您应该确保在Android SDK(android-sdk/tools/proguard/lib/proguard.jar(中使用最新版本(目前为4.8或4.9测试版(。您可以检查您使用的是哪个版本

java -jar android-sdk/tools/proguard/lib/proguard.jar

在相关的说明中,您的配置表明您使用的是较旧的 Android SDK,因为从 SDK r20 开始,特定于项目的配置和独立于项目的配置现在单独指定(分别在 proguard-project 中.txt和 android-sdk/tools/proguard/proguard-android.txt 中(。简单地升级 SDK 可能已经有所帮助。

如果问题仍然存在,您可以在 ProGuard 网站上提交错误报告。

相关内容

  • 没有找到相关文章

最新更新