Android一個項目,打包成不同的包,並在同一設備運行(多渠道打包),以及遇到的一些問題,和解決方案

廢話少說,直接上方案!
你需要改以下幾處地方:
1.app- build.gradle
與 buildTypes 同級,你需要建一個 productFlavors

 productFlavors {
        one {
            // 動態替換applicationId
            // AndroidManifest.xml文件中用到applicationId的地方替換爲${applicationId}
            // 不要把用到包名的地方也替換了,如per.goweii.one.MainActivity
            applicationId  "cn.com.***"
            // 動態生成常量
            // 引用方法爲BuildConfig.HTTP_DOMAIN
              buildConfigField "String", "HTTP_DOMAIN", '"http://api.app.one/"'
              buildConfigField "String", "WECHAT_APP_ID", '"WECHAT_APP_ID"'
              buildConfigField "String", "WECHAT_APP_SECRET", '"WECHAT_APP_SECRET"'

            // 動態生成資源文件,需要確保資源文件中沒有同名資源
            // 引用方式爲R.string.app_name/@string/app_name
            resValue "string", "app_name", "*********"
            resValue "bool", "is_show_wechat_pay", 'true'

            // 動態生成AndroidManifest.xml文件引用
            // 引用方法爲${UMENG_CHANNEL_VALUE}
            manifestPlaceholders = [
                    UMENG_CHANNEL_VALUE: "****",
                    UMENG_APP_KEY      : "*********",
                    app_name           : "*********",
                    app_icon           : "*********",
            ]
        }
        two {
            applicationId "cn.com.**"
            /* buildConfigField "String", "HTTP_DOMAIN", '"http://api.app.two/"'
             buildConfigField "String", "WECHAT_APP_ID", '"WECHAT_APP_ID"'
             buildConfigField "String", "WECHAT_APP_SECRET", '"WECHAT_APP_SECRET"'*/
            resValue "string", "app_name", "********"
            //resValue "bool", "is_show_wechat_pay", 'false'
            manifestPlaceholders = [
                    UMENG_CHANNEL_VALUE: "****",
                    UMENG_APP_KEY      : "***********",
                    app_name           : "*****”",
                    app_icon           : "@drawable/ic_launcher",
            ]
        }
    }

具體說明,裏面註釋的很詳細不在贅述!
其中需要注意的幾點:
1,如果你的項目集成了友盟相關的東西,你需要在兩個配置裏面都配置上UMENG_CHANNEL_VALUE 和 UMENG_APP_KEY
2.不同安裝包需要配置不同的 app_name 和app_icon 因此需要在裏面配置好 這兩個要素,然後就是在 AndroidManifest.xml 裏面使用他們,如下:

  <application
        android:name=".logic.MyApplication"
        android:configChanges="orientation|keyboardHidden|navigation"
        tools:replace="label"
        android:icon="${app_icon}"
        android:label="${app_name}"  //通過這兩處配置,就可以不同的安裝包,展示不同的app名稱與圖標
        android:persistent="true"
        android:theme="@style/JSJ_theme_noActionBar"
        tools:remove="android:appComponentFactory">

其中需要特別注意 tools:replace=“label” 這個標籤必須有!
與此同時,在defaultConfig 裏面也需要配置上 app_name和app_icon

 defaultConfig {
        applicationId rootProject.applicationId
        minSdkVersion rootProject.minSdkVersion
        targetSdkVersion rootProject.targetSdkVersion
        versionCode Integer.parseInt(project.VERSION_CODE)
        versionName project.VERSION_NAME
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
        multiDexEnabled true
        //支持SVG圖片
        vectorDrawables.useSupportLibrary = true

        //極光推送設置
        ndk {
            //選擇要添加的對應cpu類型的.so庫。
            abiFilters 'armeabi'
            // 還可以添加 'x86', 'x86_64', 'mips', 'mips64'
        }
        manifestPlaceholders = [
                JPUSH_PKGNAME: applicationId,
                //JPush上註冊的包名對應的appkey
                JPUSH_APPKEY : "*********************",
                JPUSH_CHANNEL: "***", //暫時填寫默認值即可.
                app_name           : "*****",
                app_icon           : "@mipmap/ic_launcher",
        ]
    }

否則會報出
requires a placeholder substitution but no value for <app_icon> is provided
3.***如果你使用了 google_service,那你還需要在google_service.json裏面修改下配置信息,把package_name 的值變換下, google_service 全局搜索下就好
否則會報出:
No matching client found for package name *************
有時可能改了也不會生效,這時候就需要檢查下是不是debug下面生成了相應的google_service 刪掉即可

  1. 有時在你同一個設備上安裝打包出的兩個app時會報出
    與已安裝應用內容提供者衝突
    這個時候是因爲你在AndroidManifest 裏面 添加了 provider的緣故,他的一個屬性 authorities 的值是唯一標識的,需要根據不同的包,動態修改,如下:
  <provider
            android:name="android.support.v4.content.FileProvider"
            android:authorities="${applicationId}.fileprovider"
            android:exported="false"
            android:grantUriPermissions="true">
            <meta-data
                android:name="android.support.FILE_PROVIDER_PATHS"
                android:resource="@xml/file_paths" />
        </provider>
  1. 在打debug的包的時候是正常的,但是release包啓動就會崩潰,這個一般是混淆的原因,在混淆文件裏配置下就好
  2. 在打release 包的時候會報出 app:transformClassesAndResourcesWithProguardForTwoRelease
    導致編譯不過,解決方案,在混淆文件裏添加下句:
    -ignorewarnings # 抑制警告
    如果正常混淆的情況下,不加這條命令也是正常的,加這條命令只是爲了通過編譯,便於調試
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章