Android馬甲包開(kāi)發(fā)之路

何為馬甲包?

馬甲包是指與原APP包除了包名藐吮,簽名溺拱、包名稱(chēng)圖標(biāo)等給用戶(hù)加以區(qū)分的東西不一樣之外,其他功能基本不變的APP包谣辞。



最近公司需要一套代碼迫摔,生成多個(gè)馬甲包的需求,為了方便代碼維護(hù)和打包方便泥从,主要通過(guò)gradle工具配置不同包名句占,不同簽名,不同資源名躯嫉,不同馬甲包部分差異化纱烘,不同兼容包名不同的差異化兼容需求(如:微信分享跟包名有關(guān))。用Terminal命令或者Tasks一鍵生成多個(gè)包祈餐。

下面就描述下只需配置擂啥,就可以一鍵生成多個(gè)馬甲包和主包(當(dāng)成一個(gè)馬甲包就行)?


????1.簽名文件路徑配置(只有一個(gè)簽名文件帆阳,不同馬甲包對(duì)應(yīng)不同別名就行)
????2.主module的build.gradle中一些相關(guān)配置
????3.AndroidManifest.xml中的一些相關(guān)配置(${}的使用)
????4.獲取MetaData值和getPackageName()獲取包名
????5.如何打包


1.簽名文件路徑配置(只有一個(gè)簽名文件哺壶,不同馬甲包對(duì)應(yīng)不同別名就行)

這一步主要是每個(gè)人電腦簽名文件位置不一樣,我把地址配置放在這里。放在其他地方也行变骡。
signingStoreFilePath = "E:/raythinks/keystore.jks" //font color=red>簽名文件目錄

ext {
    signingStoreFilePath = "E:/raythinks/keystore.jks" //font color=red>簽名文件目錄
}
buildscript {
    repositories {
        jcenter()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:2.3.3'
        classpath 'com.neenbedankt.gradle.plugins:android-apt:1.8'
    }
}

allprojects {
    repositories {
        jcenter()
    }
}

task clean(type: Delete) {
    delete rootProject.buildDir
}



2.主module的build.gradle中一些相關(guān)配置

(1)applicationId 馬甲包包名配置离赫。如: applicationId "com.raythins.herri.xinshou"http://(如:新手版)
(2)signingConfigs 簽名文件配置 。每個(gè)馬甲包簽名文件或者別名不一樣塌碌。


簽名文件配置.png

(3)productFlavors 配置要生成的馬甲包渊胸。 如:majia_xinshou_vivo 新手版;majia_shop_vivo 商城版
(4)manifestPlaceholders 資源配置(如:馬甲包app的logo台妆、名稱(chēng)翎猛、微信appkey等。)


manifestPlaceholders資源配置(.png

(5) signingConfig 配置馬甲包編譯時(shí)使用的簽名接剩。如: signingConfig signingConfigs.shop 使用商城版簽名

詳情見(jiàn)gradle.gradle代碼
apply plugin: 'com.android.application'
android {
    compileSdkVersion 23
    buildToolsVersion '25.0.2'
    defaultConfig {
        applicationId "com.raythins.herri"http://默認(rèn)包名
        minSdkVersion 15   //最小版本號(hào)
        targetSdkVersion 23  
        versionCode 110//版本code   
        versionName "1.1.0"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
        ndk { abiFilters   'armeabi-v7a' 切厘,'armeabi'}//指定ndk,目前市場(chǎng)上手機(jī)基本覆蓋兼容這兩種

        multiDexEnabled true//MultiDex的配置

        manifestPlaceholders = [
                JPUSH_PKGNAME    : "com.raythins.herri",//極光包名
                JPUSH_APPKEY  :  "sdfewds234324343243243243sdfdsd",//極光appkey
                JPUSH_CHANNEL    : "developer-default", //暫時(shí)填寫(xiě)默認(rèn)值即可.
                BAIDU_APPKEY  :  "SDFDSFDFDSFRT72LSDFDSFDFDS",//
                TENCENT_ID  :  "1323123134341" , //騰訊id(應(yīng)用寶)
                TENCENT_APPKEY  :  "SDFDSFDS9089SDF" , //騰訊APPKEY
                LAUNCHER_ICON  :  "@drawable/ic_launcher" ,  //logo圖片路徑
                WCHAT_APPID : "wxsdf4eds323r32432432432",// 微信appid
                WCHAT_TEMPLETE_ID : "sdfdsfsdfsdf233243243243243243243243243",//微信SDK  訂閱id
                WCHAT_SECRET : "dfdfdsffdsfdsfdsfdsfds3432432432432432432432",//微信SDK secret
        ]
    }
    //debug和release版本的簽名配置
    signingConfigs {
        xinshou{//新手版簽名文件信息
            storeFile file(rootProject.ext.signingStoreFilePath)
            storePassword "123456"
            keyAlias "別名1"
            keyPassword "123456"
            v1SigningEnabled true
            v2SigningEnabled true
        }
        shop{//商城版簽名文件信息
            storeFile file(rootProject.ext.signingStoreFilePath)
            storePassword "123456"
            keyAlias "別名2"
            keyPassword "123456"
            v1SigningEnabled true
            v2SigningEnabled true
        }

    }
    buildTypes {
        release {
            minifyEnabled true
            //Zipalign優(yōu)化
            zipAlignEnabled true
            // 移除無(wú)用的resource文件
            shrinkResources false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }

    productFlavors {
        majia_xinshou_vivo{//新手版)
            applicationId "com.raythins.herri.xinshou"http://(如:新手版)
            manifestPlaceholders = [
                 JPUSH_PKGNAME    : "com.raythins.herri.xinshou",//極光包名
                JPUSH_APPKEY  :  "sdfewds234324343243243243sdfdsd",//極光appkey
                JPUSH_CHANNEL    : "developer-default", //暫時(shí)填寫(xiě)默認(rèn)值即可.
                BAIDU_APPKEY  :  "SDFDSFDFDSFRT72LSDFDSFDFDS",//
                TENCENT_ID  :  "1323123134341" , //騰訊id(應(yīng)用寶)
                TENCENT_APPKEY  :  "SDFDSFDS9089SDF" , //騰訊APPKEY
                LAUNCHER_ICON  :  "@drawable/ic_launcher_xinshou" ,  //logo圖片路徑
                APP_NAME :  "Demo新手版" ,  //app名稱(chēng)
                WCHAT_APPID : "wxsdf4eds323r32432432432",// 微信appid
                WCHAT_TEMPLETE_ID : "sdfdsfsdfsdf233243243243243243243243243",//微信SDK  訂閱id
                WCHAT_SECRET : "dfdfdsffdsfdsfdsfdsfds3432432432432432432432",//微信SDK secret
            ]
            signingConfig signingConfigs.xinshou//簽名信息
        }
     majia_shop_vivo{//商城版)
            applicationId "com.raythins.herri.shop"http://(如:商城版)
            manifestPlaceholders = [
                 JPUSH_PKGNAME    : "com.raythins.herri.xinshou",//極光包名
                JPUSH_APPKEY  :  "sdfewds234324343243243243sdfdsd",//極光appkey
                JPUSH_CHANNEL    : "developer-default", //暫時(shí)填寫(xiě)默認(rèn)值即可.
                BAIDU_APPKEY  :  "SDFDSFDFDSFRT72LSDFDSFDFDS",//
                TENCENT_ID  :  "1323123134341" , //騰訊id(應(yīng)用寶)
                TENCENT_APPKEY  :  "SDFDSFDS9089SDF" , //騰訊APPKEY
                LAUNCHER_ICON  :  "@drawable/ic_launcher_shop" ,  //logo圖片路徑
                APP_NAME :  "Demo商城版",  //app名稱(chēng)
                WCHAT_APPID : "wxsdf4eds323r32432432432",// 微信appid
                WCHAT_TEMPLETE_ID : "sdfdsfsdfsdf233243243243243243243243243",//微信SDK  訂閱id
                WCHAT_SECRET : "dfdfdsffdsfdsfdsfdsfds3432432432432432432432",//微信SDK secret
            ]
            signingConfig signingConfigs.shop//簽名信息
     }

    }

    sourceSets {
        main {
            jniLibs.srcDirs = ['libs']
        }
    }
}
repositories {
    mavenCentral()
    repositories {
        flatDir {
            dirs 'libs'
        }
    }
}
dependencies {
    compile fileTree(include: ['*.jar'], dir: 'libs')
    androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
        exclude group: 'com.android.support', module: 'support-annotations'
    })

    //自帶的類(lèi)庫(kù)v4以及v7
    compile 'com.android.support:appcompat-v7:23.0.1'
}
3.AndroidManifest.xml中的一些相關(guān)配置(${}的使用)

主要是通過(guò)${}將主module的build.gradle中一些相關(guān)配置映射到manifest中懊缺。打包自動(dòng)填充進(jìn)去疫稿。如:${applicationId}、${LAUNCHER_ICON}鹃两、${APP_NAME}遗座、${BAIDU_APPKEY}等。

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    package="com.raythinks.herri">

    <!-- Required -->
    <permission
        android:name="${applicationId}.permission.JPUSH_MESSAGE"
        android:protectionLevel="signature" />

    <uses-permission android:name="android.permission.CAMERA" />
    <application
        android:name=".base.CustomApplication"
        android:allowBackup="true"
        android:icon="${LAUNCHER_ICON}"
        android:label="${APP_NAME}"
        android:largeHeap="true"
        android:supportsRtl="true"
        android:theme="@style/AppTheme"
        tools:replace="android:allowBackup">
   
       <!-- //百度appkey -->
        <meta-data
            android:name="com.baidu.lbsapi.API_KEY"
            android:value="${BAIDU_APPKEY}" />
     <!-- //微信appid-->
        <meta-data
            android:name="WCHAT_APPID"
            android:value="${WCHAT_APPID}" />
      <!-- //微信secret-->
        <meta-data
            android:name="WCHAT_SECRET"
            android:value="${WCHAT_SECRET}" />
         <!-- //微信secret-->
        <meta-data
            android:name="WCHAT_TEMPLETE_ID"
            android:value="${WCHAT_TEMPLETE_ID}" />
        <!-- //騰訊ID-->
        <meta-data
            android:name="TENCENT_ID"
            android:value="${TENCENT_ID}" />
       <!-- //騰訊appkey-->
        <meta-data
            android:name="TENCENT_APPKEY"
            android:value="${TENCENT_APPKEY}" />
        <!-- 友盟集成 -->
        <meta-data
            android:name="UMENG_APPKEY"
            android:value="586481eb82b63522b30005a9" />
        <meta-data
            android:name="UMENG_CHANNEL"
            android:value="${UMENG_CHANNEL_VALUE}" />
              <!-- 目前這個(gè)渠道統(tǒng)計(jì)功能的報(bào)表還未開(kāi)放俊扳。 -->
        <meta-data
            android:name="JPUSH_CHANNEL"
            android:value="${JPUSH_CHANNEL}" />
        <!-- Required. AppKey copied from Portal -->

        <meta-data
            android:name="JPUSH_APPKEY"
            android:value="${JPUSH_APPKEY}" />
        <!-- ShareSDK -->
        <activity
            android:name="com.mob.tools.MobUIShell"
            android:configChanges="keyboardHidden|orientation|screenSize"
            android:screenOrientation="portrait"
            android:theme="@android:style/Theme.Translucent.NoTitleBar"
            android:windowSoftInputMode="stateHidden|adjustResize">

            <!-- QQ和QQ空間分享 QQ登錄的回調(diào)必須要配置的 -->
            <intent-filter>
                <data android:scheme="tencent${TENCENT_ID}" />

                <action android:name="android.intent.action.VIEW" />

                <category android:name="android.intent.category.BROWSABLE" />
                <category android:name="android.intent.category.DEFAULT" />
            </intent-filter>

            <!-- 新浪微博客戶(hù)端分享回調(diào)必須配置 -->
            <intent-filter>
                <action android:name="com.sina.weibo.sdk.action.ACTION_SDK_REQ_ACTIVITY" />

                <category android:name="android.intent.category.DEFAULT" />
            </intent-filter>
        </activity>
       
        <!-- 微信分享回調(diào) -->
        <activity
            android:name="${applicationId}.wxapi.WXEntryActivity"
            android:configChanges="keyboardHidden|orientation|screenSize"
            android:exported="true"
            android:screenOrientation="portrait"
            android:theme="@android:style/Theme.Translucent.NoTitleBar" />
        <activity
            android:name=".ui.activity.MainActivity"
            android:configChanges="orientation|keyboardHidden"
            android:launchMode="singleTask"
            android:screenOrientation="portrait" />
      

        <!-- 極光推送 Required SDK 核心功能 -->
        <!-- 可配置android:process參數(shù)將PushService放在其他進(jìn)程中 -->
        <service
            android:name="cn.jpush.android.service.PushService"
            android:enabled="true"
            android:exported="false">
            <intent-filter>
                <action android:name="cn.jpush.android.intent.REGISTER" />
                <action android:name="cn.jpush.android.intent.REPORT" />
                <action android:name="cn.jpush.android.intent.PushService" />
                <action android:name="cn.jpush.android.intent.PUSH_TIME" />
            </intent-filter>
        </service>

        <!-- since 1.8.0 option 可選項(xiàng)途蒋。用于同一設(shè)備中不同應(yīng)用的JPush服務(wù)相互拉起的功能。 -->
        <!-- 若不啟用該功能可刪除該組件馋记,將不拉起其他應(yīng)用也不能被其他應(yīng)用拉起 -->
        <service
            android:name="cn.jpush.android.service.DaemonService"
            android:enabled="true"
            android:exported="true">
            <intent-filter>
                <action android:name="cn.jpush.android.intent.DaemonService" />

                <category android:name="${applicationId}" />
            </intent-filter>
        </service>

        <!-- Required SDK核心功能 -->
        <service
            android:name="cn.jpush.android.service.DownloadService"
            android:enabled="true"
            android:exported="false" />

        <!-- Required SDK核心功能 -->
        <receiver
            android:name="cn.jpush.android.service.PushReceiver"
            android:enabled="true">
            <intent-filter android:priority="1000">
                <action android:name="cn.jpush.android.intent.NOTIFICATION_RECEIVED_PROXY" />

                <category android:name="${applicationId}" />
            </intent-filter>
            <intent-filter>
                <action android:name="android.intent.action.USER_PRESENT" />
                <action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
            </intent-filter>
            <!-- Optional -->
            <intent-filter>
                <action android:name="android.intent.action.PACKAGE_ADDED" />
                <action android:name="android.intent.action.PACKAGE_REMOVED" />

                <data android:scheme="package" />
            </intent-filter>
        </receiver>

        <!-- Required SDK核心功能 -->
        <receiver android:name="cn.jpush.android.service.AlarmReceiver" />

        <!-- Required since 3.0.7 -->
        <!-- 新的tag/alias接口結(jié)果返回需要開(kāi)發(fā)者配置一個(gè)自定的廣播 -->
        <!-- 該廣播需要繼承JPush提供的JPushMessageReceiver類(lèi), 并如下新增一個(gè) Intent-Filter -->
        <receiver
            android:name=".receiver.MyJPushMessageReceiver"
            android:enabled="true">
            <intent-filter>
                <action android:name="cn.jpush.android.intent.RECEIVE_MESSAGE" />

                <category android:name="${applicationId}" />
            </intent-filter>
        </receiver>

        <!-- 極光Required SDK核心功能 -->
        <activity
            android:name="cn.jpush.android.ui.PushActivity"
            android:configChanges="orientation|keyboardHidden"
            android:exported="false"
            android:theme="@android:style/Theme.NoTitleBar">
            <intent-filter>
                <action android:name="cn.jpush.android.ui.PushActivity" />

                <category android:name="android.intent.category.DEFAULT" />
                <category android:name="${applicationId}" />
            </intent-filter>
        </activity>

        <!-- SDK核心功能 -->
        <activity
            android:name="cn.jpush.android.ui.PopWinActivity"
            android:configChanges="orientation|keyboardHidden"
            android:exported="false"
            android:theme="@style/MyDialogStyle">
            <intent-filter>
                <category android:name="android.intent.category.DEFAULT" />
                <category android:name="${applicationId}" />
            </intent-filter>
        </activity>

        <receiver
            android:name="com.tendcloud.appcpa.ReferralReceiver"
            android:exported="true"
            tools:ignore="ExportedReceiver">
            <intent-filter>
                <action android:name="com.android.vending.INSTALL_REFERRER" />
            </intent-filter>
        </receiver>
    </application>
</manifest>
4.獲取MetaData值和getPackageName()獲取包名
  public static <T> T getMetaData(Context context, String name) {
        try {
            final ApplicationInfo ai = context.getPackageManager().getApplicationInfo(context.getPackageName(),
                    PackageManager.GET_META_DATA);

            if (ai.metaData != null) {
                return (T) ai.metaData.get(name);
            }
        }
        catch (Exception e) {
            e.printStackTrace();
        }

        return null;
    }

如:AppUtil.getMetaData(activity, "WCHAT_APPID")

5.如何打包

通過(guò)命令方式号坡、Tasks、Generate signed APK打包生成多個(gè)馬甲包梯醒。

(1)Terminal命令方式

gradle assembleRelease    // 構(gòu)建productFlavors下所有Variant Release版本
gradle assembleDebug      // 構(gòu)建productFlavors下所有Variant Debug版本
gradle assemble[productFlavors.name]          // 構(gòu)建productFlavors下name的Variant Release和Debug版本
gradle assemble[productFlavors.name]Relase    // 構(gòu)建productFlavors下name的Variant Releaseg版本
gradle assemble[productFlavors.name]Debug     // 構(gòu)建productFlavors下name的Variant Debug版本
image.png
(2)Tasks或者Generate signed APK方式
如微信回調(diào)類(lèi)配置
image.png
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末宽堆,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子冤馏,更是在濱河造成了極大的恐慌日麸,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,539評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件逮光,死亡現(xiàn)場(chǎng)離奇詭異代箭,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)涕刚,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,594評(píng)論 3 396
  • 文/潘曉璐 我一進(jìn)店門(mén)嗡综,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人杜漠,你說(shuō)我怎么就攤上這事极景〔炀唬” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,871評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵盼樟,是天一觀(guān)的道長(zhǎng)氢卡。 經(jīng)常有香客問(wèn)我,道長(zhǎng)晨缴,這世上最難降的妖魔是什么译秦? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,963評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮击碗,結(jié)果婚禮上筑悴,老公的妹妹穿的比我還像新娘。我一直安慰自己稍途,他們只是感情好阁吝,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,984評(píng)論 6 393
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著械拍,像睡著了一般突勇。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上殊者,一...
    開(kāi)封第一講書(shū)人閱讀 51,763評(píng)論 1 307
  • 那天与境,我揣著相機(jī)與錄音,去河邊找鬼猖吴。 笑死,一個(gè)胖子當(dāng)著我的面吹牛挥转,可吹牛的內(nèi)容都是我干的海蔽。 我是一名探鬼主播,決...
    沈念sama閱讀 40,468評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼绑谣,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼党窜!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起借宵,我...
    開(kāi)封第一講書(shū)人閱讀 39,357評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤幌衣,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后壤玫,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體豁护,經(jīng)...
    沈念sama閱讀 45,850評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,002評(píng)論 3 338
  • 正文 我和宋清朗相戀三年欲间,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了楚里。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,144評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡猎贴,死狀恐怖班缎,靈堂內(nèi)的尸體忽然破棺而出蝴光,到底是詐尸還是另有隱情,我是刑警寧澤达址,帶...
    沈念sama閱讀 35,823評(píng)論 5 346
  • 正文 年R本政府宣布蔑祟,位于F島的核電站,受9級(jí)特大地震影響沉唠,放射性物質(zhì)發(fā)生泄漏疆虚。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,483評(píng)論 3 331
  • 文/蒙蒙 一右冻、第九天 我趴在偏房一處隱蔽的房頂上張望装蓬。 院中可真熱鬧,春花似錦纱扭、人聲如沸牍帚。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,026評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)暗赶。三九已至,卻和暖如春肃叶,著一層夾襖步出監(jiān)牢的瞬間蹂随,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,150評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工因惭, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留岳锁,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,415評(píng)論 3 373
  • 正文 我出身青樓蹦魔,卻偏偏與公主長(zhǎng)得像激率,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子勿决,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,092評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容

  • 1.介紹 如果你正在查閱build.gradle文件的所有可選項(xiàng)乒躺,請(qǐng)點(diǎn)擊這里進(jìn)行查閱:DSL參考 1.1新構(gòu)建系統(tǒng)...
    Chuckiefan閱讀 12,138評(píng)論 8 72
  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn)低缩,斷路器嘉冒,智...
    卡卡羅2017閱讀 134,672評(píng)論 18 139
  • 最近在項(xiàng)目中遇到需要實(shí)現(xiàn) Apk 多渠道、定制化打包咆繁, Google 讳推、百度查找了一些資料,成功實(shí)現(xiàn)了上述功能么介,在...
    看一季殘花落幕閱讀 2,494評(píng)論 1 8
  • 版權(quán)聲明:本文為博主原創(chuàng)文章娜遵,未經(jīng)博主允許不得轉(zhuǎn)載。 最近在項(xiàng)目中遇到需要實(shí)現(xiàn) Apk 多渠道壤短、定制化打包设拟, Go...
    牙鍋?zhàn)?/span>閱讀 6,034評(píng)論 3 33
  • 這兩天鋪天蓋地的王寶強(qiáng)離婚的消息纳胧,熱度甚至都超過(guò)了奧運(yùn)會(huì)镰吆。無(wú)限感慨明星效應(yīng),或者說(shuō)離婚出軌這種事更貼近我們的生活...
    qiao毛線(xiàn)閱讀 166評(píng)論 0 0