3

我正在尝试使用 R8 (AS 3.3) 缩小/混淆我的发布版本,但尝试膨胀 XML 文件时会崩溃,特别是在带有 fontFamily 的 TextView 上。删除 fontFamily 属性可解决此问题。

XML 文件:

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@drawable/blue_linear_gradient"
    tools:context=".login.LoginFragment">

    <ImageView
        android:id="@+id/familyIcon"
        android:layout_width="90dp"
        android:layout_height="90dp"
        android:layout_marginTop="32dp"
        app:srcCompat="@drawable/auth_login_icon"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

    <TextView   <!-- This is line 20 -->
        android:id="@+id/title"
        android:layout_width="180dp"
        android:layout_height="wrap_content"
        android:layout_marginTop="8dp"
        android:layout_marginBottom="8dp"
        android:lineHeight="24dp"
        android:maxWidth="168dp"
        android:text="@string/login_title"
        android:textAlignment="center"
        android:fontFamily="@font/gotham_bold" <!-- Removing this line fixes it -->
        android:textColor="@color/kineduWhite"
        android:textSize="20sp"
        app:layout_constraintBottom_toTopOf="@+id/authForm"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/familyIcon" />

    <include
        android:id="@+id/authForm"
        layout="@layout/auth_form"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_marginStart="16dp"
        android:layout_marginTop="8dp"
        android:layout_marginEnd="16dp"
        android:layout_marginBottom="8dp"
        android:maxWidth="324dp"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHorizontal_bias="1.0"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/familyIcon" />

    <!-- More views... -->

</androidx.constraintlayout.widget.ConstraintLayout>

这是堆栈跟踪:

2019-01-17 17:37:26.496 24514-24514/? E/AndroidRuntime: FATAL EXCEPTION: main
    android.view.InflateException: Binary XML file line #20: Binary XML file line #20: Error inflating class TextView
    Caused by: android.view.InflateException: Binary XML file line #20: Error inflating class TextView
    Caused by: java.lang.NullPointerException: Attempt to read from field 'long android.content.res.XmlBlock$Parser.mParseState' on a null object reference
        at android.content.res.XmlBlock$Parser.getAttributeListValue(XmlBlock.java:320)
        at androidx.core.content.res.FontResourcesParserCompat.androidx.core.content.res.FontResourcesParserCompat$FamilyResourceEntry parse(org.xmlpull.v1.XmlPullParser,android.content.res.Resources)(SourceFile:1)
        at androidx.core.content.res.ResourcesCompat.android.graphics.Typeface loadFont(android.content.Context,android.content.res.Resources,android.util.TypedValue,int,int,androidx.core.content.res.ResourcesCompat$FontCallback,android.os.Handler,boolean)(SourceFile:14)
        at androidx.core.content.res.ResourcesCompat.android.graphics.Typeface loadFont(android.content.Context,int,android.util.TypedValue,int,androidx.core.content.res.ResourcesCompat$FontCallback,android.os.Handler,boolean)(SourceFile:3)
        at androidx.core.content.res.ResourcesCompat.android.graphics.Typeface getFont(android.content.Context,int,android.util.TypedValue,int,androidx.core.content.res.ResourcesCompat$FontCallback)(SourceFile:8)
        at androidx.appcompat.widget.TintTypedArray.android.graphics.Typeface getFont(int,int,androidx.core.content.res.ResourcesCompat$FontCallback)(SourceFile:8)
        at androidx.appcompat.widget.AppCompatTextHelper.void updateTypefaceAndStyle(android.content.Context,androidx.appcompat.widget.TintTypedArray)(SourceFile:102)
        at androidx.appcompat.widget.AppCompatTextHelper.void loadFromAttributes(android.util.AttributeSet,int)(SourceFile:59)
        at androidx.appcompat.widget.AppCompatTextView.void <init>(android.content.Context,android.util.AttributeSet,int)(SourceFile:7)
        at androidx.appcompat.widget.AppCompatTextView.void <init>(android.content.Context,android.util.AttributeSet)(SourceFile:2)
        at androidx.appcompat.app.AppCompatViewInflater.androidx.appcompat.widget.AppCompatTextView createTextView(android.content.Context,android.util.AttributeSet)(SourceFile:1)
        at androidx.appcompat.app.AppCompatViewInflater.android.view.View createView(android.view.View,java.lang.String,android.content.Context,android.util.AttributeSet,boolean,boolean,boolean,boolean)(SourceFile:30)
        at androidx.appcompat.app.AppCompatDelegateImpl.void onSubDecorInstalled(android.view.ViewGroup)(SourceFile:89)
                                                        android.view.View createView(android.view.View,java.lang.String,android.content.Context,android.util.AttributeSet)
        at androidx.appcompat.app.AppCompatDelegateImpl.android.view.View onCreateView(android.view.View,java.lang.String,android.content.Context,android.util.AttributeSet)(SourceFile:1)
        at android.view.LayoutInflater$FactoryMerger.onCreateView(LayoutInflater.java:189)
        at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:772)
        at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:730)
        at android.view.LayoutInflater.rInflate(LayoutInflater.java:863)
        at android.view.LayoutInflater.rInflateChildren(LayoutInflater.java:824)
        at android.view.LayoutInflater.inflate(LayoutInflater.java:515)
        at android.view.LayoutInflater.inflate(LayoutInflater.java:423)
        at com.company.auth.login.LoginFragment.android.view.View onCreateView(android.view.LayoutInflater,android.view.ViewGroup,android.os.Bundle)(SourceFile:7)

我的字体位于一个单独的库模块中。

字体系列 xml 文件“res/font/gotham-bold.xml”在:core

<font-family xmlns:app="http://schemas.android.com/apk/res-auto">
    <font
        app:fontStyle="normal"
        app:fontWeight="400"
        app:font="@font/gotham_rnd_bold"/>

    <font
        app:fontStyle="italic"
        app:fontWeight="400"
        app:font="@font/gotham_rnd_bold_italic"/>
</font-family>

实际字体“gotham_rnd_bold.otf”也在这个:core模块下的“res/font/

4

2 回答 2

3

R8我在这里发布开发人员(来自您的问题)提供的原因,以便更好地索引和参考。

发生这种情况是因为您在应用程序中包含了已经在 Android 框架中的程序类。Proguard 配置规则-dontwarn org.xmlpull.v1.**从编译器显式禁用这些警告。

理想情况下,您不应该在您的应用程序中包含任何同样位于 Android 框架中的类。您应该能够识别包含 org.xmlpull.* 的依赖项,然后从依赖项中排除该模块。似乎其他人已经成功地做到了这一点,例如参见https://stackoverflow.com/a/34486112。如果您设法做到这一点,那么即使您删除了该规则,也不应该收到任何警告-dontwarn org.xmlpull.v1.**

或者,您可以使用规则-keep class org.xmlpull.** { *;}。这个技巧似乎被其他人使用(https://github.com/search?q=org.xmlpull.v1+extension=pro&type=Code),但它可能容易出错,因为您的 org.xmlpull 版本。*可能与 Android 框架中的不同。

请注意,我们正在努力改变 R8 的行为,以便它以 Android 框架类始终优先于程序类的方式处理重复类 (b/120884788)。原则上,该修复不需要上述任何更改。

于 2019-01-23T12:00:38.573 回答
0

您可以以编程方式设置自定义字体,例如;

customText.typeface = ResourcesCompat.getFont(this, 
R.font.your_font)
于 2021-01-14T12:19:25.913 回答