React Native for Android应用名及图标修改




  • 应用开发完了,总不能顶着MyProject和小机器人图标就发布了吧?在发布之前,有多处需要修改的地方。今天我们来全面的看一下


    应用ID

    俗称PackageName,或APP ID。注意,在gradle构建的安卓应用里(React Native引用都是由gradle构建的),不要直接修改AndroidManifest.xml中的package字段,不但连源代码也要跟着改,而且结果还没用……

    正确的改法是修改android/app/build.gradle中的以下内容:

    ……
    android {
        ……
        defaultConfig {
            applicationId "com.myproject"  <-- 就是这行
            ……
        }
        ……
    }
    

    另外,修改后,你会发现react-native run-android无法启动应用(或者总是启动之前的版本),因为这时候还是试图启动原来的包名。这是因为react native官方还有一个BUG。你可以参照此PR修改,也可以在run-android后手动找到应用并打开。

    版本号

    还是在android/app/build.gradle中,versionCode 和versionName两项。versionCode必须每次增加,不能减少。每次发布之前,这两项都要修改哦~

    应用名称

    android/app/src/main/res/values/strings.xml中,找到<string name="app_name">MyProject</string>,中间的MyProject就是应用名称了。

    图标

    android/app/src/main/res/下,你会看到一系列mipmap开头的文件夹(默认是4个),按照里面ic_launcher.png的尺寸,生成四个版本的icon并替换。

    有时候图标修改会迟迟不生效,此时从手机上彻底删掉原应用,删掉文件夹android/buildandroid/app/build,然后再重新打包

    签名

    要想打出发布包来,签名是必须的。你可以参照此文档生成并使用签名,相关内容都在android/app/build.gradle,包括

    ...
    android {
        ...
        defaultConfig { ... }
        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
            }
        }
    }
    ...
    

    通过环境变量配置签名有助于确保签名安全。当然,你也可以直接配置这些字段吗,像这样:

        signingConfigs {
            release {
                keyAlias 'store'
                keyPassword '123456'
                storeFile file('../../keystore/keystore.jks')
                storePassword '123456'
            }
        }
    


  • 项目原本MainActivity所在包是com.projectname,但是公司规定项目要以公司名作为包名,所以我在Android Studio里改成了这样:com.companyname.projectname。问题出现了,Android Studio可以运行项目,但是在Nodejs的命令窗口运行react-native run-android会显示找不到MainActivity,里面显示的MainActivity的包路径还是以前的那个,请问这个应该怎么改?



  • @zifary 这就是我文中提到的那个BUG。你可以参照PR修改RN源代码,也可以手动启动应用(应用实际生成安装并没有失败)。



  • 及时~ 不过我是一开始就自己全文检索后重构了App ID了~
    http://bbs.reactnative.cn/topic/381/已解决-重命名myproject项目需做哪些修改
    昨天又刚替换了Logo和签名~



  • 我也遇到改包名的问题了。
    我是把"android\app\src\main\java\com\rnwin0410\MainActivity" 加了一个文件夹,变成
    "android\app\src\main\java\com\rnwin0410\myact\MainActivity"了,在清单文件的packagename和app/build.gradle的applicationID都有改成 “com.rnwin0410.myact”,也有去看天地之灵那个PR,也试了,也不行。
    错误一直是这样

    04-26 23:57:48.920 17685-17685/com.rnwin0410.myact I/dalvikvm: Could not find method android.app.Activity.onProvideReferrer, referenced from method com.rnwin0410.myact.MainActivity.access$super
    04-26 23:57:48.920 17685-17685/com.rnwin0410.myact W/dalvikvm: VFY: unable to resolve virtual method 158: Landroid/app/Activity;.onProvideReferrer ()Landroid/net/Uri;
    04-26 23:57:48.920 17685-17685/com.rnwin0410.myact I/dalvikvm: Could not find method android.app.Activity.getReferrer, referenced from method com.rnwin0410.myact.MainActivity.access$super
    04-26 23:57:48.920 17685-17685/com.rnwin0410.myact W/dalvikvm: VFY: unable to resolve virtual method 75: Landroid/app/Activity;.getReferrer ()Landroid/net/Uri;
    04-26 23:57:49.240 17685-17743/com.rnwin0410.myact E/ReactNativeJNI: Got JS Exception: ReferenceError: Can't find variable: __fbBatchedBridge
    04-26 23:57:49.240 17685-17743/com.rnwin0410.myact E/AndroidRuntime: FATAL EXCEPTION: mqt_js
                                                                         Process: com.rnwin0410.myact, PID: 17685
                                                                         java.lang.RuntimeException: ReferenceError: Can't find variable: __fbBatchedBridge (<unknown file>:1)
                                                                             at com.facebook.react.bridge.queue.NativeRunnable.run(Native Method)
                                                                             at android.os.Handler.handleCallback(Handler.java:733)
                                                                             at android.os.Handler.dispatchMessage(Handler.java:95)
                                                                             at com.facebook.react.bridge.queue.MessageQueueThreadHandler.dispatchMessage(MessageQueueThreadHandler.java:31)
                                                                             at android.os.Looper.loop(Looper.java:136)
                                                                             at com.facebook.react.bridge.queue.MessageQueueThreadImpl$3.run(MessageQueueThreadImpl.java:187)
                                                                             at java.lang.Thread.run(Thread.java:841)
    

    我在github上的issue里看到有人遇到类似问题,说是可能和JSCExecutor::callFunction异常有关,还没去看。LZ遇到过这问题吗



  • @zifary 你这样改包名后面成功了吗,我也是类似的需求,但按天地之灵的改法不成功



  • @ipk2016 这个错误目测和包名没什么关系了,应该是脚本bundle没有成功或者没有进行


登录后回复