美文网首页
react native安卓多渠道包

react native安卓多渠道包

作者: MasterPaul | 来源:发表于2020-10-13 09:33 被阅读0次

    环境react native 0.63

    1.修改AndroidManifest文件
    加入以下代码

    <meta-data android:value="${UMENG_CHANNEL_VALUE}" android:name="UMENG_CHANNEL"/>
    

    2.修改app.build文件
    打包apk命名为app+渠道名+日期+版本号

    android {
    defaultConfig {
        
            flavorDimensions "default"
        }
    
     productFlavors {
            dev{
                manifestPlaceholders = [UMENG_CHANNEL_VALUE: "dev"]
            }
            huawei {
                manifestPlaceholders = [UMENG_CHANNEL_VALUE: "huawei"]
            }
            oppo {
                manifestPlaceholders = [UMENG_CHANNEL_VALUE: "oppo"]
            }
            xiaomi {
                manifestPlaceholders = [UMENG_CHANNEL_VALUE: "xiaomi"]
            }
        }
    
        // applicationVariants are e.g. debug, release
        applicationVariants.all { variant ->
            variant.outputs.each { output ->
                // For each separate APK per architecture, set a unique version code as described here:
                // https://developer.android.com/studio/build/configure-apk-splits.html
                def versionCodes = ["armeabi-v7a": 1, "x86": 2, "arm64-v8a": 3, "x86_64": 4]
                def abi = output.getFilter(OutputFile.ABI)
                if (abi != null) {  // null for the universal-debug, universal-release variants
                    output.versionCodeOverride =
                            versionCodes.get(abi) * 1048576 + defaultConfig.versionCode
                }
                if(variant.buildType.name.equals('release')){
                    def date = new Date().format("yyyyMMdd" , TimeZone.getTimeZone("GMT+08"))
                    def fileName = "app_${variant.productFlavors[0].name}_${date}_${versionName}.apk"
                    output.outputFileName = fileName
                }
    
            }
        }  
    }
    

    3.react native 中获取渠道名

    //俩种方法   
    第一种使用友盟的AnalyticsConfig.getChannel()方法
    @ReactMethod
        public void getChannel(final Callback successCallback){
            String channelName = AnalyticsConfig.getChannel(getReactApplicationContext());
            successCallback.invoke(channelName);
        }
    
    //第二种
    @ReactMethod
        public void getAppMetaData(String key, final Promise promise) {
            String resultData = null;
            if (getReactApplicationContext() == null || TextUtils.isEmpty(key)) {
                resultData = null;
            }
            try {
                PackageManager packageManager = getReactApplicationContext().getPackageManager();
                if (packageManager != null) {
                    ApplicationInfo applicationInfo = packageManager.getApplicationInfo(getReactApplicationContext().getPackageName(), PackageManager.GET_META_DATA);
                    if (applicationInfo != null) {
                        if (applicationInfo.metaData != null) {
                            resultData = applicationInfo.metaData.get(key).toString();
                        }
                    }
                }
                promise.resolve(resultData);
            } catch (PackageManager.NameNotFoundException e) {
                e.printStackTrace();
                promise.reject(e);
            }
        }
    //js端封装
    var { NativeModules } = require('react-native');
    const UMShareModule  = NativeModules.UMShareModule;
    class ShareUtilClass {
       getAppMetaData(key){
            return  UMShareModule.getAppMetaData(key)
        }
    }
    let shareUtil = new ShareUtilClass()
    export default shareUtil
    //调用
    shareUtil.getAppMetaData('UMENG_CHANNEL').then(res=>{
                console.log('UMENG_CHANNEL',res)
         
            })
    

    4.调试
    加入多渠道包后运行react-native run-android会报错
    Task 'installDebug' not found in project ':app'. Some candidates are: 'installDevDebug'.
    此时要运行react-native run-android --variant devdebug
    为了方便使用,在package.json中修改

    "scripts": {
        "android": "react-native run-android --variant devdebug"
    }
    

    然后在终端运行yarn android即可

    5.打包
    Android studio 右侧栏gradle,找到app->build->assembleRelease
    就会生成所有的渠道包

    image.png
    如果出现下面报错情况
    image.png
    解决方法如下:
    https://stackoverflow.com/questions/59044161/react-native-expiring-daemon-because-jvm-heap-space-is-exhausted
    1、gradle.properties文件加入
    org.gradle.jvmargs=-Xmx4g -XX:MaxPermSize=2048m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8
    2、app/build.gradle加入
    android {
      dexOptions {
        javaMaxHeapSize "4g"
      }
    }
    

    相关文章

      网友评论

          本文标题:react native安卓多渠道包

          本文链接:https://www.haomeiwen.com/subject/vcgmpktx.html