0

I use LocalSocket and LocalServerSocket for cross-process communication. my code is:

public class SocksThread extends Thread {

public static final String TAG = "SocksThread";

private File mProtect = null;

private SocksService mSocksService = null;

private volatile Boolean mIsRunning = true;
private volatile LocalServerSocket mLocalServerSocket = null;

public SocksThread(SocksService SocksService) {
    mSocksService = SocksService;
    mProtect = new File(mSocksService.getFilesDir(), SocksConfig.SHARE_PATH_PROTECT_PATH);
}

@Override
public void run() {
    mProtect.delete();

    try {
        LocalSocket localSocket = new LocalSocket();
        localSocket.bind(new LocalSocketAddress(mProtect.getAbsolutePath(), LocalSocketAddress.Namespace.FILESYSTEM));
        mLocalServerSocket = new LocalServerSocket(localSocket.getFileDescriptor());
    } catch (IOException e) {
        e.printStackTrace();
        Log.e(TAG, "unable to bind", e);

        return;
    }

    final LocalSocket socket = mLocalServerSocket.accept();
}
}

There is no problem without proguard, but when I set proguard, the following line throw error:

final LocalSocket socket = mLocalServerSocket.accept();

And the error log is:

java.io.IOException: accept failed: EBADF (Bad file descriptor)
at android.net.LocalSocketImpl.accept(LocalSocketImpl.java:347)
at android.net.LocalServerSocket.accept(LocalServerSocket.java:90)
at com.mobile.socks.core.d.run(SockThread.java:56)
Caused by: android.system.ErrnoException: accept failed: EBADF (Bad file descriptor)
at libcore.io.Posix.accept(Native Method)
at libcore.io.BlockGuardOs.accept(BlockGuardOs.java:64)
at android.system.Os.accept(Os.java:43)
at android.net.LocalSocketImpl.accept(LocalSocketImpl.java:344)
at android.net.LocalServerSocket.accept(LocalServerSocket.java:90) 
at com.mobile.socks.core.d.run(SockThread.java:56)

my proguard rules is:

#指定代码的压缩级别
-optimizationpasses 7
#混淆时不会产生形形色色的类名
-dontusemixedcaseclassnames
#不去忽略非公共的库类
-dontskipnonpubliclibraryclasses
-dontskipnonpubliclibraryclassmembers
#不优化输入的类文件
-dontoptimize
#不压缩输入的类文件
-dontshrink
#预校验
-dontpreverify
#混淆时是否记录日志
-verbose
#混淆时所采用的算法
-optimizations !code/simplification/arithmetic,!field/*,!class/merging/*
#忽略警告
-dontwarn android.support.**
#保护给定的可选属性
-keepattributes Exceptions,InnerClasses,Signature,SourceFile,LineNumberTable,*Annotation*
#优化时假设指定的方法,没有任何副作用
-assumenosideeffects class android.util.Log {
#    public static *** v(...);
#    public static *** i(...);
#    public static *** d(...);
#    public static *** w(...);
#    public static *** e(...);
#    public static *** a(...);
}
-assumenosideeffects class java.io.PrintStream{
   public void println(...);
}
# 忽略把包时的warning,使得打包过程能顺利通过
-ignorewarnings

########## 记录生成的日志数据,gradle build时在本项目根目录输出 start ##########
#描述 apk 文件中所有类文件间的内部结构
-dump dump.txt
#列出了未被混淆的类和成员
-printseeds seeds.txt
#列出从 apk 中删除的代码
-printusage unused.txt
#列出了原始的类,方法,和字段名与混淆后代码之间的映射
-printmapping mapping.txt
########## 记录生成的日志数据,gradle build时 在本项目根目录输出 end ##########

# 忽略警告
-dontwarn com.testmobile.**
-dontwarn com.alibaba.**
-dontwarn com.taobao.**
-dontwarn com.google.android.maps.**
-dontwarn java.awt.**
-dontwarn anetwork.channel.**
-dontwarn org.android.**
-dontwarn android.content.**
-dontwarn android.webkit.WebView
-dontwarn com.umeng.**
-dontwarn com.tencent.**
-dontwarn com.facebook.**
-dontwarn okio.**
-dontwarn com.squareup.okhttp.**
-dontwarn okhttp3.**
-dontwarn javax.annotation.**
-dontwarn com.android.volley.toolbox.**
-dontwarn android.net.http.**
-dontwarn org.apache.http.**
-dontwarn android.support.v4.**

# 保持哪些类不被混淆
-keep public class android.webkit.WebView {*;}
-keep public class android.webkit.WebViewClient {*;}
-keep public class * extends android.support.v4.app.Fragment
-keep public class * extends android.app.Fragment
-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 class * extends android.widget.*{*;}
-keep public class com.android.vending.licensing.ILicensingService

-keep class org.apache.http.** {*;}
-keep class com.tencent.** {*;}
-keep class com.taobao.** {*;}
-keep class com.alibaba.** {*;}
-keep class com.umeng.**{*;}
-keep class com.android.internal.util.** {*;}
-keep class android.taobao.** {*;}
-keep class android.webkit.**
-keep class android.** {*;}
-keep class android.annotation.** {*;}
-keep class android.support.v4 {*;}
-keep class android.content.** {*;}
-keep class dalvik.** {*;}
-keep class java.** {*;}
-keep class javax.** {*;}
-keep class org.** {*;}
-keep class org.android.** {*;}
-keep class org.apache.** {*;}
-keep class org.json.** {*;}
-keep class com.google.android.gms.** { *; }
-keep class com.google.i18n.phonenumbers.**
-keep class android.support.annotation.** { *; }

# 一些需要用Gson解析的bean类都不混淆
-keep class com.testmobile.whatstest.server.bean.**
-keep class * extends com.testmobile.whatstest.server.bean.**
-keep class com.testmobile.testFoo.testserver.bean.**
-keep class com.testmobile.whatstest.cloud.bean.**

-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);
}

-keepclassmembers class * extends android.content.Context {
   public void *(android.view.View);
   public void *(android.view.MenuItem);
}

-keepclassmembers class * {
  *** removeJavascriptInterface();

  *** facing;
  *** getNumberOfCameras();

  *** theUnsafe;
  *** allocateInstance(java.lang.Class);

  *** getScript(java.lang.String);
  *** addLikelySubtags(java.lang.String);

  *** elements;
  *** name;
  *** value;

  *** name();
  *** value();
  *** fetch();
  *** length();
  *** nullable();
  *** unique();
  *** columnDefinition();

  *** get(java.lang.String,java.lang.String);
  *** getSingleton();
  *** getMillis();

  public <init>(java.lang.String);
  public <init>(android.content.Context);
  public <init>(android.app.Activity,int);
}

#保持 native 方法不被混淆
-keepclasseswithmembers class * {
    native <methods>;
}
#保持自定义控件类不被混淆
-keepclasseswithmembers class * {
    public <init>(android.content.Context, android.util.AttributeSet);
}
#保持自定义控件类不被混淆
-keepclasseswithmembers class * {
    public <init>(android.content.Context, android.util.AttributeSet, int);
}
#保持自定义控件类不被混淆
-keepclassmembers class * extends android.app.Activity {
   public void *(android.view.View);
}
#保持 Parcelable 不被混淆
-keep class * implements android.os.Parcelable {
  public static final android.os.Parcelable$Creator *;
}
#保持 Serializable 不被混淆
-keepnames class * implements java.io.Serializable
#保持 Serializable 不被混淆
-keepclassmembers class * implements java.io.Serializable {
    static final long serialVersionUID;
    private static final java.io.ObjectStreamField[] serialPersistentFields;
    !static !transient <fields>;
    !private <fields>;
    !private <methods>;
    private void writeObject(java.io.ObjectOutputStream);
    private void readObject(java.io.ObjectInputStream);
    java.lang.Object writeReplace();
    java.lang.Object readResolve();
}

# 保持枚举 enum 类不被混淆
-keepclassmembers enum * {
    public static **[] values();
    public static ** valueOf(java.lang.String);
}

#不混淆资源类
-keepclassmembers class **.R$* {
    public static <fields>;
}

#event bus 的注解方法不能混淆
-keepclassmembers class ** {
    @com.squareup.otto.Subscribe public *;
    @com.squareup.otto.Produce public *;
}

#不混淆 jsbridge
-keepclassmembers class ** {
    @android.webkit.JavascriptInterface public *;
}

###--------------- Begin: proguard configuration for Gson ---------------###
# Gson uses generic type information stored in a class file when working with fields. Proguard
# removes such information by default, so configure it to keep all of it.
#-keepattributes Signature

# For using GSON @Expose annotation
#-keepattributes *Annotation*

# Gson specific classes
-keep class sun.misc.Unsafe { *; }
#-keep class com.google.gson.stream.** { *; }

# Application classes that will be serialized/deserialized over Gson
#-keep class com.google.gson.examples.android.model.** { *; }

-keep class com.google.gson.** { *; }
###--------------- End: proguard configuration for Gson ----------###

###--------------- Begin: proguard configuration for 阿里聚安全组件 ---------------###
-keep class com.taobao.securityjni.**{*;}
-keep class com.taobao.wireless.security.**{*;}
-keep class com.ut.secbody.**{*;}
-keep class com.taobao.dp.**{*;}
-keep class com.alibaba.wireless.security.**{*;}
###--------------- End: proguard configuration for 阿里聚安全组件 ---------------###

###--------------- Begin: proguard configuration for mobpub 广告 ---------------###
-keep class  com.mopub.nativeads.*{*;}
-keep class  com.mopub.common.**{*;}
-keep class  com.mopub.network.**{*;}
-dontwarn com.mopub.**
-keep class com.cmcm.adsdk.nativead.MopubNativeAdLoader{
        <fields>;
        <methods>;
}
-keep class com.mopub.mobileads.MoPubActivity{
        <fields>;
        <methods>;
}
-keep class com.mopub.mobileads.MraidActivity{
        <fields>;
        <methods>;
}
-keep class com.mopub.common.MoPubBrowser{
        <fields>;
        <methods>;
}
-keep class com.mopub.mobileads.MraidVideoPlayerActivity{
        <fields>;
        <methods>;
}
###--------------- End: proguard configuration for mobpub 广告 ---------------###

###--------------- Begin: proguard configuration for admob 广告 ---------------###
-keep class com.cmcm.adsdk.adapter.AdmobNativeAdapter{ *; }
-keep public class com.google.android.gms.ads.**{
    public *;
}
# For old ads classes
-keep public class com.google.ads.**{
    public *;
}

# For mediation
-keepattributes *Annotation*
# Other required classes for Google Play Services
# Read more at http://developer.android.com/google/play-services/setup.html
-keep class * extends java.util.ListResourceBundle {
    protected Object[][] getContents();
}
-keep public class com.google.android.gms.common.internal.safeparcel.SafeParcelable {
    public static final *** NULL;
}
-keepnames @com.google.android.gms.common.annotation.KeepName class *
-keepclassmembernames class * {
    @com.google.android.gms.common.annotation.KeepName *;
}
-keepnames class * implements android.os.Parcelable {
    public static final ** CREATOR;
}

-keep class com.google.ads.mediation.admob.AdMobAdapter {
    *;
}

-keep class com.google.ads.mediation.AdUrlAdapter {
    *;
}
-keep public @com.google.android.gms.common.util.DynamiteApi class * { *; }
###--------------- End: proguard configuration for admob 广告 ---------------###

###--------------- Begin: proguard configuration for pingstart ---------------###
-keep class com.pingstart.adsdk.adapter.**{ *; }
-keep class com.pingstart.mobileads.**{ *; }
###--------------- End: proguard configuration for pingstart ---------------###

###--------------- Begin: proguard configuration for facebook 广告 ---------------###
-keep enum com.facebook.**
-keep public interface com.facebook.**

-keep class com.facebook.**
-keep class com.facebook.ads.**{*;}
-keep class FacebookNativeAdapter{ *; }
-keep class com.cmcm.adsdk.adapter.FacebookNativeAdapter{ *; }
-keep class com.cmcm.adsdk.adapter.FacebookInterstitialAdapter{ *; }
-keep class com.cmcm.adsdk.adapter.FaceBookInfomation{ *; }
-keep class com.facebook.** { *; }
-keep class com.google.ads.mediation.facebook.FacebookAdapter {*;}
-keep public final class com.facebook.internal.Utility { *; }
###--------------- End: proguard configuration for facebook 广告 ---------------###

###--------------- Begin: jni类不能混淆 ---------------###
-keep class **.JniHelper { *; }

-libraryjars ../testFoo/src/main/jnisource/libs/armeabi-v7a/xxx.so
-libraryjars ../testFoo/src/main/jnisource/libs/armeabi-v7a/xxx.so
-libraryjars ../testFoo/src/main/jnisource/libs/armeabi-v7a/xxx.so
-libraryjars ../testFoo/src/main/jnisource/libs/armeabi-v7a/xxx.so
-libraryjars ../testFoo/src/main/jnisource/libs/armeabi-v7a/xxx.so

-libraryjars ../testFoo/src/main/jnisource/libs/x86/xxx.so
-libraryjars ../testFoo/src/main/jnisource/libs/x86/xxx.so
-libraryjars ../testFoo/src/main/jnisource/libs/x86/xxx.so
-libraryjars ../testFoo/src/main/jnisource/libs/x86/xxx.so
-libraryjars ../testFoo/src/main/jnisource/libs/x86/xxx.so
###--------------- Begin: jni类不能混淆 ---------------###

Could anyone tell me why, i am already mad.....thanks very much.

aloisdg
  • 22,270
  • 6
  • 85
  • 105
WilliamChik
  • 141
  • 2
  • 7
  • Can you please post your proguard rules file? looks like you are missing something there – Aram Tchekrekjian Mar 13 '17 at 09:14
  • @AramTchekrekjian my proguard rules file is so long. **.so files** should keep or not? – WilliamChik Mar 13 '17 at 09:23
  • @AramTchekrekjian i posted my proguard rules file. could you just take a look please? – WilliamChik Mar 13 '17 at 09:29
  • @AramTchekrekjian i have some .so files in my app, is it caused by these .so files? – WilliamChik Mar 13 '17 at 09:39
  • the .so files are native library files related to one or more of your references. So you should keep them. Can you add these rules in your proguard file: `-keepattributes Signature` `-keepnames class org.ietf.jgss.** { *; }` `-dontwarn org.w3c.dom.**` `-dontwarn org.joda.time.**` `-dontwarn org.ietf.jgss.**` I am not totally sure this will solve your problem, i found a kind-of similar issue that involves these proguard rules: http://stackoverflow.com/questions/29691905/android-app-crashes-when-proguard-is-enabled – Aram Tchekrekjian Mar 13 '17 at 11:34
  • @AramTchekrekjian i add these rules but it can not help. Thank you any way. – WilliamChik Mar 13 '17 at 14:59

0 Answers0