看我开发干货集中营App(二)~ APP初始化

个人原因,此系列更新已停止,抱歉。

接着上一篇《看我开发干货集中营App(一)~ 开篇》,本篇将开始我们【干货精选】的编码之旅,分为4部分内容: 新建App,签名配置,混淆代码以及依赖开源库。

新建APP

使用Android Studio 2.2 Rc版本新建名为GankEssence项目,建立过程按需填写相关包名即可。

新建成功后修改我们之前的已经设定好的颜色配置并更改APP中文名, 那么相关配置暂时如下:

color.xml

<resources>
<color name="colorPrimary">#009688</color>
<color name="colorPrimaryDark">#00796B</color>
<color name="colorAccent">#8BC34A</color>
</resources>

strings.xml

<resources>
    <string name="app_name">干货精选</string>
    <string name="app_name_en">GankEssence</string>
</resources>

sdk相关

compileSdkVersion 24
buildToolsVersion "24.0.2"
defaultConfig {
    applicationId "com.huchiwei.gankessence"
    minSdkVersion 15
    targetSdkVersion 24
    versionCode 1
    versionName "1.0"
    testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
}

其它暂时保持不变。模拟器运行即可看见Hello World,颜色也跟设定一样。

签名配置

虽然APP离真正发布还很远,按我个人习惯还是把APP必须的东西但基本不会怎么变动的先配置了。

AS上建立签名文件太Easy: 工具栏Build > Generate Sign Apk > create new,然后填写签名相关信息即可。具体也可参考官网说明

创建完后打开Project Structure(windows快捷键ctrl+alt+shift+s),切换到app并填写填写签名信息如下图,, 填写完确定将签名信息写入到app/build.grade中:

签名配置

配置签名后再看看我们的app/build.grade会发现多签名信息:

signingConfigs {
    release {
        keyAlias 'huchiwei'
        keyPassword 'password123'
        storeFile file('E:/我的坚果云/Android开发/签名文件/android.hucw.signkey.jks')
        storePassword 'password123'
    }
}
...
release {
    signingConfig signingConfigs.release
}

此时打开AS右侧Gradle面板执行下assembleRelease任务,如果正常的话,在app的build/outputs/apk能够见到已经签名的app-release.apk

开启混淆\压缩

app/build.gradle配置如下:

release {
    minifyEnabled true          // 开启混淆
    shrinkResources true        // 移除无用资源
    zipAlignEnabled true        // 开启压缩
    proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}

proguard-android.txt android默认混淆配置,以包含基本的混淆配置(不明白网上很多配置为什么要在proguard-rules.pro里面覆写其内容),proguard-rules.proapp自定义混淆配置。

proguard-rules.pro配置如下:

-optimizationpasses 5                                                           # 指定代码的压缩级别
-optimizations !code/simplification/arithmetic,!field/*,!class/merging/*        # 混淆时所采用的算法

# 保持内部类
-keepattributes InnerClasses,EnclosingMethod
-dontoptimize
-optimizations optimization_filter

#如果有引用v4包可以添加下面这行
-keep class android.support.v4.** { *; }
-keep public class * extends android.support.v4.**
-keep public class * extends android.app.Fragment

#如果引用了v4或者v7包,可以忽略警告
-dontwarn android.support.**

# 保持哪些类不被混淆
-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

#保持自定义组件不被混淆
-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*(...);
}

因为暂时未依赖第三方库,所以混淆配置比较少,这样做有一个好处:越少依赖越早开启测试混淆,越不容易出现问题。即使出现问题也能很快定位问题,否则依赖N多包到准备发包时才开启混淆测试,那就有得哭了。而且尽管现在仅依赖了appcompat-v7的包,但发布打包测试依然一堆错误警告,虽然没有中断打包,却让人很不爽,直到看到这里还有这里加入以下代码后才解决:

# 保持内部类
-keepattributes InnerClasses,EnclosingMethod
-dontoptimize
-optimizations optimization_filter

ok,签名、混淆配置搞定。

多渠道打包

其实在这个刚开始阶段就配置这个多渠道打包,实在有点早。不过因为这个东西其实也不太难,而且考虑到本系列文章是由浅到深,所以就干脆提前来讲讲好了。

多渠道打包百度随便一搜,N多文章介绍,这里选几篇有代表性,大家可以看看:

同样地,我也到友盟申请个App统计应用,按照SDK文档配置下。

manifest.xml

<meta-data
    android:name="UMENG_CHANNEL"
    android:value="${UMENG_CHANNEL_VALUE}" />

在app的build.gradle设置produceFlavors

// 友盟多渠道打包
productFlavors {
    wandoujia {}
    _360 {}
    baidu {}
    xiaomi {}
    tencent {}
    taobao {}
}

productFlavors.all { flavor ->
    flavor.manifestPlaceholders = [UMENG_CHANNEL_VALUE: name]
}

然后格式化名称输出apk

def releaseTime() {
    return new Date().format("yyyy-MM-dd", TimeZone.getTimeZone("UTC"))
}

android {
    defaultConfig {
        // dex突破65535的限制
        multiDexEnabled true
        // 默认是umeng的渠道
        manifestPlaceholders = [UMENG_CHANNEL_VALUE: "umeng"]
    }
    
    buildTypes {
        release {
            applicationVariants.all { variant ->
                variant.outputs.each { output ->
                    def outputFile = output.outputFile
                    if (outputFile != null && outputFile.name.endsWith('.apk')) {
                        // 输出apk名称为gankessence_v1.0_2015-01-15_wandoujia.apk
                        def fileName = "gankessence_v${defaultConfig.versionName}_${releaseTime()}_${variant.productFlavors[0].name}.apk"
                        output.outputFile = new File(outputFile.parent, fileName)
                    }
                }
            }
        }
    }
}

最后再一次执行assembleRelease,如果正常的话应该可以看到如下结果:

多渠道打包

支持库、第三方库依赖

关于官方支持库的依赖版本,按照Google建议是使用最新版本,当然这个大家按照自己需求即可。

根据干货精选的原型设计图,基本可以看出来需要使用那些支持库:

// Android Support Libraries
compile 'com.android.support:appcompat-v7:24.2.0'
compile 'com.android.support:cardview-v7:24.2.0'
compile 'com.android.support:design:24.2.0'
compile 'com.android.support:recyclerview-v7:24.2.0'
compile 'com.android.support:support-v4:24.2.0'

网络请求:Retrofit2,不二之选。然后使用Gson作为转换器,okhttp3作为网络请求客户端,再加上网络日志拦截器,简直完美! 依赖包看下面:

// Retrofit && OKHttp && GSON
compile 'com.squareup.retrofit2:retrofit:2.1.0'
compile 'com.squareup.retrofit2:converter-gson:2.1.0'
compile 'com.squareup.retrofit2:adapter-rxjava:2.1.0'
compile 'com.squareup.okhttp3:okhttp:3.4.1'
compile 'com.squareup.okhttp3:logging-interceptor:3.4.1'
compile 'org.immutables:gson:2.2.12'

异步操作:RxJava,简洁、链式调用,与Retrofit2无缝结合,然后自己再简单封装一层,妈妈就再也不用担心异步网络请求响应啦:

compile 'io.reactivex.rxjava2:rxjava:2.0.0-RC2'

图片缓存框架:比较纠结,原来是想使用Android-Universal-Image-Loader,但后来看到已经停止维护了,所以没用它,然后通过别人文章再三对比,还有这里后使用的是:[Glide](https://github.com/bumptech/glide),相关使用配置可以先看看官方wiki,当然后面我也会介绍对它如何封装使用的,依赖如下:

// 要依赖com.android.support:support-v4哦
compile 'com.github.bumptech.glide:glide:3.7.0'

数据绑定:Butterknife, 我想这个应该没有疑问, 依赖需要多配置,我直接拷贝官网说明过来:

//Configure your project-level build.gradle to include the 'android-apt' plugin:
buildscript {
  repositories {
    mavenCentral()
   }
  dependencies {
    classpath 'com.neenbedankt.gradle.plugins:android-apt:1.8'
  }
}

//Then, apply the 'android-apt' plugin in your module-level build.gradle and add the Butter Knife dependencies:

apply plugin: 'android-apt'

android {
  ...
}

dependencies {
  compile 'com.jakewharton:butterknife:8.4.0'
  apt 'com.jakewharton:butterknife-compiler:8.4.0'
}

最后加上混淆配置:

# Glide框架混淆设置
-keep public class * implements com.bumptech.glide.module.GlideModule
-keep public enum com.bumptech.glide.load.resource.bitmap.ImageHeaderParser$** {
  **[] $VALUES;
  public *;
}
#-keepresourcexmlelements manifest/application/meta-data@value=GlideModule

# Butter Knife 混淆
-keep public class * implements butterknife.Unbinder { public <init>(...); }
-keep class butterknife.*
-keepclasseswithmembernames class * { @butterknife.* <methods>; }
-keepclasseswithmembernames class * { @butterknife.* <fields>; }

# Retrofit2
-dontnote retrofit2.Platform
-dontnote retrofit2.Platform$IOS$MainThreadExecutor
-dontwarn retrofit2.Platform$Java8
-keepattributes Signature
-keepattributes Exceptions

# Gson
-keepattributes Signature
-keepattributes *Annotation*
-keep class sun.misc.Unsafe { *; }
-keep class com.google.gson.stream.** { *; }
-keep class com.google.gson.examples.android.model.** { *; }

-dontwarn org.immutables.gson.**
-keep class org.immutables.gson.** { *;}

# OkHttp
-keepattributes Signature
-keepattributes *Annotation*
-keep class okhttp3.** { *; }
-keep interface okhttp3.** { *; }
-dontwarn okhttp3.**
-dontwarn okio.**

# RxJava
-keep class rx.schedulers.Schedulers {
    public static <methods>;
}
-keep class rx.schedulers.ImmediateScheduler {
    public <methods>;
}
-keep class rx.schedulers.TestScheduler {
    public <methods>;
}
-keep class rx.schedulers.Schedulers {
    public static ** test();
}
-dontwarn rx.internal.util.unsafe.**
-keep class rx.internal.util.unsafe.** { *;}

如果打包出现如'can't find referenced class'类似混淆错误,其实找不到引用的这个类是第三方包里面的,而且很多时候我们只需要打乱自己的代码就行了,第三方包的代码就是否要打乱就不要管了。我们可以使用
-dontwarn com.xx.bbb.**
-keep class com.xx.bbb.** { ;}
参数来保持第三方库中的类而不乱,-dontwarn和-keep 结合使用,意思是保持com.xx.bbb.xx这个包里面的所有类和所有方法而不混淆,接着还叫ProGuard不要警告找不到com.xx.bbb.
*这个包里面的类的相关引用。

OK,重要的就是这些了,基本都是使用最新版本,其它的如Logger是否需要看个人需要。

到此,我们的APP暂时完成了一部分的配置了,再次运行打包,应该不会因为依赖了包导致有什么异常。

Goog Luck!!

预告,下一篇《看我开发干货集中营App(三)~ 基本封装》将介绍如何将上面依赖的库封装使用哦,满满的都是福利哦。

系列文章:

  1. 看我开发干货集中营App(一)~ 开篇
  2. 看我开发干货集中营App(二)~ APP初始化

欢迎关注,转载请注明原文链接

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,294评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,493评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,790评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,595评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,718评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,906评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,053评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,797评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,250评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,570评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,711评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,388评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,018评论 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,796评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,023评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,461评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,595评论 2 350

推荐阅读更多精彩内容