Xamarin.Android升级到API 24

wgmfuz8q  于 2023-05-27  发布在  Android
关注(0)|答案(3)|浏览(142)

我有一个现有的Xamarin.Android应用程序,几年前我构建了它以支持最高达API 19。我现在想更新代码库以支持API 24,但遇到了一系列问题。
我已经更新了代码库中的所有包和组件,以便它们都是最新和最好的。现在,当我进行编译时,我会收到几百个错误,抱怨Resources.designer.cs文件中的属性没有定义。下面是这些编译错误中的一个示例。

[PATH_TO_PROJECT]/Resources/Resource.designer.cs(98,98): Error CS0117: `[PROJECT_NAMESPACE].Resource.Attribute' does not contain a definition for `barSize' (CS0117) ([PROJECT])

Resource.designer.cs文件中的这一行突出显示为错误。

global::GooglePlayServices.Resource.Attribute.barSize = global::[PROJECT_NAMESPACE].Resource.Attribute.barSize;

这些问题中的绝大多数似乎来自我的风格和Google Play服务之间的一些链接。我已经更新了我所有的GPS软件包到最新的29.0.0.2,我仍然有这些错误。
我还确保删除了我的应用程序代码库中所有现有的“bin”和“obj”文件夹,以及~/.local/share folder中的所有内容。
有没有人知道如何帮助我解决这些问题?我担心牛轧糖不支持android:Theme.Holo.Light.DarkActionBar主题,将不得不做一个完整的主题重新设计:(
谢谢!

  • 编辑--
    下面是我的packages.config文件的内容。
<?xml version="1.0" encoding="utf-8"?>
<packages>
  <package id="AWS-Mobile-SDK-Xamarin-Beta" version="4.1.0" targetFramework="MonoAndroid44" />
  <package id="Humanizer" version="1.37.7" targetFramework="monoandroid70" />
  <package id="Newtonsoft.Json" version="7.0.1" targetFramework="monoandroid70" />
  <package id="sqlite-net" version="1.0.8" targetFramework="MonoAndroid44" />
  <package id="Xamarin.Android.Support.Animated.Vector.Drawable" version="24.2.1" targetFramework="monoandroid70" />
  <package id="Xamarin.Android.Support.Compat" version="24.2.1" targetFramework="monoandroid70" />
  <package id="Xamarin.Android.Support.Core.UI" version="24.2.1" targetFramework="monoandroid70" />
  <package id="Xamarin.Android.Support.Core.Utils" version="24.2.1" targetFramework="monoandroid70" />
  <package id="Xamarin.Android.Support.Fragment" version="24.2.1" targetFramework="monoandroid70" />
  <package id="Xamarin.Android.Support.Media.Compat" version="24.2.1" targetFramework="monoandroid70" />
  <package id="Xamarin.Android.Support.v4" version="24.2.1" targetFramework="monoandroid70" />
  <package id="Xamarin.Android.Support.v7.AppCompat" version="24.2.1" targetFramework="monoandroid70" />
  <package id="Xamarin.Android.Support.v7.MediaRouter" version="24.2.1" targetFramework="monoandroid70" />
  <package id="Xamarin.Android.Support.v7.Palette" version="24.2.1" targetFramework="monoandroid70" />
  <package id="Xamarin.Android.Support.Vector.Drawable" version="24.2.1" targetFramework="monoandroid70" />
  <package id="Xamarin.GooglePlayServices.Ads" version="29.0.0.2" targetFramework="monoandroid70" />
  <package id="Xamarin.GooglePlayServices.Base" version="29.0.0.2" targetFramework="monoandroid70" />
  <package id="Xamarin.GooglePlayServices.Basement" version="29.0.0.2" targetFramework="monoandroid70" />
  <package id="Xamarin.GooglePlayServices.Gcm" version="29.0.0.2" targetFramework="monoandroid70" />
  <package id="Xamarin.GooglePlayServices.Location" version="29.0.0.2" targetFramework="monoandroid70" />
  <package id="Xamarin.GooglePlayServices.Maps" version="29.0.0.2" targetFramework="monoandroid70" />
  <package id="Xamarin.GooglePlayServices.Measurement" version="29.0.0.2" targetFramework="monoandroid70" />
  <package id="Xamarin.Insights" version="1.10.4.112" targetFramework="monoandroid70" />
</packages>
kdfy810k

kdfy810k1#

Android.Support.v7.AppCompat版本22.2.1和版本23之间,删除了此字段:
https://developer.android.com/sdk/support_api_diff/23/changes/android.support.v7.appcompat.R.attr.html
因此,如果您在应用程序中引用它,则需要不使用它,或者找到等效项。从Added Fields的差异来看,似乎符合逻辑的可能是barLength。如果你没有在你的应用程序中使用它,你有另一个引用,你将不得不更新该引用,以确保它支持最新的Android.Support.v7.AppCompat版本。

lfapxunr

lfapxunr2#

我终于找到了导致错误的原因。有一些缓存包文件被存储在一个“共享”库中,我在我的应用程序代码库中,我不知道那里。还有一些缓存的包文件在目录“~/.local/share/Xamarin”中,必须被删除。我还必须将我所有的Xamarin.Android包更新到最新版本,以及所有的Android SDK和工具。一旦我做到了这一切,它就起作用了。

bmvo0sr5

bmvo0sr53#

我找到的唯一解决方案是注解所有行,就像你说的,有数百行要注解,所以我做了一个java脚本来注解它们:

package com.packagename;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.util.ArrayList;
import java.io.File;

public class YOUR_SCRIPT_NAME {

    public static void main(String[] args) {

        BufferedReader br = null;
        ArrayList<Integer> listaLineas = new ArrayList<Integer>();
        
        try {
            
            String sCurrentLine;
            String workingDir = System.getProperty("user.dir");
            br = new BufferedReader(new FileReader(System.getProperty("user.dir") + "\\ErrorLog.txt"));
            
            int fileLineNumber = 0;
            while ((sCurrentLine = br.readLine()) != null) {
                if(sCurrentLine.contains("Resource.designer.cs")){
                        String targetLineNumber = sCurrentLine.substring(sCurrentLine.lastIndexOf("designer.cs") + "designer.cs".length(), sCurrentLine.lastIndexOf("Active")).replaceAll("\\s+","");
                        listaLineas.add(Integer.parseInt(targetLineNumber));
                }
                fileLineNumber++;
            }
            removeFileLines(listaLineas, workingDir);
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                if (br != null)br.close();
            } catch (IOException ex) {
                ex.printStackTrace();
            }
        }   
    }
    
    public static void removeFileLines (ArrayList<Integer> listaLineas, String workingDirPath){
        try{
            File inputFile = new File(workingDirPath + "\\Resource.designer.cs");
            File tempFile = new File(workingDirPath + "\\Resource.designer.cs.temp");
            BufferedReader reader = new BufferedReader(new FileReader(inputFile));
            BufferedWriter writer = new BufferedWriter(new FileWriter(tempFile));
            String currentLine;
            int targetFileLine = 1;
            while((currentLine = reader.readLine()) != null) {
                if(!listaLineas.contains(targetFileLine)){
                    writer.write(currentLine + System.getProperty("line.separator"));
                }else{
                    writer.write("//" + currentLine + System.getProperty("line.separator"));
                    System.out.println("Line " + targetFileLine + " commented");
                }
                targetFileLine++;
            }
            writer.close(); 
            reader.close();         
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            // do nothing
        }   
    }
}

你只需要用
& 'C:\Program Files\Java\jdk1.8.0_101\bin\javac.exe' -d ..\YOUR_SCRIPT_NAME.java
在同一个文件夹中创建一个ErrorLog.txt文件,当你得到错误时,将所有错误行(选择一个,Ctrl + A和Ctrl + V)从Visual Studio“错误列表”复制到ErrorLog.txt文件,并将Resource.designer.cs文件复制到文件夹中,然后执行脚本:
java.exe -cp。com.packagename.YOUR_SCRIPT_NAME
它将在同一个文件夹中生成一个新的Resource.designer.cs.temp文件,将其内容复制到您的项目Resource.designer.cs文件中,并继续编译过程。
该脚本可以改进自动获取文件,但我不需要它。

相关问题