android 版本升级,从服务器下载的apk,包解析失败问题解决

今天做了一个android 的版本升级,从服务器上面下载下来的apk总是在安装的时候 报解析失败,包不能解析。

 开始找问题,发现  下载下来的文件和实际服务器中的文件大小不一致。 这应该就是问题的根源了。


我以前的写文件的方法如下:

	byte[] buffer=new byte[1024];
        while(input.read(buffer)!=-1){
             output.write(buffer);
        }

我的理解:

这种读写方式 就会导致文件在最后生成的时候会有很多空字节,因为循环读1024个字节,在最后的时候1024未必会读满。


所以改进代码如下:

     byte[] buffer=new byte[1024];
     int l=0;
     while((l=input.read(buffer))!=-1){
           output.write(buffer,0,l);
     }

int size=input.read(byte[]);   他返回的size就是以整数形式返回实际读取的字节数。  所以在write的时候 写入他的有效字节数就避免了此问题。


全部代码为:

 public boolean download(String urlStr,String version){
        //String urlStr="http://172.17.54.91:8080/download/1.mp3";
        String path="file";

        String fileName="demo_"+version+".apk";
        OutputStream output=null;
        try {
                /*
                 * 通过URL取得HttpURLConnection
                 * 要网络连接成功,需在AndroidMainfest.xml中进行权限配置
                 * <uses-permission android:name="android.permission.INTERNET" />
                 */
            URL url=new URL(urlStr);
            HttpURLConnection conn=(HttpURLConnection)url.openConnection();
            //取得inputStream,并将流中的信息写入SDCard

                /*
                 * 写前准备
                 * 1.在AndroidMainfest.xml中进行权限配置
                 * <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
                 * 取得写入SDCard的权限
                 * 2.取得SDCard的路径: Environment.getExternalStorageDirectory()
                 * 3.检查要保存的文件上是否已经存在
                 * 4.不存在,新建文件夹,新建文件
                 * 5.将input流中的信息写入SDCard
                 * 6.关闭流
                 */
            String SDCard= Environment.getExternalStorageDirectory()+"";
            String pathName=SDCard+"/"+path+"/"+fileName;//文件存储路径
            //String pathName="F:\\"+"/"+path+"/"+fileName;//文件存储路径
            File file=new File(pathName);
            InputStream input=conn.getInputStream();
            if(file.exists()){
                System.out.println("exits");
                file.delete();
            }
            String dir=SDCard+"/"+path;
            new File(dir).mkdir();//新建文件夹
            file.createNewFile();//新建文件
            output=new FileOutputStream(file);
            //读取大文件
            byte[] buffer=new byte[1024];
            int l=0;
            while((l=input.read(buffer))!=-1){
                output.write(buffer,0,l);
            }
            input.close();
            output.close();
            conn.disconnect();
        } catch (MalformedURLException e) {
            e.printStackTrace();
            return false;
        } catch (IOException e) {
            e.printStackTrace();
            return false;
        }

        return true;

    }


转载请标明原著:http://blog.csdn.net/qq_34155601/article/details/72651714





  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Android Studio中,APK失败可能是由于多种因素引起的。以下是一些常见的问题解决方法: 1. Gradle配置问题:请确保你的Gradle配置文件没有错误,并且正确地引用了所需的依赖项。可以尝试重新同步Gradle文件来修复配置问题。在菜单栏中选择"File",然后选择"Invalidate Caches / Restart",最后选择"Invalidate and Restart"。 2. 编译错误:在Android Studio中,如果你的代码中存在语法错误或其他编译错误,APK将会失败。请检查你的代码,修复所有的编译错误,并重新编译项目。 3. 内存问题:如果你的项目非常庞大,可能会导致APK失败。这种情况下,你可以尝试增加分配给Gradle的内存。在项目根目录下的`gradle.properties`文件中,添加以下行:`org.gradle.jvmargs=-Xmx4096m`,然后重新编译项目。 4. 依赖冲突:如果你的项目中存在依赖冲突,也可能导致APK失败。你可以使用Gradle的依赖排除功能,排除引起冲突的依赖项。例如,如果`libraryA`和`libraryB`产生冲突,你可以在`build.gradle`文件的`dependencies`块中添加以下代码来排除冲突项: ``` implementation ('libraryA') { exclude group: 'com.example.libraryB', module: 'libraryB' } ``` 5. 缓存问题:有时候,Android Studio的缓存可能会导致APK失败。你可以尝试清理缓存来解决问题。在菜单栏中选择"File",然后选择"Invalidate Caches / Restart",最后选择"Invalidates and Restart"。 这些解决方法中的一种或多种可能会解决你在Android Studio中遇到的APK失败问题。在尝试这些解决方法之前,建议备份你的项目以防万一。如果问题仍然存在,你可以查看Android Studio的日志文件以获取更多详细信息,并尝试在Stack Overflow等开发者社区中寻求帮助。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值