騰訊廣告gradle編譯
A. Gradle--多環境編譯打包
前段時間產品經理提了個需求,測試環境,預發布環境,生產環境編譯下的app需要在同一步手機同時存在,實現是可以的,但是得有三個環境下的不同applicationId,網路地圖key,域名,桌面logo,剛開始是想需要什麼環境就換什麼類型,很麻煩,每次都要換一次重新編譯,我就在想有什麼便捷的方法一鍵設置更換,gradle其中的Flavors功能可以實現我想要的。
這個是主項目中build.gradle中的配置,有三個環境我命名為 xiaoming_test,xiaoming_ready,xiaoming_proct,並有不同的applicationId,BAIDU_MAP_KEY,HTTP_HEAD,HTTP_HEAD_java,app_icon,(解釋一下,有兩條域名是因為後面後台是用java開發而做的區分),到這里應該大家有疑問,舉個栗子,我們一般開發的第三方key是在mainifests進行注冊申請的,而我們gradle如何去引用資源的。這里有兩種引用方式,直接引用,自定義引用。
引用logo在application的icon屬性命名為app_icon,$表示引用這個命名,對應的是gradle的配置。
在mainifests自定義為HTTP_HEAD,value值通過${HTTP_HEAD}引用,getHttpHead()獲取自定義注冊的域名值。從而實現每次請求對應的域名,只需在gradle里設置。
只需打開studio的BuildVariarts設置,選擇需要的環境即可重新編譯不同的apk,方便快捷的做到一鍵設置快速打包。
B. Gradle如何只編譯而不打包資源
gradle tasks
看看哪個task是你要的
C. Gradle編譯-APK編譯過程
在早期的Android設備中(Android5.0以下)都是使用的Dalvik虛擬機,Dalvik支持經過轉換的.dex文件。.dex格式是專為Dalvik設計的一種適合內存和處理器速度有限的系統。
但是在Android5.0,google用ART全面取代的Dalvik。Android7.0中又添加了JIT編譯器,使得Android性能也有不少提升。
上圖為從Android源文件開始,最終到APK的過程。
下面博客文章詳細介紹了dalvik虛擬機,可供參考學習。
https://www.cnblogs.com/lao-liang/p/5111399.html
dvm(art)和jvm屬於不同的虛擬機平台,不同平台要求執行的文件類型也就不一樣
dvm(art)--.dex文件
jvm--.class文件
在編譯和生成上
java source --.class文件 ---jvm執行
java source --.class文件 ---.dex文件 --- dvm執行
Android Runtime (ART) 是 Android 上的應用和部分系統服務使用的託管式運行時。ART 及其前身 Dalvik 最初是專為 Android 項目打造的。作為運行時的 ART 可執行 Dalvik 可執行文件並遵循 Dex 位元組碼規范。
ART 和 Dalvik 是運行 Dex 位元組碼的兼容運行時,因此針對 Dalvik 開發的應用也能在 ART 環境中運作。不過,Dalvik 採用的一些技術並不適用於 ART。
ART的功能
1.預先 (AOT) 編譯
使用ART編譯器時,應用程序在安裝期間就已經把dex位元組碼翻譯並存儲在設備上,運行時,只需要執行這些翻譯好的就可以了,因此執行速度也快了不少。
2.垃圾回收方面的優化
3.開發和調試方面的優化
構建流程涉及許多將項目轉換成 Android 應用軟體包 (APK) 的工具和流程。構建流程非常靈活,因此了解它的一些底層工作原理會很有幫助。
D. 如何實現 Gradle 工程上的增量編譯
到此 NDK的配置完成,開始進行 fresco的編譯 1.首先從github上下載項目 2.將項目導入到Android Studio中: 選擇 Open an exsiting Android Studio Project 選擇文件夾下的 build.gradle文件
E. gradle編譯war包如何修改生成的目錄結構
在build.gradle文件配置這樣的話:apply plugin: "war",然後在工程上右擊,選擇run as->gradle build...,選擇clean、build、war這幾個task,就可以打war包了,實際上build就能完成打包任務。
F. Shell腳本自動編譯打包Gradle項目並docker部署
需要用到2個文件,項目的build.gradle文件和自動化shell腳本(這里我們命名為auto.sh)
一、修改build.gradle文件
新增task配置節,注意build.gradle和Dockerfile在同一目錄下
二、新增auto.sh
G. Android插件化突破應用市場無法上廣告的問題
先簡單的描述一下在廣告方面遇到的問題.
開發一款App有了一定的用戶量之後通常會想接入第三方廣告來實現變現,
然而在很多市場不讓這類帶廣告的App上架,除非接的是他們家的廣告.
在這里我只能呵呵了.這點困難就想難倒我們.
那接下來ShowTime.怎麼做呢?
沒錯,就是插件化.
以廣點通廣告為例
這里我使用的是360開源的 RePlugin ,具體介紹和使用方法請看官方文檔.
一. RePlugin插件接入指南
第 1 步:添加 RePlugin Plugin Gradle 依賴
在項目根目錄的 build.gradle(注意:不是 app/build.gradle) 中添加 replugin-plugin-gradle 依賴:
第 2 步:添加 RePlugin Plugin Library 依賴
在 app/build.gradle 中應用 replugin-plugin-gradle 插件,並添加 replugin-plugin-lib 依賴:
接下來您就可以像正常接入廣告那樣,開發插件。生成出來的是APK,既可以「安裝到設備」,又可以「作為插件」使用。
二. RePlugin主程序接入指南
第 1 步:添加 RePlugin Host Gradle 依賴
在項目根目錄的 build.gradle(注意:不是 app/build.gradle) 中添加 replugin-host-gradle 依賴:
第 2 步:添加 RePlugin Host Library 依賴
在 app/build.gradle 中應用 replugin-host-gradle 插件,並添加 replugin-host-lib 依賴:
第 3 步:配置 Application 類
三. 宿主App 調用 插件廣告
1.編譯插件廣告,將生成的xx.apk包重命名xx.jar
將 xx.jar放到宿主App的 assets/plugins 目錄下 , Replugin將會自動獲取該內置插件
2.處理廣點通開屏廣告
由於廣點通開屏廣告的展示點擊都由SDK封裝處理了.
我們這里採用的方式是,由宿主跳轉到插件的閃屏頁,在插件中完成請求,展示,點擊結束後回到宿主的主頁面.
(1)宿主跳轉到插件Activity
(2)插件開屏廣告請求處理,就按正常的廣告邏輯走
(3)插件回到宿主的主頁面
(4)宿主的清單文件中添加必要配置,否則廣告無反應
注意 : 盡量使宿主和插件的包名一致,已避免廣告無收益
3.處理廣點通原生廣告
廣點通原生廣告不同於開屏廣告,其展示曝光和點擊曝光都由自己處理.
我們只能通過反射的方案去請求廣告
(1)在插件中先對廣告請求做一層封裝
(2)宿主中反射LoadManager的requestNativeAD()方法
a.拿到插件的ClassLoader
b.取得需要反射的類
c.由於請求廣告的requestNativeAD()方法中有一個參數是介面.
(這里得使用動態代理)
取得被代理介面
d.接下來就是反射請求介面了
注意傳入的Context必須是插件的Context
e.在動態代理中取得回調
這里我使用了EventBus將回調的廣告傳到請求的界面中
點擊曝光的反射
四.最後,第一次寫文章,歡迎點評
宿主App : https://github.com/AndWong/RePluginHostForAD/tree/master/app
插件App : https://github.com/AndWong/RePluginHostForAD/tree/master/pluginApp