[置顶] React Native之Android 打包

时间:2022-05-09 09:30:17

这里讲RN的打包和混淆中遇到的问题。

http://localhost:8081/index.android.bundle?platform=android当应用启动运行的时候,会自动拉取这个bundle文件,该文件里存放的是应用的全部逻辑代码,在目录中并不存在这个文件,事实上,这个地址只有一个请求地址,而非真正的静态资源文件,是通过包服务器packager通过动态分析Index.android.js中的依赖并对其进行合并得到的,而且该服务允许代码实时渲染。

1.生成签名密钥

keytool -genkey -v -keystore my-release-key.keystore -alias my-key-alias -keyalg
RSA -keysize 2048 -validity 10000

最后它会生成一个叫 my-release-key.keystore的密钥文件。

2.在路径/android/app/src/main路径下面新建assets文件夹

3.在工程目录下降Index.android.bundle下载并且保存到assets资源文件夹下。

curl -k http://lcalhost:8081/index.android.bundle > android/app/src/main/assets/index.android.bundle

这行命令时将网络上index.android.bundle,下载到本地assets目录下。

没有curl命令的可以使用下面的连接进行

http://jingyan.baidu.com/article/a681b0dec4c67a3b1943467c.html

4.添加gradle的Android keyStore配置

signingConfigs{
release{
storeFile file("/key/keyStore.jks")
storePassword "123456"
keyAlias "key"
keyPassword "123456"
}
}
buildTypes {
release {
minifyEnabled enableProguardInReleaseBuilds
proguardFiles getDefaultProguardFile("proguard-android.txt"), "proguard-rules.pro"
signingConfig signingConfigs.release //引用签名
}
}

5.启动代码混淆来缩小apk文件的大小。

enableProguardInReleaseBuilds = true;

6.在Android/目录中执行gradle assembleRelease命令,打包后的文件在android/app/build/outputs/apk目录中,例如app-release.apk,如果打包碰到问题,先执行一项Gradle clean.清理一项。

在这一步,我遇到一个问题,打包失败

Warning: com.facebook.fbui.textlayoutbuilder.proxy.StaticLayoutProxy: can't find referenced method 'StaticLayout(j
ava.lang.CharSequence,int,int,android.text.TextPaint,int,android.text.Layout$Alignment,android.text.TextDirectionH
euristic,float,float,boolean,android.text.TextUtils$TruncateAt,int,int)' in library class android.text.StaticLayou
t
Warning: there were 1 unresolved references to library class members.
You probably need to update the library versions.
(http://proguard.sourceforge.net/manual/troubleshooting.html#unresolvedlibraryclassmember)
Exception while processing task
java.io.IOException: Please correct the above warnings first.
at proguard.Initializer.execute(Initializer.java:473)
at proguard.ProGuard.initialize(ProGuard.java:233)
at proguard.ProGuard.execute(ProGuard.java:98)
at proguard.gradle.ProGuardTask.proguard(ProGuardTask.java:1074)
at com.android.build.gradle.tasks.AndroidProGuardTask.doMinification(AndroidProGuardTask.java:139)
at com.android.build.gradle.tasks.AndroidProGuardTask$1.run(AndroidProGuardTask.java:115)
at com.android.builder.tasks.Job.runTask(Job.java:48)
at com.android.build.gradle.tasks.SimpleWorkQueue$EmptyThreadContext.runTask(SimpleWorkQueue.java:41)
at com.android.builder.tasks.WorkQueue.run(WorkQueue.java:227)
at java.lang.Thread.run(Thread.java:745)

混淆异常,分析问题后发现in library class android.text.StaticLayout,这段问题是主要为,所以在混淆文件中加入:

-keep class android.text {* ;}
-dontwarn android.text.*

就打包成功了。