Android SDK sdkmanager许可协议修正/破解

时间:2019-05-04 19:04:48

标签: java android

当前的Android SDK的sdkmanager存在正确生成问题 您选择添加的软件包的组合哈希签名。

仅当您仅使用sdkmanager.bat 管理您的Android SDK,而不是用于通过Android Studio对其进行管理。

如果您下载了当前的Android SDK,并将其放在C:\android-sdk-win中,然后运行:

    sdkmanager "platform-tools"

然后看看licenses/android-sdk-license,它有24333f8a63b6825ea9c5514f83c2829b004d1fee

然后运行:

sdkmanager "build-tools;28.0.3" "platforms;android-28"

然后:

    sdkmanager --licenses

并同意所有许可,然后检查哈希签名,它仍然相同,没有对其他许可协议文本进行哈希处理!

因此,我编写了这个测试Java程序,以尝试查看是否可以以编程方式生成正确的组合哈希签名。

第一个问题是要获取许可协议的正确哈希值 文本,则需要小心地从package.xml文件中删除开头和结尾的XML。

例如,对于platforms;android-28,请查看[SDK directory]/platforms/android-28/package.xml的备份副本,然后仔细删除开头和结尾的XML并保存。

    import java.io.FileInputStream;
    import java.io.IOException;
    import java.security.MessageDigest;
    import java.security.NoSuchAlgorithmException;

    public class TestSHA1
    {
        public static void main(String[] args)
        {
            String sFile1 = "C:/android-sdk-win/platform-tools/package.xml";
            String sFile2 = "C:/android-sdk-win/build-tools/28.0.3/package.xml";
            String sFile3 = "C:/android-sdk-win/platforms/android-28/package.xml";

            try
            {
                MessageDigest sha1 = MessageDigest.getInstance("SHA1");
                FileInputStream fis = new FileInputStream(sFile1);

                byte[] data = new byte[1024];
                int read = 0;
                while ((read = fis.read(data)) != -1)
                {
                    sha1.update(data, 0, read);
                };

                fis = new FileInputStream(sFile2);
                read = 0;
                while ((read = fis.read(data)) != -1)
                {
                    sha1.update(data, 0, read);
                };

                fis = new FileInputStream(sFile3);
                read = 0;
                while ((read = fis.read(data)) != -1)
                {
                    sha1.update(data, 0, read);
                };

                byte[] hashBytes = sha1.digest();

                StringBuffer sb = new StringBuffer();
                for (int i = 0; i < hashBytes.length; i++)
                {
                    sb.append(Integer.toString((hashBytes[i] & 0xff) + 0x100, 16).substring(1));
                }

                String fileHash = sb.toString();
                System.out.println("fileHash: '"+fileHash+"'");
            }
            catch (IOException ioe)
            {
            }
            catch (NoSuchAlgorithmException nsae)
            {
            }

        }
    }

此代码只是概念证明,可以轻松进行改进,例如自动删除开头和结尾的XML。

但是它最终使我能够进行Gradle清理并发布项目的构建版本。

注意:在清理项目时,它得到了以下提示:

Found corrupted package.xml at C:\android-sdk-win\build-tools\28.0.3\package.xml

但是,它成功完成了清理并发布构建。

完成后,返回并还原原始package.xml文件。

更新

我发现下载较早的平台工具包并替换 SDK中的一个,有助于成功构建。

http://dl.google.com/android/repository/platform-tools_r28.0.1-windows.zip

某些项目版本正在运行,但在其他项目中,Gradle clean失败,并显示通常的“您尚未接受以下SDK组件的许可协议:”。

但是,我仍然认为它显示了sdkmanager的问题以及可能的解决方案。是的,如果您已接受许可协议,我不完全理解该解决方案。

哦,它应该仅使用具有以下内容的package.xml文件:

    <license id="android-sdk-license"

在领先的XML中。

0 个答案:

没有答案