日本搞逼视频_黄色一级片免费在线观看_色99久久_性明星video另类hd_欧美77_综合在线视频

國(guó)內(nèi)最全I(xiàn)T社區(qū)平臺(tái) 聯(lián)系我們 | 收藏本站
阿里云優(yōu)惠2
您當(dāng)前位置:首頁(yè) > php開(kāi)源 > 綜合技術(shù) > 安卓轉(zhuǎn)戰(zhàn)React-Native之簽名打包成Apk并極速多渠道打包

安卓轉(zhuǎn)戰(zhàn)React-Native之簽名打包成Apk并極速多渠道打包

來(lái)源:程序員人生   發(fā)布時(shí)間:2016-06-27 16:52:11 閱讀次數(shù):4806次

前言

弄安卓的開(kāi)發(fā)應(yīng)當(dāng)知道開(kāi)發(fā)好的apk都是需要上傳到利用市場(chǎng)給用戶下載的,固然有些公司的產(chǎn)品是不用上傳到利用市場(chǎng)的(比如我們公司放7牛云)但是也需要放在云上面給用戶下載。react-native直接run-android默許是產(chǎn)生1個(gè)debug的版本apk明顯這是不符合開(kāi)發(fā)需求的,理由很簡(jiǎn)單debug版本apk是沒(méi)有進(jìn)行代碼混淆的這是很危險(xiǎn)的,所以我們需要個(gè)release的版本,下面我們來(lái)詳細(xì)看1下怎樣樣進(jìn)行簽名打包React Native利用并且多渠道打包。

debug和release版本apk反編譯后比較

準(zhǔn)備工具

先下載反編譯工具包:dex2jar⑵.0、jd-gui、apktool

反編譯

先把a(bǔ)pk解壓獲得classes.dex,再取得classes-dex2jar.jar

使用jd-gui查看源代碼(debug版本效果)

固然這里只是helloword做個(gè)例子,并沒(méi)有寫(xiě)甚么代碼即便混淆了也看不出甚么效果(由于第3方的包都不能混淆),但是混淆后效果還是好點(diǎn):看下其他的例子(直接偷郭霖的圖):(release版本效果)

Android簽名文件生成

Android簽名文件包括2種格式:.keystore和.jks

安卓簽名文件的生成不外乎2種方式:我現(xiàn)在給大家講授兩種簽名生成的方法:①:keytool命令方式生成 ,②:Android Studio IDE和Eclipse IDE進(jìn)行生成。

  • keytool命令生成keystore文件(如果沒(méi)有安裝androidStudio或eclispe)

之前我也有寫(xiě)過(guò)用藍(lán)貝兒多渠道打包里面介紹了使用自帶的keytool命令生成簽名文件,這里再來(lái)介紹1下

keytool -genkey -v -keystore losileeya.keystore -alias losileeya(別名) -keyalg RSA(算法) -keysize 2048(密鑰長(zhǎng)度) -validity 10000(有效期,天單位)

個(gè)人比較偏向于使用ide這1種方法,首先是圖形界面的,而且少了命令行書(shū)寫(xiě)的問(wèn)題,而且之前我記得在使用Eclipse開(kāi)發(fā)Android的時(shí)候也1直使用這類方式,下面我們來(lái)看1下生成簽名的具體步驟:

  • IDE 工具生成簽名文件

    1.Android Studio IDE生成jks文件

    build—>Generate Signed apk

    接下來(lái):

    2.Eclipse IDE生成keystore文件

Gradle配置

(1)把剛才生成的.jks文件考入到項(xiàng)目android/app文件夾下面

(2)直接在工程目錄下得android/app/build.gradle中以下節(jié)點(diǎn)添加以下內(nèi)容:
方法1:gradle的全局配置:
修改項(xiàng)目中g(shù)radle.properties文件

MYAPP_RELEASE_STORE_FILE=losileeya.jks MYAPP_RELEASE_KEY_ALIAS=losileeya MYAPP_RELEASE_STORE_PASSWORD=losileeya MYAPP_RELEASE_KEY_PASSWORD=losileeya

直接在工程目錄下得android/app/build.gradle中以下節(jié)點(diǎn)添加以下內(nèi)容:

signingConfigs { release { storeFile file(MYAPP_RELEASE_STORE_FILE) storePassword MYAPP_RELEASE_STORE_PASSWORD keyAlias MYAPP_RELEASE_KEY_ALIAS keyPassword MYAPP_RELEASE_KEY_PASSWORD } } buildTypes { release { ... signingConfig signingConfigs.release } }

方法2:gradle的局部配置:

signingConfigs { release { storeFile file("C://Users/Administrator/ZyReact/android/app/losileeya.jks")//這里可以寫(xiě)絕對(duì)位置或相對(duì)位置 storePassword "losileeya" keyAlias "losileeya" keyPassword "losileeya" } } buildTypes { release { minifyEnabled enableProguardInReleaseBuilds proguardFiles getDefaultProguardFile("proguard-android.txt"), "proguard-rules.pro" signingConfig signingConfigs.release } }

看圖:
這里寫(xiě)圖片描述
記得把enableProguardInReleaseBuilds改成true,最好把enableSeparateBuildPerCPUArchitecture = true,然后各種簽名參數(shù)的值都不能錯(cuò)否則打包失敗,基本上build.gradle的配置也就這些了。固然代碼混淆文件proguard-rules.pro自己配置。
例如我上個(gè)項(xiàng)目:

# This is a configuration file for ProGuard. # http://proguard.sourceforge.net/index.html#manual/usage.html # 指定代碼的緊縮級(jí)別0~7 -optimizationpasses 5 # 是不是使用大小寫(xiě)混合 -dontusemixedcaseclassnames # 是不是混淆第3方j(luò)ar -dontskipnonpubliclibraryclasses # 混淆時(shí)是不是做預(yù)校驗(yàn) -dontpreverify #重命名 -renamesourcefileattribute SourceFile #保護(hù)給定的可選屬性,例如LineNumberTable, LocalVariableTable, SourceFile, Deprecated, Synthetic, Signature, and InnerClasses. -keepattributes SourceFile,LineNumberTable # 混淆時(shí)是不是記錄日志 -verbose -optimizations !code/simplification/arithmetic,!field/*,!class/merging/* ##緊縮 #不緊縮輸入的類文件 -dontshrink ##優(yōu)化 #不優(yōu)化輸入的類文件 -dontoptimize #優(yōu)化時(shí)允許訪問(wèn)并修改有修飾符的類和類的成員 -allowaccessmodification #混淆庫(kù) -libraryjars libs/volley.jar -libraryjars libs/android-support-v4.jar -libraryjars libs/gson-2.3.1.jar -libraryjars libs/locSDK_6.13.jar -libraryjars libs/zxing-core-3.1.0.jar #-libraryjars libs/MarsorUtils⑴.0.0-SNAPSHOT.jar -libraryjars libs/dom4j-2.0.0-RC1.jar -libraryjars libs/mta-sdk-1.6.2.jar -libraryjars libs/open_sdk_r5509.jar -libraryjars libs/libammsdk.jar -libraryjars libs/WeiboSDKCore_3.1.2.jar -libraryjars libs/alipaySDK-20150724.jar -libraryjars libs/CMISUBTSwiper_sdk_v1.3.jar -libraryjars libs/CMSETSwiper_SDK_V3.6.jar -libraryjars libs/dspread_android_sdk_2.4.6.jar -libraryjars libs/message_lib.jar -libraryjars libs/meSdk-1.1.7snapshot_ruiyin.jar -libraryjars libs/disklrucache-2.0.1.jar -libraryjars libs/httpclient-4.2.5.jar -libraryjars libs/httpcore-4.2.4.jar -libraryjars libs/universal-image-loader-1.9.5.jar -keepattributes *Annotation* -keep class android.** {*; } -keep public class * extends android.view -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.pm -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.app.Fragment -keep public class com.android.vending.licensing.ILicensingService -keep class android.support.v4.app.** { *; } -keep class android.support.v7.** { *; } -keep class com.google.gson.** { *; } -keep class com.baidu.mapapi.** { *; } -keep class com.baidu.platform.** { *; } -keep class com.baidu.vi.** { *; } -keep class com.baidu.location.** { *; } -keep class org.apache.http.** { *; } -keep class org.json.** { *; } -keep class com.nostra13.universalimageloader.** { *; } # keep 所有的 javabean -keep class com.richerpay.ryshop.bean.** { *; } # volley # # ------------------------------------------- # # ############### volley混淆 ############### # # ------------------------------------------- -keep class com.android.volley.** {*;} -keep class com.android.volley.toolbox.** {*;} -keep class com.android.volley.Response$* { *; } -keep class com.android.volley.Request$* { *; } -keep class com.android.volley.RequestQueue$* { *; } -keep class com.android.volley.toolbox.HurlStack$* { *; } -keep class com.android.volley.toolbox.ImageLoader$* { *; } -keep class org.dom4j.** { *; } -keep class android.support.annotation.** { *; } -keep class com.tencent.mm.sdk.** {*;} -keep class com.tencent.tauth.** {*;} -keep class com.tencent.open.TDialog$* -keep class com.tencent.open.TDialog$* {*;} -keep class com.tencent.open.PKDialog -keep class com.tencent.open.PKDialog {*;} -keep class com.alipay.android.app.IAlixPay{*;} -keep class com.alipay.android.app.IAlixPay$Stub{*;} -keep class com.alipay.android.app.IRemoteServiceCallback{*;} -keep class com.alipay.android.app.IRemoteServiceCallback$Stub{*;} -keep class com.alipay.sdk.app.PayTask{ public *;} -keep class com.alipay.sdk.app.AuthTask{ public *;} -keep class com.misu.btswiper.**{*;} -keep class com.shxy.cardswiper.**{*;} -keep class com.dspread.xpos.QPOSService.**{*;} -keep class com.bypay.swiper.**{*;} -keep class com.newland.ruiyin.**{*;} # 保持自己定義的類不被混淆 -keep class com.richerpay.ryshop.view.**{*;} -keep class com.richerpay.ryshop.volly.**{*;} -keep class com.richerpay.ryshop.widget.**{*;} -dontwarn org.apache.http.** -keepclassmembers class * { public <init>(org.json.JSONObject); } -keep public class com.hrbcb.studentloans.R$*{ public static final int *; } # 微信 -keep class com.tencent.mm.sdk.openapi.WXMediaMessage {*;} -keep class com.tencent.mm.sdk.openapi.** implements com.tencent.mm.sdk.openapi.WXMediaMessage$IMediaObject {*;} # 新浪微博 -keep class com.sina.**{*;} #枚舉不被混淆 -keepclassmembers enum * { public static **[] values(); public static ** valueOf(java.lang.String); } # 保持自定義控件類不被混淆 -keepclasseswithmembers class * { public <init>(android.content.Context, android.util.AttributeSet); } -keepclasseswithmembers class * { public <init>(android.content.Context, android.util.AttributeSet, int); } #點(diǎn)擊事件不被混淆 -keepclasseswithmembers class * { void onClick*(...); } #回調(diào) -keepclasseswithmembers class * { *** *Callback(...); } #get 和set -keepclassmembers public class * extends android.view.View { void set*(***); *** get*(); } #本地方法 -keepclasseswithmembernames class * { native <methods>; } # activity -keepclassmembers class * extends android.app.Activity { public void *(android.view.View); } #實(shí)現(xiàn)Parcelable 接口的不被混淆 -keep class * implements android.os.Parcelable { public static final android.os.Parcelable$Creator *; } #R文件屬性不被混淆 -keepclassmembers class **.R$* { public static <fields>; } #缺省proguard 會(huì)檢查每個(gè)援用是不是正確,但是第3方庫(kù)里面常常有些不會(huì)用到的類,沒(méi)有正確援用。如果不配置的話,系統(tǒng)就會(huì)報(bào)錯(cuò)。 -dontwarn android.support.** # 實(shí)現(xiàn)Serializable 接口的不被混淆 -keepnames class * implements java.io.Serializable -keepclassmembers class * implements java.io.Serializable { static final long serialVersionUID; private static final java.io.ObjectStreamField[] serialPersistentFields; private void writeObject(java.io.ObjectOutputStream); private void readObject(java.io.ObjectInputStream); java.lang.Object writeReplace(); java.lang.Object readResolve(); public <fields>; } #dom4j不被混淆 -keepclassmembers class org.dom4j.** {*;} #百度定位 -keepclassmembers class com.baidu.location.** {*;} -keepattributes Signature # Gson混淆 ## ---------------------------------- ## ########## Gson混淆 ########## ## ---------------------------------- -keepclassmembers class com.google.gson.** {*;} -keep class sun.misc.Unsafe { *; } -keep class com.google.gson.stream.** { *; } -keep class com.google.gson.examples.android.model.** { *; } # Application classes that will be serialized/deserialized over Gson ##---------------End: proguard configuration for Gson ---------- -ignorewarnings -dontwarn org.xmlpull.v1.XmlSerializer -keepattributes Signature

這個(gè)只是規(guī)則可以參考下,畢竟react-native沒(méi)有甚么activity這寫(xiě)東西,如果你對(duì)這個(gè)還是不了解,可以去看郭神的反編譯與混淆技術(shù)完全解析(下)

打包文件的生成2種方式

對(duì)存在react.gradle文件的項(xiàng)目打包

命令很簡(jiǎn)單:

cd android && ./gradle assembleRelease

這里寫(xiě)圖片描述
網(wǎng)速渣的1逼:5min
這里寫(xiě)圖片描述

不存在react.gradle文件的項(xiàng)目打包

對(duì)不存在react.gradle文件那末我們就需要生成assets文件夾,并且生成index.android.bundle文件

方法1:利用curl生成
命令以下:

cd ZyReact(定位到你的工程根目錄) curl -k "http//localhost:8081/index.android.bundle" >android/app/src/main/assets/index.android.bundle

如圖:
這里寫(xiě)圖片描述
這里使用的curl.exe要自己去下載,記得需要開(kāi)啟服務(wù)。生成成功后以下:
這里寫(xiě)圖片描述
方法2:
首先命令切換到該react native項(xiàng)目的主目錄,然后運(yùn)行以下的命令,生成assets文件夾

mkdir -p android/app/src/main/assets

緊接著運(yùn)行以下命令,進(jìn)行生成index.android.bundle文件

react-native bundle --platform android --dev false --entry-file index.android.js \ --bundle-output android/app/src/main/assets/index.android.bundle \ --assets-dest android/app/src/main/res/

總之不管哪一種方法打包都要履行

cd android && ./gradle assembleRelease

下面我們來(lái)看1下release包的效果:
這里寫(xiě)圖片描述

安裝apk

上面的步驟我們已完成了項(xiàng)目的簽名打包在對(duì)應(yīng)的目錄中生成中apk文件,下面我們直接運(yùn)行以下的命令進(jìn)即將apk安裝到裝備中。

cd android && ./gradle installRelease

看圖:
這里寫(xiě)圖片描述

美團(tuán)多渠道極速打包

為何要進(jìn)行多渠道打包?

不弄安卓開(kāi)發(fā)的也許不知道甚么是多渠道打包,ios呢也就1般放appstore里面,但是打包安卓利用商店(1個(gè)商店也叫做1個(gè)渠道,如360,baidu,xiaomi,利用寶)眾多,大大小小幾百個(gè),我們發(fā)布利用以后需要統(tǒng)計(jì)各個(gè)渠道的用戶下載量,所以才有了多渠道打包。

怎樣樣統(tǒng)計(jì)各個(gè)渠道的下載量呢?

現(xiàn)在有比較成熟的第3方利用幫我們實(shí)現(xiàn)統(tǒng)計(jì)功能(比如友盟),統(tǒng)計(jì)的本質(zhì)就是搜集用戶信息傳輸?shù)胶笈_(tái),后臺(tái)生成報(bào)表,幫助我們跟蹤分析并完善app。通過(guò)系統(tǒng)的方法已可以獲得到,版本號(hào),版本名稱,系統(tǒng)版本,機(jī)型,地區(qū)等各種信息,惟獨(dú)利用商店(渠道)的信息我們是沒(méi)有辦法從系統(tǒng)獲得到的,所以我們就人為的在apk里面添加渠道信息(其實(shí)就用1個(gè)字段進(jìn)行標(biāo)識(shí),如360,baidu),我們只要把這些信息打包到apk文件并將信息傳輸?shù)胶笈_(tái),后臺(tái)根據(jù)這個(gè)標(biāo)識(shí),可以統(tǒng)計(jì)各個(gè)渠道的下載量了,并沒(méi)有多么的高大上。
說(shuō)了那末多,其實(shí)多渠道打包只需要關(guān)注兩件事情:

1.將渠道信息寫(xiě)入apk文件

2.將apk中的渠道信息傳輸?shù)浇y(tǒng)計(jì)后臺(tái)

常見(jiàn)的多渠道打包方法有哪些?

1.插件打包法
2.Android的productFlavors打包法

之前我也寫(xiě)過(guò)量渠道比如藍(lán)貝殼多渠道(插件打包法)打包,但是呢速度還是比較慢,然后也寫(xiě)過(guò)android studio的多渠道打包(Android的productFlavors打包法)需要手動(dòng)去配置然后速度也不是很快,然后美團(tuán)的打包方式以快著稱,哈哈。

下面帶你輕松弄定美團(tuán)多渠道打包

  • 下載安裝python環(huán)境 Python下載地址

  • 下載python腳本 AndroidMultiChannelBuildTool

  • 將ChannelUtil.java代碼集成到工程里面,在app啟動(dòng)時(shí)獲得渠道號(hào)傳送給后臺(tái)(如友盟:AnalyticsConfig.setChannel(ChannelUtil.getChannel(this));
  • 在PythonTool/Info/channel.txt中編輯渠道列表,以換行隔開(kāi),工程中有示例
  • 打包apk,將apk文件復(fù)制到PythonTool目錄下(與py同級(jí)),運(yùn)行(直接雙擊.py文件或在命令行輸入 python MultiChannelBuildTool.py )py腳本便可打包完成。(生成的渠道apk包在output_** 目錄下)

由于我們配置環(huán)境的時(shí)候下載安裝了python ,只需下載AndroidMultiChannelBuildTool緊縮包解壓后是這樣的:
這里寫(xiě)圖片描述
把簽好名的apk放到py同級(jí)目錄下,點(diǎn)擊不到10秒鐘就生成output文件夾并且下面生成了多個(gè)渠道包:
這里寫(xiě)圖片描述

總結(jié)

時(shí)間不早了就寫(xiě)到這里,打包的知識(shí)又溫習(xí)了1遍,寫(xiě)個(gè)博客各種截圖也是相當(dāng)?shù)睦郏鋵?shí)打包React-Native沒(méi)有幾句代碼。

  • 生成自己的簽名文件 (.jks或。keystore)
  • 配置gradle文件
  • 寫(xiě)代碼混文件
  • 有必要的話生成assets文件夾,并且寫(xiě)入index.android.bundle
  • gradle assembleRelease履行打包命令
  • 有需求的話多渠道打包

好了,做任何1件事都不是簡(jiǎn)單,惟有自己熟習(xí)做起來(lái)才快,好好學(xué)習(xí)好好生活吧。

come on,enjoy it

生活不易,碼農(nóng)辛苦
如果您覺(jué)得本網(wǎng)站對(duì)您的學(xué)習(xí)有所幫助,可以手機(jī)掃描二維碼進(jìn)行捐贈(zèng)
程序員人生
------分隔線----------------------------
分享到:
------分隔線----------------------------
關(guān)閉
程序員人生
主站蜘蛛池模板: 日本不卡高清视频 | 久久久久久久久99精品大 | 91国产大片 | 久久精品国产久精国产 | 日韩国产综合av | 亚洲视频一二三 | 久久久久久国产免费视网址 | 久久国产精品久久久久久 | 91av亚洲 | 精品一区二区三区在线播放 | 国产一区不卡 | 青青草青青操 | 美女福利视频 | а√最新版天堂中文在线 | 99热综合 | 天天摸天天操 | 午夜精品久久久久久久久久久久久 | 国产精品久久久久久久久久久久午夜片 | 国产一区二区免费网站 | 18av在线视频 | 国产日 | 91国产大片 | 麻豆精品网站 | 国产91亚洲精品一区二区三区 | 三级福利视频 | 免费在线小视频 | 国产精品欧美一区二区 | 日韩精品一区二区视频 | 亚洲国产精品综合 | 男女爱爱网站 | 成人韩免费网站 | av资源在线看 | 中韩乱幕日产无线码一区 | 欧美亚洲三级 | 91欧美精品成人综合在线观看 | 国产精品精品久久久 | 国产亚洲精品久久久 | 簧片免费在线观看 | 一区二区三区不卡视频在线观看 | 亚洲三级免费 | 国产麻豆一区 |