2012-03-10 4 views
3

이것은 매우 흥미로운 일입니다. APK 파일 com.company.app.apk가 있습니다. APK에의 파일 이름을 얻기 위해 다음 코드를 사용하여, Eclipse를 사용하여 에뮬레이터에 설치하는 경우 :apk 파일의 코드는 마켓에서 어디에서 설치 되었습니까?

String fileName = activity.getPackageManager().getApplicationInfo(
    activity.getPackageName(), PackageManager.GET_META_DATA).publicSourceDir; 

을 나는이 com.company.app-1.apk 같은 경로 이름을 얻는다. 파일 크기는 내가 만든 apk 파일과 같습니다.

이제 Market에이 앱을 게시하고 실제 기기 (Android 2.3)에 설치하면 같은 코드가 com.company.app-2.zip과 같은 경로 이름을 반환했습니다. 파일 확장명이 .zip으로 변경되었으며 가장 중요한 점은 파일 크기가 원본 크기보다 상당히 작습니다.

이클립스에 의해 에뮬레이터에 설치 한 내가 예상 한대로 정확히 같은 물건을 가지고 : 내 PC에이 두 파일을 전송하고이를 열 윈집을 사용하는 경우

는 지금, 나는 하나 개의 정말 흥미로운 점을 발견했다. 코드 ('com'폴더), 리소스 ('res'폴더), 서명 ('META-INF'폴더), 자산 ('assets'폴더) 및 매니페스트 파일 (AndroidManifest.xml) 그러나 Market에 의해 실제 장치에 설치된 장치에는 리소스와 매니페스트 파일의 두 부분 만 있습니다.

질문 : Market에서 설치하면 .apk 파일이 2 개 (또는 그 이상) 파일로 분할됩니다. 하나의 파일은 리소스 만 포함하는 ApplicationInfo.publicSourceDir에 의해 지정됩니다. 다른 파일에 대한 경로 이름은 어떻게 얻을 수 있습니까?

추가 : 두 버전의 동일한 앱이 있습니다. 하나는 Google의 공급 업체 라이선스 서비스를 사용하여, 다른 하나는 무료이며 다른 하나는 무료입니다. 위에서 언급 한 현상은 유료 버전에서만 발생합니다. 왜?

수정 : 첫 번째 경우에 설치된 apk 파일에 'com'폴더가 있다고 말했을 때 나는 분명해야합니다. * .java 파일 자체는 'com'폴더에 없습니다. 사실, 'com'폴더에는 빌드 프로세스 중에 부주의로 남아있는 가비지 파일이 몇 개 있습니다. 그 쓰레기 파일이 아니라면, 나는 'com'폴더가 처음에는있을 것이라고 생각하지 않는다.

답변

2

좋아, 여기에 내가 경우에는이 밖에 누군가 도움이 발견 한 것입니다 동일한 파일 크기, 동일한 모든 것을 만들었습니다.

Market Vendor Licensing을 사용하는 유료 버전의 경우 apk 파일 자체는 /data/app-private/com.company.app.apk으로 설치됩니다. 이것은 제가 발표 한 파일과 같습니다. 그러나 리소스를 추출하여 다른 파일 /data/app/com.company.app.zip에 설치하면 파일 확장명을 기록합니다. 이 zip 파일은 리소스 만 포함하므로 상당히 작습니다. 그러나 /data/app-private의 .apk 파일에는 모든 것이 있으므로 파일 크기는 내가 만든 것과 같습니다.

ApplicationInfo.publicSourceDir은 항상/data/app에있는 파일을 가리키므로 유료 버전에서는 /data/app/com.company.app.zip이고 무료 버전에서는 /data/app/com.company.app.apk입니다. 유료 버전의 경우 publicSourceDir에서 경로 이름을 얻은 다음 replace.app을 app-private로 바꾸고 .zip을 .apk로 바꾸어 원본 파일을 가져옵니다.

에뮬레이터에 직접 apk를 설치하면 하나의 파일 만 있고 항상/data/app 아래에 설치됩니다.

+0

이것은 매우 흥미 롭습니다. 해결해 주셔서 감사합니다. 그것은 불법 복제 방지 조치로 작동하고있는 것처럼 보입니까? – edthethird

2

나는 당신이 옳지 않다고 생각합니다. 시장은 다음과 같은 방식으로 작동합니다. 응용 프로그램을 선택하고 단추를 눌러 설치합니다. 그 시장은 응용 프로그램을 설치하기 위해 gtalk 서비스에 의도를 보냅니다. 이 서비스는 시장에 업로드 한 apk 파일을 다운로드하고 완료되면이 APK를 설치합니다. 설치하는 동안 몇 가지 변경이 발생할 수 있습니다. 그것은 나에게 보인다 설치하는 동안 classes.dex 파일을 추출 하고이 파일에서 최적화 된 덱스 (.odex) 생산 및 별도의 디렉토리에 넣어. 그것이 파일의 차이를 보는 이유입니다. 파일의 내용이 정확히

시장 내 응용 프로그램의 무료 버전을 설치하면 APK 파일이 설치 /data/app/com.company.app.apk하기 :

+0

네, 맞아요. classes.dex 파일은 com.company.app-2.zip 파일에 표시되지 않으며 .odex도 없습니다. 이 ZIP 파일에서 볼 수있는 것은 resources.arsc, 매니페스트 및 res 폴더뿐입니다. META-INF 폴더의 서명 파일이 어디에 있는지 어떻게 알 수 있습니까? 나는 불법 복제 방지 목적으로 서명 파일의 내용을 알려진 값 집합과 비교하려고합니다. 고맙습니다. – wwyt

+0

나는이 질문에별로 도움이되지 않는다고 생각한다. 패키지 자체는 jarsigner로 서명되었고, 추측에 따라 실제 인증서는 없습니다. 서명에 대한 자세한 내용은 여기를 참조하십시오. http://developer.android.com/guide/publishing/app-signing.html – Yury

+0

대단히 감사합니다. 어쨌든 META-INF 폴더에 cert/signature 관련 파일이 있습니다. 내가 한 것은 런타임 중에, 전체 apk 파일을 바이트 단위로 읽어서 내 인증서에 속하는 특정 바이트 패턴을 찾습니다. 그것을 찾을 수 없다면 이는이 apk 파일이 다른 사람이 서명 한 불법 복제 사건을 의미합니다. 이것은 무료 버전에서 성공한 것입니다. 하지만 APK 파일이 분할되어 다른 부분을 찾을 수 없기 때문에 유료 버전에서 작동하지 않았습니다. – wwyt

관련 문제