【我的Android进阶之旅】Android 混淆文件资源分类整理
之前将所有的混淆都配置在一个
proguard-rules.pro
这个Android Studio新建项目时自动生成的文件里面,而随着项目功能迭代越来越多,代码量越来越多,引用的第二方库、第三方库都越来越多,导致proguard-rules.pro
越来越臃肿,而且随着开发人员增多导致proguard-rules.pro
文件里面的配置越来越混乱。
一、拆分proguard-rules.pro
混淆文件
因此今天我将
proguard-rules.pro
混淆文件进行拆分整理,大概拆分为以下4个文件:第三方混淆文件、第二份混淆文件、系统默认混淆文件、module单独混淆文件 。
如上图所示,四个文件分别为 'proguard-system-common.pro'
, 'proguard-module.pro'
, 'proguard-second-party.pro'
, 'proguard-third-party.pro'
二、配置混淆时候 proguardFiles 所引用的混淆文件
原来的混淆文件配置代码如下:
//混淆文件 proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro',
改为下面的将四个混淆文件都加入到混淆配置文件列表中
//混淆文件 proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-system-common.pro', 'proguard-module.pro', 'proguard-second-party.pro', 'proguard-third-party.pro'
如下图所示:
三、四个拆分的混淆文件具体代码
proguard-system-common.pro
proguard-system-common.pro 是Android系统通用的一些混淆配置,配置的内容大致如下:
# 指定代码的压缩级别 -optimizationpasses 5 -ignorewarnings # 抑制警告 -verbose # 混淆时是否记录日志(混淆后生产映射文件 map 类名 -> 转化后类名的映射 -dontpreverify # 不预校验 -dontoptimize #不优化输入的类文件 -dontshrink #该选项 表示 不启用压缩 混淆时是否做预校验(可去掉加快混淆速度) -dontusemixedcaseclassnames # 混淆时不会产生形形色色的类名 是否使用大小写混合 -dontskipnonpubliclibraryclasses #不跳过(混淆) jars中的 非public classes 默认选项 -keepattributes Exceptions # 解决AGPBI警告 -keepattributes Exceptions,InnerClasses,... -keepattributes EnclosingMethod -keepattributes SourceFile,LineNumberTable #运行抛出异常时保留代码行号 #过滤泛型 -keepattributes Signature #过滤注解 -keepattributes *Annotation* -keep class * extends java.lang.annotation.Annotation { *; } -keep interface * extends java.lang.annotation.Annotation { *; } #继承自activity,application,service,broadcastReceiver,contentprovider....不进行混淆 -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.support.v4.** -keep public class com.android.vending.licensing.ILicensingService -keep public class * extends android.support.multidex.MultiDexApplication -keep public class * extends android.view.View -keep class android.support.** {*;} # 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*(); } # 所有View的子类及其子类的get、set方法都不进行混淆 -keep public class * extends android.view.View { #保持自定义控件指定规则的方法不被混淆 *** get*(); void set*(***); public <init>(android.content.Context); public <init>(android.content.Context, android.util.AttributeSet); public <init>(android.content.Context, android.util.AttributeSet, int); } #保持指定规则的方法不被混淆(Android layout 布局文件中为控件配置的onClick方法不能混淆) -keepclassmembers class * extends android.app.Activity { public void *(android.view.View); } # 对于带有回调函数onXXEvent的,不能被混淆 -keepclassmembers class * { void *(*Event); } #保持R文件不被混淆,否则,你的反射是获取不到资源id的 -keep class **.R$* { *; } # 不混淆R类里及其所有内部static类中的所有static变量字段,$是用来分割内嵌类与其母体的标志 -keep public class **.R$*{ public static final int *; } -keepclassmembers class **.R$* { public static <fields>; } #过滤js -keepattributes *JavascriptInterface* #保护WebView对HTML页面的API不被混淆 -keep class **.Webview2JsInterface { *; } -keepclassmembers class * extends android.webkit.WebViewClient { #如果你的项目中用到了webview的复杂操作 ,最好加入 public void *(android.webkit.WebView,java.lang.String,android.graphics.Bitmap); public boolean *(android.webkit.WebView,java.lang.String); } -keepclassmembers class * extends android.webkit.WebChromeClient { #如果你的项目中用到了webview的复杂操作 ,最好加入 public void *(android.webkit.WebView,java.lang.String); } #对WebView的简单说明下:经过实战检验,做腾讯QQ登录,如果引用他们提供的jar,若不加防止WebChromeClient混淆的代码,oauth认证无法回调, #反编译基代码后可看到他们有用到WebChromeClient,加入此代码即可。 -keepclasseswithmembers class * { public <init>(android.content.Context, android.util.AttributeSet); #保持自定义控件类不被混淆,指定格式的构造方法不去混淆 } -keepclasseswithmembers class * { public <init>(android.content.Context, android.util.AttributeSet, int); } # 保持枚举 enum 类不被混淆 -keepclassmembers enum * { public static **[] values(); public static ** valueOf(java.lang.String); } # 保持 native 方法不被混淆 -keepclasseswithmembernames class * { native <methods>; } # 保持 Parcelable 不被混淆 -keep class * implements android.os.Parcelable { public static final android.os.Parcelable$Creator *; } #-keep public class * { # public protected *; #} #需要序列化和反序列化的类不能被混淆(注:Java反射用到的类也不能被混淆) -keep public class * implements java.io.Serializable { public *; } #不混淆Serializable接口的子类中指定的某些成员变量和方法 -keepclassmembers class * implements java.io.Serializable { static final long serialVersionUID; private static final java.io.ObjectStreamField[] serialPersistentFields; !static !transient <fields>; private void writeObject(java.io.ObjectOutputStream); private void readObject(java.io.ObjectInputStream); java.lang.Object writeReplace(); java.lang.Object readResolve(); } -keepclassmembers class * { public <init> (org.json.JSONObject); } -keep class org.** {*;} -keep class com.android.**{*;} #-assumenosideeffects class_specification #v7 不混淆 -keep class android.support.v7.** { *; } -keep interface android.support.v7.** { *; } -dontwarn android.support.v7.** # support-design -dontwarn android.support.design.** -keep class android.support.design.** { *; } -keep interface android.support.design.** { *; } -keep public class android.support.design.R$* { *; } # support-v7-appcompat -dontwarn android.support.v7.** -keep class android.support.v7.** { *; } -keep class android.support.v7.internal.** { *; } -keep interface android.support.v7.internal.** { *; } -keep public class android.support.v7.widget.** { *; } -keep public class android.support.v7.internal.widget.** { *; } -keep public class android.support.v7.internal.view.menu.** { *; } # support-v4 -dontwarn android.support.v4.** -keep class android.support.v4.app.** { *; } -keep interface android.support.v4.app.** { *; } -keep class android.support.v4.** { *; } -keep public class * extends android.support.v4.view.ActionProvider { public <init>(android.content.Context); } # support-v7-cardview.pro # http://stackoverflow.com/questions/29679177/cardview-shadow-not-appearing-in-lollipop-after-obfuscate-with-proguard/29698051 -keep class android.support.v7.widget.RoundRectDrawable { *; } -dontwarn android.net.http.** -keep class org.apache.http.** { *;}
proguard-third-party.pro
proguard-third-party.pro 是通用的第三方AAR库的混淆配置
# >>>>>>>>>>>>>>>>>>>>>>>> Facebook Fresco Start >>>>>>>>>>>>>>>>>>>>>>>> # Keep our interfaces so they can be used by other ProGuard rules. # See http://sourceforge.net/p/proguard/bugs/466/ -keep,allowobfuscation @interface com.facebook.common.internal.DoNotStrip # Do not strip any method/class that is annotated with @DoNotStrip -keep @com.facebook.common.internal.DoNotStrip class * -keepclassmembers class * { @com.facebook.common.internal.DoNotStrip *; } # Keep native methods -keepclassmembers class * { native <methods>; } -dontwarn okio.** -dontwarn javax.annotation.** -dontwarn com.android.volley.toolbox.** -dontwarn com.squareup.okhttp.** -dontwarn okhttp3.** # >>>>>>>>>>>>>>>>>>>>>>>> Facebook Fresco End >>>>>>>>>>>>>>>>>>>>>>>> # >>>>>>>>>>>>>>>>>>>>>>>> Glide Start >>>>>>>>>>>>>>>>>>>>>>>> # Glide specific rules # # https://github.com/bumptech/glide -dontwarn com.bumptech.** -keep public class * implements com.bumptech.glide.module.GlideModule -keep public enum com.bumptech.glide.load.resource.bitmap.ImageHeaderParser$** { **[] $VALUES; public *; } # >>>>>>>>>>>>>>>>>>>>>>>> Glide End >>>>>>>>>>>>>>>>>>>>>>>> # >>>>>>>>>>>>>>>>>>>>>>>> Picasso Start >>>>>>>>>>>>>>>>>>>>>>>> ## Square Picasso specific rules ## ## https://square.github.io/picasso/ ## -dontwarn com.squareup.okhttp.** # >>>>>>>>>>>>>>>>>>>>>>>> Picasso End >>>>>>>>>>>>>>>>>>>>>>>> # >>>>>>>>>>>>>>>>>>>>>>>> Jackson Start >>>>>>>>>>>>>>>>>>>>>>>> -dontwarn com.fasterxml.jackson.databind.** -keep class com.fasterxml.jackson.core.** {*;} -keep interface com.fasterxml.jackson.core { *; } -keep public class * extends com.fasterxml.jackson.core.** -keep class com.fasterxml.jackson.databind.introspect.VisibilityChecker$Std.<clinit> -keep class com.fasterxml.jackson.databind.ObjectMapper.<clinit> -keep class com.fasterxml.jackson.databind.** {*;} -keep class com.fasterxml.jackson.databind.introspect.VisibilityChecker$*{*;} -keep interface com.fasterxml.jackson.databind { *; } -keep public class * extends com.fasterxml.jackson.databind.** # >>>>>>>>>>>>>>>>>>>>>>>> Jackson End >>>>>>>>>>>>>>>>>>>>>>>> # >>>>>>>>>>>>>>>>>>>>>>>> GSON Start >>>>>>>>>>>>>>>>>>>>>>>> ## GSON 2.2.4 specific rules ## # 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* -keepattributes EnclosingMethod # Gson specific classes -keep class sun.misc.Unsafe { *; } -keep class com.google.gson.** { *; } -keep class com.google.gson.stream.** { *; } -keep class com.google.**{*;} -keep class com.google.gson.examples.android.model.** { *; } # >>>>>>>>>>>>>>>>>>>>>>>> GSON End >>>>>>>>>>>>>>>>>>>>>>>> # >>>>>>>>>>>>>>>>>>>>>>>> zxing Start >>>>>>>>>>>>>>>>>>>>>>>> -dontwarn com.google.zxing.** -dontwarn com.google.zxing.client.android.** -keep class com.google.zxing.**{*;} # >>>>>>>>>>>>>>>>>>>>>>>> zxing End >>>>>>>>>>>>>>>>>>>>>>>> # >>>>>>>>>>>>>>>>>>>>>>>> EventBus 2 Start >>>>>>>>>>>>>>>>>>>>>>>> ## GreenRobot EventBus specific rules ## # https://github.com/greenrobot/EventBus/blob/master/HOWTO.md#proguard-configuration -keepclassmembers class ** { public void onEvent*(***); } # Only required if you use AsyncExecutor -keepclassmembers class * extends de.greenrobot.event.util.ThrowableFailureEvent { public <init>(java.lang.Throwable); } # Don't warn for missing support classes -dontwarn de.greenrobot.event.util.*$Support -dontwarn de.greenrobot.event.util.*$SupportManagerFragment # >>>>>>>>>>>>>>>>>>>>>>>> EventBus 2 End >>>>>>>>>>>>>>>>>>>>>>>> # >>>>>>>>>>>>>>>>>>>>>>>> EventBus 3 Start >>>>>>>>>>>>>>>>>>>>>>>> ## New rules for EventBus 3.0.x ## # http://greenrobot.org/eventbus/documentation/proguard/ -keepattributes *Annotation* -keepclassmembers class ** { @org.greenrobot.eventbus.Subscribe <methods>; } -keep enum org.greenrobot.eventbus.ThreadMode { *; } # Only required if you use AsyncExecutor -keepclassmembers class * extends org.greenrobot.eventbus.util.ThrowableFailureEvent { <init>(java.lang.Throwable); } # >>>>>>>>>>>>>>>>>>>>>>>> EventBus 3 End >>>>>>>>>>>>>>>>>>>>>>>> # >>>>>>>>>>>>>>>>>>>>>>>> Rxjava Start >>>>>>>>>>>>>>>>>>>>>>>> -dontwarn sun.misc.** -dontwarn org.apache.http.** -keep class rx.**. -keepclassmembers class rx.internal.util.unsafe.*ArrayQueue*Field* { long producerIndex; long consumerIndex; } -keepclassmembers class rx.internal.util.unsafe.BaseLinkedQueueProducerNodeRef { rx.internal.util.atomic.LinkedQueueNode producerNode; } -keepclassmembers class rx.internal.util.unsafe.BaseLinkedQueueConsumerNodeRef { rx.internal.util.atomic.LinkedQueueNode consumerNode; } # >>>>>>>>>>>>>>>>>>>>>>>> Rxjava End >>>>>>>>>>>>>>>>>>>>>>>> # >>>>>>>>>>>>>>>>>>>>>>>> OkHttp Start >>>>>>>>>>>>>>>>>>>>>>>> # OkHttp -keepattributes Signature -keepattributes *Annotation* -keep class com.squareup.okhttp.** { *; } -keep interface com.squareup.okhttp.** { *; } -dontwarn com.squareup.okhttp.** # OkHttp3 -dontwarn okhttp3.** -keepattributes Signature -keepattributes *Annotation* -keep class okhttp3.** { *; } -keep interface okhttp3.** { *; } # Okio -keep class sun.misc.Unsafe { *; } -dontwarn java.nio.file.* -dontwarn org.codehaus.mojo.animal_sniffer.IgnoreJRERequirement -dontwarn okio.** -keep class okio.** {*;} # >>>>>>>>>>>>>>>>>>>>>>>> OkHttp End >>>>>>>>>>>>>>>>>>>>>>>> # >>>>>>>>>>>>>>>>>>>>>>>> Retrofit2 Start >>>>>>>>>>>>>>>>>>>>>>>> # Platform calls Class.forName on types which do not exist on Android to determine platform. -dontnote retrofit2.Platform # Platform used when running on RoboVM on iOS. Will not be used at runtime. -dontnote retrofit2.Platform$IOS$MainThreadExecutor # Platform used when running on Java 8 VMs. Will not be used at runtime. -dontwarn retrofit2.Platform$Java8 # Retain generic type information for use by reflection by converters and adapters. -keepattributes Signature # Retain declared checked exceptions for use by a Proxy instance. -keepattributes Exceptions -dontwarn retrofit2.adapter.** # Retrofit 2.X -dontwarn retrofit2.** -keep class retrofit2.** { *; } -keepattributes Signature -keepattributes Exceptions -keepclasseswithmembers class * { @retrofit2.http.* <methods>; } # >>>>>>>>>>>>>>>>>>>>>>>> Retrofit2 End >>>>>>>>>>>>>>>>>>>>>>>> # >>>>>>>>>>>>>>>>>>>>>>>> Ormlite Start >>>>>>>>>>>>>>>>>>>>>>>> -keep class com.j256.ormlite.** {*;} # >>>>>>>>>>>>>>>>>>>>>>>> Ormlite End >>>>>>>>>>>>>>>>>>>>>>>> # >>>>>>>>>>>>>>>>>>>>>>>> Butterknife Start >>>>>>>>>>>>>>>>>>>>>>>> # ButterKnife 7 -keep class butterknife.** { *; } -dontwarn butterknife.internal.** -keep class **$$ViewBinder { *; } -keep class **$$ViewInjector { *; } -keepnames class * { @butterknife.InjectView *;} -keepclasseswithmembernames class * { @butterknife.* <fields>; } -keepclasseswithmembernames class * { @butterknife.* <methods>; } # >>>>>>>>>>>>>>>>>>>>>>>> Butterknife End >>>>>>>>>>>>>>>>>>>>>>>> # >>>>>>>>>>>>>>>>>>>>>>>> 热修复框架rocoofix Start >>>>>>>>>>>>>>>>>>>>>>>> -keep class com.dodola.rocoofix.** {*;} -keep class com.lody.legend.** {*;} # >>>>>>>>>>>>>>>>>>>>>>>> 热修复框架rocoofix End >>>>>>>>>>>>>>>>>>>>>>>> # >>>>>>>>>>>>>>>>>>>>>>>> 数据库加密不混淆 Start >>>>>>>>>>>>>>>>>>>>>>>> -dontwarn com.google.common.** -keep class net.sqlcipher.** {*;} -keep class net.sqlcipher.database.** {*;} # >>>>>>>>>>>>>>>>>>>>>>>> 数据库加密不混淆 End >>>>>>>>>>>>>>>>>>>>>>>> # >>>>>>>>>>>>>>>>>>>>>>>> 七牛 Start >>>>>>>>>>>>>>>>>>>>>>>> -keep class com.qiniu.** {*;} -dontwarn com.qiniu.** # >>>>>>>>>>>>>>>>>>>>>>>> 七牛 End >>>>>>>>>>>>>>>>>>>>>>>> # >>>>>>>>>>>>>>>>>>>>>>>> UMeng大数据分析sdk混淆配置 Start >>>>>>>>>>>>>>>>>>>>>>>> -keepclassmembers class * { public <init> (org.json.JSONObject); } -dontwarn org.apache.http.** -keep class org.apache.http.** { *;} -keep class com.umeng.analytics.** {*;} -dontwarn com.umeng.analytics.** # >>>>>>>>>>>>>>>>>>>>>>>> UMeng大数据分析sdk混淆配置 End >>>>>>>>>>>>>>>>>>>>>>>> # >>>>>>>>>>>>>>>>>>>>>>>> 高德相关混淆文件 Start >>>>>>>>>>>>>>>>>>>>>>>> -keep class com.amap.api.** {*;} -keep class com.autonavi.** {*;} -keep class com.a.a.** {*;} -keep class com.loc.** {*;} -dontwarn com.amap.api.** -dontwarn com.autonavi.** -dontwarn com.a.a.** -dontwarn com.loc.** # >>>>>>>>>>>>>>>>>>>>>>>> 高德相关混淆文件 End >>>>>>>>>>>>>>>>>>>>>>>> # >>>>>>>>>>>>>>>>>>>>>>>> 百度定位 End >>>>>>>>>>>>>>>>>>>>>>>> -keep class com.baidu.** {*;} -keep class vi.com.** {*;} -dontwarn com.baidu.** # >>>>>>>>>>>>>>>>>>>>>>>> 百度定位 End >>>>>>>>>>>>>>>>>>>>>>>> # >>>>>>>>>>>>>>>>>>>>>>>> pinyin4j Start >>>>>>>>>>>>>>>>>>>>>>>> -dontwarn net.soureceforge.pinyin4j.** -dontwarn demo.** -keep class net.sourceforge.pinyin4j.** { *;} -keep class demo.** { *;} -keep class com.hp.** { *;} # >>>>>>>>>>>>>>>>>>>>>>>> pinyin4j End >>>>>>>>>>>>>>>>>>>>>>>> # >>>>>>>>>>>>>>>>>>>>>>>> httpclient Start >>>>>>>>>>>>>>>>>>>>>>>> -dontwarn android.net.compatibility.** -dontwarn android.net.http.** -dontwarn com.android.internal.http.multipart.** -dontwarn org.apache.commons.** -dontwarn org.apache.http.** -dontwarn org.apache.http.protocol.** -keep class android.net.compatibility.**{*;} -keep class android.net.http.**{*;} -keep class com.android.internal.http.multipart.**{*;} -keep class org.apache.commons.**{*;} -keep class org.apache.org.**{*;} -keep class org.apache.harmony.**{*;} # >>>>>>>>>>>>>>>>>>>>>>>> pinyin4j End >>>>>>>>>>>>>>>>>>>>>>>> -dontwarn net.sf.json.** -keep class net.sf.json.** {*;} # 动画库 -keep class com.nineoldandroids.** {*;}
一个可以快速生成对应第三方库的链接:http://proguard.herokuapp.com/
打开连接:http://proguard.herokuapp.com/
输入第三方库的名字,如下所示:
输入完后,点击Generate按钮,即可自动生成相应的混淆代码,如下所示:
# Created by https://proguard.herokuapp.com/api/ # Retrofit 1.X -keep class com.squareup.okhttp.** { *; } -keep class retrofit.** { *; } -keep interface com.squareup.okhttp.** { *; } -dontwarn com.squareup.okhttp.** -dontwarn okio.** -dontwarn retrofit.** -dontwarn rx.** -keepclasseswithmembers class * { @retrofit.http.* <methods>; } # If in your rest service interface you use methods with Callback argument. -keepattributes Exceptions # If your rest service methods throw custom exceptions, because you've defined an ErrorHandler. -keepattributes Signature # Also you must note that if you are using GSON for conversion from JSON to POJO representation, you must ignore those POJO classes from being obfuscated. # Here include the POJO's that have you have created for mapping JSON response to POJO for example.
proguard-second-party.pro
proguard-second-party.pro 是我们自己开发的一些存在Maven私服的AAR库的混淆配置
# themeLib -keep class com.xxx.theme.**{*;} -dontwarn com.xxx.theme.** -keep class com.xxx.md5.** {*;} -keep class com.xxx.widget.**{*;} -dontwarn com.xxx.widget.** -keep class com.xxx.http.**{*;}
proguard-module.pro
其中 proguard-module.pro 文件是你们自己模块的单独混淆文件,主要配置下你们项目中所引用到的一些网络和数据库的bean,防止json解析的时候出现解析出null的情况
#所有jackson对应实体类不能混淆 -keep class com.netease.cloudmusic.net.bean.** {*;} #数据库实体类 -keep class com.netease.cloudmusic.dao.bean.** {*;}
参考链接:
- http://blog.csdn.net/ouyang_peng/article/details/51277332
- https://github.com/yongjhih/android-proguards
- 一个可以快速生成对应第三方库的链接:http://proguard.herokuapp.com/
作者:欧阳鹏 欢迎转载,与人分享是进步的源泉! 转载请保留原文地址:http://blog.csdn.net/ouyang_peng/article/details/73088090 如果本文对您有所帮助,欢迎您扫码下图所示的支付宝和微信支付二维码对本文进行打赏。

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
警告:不要在 iOS 应用内置浏览器中输入密码
国外知名推特客户端 Twitterriffic 开发者 Craig Hockenberry 在最新的博客文章中警告 iOS 用户,不要在 iOS 应用的内置浏览器中输入敏感信息。根据 Hockenberry 介绍,应用内置浏览器有能力记录用户输入的字符,即使浏览器显示正在使用安全连接登陆。 这意味着恶意开发者可以创建包含内置浏览器的应用,并获取我们使用的用户名和密码。很多应用使用内置浏览器方便用户登陆社交网络,不过这也意味着有很大的 威胁。Hockenberry 表示 iOS 7 和 iOS 8系统中都可以使用应用内置浏览器获取用户名和密码,并且很有可能支持之前的 iOS 系统。他最后指出,这并不是安全问题,应用内置浏览器虽然不是很安全,但能提供更简单的交互体验。 Hockenberry 并没有明确的解决方案,因为需要修改 WebKit 和 UIWebView 核心的代码才能增强安全性。他建议苹果应该使用 OAuth 授权协议保护用户隐私。对于普通用户,Hockenberry 建议不要在非 Safari 的浏览器中输入敏感信息。浏览网页内容很安全,但输入密码就不一定了。 文章转载自 开...
- 下一篇
我应该直接学 Swift,还是 Objective-C?
当我们发布了Swift语言学习课程之后,收到了很多邮件和私信来问自己是否还需要学习C或者Objective-C。此外,人们似乎还在迷惑Swift到底适合iOS开发生态中的哪些部分。通过这篇文章,我希望能扫清你的疑惑并且将你送到正确的学习轨道上。 我应该先学C/Objective-C还是直接学Swift? Swift是一个全新的语言,与Objective-C或C都没有任何关系。我的意思是它们都是编程语言并且遵守一些基础概念和范例,但是你并不需 要在学习其中一个之前先学另一个。即使你是编程新手,你也可以学习苹果发布的官方的Swift文档而无需先学Objective-C。 我正在学习Objective-C,我应该转为学Swift吗? 这要试情况而定。如果你把学习iOS当做一个爱好或者出于好奇心才学,那么转到Swift学习上吧。如果你将从事iOS开发视为职业,那么你要知道 外面至少有100万个应用都是用Objective-C编写的,Swift于2014年才刚刚发布,所以你将来的职业的app开发仍然很有可能使用 Objective-C。所以你需要学习Objective-C来获得一个工作,直到Sw...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- Docker安装Oracle12C,快速搭建Oracle学习环境
- CentOS8编译安装MySQL8.0.19
- CentOS7编译安装Gcc9.2.0,解决mysql等软件编译问题
- CentOS关闭SELinux安全模块
- CentOS6,CentOS7官方镜像安装Oracle11G
- CentOS8安装MyCat,轻松搞定数据库的读写分离、垂直分库、水平分库
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- CentOS7,8上快速安装Gitea,搭建Git服务器
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果
- 设置Eclipse缩进为4个空格,增强代码规范