這幾天公司的運營部門要求添加流量統計功能,集成了友盟的插件,中間遇到不少的問題,在這裏說明記錄一下,爲遇到相同問題的朋友們減小麻煩javascript
問題1、插件的使用直接將友盟sdk系在放置到項目根目錄下plugins文件夾下,並進行配置,主要須要配置plugins下的兩個文件html
1.android.jsonjava
在dependent_plugins下添加android
"Umeng": { "PACKAGE_NAME": "你的appid" }
2.fetch.jsonjson
在其末尾添加以下代碼app
"Umeng": { "source": { "type": "local", "path": "umeng" }, "is_top_level": true, "variables": {} }
問題2、多渠道自動生成且自動簽名重命名,參考文檔http://www.jianshu.com/p/7236ceca2630ionic
cordova默認使用的是gradle進行打包的,多渠道分發的須要手動生成不少文件,比較麻煩,如今介紹批量生成修改渠道且簽名份額被指方法,fetch
1.須要生成簽名,詳細步驟請看 http://www.cnblogs.com/happen-/p/5991794.htmlgradle
2.須要先在項目根目錄下運行ionic build android --releaseui
3.修改platform/android下的文件
(1)AndroidManifest.xml
在application節點下找到<meta-data android:name="UMENG_CHANNEL" android:value="你設置的值" />
改成<meta-data android:name="UMENG_CHANNEL" android:value="${UMENG_CHANNEL_ID}" />
(2)新建release-signing.properties
並添加內容
keyAlias = ***//證書別名
keyPassword = ***//密碼可與證書密碼同樣
storeFile = tianji.keystore//證書路徑
storePassword = tianji//證書密碼
(3)新建文件proguard-rules.pro,內容可爲空,沒有文件生成文件會報錯
(4)重要部分,須要配置build.gradle
1.找到productFlavors節點,修改成以下部分
productFlavors {
//名字是渠道的名稱 baidu { } google { } wandoujia { } xiaomi { } owen { } }
2.找到signingConfigs節點
修改以下
signingConfigs { release { // These must be set or Gradle will complain (even if they are overridden). keyAlias "**"//能夠寫成**,會讀取release-signing.properties文件 keyPassword "***" //能夠寫成** storeFile file('***')//須要一個名字不能是**,證書的路徑 storePassword "***"//能夠寫成**
} }
3.找到buildTypes節點,
替換以下
buildTypes { release { zipAlignEnabled true minifyEnabled true shrinkResources true proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' signingConfig signingConfigs.release } }
4.在android節點內部的最後部分添加以下代碼
applicationVariants.all { variant -> variant.outputs.each { output -> // 重命名產出的apk文件 def outputFile = output.outputFile if (outputFile != null && outputFile.name.endsWith('.apk')) { File outputDirectory = new File(outputFile.parent); def fileName if (variant.buildType.name == "release") { fileName = "${variant.productFlavors[0].name}.apk" } else { fileName = "${defaultConfig.versionCode}_}_debug.apk" } output.outputFile = new File(outputDirectory, fileName) } // 刪除unaligned apk if (output.zipAlign != null) { output.zipAlign.doLast { output.zipAlign.inputFile.delete() } } } }
而後在platform/android下依次運行命令
gradlew clean
gradlew assembleRelease
補充說明:通過幾天的實驗,肯定以上方法存在問題,下邊是緣由以及解決方法,
緣由:官方給的插件須要本身初始化,
初始化方法:在run》$ionicPlatform.ready內部添加MobclickAgent.init('你的appid','渠道');
固然這裏不能這麼寫,由於上邊的多渠道分發只是更改xml內部信息,可是不能更改js代碼
只須要該一下插件內部src>android>UMPlugin.java
在頭部添加
import android.content.pm.ApplicationInfo; import android.content.pm.PackageManager;
在execute方法內部的init改成一下代碼,這段代碼的主要做用是初始化插件,可是appid和渠道是從配置文件內部讀取
if (action.equals("init")) { try{ ApplicationInfo appInfo = mContext.getPackageManager() .getApplicationInfo(mContext.getPackageName(), PackageManager.GET_META_DATA); String appKey=appInfo.metaData.getString("UMENG_APPKEY"); String channelId=appInfo.metaData.getString("UMENG_CHANNEL"); MobclickAgent.startWithConfigure(new UMAnalyticsConfig(mContext, appKey, channelId)); MobclickAgent.setScenarioType(mContext, EScenarioType.E_UM_NORMAL); MobclickAgent.onResume(mContext); }catch (PackageManager.NameNotFoundException e) { e.printStackTrace(); } // String appKey = args.getString(0); // String channelId = args.getString(1); return true; }
而後在將調用初始化方法內部的兩個參數刪掉便可
MobclickAgent.init();