androidreact native 混淆方 法混淆吗

代码混淆部分
gradle的配置
minifyEnabled true
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt'
proguard-rules.pro混淆配置
###-----------基本配置-不能被混淆的------------
-keep public class * extends android.app.Activity
-keep public class * extends android.app.Fragment
-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
#support.v4/v7包不混淆
-keep class android.support.** { *; }
-keep class android.support.v4.** { *; }
-keep public class * extends android.support.v4.**
-keep interface android.support.v4.app.** { *; }
-keep class android.support.v7.** { *; }
-keep public class * extends android.support.v7.**
-keep interface android.support.v7.app.** { *; }
-dontwarn android.support.**
# 忽略警告
#保持注解继承类不混淆
-keep class * extends java.lang.annotation.Annotation {*;}
#保持Serializable实现类不被混淆
-keepnames class * implements java.io.Serializable
#保持Serializable不被混淆并且enum 类也不被混淆
-keepclassmembers class * implements java.io.Serializable {
static final long serialVersionUID;
private static final java.io.ObjectStreamField[] serialPersistentF
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);
#自定义组件不被混淆
-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*(...);
#不混淆资源类
-keepclassmembers class **.R$* {
public static &fields&;
###-----------第三方jar包library混淆配置------------
#ormlite混淆配置
#-libraryjars libs/ormlite-android-5.0.jar
#-libraryjars libs/ormlite-core-5.0.jar
-dontwarn com.j256.ormlite.**
-keep class com.j256.ormlite.** { *;}
-keep class com.envy15.cherry.base.orm.** { *;}
#json-lib混淆配置
#-libraryjars libs/json-lib-2.4-jdk15.jar
-dontwarn net.sf.json.**
-keep class net.sf.json.** { *;}
#json-lib关联包
#-libraryjars libs/commons-beanutils-1.8.3.jar
-dontwarn mons.**
-keep class mons.** { *;}
#universalimageloader图片加载框架不混淆
-keep class com.nostra13.universalimageloader.** { *; }
-dontwarn com.nostra13.universalimageloader.**
#Gson相关的不混淆配置
-keepattributes Signature
-keepattributes *Annotation*
-keep class com.google.gson.** { *; }
-dontwarn com.google.gson.**
-keep class com.envy15.cherry.fragment.crossover.model.** { *; }
-dontwarn com.envy15.cherry.fragment.crossover.model.**
-keep class com.envy15.cherry.fragment.discover.model.** { *; }
-dontwarn com.envy15.cherry.fragment.discover.model.**
-keep class com.envy15.cherry.fragment.local.model.** { *; }
-dontwarn com.envy15.cherry.fragment.local.model.**
-keep class com.envy15.cherry.fragment.setting.model.** { *; }
-dontwarn com.envy15.cherry.fragment.setting.model.**
#prt-lib下拉刷新框架不混淆
-keep class in.srain.cube.views.ptr.** { *; }
-dontwarn in.srain.cube.views.ptr.**
#PullToRefreshLibrary下拉刷新框架不混淆
-keep class com.handmark.pulltorefresh.library.** { *; }
-dontwarn com.handmark.pulltorefresh.library.**
http://blog.csdn.net/zuiwuyuan/article/details/
http://blog.csdn.net/fengyuzhengfan/article/details/
http://blog.isming.me//use-proguard/
//Android%E8%BF%9B%E9%98%B6%E4%B9%8BProGuard%E4%BB%A3%E7%A0%81%E6%B7%B7%E6%B7%86/
# 关于混淆的思考:
/question/
# 扩展:资源文件混淆
http://blog.csdn.net/Fancy_xty/article/details/
#代码混淆规则
# 指定代码的压缩级别
#-optimizationpasses 5
# 是否使用大小写混合
#-dontusemixedcaseclassnames
# 是否混淆第三方jar
#-dontskipnonpubliclibraryclasses
# 混淆时是否做预校验
#-dontpreverify
# 混淆时是否记录日志
# 混淆时所采用的算法
#-optimizations !code/simplification/arithmetic,!field/*,!class/merging/*
#-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 com.android.vending.licensing.ILicensingService
# 保持哪些类不被混淆
#-keepclasseswithmembernames class * {
# 保持 native 方法不被混淆
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);
#-keepclassmembers enum * {
# 保持枚举 enum 类不被混淆
public static **[] values();
public static ** valueOf(java.lang.String);
#-keep class * implements android.os.Parcelable {
# 保持 Parcelable 不被混淆
public static final android.os.Parcelable$Creator *;
#-keep class MyC
# 保持自己定义的类不被混淆
打包发布部分
S1.使用默认方式打包签名APK
AndroidStudio选择Build =& Generate Signed APK
总体步骤流程如下:
详细操作步骤:
S2. 多渠道打包APK
productFlavors
&&& productFlavors {
&&&&&&& aVer {
&&&&&&&&&&& resValue("string","strKey","myKey")
&&&&&&&&&&& applicationId "com.simple.pkg.debug"
&&&&&&& bVer {
&&&&&&&& &&&applicationId "com.simple.pkg.beta"
&&&&&&& cVer {
&&&&&&&&&&& applicationId "com.simple.pkg.res"
signingConfigs
&&& signingConfigs {
&&&&&&& release {
&&&&&&&&&&& storeFile file('E:/XXX/app.jks') // 签名证书文件
&&&&&&&&&&& storePassword 'you password' // 证书密码
&&&&&&&&&&& keyAlias 'test'
&&&&&&&&&&& keyPassword 'you password '
buildTypes
&&& buildTypes {
&&&&&&& mbeta {
&&&&&&&&&&& signingConfig android.signingConfigs.release
&&&&&&&&&&& minifyEnabled false
S3.gradle打包自动化-定制apk文件名
gradle属性及变量定义的几种方式
方式1(for gradle)
工程目录下gradle.properties定义属性:appName = MyAppName
App目录下build.gradle读取自定义属性:project.appName
方式2(for java)
App目录下build.gradle定义属性:
&&& productFlavors {
&&&&&&& aVer {
&&&&&&&&&&& // gradle定义全局变量方式2-代码使用
&&&&&&&&&&& buildConfigField "int", "varInt", "0"
&&&&&&&&&&& buildConfigField "String", "varString", '"abc"'
Java代码读取属性:BuildConfig.varIBuildConfig.varS
方式3(for java)
App目录下build.gradle定义属性:
&&& productFlavors {
&&&&&&& aVer {
&&&&&&&&&&& resValue("string","strKey","myKey")
ava代码读取属性:context.getString(R.string.strKey);
App目录下build.gradle定义属性:
def flavorName = "undefine"
def indexFlavor(String str) {
&&& return str.substring(0,str.length())
定制apk文件名
自定义生成APK文件名
applicationVariants.all { variant -&
variant.outputs.each { output -&
def outputFile = output.outputFile
&&&&&&&& // appName + version + createTime + svnVersion + flavor + buildType
&&&&&&&& def fileName = "fileName.apk"
&&&&&&&& output.outputFile = new File(outputFile.parent, fileName)
获取相关属性
AppName:自定义方式或getName()
Version:版本, defaultConfig.versionName
CreateTime:创建时间,new Date().format("yyyy-MM-dd", TimeZone.getTimeZone("UTC"))
SvnVersion :SVN提交版本号
Flavor :编译渠道版本
BuildType:debug/beta/release版本
def fileName =
"${project.appName}_v${defaultConfig.versionName}_${releaseTime()}_"
&&&&&&&&&&&&&&&&&&&&&&&&&&&
"s${getSvnRevision()}_${indexFlavor(productFlavors.name)}_${getName()}.apk"
参考问题:
build.gradle多渠道打包完整示例
// app/build.gradle文件
import org.tmatesoft.svn.core.wc.* // for svn version
apply plugin: 'com.android.application'
def releaseTime() {
return new Date().format("yyyy-MM-dd", TimeZone.getTimeZone("UTC"))
def indexFlavor(String str) {
return str.substring(0,str.length())
def getSvnRevision() { // for svn
ISVNOptions options = SVNWCUtil.createDefaultOptions(true);
SVNClientManager clientManager = SVNClientManager.newInstance(options);
SVNStatusClient statusClient = clientManager.getStatusClient();
SVNStatus status = statusClient.doStatus(projectDir, false);
SVNRevision revision = status.getCommittedRevision();
return revision.getNumber();
signingConfigs {
compileSdkVersion 25
buildToolsVersion "25.0.2"
defaultConfig {
applicationId "com.simple.res"
minSdkVersion 15
targetSdkVersion 21
versionCode 1
versionName "1.0"
multiDexEnabled true
// dex突破65535的限制
productFlavors {
// gradle定义全局变量方式2-代码使用
buildConfigField "int", "varInt", "0"
buildConfigField "String", "varString", '"abc"'
resValue("string","strKey","myKey")
applicationId "com.simple.res.debug"
applicationId "com.simple.res.beta"
signingConfigs {
storeFile file('E:/XXX/App.jks')
storePassword 'you password'
keyAlias 'TEST'
keyPassword 'you password'
buildTypes {
minifyEnabled false
signingConfig android.signingConfigs.release
minifyEnabled false
signingConfig android.signingConfigs.release
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
minifyEnabled true
shrinkResources true
// 指定APK文件名
applicationVariants.all { variant -&
variant.outputs.each { output -&
def outputFile = output.outputFile
// appName + version + createTime + svnVersion + flavor + buildType
def fileName = "${project.appName}_v${defaultConfig.versionName}_${releaseTime()}_" + "s${getSvnRevision()}_${indexFlavor(productFlavors.name)}_${getName()}.apk"
output.outputFile = new File(outputFile.parent, fileName)
// project/build.gradle文件
// 添加classpath group: 'org.tmatesoft.svnkit', name: 'svnkit', version: '1.8.11'支持获取// SVN提交版本号
buildscript {
repositories {
dependencies {
classpath 'com.android.tools.build:gradle:2.2.3'
classpath group: 'org.tmatesoft.svnkit', name: 'svnkit', version: '1.8.11'
// project/build.gradle文件
appName = NewApp
* 崩溃日志记录
http://blog.csdn.net/u/artile/details/
http://blog.csdn.net/wangyuexing_blog/article/details/
阅读(...) 评论()Android混淆总结篇(一)
混淆总结篇
混淆的概念:将Android项目进行打包之时,可以将项目里的包名、类名、变量名进行更改,使得代码不容易泄露,类似于对其apk中的文件.
混淆的作用:
1.增加Apk反编译之后代码泄露的困难性 2.生成的apk体积会缩小
什么是混淆?
Android SDK 本身就提供混淆的功能,将混淆开关进行开启后,开发者需要做的是对Android Studio工程项目中的proguard-rules.pro文件进行混淆白名单的配置.
那么什么是混淆白名单呢?其实就是指定一些包名、类名、变量等不可以被混淆。假设没指定白名单就进行混淆打包,而某某类的类名被混淆了(假设变成了a),那么可能其他引用或使用该类的类就找不到该类,说不定应用就会因此崩溃或是导致相应的功能无法使用.
那么所谓的混淆也就是配置混淆白名单,那么下面看看混淆之后的apk的内部结构.可以看到红圈圈出来的部分都是进行混淆的,而有部分是没有进行混淆的,比如黑圈圈出来的属性动画兼容库nineoldandroids,其包名类名就没有变成abc这样的代替符
上面我是用apk逆向助手对apk进行反编译,市场上的反编译工具有很多种,可以自行Google搜索。vcD4NCjxwPjxzdHJvbmc+srmz5Dwvc3Ryb25nPjwvcD4NCjxibG9ja3F1b3RlPg0KCTxwPrG+xqrOxNXCvMfCvLXEu+zP/daqyra149b30qq7+dPaQW5kcm9pZCBTdHVkaW+/qreiuaS+36GjPC9wPg0KPC9ibG9ja3F1b3RlPg0KPGgyIGlkPQ=="ⅱ开始混淆">Ⅱ.开始混淆
1.开启混淆开关
混淆的开关在项目/app/build.gradle文件里,看下面的截图,将minifyEnabled设置为true就是开启混淆,关于下面的配置代码可以直接写在build.gradle文件的android节点下
代码混淆一般是在上线前的apk打包才会去配置混淆开启,要是忘记配置的代码,那怎么办呢?直接进去Project Structrue,然后根据下面截图所标识的进行设置,如此这般,只要打release包就是开启混淆进行打包的.
2.设置混淆白名单
基于Android Studio创建的项目里有一文件名称为&proguard-rules.pro&的文件,路径是&项目/app/proguard-rules.pro&,没经过编辑之前,里面只有一些注释的代码,如下图
那么设置的混淆白名单又该怎么写呢?Google搜索的话会有很多博客上的模板可以复制进行套用.如下图,那么就可以进行参考,下面第三部分将常用的混淆指令和对应的注释都列举出来,基本常用的都有,有疏漏的那就自行搜索下.
Ⅲ.实际混淆指令
在应用中,大多数的混淆指令是已经确定的了,比如下面的基本指令部分,基本不用修改的。而其他的混淆指令,比如第三方的SDK/框架的混淆指令一般在其官方文档都可以找到,所以相对来说还是比较方便的,下面将这几天归类的混淆指令总结下.
基本指令:
# 设置混淆的压缩比率 0 ~ 7
-optimizationpasses 5
# 混淆后类名都为小写
-dontusemixedcaseclassnames
# 指定不去忽略非公共库的类
-dontskipnonpubliclibraryclasses
#不做预校验的操作
-dontpreverify
# 混淆时不记录日志
# 混淆采用的算法.
-optimizations !code/simplification/arithmetic,!field/*,!class/merging/*
#保留代码行号,方便异常信息的追踪
-keepattributes SourceFile,LineNumberTable
#dump文件列出apk包内所有class的内部结构
-dump class_files.txt
#seeds.txt文件列出未混淆的类和成员
-printseeds seeds.txt
#usage.txt文件列出从apk中删除的代码
-printusage unused.txt
#mapping文件列出混淆前后的映射
-printmapping mapping.txt
避免混淆Android基本,下面是兼容性比较高的规则:
-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 com.android.vending.licensing.ILicensingService
#不提示V4包下错误警告
-dontwarn android.support.v4.**
#保持下面的V4兼容包的类不被混淆
-keep class android.support.v4.**{*;}
避免混淆所有native的方法,涉及到C、C++
-keepclasseswithmembernames class * {
避免混淆自定义控件类的get/set方法和构造函数
-keep public class * extends android.view.View{
*** get*();
void set*(***);
public (android.content.Context);
public (android.content.Context,
android.util.AttributeSet);
public (android.content.Context,
android.util.AttributeSet,int);
避免混淆枚举类
-keepclassmembers enum * {
public static **[] values();
public static ** valueOf(java.lang.String);
避免混淆序列化类
#不混淆Parcelable和它的实现子类,还有Creator成员变量
-keep class * implements android.os.Parcelable {
public static final android.os.Parcelable$Creator *;
#不混淆Serializable和它的实现子类、其成员变量
-keepclassmembers class * implements java.io.Serializable {
static final long serialVersionUID;
private static final java.io.ObjectStreamField[] serialPersistentF
private void writeObject(java.io.ObjectOutputStream);
private void readObject(java.io.ObjectInputStream);
java.lang.Object writeReplace();
java.lang.Object readResolve();
避免混淆JSON类的构造函数
#使用GSON、fastjson等框架时,所写的JSON对象类不混淆,否则无法将JSON解析成对应的对象
-keepclassmembers class * {
public (org.json.JSONObject);
避免混淆第三方SDK
# ==================环信混淆start=================
-keep class com.hyphenate.** {*;}
com.hyphenate.**
# ==================环信end======================
# ==================bugly start==================
-dontwarn com.tencent.bugly.**
-keep public interface com.tencent.**
-keep public class com.tencent.** {*;}
-keep public class com.tencent.bugly.**{*;}
# ==================bugly end====================
# ===============百度定位 start====================
-keep .gdi.** { *; }
-keep public class com.baidu.** {*;}
-keep public class com.mobclick.** {*;}
-dontwarn com.baidu.mapapi.utils.*
-dontwarn com.api.b.*
-dontwarn com.api.map.*
# ===============百度定位 end======================
//备注:其他的第三方包的混淆指令可以到其官方文档去拷贝
避免混淆第三方框架
# ==================picasso框架 start===============
-keep class com.parse.*{ *; }
-dontwarn com.parse.**
-dontwarn com.squareup.picasso.**
-keepclasseswithmembernames class * {
# ==================picasso end====================
# ==================EventBus start=================
-keep class org.greenrobot.** {*;}
-keep class de.greenrobot.** {*;}
-keepclassmembers class ** {
public void onEvent*(**);
void onEvent*(**);
# ==================EventBus end===================
# ==================okhttp start===================
-dontwarn com.squareup.okhttp.**
-keep class com.squareup.okhttp.** { *;}
-dontwarn okio.**
-keep class okio.**{*;}
-keep interface okio.**{*;}
# ==================okhttp end=====================
//备注:其它框架的混淆指令可以到其官方文档去拷贝
其它混淆指令
#避免混淆属性动画兼容库
-dontwarn com.nineoldandroids.*
-keep class com.nineoldandroids.** { *;}
#不混淆泛型
-keepattributes Signature
#避免混淆注解类
-dontwarn android.annotation
-keepattributes *Annotation*
#避免混淆内部类
-keepattributes InnerClasses
#避免混淆实体类,修改成你对应的包名
-keep class com.wyk.test.bean.** { *; }
-keep class com.wyk.test.event.** { *; }
-keep public class com.wyk.test.utils.eventbus.** { *;}
#避免混淆Rxjava/RxAndroid
-dontwarn sun.misc.**
-keepclassmembers class rx.internal.util.unsafe.*ArrayQueue*Field* {
long producerI
long consumerI
-keepclassmembers class rx.internal.util.unsafe.BaseLinkedQueueProducerNodeRef {
rx.internal.util.atomic.LinkedQueueNode producerN
-keepclassmembers class rx.internal.util.unsafe.BaseLinkedQueueConsumerNodeRef {
rx.internal.util.atomic.LinkedQueueNode consumerN
#避免混淆js相关的接口
-keepattributes *scriptInterface*
-keep class com.wyk.test.js.** { *; }
Ⅳ.混淆配置注意点
1.假设当配置 &-libraryjars libs/jpush-android-2.1.6.jar& 对jar包进行混淆白名单化,如果gradle报错的话,可以考虑注释掉(格式:-libraryjars [jar包名])这样的配置信息.采用下面的配置信息进行替换
-dontwarn cn.jpush.**
-keep class cn.jpush.** { *; }
2.下面是对属性动画兼容库的混淆白名单配置信息,刚开始觉得只是保持com.nineoldandroids包下的类不被混淆,后来经过反编译混淆后的apk包,发现效果是&不混淆该class com.nineoldandroids包下的类、子包和子包的类,也不混淆其中类的成员变量.
-keep class com.nineoldandroids.** { *;}
1.混淆套用模板
个人觉得下面链接的博文就写得非常好,所以可以进行参考.
参考博文:
2.资源混淆
Proguard混淆只是针对代码进行混淆,解压之后的apk包还是能看到项目的资源文件和其名称,比如布局、logo图片等等.这时可以选择对资源文件进行混淆,下面两个链接是腾讯推出的资源混淆工具相关的博文,可以参考.
资源混淆工具相关的博文
为了使得apk更加不容易被,混淆之后还可以对apk进行加固,现今市面上的加固技术有很多种,有360加固、爱加密加固、梆梆加固等等,可以自行选择,加固技术就相当于给apk包加多一个壳,相应的体积也会增大,大概增大1M~2M左右,需要的话可以自行搜索,加固还是挺简单的.13055人阅读
Android(5)
android使用打包过程中proguard混淆后, 会导致一些错误
1. 写在视图xml中的onClick响应出错. 因为写在xml中的onClick是通过反射调用的, proguard认为它们没有在代码中被调用过, 所以将它们从代码中除掉或改名了. 解决方法:
在proguard.cfg中添加以下代码, 就可以防止被配在视图xml中的onClick方法被proguard优化掉
-keepclassmembers class * extends android.app.Activity {
public void *(android.view.View);
2. jni反调java方法
这些类或方法同样可能会被proguard认为没有调用过而被除掉, 或都被改名. 这些方法最好统一写在一个类中, 然后这个类不作优化, 或是找出所有jni调用过的类与方法, 在proguard.cfg中配置, 不对它们作优化
3. 其它反射调用的java类与方法
使用反射时一定要注意proguard可能会认为那些方法未被调用过, 会在代码优化过程中将它们改名或除去. 在使用反射的地方一定要在proguard.cfg中配置, 不优化反射调用过的类和方法
最后在proguard优化过后会产生一些文件
dump.txt – 描述.apk文件中所有类文件间的内部结构
mapping.txt – 列出了原始的类,方法和字段名与混淆后代码间的映射。这个文件很重要,当你从release版本中收到一个bug报告时,可以用它来翻译被混淆的代码。
seeds.txt – 列出了未被混淆的类和成员
usage.txt – 列出了从.apk中删除的代码
要注意分析mapping.txt与usage.txt看xml视图中写的onClick响应函数, jni调用到的java类与方法, 反射调用过的类与方法是否被混淆或重命名
-keep class com.badlogic.gdx.backends.android.**{ *;}
像这样的只是不混淆:这个包下的类(不包括子包里的东西),用到一个第三文的类就要把这个类所在的包,像上面加上
还要注意的是android-support-v4.jar这个包问题,这里加上了对这个jar包的处理
第三方jar的混淆,
-optimizationpasses 5
-dontusemixedcaseclassnames&
-dontskipnonpubliclibraryclasses&
-dontpreverify&
-optimizations !code/simplification/arithmetic,!field/*,!class/merging/*&
-keep public class * extends android.app.Activity&&&&&&&&&&&&&&&&&&&&&&&&&&// 继承activity,application,service,broadcastReceiver,contentprovider....不进行混淆
-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 com.android.vending.licensing.ILicensingService
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&// 这里处理第三方的jar包,第三方JAR包处理开始
-libraryjars /libs/android-support-v4.jar
-libraryjars /libs/gdx-backend-android.jar
-libraryjars /libs/gdx.jar
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&// 这里不对第三方的jar包的提出WARN&&&&
-dontwarn com.badlogic.**
-dontwarn android.support.v4.**
-dontwarn android.support.v4.view.**
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&// 这里对第三方jar包的类不进行混淆
-keep class com.badlogic.gdx.backends.android.**{ *;}
-keep class com.badlogic.gdx.**{ *;}
-keep class com.badlogic.gdx.graphics.g2d.**{ *;}
-keep class com.badlogic.gdx.graphics.**{ *;}
-keep class android.support.v4.view.**{ *;}
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&// 这里第三方JAR包处理结束
-keepclasseswithmembernames class * {&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&// natvie&方法不混淆
-keepclasseswithmembers class * {&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&//&对于所有类,有这个构造函数不进行混淆,主要是为了在layout中的,自定义的view
&&&&public (android.content.Context, android.util.AttributeSet);&
-keepclasseswithmembers class * {&
&&&&public (android.content.Context, android.util.AttributeSet, int);&
-keepclassmembers class * extends android.app.Activity {&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&// 这个主要是在layout&中写的onclick方法android:onclick=&onClick&,不进行混淆
&&&public void *(android.view.View);&
-keepclassmembers enum * {&
&&&&public static **[] values();&
&&&&public static ** valueOf(java.lang.String);&
-keep class * implements android.os.Parcelable {&
&&public static final android.os.Parcelable$Creator *;&
1-----------------------------------------------引用--------------------------------------------------------
如果工程引入了Android-support-v4的jar类库,那么在工程打包混淆时,就会出现报错提示。例如提示你:You may need to specify additional library jars (using '-libraryjars')。
这里先给出解决方案,稍后我们再来解释如何处理类似情况:
在proguard.cfg里的后面,添加如下内容:
&1.-libraryjars /android-support-v4.jar&
&2.-dontwarn android.support.v4.**&
&3.-keep class android.support.v4.** { *; }&
&4.-keep public class * extends android.support.v4.**&
&5.-keep public class * extends android.app.Fragment&
然后你再打包看看,应该可以正常生成apk安装包了。
打包出错:
&&类1 can't find referenced class 类2& 字面上的意思就是类1找不到类2的引用;它会建议你:&You may need to specify additional library jars (using '-libraryjars').&;
需要使用-libraryjars加上项目中使用到的第三方库就OK了。
例如:-libraryjars /android-support-v4.jar
注意:这里引用方式是当前工程的根目录(也可以配置其他目录),也就是说,你要把第三方jar放到当前目录下,否则就会警告说找不到jar文件!
例如: can't find superclass or interface android.os.Parcelable$ClassLoaderCreator,碰到这样的情况,可以使用-dontwarn com.xx.yy.**,不对错误提出警告。
注意:使用这个方式的话,要确保自己没有用到这个库里面的类!否则就会抛ClassNotFoundException!
在工程中确实用到了该类,采用上面方式还是不行。这个时候就要再增加一项:-keep class com.xx.yy.** { *;},让当前类不混淆。
对于引用第三方包的情况,可以采用下面方式避免打包出错:
-libraryjars /aaa.jar
-dontwarn com.xx.yy.**
-keep class com.xx.yy.** { *;}
最后打包成功,还要在机子上跑跑,看看有没有问题。
本篇文章来源于 Linux公社网站()&&原文链接:
-----------------------------------------------------------------------------------2--------------------------------------------------------------------
proguard.cfg配置
稍微深入想一下混淆后的结果,你就会发现,如果一些提供给外部的类、方法、变量等名字被改变了,那么程序本身的功能就无法正常实现。那么Proguard如何知道哪些东西是可以改名,而哪些是不能改变的呢?
这个是靠proguard.cfg文件来进行配置的。Android工程中默认自动生成的proguard.cfg已经针对Android的一般情况进行了配置,我们打开这个配置文件。内容大概如下:
&1.-optimizationpasses 5&
2.-dontusemixedcaseclassnames&
3.-dontskipnonpubliclibraryclasses&
4.-dontpreverify&
5.-verbose&
6.-optimizations !code/simplification/arithmetic,!field/*,!class/merging/*&
8.-keep public class * extends android.app.Activity&
9.-keep public class * extends android.app.Application&
10.-keep public class * extends android.app.Service&
11.-keep public class * extends android.content.BroadcastReceiver&
12.-keep public class * extends android.content.ContentProvider&
13.-keep public class * extends android.app.backup.BackupAgentHelper&
14.-keep public class * extends android.preference.Preference&
15.-keep public class com.android.vending.licensing.ILicensingService&
17.-keepclasseswithmembernames class * {&
21.-keepclasseswithmembers class * {&
22.&&&&public (android.content.Context, android.util.AttributeSet);&
25.-keepclasseswithmembers class * {&
26.&&&&public (android.content.Context, android.util.AttributeSet, int);&
29.-keepclassmembers class * extends android.app.Activity {&
30.&&&public void *(android.view.View);&
33.-keepclassmembers enum * {&
34.&&&&public static **[] values();&
35.&&&&public static ** valueOf(java.lang.String);&
38.-keep class * implements android.os.Parcelable {&
39.&&public static final android.os.Parcelable$Creator *;&
它主要保留了继承自Activity、Application、Service、BroadcastReceiver、ContentProvider、 BackupAgentHelper、Preference和ILicensingService的子类。因为这些子类,都是可能被外部调用的。
另外,它还保留了含有native方法的类、构造函数从xml构造的类(一般为View的子类)、枚举类型中的values和valueOf静态方法、继承Parcelable的跨进程数据类。
在实际的一个工程项目中,可能Google自动生成的配置不能胜任我们的混淆工作。所以,我们往往需要自己编写一些ProGuard配置。这方面的资料在官网的Manual -& Usage里有详细说明,大家可以研究一下。
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:123904次
积分:1086
积分:1086
排名:千里之外
原创:11篇
评论:17条
(1)(2)(1)(3)(2)(1)(1)(1)(2)(1)(2)

我要回帖

更多关于 react native 混淆 的文章

 

随机推荐